Before this patch, those conflicts were missing their bottom connections, resulting in the zombie side being displayed at the very end of the file.
H5DIAL52H2LOXEL4JO7YGBYVNZBFOQFQ2UCGFL2KDUEDLCVGQBSQC
QWIYNMI5SOTLRPYE4O3AG7R75JXM2TB3ZADU646PG6ACPBGSYUYAC
SXEYMYF7P4RZMZ46WPL4IZUTSQ2ATBWYZX7QNVMS3SGOYXYOHAGQC
I24UEJQLCH2SOXA4UHIYWTRDCHSOPU7AFTRUOTX7HZIAV4AZKYEQC
VO5OQW4W2656DIYYRNZ3PO7TQ4JOKQ3GVWE5ALUTYVMX3WMXJOYQC
MMQCFCIE6XK64R3QDV3ZSPAD3POWLKHZ2ZPUJP326FDLZROSYOCQC
OXZVZDQZEVP7NV3HS6HK5QA7RUD35ODVQ3LL7PWJHTS7DEFM3XTAC
AHAXT26RD6V64L2ZSWNW3HKEJ4RV26ISL4PYFP3IGC4EVJM5U3IAC
// If `current` is alive and already visited, pass.
if visited.contains(&(elt.vertex, elt.vertex)) {
debug!("elt {:?}", elt);
if elt.is_on_path {
continue;
}
// Has this vertex been visited already?
debug!("visited {:?}", visited);
if !visited.insert(elt.vertex) {
debug!("already visited!");
debug!("descendants {:#?}", descendants);
for (_, r) in descendants.range((elt.vertex, Vertex::ROOT)..=(elt.vertex, Vertex::MAX))
{
put_graph_with_rev(
txn,
channel,
EdgeFlags::PSEUDO,
elt.last_alive,
*r,
ChangeId::ROOT,
)?;
}
if !elt.is_on_path {
// If this is the first visit, find the children, starting
// with in flag order (alive first), since we don't want
// to reconnect vertices multiple times.
for e in iter_adjacent(
txn,
channel,
elt.vertex,
EdgeFlags::empty(),
EdgeFlags::all(),
)? {
let e = e?;
// If this is the first visit, find the children, in flag
// order (alive first), since we don't want to reconnect
// vertices multiple times.
for e in iter_adjacent(
txn,
channel,
elt.vertex,
EdgeFlags::empty(),
EdgeFlags::all(),
)? {
let e = e?;
if e.flag().contains(EdgeFlags::PARENT) {
if e.flag() & (EdgeFlags::BLOCK | EdgeFlags::DELETED) == EdgeFlags::BLOCK {
// This vertex is alive!
stack[len - 1].last_alive = elt.vertex;
}
continue;
} else if e.flag().contains(EdgeFlags::FOLDER) {
// If we are here, at least one children of `root`
// is FOLDER, hence all are.
return Ok(());
}
if is_first_visit {
let child = txn.find_block(channel, e.dest())?;
stack.push(StackElt {
vertex: *child,
last_alive: elt.last_alive,
is_on_path: false,
});
if e.flag().contains(EdgeFlags::PARENT) {
if e.flag() & (EdgeFlags::BLOCK | EdgeFlags::DELETED) == EdgeFlags::BLOCK {
// This vertex is alive!
stack[len - 1].last_alive = elt.vertex;
if let Some(last_on_path) = (&stack[..len - 1]).iter().rev().position(|x| x.is_on_path)
{
let last_on_path = len - 2 - last_on_path;
// If the last vertex on the path to `current` is not
// alive, a reconnect is needed.
if !stack[last_on_path].is_alive() {
// We need to reconnect, and we can do it now
// since we won't have a chance to visit that
// edge (because non-PARENT edge we are
// inserting now starts from a vertex that is
// on the path, which means we've already
// pushed all its children onto the stack.).
put_graph_with_rev(
txn,
channel,
EdgeFlags::PSEUDO,
elt.last_alive,
stack[len - 1].vertex,
ChangeId::ROOT,
)?;
for v in (&stack[..len - 1]).iter().rev() {
if v.is_on_path {
// If the last vertex on the path to `current` is not
// alive, a reconnect is needed.
if v.is_alive() {
// We need to reconnect, and we can do it now
// since we won't have a chance to visit that
// edge (because non-PARENT edge we are
// inserting now starts from a vertex that is
// on the path, which means we've already
// pushed all its children onto the stack.).
put_graph_with_rev(
txn,
channel,
EdgeFlags::PSEUDO,
elt.last_alive,
stack[len - 1].vertex,
ChangeId::ROOT,
)?;
break;
} else {
// Remember that those dead vertices have
// `stack[len-1].vertex` as a descendant.
descendants.insert((v.vertex, stack[len - 1].vertex));
}