hgext/extdiff.py
changeset 45126 48c38018bd77
parent 44867 8e8fd938ca07
child 45127 da2e69a278df
--- a/hgext/extdiff.py	Mon Jun 01 09:55:31 2020 +0200
+++ b/hgext/extdiff.py	Tue Jul 07 12:42:39 2020 +0530
@@ -350,6 +350,38 @@
                 proc.wait()
 
 
+def diffpatch(ui, repo, node1a, node2, tmproot, matcher, cmdline, do3way):
+    template = b'hg-%h.patch'
+    with formatter.nullformatter(ui, b'extdiff', {}) as fm:
+        cmdutil.export(
+            repo,
+            [repo[node1a].rev(), repo[node2].rev()],
+            fm,
+            fntemplate=repo.vfs.reljoin(tmproot, template),
+            match=matcher,
+        )
+    label1a = cmdutil.makefilename(repo[node1a], template)
+    label2 = cmdutil.makefilename(repo[node2], template)
+    dir1a = repo.vfs.reljoin(tmproot, label1a)
+    dir2 = repo.vfs.reljoin(tmproot, label2)
+    dir1b = None
+    label1b = None
+    cmdline = formatcmdline(
+        cmdline,
+        repo.root,
+        do3way=do3way,
+        parent1=dir1a,
+        plabel1=label1a,
+        parent2=dir1b,
+        plabel2=label1b,
+        child=dir2,
+        clabel=label2,
+    )
+    ui.debug(b'running %r in %s\n' % (pycompat.bytestr(cmdline), tmproot))
+    ui.system(cmdline, cwd=tmproot, blockedtag=b'extdiff')
+    return 1
+
+
 def dodiff(ui, repo, cmdline, pats, opts, guitool=False):
     '''Do the actual diff:
 
@@ -416,80 +448,65 @@
 
     tmproot = pycompat.mkdtemp(prefix=b'extdiff.')
     try:
-        if not opts.get(b'patch'):
-            # Always make a copy of node1a (and node1b, if applicable)
-            dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a)
-            dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot, subrepos)[
+        if opts.get(b'patch'):
+            return diffpatch(
+                ui, repo, node1a, node2, tmproot, matcher, cmdline, do3way
+            )
+
+        # Always make a copy of node1a (and node1b, if applicable)
+        dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a)
+        dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot, subrepos)[0]
+        rev1a = b'@%d' % repo[node1a].rev()
+        if do3way:
+            dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b)
+            dir1b = snapshot(ui, repo, dir1b_files, node1b, tmproot, subrepos)[
                 0
             ]
-            rev1a = b'@%d' % repo[node1a].rev()
-            if do3way:
-                dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b)
-                dir1b = snapshot(
-                    ui, repo, dir1b_files, node1b, tmproot, subrepos
-                )[0]
-                rev1b = b'@%d' % repo[node1b].rev()
-            else:
-                dir1b = None
-                rev1b = b''
-
-            fnsandstat = []
+            rev1b = b'@%d' % repo[node1b].rev()
+        else:
+            dir1b = None
+            rev1b = b''
 
-            # If node2 in not the wc or there is >1 change, copy it
-            dir2root = b''
-            rev2 = b''
-            if node2:
-                dir2 = snapshot(ui, repo, modadd, node2, tmproot, subrepos)[0]
-                rev2 = b'@%d' % repo[node2].rev()
-            elif len(common) > 1:
-                # we only actually need to get the files to copy back to
-                # the working dir in this case (because the other cases
-                # are: diffing 2 revisions or single file -- in which case
-                # the file is already directly passed to the diff tool).
-                dir2, fnsandstat = snapshot(
-                    ui, repo, modadd, None, tmproot, subrepos
-                )
-            else:
-                # This lets the diff tool open the changed file directly
-                dir2 = b''
-                dir2root = repo.root
+        fnsandstat = []
 
-            label1a = rev1a
-            label1b = rev1b
-            label2 = rev2
+        # If node2 in not the wc or there is >1 change, copy it
+        dir2root = b''
+        rev2 = b''
+        if node2:
+            dir2 = snapshot(ui, repo, modadd, node2, tmproot, subrepos)[0]
+            rev2 = b'@%d' % repo[node2].rev()
+        elif len(common) > 1:
+            # we only actually need to get the files to copy back to
+            # the working dir in this case (because the other cases
+            # are: diffing 2 revisions or single file -- in which case
+            # the file is already directly passed to the diff tool).
+            dir2, fnsandstat = snapshot(
+                ui, repo, modadd, None, tmproot, subrepos
+            )
+        else:
+            # This lets the diff tool open the changed file directly
+            dir2 = b''
+            dir2root = repo.root
 
-            # If only one change, diff the files instead of the directories
-            # Handle bogus modifies correctly by checking if the files exist
-            if len(common) == 1:
-                common_file = util.localpath(common.pop())
-                dir1a = os.path.join(tmproot, dir1a, common_file)
-                label1a = common_file + rev1a
-                if not os.path.isfile(dir1a):
-                    dir1a = pycompat.osdevnull
-                if do3way:
-                    dir1b = os.path.join(tmproot, dir1b, common_file)
-                    label1b = common_file + rev1b
-                    if not os.path.isfile(dir1b):
-                        dir1b = pycompat.osdevnull
-                dir2 = os.path.join(dir2root, dir2, common_file)
-                label2 = common_file + rev2
-        else:
-            template = b'hg-%h.patch'
-            with formatter.nullformatter(ui, b'extdiff', {}) as fm:
-                cmdutil.export(
-                    repo,
-                    [repo[node1a].rev(), repo[node2].rev()],
-                    fm,
-                    fntemplate=repo.vfs.reljoin(tmproot, template),
-                    match=matcher,
-                )
-            label1a = cmdutil.makefilename(repo[node1a], template)
-            label2 = cmdutil.makefilename(repo[node2], template)
-            dir1a = repo.vfs.reljoin(tmproot, label1a)
-            dir2 = repo.vfs.reljoin(tmproot, label2)
-            dir1b = None
-            label1b = None
-            fnsandstat = []
+        label1a = rev1a
+        label1b = rev1b
+        label2 = rev2
+
+        # If only one change, diff the files instead of the directories
+        # Handle bogus modifies correctly by checking if the files exist
+        if len(common) == 1:
+            common_file = util.localpath(common.pop())
+            dir1a = os.path.join(tmproot, dir1a, common_file)
+            label1a = common_file + rev1a
+            if not os.path.isfile(dir1a):
+                dir1a = pycompat.osdevnull
+            if do3way:
+                dir1b = os.path.join(tmproot, dir1b, common_file)
+                label1b = common_file + rev1b
+                if not os.path.isfile(dir1b):
+                    dir1b = pycompat.osdevnull
+            dir2 = os.path.join(dir2root, dir2, common_file)
+            label2 = common_file + rev2
 
         if not perfile:
             # Run the external tool on the 2 temp directories or the patches