Zombify in both directions

pmeunier
Jan 25, 2026, 3:51 PM
LOPP4VIAIWGCCW3MWUNGRFX72ZNHBE7BNVEWL65HTZZQU2CJ35EQC

Dependencies

  • [2] L4EZSH6B Fixing zombie conflicts: known was computed on the wrong thing
  • [3] I24UEJQL Various post-fire fixes
  • [4] PNJL5TPZ Version bump

Change contents

  • edit in libpijul/src/apply/edge.rs at line 325
    [3.105518]
    [3.105518]
    let mut unknown_children = Vec::new();
  • edit in libpijul/src/apply/edge.rs at line 336
    [3.105859]
    [3.105859]
    debug!("-> {:?}", v);
  • replacement in libpijul/src/apply/edge.rs at line 344
    [3.106112][3.106112:106225](),[3.106225][2.723:804](),[2.804][3.106308:106392](),[3.106308][3.106308:106392]()
    if v.flag().contains(EdgeFlags::PARENT) {
    // Unwrap ok, since `v` is in the channel.
    let intro = txn.get_external(&v.dest().change)?.unwrap().into();
    if !known(&intro) {
    debug!("unknown: {:?}", v);
    [3.106112]
    [3.106392]
    // Unwrap ok, since `v` is in the channel.
    let intro = txn.get_external(&v.dest().change)?.unwrap().into();
    if !known(&intro) {
    debug!("unknown: {:?}", v);
    if v.flag().contains(EdgeFlags::PARENT) {
  • edit in libpijul/src/apply/edge.rs at line 350
    [3.106452]
    [3.106452]
    } else {
    unknown_children.push((dest_vertex, *v));
  • edit in libpijul/src/apply/edge.rs at line 353
    [3.106470]
    [3.106470]
    } else {
    debug!("known {:?}", v);
  • edit in libpijul/src/apply/edge.rs at line 357
    [3.106494]
    [3.106494]
    debug!("unknown parents {:?}", unknown_parents);
    debug!("unknown children {:?}", unknown_children);
  • edit in libpijul/src/apply/edge.rs at line 360
    [3.106574]
    [3.106574]
    zombify_down(
    txn,
    channel,
    ws,
    change_id,
    inode,
    n.flag,
    &unknown_children,
    )?;
  • edit in libpijul/src/apply/edge.rs at line 435
    [3.108697]
    fn zombify_down<T: GraphMutTxnT>(
    txn: &mut T,
    channel: &mut T::Graph,
    ws: &mut crate::missing_context::Workspace,
    change_id: ChangeId,
    inode: Position<Option<Hash>>,
    flag: EdgeFlags,
    unknown: &[(Vertex<ChangeId>, SerializedEdge)],
    ) -> Result<(), MissingError<T::GraphError>> {
    for &(dest_vertex, edge) in unknown.iter() {
    let p = *txn.find_block(channel, edge.dest())?;
    ws.unknown_parents
    .push((dest_vertex, p, inode, edge.flag()));
    let fold = flag & EdgeFlags::FOLDER;
    debug!("zombify p {:?}, dest_vertex {:?}", p, dest_vertex);
    let mut u = dest_vertex;
    let mut v = edge.dest();
    while let Ok(&v_) = txn.find_block(channel, v) {
    if v_ != u {
    debug!("u = {:?}, v = {:?}", u, v);
    put_graph_with_rev(
    txn,
    channel,
    EdgeFlags::DELETED | EdgeFlags::BLOCK | fold,
    u,
    v_,
    change_id,
    )?;
    u = v_;
    v = v_.end_pos()
    } else {
    break;
    }
    }
    }
    Ok(())
    }