From: Junio C Hamano Date: Mon, 24 Feb 2014 17:55:30 GMT Subject: Re: [PATCH] difftool: support repositories with .git-files Message-ID: In-Reply-To: <1393211555-50270-1-git-send-email-davvid@gmail.com> David Aguilar writes: > 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 > Helped-by: Jens Lehmann > Helped-by: John Keeping > Signed-off-by: David Aguilar > --- Looks good; thanks. > git-difftool.perl | 18 ++---------------- > 1 file changed, 2 insertions(+), 16 deletions(-) > > diff --git a/git-difftool.perl b/git-difftool.perl > index e57d3d1..18ca61e 100755 > --- a/git-difftool.perl > +++ b/git-difftool.perl > @@ -39,24 +39,10 @@ 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);