Skip to content

Commit

Permalink
difftool --dir-diff: allow changing any clean working tree file
Browse files Browse the repository at this point in the history
The temporary directory prepared by "difftool --dir-diff" to
show the result of a change can be modified by the user via
the tree diff program, and we try hard not to lose changes
to them after tree diff program returns to us.

However, the set of files to be copied back is computed
differently between --symlinks and --no-symlinks modes.  The
former checks all paths that start out as identical to the
working tree file, while the latter checks paths that
already had a local modification in the working tree,
allowing changes made in the tree diff program to paths that
did not have any local change to be lost.

Signed-off-by: Kenichi Saita <nitoyon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
nitoyon authored and gitster committed May 29, 2013
1 parent edca415 commit 32eaf1d
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
9 changes: 2 additions & 7 deletions git-difftool.perl
Expand Up @@ -85,13 +85,9 @@ sub exit_cleanup

sub use_wt_file
{
my ($repo, $workdir, $file, $sha1, $symlinks) = @_;
my ($repo, $workdir, $file, $sha1) = @_;
my $null_sha1 = '0' x 40;

if ($sha1 ne $null_sha1 and not $symlinks) {
return 0;
}

if (! -e "$workdir/$file") {
# If the file doesn't exist in the working tree, we cannot
# use it.
Expand Down Expand Up @@ -213,8 +209,7 @@ sub setup_dir_diff

if ($rmode ne $null_mode) {
my ($use, $wt_sha1) = use_wt_file($repo, $workdir,
$dst_path, $rsha1,
$symlinks);
$dst_path, $rsha1);
if ($use) {
push @working_tree, $dst_path;
$wtindex .= "$rmode $wt_sha1\t$dst_path\0";
Expand Down
19 changes: 19 additions & 0 deletions t/t7800-difftool.sh
Expand Up @@ -385,6 +385,25 @@ test_expect_success PERL,SYMLINKS 'difftool --dir-diff --symlink without unstage
test_cmp actual expect
'

write_script modify-right-file <<\EOF
echo "new content" >"$2/file"
EOF

run_dir_diff_test 'difftool --dir-diff syncs worktree with unstaged change' '
test_when_finished git reset --hard &&
echo "orig content" >file &&
git difftool -d $symlinks --extcmd "$(pwd)/modify-right-file" branch &&
echo "new content" >expect &&
test_cmp expect file
'

run_dir_diff_test 'difftool --dir-diff syncs worktree without unstaged change' '
test_when_finished git reset --hard &&
git difftool -d $symlinks --extcmd "$(pwd)/modify-right-file" branch &&
echo "new content" >expect &&
test_cmp expect file
'

write_script modify-file <<\EOF
echo "new content" >file
EOF
Expand Down

0 comments on commit 32eaf1d

Please sign in to comment.