[PATCH 1 of 2] resolve: move resolve in cmdutil

Laurent Charignon lcharignon at fb.com
Thu Dec 3 00:41:43 UTC 2015


# HG changeset patch
# User Laurent Charignon <lcharignon at fb.com>
# Date 1449103124 28800
#      Wed Dec 02 16:38:44 2015 -0800
# Node ID 8d5a092b64d9ddb7f6481bfe16aaeb6a7dab5951
# Parent  91905c0c47377520eebdedcfa6bcb73b77e24e0c
resolve: move resolve in cmdutil

Having resolve in cmdutil makes it easier to call it outside the commands
module. This patch moves all the code from resolve from commands to cmdutil.

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -2310,6 +2310,165 @@ def forget(ui, repo, match, prefix, expl
     forgot.extend(f for f in forget if f not in rejected)
     return bad, forgot
 
+def resolve(ui, repo, *pats, **opts):
+    import merge as mergemod
+    all, mark, unmark, show, nostatus = \
+        [opts.get(o) for o in 'all mark unmark list no_status'.split()]
+
+    if (show and (mark or unmark)) or (mark and unmark):
+        raise error.Abort(_("too many options specified"))
+    if pats and all:
+        raise error.Abort(_("can't specify --all and patterns"))
+    if not (all or pats or show or mark or unmark):
+        raise error.Abort(_('no files or directories specified'),
+                         hint=('use --all to re-merge all unresolved files'))
+
+    if show:
+        fm = ui.formatter('resolve', opts)
+        ms = mergemod.mergestate.read(repo)
+        m = scmutil.match(repo[None], pats, opts)
+        for f in ms:
+            if not m(f):
+                continue
+            l = 'resolve.' + {'u': 'unresolved', 'r': 'resolved',
+                              'd': 'driverresolved'}[ms[f]]
+            fm.startitem()
+            fm.condwrite(not nostatus, 'status', '%s ', ms[f].upper(), label=l)
+            fm.write('path', '%s\n', f, label=l)
+        fm.end()
+        return 0
+
+    wlock = repo.wlock()
+    try:
+        ms = mergemod.mergestate.read(repo)
+
+        if not (ms.active() or repo.dirstate.p2() != nullid):
+            raise error.Abort(
+                _('resolve command not applicable when not merging'))
+
+        wctx = repo[None]
+
+        if ms.mergedriver and ms.mdstate() == 'u':
+            proceed = mergemod.driverpreprocess(repo, ms, wctx)
+            ms.commit()
+            # allow mark and unmark to go through
+            if not mark and not unmark and not proceed:
+                return 1
+
+        m = scmutil.match(wctx, pats, opts)
+        ret = 0
+        didwork = False
+        runconclude = False
+
+        tocomplete = []
+        for f in ms:
+            if not m(f):
+                continue
+
+            didwork = True
+
+            # don't let driver-resolved files be marked, and run the conclude
+            # step if asked to resolve
+            if ms[f] == "d":
+                exact = m.exact(f)
+                if mark:
+                    if exact:
+                        ui.warn(_('not marking %s as it is driver-resolved\n')
+                                % f)
+                elif unmark:
+                    if exact:
+                        ui.warn(_('not unmarking %s as it is driver-resolved\n')
+                                % f)
+                else:
+                    runconclude = True
+                continue
+
+            if mark:
+                ms.mark(f, "r")
+            elif unmark:
+                ms.mark(f, "u")
+            else:
+                # backup pre-resolve (merge uses .orig for its own purposes)
+                a = repo.wjoin(f)
+                try:
+                    util.copyfile(a, a + ".resolve")
+                except (IOError, OSError) as inst:
+                    if inst.errno != errno.ENOENT:
+                        raise
+
+                try:
+                    # preresolve file
+                    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                                 'resolve')
+                    complete, r = ms.preresolve(f, wctx)
+                    if not complete:
+                        tocomplete.append(f)
+                    elif r:
+                        ret = 1
+                finally:
+                    ui.setconfig('ui', 'forcemerge', '', 'resolve')
+                    ms.commit()
+
+                # replace filemerge's .orig file with our resolve file, but only
+                # for merges that are complete
+                if complete:
+                    try:
+                        util.rename(a + ".resolve", origpath(ui, repo, a))
+                    except OSError as inst:
+                        if inst.errno != errno.ENOENT:
+                            raise
+
+        for f in tocomplete:
+            try:
+                # resolve file
+                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                             'resolve')
+                r = ms.resolve(f, wctx)
+                if r:
+                    ret = 1
+            finally:
+                ui.setconfig('ui', 'forcemerge', '', 'resolve')
+                ms.commit()
+
+            # replace filemerge's .orig file with our resolve file
+            a = repo.wjoin(f)
+            try:
+                util.rename(a + ".resolve", origpath(ui, repo, a))
+            except OSError as inst:
+                if inst.errno != errno.ENOENT:
+                    raise
+
+        ms.commit()
+        ms.recordactions()
+
+        if not didwork and pats:
+            ui.warn(_("arguments do not match paths that need resolving\n"))
+        elif ms.mergedriver and ms.mdstate() != 's':
+            # run conclude step when either a driver-resolved file is requested
+            # or there are no driver-resolved files
+            # we can't use 'ret' to determine whether any files are unresolved
+            # because we might not have tried to resolve some
+            if ((runconclude or not list(ms.driverresolved()))
+                and not list(ms.unresolved())):
+                proceed = mergemod.driverconclude(repo, ms, wctx)
+                ms.commit()
+                if not proceed:
+                    return 1
+
+    finally:
+        wlock.release()
+
+    # Nudge users into finishing an unfinished operation
+    unresolvedf = list(ms.unresolved())
+    driverresolvedf = list(ms.driverresolved())
+    if not unresolvedf and not driverresolvedf:
+        ui.status(_('(no more unresolved files)\n'))
+    elif not unresolvedf:
+        ui.status(_('(no more unresolved files -- '
+                    'run "hg resolve --all" to conclude)\n'))
+
+    return ret
+
 def files(ui, ctx, m, fm, fmt, subrepos):
     rev = ctx.rev()
     ret = 1
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5674,164 +5674,7 @@ def resolve(ui, repo, *pats, **opts):
 
     Returns 0 on success, 1 if any files fail a resolve attempt.
     """
-
-    all, mark, unmark, show, nostatus = \
-        [opts.get(o) for o in 'all mark unmark list no_status'.split()]
-
-    if (show and (mark or unmark)) or (mark and unmark):
-        raise error.Abort(_("too many options specified"))
-    if pats and all:
-        raise error.Abort(_("can't specify --all and patterns"))
-    if not (all or pats or show or mark or unmark):
-        raise error.Abort(_('no files or directories specified'),
-                         hint=('use --all to re-merge all unresolved files'))
-
-    if show:
-        fm = ui.formatter('resolve', opts)
-        ms = mergemod.mergestate.read(repo)
-        m = scmutil.match(repo[None], pats, opts)
-        for f in ms:
-            if not m(f):
-                continue
-            l = 'resolve.' + {'u': 'unresolved', 'r': 'resolved',
-                              'd': 'driverresolved'}[ms[f]]
-            fm.startitem()
-            fm.condwrite(not nostatus, 'status', '%s ', ms[f].upper(), label=l)
-            fm.write('path', '%s\n', f, label=l)
-        fm.end()
-        return 0
-
-    wlock = repo.wlock()
-    try:
-        ms = mergemod.mergestate.read(repo)
-
-        if not (ms.active() or repo.dirstate.p2() != nullid):
-            raise error.Abort(
-                _('resolve command not applicable when not merging'))
-
-        wctx = repo[None]
-
-        if ms.mergedriver and ms.mdstate() == 'u':
-            proceed = mergemod.driverpreprocess(repo, ms, wctx)
-            ms.commit()
-            # allow mark and unmark to go through
-            if not mark and not unmark and not proceed:
-                return 1
-
-        m = scmutil.match(wctx, pats, opts)
-        ret = 0
-        didwork = False
-        runconclude = False
-
-        tocomplete = []
-        for f in ms:
-            if not m(f):
-                continue
-
-            didwork = True
-
-            # don't let driver-resolved files be marked, and run the conclude
-            # step if asked to resolve
-            if ms[f] == "d":
-                exact = m.exact(f)
-                if mark:
-                    if exact:
-                        ui.warn(_('not marking %s as it is driver-resolved\n')
-                                % f)
-                elif unmark:
-                    if exact:
-                        ui.warn(_('not unmarking %s as it is driver-resolved\n')
-                                % f)
-                else:
-                    runconclude = True
-                continue
-
-            if mark:
-                ms.mark(f, "r")
-            elif unmark:
-                ms.mark(f, "u")
-            else:
-                # backup pre-resolve (merge uses .orig for its own purposes)
-                a = repo.wjoin(f)
-                try:
-                    util.copyfile(a, a + ".resolve")
-                except (IOError, OSError) as inst:
-                    if inst.errno != errno.ENOENT:
-                        raise
-
-                try:
-                    # preresolve file
-                    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
-                                 'resolve')
-                    complete, r = ms.preresolve(f, wctx)
-                    if not complete:
-                        tocomplete.append(f)
-                    elif r:
-                        ret = 1
-                finally:
-                    ui.setconfig('ui', 'forcemerge', '', 'resolve')
-                    ms.commit()
-
-                # replace filemerge's .orig file with our resolve file, but only
-                # for merges that are complete
-                if complete:
-                    try:
-                        util.rename(a + ".resolve",
-                                    cmdutil.origpath(ui, repo, a))
-                    except OSError as inst:
-                        if inst.errno != errno.ENOENT:
-                            raise
-
-        for f in tocomplete:
-            try:
-                # resolve file
-                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
-                             'resolve')
-                r = ms.resolve(f, wctx)
-                if r:
-                    ret = 1
-            finally:
-                ui.setconfig('ui', 'forcemerge', '', 'resolve')
-                ms.commit()
-
-            # replace filemerge's .orig file with our resolve file
-            a = repo.wjoin(f)
-            try:
-                util.rename(a + ".resolve", cmdutil.origpath(ui, repo, a))
-            except OSError as inst:
-                if inst.errno != errno.ENOENT:
-                    raise
-
-        ms.commit()
-        ms.recordactions()
-
-        if not didwork and pats:
-            ui.warn(_("arguments do not match paths that need resolving\n"))
-        elif ms.mergedriver and ms.mdstate() != 's':
-            # run conclude step when either a driver-resolved file is requested
-            # or there are no driver-resolved files
-            # we can't use 'ret' to determine whether any files are unresolved
-            # because we might not have tried to resolve some
-            if ((runconclude or not list(ms.driverresolved()))
-                and not list(ms.unresolved())):
-                proceed = mergemod.driverconclude(repo, ms, wctx)
-                ms.commit()
-                if not proceed:
-                    return 1
-
-    finally:
-        wlock.release()
-
-    # Nudge users into finishing an unfinished operation
-    unresolvedf = list(ms.unresolved())
-    driverresolvedf = list(ms.driverresolved())
-    if not unresolvedf and not driverresolvedf:
-        ui.status(_('(no more unresolved files)\n'))
-    elif not unresolvedf:
-        ui.status(_('(no more unresolved files -- '
-                    'run "hg resolve --all" to conclude)\n'))
-
-    return ret
+    return cmdutil.resolve(ui, repo, *pats, **opts)
 
 @command('revert',
     [('a', 'all', None, _('revert all changes when no arguments given')),


More information about the Mercurial-devel mailing list