Record: simpler detection of moves vs conflicts

pmeunier
Dec 6, 2021, 9:22 AM
2UMXNSD5XADPYSQKSNF67ATKTAED6ANAS3P6MK6OZC3KEZJ6ZF7QC

Dependencies

  • [2] QAXLX3UA Backwards-compatibility: moving old paths to the new "roots" feature
  • [3] TELBT3CI Avoid a double loop in record
  • [4] 7ABOS34C Debug statements and formatting
  • [5] CCFJ7VO3 Renaming "Record" to "Hunk" in the changes
  • [6] A6WKPB55 Detecting (and recording) conflicts between multiple equal names for the same file
  • [7] I52XSRUH Massive cleanup, and simplification
  • [8] ADPAFSMY Proper old metadata when recording
  • [9] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [10] PR32ALRG prioritise moving a file over undeletion
  • [11] 6YMDOZIB Refactoring apply
  • [12] YN63NUZO Sanakirja 1.0
  • [13] 3S6LU2U5 abstract out FileMetadata (de)serialistion
  • [14] SAADQM3H Finer-grained detection of metadata on Windows
  • [15] I24UEJQL Various post-fire fixes
  • [16] RMDMAYRX Adding a root inode (aka supporting submodules)
  • [*] RRCSHAYZ Formatting

Change contents

  • replacement in libpijul/src/record.rs at line 1054
    [4.508835][4.508835:508937]()
    if !moved.resurrect.is_empty() {
    moved.resurrect.extend(moved.alive.into_iter());
    [4.508835]
    [4.6276]
    let is_resurrected = !moved.resurrect.is_empty();
    if is_resurrected {
    moved.resurrect.extend(moved.alive.drain(..));
  • replacement in libpijul/src/record.rs at line 1087
    [4.509284][4.509284:509321]()
    if moved.need_new_name {
    [4.509284]
    [2.2036]
    // If there was exactly one alive name, this is a regular
    // move, i.e. not a conflict.
    if moved.n_alive_names == 1 {
  • replacement in libpijul/src/record.rs at line 1091
    [2.2095][4.60611:60662](),[4.509321][4.60611:60662](),[4.1818][4.509378:509592](),[4.60662][4.509378:509592](),[4.509378][4.509378:509592]()
    self.actions.push(Hunk::FileMove {
    del: Atom::EdgeMap(EdgeMap {
    edges: moved.edges,
    inode: item.v_papa,
    }),
    add: Atom::NewVertex(NewVertex {
    [2.2095]
    [2.2096]
    let add = if moved.need_new_name && !is_resurrected {
    moved.edges.extend(moved.alive.drain(..));
    Atom::NewVertex(NewVertex {
  • edit in libpijul/src/record.rs at line 1100
    [2.2196]
    [4.509905]
    })
    } else {
    Atom::EdgeMap(EdgeMap {
    edges: moved.alive,
    inode: item_v_papa,
    })
    };
    self.actions.push(Hunk::FileMove {
    del: Atom::EdgeMap(EdgeMap {
    edges: moved.edges,
    inode: item.v_papa,
  • edit in libpijul/src/record.rs at line 1112
    [4.509929]
    [18.1904]
    add,
  • edit in libpijul/src/record.rs at line 1234
    [4.510760]
    [4.510760]
    n_alive_names: usize,
  • edit in libpijul/src/record.rs at line 1255
    [4.511265]
    [4.511265]
    n_alive_names: 0,
  • edit in libpijul/src/record.rs at line 1262
    [4.36][4.0:93]()
    // Check for any renaming as that's a priority change
    let mut is_any_rename = false;
  • edit in libpijul/src/record.rs at line 1318
    [4.513102][3.0:77](),[3.77][4.263:341](),[4.263][4.263:341]()
    if parent_name != name {
    is_any_rename = true;
    }
    debug!("new_meta = {:?}, parent_meta = {:?}", new_meta, parent_meta);
  • edit in libpijul/src/record.rs at line 1319
    [4.85][4.1052:1128]()
    if is_any_rename && !name_changed {
    continue;
    }
  • replacement in libpijul/src/record.rs at line 1358
    [4.444][4.514306:514307](),[4.514306][4.514306:514307]()
    [4.444]
    [4.52476]
    if !grandparent.flag().contains(EdgeFlags::DELETED) {
    moved.n_alive_names += 1;
    }
  • replacement in libpijul/src/record.rs at line 1364
    [4.514474][4.514474:514525]()
    moved.resurrect.push(NewEdge {
    [4.514474]
    [4.52542]
    (if parent_was_resurrected {
    &mut moved.resurrect
    } else {
    &mut moved.alive
    })
    .push(NewEdge {