inhibit: ensure that no obsolete changesets are visible after a bookmark change
authorLaurent Charignon <lcharignon@fb.com>
Mon, 30 Mar 2015 13:31:09 -0700
changeset 1234 c15d4677f2ba
parent 1233 63ee05dd557a
child 1235 ffa32ca659f1
inhibit: ensure that no obsolete changesets are visible after a bookmark change When creating a bookmark, we could reveal obsolete changesets. We are inhibiting the obsolete changesets resulting from a bookmark change. There are two ways to record bookmark changes to disk and we wrap both.
hgext/inhibit.py
tests/test-inhibit.t
--- a/hgext/inhibit.py	Mon Mar 30 11:45:17 2015 -0700
+++ b/hgext/inhibit.py	Mon Mar 30 13:31:09 2015 -0700
@@ -29,6 +29,7 @@
 from mercurial import revset
 from mercurial import error
 from mercurial import commands
+from mercurial import bookmarks
 
 cmdtable = {}
 command = cmdutil.command(cmdtable)
@@ -61,6 +62,12 @@
     _inhibitmarkers(repo, [newhead])
     return res
 
+def _bookmarkchanged(orig, bkmstoreinst, *args, **kwargs):
+    """ Add inhibition markers to every obsolete bookmarks """
+    repo = bkmstoreinst._repo
+    bkmstorenodes = [repo[v].node() for v in bkmstoreinst.values()]
+    _inhibitmarkers(repo, bkmstorenodes)
+    return orig(bkmstoreinst, *args, **kwargs)
 
 # obsolescence inhibitor
 ########################
@@ -154,6 +161,11 @@
     # wrap update to make sure that no obsolete commit is visible after an
     # update
     extensions.wrapcommand(commands.table, 'update', _update)
+    # There are two ways to save bookmark changes during a transation, we
+    # wrap both to add inhibition markers.
+    extensions.wrapfunction(bookmarks.bmstore, 'recordchange', _bookmarkchanged)
+    extensions.wrapfunction(bookmarks.bmstore, 'write', _bookmarkchanged)
+
 
 def gethashsymbols(tree):
     # Returns the list of symbols of the tree that look like hashes
--- a/tests/test-inhibit.t	Mon Mar 30 11:45:17 2015 -0700
+++ b/tests/test-inhibit.t	Mon Mar 30 13:31:09 2015 -0700
@@ -230,6 +230,42 @@
   |
   o  0:54ccbc537fc2 add cA
   
+
+Bookmark should inhibit all related unstable commits
+  $ hg bookmark -r 2 book1  --hidden
+  $ hg log -G
+  @  9:55c73a90e4b4 add cJ
+  |
+  | o  7:18214586bf78 add cJ
+  |/
+  o  6:cf5c4f4554ce add cH
+  |
+  o  5:5419eb264a33 add cG
+  |
+  o  4:98065434e5c6 add cE
+  |
+  | o  2:7df62a38b9bf add cC
+  | |
+  | o  1:02bcbc3f6e56 add cB
+  |/
+  o  0:54ccbc537fc2 add cA
+  
+  $ hg bookmark -d book1
+  $ hg prune --hidden 1::
+  3 changesets pruned
+  $ hg log -G
+  @  9:55c73a90e4b4 add cJ
+  |
+  | o  7:18214586bf78 add cJ
+  |/
+  o  6:cf5c4f4554ce add cH
+  |
+  o  5:5419eb264a33 add cG
+  |
+  o  4:98065434e5c6 add cE
+  |
+  o  0:54ccbc537fc2 add cA
+  
 Test that direct access make changesets visible
 
   $ hg export 2db36d8066ff 02bcbc3f6e56