Merge branch 'mm/git-pm-try-catch-syntax-fix'

Fix a longstanding syntax error in Git.pm error codepath.

* mm/git-pm-try-catch-syntax-fix:
  Git.pm: trust rev-parse to find bare repositories
  Git.pm: add semicolon after catch statement
This commit is contained in:
Junio C Hamano 2022-10-28 11:26:54 -07:00
commit 330135ac81
3 changed files with 32 additions and 20 deletions

View file

@ -177,16 +177,27 @@ sub repository {
-d $opts{Directory} or throw Error::Simple("Directory not found: $opts{Directory} $!");
my $search = Git->repository(WorkingCopy => $opts{Directory});
my $dir;
# This rev-parse will throw an exception if we're not in a
# repository, which is what we want, but it's kind of noisy.
# Ideally we'd capture stderr and relay it, but doing so is
# awkward without depending on it fitting in a pipe buffer. So
# we just reproduce a plausible error message ourselves.
my $out;
try {
$dir = $search->command_oneline(['rev-parse', '--git-dir'],
STDERR => 0);
# Note that "--is-bare-repository" must come first, as
# --git-dir output could contain newlines.
$out = $search->command([qw(rev-parse --is-bare-repository --git-dir)],
STDERR => 0);
} catch Git::Error::Command with {
$dir = undef;
throw Error::Simple("fatal: not a git repository: $opts{Directory}");
};
chomp $out;
my ($bare, $dir) = split /\n/, $out, 2;
require Cwd;
if ($dir) {
if ($bare ne 'true') {
require File::Spec;
File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir;
$opts{Repository} = Cwd::abs_path($dir);
@ -204,21 +215,6 @@ sub repository {
$opts{WorkingSubdir} = $prefix;
} else {
# A bare repository? Let's see...
$dir = $opts{Directory};
unless (-d "$dir/refs" and -d "$dir/objects" and -e "$dir/HEAD") {
# Mimic git-rev-parse --git-dir error message:
throw Error::Simple("fatal: Not a git repository: $dir");
}
my $search = Git->repository(Repository => $dir);
try {
$search->command('symbolic-ref', 'HEAD');
} catch Git::Error::Command with {
# Mimic git-rev-parse --git-dir error message:
throw Error::Simple("fatal: Not a git repository: $dir");
}
$opts{Repository} = Cwd::abs_path($dir);
}

View file

@ -45,6 +45,10 @@ test_expect_success \
git config --add test.pathmulti bar
'
test_expect_success 'set up bare repository' '
git init --bare bare.git
'
test_expect_success 'use t9700/test.pl to test Git.pm' '
"$PERL_PATH" "$TEST_DIRECTORY"/t9700/test.pl 2>stderr &&
test_must_be_empty stderr

View file

@ -30,6 +30,18 @@ sub adjust_dirsep {
# set up
our $abs_repo_dir = cwd();
ok(our $r = Git->repository(Directory => "."), "open repository");
{
local $ENV{GIT_TEST_ASSUME_DIFFERENT_OWNER} = 1;
my $failed;
$failed = eval { Git->repository(Directory => $abs_repo_dir) };
ok(!$failed, "reject unsafe non-bare repository");
like($@, qr/not a git repository/i, "unsafe error message");
$failed = eval { Git->repository(Directory => "$abs_repo_dir/bare.git") };
ok(!$failed, "reject unsafe bare repository");
like($@, qr/not a git repository/i, "unsafe error message");
}
# config
is($r->config("test.string"), "value", "config scalar: string");