diff -r 3a7ef1398385 -r a0d88b021a98 mercurial/dagop.py --- a/mercurial/dagop.py Wed Feb 21 11:53:30 2024 +0100 +++ b/mercurial/dagop.py Thu Dec 21 17:38:04 2023 +0000 @@ -1035,6 +1035,37 @@ return headrevs +def headrevsdiff(parentsfn, start, stop): + """Compute how the set of heads changed between + revisions `start-1` and `stop-1`. + """ + parents = set() + + heads_added = set() + heads_removed = set() + + for rev in range(stop - 1, start - 1, -1): + if rev in parents: + parents.remove(rev) + else: + heads_added.add(rev) + for p in parentsfn(rev): + parents.add(p) + + # now `parents` is the collection of candidate removed heads + rev = start - 1 + while parents: + if rev in parents: + heads_removed.add(rev) + parents.remove(rev) + + for p in parentsfn(rev): + parents.discard(p) + rev = rev - 1 + + return (heads_removed, heads_added) + + def headrevssubset(revsfn, parentrevsfn, startrev=None, stoprevs=None): """Returns the set of all revs that have no children with control.