diff -r a5cb2e4460de -r 53b3a1968aa6 mercurial/obsutil.py --- a/mercurial/obsutil.py Tue Jun 27 02:45:09 2017 +0200 +++ b/mercurial/obsutil.py Wed Jun 28 03:54:19 2017 +0200 @@ -7,6 +7,10 @@ from __future__ import absolute_import +from . import ( + phases, +) + class marker(object): """Wrap obsolete marker raw data""" @@ -285,6 +289,28 @@ foreground = set(repo.set('%ln::', known)) return set(c.node() for c in foreground) +def getobsoleted(repo, tr): + """return the set of pre-existing revisions obsoleted by a transaction""" + torev = repo.unfiltered().changelog.nodemap.get + phase = repo._phasecache.phase + succsmarkers = repo.obsstore.successors.get + public = phases.public + addedmarkers = tr.changes.get('obsmarkers') + addedrevs = tr.changes.get('revs') + seenrevs = set(addedrevs) + obsoleted = set() + for mark in addedmarkers: + node = mark[0] + rev = torev(node) + if rev is None or rev in seenrevs: + continue + seenrevs.add(rev) + if phase(repo, rev) == public: + continue + if set(succsmarkers(node)).issubset(addedmarkers): + obsoleted.add(rev) + return obsoleted + def successorssets(repo, initialnode, cache=None): """Return set of all latest successors of initial nodes