hgext/obsolete.py
changeset 75 d7b11772f0b5
parent 74 c7dd26dec7fc
child 79 9906560f585e
--- 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()