mercurial/obsutil.py
changeset 33252 53b3a1968aa6
parent 33149 a14e2e7f7d1f
child 33272 df90f4d6c609
--- 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