[PATCH evolve-ext] inhibit: fix inhibit working with non-inhibit repos

Durham Goode durham at fb.com
Wed Aug 12 18:01:25 UTC 2015


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1439401880 25200
#      Wed Aug 12 10:51:20 2015 -0700
# Node ID 218f933966d4686d7d8ebcc8bb922cb0e55fa4bb
# Parent  3dec62fc266eff7c7aa20e3229ffbede1c33d208
inhibit: fix inhibit working with non-inhibit repos

Inhibit was breaking when two repos were in memory, but one was not an inhibit
repo (like when doing a local pull between two repos). The fix is to add
inhibitenabled checks to all the places where inhibit does global wrapping of
commands (every code path from the extsetup wrappers).

diff --git a/hgext/inhibit.py b/hgext/inhibit.py
--- a/hgext/inhibit.py
+++ b/hgext/inhibit.py
@@ -23,11 +23,15 @@ from mercurial import scmutil
 from mercurial import commands
 from mercurial import lock as lockmod
 from mercurial import bookmarks
+from mercurial import util
 from mercurial.i18n import _
 
 cmdtable = {}
 command = cmdutil.command(cmdtable)
 
+def _inhibitenabled(repo):
+    return util.safehasattr(repo, '_obsinhibit')
+
 def reposetup(ui, repo):
 
     class obsinhibitedrepo(repo.__class__):
@@ -122,6 +126,9 @@ def _inhibitmarkers(repo, nodes):
     Content of <nodes> and all mutable ancestors are considered. Marker for
     obsolete revision only are created.
     """
+    if not _inhibitenabled(repo):
+        return
+
     newinhibit = repo.set('::%ln and obsolete()', nodes)
     if newinhibit:
         lock = tr = None
@@ -141,6 +148,9 @@ def _deinhibitmarkers(repo, nodes):
     This will be triggered when inhibited nodes received new obsolescence
     markers. Otherwise the new obsolescence markers would also be inhibited.
     """
+    if not _inhibitenabled(repo):
+        return
+
     deinhibited = repo._obsinhibit & set(nodes)
     if deinhibited:
         tr = repo.transaction('obsinhibit')
@@ -177,7 +187,7 @@ def transactioncallback(orig, repo, desc
         if visibleobsolete:
             _inhibitmarkers(repo, [repo[r].node() for r in visibleobsolete])
     transaction = orig(repo, desc, *args, **kwargs)
-    if desc != 'strip':
+    if desc != 'strip' and _inhibitenabled(repo):
         transaction.addpostclose('inhibitposttransaction', inhibitposttransaction)
     return transaction
 
@@ -190,9 +200,10 @@ def extsetup(ui):
 
         This will trickle down to other part of mercurial (hidden, log, etc)"""
         obs = obsfunc(repo)
-        getrev = repo.changelog.nodemap.get
-        for n in repo._obsinhibit:
-            obs.discard(getrev(n))
+        if _inhibitenabled(repo):
+            getrev = repo.changelog.nodemap.get
+            for n in repo._obsinhibit:
+                obs.discard(getrev(n))
         return obs
     try:
         extensions.find('directaccess')
diff --git a/tests/test-inhibit.t b/tests/test-inhibit.t
--- a/tests/test-inhibit.t
+++ b/tests/test-inhibit.t
@@ -763,3 +763,21 @@ Visible commits can still be pushed
   adding file changes
   added 1 changesets with 1 changes to 1 files
   2 new obsolescence markers
+
+Pulling from a inhibit repo to a non-inhibit repo should work
+
+  $ cd ..
+  $ hg clone -q inhibit not-inhibit
+  $ cat >> not-inhibit/.hg/hgrc <<EOF
+  > [extensions]
+  > inhibit=!
+  > directaccess=!
+  > evolve=!
+  > EOF
+  $ cd not-inhibit
+  $ hg book -d foo
+  $ hg pull
+  pulling from $TESTTMP/inhibit
+  searching for changes
+  no changes found
+  adding remote bookmark foo


More information about the Mercurial-devel mailing list