[PATCH 3 of 3 unshelve] unshelve: add support for custom merge tools

Siddharth Agarwal sid0 at fb.com
Wed Nov 18 17:20:59 CST 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1447888283 28800
#      Wed Nov 18 15:11:23 2015 -0800
# Node ID 7695d092615fafae933758ca8074b8d30a6fa866
# Parent  bcb5b0e95269d5797fcdd1ba5610afa681c62d47
# Available At http://42.netv6.net/sid0-wip/hg/
#              hg pull http://42.netv6.net/sid0-wip/hg/ -r 7695d092615f
unshelve: add support for custom merge tools

For parity with merge --tool, rebase --tool etc.

rebase.rebase overwrites the tool in repo.ui, so we need to explicitly pass it
down there too.

diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -574,6 +574,7 @@ def unshelvecontinue(ui, repo, state, op
            _('continue an incomplete unshelve operation')),
           ('k', 'keep', None,
            _('keep shelve after unshelving')),
+          ('t', 'tool', '', _('specify merge tool')),
           ('', 'date', '',
            _('set date for temporary commits (DEPRECATED)'), _('DATE'))],
          _('hg unshelve [SHELVED]'))
@@ -620,6 +621,8 @@ def unshelve(ui, repo, *shelved, **opts)
         if shelved:
             raise error.Abort(_('cannot combine abort/continue with '
                                'naming a shelved change'))
+        if abortf and opts.get('tool', False):
+            ui.warn(_('tool option will be ignored\n'))
 
         try:
             state = shelvedstate.load(repo)
@@ -648,7 +651,9 @@ def unshelve(ui, repo, *shelved, **opts)
 
     oldquiet = ui.quiet
     wlock = lock = tr = None
+    forcemerge = ui.backupconfig('ui', 'forcemerge')
     try:
+        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'unshelve')
         wlock = repo.wlock()
         lock = repo.lock()
 
@@ -706,6 +711,7 @@ def unshelve(ui, repo, *shelved, **opts)
                     'rev' : [shelvectx.rev()],
                     'dest' : str(tmpwctx.rev()),
                     'keep' : True,
+                    'tool' : opts.get('tool', ''),
                 })
             except error.InterventionRequired:
                 tr.close()
@@ -744,6 +750,7 @@ def unshelve(ui, repo, *shelved, **opts)
         if tr:
             tr.release()
         lockmod.release(lock, wlock)
+        ui.restoreconfig(forcemerge)
 
 @command('shelve',
          [('A', 'addremove', None,
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -469,6 +469,29 @@ set up another conflict between a commit
 
 if we resolve a conflict while unshelving, the unshelve should succeed
 
+  $ hg unshelve --tool :merge-other --keep
+  unshelving change 'default'
+  temporarily committing pending changes (restore with 'hg unshelve --abort')
+  rebasing shelved changes
+  rebasing 6:c5e6910e7601 "changes to 'second'" (tip)
+  merging a/a
+  $ hg parents -q
+  4:33f7f61e6c5e
+  $ hg shelve -l
+  default         (*)* changes to 'second' (glob)
+  $ hg status
+  M a/a
+  A foo/foo
+  $ cat a/a
+  a
+  c
+  a
+  $ cat > a/a << EOF
+  > a
+  > c
+  > x
+  > EOF
+
   $ HGMERGE=true hg unshelve
   unshelving change 'default'
   temporarily committing pending changes (restore with 'hg unshelve --abort')
@@ -730,7 +753,8 @@ unshelve and conflicts with tracked and 
   >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
   $ cat f.orig
   g
-  $ hg unshelve --abort
+  $ hg unshelve --abort -t false
+  tool option will be ignored
   rebase aborted
   unshelve of 'default' aborted
   $ hg st


More information about the Mercurial-devel mailing list