Re: [PATCH 1/2] difftool: only copy back files modified during directory diff
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 28, 2012, 19:51 UTC
- Message-ID
- <7vbok35i5s.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1340912395-16990-1-git-send-email-tim.henigan@gmail.com>
Tim Henigan <tim.henigan@gmail.com> writes:
Show 33 quoted lines
> 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 <tim.henigan@gmail.com>
> ---
>
> This patch must be applied after commit 304970d on next (diff-no-index:
> exit(1) if 'diff --quiet <repo file> <external file>' 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?
Show 6 quoted lines
> + copy("$b/$file", "$workdir/$file") or die $!;
> + chmod(stat("$b/$file")->mode, "$workdir/$file") or die $!;
> + }
> }
> } else {
> if (defined($prompt)) {