--- a/hgext/obsolete.py Tue Sep 13 22:19:28 2011 +0200
+++ b/hgext/obsolete.py Tue Sep 13 22:05:19 2011 +0200
@@ -76,6 +76,7 @@
except ImportError:
from StringIO import StringIO
+from mercurial.i18n import _
from mercurial import util
from mercurial import context
@@ -85,7 +86,7 @@
from mercurial import pushkey
from mercurial import discovery
from mercurial import error
-from mercurial.node import hex, bin
+from mercurial.node import hex, bin, short
from mercurial.lock import release
### Patch changectx
@@ -95,7 +96,7 @@
"""is the changeset obsolete by other"""
if ctx.node()is None:
return False
- return bool(ctx._repo.obsoletedby(ctx.node()))
+ return bool(ctx._repo.obsoletedby(ctx.node())) and ctx.state().mutable
context.changectx.obsolete = obsolete
@@ -107,7 +108,9 @@
# hack to fill hiddenrevs
# compute hidden (XXX should move elsewhere)
if not getattr(ctx._repo.changelog, 'hiddeninit', False):
- basicquery = 'obsolete() - (ancestors(not obsolete() or . or bookmark()))'
+ shown = ['not obsolete()', '.', 'bookmark()', 'tagged()',
+ 'publishedheads()']
+ basicquery = 'obsolete() - (::(%s))' % (' or '.join(shown))
for rev in scmutil.revrange(ctx._repo, [basicquery]):
ctx._repo.changelog.hiddenrevs.add(rev)
ctx._repo.changelog.hiddeninit = True
@@ -162,6 +165,11 @@
return common, heads
def extsetup(ui):
+ try:
+ rebase = extensions.find('states')
+ except KeyError:
+ raise error.Abort(_('obsolete extension require states extension.'))
+
revset.symbols["obsolete"] = revsetobsolete
extensions.wrapfunction(discovery, 'findcommonoutgoing', filterobsoleteout)
@@ -272,8 +280,12 @@
self._obssubrels.setdefault(sub, set()).add(obj)
self._obsobjrels.setdefault(obj, set()).add(sub)
try:
+ if not self.nodestate(obj).mutable:
+ self.ui.warn(
+ _("%(sub)s try to obsolete immutable changeset %(obj)s\n")
+ % {'sub': short(sub), 'obj': short(obj)})
self.changelog.hiddenrevs.add(repo[obj].rev())
- except error.RepoLookupError:
+ except (error.RepoLookupError, error.LookupError):
pass #unknow revision (but keep propagating the data
self._writeobsrels()