diff options
author | David Aguilar <davvid@gmail.com> | 2016-12-09 00:58:47 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-12-11 16:18:54 -0800 |
commit | f242a03d7330a68baf0748e595c0b2290d3a05a5 (patch) | |
tree | 17e64f98f9a6756d7cdf5ba0db7d64bd85a4d4c5 /git-difftool.perl | |
parent | e6e3e2a67c8dacb0ed726f09cf203568f24f8e74 (diff) | |
download | git-f242a03d7330a68baf0748e595c0b2290d3a05a5.tar.gz git-f242a03d7330a68baf0748e595c0b2290d3a05a5.tar.xz |
difftool: chdir as early as possible
Make difftool chdir to the top-level of the repository as soon as it can
so that we can simplify how paths are handled. Replace construction of
absolute paths via string concatenation with relative paths wherever
possible. The bulk of the code no longer needs to use absolute paths.
Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-difftool.perl')
-rwxr-xr-x | git-difftool.perl | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/git-difftool.perl b/git-difftool.perl index 17c336321..99b03949b 100755 --- a/git-difftool.perl +++ b/git-difftool.perl @@ -59,14 +59,14 @@ sub exit_cleanup sub use_wt_file { - my ($workdir, $file, $sha1) = @_; + my ($file, $sha1) = @_; my $null_sha1 = '0' x 40; - if (-l "$workdir/$file" || ! -e _) { + if (-l $file || ! -e _) { return (0, $null_sha1); } - my $wt_sha1 = Git::command_oneline('hash-object', "$workdir/$file"); + my $wt_sha1 = Git::command_oneline('hash-object', $file); my $use = ($sha1 eq $null_sha1) || ($sha1 eq $wt_sha1); return ($use, $wt_sha1); } @@ -105,6 +105,12 @@ sub setup_dir_diff my $diffrtn = Git::command_oneline(@gitargs); exit(0) unless defined($diffrtn); + # Go to the root of the worktree now that we've captured the list of + # changed files. The paths returned by diff --raw are relative to the + # top-level of the repository, but we defer changing directories so + # that @ARGV can perform pathspec limiting in the current directory. + chdir($workdir); + # Build index info for left and right sides of the diff my $submodule_mode = '160000'; my $symlink_mode = '120000'; @@ -172,7 +178,7 @@ EOF next; } my ($use, $wt_sha1) = - use_wt_file($workdir, $dst_path, $rsha1); + use_wt_file($dst_path, $rsha1); if ($use) { push @working_tree, $dst_path; $wtindex .= "$rmode $wt_sha1\t$dst_path\0"; @@ -182,10 +188,6 @@ EOF } } - # Go to the root of the worktree so that the left index files - # are properly setup -- the index is toplevel-relative. - chdir($workdir); - # Setup temp directories my $tmpdir = tempdir('git-difftool.XXXXX', CLEANUP => 0, TMPDIR => 1); my $ldir = "$tmpdir/left"; @@ -235,10 +237,10 @@ EOF symlink("$workdir/$file", "$rdir/$file") or exit_cleanup($tmpdir, 1); } else { - copy("$workdir/$file", "$rdir/$file") or + copy($file, "$rdir/$file") or exit_cleanup($tmpdir, 1); - my $mode = stat("$workdir/$file")->mode; + my $mode = stat($file)->mode; chmod($mode, "$rdir/$file") or exit_cleanup($tmpdir, 1); } @@ -430,10 +432,10 @@ sub dir_diff $error = 1; } elsif (exists $tmp_modified{$file}) { my $mode = stat("$b/$file")->mode; - copy("$b/$file", "$workdir/$file") or + copy("$b/$file", $file) or exit_cleanup($tmpdir, 1); - chmod($mode, "$workdir/$file") or + chmod($mode, $file) or exit_cleanup($tmpdir, 1); } } |