Skip to content

Commit e4b353d

Browse files
peffgitster
authored andcommitted
Git.pm: fix bare repository search with Directory option
When opening a bare repository like: Git->repository(Directory => '/path/to/bare.git'); we will incorrectly point the repository object at the _current_ directory, not the one specified by the option. The bug was introduced by 20da61f (Git.pm: trust rev-parse to find bare repositories, 2022-10-22). Before then, we'd ask "rev-parse --git-dir" if it was a Git repo, and if it returned anything, we'd correctly convert that result to an absolute path using File::Spec and Cwd::abs_path(). If it didn't, we'd guess it might be a bare repository and find it ourselves, which was wrong (rev-parse should find even a bare repo, and our search circumvented some of its rules). That commit dropped most of the custom bare-repo search code in favor of using "rev-parse --is-bare-repository" and trusting the "--git-dir" it returned. But it mistakenly left some of the bare-repo code path in place, which was now broken. That code calls Cwd::abs_path($dir); prior to 20da61f $dir contained the "Directory" option the user passed in. But afterwards, it contains the output of "rev-parse --git-dir". And since our tentative rev-parse command is invoked after changing directory, it will always be the relative path "."! So we'll end up with the absolute path of the process's current directory, not the Directory option the caller asked for. So the non-bare case is correct, but the bare one is broken. Our tests only check the non-bare one, so we didn't notice. We can fix this by running the same absolute-path fixup code for both sides. Helped-by: Rodrigo <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent dbecc61 commit e4b353d

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

perl/Git.pm

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,11 @@ sub repository {
197197
my ($bare, $dir) = split /\n/, $out, 2;
198198

199199
require Cwd;
200-
if ($bare ne 'true') {
201-
require File::Spec;
202-
File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir;
203-
$opts{Repository} = Cwd::abs_path($dir);
200+
require File::Spec;
201+
File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir;
202+
$opts{Repository} = Cwd::abs_path($dir);
204203

204+
if ($bare ne 'true') {
205205
# If --git-dir went ok, this shouldn't die either.
206206
my $prefix = $search->command_oneline('rev-parse', '--show-prefix');
207207
$dir = Cwd::abs_path($opts{Directory}) . '/';
@@ -214,8 +214,6 @@ sub repository {
214214
$opts{WorkingCopy} = $dir;
215215
$opts{WorkingSubdir} = $prefix;
216216

217-
} else {
218-
$opts{Repository} = Cwd::abs_path($dir);
219217
}
220218

221219
delete $opts{Directory};

t/t9700-perl-git.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ test_expect_success 'set up test repository' '
4545
'
4646

4747
test_expect_success 'set up bare repository' '
48-
git init --bare bare.git
48+
git init --bare bare.git &&
49+
git -C bare.git --work-tree=. commit --allow-empty -m "bare commit"
4950
'
5051

5152
test_expect_success 'use t9700/test.pl to test Git.pm' '

t/t9700/test.pl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ sub adjust_dirsep {
147147
unlink $tmpfile3;
148148
chdir($abs_repo_dir);
149149

150+
# open alternate bare repo
151+
my $r4 = Git->repository(Directory => "$abs_repo_dir/bare.git");
152+
is($r4->command_oneline(qw(log --format=%s)), "bare commit",
153+
"log of bare repo works");
154+
150155
# unquoting paths
151156
is(Git::unquote_path('abc'), 'abc', 'unquote unquoted path');
152157
is(Git::unquote_path('"abc def"'), 'abc def', 'unquote simple quoted path');

0 commit comments

Comments
 (0)