difftool --dir-diff: symlink all files matching the working tree

Some users like to edit files in their diff tool when using "git
difftool --dir-diff --symlink" to compare against the working tree but
difftool currently only created symlinks when a file contains unstaged
changes.

Change this behaviour so that symlinks are created whenever the
right-hand side of the comparison has the same SHA1 as the file in the
working tree.

Note that textconv filters are handled in the same way as by git-diff
and if a clean filter is not the inverse of its smudge filter we already
get a null SHA1 from "diff --raw" and will symlink the file without
going through the new hash-object based check.

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
John Keeping
2013-03-14 20:19:41 +00:00
committed by Junio C Hamano
parent e0976dcf83
commit 02c56314aa
3 changed files with 43 additions and 4 deletions

View File

@ -83,6 +83,21 @@ sub exit_cleanup
exit($status | ($status >> 8));
}
sub use_wt_file
{
my ($repo, $workdir, $file, $sha1, $symlinks) = @_;
my $null_sha1 = '0' x 40;
if ($sha1 eq $null_sha1) {
return 1;
} elsif (not $symlinks) {
return 0;
}
my $wt_sha1 = $repo->command_oneline('hash-object', "$workdir/$file");
return $sha1 eq $wt_sha1;
}
sub setup_dir_diff
{
my ($repo, $workdir, $symlinks) = @_;
@ -159,10 +174,10 @@ EOF
}
if ($rmode ne $null_mode) {
if ($rsha1 ne $null_sha1) {
$rindex .= "$rmode $rsha1\t$dst_path\0";
} else {
if (use_wt_file($repo, $workdir, $dst_path, $rsha1, $symlinks)) {
push(@working_tree, $dst_path);
} else {
$rindex .= "$rmode $rsha1\t$dst_path\0";
}
}
}