--- a/hgext/obsolete.py Tue Jun 26 11:13:46 2012 +0200
+++ b/hgext/obsolete.py Tue Jun 26 11:33:39 2012 +0200
@@ -138,6 +138,14 @@
context.changectx.extinct = extinct
+def latecomer(ctx):
+ """is the changeset latecomer (Try to succeed to public change)"""
+ if ctx.node() is None:
+ return False
+ return ctx.rev() in ctx._repo._latecomerset
+
+context.changectx.latecomer = latecomer
+
### revset
#############################
@@ -170,6 +178,10 @@
args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
return [r for r in subset if r in repo._extinctset]
+def revsetlatecomer(repo, subset, x):
+ """latecomer, Try to succeed to public change"""
+ args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
+ return [r for r in subset if r in repo._latecomerset]
def _precursors(repo, s):
"""Precursor of a changeset"""
@@ -367,6 +379,7 @@
revset.symbols["unstable"] = revsetunstable
revset.symbols["suspended"] = revsetsuspended
revset.symbols["extinct"] = revsetextinct
+ revset.symbols["latecomer"] = revsetlatecomer
revset.symbols["obsparents"] = revsetprecursors # DEPR
revset.symbols["precursors"] = revsetprecursors
revset.symbols["obsancestors"] = revsetallprecursors # DEPR
@@ -509,6 +522,12 @@
else:
return None # break recursion
+def wrapclearcache(orig, repo, *args, **kwargs):
+ try:
+ return orig(repo, *args, **kwargs)
+ finally:
+ repo._clearobsoletecache()
+
### New commands
#############################
@@ -606,6 +625,7 @@
extensions.wrapfunction(discovery, 'findcommonoutgoing', wrapfindcommonoutgoing)
extensions.wrapfunction(discovery, 'checkheads', wrapcheckheads)
extensions.wrapfunction(phases, 'visibleheads', noextinctsvisibleheads)
+ extensions.wrapfunction(phases, 'advanceboundary', wrapclearcache)
if util.safehasattr(phases, 'visiblebranchmap'):
extensions.wrapfunction(phases, 'visiblebranchmap', wrapvisiblebranchmap)
@@ -840,6 +860,11 @@
"""the set of obsolete parent without non obsolete descendant"""
return set(self.revs('obsolete() - obsolete()::unstable()'))
+ @util.propertycache
+ def _latecomerset(self):
+ """the set of rev trying to obsolete public revision"""
+ return set(self.revs('allsuccessors(public()) - obsolete()'))
+
def _clearobsoletecache(self):
if '_obsoleteset' in vars(self):
del self._obsoleteset
@@ -856,6 +881,8 @@
del self._suspendedset
if '_extinctset' in vars(self):
del self._extinctset
+ if '_latecomerset' in vars(self):
+ del self._latecomerset
def addobsolete(self, sub, obj):
"""Add a relation marking that node <sub> is a new version of <obj>"""