# HG changeset patch # User Laurent Charignon # Date 1427747469 25200 # Node ID c15d4677f2ba946c62387fe1ec27d383aa3274a9 # Parent 63ee05dd557aca27e17ade54987e95886d5574fb 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. diff --git a/hgext/inhibit.py b/hgext/inhibit.py --- a/hgext/inhibit.py +++ b/hgext/inhibit.py @@ -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 diff --git a/tests/test-inhibit.t b/tests/test-inhibit.t --- a/tests/test-inhibit.t +++ b/tests/test-inhibit.t @@ -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