summaryrefslogtreecommitdiff
path: root/git-difftool.perl
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-03-28 21:37:22 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-03-28 21:37:22 (GMT)
commit18973d8ac9e396d0eefdf36d7c6aa43aa7d396a6 (patch)
tree3dbfeddce403353b393042a812cfa2c669e54fbf /git-difftool.perl
parentd8355e5eaecddbcafdd66aa3d6433ae12f627177 (diff)
parent02c56314aab9474827cd7831518a970f0341e4fd (diff)
downloadgit-18973d8ac9e396d0eefdf36d7c6aa43aa7d396a6.zip
git-18973d8ac9e396d0eefdf36d7c6aa43aa7d396a6.tar.gz
git-18973d8ac9e396d0eefdf36d7c6aa43aa7d396a6.tar.bz2
Merge branch 'jk/difftool-dir-diff-edit-fix'
"git difftool --dir-diff" made symlinks to working tree files when preparing a temporary directory structure, so that accidental edits of these files in the difftool are reflected back to the working tree, but the logic to decide when to do so was not quite right. * jk/difftool-dir-diff-edit-fix: difftool --dir-diff: symlink all files matching the working tree difftool: avoid double slashes in symlink targets git-difftool(1): fix formatting of --symlink description
Diffstat (limited to 'git-difftool.perl')
-rwxr-xr-xgit-difftool.perl25
1 files changed, 21 insertions, 4 deletions
diff --git a/git-difftool.perl b/git-difftool.perl
index 12231fb..663640d 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -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";
}
}
}
@@ -209,7 +224,9 @@ EOF
delete($ENV{GIT_INDEX_FILE});
# Changes in the working tree need special treatment since they are
- # not part of the index
+ # not part of the index. Remove any trailing slash from $workdir
+ # before starting to avoid double slashes in symlink targets.
+ $workdir =~ s|/$||;
for my $file (@working_tree) {
my $dir = dirname($file);
unless (-d "$rdir/$dir") {