visibility: add shelve support

Summary:
Shelve uses hidden commits to store shelved changes.  These need to be made
invisible, too.

Differential Revision: D15079352

fbshipit-source-id: 6063270d18df81d9b4af7823542a38c5feb45e3a
This commit is contained in:
Mark Thomas 2019-04-26 01:02:59 -07:00 committed by Facebook Github Bot
parent 984af7d7fe
commit af2e53abb0
2 changed files with 73 additions and 14 deletions

View File

@ -50,6 +50,7 @@ from edenscm.mercurial import (
templatefilters,
util,
vfs as vfsmod,
visibility,
)
from edenscm.mercurial.i18n import _
@ -314,9 +315,7 @@ class shelvedstate(object):
def removenodes(self, ui, repo):
"""Cleanup temporary nodes from the repo"""
if self.obsshelve:
unfi = repo.unfiltered()
relations = [(unfi[n], ()) for n in self.nodestoremove]
obsolete.createmarkers(repo, relations)
_hidenodes(repo, self.nodestoremove)
else:
repair.strip(ui, repo, self.nodestoremove, backup=False, topic="shelve")
@ -533,7 +532,7 @@ def _docreatecmd(ui, repo, pats, opts):
_nothingtoshelvemessaging(ui, repo, pats, opts)
return 1
obsolete.createmarkers(repo, [(repo.unfiltered()[node], ())])
_hidenodes(repo, [node])
except (KeyboardInterrupt, Exception):
if activebookmark:
bookmarks.activate(repo, activebookmark)
@ -981,16 +980,21 @@ def _checkunshelveuntrackedproblems(ui, repo, shelvectx):
def _obsoleteredundantnodes(repo, tr, pctx, shelvectx, tmpwctx):
# order is important in the list of [shelvectx, tmpwctx] below
# some nodes may already be obsolete
toobsolete = []
if shelvectx != pctx:
toobsolete.append(shelvectx)
if tmpwctx not in (pctx, shelvectx):
toobsolete.append(tmpwctx)
_hidenodes(repo, [ctx.node() for ctx in toobsolete])
def _hidenodes(repo, nodes):
unfi = repo.unfiltered()
nodestoobsolete = filter(lambda x: x != pctx, [shelvectx, tmpwctx])
seen = set()
relations = []
for nto in nodestoobsolete:
if nto in seen:
continue
seen.add(nto)
relations.append((unfi[nto.rev()], ()))
obsolete.createmarkers(unfi, relations)
if obsolete.isenabled(repo, obsolete.createmarkersopt):
markers = [(unfi[n], ()) for n in nodes]
obsolete.createmarkers(repo, markers)
if visibility.tracking(repo):
visibility.remove(repo, nodes)
@command(

View File

@ -1,4 +1,4 @@
$ enable amend rebase undo directaccess
$ enable amend rebase undo directaccess shelve
$ setconfig experimental.evolution=
$ setconfig visibility.enabled=true
$ setconfig mutation.record=true mutation.enabled=true mutation.date="0 0"
@ -521,3 +521,58 @@ Test that hiddenoverride has no effect on pinning hidden revisions.
|
o 0: 48b9aae0607f 'Z'
Test that shelve and unshelve work
$ echo more > file
$ hg add file
$ hg st
A file
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg st
$ tglogm
@ 6: a77c932a84af 'F'
|
o 5: 05eb30556340 'E'
|
o 0: 48b9aae0607f 'Z'
$ hg prev
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
[05eb30] E
$ hg unshelve --keep
unshelving change 'default'
rebasing shelved changes
rebasing 7:f321a4a9343c "shelve changes to: F" (tip)
$ hg st
A file
$ tglogm
o 6: a77c932a84af 'F'
|
@ 5: 05eb30556340 'E'
|
o 0: 48b9aae0607f 'Z'
$ hg prev --clean
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
[48b9aa] Z
$ echo data > other
$ hg add other
$ hg st
A other
? file
$ hg unshelve
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 7:f321a4a9343c "shelve changes to: F"
$ hg st
A file
A other
$ tglogm
o 6: a77c932a84af 'F'
|
o 5: 05eb30556340 'E'
|
@ 0: 48b9aae0607f 'Z'