Patchwork [2,of,2] merge: use labels in prompts to the user

login
register
mail settings
Submitter Simon Farnsworth
Date March 20, 2016, 3:52 a.m.
Message ID <1u2v9nm3f1ym83x76p3b8ug0.1458445933641@email.android.com>
Download mbox | patch
Permalink /patch/13976/
State Not Applicable
Headers show

Comments

Simon Farnsworth - March 20, 2016, 3:52 a.m.
Good point. I think that I might make translations a little worse in this version, as 'local' and 'other' will not be translated.

I can fix this in a V2, but I'm not sure what happens with the labels - they're already exposed to users, so should be translated.

Sent from Mobile


-------- Original message --------
From: timeless <timeless@gmail.com>
Date: 19/03/2016 18:57 (GMT-08:00)
To: Simon Farnsworth <simonfar@fb.com>
Cc: mercurial-devel <mercurial-devel@mercurial-scm.org>
Subject: Re: [PATCH 2 of 2] merge: use labels in prompts to the user


I don't suppose you know what this would look like for a translation?

(I should probably mock one up to test it...)

On Mar 19, 2016 9:29 PM, "Simon Farnsworth" <simonfar@fb.com<mailto:simonfar@fb.com>> wrote:
# HG changeset patch
# User Simon Farnsworth <simonfar@fb.com<mailto:simonfar@fb.com>>
# Date 1458436919 25200
#      Sat Mar 19 18:21:59 2016 -0700
# Node ID 10b438b40a8d7da24a2ca51e66385257d1bf69ad
# Parent  015b096baa079eda4b1ae754b9665017620d8f8c
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
  other [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.
timeless - March 20, 2016, 4:53 a.m.
As long as it's possible for things to be written to the disk
consistently using "untranslated" messages, and shown w/ eventual
translations, and we have to maintain a table of all these constants
forever -- so that future translators will always translate them even
if we eventually replace the strings (because the disk versions will
persists forever).

On Sat, Mar 19, 2016 at 11:52 PM, Simon Farnsworth <simonfar@fb.com> wrote:
> Good point. I think that I might make translations a little worse in this
> version, as 'local' and 'other' will not be translated.
>
> I can fix this in a V2, but I'm not sure what happens with the labels -
> they're already exposed to users, so should be translated.
>
> Sent from Mobile
>
>
> -------- Original message --------
> From: timeless <timeless@gmail.com>
> Date: 19/03/2016 18:57 (GMT-08:00)
> To: Simon Farnsworth <simonfar@fb.com>
> Cc: mercurial-devel <mercurial-devel@mercurial-scm.org>
> Subject: Re: [PATCH 2 of 2] merge: use labels in prompts to the user
>
> I don't suppose you know what this would look like for a translation?
>
> (I should probably mock one up to test it...)
>
> On Mar 19, 2016 9:29 PM, "Simon Farnsworth" <simonfar@fb.com> wrote:
>>
>> # HG changeset patch
>> # User Simon Farnsworth <simonfar@fb.com>
>> # Date 1458436919 25200
>> #      Sat Mar 19 18:21:59 2016 -0700
>> # Node ID 10b438b40a8d7da24a2ca51e66385257d1bf69ad
>> # Parent  015b096baa079eda4b1ae754b9665017620d8f8c
>> 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
>>   other [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.
>>
>> diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
>> --- a/mercurial/filemerge.py
>> +++ b/mercurial/filemerge.py
>> @@ -229,50 +229,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 or the other version to keep as
>>      the merged version."""
>>      ui = repo.ui
>>      fd = fcd.path()
>>
>> +    prompts = partnames(labels)
>> +    prompts['fd'] = fd
>>      try:
>>          if fco.isabsent():
>>              index = ui.promptchoice(
>> -                _("local changed %s which remote deleted\n"
>> +                _("%(local)s changed %(fd)s which %(other)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"
>> +                _("%(other)s changed %(fd)s which %(local)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 %(localact)s, take %(otheract)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 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 version of files as the merged version."""
>>      if fco.isabsent():
>>          # local changed, remote deleted -- 'deleted' picked
>> @@ -284,7 +290,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
>> @@ -536,6 +542,25 @@
>>          newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2],
>> pad))
>>      return newlabels
>>
>> +def partnames(labels):
>> +    """Return a dictionary of merge part names for use in prompts to the
>> user
>> +
>> +    These names include labels if supplied"""
>> +    if labels is None:
>> +        return {
>> +            "local": "local",
>> +            "other": "other",
>> +            "localact": "(l)ocal",
>> +            "otheract": "(o)ther",
>> +        }
>> +
>> +    return {
>> +        "local": "local [%s]" % labels[0],
>> +            "other": "other [%s]" % labels[1],
>> +            "localact": "(l)ocal [%s]" % labels[0],
>> +            "otheract": "(o)ther [%s]" % labels[1],
>> +    }
>> +
>>  def _filemerge(premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
>>      """perform a 3-way merge in the working directory
>>
>> @@ -587,7 +612,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:
>> diff --git a/mercurial/merge.py b/mercurial/merge.py
>> --- a/mercurial/merge.py
>> +++ b/mercurial/merge.py
>> @@ -1537,11 +1537,13 @@
>>          if '.hgsubstate' in actionbyfile:
>>              f = '.hgsubstate'
>>              m, args, msg = actionbyfile[f]
>> +            prompts = filemerge.partnames(labels)
>> +            prompts['f'] = f
>>              if m == 'cd':
>>                  if repo.ui.promptchoice(
>> -                    _("local changed %s which remote deleted\n"
>> +                    _("%(local)s changed %(f)s which %(other)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")
>> @@ -1551,9 +1553,9 @@
>>                  f1, f2, fa, move, anc = args
>>                  flags = p2[f2].flags()
>>                  if repo.ui.promptchoice(
>> -                    _("remote changed %s which local deleted\n"
>> +                    _("%(other)s changed %(f)s which %(local)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]
>> diff --git a/tests/failfilemerge.py b/tests/failfilemerge.py
>> --- a/tests/failfilemerge.py
>> +++ b/tests/failfilemerge.py
>> @@ -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)
>>
>> diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
>> --- a/tests/test-commit-amend.t
>> +++ b/tests/test-commit-amend.t
>> @@ -813,7 +813,7 @@
>>    $ hg merge -q bar --config ui.interactive=True << EOF
>>    > c
>>    > EOF
>> -  local changed aa which remote deleted
>> +  local changed aa which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? c
>>    $ hg ci -m 'merge bar (with conflicts)'
>>    $ hg log --config diff.git=1 -pr .
>> diff --git a/tests/test-copy-move-merge.t b/tests/test-copy-move-merge.t
>> --- a/tests/test-copy-move-merge.t
>> +++ b/tests/test-copy-move-merge.t
>> @@ -85,7 +85,7 @@
>>    > c
>>    > EOF
>>    rebasing 2:add3f11052fa "other" (tip)
>> -  remote changed a which local deleted
>> +  other [source] changed a which local [dest] deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
>>
>>    $ cat b
>> diff --git a/tests/test-largefiles-update.t
>> b/tests/test-largefiles-update.t
>> --- a/tests/test-largefiles-update.t
>> +++ b/tests/test-largefiles-update.t
>> @@ -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 other [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]'
>> diff --git a/tests/test-merge-changedelete.t
>> b/tests/test-merge-changedelete.t
>> --- a/tests/test-merge-changedelete.t
>> +++ b/tests/test-merge-changedelete.t
>> @@ -54,9 +54,9 @@
>>  Non-interactive merge:
>>
>>    $ hg merge -y
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging file3
>>    warning: conflicts while merging file3! (edit, then use 'hg resolve
>> --mark')
>> @@ -117,9 +117,9 @@
>>    > c
>>    > d
>>    > EOF
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? c
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
>>    merging file3
>>    warning: conflicts while merging file3! (edit, then use 'hg resolve
>> --mark')
>> @@ -181,18 +181,18 @@
>>    > baz
>>    > c
>>    > EOF
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? foo
>>    unrecognized response
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? bar
>>    unrecognized response
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? d
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? baz
>>    unrecognized response
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
>>    merging file3
>>    warning: conflicts while merging file3! (edit, then use 'hg resolve
>> --mark')
>> @@ -250,9 +250,9 @@
>>    $ hg merge --config ui.interactive=true <<EOF
>>    > d
>>    > EOF
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? d
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
>>    merging file3
>>    warning: conflicts while merging file3! (edit, then use 'hg resolve
>> --mark')
>> @@ -445,9 +445,9 @@
>>    1 other heads for branch "default"
>>
>>    $ hg merge --config ui.interactive=True --tool :prompt
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
>>    no tool found to merge file3
>>    keep (l)ocal, take (o)ther, or leave (u)nresolved?
>> @@ -501,9 +501,9 @@
>>    1 other heads for branch "default"
>>
>>    $ hg merge --tool :prompt
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    no tool found to merge file3
>>    keep (l)ocal, take (o)ther, or leave (u)nresolved? u
>> @@ -555,9 +555,9 @@
>>    1 other heads for branch "default"
>>
>>    $ hg merge --tool :merge3
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging file3
>>    warning: conflicts while merging file3! (edit, then use 'hg resolve
>> --mark')
>> @@ -642,9 +642,9 @@
>>    (status identical)
>>
>>    === :other -> :prompt ===
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
>>    no tool found to merge file3
>>    keep (l)ocal, take (o)ther, or leave (u)nresolved?
>> @@ -671,9 +671,9 @@
>>    (status identical)
>>
>>    === :local -> :prompt ===
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
>>    no tool found to merge file3
>>    keep (l)ocal, take (o)ther, or leave (u)nresolved?
>> @@ -690,9 +690,9 @@
>>    (status identical)
>>
>>    === :fail -> :prompt ===
>> -  local changed file1 which remote deleted
>> +  local changed file1 which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other changed file2 which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
>>    no tool found to merge file3
>>    keep (l)ocal, take (o)ther, or leave (u)nresolved?
>> @@ -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 other [destination] deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  remote changed file2 which local deleted
>> +  other [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 other [destination] deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other [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 other [destination] deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  remote changed file2 which local deleted
>> +  other [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 other [destination] deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other [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 other [destination] deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other [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 other [destination] deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved?
>> -  remote changed file2 which local deleted
>> +  other [destination] changed file2 which local [working copy] deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
>>    --- diff of status ---
>>    (status identical)
>> diff --git a/tests/test-merge-force.t b/tests/test-merge-force.t
>> --- a/tests/test-merge-force.t
>> +++ b/tests/test-merge-force.t
>> @@ -142,55 +142,55 @@
>>  #   in the same way, so it could potentially be left alone
>>
>>    $ hg merge -f --tool internal:merge3 'desc("remote")' 2>&1 | tee
>> $TESTTMP/merge-output-1
>> -  local changed content1_missing_content1_content4-tracked which remote
>> deleted
>> +  local changed content1_missing_content1_content4-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  local changed content1_missing_content3_content3-tracked which remote
>> deleted
>> +  local changed content1_missing_content3_content3-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  local changed content1_missing_content3_content4-tracked which remote
>> deleted
>> +  local changed content1_missing_content3_content4-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  local changed content1_missing_missing_content4-tracked which remote
>> deleted
>> +  local changed content1_missing_missing_content4-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_content1-untracked which
>> local deleted
>> +  other changed content1_content2_content1_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_content2-untracked which
>> local deleted
>> +  other changed content1_content2_content1_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_content4-untracked which
>> local deleted
>> +  other changed content1_content2_content1_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_missing-tracked which local
>> deleted
>> +  other changed content1_content2_content1_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_missing-untracked which local
>> deleted
>> +  other changed content1_content2_content1_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_content1-untracked which
>> local deleted
>> +  other changed content1_content2_content2_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_content2-untracked which
>> local deleted
>> +  other changed content1_content2_content2_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_content4-untracked which
>> local deleted
>> +  other changed content1_content2_content2_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_missing-tracked which local
>> deleted
>> +  other changed content1_content2_content2_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_missing-untracked which local
>> deleted
>> +  other changed content1_content2_content2_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_content1-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_content2-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_content3-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content3-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_content4-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_missing-tracked which local
>> deleted
>> +  other changed content1_content2_content3_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_missing-untracked which local
>> deleted
>> +  other changed content1_content2_content3_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_content1-untracked which local
>> deleted
>> +  other changed content1_content2_missing_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_content2-untracked which local
>> deleted
>> +  other changed content1_content2_missing_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_content4-untracked which local
>> deleted
>> +  other changed content1_content2_missing_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_missing-tracked which local
>> deleted
>> +  other changed content1_content2_missing_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_missing-untracked which local
>> deleted
>> +  other changed content1_content2_missing_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content1_content4-tracked
>>    merging content1_content2_content2_content1-tracked
>> @@ -703,63 +703,63 @@
>>    (no more unresolved files)
>>    $ hg resolve --unmark --all
>>    $ hg resolve --all --tool internal:merge3
>> -  remote changed content1_content2_content1_content1-untracked which
>> local deleted
>> +  other changed content1_content2_content1_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_content2-untracked which
>> local deleted
>> +  other changed content1_content2_content1_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content1_content4-tracked
>> -  remote changed content1_content2_content1_content4-untracked which
>> local deleted
>> +  other changed content1_content2_content1_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_missing-tracked which local
>> deleted
>> +  other changed content1_content2_content1_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content1_missing-untracked which local
>> deleted
>> +  other changed content1_content2_content1_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content2_content1-tracked
>> -  remote changed content1_content2_content2_content1-untracked which
>> local deleted
>> +  other changed content1_content2_content2_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_content2-untracked which
>> local deleted
>> +  other changed content1_content2_content2_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content2_content4-tracked
>> -  remote changed content1_content2_content2_content4-untracked which
>> local deleted
>> +  other changed content1_content2_content2_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_missing-tracked which local
>> deleted
>> +  other changed content1_content2_content2_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content2_missing-untracked which local
>> deleted
>> +  other changed content1_content2_content2_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content3_content1-tracked
>> -  remote changed content1_content2_content3_content1-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_content2-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content3_content3-tracked
>> -  remote changed content1_content2_content3_content3-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content3-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_content3_content4-tracked
>> -  remote changed content1_content2_content3_content4-untracked which
>> local deleted
>> +  other changed content1_content2_content3_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_missing-tracked which local
>> deleted
>> +  other changed content1_content2_content3_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_content3_missing-untracked which local
>> deleted
>> +  other changed content1_content2_content3_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_missing_content1-tracked
>> -  remote changed content1_content2_missing_content1-untracked which local
>> deleted
>> +  other changed content1_content2_missing_content1-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_content2-untracked which local
>> deleted
>> +  other changed content1_content2_missing_content2-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging content1_content2_missing_content4-tracked
>> -  remote changed content1_content2_missing_content4-untracked which local
>> deleted
>> +  other changed content1_content2_missing_content4-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_missing-tracked which local
>> deleted
>> +  other changed content1_content2_missing_missing-tracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  remote changed content1_content2_missing_missing-untracked which local
>> deleted
>> +  other changed content1_content2_missing_missing-untracked which local
>> deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>> -  local changed content1_missing_content1_content4-tracked which remote
>> deleted
>> +  local changed content1_missing_content1_content4-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  local changed content1_missing_content3_content3-tracked which remote
>> deleted
>> +  local changed content1_missing_content3_content3-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  local changed content1_missing_content3_content4-tracked which remote
>> deleted
>> +  local changed content1_missing_content3_content4-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>> -  local changed content1_missing_missing_content4-tracked which remote
>> deleted
>> +  local changed content1_missing_missing_content4-tracked which other
>> deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>>    merging missing_content2_content2_content4-tracked
>>    merging missing_content2_content3_content3-tracked
>> diff --git a/tests/test-merge-remove.t b/tests/test-merge-remove.t
>> --- a/tests/test-merge-remove.t
>> +++ b/tests/test-merge-remove.t
>> @@ -102,7 +102,7 @@
>>  Those who use force will lose
>>
>>    $ hg merge -f
>> -  remote changed bar which local deleted
>> +  other changed bar which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>    merging foo1 and foo to foo1
>>    0 files updated, 1 files merged, 0 files removed, 1 files unresolved
>> diff --git a/tests/test-merge-types.t b/tests/test-merge-types.t
>> --- a/tests/test-merge-types.t
>> +++ b/tests/test-merge-types.t
>> @@ -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"
>> diff --git a/tests/test-rebase-newancestor.t
>> b/tests/test-rebase-newancestor.t
>> --- a/tests/test-rebase-newancestor.t
>> +++ b/tests/test-rebase-newancestor.t
>> @@ -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
>> +  other [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
>> +  other [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)
>> diff --git a/tests/test-rename-merge2.t b/tests/test-rename-merge2.t
>> --- a/tests/test-rename-merge2.t
>> +++ b/tests/test-rename-merge2.t
>> @@ -694,7 +694,7 @@
>>    starting 4 threads for background file closing (?)
>>     a: prompt deleted/changed -> m (premerge)
>>    picked tool ':prompt' for a (binary False symlink False changedelete
>> True)
>> -  remote changed a which local deleted
>> +  other changed a which local deleted
>>    use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
>>     b: both created -> m (premerge)
>>    picked tool 'python ../merge' for b (binary False symlink False
>> changedelete False)
>> @@ -739,7 +739,7 @@
>>    starting 4 threads for background file closing (?)
>>     a: prompt changed/deleted -> m (premerge)
>>    picked tool ':prompt' for a (binary False symlink False changedelete
>> True)
>> -  local changed a which remote deleted
>> +  local changed a which other deleted
>>    use (c)hanged version, (d)elete, or leave (u)nresolved? u
>>     b: both created -> m (premerge)
>>    picked tool 'python ../merge' for b (binary False symlink False
>> changedelete False)
>> diff --git a/tests/test-subrepo-missing.t b/tests/test-subrepo-missing.t
>> --- a/tests/test-subrepo-missing.t
>> +++ b/tests/test-subrepo-missing.t
>> @@ -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
>> +  other [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
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel@mercurial-scm.org
>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Simon Farnsworth - March 20, 2016, 5:52 p.m.
Switching back to inline replies. Quoting below will be a bit messed up.

On 19/03/2016 21:53, timeless wrote:
> As long as it's possible for things to be written to the disk
> consistently using "untranslated" messages, and shown w/ eventual
> translations, and we have to maintain a table of all these constants
> forever -- so that future translators will always translate them even
> if we eventually replace the strings (because the disk versions will
> persists forever).
I've fixed up locally to translate "local" and "other", avoiding a 
regression in translations. We currently show the raw (untranslated) 
labels to the user in conflict markers; I'm writing the same form of the 
string that's used for conflict markers to disk.

I'm not clear on how you'd expect the translation system to handle 
labels, given their use in conflict markers (see _formatlabels in 
filemerge.py). Would you mind writing a sample patch?
> On Sat, Mar 19, 2016 at 11:52 PM, Simon Farnsworth <simonfar@fb.com> wrote:
>> Good point. I think that I might make translations a little worse in this
>> version, as 'local' and 'other' will not be translated.
>>
>> I can fix this in a V2, but I'm not sure what happens with the labels -
>> they're already exposed to users, so should be translated.
>>
>> Sent from Mobile
>>
>>
<snip>
timeless - March 20, 2016, 11:45 p.m.
Simon Farnsworth wrote:
> I've fixed up locally to translate "local" and "other", avoiding a
> regression in translations. We currently show the raw (untranslated) labels
> to the user in conflict markers; I'm writing the same form of the string
> that's used for conflict markers to disk.

As long as we write to disk untranslated (not just "local" and
"other", but whatever enhanced labels we'll have) and give the
translators a chance to translate what we read from disk, I'm happy.

> I'm not clear on how you'd expect the translation system to handle labels,
> given their use in conflict markers (see _formatlabels in filemerge.py).
> Would you mind writing a sample patch?

[I imagine] Labels are a disaster I haven't spent any time investigating :(

It's theoretically on my list of things to look at, but nowhere near the top.
Pierre-Yves David - March 21, 2016, 12:24 a.m.
On 03/20/2016 04:45 PM, timeless wrote:
> Simon Farnsworth wrote:
>> I've fixed up locally to translate "local" and "other", avoiding a
>> regression in translations. We currently show the raw (untranslated) labels
>> to the user in conflict markers; I'm writing the same form of the string
>> that's used for conflict markers to disk.
>
> As long as we write to disk untranslated (not just "local" and
> "other", but whatever enhanced labels we'll have) and give the
> translators a chance to translate what we read from disk, I'm happy.

+1 for writing on disk untranslated. For the translation part, I'm not 
sure if we want to have that translated at all because these 
(local/other/dest/base) are keyword used as is in the Mercurial command 
line API.

As they are currently untranslated I would prefer the simon series to 
not change this and a later series to revisit this independently if we 
wants it.

Cheers,
Simon Farnsworth - March 21, 2016, 12:31 a.m.
On 20/03/2016 17:24, Pierre-Yves David wrote:
> On 03/20/2016 04:45 PM, timeless wrote:
>> Simon Farnsworth wrote:
>>> I've fixed up locally to translate "local" and "other", avoiding a
>>> regression in translations. We currently show the raw (untranslated)
>>> labels
>>> to the user in conflict markers; I'm writing the same form of the string
>>> that's used for conflict markers to disk.
>>
>> As long as we write to disk untranslated (not just "local" and
>> "other", but whatever enhanced labels we'll have) and give the
>> translators a chance to translate what we read from disk, I'm happy.
>
> +1 for writing on disk untranslated. For the translation part, I'm not
> sure if we want to have that translated at all because these
> (local/other/dest/base) are keyword used as is in the Mercurial command
> line API.
>
v2 writes out untranslated, translates "other" and "local", but leaves 
the label untranslated.

I would expect a future patch to keep the labels untranslated until the 
moment of display, so that we can improve translations from release to 
release.

> As they are currently untranslated I would prefer the simon series to
> not change this and a later series to revisit this independently if we
> wants it.
>
> Cheers,
>

Patch

diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
--- a/mercurial/filemerge.py
+++ b/mercurial/filemerge.py
@@ -229,50 +229,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 or the other version to keep as
     the merged version."""
     ui = repo.ui
     fd = fcd.path()

+    prompts = partnames(labels)
+    prompts['fd'] = fd
     try:
         if fco.isabsent():
             index = ui.promptchoice(
-                _("local changed %s which remote deleted\n"
+                _("%(local)s changed %(fd)s which %(other)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"
+                _("%(other)s changed %(fd)s which %(local)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 %(localact)s, take %(otheract)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 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 version of files as the merged version."""
     if fco.isabsent():
         # local changed, remote deleted -- 'deleted' picked
@@ -284,7 +290,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
@@ -536,6 +542,25 @@ 
         newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2], pad))
     return newlabels

+def partnames(labels):
+    """Return a dictionary of merge part names for use in prompts to the user
+
+    These names include labels if supplied"""
+    if labels is None:
+        return {
+            "local": "local",
+            "other": "other",
+            "localact": "(l)ocal",
+            "otheract": "(o)ther",
+        }
+
+    return {
+        "local": "local [%s]" % labels[0],
+            "other": "other [%s]" % labels[1],
+            "localact": "(l)ocal [%s]" % labels[0],
+            "otheract": "(o)ther [%s]" % labels[1],
+    }
+
 def _filemerge(premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
     """perform a 3-way merge in the working directory

@@ -587,7 +612,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:
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1537,11 +1537,13 @@ 
         if '.hgsubstate' in actionbyfile:
             f = '.hgsubstate'
             m, args, msg = actionbyfile[f]
+            prompts = filemerge.partnames(labels)
+            prompts['f'] = f
             if m == 'cd':
                 if repo.ui.promptchoice(
-                    _("local changed %s which remote deleted\n"
+                    _("%(local)s changed %(f)s which %(other)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")
@@ -1551,9 +1553,9 @@ 
                 f1, f2, fa, move, anc = args
                 flags = p2[f2].flags()
                 if repo.ui.promptchoice(
-                    _("remote changed %s which local deleted\n"
+                    _("%(other)s changed %(f)s which %(local)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]
diff --git a/tests/failfilemerge.py b/tests/failfilemerge.py
--- a/tests/failfilemerge.py
+++ b/tests/failfilemerge.py
@@ -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)

diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
--- a/tests/test-commit-amend.t
+++ b/tests/test-commit-amend.t
@@ -813,7 +813,7 @@ 
   $ hg merge -q bar --config ui.interactive=True << EOF
   > c
   > EOF
-  local changed aa which remote deleted
+  local changed aa which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? c
   $ hg ci -m 'merge bar (with conflicts)'
   $ hg log --config diff.git=1 -pr .
diff --git a/tests/test-copy-move-merge.t b/tests/test-copy-move-merge.t
--- a/tests/test-copy-move-merge.t
+++ b/tests/test-copy-move-merge.t
@@ -85,7 +85,7 @@ 
   > c
   > EOF
   rebasing 2:add3f11052fa "other" (tip)
-  remote changed a which local deleted
+  other [source] changed a which local [dest] deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c

   $ cat b
diff --git a/tests/test-largefiles-update.t b/tests/test-largefiles-update.t
--- a/tests/test-largefiles-update.t
+++ b/tests/test-largefiles-update.t
@@ -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 other [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]'
diff --git a/tests/test-merge-changedelete.t b/tests/test-merge-changedelete.t
--- a/tests/test-merge-changedelete.t
+++ b/tests/test-merge-changedelete.t
@@ -54,9 +54,9 @@ 
 Non-interactive merge:

   $ hg merge -y
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging file3
   warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
@@ -117,9 +117,9 @@ 
   > c
   > d
   > EOF
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? c
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
   merging file3
   warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
@@ -181,18 +181,18 @@ 
   > baz
   > c
   > EOF
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? foo
   unrecognized response
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? bar
   unrecognized response
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? d
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? baz
   unrecognized response
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
   merging file3
   warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
@@ -250,9 +250,9 @@ 
   $ hg merge --config ui.interactive=true <<EOF
   > d
   > EOF
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? d
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
   merging file3
   warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
@@ -445,9 +445,9 @@ 
   1 other heads for branch "default"

   $ hg merge --config ui.interactive=True --tool :prompt
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
   no tool found to merge file3
   keep (l)ocal, take (o)ther, or leave (u)nresolved?
@@ -501,9 +501,9 @@ 
   1 other heads for branch "default"

   $ hg merge --tool :prompt
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   no tool found to merge file3
   keep (l)ocal, take (o)ther, or leave (u)nresolved? u
@@ -555,9 +555,9 @@ 
   1 other heads for branch "default"

   $ hg merge --tool :merge3
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging file3
   warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
@@ -642,9 +642,9 @@ 
   (status identical)

   === :other -> :prompt ===
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
   no tool found to merge file3
   keep (l)ocal, take (o)ther, or leave (u)nresolved?
@@ -671,9 +671,9 @@ 
   (status identical)

   === :local -> :prompt ===
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
   no tool found to merge file3
   keep (l)ocal, take (o)ther, or leave (u)nresolved?
@@ -690,9 +690,9 @@ 
   (status identical)

   === :fail -> :prompt ===
-  local changed file1 which remote deleted
+  local changed file1 which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other changed file2 which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
   no tool found to merge file3
   keep (l)ocal, take (o)ther, or leave (u)nresolved?
@@ -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 other [destination] deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  remote changed file2 which local deleted
+  other [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 other [destination] deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other [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 other [destination] deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  remote changed file2 which local deleted
+  other [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 other [destination] deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other [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 other [destination] deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other [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 other [destination] deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved?
-  remote changed file2 which local deleted
+  other [destination] changed file2 which local [working copy] deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
   --- diff of status ---
   (status identical)
diff --git a/tests/test-merge-force.t b/tests/test-merge-force.t
--- a/tests/test-merge-force.t
+++ b/tests/test-merge-force.t
@@ -142,55 +142,55 @@ 
 #   in the same way, so it could potentially be left alone

   $ hg merge -f --tool internal:merge3 'desc("remote")' 2>&1 | tee $TESTTMP/merge-output-1
-  local changed content1_missing_content1_content4-tracked which remote deleted
+  local changed content1_missing_content1_content4-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  local changed content1_missing_content3_content3-tracked which remote deleted
+  local changed content1_missing_content3_content3-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  local changed content1_missing_content3_content4-tracked which remote deleted
+  local changed content1_missing_content3_content4-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  local changed content1_missing_missing_content4-tracked which remote deleted
+  local changed content1_missing_missing_content4-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  remote changed content1_content2_content1_content1-untracked which local deleted
+  other changed content1_content2_content1_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_content2-untracked which local deleted
+  other changed content1_content2_content1_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_content4-untracked which local deleted
+  other changed content1_content2_content1_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_missing-tracked which local deleted
+  other changed content1_content2_content1_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_missing-untracked which local deleted
+  other changed content1_content2_content1_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_content1-untracked which local deleted
+  other changed content1_content2_content2_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_content2-untracked which local deleted
+  other changed content1_content2_content2_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_content4-untracked which local deleted
+  other changed content1_content2_content2_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_missing-tracked which local deleted
+  other changed content1_content2_content2_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_missing-untracked which local deleted
+  other changed content1_content2_content2_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_content1-untracked which local deleted
+  other changed content1_content2_content3_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_content2-untracked which local deleted
+  other changed content1_content2_content3_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_content3-untracked which local deleted
+  other changed content1_content2_content3_content3-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_content4-untracked which local deleted
+  other changed content1_content2_content3_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_missing-tracked which local deleted
+  other changed content1_content2_content3_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_missing-untracked which local deleted
+  other changed content1_content2_content3_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_content1-untracked which local deleted
+  other changed content1_content2_missing_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_content2-untracked which local deleted
+  other changed content1_content2_missing_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_content4-untracked which local deleted
+  other changed content1_content2_missing_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_missing-tracked which local deleted
+  other changed content1_content2_missing_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_missing-untracked which local deleted
+  other changed content1_content2_missing_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content1_content4-tracked
   merging content1_content2_content2_content1-tracked
@@ -703,63 +703,63 @@ 
   (no more unresolved files)
   $ hg resolve --unmark --all
   $ hg resolve --all --tool internal:merge3
-  remote changed content1_content2_content1_content1-untracked which local deleted
+  other changed content1_content2_content1_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_content2-untracked which local deleted
+  other changed content1_content2_content1_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content1_content4-tracked
-  remote changed content1_content2_content1_content4-untracked which local deleted
+  other changed content1_content2_content1_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_missing-tracked which local deleted
+  other changed content1_content2_content1_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content1_missing-untracked which local deleted
+  other changed content1_content2_content1_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content2_content1-tracked
-  remote changed content1_content2_content2_content1-untracked which local deleted
+  other changed content1_content2_content2_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_content2-untracked which local deleted
+  other changed content1_content2_content2_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content2_content4-tracked
-  remote changed content1_content2_content2_content4-untracked which local deleted
+  other changed content1_content2_content2_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_missing-tracked which local deleted
+  other changed content1_content2_content2_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content2_missing-untracked which local deleted
+  other changed content1_content2_content2_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content3_content1-tracked
-  remote changed content1_content2_content3_content1-untracked which local deleted
+  other changed content1_content2_content3_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_content2-untracked which local deleted
+  other changed content1_content2_content3_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content3_content3-tracked
-  remote changed content1_content2_content3_content3-untracked which local deleted
+  other changed content1_content2_content3_content3-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_content3_content4-tracked
-  remote changed content1_content2_content3_content4-untracked which local deleted
+  other changed content1_content2_content3_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_missing-tracked which local deleted
+  other changed content1_content2_content3_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_content3_missing-untracked which local deleted
+  other changed content1_content2_content3_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_missing_content1-tracked
-  remote changed content1_content2_missing_content1-untracked which local deleted
+  other changed content1_content2_missing_content1-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_content2-untracked which local deleted
+  other changed content1_content2_missing_content2-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging content1_content2_missing_content4-tracked
-  remote changed content1_content2_missing_content4-untracked which local deleted
+  other changed content1_content2_missing_content4-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_missing-tracked which local deleted
+  other changed content1_content2_missing_missing-tracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  remote changed content1_content2_missing_missing-untracked which local deleted
+  other changed content1_content2_missing_missing-untracked which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
-  local changed content1_missing_content1_content4-tracked which remote deleted
+  local changed content1_missing_content1_content4-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  local changed content1_missing_content3_content3-tracked which remote deleted
+  local changed content1_missing_content3_content3-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  local changed content1_missing_content3_content4-tracked which remote deleted
+  local changed content1_missing_content3_content4-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  local changed content1_missing_missing_content4-tracked which remote deleted
+  local changed content1_missing_missing_content4-tracked which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
   merging missing_content2_content2_content4-tracked
   merging missing_content2_content3_content3-tracked
diff --git a/tests/test-merge-remove.t b/tests/test-merge-remove.t
--- a/tests/test-merge-remove.t
+++ b/tests/test-merge-remove.t
@@ -102,7 +102,7 @@ 
 Those who use force will lose

   $ hg merge -f
-  remote changed bar which local deleted
+  other changed bar which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
   merging foo1 and foo to foo1
   0 files updated, 1 files merged, 0 files removed, 1 files unresolved
diff --git a/tests/test-merge-types.t b/tests/test-merge-types.t
--- a/tests/test-merge-types.t
+++ b/tests/test-merge-types.t
@@ -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"
diff --git a/tests/test-rebase-newancestor.t b/tests/test-rebase-newancestor.t
--- a/tests/test-rebase-newancestor.t
+++ b/tests/test-rebase-newancestor.t
@@ -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
+  other [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
+  other [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)
diff --git a/tests/test-rename-merge2.t b/tests/test-rename-merge2.t
--- a/tests/test-rename-merge2.t
+++ b/tests/test-rename-merge2.t
@@ -694,7 +694,7 @@ 
   starting 4 threads for background file closing (?)
    a: prompt deleted/changed -> m (premerge)
   picked tool ':prompt' for a (binary False symlink False changedelete True)
-  remote changed a which local deleted
+  other changed a which local deleted
   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
    b: both created -> m (premerge)
   picked tool 'python ../merge' for b (binary False symlink False changedelete False)
@@ -739,7 +739,7 @@ 
   starting 4 threads for background file closing (?)
    a: prompt changed/deleted -> m (premerge)
   picked tool ':prompt' for a (binary False symlink False changedelete True)
-  local changed a which remote deleted
+  local changed a which other deleted
   use (c)hanged version, (d)elete, or leave (u)nresolved? u
    b: both created -> m (premerge)
   picked tool 'python ../merge' for b (binary False symlink False changedelete False)
diff --git a/tests/test-subrepo-missing.t b/tests/test-subrepo-missing.t
--- a/tests/test-subrepo-missing.t
+++ b/tests/test-subrepo-missing.t
@@ -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
+  other [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