Fixing conflicts with the new patch parsing code, and introducing AddRoot

pmeunier
Nov 23, 2021, 11:12 AM
FGIVSUFHH7DN65DYQHDGGDDCHHIB5Z7KKQWI4I3WMERE3BY6IMRQC

Dependencies

  • [2] RMDMAYRX Adding a root inode (aka supporting submodules)
  • [3] UN2M77YU Test new changes against the old code. Fix several small bugs.
  • [4] QQZNSB26 Permission update (after #X243)
  • [5] CCFJ7VO3 Renaming "Record" to "Hunk" in the changes
  • [6] 7KNPYIDU Splitting the WorkingCopy trait into a read-only record and a read/write output
  • [7] YTQS4ES3 Fixing a parsing problem (related to permissions), and the associated permissions
  • [8] I24UEJQL Various post-fire fixes
  • [9] SGXOEWHU Adding a patched chardetng (temporarily)
  • [10] 73NW2X2M Returning a parse error instead of panicking when parsing a text change
  • [11] 5FI6SBEZ Re-implement change printing and parsing
  • [12] RUBSM5DR Fixing a bug when outputting changes in text format
  • [13] XR7MNOMU file encoding in updates
  • [14] YE5WBHXB Fixing contrib permissions
  • [15] TNN56XYK libpijul alpha.43
  • [16] X243Z3Y5 Recording only the required metadata (can even be changed later!)
  • [17] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [18] SL45MHGV +contrib/pijul2svg.sh (license as usual: GPL-2.0-or-later)
  • [19] 3S6LU2U5 abstract out FileMetadata (de)serialistion
  • [20] DJ5JYH3K COPYING
  • [21] G734WNM6 flake.nix: use crate2nix
  • [22] VO5OQW4W Removing anyhow in libpijul
  • [23] ZSF3YFZT encoded file deletion
  • [24] CCLLB7OI Upgrading to Sanakirja 0.15 + version bump
  • [25] HYRH4E55 rustfmt.toml: init
  • [26] HSEYMLO2 Adding an untracked change iterator
  • [27] RRCSHAYZ Formatting
  • [28] HDGRZISM Version updates

Change contents

  • file move: libpijul (d--r------)libpijul (d--r------)
    [1.0]
    [4.198139]
  • replacement in libpijul/src/change.rs at line 569
    [4.847507][2.27193:27295]()
    Hunk::AddRoot { change } => Hunk::DelRoot {
    change: change.inverse(hash),
    [4.847507]
    [2.27295]
    Hunk::AddRoot { name, inode } => Hunk::DelRoot {
    name: name.inverse(hash),
    inode: inode.inverse(hash),
  • replacement in libpijul/src/change.rs at line 573
    [2.27310][2.27310:27412]()
    Hunk::DelRoot { change } => Hunk::AddRoot {
    change: change.inverse(hash),
    [2.27310]
    [2.27412]
    Hunk::DelRoot { name, inode } => Hunk::AddRoot {
    name: name.inverse(hash),
    inode: inode.inverse(hash),
  • replacement in libpijul/src/change.rs at line 767
    [2.27449][2.27449:27471]()
    change: Atom,
    [2.27449]
    [4.852249]
    name: Atom,
    inode: Atom,
  • replacement in libpijul/src/change.rs at line 771
    [2.27486][2.27486:27508]()
    change: Atom,
    [2.27486]
    [2.27508]
    name: Atom,
    inode: Atom,
  • replacement in libpijul/src/change.rs at line 859
    [4.4889][2.27516:27601]()
    Hunk::AddRoot { change } | Hunk::DelRoot { change } => Some(change),
    [4.4889]
    [4.855085]
    Hunk::AddRoot { inode, name } | Hunk::DelRoot { inode, name } => {
    self.extra = Some(inode);
    Some(name)
    },
  • replacement in libpijul/src/change.rs at line 925
    [4.5597][2.27602:27695]()
    Hunk::AddRoot { ref change } | Hunk::DelRoot { ref change } => Some(change),
    [4.5597]
    [4.857285]
    Hunk::AddRoot { ref inode, ref name } | Hunk::DelRoot { ref inode, ref name } => {
    self.extra = Some(inode);
    Some(name)
    },
  • replacement in libpijul/src/change.rs at line 1010
    [4.6340][2.27696:27789]()
    Hunk::AddRoot { ref change } | Hunk::DelRoot { ref change } => Some(change),
    [4.6340]
    [4.860058]
    Hunk::AddRoot { ref name, ref inode } | Hunk::DelRoot { ref name, ref inode } => {
    self.extra = Some(inode);
    Some(name)
    },
  • replacement in libpijul/src/change.rs at line 1245
    [4.866586][2.27855:28027]()
    BaseHunk::AddRoot { change } => BaseHunk::AddRoot { change: f(change)? },
    BaseHunk::DelRoot { change } => BaseHunk::DelRoot { change: f(change)? },
    [4.866586]
    [4.122493]
    BaseHunk::AddRoot { name, inode } => BaseHunk::AddRoot { name: f(name)?, inode: f(inode)? },
    BaseHunk::DelRoot { name, inode } => BaseHunk::DelRoot { name: f(name)?, inode: f(inode)? },
  • edit in libpijul/src/change/text_changes_old.rs at line 583
    [3.21762]
    [3.21762]
    _ => {}
  • edit in libpijul/src/change/text_changes_old.rs at line 1158
    [3.47139]
    [3.47139]
    _ => {
    unimplemented!()
    },
  • edit in libpijul/src/change/text_changes.rs at line 198
    [4.10709][4.10709:10732]()
    dbg!(&header);
  • edit in libpijul/src/change/text_changes.rs at line 201
    [4.10837][4.10837:10858]()
    dbg!(&deps);
  • edit in libpijul/src/change/text_changes.rs at line 204
    [4.10950][4.10950:10972]()
    dbg!(&hunks);
  • edit in libpijul/src/change/text_changes.rs at line 258
    [4.12288]
    [4.12288]
    debug!("res = {:?}", res);
  • edit in libpijul/src/change/text_changes.rs at line 444
    [4.2940][4.17300:17334](),[4.2940][4.17300:17334]()
    metadata,
  • resurrect zombie in libpijul/src/change/text_changes.rs at line 444
    [4.197][4.17335:17495](),[4.197][4.17335:17495]()
    let contents = if let Some(Atom::NewVertex(ref n)) = contents {
    change_contents[n.start.us()..n.end.us()].to_vec()
  • edit in libpijul/src/change/text_changes.rs at line 444
    [4.4295]
    [4.17335]
    let (name, metadata) = if n.start == n.end {
    ("", InodeMetadata::DIR)
    } else {
    let FileMetadata {
    basename: name,
    metadata: perms,
    ..
    } = FileMetadata::read(&change_contents[n.start.0.into()..n.end.0.into()]);
    (name, perms)
    };
  • edit in libpijul/src/change/text_changes.rs at line 556
    [4.5532][2.28493:28507](),[4.5532][2.28493:28507](),[2.28549][2.28549:28588](),[2.28549][2.28549:28588](),[2.28642][2.28642:28656](),[2.28642][2.28642:28656](),[2.28698][2.28698:28739](),[2.28698][2.28698:28739]()
    }
    writeln!(w, "Root",)?;
    }
    writeln!(w, "Unroot",)?;
  • edit in libpijul/src/change/text_changes.rs at line 564
    [4.21567]
    [4.56569]
    Hunk::AddRoot { name, .. } => {
    if let Atom::NewVertex(ref n) = name {
    PrintableHunk::AddRoot {
    start: n.start.0 .0,
    }
    } else {
    unreachable!()
    }
    }
    Hunk::DelRoot { inode, name } => PrintableHunk::DelRoot {
    name: to_printable_edge_map(name, hashes),
    inode: to_printable_edge_map(inode, hashes),
    },
  • edit in libpijul/src/change/text_changes.rs at line 591
    [4.21697]
    [4.21766]
    debug!("from_printable {:?}", hunk);
  • replacement in libpijul/src/change/text_changes.rs at line 701
    [4.25991][3.59250:59352]()
    add_name.up_context = from_printable_pos_vec_offsets(changes, offsets, &up_context)?;
    [4.25991]
    [4.25991]
    add_name.up_context =
    from_printable_pos_vec_offsets(changes, offsets, &up_context)?;
  • replacement in libpijul/src/change/text_changes.rs at line 731
    [4.27090][3.59389:59471]()
    path: if parent == "" { name } else { parent + "/" + &name },
    [4.27090]
    [4.5933]
    path: if parent == "" {
    name
    } else {
    parent + "/" + &name
    },
  • replacement in libpijul/src/change/text_changes.rs at line 791
    [4.29063][3.59472:59704]()
    x.up_context = from_printable_pos_vec_offsets(changes, offsets, &new_vertex.up_context)?;
    x.down_context = from_printable_pos_vec_offsets(changes, offsets, &new_vertex.down_context)?;
    [4.29063]
    [4.29261]
    x.up_context = from_printable_pos_vec_offsets(
    changes,
    offsets,
    &new_vertex.up_context,
    )?;
    x.down_context = from_printable_pos_vec_offsets(
    changes,
    offsets,
    &new_vertex.down_context,
    )?;
  • replacement in libpijul/src/change/text_changes.rs at line 835
    [4.30426][3.59749:59975]()
    x.up_context = from_printable_pos_vec_offsets(changes, offsets, &replacement.up_context)?;
    x.down_context = from_printable_pos_vec_offsets(changes, offsets, &replacement.down_context)?;
    [4.30426]
    [4.30618]
    x.up_context =
    from_printable_pos_vec_offsets(changes, offsets, &replacement.up_context)?;
    x.down_context = from_printable_pos_vec_offsets(
    changes,
    offsets,
    &replacement.down_context,
    )?;
  • replacement in libpijul/src/change/text_changes.rs at line 894
    [4.32463][3.60012:60220]()
    c.up_context = from_printable_pos_vec_offsets(changes, offsets, &change.up_context)?;
    c.down_context = from_printable_pos_vec_offsets(changes, offsets, &change.down_context)?;
    [4.32463]
    [4.32637]
    c.up_context =
    from_printable_pos_vec_offsets(changes, offsets, &change.up_context)?;
    c.down_context =
    from_printable_pos_vec_offsets(changes, offsets, &change.down_context)?;
  • edit in libpijul/src/change/text_changes.rs at line 924
    [4.79917][2.28794:28833](),[4.79917][2.28794:28833]()
    _ => unimplemented!(),
  • edit in libpijul/src/change/text_changes.rs at line 941
    [4.34280]
    [4.79931]
    PrintableHunk::AddRoot { start } => {
    contents_.push(0);
    let root_inode = Position {
    change: Some(Hash::None),
    pos: ChangePosition(contents_.len().into()),
    };
    contents_.push(0);
    let inode = contents_.len();
    contents_.push(0);
    if let Entry::Occupied(mut e) = updatables.entry(hunk_id as usize) {
    if let crate::InodeUpdate::Add { ref mut pos, .. } = e.get_mut() {
    offsets.insert(pos.0.into(), ChangePosition((start + 1).into()));
    *pos = ChangePosition((start + 1).into())
    }
    }
    Ok(Hunk::AddRoot {
    name: Atom::NewVertex(NewVertex {
    up_context: vec![root_inode],
    down_context: Vec::new(),
    start: ChangePosition(start.into()),
    end: ChangePosition(start.into()),
    flag: EdgeFlags::FOLDER | EdgeFlags::BLOCK,
    inode: root_inode,
    }),
    inode: Atom::NewVertex(NewVertex {
    up_context: vec![Position {
    change: None,
    pos: ChangePosition(start.into()),
    }],
    down_context: Vec::new(),
    start: ChangePosition(inode.into()),
    end: ChangePosition(inode.into()),
    flag: EdgeFlags::FOLDER | EdgeFlags::BLOCK,
    inode: root_inode,
    })
    })
    }
    PrintableHunk::DelRoot { name, inode } => {
    let root_inode = PrintablePos(1, 0);
    Ok(Hunk::DelRoot {
    name: Atom::EdgeMap(EdgeMap {
    edges: from_printable_edge_map(&name, changes)?,
    inode: from_printable_pos(changes, root_inode)?,
    }),
    inode: Atom::EdgeMap(EdgeMap {
    edges: from_printable_edge_map(&inode, changes)?,
    inode: from_printable_pos(changes, root_inode)?,
    }),
    })
    }
  • edit in libpijul/src/change/text_changes.rs at line 1147
    [4.4295][2.28028:28090](),[4.4295][2.28028:28090](),[2.28090][2.28090:28492](),[2.28090][2.28090:28492]()
    let (name, perms) = if n.start == n.end {
    ("", InodeMetadata::DIR)
    } else {
    let FileMetadata {
    basename: name,
    metadata: perms,
    ..
    } = FileMetadata::read(&change_contents[n.start.0.into()..n.end.0.into()]);
    (name, perms)
    };
  • resolve order conflict in libpijul/src/change/text_changes.rs at line 1147
    [4.88449]
  • edit in libpijul/src/change/printable.rs at line 157
    [4.40076]
    [4.40076]
    },
    AddRoot {
    start: u64,
    },
    DelRoot {
    name: Vec<PrintableEdge>,
    inode: Vec<PrintableEdge>,
  • edit in libpijul/src/change/printable.rs at line 565
    [4.52014]
    [4.52014]
    AddRoot {
    start
    } => {
    writeln!(
    w,
    "Root add\n up {}, new {}:{}",
    PrintablePos(1, 0),
    start, start,
    )?;
    }
    DelRoot {
    name, inode
    } => {
    writeln!(
    w,
    "Root del",
    )?;
    writeln!(w, "{}", PrintableAtom::Edges(name.to_vec()))?;
    writeln!(w, "{}", PrintableAtom::Edges(inode.to_vec()))?;
    }
  • edit in libpijul/src/change/parse.rs at line 300
    [4.73746]
    [4.73746]
    fn parse_root_addition_hunk(i: &str) -> IResult<&str, PrintableHunk> {
    debug!("root add {:?}", i);
    let (i, _) = delimited(space0, tag("Root add"), space0)(i)?;
    let (i, _) = tuple((space0, newline, multispace0))(i)?;
    debug!("root add {:?}", i);
    let (i, up_context) = preceded(tag("up"), parse_context)(i)?;
    debug!("root add {:?}", i);
    let (i, (start, end)) = delimited(space0, parse_start_end, pair(space0, newline))(i)?;
    debug!("root add {:?}", i);
    assert_eq!(&up_context[..], &[PrintablePos(1, 0)]);
    assert_eq!(start, end);
    Ok((
    i,
    PrintableHunk::AddRoot {
    start
    },
    ))
    }
    fn parse_root_deletion_hunk(i: &str) -> IResult<&str, PrintableHunk> {
    let (i, _) = delimited(space0, tag("Root del"), space0)(i)?;
    let (i, _) = tuple((space0, newline))(i)?;
    let (i, name) = parse_edges(i)?;
    let (i, inode) = parse_edges(i)?;
    Ok((
    i,
    PrintableHunk::DelRoot {
    inode, name
    },
    ))
    }
  • edit in libpijul/src/change/parse.rs at line 400
    [4.75620]
    [4.75620]
    debug!("parse_hunk {:?}", input);
  • edit in libpijul/src/change/parse.rs at line 414
    [4.76020]
    [4.76020]
    parse_root_addition_hunk,
    parse_root_deletion_hunk,
  • replacement in libpijul/src/record.rs at line 721
    [2.5233][2.5233:5341]()
    self.actions.push(Hunk::FileAdd {
    add_name: Atom::NewVertex(NewVertex {
    [2.5233]
    [2.5341]
    self.actions.push(Hunk::AddRoot {
    name: Atom::NewVertex(NewVertex {
  • replacement in libpijul/src/record.rs at line 725
    [2.5437][2.5437:5509]()
    start: pos2,
    end: pos2,
    [2.5437]
    [2.5509]
    start: pos,
    end: pos,
  • replacement in libpijul/src/record.rs at line 730
    [2.5640][2.5640:5699]()
    add_inode: Atom::NewVertex(NewVertex {
    [2.5640]
    [2.5699]
    inode: Atom::NewVertex(NewVertex {
  • replacement in libpijul/src/record.rs at line 733
    [2.5793][2.5793:5832]()
    pos: pos2,
    [2.5793]
    [2.5832]
    pos,
  • replacement in libpijul/src/record.rs at line 736
    [2.5906][2.5906:5976]()
    start: pos,
    end: pos,
    [2.5906]
    [2.5976]
    start: pos2,
    end: pos2,
  • edit in libpijul/src/record.rs at line 741
    [2.6107][2.6107:6222]()
    contents: None,
    path: "/".to_string(),
    encoding: None,
  • replacement in libpijul/src/record.rs at line 742
    [2.6242][2.6242:6328]()
    *new_root = Some(pos);
    Position { change: None, pos }
    [2.6242]
    [2.6328]
    self.updatables
    .insert(self.actions.len(), InodeUpdate::Add { inode: Inode::ROOT, pos: pos2 });
    *new_root = Some(pos2);
    Position { change: None, pos: pos2 }