Unrecord did not check whether a file already existed before adding it back

[?]
Apr 29, 2021, 8:33 PM
P6WE7YKL6ILKLYKMJUJLGINN7L4U7X4KUIE5ELTK2LEENX3DUBCQC

Dependencies

  • [2] UIWXP2E2 Fixing an infinite loop after unrecord
  • [3] YN63NUZO Sanakirja 1.0
  • [4] R3H7D42U Debugging `pijul git`: proper error reporting
  • [5] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [6] 7UPL3Y2A Unrecord: don't restore the same unrecorded file deletion twice in the inodes and tree tables
  • [7] VO5OQW4W Removing anyhow in libpijul
  • [8] CCLLB7OI Upgrading to Sanakirja 0.15 + version bump
  • [9] MDBC27ZU Fixing a bug when unrecording directory deletions (the "directory marker" in the tree table was not set)
  • [10] 5BRU2RRW Cleanup (debugging a crash related to trees/inodes)
  • [11] I52XSRUH Massive cleanup, and simplification

Change contents

  • replacement in libpijul/src/unrecord/working_copy.rs at line 58
    [3.227663][3.227663:227696]()
    let mut return_value = None;
    [3.227663]
    [3.227696]
    let mut return_value = Some(Inode::ROOT);
  • replacement in libpijul/src/unrecord/working_copy.rs at line 61
    [3.227798][3.227798:227911]()
    return_value = Some(restore_inode(txn, changes, source, dest, parent_inode)?);
    continue;
    [3.227798]
    [3.227911]
    if parent_inode != Inode::ROOT {
    return_value = restore_inode(txn, changes, source, dest, parent_inode)?;
    continue;
    }
    } else {
    continue
  • replacement in libpijul/src/unrecord/working_copy.rs at line 85
    [3.228382][3.6838:6928]()
    return_value = Some(restore_inode(txn, changes, source, dest, Inode::ROOT)?);
    [3.228382]
    [3.14972]
    return_value = restore_inode(txn, changes, source, dest, Inode::ROOT)?;
  • replacement in libpijul/src/unrecord/working_copy.rs at line 87
    [3.15052][3.6929:7013](),[3.20956][3.6929:7013](),[3.228548][3.6929:7013]()
    return_value = Some(restore_inode(txn, changes, source, dest, inode)?);
    [3.15052]
    [3.228631]
    return_value = restore_inode(txn, changes, source, dest, inode)?;
  • replacement in libpijul/src/unrecord/working_copy.rs at line 106
    [3.229088][3.21084:21151]()
    ) -> Result<Inode, super::UnrecordError<P::Error, T::TreeError>> {
    [3.229088]
    [3.229174]
    ) -> Result<Option<Inode>, super::UnrecordError<P::Error, T::TreeError>> {
  • edit in libpijul/src/unrecord/working_copy.rs at line 116
    [3.229349][3.229349:229428]()
    let file_id = OwnedPathId {
    parent_inode,
    basename,
    };
  • replacement in libpijul/src/unrecord/working_copy.rs at line 117
    [3.15206][3.15206:15225]()
    Ok(*inode)
    [3.15206]
    [3.85]
    Ok(Some(*inode))
  • replacement in libpijul/src/unrecord/working_copy.rs at line 119
    [3.98][3.21288:21343](),[3.21343][3.15226:15327](),[3.15327][3.36:196](),[3.196][2.0:40]()
    let inode = crate::fs::create_new_inode(txn)?;
    put_tree_with_rev(txn, &file_id, &inode)?;
    put_inodes_with_rev(txn, &inode, &dest)?;
    if meta.is_dir() {
    let id = OwnedPathId {
    parent_inode: inode,
    basename: SmallString::new(),
    };
    txn.put_tree(&id, &inode)?;
    [3.98]
    [3.246]
    let file_id = OwnedPathId {
    parent_inode,
    basename,
    };
    if txn.get_tree(&file_id, None)?.is_none() {
    let inode = crate::fs::create_new_inode(txn)?;
    put_tree_with_rev(txn, &file_id, &inode)?;
    put_inodes_with_rev(txn, &inode, &dest)?;
    if meta.is_dir() {
    let id = OwnedPathId {
    parent_inode: inode,
    basename: SmallString::new(),
    };
    txn.put_tree(&id, &inode)?;
    }
    Ok(Some(inode))
    } else {
    Ok(None)
  • edit in libpijul/src/unrecord/working_copy.rs at line 138
    [3.256][3.338:356](),[3.1619][3.338:356](),[3.7412][3.338:356](),[3.15327][3.338:356](),[3.21453][3.338:356](),[3.338][3.338:356]()
    Ok(inode)