merge: use labels in prompts to the user
Now that we persist the labels, we can consistently use the labels in
prompts for the user without risk of confusion. This changes a huge amount
of command output:
This means that merge prompts like:
no tool found to merge a
keep (l)ocal, take (o)ther, or leave (u)nresolved? u
and
remote changed a which local deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
become:
no tool found to merge a
keep (l)ocal [working copy], take (o)ther [destination], or leave (u)nresolved? u
and
remote [source] changed a which local [dest] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
where "working copy" and "destination" were supplied by the command that
requested the merge as labels for conflict markers, and thus should be
human-friendly.
--- a/mercurial/filemerge.py Tue Aug 09 09:15:46 2016 -0700
+++ b/mercurial/filemerge.py Fri Aug 12 06:01:42 2016 -0700
@@ -230,50 +230,56 @@
util.writefile(file, newdata)
@internaltool('prompt', nomerge)
-def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf):
+def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
"""Asks the user which of the local `p1()` or the other `p2()` version to
keep as the merged version."""
ui = repo.ui
fd = fcd.path()
+ prompts = partextras(labels)
+ prompts['fd'] = fd
try:
if fco.isabsent():
index = ui.promptchoice(
- _("local changed %s which remote deleted\n"
+ _("local%(l)s changed %(fd)s which remote%(o)s deleted\n"
"use (c)hanged version, (d)elete, or leave (u)nresolved?"
- "$$ &Changed $$ &Delete $$ &Unresolved") % fd, 2)
+ "$$ &Changed $$ &Delete $$ &Unresolved") % prompts, 2)
choice = ['local', 'other', 'unresolved'][index]
elif fcd.isabsent():
index = ui.promptchoice(
- _("remote changed %s which local deleted\n"
+ _("remote%(o)s changed %(fd)s which local%(l)s deleted\n"
"use (c)hanged version, leave (d)eleted, or "
"leave (u)nresolved?"
- "$$ &Changed $$ &Deleted $$ &Unresolved") % fd, 2)
+ "$$ &Changed $$ &Deleted $$ &Unresolved") % prompts, 2)
choice = ['other', 'local', 'unresolved'][index]
else:
index = ui.promptchoice(
- _("no tool found to merge %s\n"
- "keep (l)ocal, take (o)ther, or leave (u)nresolved?"
- "$$ &Local $$ &Other $$ &Unresolved") % fd, 2)
+ _("no tool found to merge %(fd)s\n"
+ "keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved?"
+ "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
choice = ['local', 'other', 'unresolved'][index]
if choice == 'other':
- return _iother(repo, mynode, orig, fcd, fco, fca, toolconf)
+ return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
+ labels)
elif choice == 'local':
- return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf)
+ return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
+ labels)
elif choice == 'unresolved':
- return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf)
+ return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
+ labels)
except error.ResponseExpected:
ui.write("\n")
- return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf)
+ return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
+ labels)
@internaltool('local', nomerge)
-def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf):
+def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
"""Uses the local `p1()` version of files as the merged version."""
return 0, fcd.isabsent()
@internaltool('other', nomerge)
-def _iother(repo, mynode, orig, fcd, fco, fca, toolconf):
+def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
"""Uses the other `p2()` version of files as the merged version."""
if fco.isabsent():
# local changed, remote deleted -- 'deleted' picked
@@ -285,7 +291,7 @@
return 0, deleted
@internaltool('fail', nomerge)
-def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf):
+def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
"""
Rather than attempting to merge files that were modified on both
branches, it marks them as unresolved. The resolve command must be
@@ -537,6 +543,22 @@
newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2], pad))
return newlabels
+def partextras(labels):
+ """Return a dictionary of extra labels for use in prompts to the user
+
+ Intended use is in strings of the form "(l)ocal%(l)s".
+ """
+ if labels is None:
+ return {
+ "l": "",
+ "o": "",
+ }
+
+ return {
+ "l": " [%s]" % labels[0],
+ "o": " [%s]" % labels[1],
+ }
+
def _filemerge(premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
"""perform a 3-way merge in the working directory
@@ -588,7 +610,7 @@
toolconf = tool, toolpath, binary, symlink
if mergetype == nomerge:
- r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf)
+ r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels)
return True, r, deleted
if premerge:
--- a/mercurial/merge.py Tue Aug 09 09:15:46 2016 -0700
+++ b/mercurial/merge.py Fri Aug 12 06:01:42 2016 -0700
@@ -1535,11 +1535,13 @@
if '.hgsubstate' in actionbyfile:
f = '.hgsubstate'
m, args, msg = actionbyfile[f]
+ prompts = filemerge.partextras(labels)
+ prompts['f'] = f
if m == 'cd':
if repo.ui.promptchoice(
- _("local changed %s which remote deleted\n"
+ _("local%(l)s changed %(f)s which remote%(o)s deleted\n"
"use (c)hanged version or (d)elete?"
- "$$ &Changed $$ &Delete") % f, 0):
+ "$$ &Changed $$ &Delete") % prompts, 0):
actionbyfile[f] = ('r', None, "prompt delete")
elif f in p1:
actionbyfile[f] = ('am', None, "prompt keep")
@@ -1549,9 +1551,9 @@
f1, f2, fa, move, anc = args
flags = p2[f2].flags()
if repo.ui.promptchoice(
- _("remote changed %s which local deleted\n"
+ _("remote%(o)s changed %(f)s which local%(l)s deleted\n"
"use (c)hanged version or leave (d)eleted?"
- "$$ &Changed $$ &Deleted") % f, 0) == 0:
+ "$$ &Changed $$ &Deleted") % prompts, 0) == 0:
actionbyfile[f] = ('g', (flags, False), "prompt recreating")
else:
del actionbyfile[f]
--- a/tests/failfilemerge.py Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/failfilemerge.py Fri Aug 12 06:01:42 2016 -0700
@@ -9,7 +9,7 @@
)
def failfilemerge(filemergefn,
- premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
+ premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
raise error.Abort("^C")
return filemergefn(premerge, repo, mynode, orig, fcd, fco, fca, labels)
--- a/tests/test-copy-move-merge.t Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/test-copy-move-merge.t Fri Aug 12 06:01:42 2016 -0700
@@ -85,7 +85,7 @@
> c
> EOF
rebasing 2:add3f11052fa "other" (tip)
- remote changed a which local deleted
+ remote [source] changed a which local [dest] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
$ cat b
--- a/tests/test-largefiles-update.t Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/test-largefiles-update.t Fri Aug 12 06:01:42 2016 -0700
@@ -611,7 +611,7 @@
> EOF
rebasing 1:72518492caa6 "#1"
rebasing 4:07d6153b5c04 "#4"
- local changed .hglf/large1 which remote deleted
+ local [dest] changed .hglf/large1 which remote [source] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved? c
$ hg diff -c "tip~1" --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
--- a/tests/test-merge-changedelete.t Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/test-merge-changedelete.t Fri Aug 12 06:01:42 2016 -0700
@@ -717,9 +717,9 @@
$ echo changed >> file1
$ hg rm file2
$ hg update 1 -y
- local changed file1 which remote deleted
+ local [working copy] changed file1 which remote [destination] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved? u
- remote changed file2 which local deleted
+ remote [destination] changed file2 which local [working copy] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
1 files updated, 0 files merged, 0 files removed, 2 files unresolved
use 'hg resolve' to retry unresolved file merges
@@ -893,9 +893,9 @@
$ echo changed >> file1
$ hg rm file2
$ hg update 1 --config ui.interactive=True --tool :prompt
- local changed file1 which remote deleted
+ local [working copy] changed file1 which remote [destination] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved?
- remote changed file2 which local deleted
+ remote [destination] changed file2 which local [working copy] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1 files updated, 0 files merged, 0 files removed, 2 files unresolved
use 'hg resolve' to retry unresolved file merges
@@ -943,9 +943,9 @@
$ echo changed >> file1
$ hg rm file2
$ hg update 1 --tool :merge3
- local changed file1 which remote deleted
+ local [working copy] changed file1 which remote [destination] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved? u
- remote changed file2 which local deleted
+ remote [destination] changed file2 which local [working copy] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
1 files updated, 0 files merged, 0 files removed, 2 files unresolved
use 'hg resolve' to retry unresolved file merges
@@ -999,9 +999,9 @@
(status identical)
=== :other -> :prompt ===
- local changed file1 which remote deleted
+ local [working copy] changed file1 which remote [destination] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved?
- remote changed file2 which local deleted
+ remote [destination] changed file2 which local [working copy] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
--- diff of status ---
(status identical)
@@ -1026,9 +1026,9 @@
(status identical)
=== :local -> :prompt ===
- local changed file1 which remote deleted
+ local [working copy] changed file1 which remote [destination] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved?
- remote changed file2 which local deleted
+ remote [destination] changed file2 which local [working copy] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
--- diff of status ---
(status identical)
@@ -1043,9 +1043,9 @@
(status identical)
=== :fail -> :prompt ===
- local changed file1 which remote deleted
+ local [working copy] changed file1 which remote [destination] deleted
use (c)hanged version, (d)elete, or leave (u)nresolved?
- remote changed file2 which local deleted
+ remote [destination] changed file2 which local [working copy] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
--- diff of status ---
(status identical)
--- a/tests/test-merge-types.t Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/test-merge-types.t Fri Aug 12 06:01:42 2016 -0700
@@ -173,7 +173,7 @@
(couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
picked tool ':prompt' for a (binary False symlink True changedelete False)
no tool found to merge a
- keep (l)ocal, take (o)ther, or leave (u)nresolved? u
+ keep (l)ocal [working copy], take (o)ther [destination], or leave (u)nresolved? u
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
1 other heads for branch "default"
--- a/tests/test-rebase-newancestor.t Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/test-rebase-newancestor.t Fri Aug 12 06:01:42 2016 -0700
@@ -135,7 +135,7 @@
note: rebase of 1:1d1a643d390e created no changes to commit
rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
rebasing 4:4b019212aaf6 "dev: merge default"
- remote changed f-default which local deleted
+ remote [source] changed f-default which local [dest] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
rebasing 6:9455ee510502 "dev: merge default"
saved backup bundle to $TESTTMP/ancestor-merge/.hg/strip-backup/1d1a643d390e-43e9e04b-backup.hg (glob)
@@ -164,7 +164,7 @@
> EOF
rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
rebasing 4:4b019212aaf6 "dev: merge default"
- remote changed f-default which local deleted
+ remote [source] changed f-default which local [dest] deleted
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
rebasing 6:9455ee510502 "dev: merge default"
saved backup bundle to $TESTTMP/ancestor-merge-2/.hg/strip-backup/ec2c14fb2984-62d0b222-backup.hg (glob)
--- a/tests/test-subrepo-missing.t Tue Aug 09 09:15:46 2016 -0700
+++ b/tests/test-subrepo-missing.t Fri Aug 12 06:01:42 2016 -0700
@@ -62,7 +62,7 @@
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ rm .hgsubstate
$ hg up 0
- remote changed .hgsubstate which local deleted
+ remote [destination] changed .hgsubstate which local [working copy] deleted
use (c)hanged version or leave (d)eleted? c
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg st