# HG changeset patch # User Laurent Charignon # Date 1427741117 25200 # Node ID 63ee05dd557aca27e17ade54987e95886d5574fb # Parent 37c00aeb47629b0af6ca29c714dee963e055c790 inhibit: ensure no visible changesets are obsolete after an update When updating to a commit we want to inhibit any obsolete commit affecting the changeset we are updating to. In other words we don't want any visible commit to be obsolete. diff -r 37c00aeb4762 -r 63ee05dd557a hgext/inhibit.py --- a/hgext/inhibit.py Fri Mar 27 10:58:04 2015 -0700 +++ b/hgext/inhibit.py Mon Mar 30 11:45:17 2015 -0700 @@ -28,6 +28,7 @@ from mercurial import repoview from mercurial import revset from mercurial import error +from mercurial import commands cmdtable = {} command = cmdutil.command(cmdtable) @@ -48,6 +49,19 @@ repo.__class__ = obsinhibitedrepo repo._explicitaccess = set() + +def _update(orig, ui, repo, *args, **kwargs): + """ + When moving to a commit we want to inhibit any obsolete commit affecting + the changeset we are updating to. In other words we don't want any visible + commit to be obsolete. + """ + res = orig(ui, repo, *args, **kwargs) + newhead = repo['.'].node() + _inhibitmarkers(repo, [newhead]) + return res + + # obsolescence inhibitor ######################## @@ -137,6 +151,9 @@ extensions.wrapfunction(obsolete, 'createmarkers', _createmarkers) extensions.wrapfunction(repoview, '_getdynamicblockers', _accessvisible) extensions.wrapfunction(revset, 'posttreebuilthook', _posttreebuilthook) + # wrap update to make sure that no obsolete commit is visible after an + # update + extensions.wrapcommand(commands.table, 'update', _update) def gethashsymbols(tree): # Returns the list of symbols of the tree that look like hashes diff -r 37c00aeb4762 -r 63ee05dd557a tests/test-inhibit.t --- a/tests/test-inhibit.t Fri Mar 27 10:58:04 2015 -0700 +++ b/tests/test-inhibit.t Mon Mar 30 11:45:17 2015 -0700 @@ -173,7 +173,63 @@ | o 0:54ccbc537fc2 add cA +Update should inhibit all related unstable commits + $ hg update 2 --hidden + 2 files updated, 0 files merged, 3 files removed, 0 files unresolved + working directory parent is obsolete! + $ hg log -G + o 9:55c73a90e4b4 add cJ + | + | o 7:18214586bf78 add cJ + |/ + o 6:cf5c4f4554ce add cH + | + o 5:5419eb264a33 add cG + | + o 4:98065434e5c6 add cE + | + | @ 2:7df62a38b9bf add cC + | | + | o 1:02bcbc3f6e56 add cB + |/ + o 0:54ccbc537fc2 add cA + + + $ hg update 9 + 4 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ 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 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 @@ -229,7 +285,7 @@ With severals hidden sha, rebase of one hidden stack onto another one: $ hg update -C 0 - 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + 0 files updated, 0 files merged, 4 files removed, 0 files unresolved $ mkcommit cK created new head $ mkcommit cL