Hi all,<br><br>The patch below allows that any changes done while doing an external diff are propagated back to the working directory... I haven&#39;t been able to run the tests (too much time to make it work in windows), so, if someone applies it, it would be nice if a unit-test could be added to check it too.
<br><br>The patch was generated against <a class="http" href="http://selenic.com/repo/hg">http://selenic.com/repo/hg</a><br><br>Cheers,<br><br>Fabio<br><br># HG changeset patch<br># User Fabio Zadrozny &lt;fabiofz at gmail dot com&gt;
<br># Date 1188174678 10800<br># Node ID b4ea50e512e7c170a2309fb195dd5bd310b0eae0<br># Parent&nbsp; bbdcdc7f170ed71911496f64e52554c030fe8a34<br>Propagating changes back to working dirs when changing files in external diff tool.
<br><br>diff -r bbdcdc7f170e -r b4ea50e512e7 hgext/extdiff.py<br>--- a/hgext/extdiff.py&nbsp;&nbsp;&nbsp; Mon Aug 20 21:10:45 2007 -0500<br>+++ b/hgext/extdiff.py&nbsp;&nbsp;&nbsp; Sun Aug 26 21:31:18 2007 -0300<br>@@ -84,13 +84,18 @@ def snapshot_wdir(ui, repo, files, tmpro
<br>&nbsp;&nbsp;&nbsp;&nbsp; &#39;&#39;&#39;snapshot files from working directory.<br>&nbsp;&nbsp;&nbsp;&nbsp; if not using snapshot, -I/-X does not work and recursive diff<br>&nbsp;&nbsp;&nbsp;&nbsp; in tools like kdiff3 and meld displays too many files.&#39;&#39;&#39;<br>-&nbsp;&nbsp;&nbsp; dirname = 
os.path.basename(repo.root)<br>+&nbsp;&nbsp;&nbsp; repo_root = repo.root<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; dirname = os.path.basename(repo_root)<br>&nbsp;&nbsp;&nbsp;&nbsp; if dirname == &quot;&quot;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dirname = &quot;root&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp; base = os.path.join(tmproot, dirname)
<br>&nbsp;&nbsp;&nbsp;&nbsp; os.mkdir(base)<br>&nbsp;&nbsp;&nbsp;&nbsp; ui.note(_(&#39;making snapshot of %d files from working dir\n&#39;) %<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (len(files)))<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; fns_and_mtime = []<br>+&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; for fn in files:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wfn = util.pconvert
(fn)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ui.note(&#39;&nbsp; %s\n&#39; % wfn)<br>@@ -98,13 +103,27 @@ def snapshot_wdir(ui, repo, files, tmpro<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destdir = os.path.dirname(dest)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not os.path.isdir(destdir):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.makedirs
(destdir)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp = open(dest, &#39;wb&#39;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for chunk in util.filechunkiter(repo.wopener(wfn)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp.write(chunk)<br>-&nbsp;&nbsp;&nbsp; return dirname<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp.close()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fns_and_mtime.append((dest, os.path.join(repo_root, fn), <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.path.getmtime(dest)))<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; return dirname, fns_and_mtime<br>&nbsp;<br>&nbsp;<br>&nbsp;def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
<br>+&nbsp;&nbsp;&nbsp; &#39;&#39;&#39;Do the actuall diff:<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; - copy to a temp structure if diffing 2 internal revisions<br>+&nbsp;&nbsp;&nbsp; - copy to a temp structure if diffing working revision with <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; another one and more than 1 file is changed
<br>+&nbsp;&nbsp;&nbsp; - just invoke the diff for a single file in the working dir<br>+&nbsp;&nbsp;&nbsp; &#39;&#39;&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp; node1, node2 = cmdutil.revpair(repo, opts[&#39;rev&#39;])<br>&nbsp;&nbsp;&nbsp;&nbsp; files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
<br>&nbsp;&nbsp;&nbsp;&nbsp; modified, added, removed, deleted, unknown = repo.status(<br>@@ -119,11 +138,17 @@ def dodiff(ui, repo, diffcmd, diffopts, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; changes = len(modified) + len(removed) + len(added)
<br>&nbsp;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fns_and_mtime = []<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If node2 in not the wc or there is &gt;1 change, copy it<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if node2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir2 = snapshot_node(ui, repo, modified + added, node2, tmproot)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif changes &gt; 1:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir2 = snapshot_wdir(ui, repo, modified + added, tmproot)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #we only actually need to get the files to copy back to the working <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #dir in this case (because the other cases are: diffing 2 revisions 
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #or single file -- in which case the file is already directly passed <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #to the diff tool).<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir2, fns_and_mtime = snapshot_wdir(ui, repo, modified + added, tmproot)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # This lets the diff tool open the changed file directly<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir2 = &#39;&#39;<br>@@ -146,6 +171,13 @@ def dodiff(ui, repo, diffcmd, diffopts, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.shellquote(dir1), util.shellquote
(dir2)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ui.debug(&#39;running %r in %s\n&#39; % (cmdline, tmproot))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.system(cmdline, cwd=tmproot)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for copy_fn, working_fn, mtime in fns_and_mtime:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.path.getmtime
(copy_fn) != mtime:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ui.debug(&#39;File changed while diffing. &#39;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Overwriting: %s (src: %s)\n&#39; % (working_fn, copy_fn))<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.copyfile(copy_fn, working_fn)
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<br>&nbsp;&nbsp;&nbsp;&nbsp; finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ui.note(_(&#39;cleaning up temp directory\n&#39;))<br><br>