Mercurial > evolve
changeset 1234:c15d4677f2ba
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.
author | Laurent Charignon <lcharignon@fb.com> |
---|---|
date | Mon, 30 Mar 2015 13:31:09 -0700 |
parents | 63ee05dd557a |
children | ffa32ca659f1 |
files | hgext/inhibit.py tests/test-inhibit.t |
diffstat | 2 files changed, 48 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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