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

login
register
mail settings
Submitter Simon Farnsworth
Date March 20, 2016, 1:29 a.m.
Message ID <10b438b40a8d7da24a2c.1458437380@simonfar-macbookpro.local>
Download mbox | patch
Permalink /patch/13974/
State Accepted
Headers show

Comments

Simon Farnsworth - March 20, 2016, 1:29 a.m.
# 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.
timeless - March 20, 2016, 1:57 a.m.
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
>

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