This is an archive of the discontinued Mercurial Phabricator instance.

shelve: first prototype of storing unresolved changes

Authored by navaneeth.suresh on Jun 5 2019, 2:36 PM.


Group Reviewers

Before storing unresolved mergestate information in changeset level, I tried
to make the user store the partially resolved merge to restore for later
after fixing an urgent bug using the usual mergestate information in
$HGRCPATH/merge/ only.

This patch adds an --unresolved flag to shelve. Until now, a shelve
during a merge was aborted. This patch makes shelve to handle merge with
unresolved files. The usual mergestate information in $HGRCPATH/merge/ is
moved to $HGRCPATH/merge-unresolved/<basename>/ after shelving
and the working directory is updated to p1(). In the next patch, I'll make
unshelve to restore this information.

Unresolved shelve changesets are stored with the extra mapping
{'unresolved-merge': True}. Also, hg shelve --patch and
hg shelve --list will show unresolved files separately as:

$ hg shelve --list
default (unresolved)         (1s ago)    changes to: C

shelve will abort when:

  1. No merge is active on calling with --unresolved.
  2. No unresolved files found in active merge on calling with --unresolved.
  3. Merge is active on calling without --unresolved.

Diff Detail

rHG Mercurial
Lint Skipped
Unit Tests Skipped

Event Timeline

pulkit added a subscriber: pulkit.Jun 6 2019, 1:02 PM

Over past few days, @navaneeth.suresh was working on building the initial prototype on bitbucket and I was reviewing his initial work there. Now we have a nice initial prototype ready, and we decided to move things to core.

This is a prototype, which helps us (especially Navaneeth) understand more about the things required to store etc. Right now, it just moves files from merge/ to merge-unresolved/<shelve-name>/ and storing an extra in the commit to denote that it contains an unresolved merge.

Reviews and ideas on how to move forward are greatly appreciated.

pulkit added inline comments.Jun 10 2019, 1:37 PM

vfs.exists can be used


also, this storing a mergestate code should go in a separate function.


vfs.makedir or vfs.mkdir can be used


vfs.rename should be used.


can we look into changeset extras here to decide whether this is an unresolved shelve or not here?

It will be nice to remove any details of our storage layer and only keep them to functions which stores and restores merge states.

pulkit added inline comments.Jun 10 2019, 1:41 PM

if looking into changeset extras can be expensive right now, let's have a function which tells whether a shelve is a unresolved shelve or not and move this code there.

navaneeth.suresh marked 4 inline comments as done.Jun 10 2019, 3:41 PM
navaneeth.suresh updated this revision to Diff 15432.

i don't think we can get shelvectx here. i tried the following code but, that failed to work(got the error: node not found). the shelve changesets can't be used during other than unshelve i guess (reference from _unshelverestorecommit()).

snode = shelvedfile(repo, sname, 'shelve').readinfo()['node']
shelvectx = repo[snode]

also, i can't find any global variable declarations to make the extra parsing one time only. one workaround should be adding a unresolved-merge: True to the shelvedfile. but, it uses scmutil.simplekeyvaluefile() to write only a key-value pair which is its node id.

pulkit added inline comments.Jun 10 2019, 6:45 PM

the function needs documentation on what this does and why it does so.


okay, then let's move this one liner to a separate function. Something like isunresolvedshelve(..) which does the repo.vfs.exists() thing.


nit: will be nice to keep )] + cmdutil.walkopts, to a new line. as it was before.

navaneeth.suresh marked 6 inline comments as done.Jun 11 2019, 8:08 AM
navaneeth.suresh updated this revision to Diff 15436.
pulkit added inline comments.Jun 11 2019, 2:02 PM

let's do namewidth += len('unresolved)'


ideally, that should be len(' (unresolved)'), right? i haven't seen such use cases in the codebase though.

navaneeth.suresh marked an inline comment as done.Jun 11 2019, 3:31 PM

Adding changes to D6479 and abandoning.