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.
--- 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