# # # patch "database.cc" # from [25a7d09b691fa29743249d4151dc27bab18c7923] # to [5a61650edb2b4f71f83c39f327062de5ed827485] # ============================================================ --- database.cc 25a7d09b691fa29743249d4151dc27bab18c7923 +++ database.cc 5a61650edb2b4f71f83c39f327062de5ed827485 @@ -3607,6 +3607,7 @@ database::record_as_branch_leaf(cert_val return; // already recorded (must be adding a second branch cert) bool all_parents_were_leaves = true; + bool some_ancestor_was_leaf = false; for (set::const_iterator p = parents.begin(); p != parents.end(); ++p) { @@ -3615,6 +3616,7 @@ database::record_as_branch_leaf(cert_val all_parents_were_leaves = false; else { + some_ancestor_was_leaf = true; imp->execute(query("DELETE FROM branch_leaves " "WHERE branch = ? AND revision_id = ?") % blob(branch()) % blob(l->inner()())); @@ -3637,6 +3639,7 @@ database::record_as_branch_leaf(cert_val { if (is_a_ancestor_of_b(*r, rev)) { + some_ancestor_was_leaf = true; imp->execute(query("DELETE FROM branch_leaves " "WHERE branch = ? AND revision_id = ?") % blob(branch()) % blob(r->inner()())); @@ -3644,6 +3647,23 @@ database::record_as_branch_leaf(cert_val } } + // are we really a leaf (ie, not an ancestor of an existing leaf)? + if (!some_ancestor_was_leaf) + { + bool really_a_leaf = true; + for (set::const_iterator r = current_leaves.begin(); + r != current_leaves.end(); ++r) + { + if (is_a_ancestor_of_b(rev, *r)) + { + really_a_leaf = false; + break; + } + } + if (!really_a_leaf) + return; + } + imp->execute(query("INSERT INTO branch_leaves(branch, revision_id) " "VALUES (?, ?)") % blob(branch()) % blob(rev.inner()()));