1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-21 17:26:09 +02:00

difftool: support repositories with .git-files

Modern versions of "git submodule" use .git-files to setup the
submodule directory.  When run in a "git submodule"-created
repository "git difftool --dir-diff" dies with the following
error:

	$ git difftool -d HEAD~
	fatal: This operation must be run in a work tree
	diff --raw --no-abbrev -z HEAD~: command returned error: 128

core.worktree is relative to the .git directory but the logic
in find_worktree() does not account for it.

Use `git rev-parse --show-toplevel` to find the worktree so that
the dir-diff feature works inside a submodule.

Reported-by: Gábor Lipták <gabor.liptak@gmail.com>
Helped-by: Jens Lehmann <jens.lehmann@web.de>
Helped-by: John Keeping <john@keeping.me.uk>
Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
David Aguilar 2014-02-23 19:12:35 -08:00 committed by Junio C Hamano
parent 7bbc4e8fdb
commit 94eaa80651

View File

@ -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);