Merge branch 'da/difftool-git-files'
authorJunio C Hamano <gitster@pobox.com>
Fri, 14 Mar 2014 21:26:52 +0000 (14:26 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 14 Mar 2014 21:26:52 +0000 (14:26 -0700)
"git difftool" misbehaved when the repository is bound to the
working tree with the ".git file" mechanism, where a textual
file ".git" tells us where it is.

* da/difftool-git-files:
t7800: add a difftool test for .git-files
difftool: support repositories with .git-files

git-difftool.perl
t/t7800-difftool.sh
index e57d3d1295a5ba0a9c02c19df512c909a0631baa..18ca61e8d0493bde9c21ed337043bc72fa5c73a7 100755 (executable)
@@ -39,24 +39,10 @@ sub usage
 
 sub find_worktree
 {
-       my ($repo) = @_;
-
        # Git->repository->wc_path() does not honor changes to the working
        # tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree'
        # config variable.
-       my $worktree;
-       my $env_worktree = $ENV{GIT_WORK_TREE};
-       my $core_worktree = Git::config('core.worktree');
-
-       if (defined($env_worktree) and (length($env_worktree) > 0)) {
-               $worktree = $env_worktree;
-       } elsif (defined($core_worktree) and (length($core_worktree) > 0)) {
-               $worktree = $core_worktree;
-       } else {
-               $worktree = $repo->wc_path();
-       }
-
-       return $worktree;
+       return Git::command_oneline('rev-parse', '--show-toplevel');
 }
 
 sub print_tool_help
@@ -418,7 +404,7 @@ sub dir_diff
        my $rc;
        my $error = 0;
        my $repo = Git->repository();
-       my $workdir = find_worktree($repo);
+       my $workdir = find_worktree();
        my ($a, $b, $tmpdir, @worktree) =
                setup_dir_diff($repo, $workdir, $symlinks);
 
index 2418528487624bf5497af71c9958a84e0a50328f..5a193c500d282cc2b13e8de6e128229585897a16 100755 (executable)
@@ -434,4 +434,18 @@ test_expect_success PERL 'difftool --no-symlinks detects conflict ' '
        )
 '
 
+test_expect_success PERL 'difftool properly honors gitlink and core.worktree' '
+       git submodule add ./. submod/ule &&
+       (
+               cd submod/ule &&
+               test_config diff.tool checktrees &&
+               test_config difftool.checktrees.cmd '\''
+                       test -d "$LOCAL" && test -d "$REMOTE" && echo good
+               '\'' &&
+               echo good >expect &&
+               git difftool --tool=checktrees --dir-diff HEAD~ >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_done