mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
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:
commit
330135ac81
36
perl/Git.pm
36
perl/Git.pm
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in a new issue