On its own, it's not useful, but the next commit will add an hgrc
config option to make it mandatory.
There is no short option, as -r almost always means --rev and this
option doesn't seem like it would be so common as to mandate a short
option.
| pulkit |
| hg-reviewers |
On its own, it's not useful, but the next commit will add an hgrc
config option to make it mandatory.
There is no short option, as -r almost always means --rev and this
option doesn't seem like it would be so common as to mandate a short
option.
| Automatic diff as part of commit; lint not applicable. |
| Automatic diff as part of commit; unit tests not applicable. |
Thanks for accepting (some of) my other changes.
I added a couple of simple tests. I could add one for the hint, but I figured it's probably not worth it?
I added a couple of simple tests. I could add one for the hint, but I figured it's probably not worth it?
I *think* each case is worth a test and help us increasing code coverage.
| Path | Packages | |||
|---|---|---|---|---|
| M | mercurial/commands.py (22 lines) | |||
| M | tests/test-completion.t (2 lines) | |||
| M | tests/test-resolve.t (12 lines) |
| Status | Author | Revision | |
|---|---|---|---|
| Closed | valentin.gatienbaron | ||
| Closed | valentin.gatienbaron | ||
| Closed | valentin.gatienbaron |
| with repo.wlock(False): | with repo.wlock(False): | ||||
| return cmdutil.copy(ui, repo, pats, opts, rename=True) | return cmdutil.copy(ui, repo, pats, opts, rename=True) | ||||
| @command('resolve', | @command('resolve', | ||||
| [('a', 'all', None, _('select all unresolved files')), | [('a', 'all', None, _('select all unresolved files')), | ||||
| ('l', 'list', None, _('list state of files needing merge')), | ('l', 'list', None, _('list state of files needing merge')), | ||||
| ('m', 'mark', None, _('mark files as resolved')), | ('m', 'mark', None, _('mark files as resolved')), | ||||
| ('u', 'unmark', None, _('mark files as unresolved')), | ('u', 'unmark', None, _('mark files as unresolved')), | ||||
| ('n', 'no-status', None, _('hide status prefix'))] | ('n', 'no-status', None, _('hide status prefix')), | ||||
| ('', 're-merge', None, _('re-merge files'))] | |||||
| + mergetoolopts + walkopts + formatteropts, | + mergetoolopts + walkopts + formatteropts, | ||||
| _('[OPTION]... [FILE]...'), | _('[OPTION]... [FILE]...'), | ||||
| inferrepo=True) | inferrepo=True) | ||||
| def resolve(ui, repo, *pats, **opts): | def resolve(ui, repo, *pats, **opts): | ||||
| """redo merges or set/view the merge status of files | """redo merges or set/view the merge status of files | ||||
| Merges with unresolved conflicts are often the result of | Merges with unresolved conflicts are often the result of | ||||
| non-interactive merging using the ``internal:merge`` configuration | non-interactive merging using the ``internal:merge`` configuration | ||||
| setting, or a command-line merge tool like ``diff3``. The resolve | setting, or a command-line merge tool like ``diff3``. The resolve | ||||
| command is used to manage the files involved in a merge, after | command is used to manage the files involved in a merge, after | ||||
| :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the | :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the | ||||
| working directory must have two parents). See :hg:`help | working directory must have two parents). See :hg:`help | ||||
| merge-tools` for information on configuring merge tools. | merge-tools` for information on configuring merge tools. | ||||
| The resolve command can be used in the following ways: | The resolve command can be used in the following ways: | ||||
| - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified | - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge | ||||
| files, discarding any previous merge attempts. Re-merging is not | the specified files, discarding any previous merge attempts. Re-merging | ||||
| performed for files already marked as resolved. Use ``--all/-a`` | is not performed for files already marked as resolved. Use ``--all/-a`` | ||||
| to select all unresolved files. ``--tool`` can be used to specify | to select all unresolved files. ``--tool`` can be used to specify | ||||
| the merge tool used for the given files. It overrides the HGMERGE | the merge tool used for the given files. It overrides the HGMERGE | ||||
| environment variable and your configuration files. Previous file | environment variable and your configuration files. Previous file | ||||
| contents are saved with a ``.orig`` suffix. | contents are saved with a ``.orig`` suffix. | ||||
| - :hg:`resolve -m [FILE]`: mark a file as having been resolved | - :hg:`resolve -m [FILE]`: mark a file as having been resolved | ||||
| (e.g. after having manually fixed-up the files). The default is | (e.g. after having manually fixed-up the files). The default is | ||||
| to mark all unresolved files. | to mark all unresolved files. | ||||
| conflicts. You must use :hg:`resolve -m ...` before you can | conflicts. You must use :hg:`resolve -m ...` before you can | ||||
| commit after a conflicting merge. | commit after a conflicting merge. | ||||
| Returns 0 on success, 1 if any files fail a resolve attempt. | Returns 0 on success, 1 if any files fail a resolve attempt. | ||||
| """ | """ | ||||
| opts = pycompat.byteskwargs(opts) | opts = pycompat.byteskwargs(opts) | ||||
| confirm = ui.configbool('commands', 'resolve.confirm') | confirm = ui.configbool('commands', 'resolve.confirm') | ||||
| flaglist = 'all mark unmark list no_status'.split() | flaglist = 'all mark unmark list no_status re_merge'.split() | ||||
| all, mark, unmark, show, nostatus = \ | all, mark, unmark, show, nostatus, remerge = \ | ||||
| [opts.get(o) for o in flaglist] | [opts.get(o) for o in flaglist] | ||||
| if len(list(filter(None, [show, mark, unmark]))) > 1: | if len(list(filter(None, [show, mark, unmark, remerge]))) > 1: | ||||
| raise error.Abort(_("too many options specified")) | raise error.Abort(_("too many options specified")) | ||||
| if pats and all: | if pats and all: | ||||
| raise error.Abort(_("can't specify --all and patterns")) | raise error.Abort(_("can't specify --all and patterns")) | ||||
| if not (all or pats or show or mark or unmark): | if not (all or pats or show or mark or unmark): | ||||
| raise error.Abort(_('no files or directories specified'), | raise error.Abort(_('no files or directories specified'), | ||||
| hint=('use --all to re-merge all unresolved files')) | hint=('use --all to re-merge all unresolved files')) | ||||
| if confirm: | if confirm: | ||||
| if not didwork and pats: | if not didwork and pats: | ||||
| hint = None | hint = None | ||||
| if not any([p for p in pats if p.find(':') >= 0]): | if not any([p for p in pats if p.find(':') >= 0]): | ||||
| pats = ['path:%s' % p for p in pats] | pats = ['path:%s' % p for p in pats] | ||||
| m = scmutil.match(wctx, pats, opts) | m = scmutil.match(wctx, pats, opts) | ||||
| for f in ms: | for f in ms: | ||||
| if not m(f): | if not m(f): | ||||
| continue | continue | ||||
| flags = ''.join(['-%s ' % o[0:1] for o in flaglist | def flag(o): | ||||
| if opts.get(o)]) | if o == 're_merge': | ||||
| return '--re-merge ' | |||||
| return '-%s ' % o[0:1] | |||||
| flags = ''.join([flag(o) for o in flaglist if opts.get(o)]) | |||||
| hint = _("(try: hg resolve %s%s)\n") % ( | hint = _("(try: hg resolve %s%s)\n") % ( | ||||
| flags, | flags, | ||||
| ' '.join(pats)) | ' '.join(pats)) | ||||
| break | break | ||||
| ui.warn(_("arguments do not match paths that need resolving\n")) | ui.warn(_("arguments do not match paths that need resolving\n")) | ||||
| if hint: | if hint: | ||||
| ui.warn(hint) | ui.warn(hint) | ||||
| elif ms.mergedriver and ms.mdstate() != 's': | elif ms.mergedriver and ms.mdstate() != 's': | ||||
| locate: rev, print0, fullpath, include, exclude | locate: rev, print0, fullpath, include, exclude | ||||
| manifest: rev, all, template | manifest: rev, all, template | ||||
| outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos | outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos | ||||
| parents: rev, style, template | parents: rev, style, template | ||||
| paths: template | paths: template | ||||
| phase: public, draft, secret, force, rev | phase: public, draft, secret, force, rev | ||||
| recover: | recover: | ||||
| rename: after, force, include, exclude, dry-run | rename: after, force, include, exclude, dry-run | ||||
| resolve: all, list, mark, unmark, no-status, tool, include, exclude, template | resolve: all, list, mark, unmark, no-status, re-merge, tool, include, exclude, template | ||||
| revert: all, date, rev, no-backup, interactive, include, exclude, dry-run | revert: all, date, rev, no-backup, interactive, include, exclude, dry-run | ||||
| rollback: dry-run, force | rollback: dry-run, force | ||||
| root: | root: | ||||
| tag: force, local, rev, remove, edit, message, date, user | tag: force, local, rev, remove, edit, message, date, user | ||||
| tags: template | tags: template | ||||
| tip: patch, git, style, template | tip: patch, git, style, template | ||||
| unbundle: update | unbundle: update | ||||
| verify: | verify: | ||||
| $ hg resolve -l | $ hg resolve -l | ||||
| U file1 | U file1 | ||||
| U file2 | U file2 | ||||
| $ hg --config commands.resolve.mark-check=none resolve -m | $ hg --config commands.resolve.mark-check=none resolve -m | ||||
| (no more unresolved files) | (no more unresolved files) | ||||
| $ hg resolve -l | $ hg resolve -l | ||||
| R file1 | R file1 | ||||
| R file2 | R file2 | ||||
| Testing the --re-merge flag | |||||
| $ hg resolve --unmark file1 | |||||
| $ hg resolve -l | |||||
| U file1 | |||||
| R file2 | |||||
| $ hg resolve --mark --re-merge | |||||
| abort: too many options specified | |||||
| [255] | |||||
| $ hg resolve --re-merge --all | |||||
| merging file1 | |||||
| warning: conflicts while merging file1! (edit, then use 'hg resolve --mark') | |||||
| [1] | |||||
| $ cd .. | $ cd .. | ||||
| ====================================================== | ====================================================== | ||||
| Test 'hg resolve' confirm config option functionality | | Test 'hg resolve' confirm config option functionality | | ||||
| ====================================================== | ====================================================== | ||||
| $ cat >> $HGRCPATH << EOF | $ cat >> $HGRCPATH << EOF | ||||
| > [extensions] | > [extensions] | ||||