--- a/hgext/extdiff.py Thu Jan 10 15:42:13 2019 +0100
+++ b/hgext/extdiff.py Thu Jan 10 20:22:03 2019 -0800
@@ -152,6 +152,29 @@
fnsandstat.append((dest, repo.wjoin(fn), os.lstat(dest)))
return dirname, fnsandstat
+def formatcmdline(cmdline, repo_root, do3way,
+ parent1, plabel1, parent2, plabel2, child, clabel):
+ # Function to quote file/dir names in the argument string.
+ # When not operating in 3-way mode, an empty string is
+ # returned for parent2
+ replace = {'parent': parent1, 'parent1': parent1, 'parent2': parent2,
+ 'plabel1': plabel1, 'plabel2': plabel2,
+ 'child': child, 'clabel': clabel,
+ 'root': repo_root}
+ def quote(match):
+ pre = match.group(2)
+ key = match.group(3)
+ if not do3way and key == 'parent2':
+ return pre
+ return pre + procutil.shellquote(replace[key])
+
+ # Match parent2 first, so 'parent1?' will match both parent1 and parent
+ regex = (br'''(['"]?)([^\s'"$]*)'''
+ br'\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)\1')
+ if not do3way and not re.search(regex, cmdline):
+ cmdline += ' $parent1 $child'
+ return re.sub(regex, quote, cmdline)
+
def dodiff(ui, repo, cmdline, pats, opts):
'''Do the actual diff:
@@ -281,28 +304,14 @@
label1b = None
fnsandstat = []
- # Function to quote file/dir names in the argument string.
- # When not operating in 3-way mode, an empty string is
- # returned for parent2
- replace = {'parent': dir1a, 'parent1': dir1a, 'parent2': dir1b,
- 'plabel1': label1a, 'plabel2': label1b,
- 'clabel': label2, 'child': dir2,
- 'root': repo.root}
- def quote(match):
- pre = match.group(2)
- key = match.group(3)
- if not do3way and key == 'parent2':
- return pre
- return pre + procutil.shellquote(replace[key])
-
- # Match parent2 first, so 'parent1?' will match both parent1 and parent
- regex = (br'''(['"]?)([^\s'"$]*)'''
- br'\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)\1')
- if not do3way and not re.search(regex, cmdline):
- cmdline += ' $parent1 $child'
- cmdline = re.sub(regex, quote, cmdline)
-
- ui.debug('running %r in %s\n' % (pycompat.bytestr(cmdline), tmproot))
+ # Run the external tool on the 2 temp directories or the patches
+ cmdline = formatcmdline(
+ cmdline, repo.root, do3way=do3way,
+ parent1=dir1a, plabel1=label1a,
+ parent2=dir1b, plabel2=label1b,
+ child=dir2, clabel=label2)
+ ui.debug('running %r in %s\n' % (pycompat.bytestr(cmdline),
+ tmproot))
ui.system(cmdline, cwd=tmproot, blockedtag='extdiff')
for copy_fn, working_fn, st in fnsandstat: