Mercurial > public > mercurial-scm > hg
comparison mercurial/filemerge.py @ 40478:86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
It is a common complaint that a user will be running some operation (histedit,
rebase, evolve, etc.), get into a merge-conflict situation, and not understand
what they are seeing - it is possible that the merge tool is configured to
display the hash, but it's difficult for most merge tools to display a good
snippet of the description.
In the worst case, configuring this template will lead to output that is
immediately covered by a terminal application, maybe the user can hit ctrl-z to
see it. In the common case, the output will be in a terminal window and a GUI
program will start, and it should be possible to view both the terminal and the
GUI program at the same time.
Differential Revision: https://phab.mercurial-scm.org/D5094
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Sat, 13 Oct 2018 07:49:20 -0700 |
parents | bc0eb1dc6aae |
children | 876494fd967d |
comparison
equal
deleted
inserted
replaced
40477:592feb3f88b1 | 40478:86dfae98a3a2 |
---|---|
11 import os | 11 import os |
12 import re | 12 import re |
13 import shutil | 13 import shutil |
14 | 14 |
15 from .i18n import _ | 15 from .i18n import _ |
16 from .node import nullid, short | 16 from .node import ( |
17 hex, | |
18 nullid, | |
19 short, | |
20 ) | |
17 | 21 |
18 from . import ( | 22 from . import ( |
19 encoding, | 23 encoding, |
20 error, | 24 error, |
21 formatter, | 25 formatter, |
25 scmutil, | 29 scmutil, |
26 simplemerge, | 30 simplemerge, |
27 tagmerge, | 31 tagmerge, |
28 templatekw, | 32 templatekw, |
29 templater, | 33 templater, |
34 templateutil, | |
30 util, | 35 util, |
31 ) | 36 ) |
32 | 37 |
33 from .utils import ( | 38 from .utils import ( |
34 procutil, | 39 procutil, |
534 # directory and tell the user how to get it is my best idea, but it's | 539 # directory and tell the user how to get it is my best idea, but it's |
535 # clunky.) | 540 # clunky.) |
536 raise error.InMemoryMergeConflictsError('in-memory merge does not support ' | 541 raise error.InMemoryMergeConflictsError('in-memory merge does not support ' |
537 'external merge tools') | 542 'external merge tools') |
538 | 543 |
544 def _describemerge(ui, repo, mynode, fcl, fcb, fco, env, toolpath, args): | |
545 tmpl = ui.config('ui', 'pre-merge-tool-output-template') | |
546 if not tmpl: | |
547 return | |
548 | |
549 mappingdict = templateutil.mappingdict | |
550 props = {'ctx': fcl.changectx(), | |
551 'node': hex(mynode), | |
552 'path': fcl.path(), | |
553 'local': mappingdict({'ctx': fcl.changectx(), | |
554 'fctx': fcl, | |
555 'node': hex(mynode), | |
556 'name': _('local'), | |
557 'islink': 'l' in fcl.flags(), | |
558 'label': env['HG_MY_LABEL']}), | |
559 'base': mappingdict({'ctx': fcb.changectx(), | |
560 'fctx': fcb, | |
561 'name': _('base'), | |
562 'islink': 'l' in fcb.flags(), | |
563 'label': env['HG_BASE_LABEL']}), | |
564 'other': mappingdict({'ctx': fco.changectx(), | |
565 'fctx': fco, | |
566 'name': _('other'), | |
567 'islink': 'l' in fco.flags(), | |
568 'label': env['HG_OTHER_LABEL']}), | |
569 'toolpath': toolpath, | |
570 'toolargs': args} | |
571 | |
572 # TODO: make all of this something that can be specified on a per-tool basis | |
573 tmpl = templater.unquotestring(tmpl) | |
574 | |
575 # Not using cmdutil.rendertemplate here since it causes errors importing | |
576 # things for us to import cmdutil. | |
577 tres = formatter.templateresources(ui, repo) | |
578 t = formatter.maketemplater(ui, tmpl, defaults=templatekw.keywords, | |
579 resources=tres) | |
580 ui.status(t.renderdefault(props)) | |
581 | |
539 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): | 582 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
540 tool, toolpath, binary, symlink, scriptfn = toolconf | 583 tool, toolpath, binary, symlink, scriptfn = toolconf |
541 if fcd.isabsent() or fco.isabsent(): | 584 if fcd.isabsent() or fco.isabsent(): |
542 repo.ui.warn(_('warning: %s cannot merge change/delete conflict ' | 585 repo.ui.warn(_('warning: %s cannot merge change/delete conflict ' |
543 'for %s\n') % (tool, fcd.path())) | 586 'for %s\n') % (tool, fcd.path())) |
582 repo.ui.status(_('running merge tool %s for file %s\n') % | 625 repo.ui.status(_('running merge tool %s for file %s\n') % |
583 (tool, fcd.path())) | 626 (tool, fcd.path())) |
584 if scriptfn is None: | 627 if scriptfn is None: |
585 cmd = toolpath + ' ' + args | 628 cmd = toolpath + ' ' + args |
586 repo.ui.debug('launching merge tool: %s\n' % cmd) | 629 repo.ui.debug('launching merge tool: %s\n' % cmd) |
630 _describemerge(ui, repo, mynode, fcd, fca, fco, env, toolpath, args) | |
587 r = ui.system(cmd, cwd=repo.root, environ=env, | 631 r = ui.system(cmd, cwd=repo.root, environ=env, |
588 blockedtag='mergetool') | 632 blockedtag='mergetool') |
589 else: | 633 else: |
590 repo.ui.debug('launching python merge script: %s:%s\n' % | 634 repo.ui.debug('launching python merge script: %s:%s\n' % |
591 (toolpath, scriptfn)) | 635 (toolpath, scriptfn)) |