From: Junio C Hamano Date: Thu, 28 Jun 2012 19:51:43 GMT Subject: Re: [PATCH 1/2] difftool: only copy back files modified during directory diff Message-ID: <7vbok35i5s.fsf@alter.siamese.dyndns.org> In-Reply-To: <1340912395-16990-1-git-send-email-tim.henigan@gmail.com> Tim Henigan writes: > When 'difftool --dir-diff' is used to compare working tree files, > it always copies files from the tmp dir back to the working tree > when the diff tool is closed, even if the files were not modified > by the diff tool. > > This causes the file timestamp to change. Files should only be > copied from the tmp dir back to the working copy if they were > actually modified. > > Signed-off-by: Tim Henigan > --- > > This patch must be applied after commit 304970d on next (diff-no-index: > exit(1) if 'diff --quiet ' finds changes). > because it relies on 'git diff --quiet' to compare files outside the > repository. > > > git-difftool.perl | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/git-difftool.perl b/git-difftool.perl > index ae1e052..679a56d 100755 > --- a/git-difftool.perl > +++ b/git-difftool.perl > @@ -336,8 +336,11 @@ if (defined($dirdiff)) { > # files were modified during the diff, then the changes > # should be copied back to the working tree > for my $file (@working_tree) { > - copy("$b/$file", "$workdir/$file") or die $!; > - chmod(stat("$b/$file")->mode, "$workdir/$file") or die $!; > + if ((-e "$b/$file") && > + (system('git', 'diff', '--quiet', "$b/$file", "$workdir/$file") != 0)) { Why waste cycles to spawn "git diff" when you only want to find if they are byte-for-byte identical *and* when you are importing many perl modules from File::* already into the script? > + copy("$b/$file", "$workdir/$file") or die $!; > + chmod(stat("$b/$file")->mode, "$workdir/$file") or die $!; > + } > } > } else { > if (defined($prompt)) {