So far, errors just killed the whole program and in case of an error
inside of libgit it would be totally uncatchable. This patch makes
Git.pm throw standard Perl exceptions instead. In the future we might
subclass Error to Git::Error or something but for now Error::Simple
is more than enough.
Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
$cmd =~ /^[a-z0-9A-Z_-]+$/ or croak "bad command: $cmd";
$cmd =~ /^[a-z0-9A-Z_-]+$/ or throw Error::Simple("bad command: $cmd");
my $pid = open(my $fh, "-|");
if (not defined $pid) {
croak "open failed: $!";
throw Error::Simple("open failed: $!");
} elsif ($pid == 0) {
_cmd_exec($self, $cmd, @args);
}
@ -271,16 +272,17 @@ The function returns only after the command has finished running.
@@ -271,16 +272,17 @@ The function returns only after the command has finished running.
sub command_noisy {
my ($self, $cmd, @args) = _maybe_self(@_);
$cmd =~ /^[a-z0-9A-Z_-]+$/ or croak "bad command: $cmd";
$cmd =~ /^[a-z0-9A-Z_-]+$/ or throw Error::Simple("bad command: $cmd");
my $pid = fork;
if (not defined $pid) {
croak "fork failed: $!";
throw Error::Simple("fork failed: $!");
} elsif ($pid == 0) {
_cmd_exec($self, $cmd, @args);
}
if (waitpid($pid, 0) > 0 and $? != 0) {
croak "exit status: $?";
# This is the best candidate for a custom exception class.
throw Error::Simple("exit status: $?");
}
}
@ -340,10 +342,10 @@ are involved.
@@ -340,10 +342,10 @@ are involved.
=back
=head1 TODO
=head1 ERROR HANDLING
This is still fairly crude.
We need some good way to report errors back except just dying.
All functions are supposed to throw Perl exceptions in case of errors.
See L<Error>.
=head1 COPYRIGHT
@ -372,8 +374,8 @@ sub _cmd_exec {
@@ -372,8 +374,8 @@ sub _cmd_exec {
$self->{opts}->{Repository} and $ENV{'GIT_DIR'} = $self->{opts}->{Repository};
$self->{opts}->{WorkingCopy} and chdir($self->{opts}->{WorkingCopy});
}
xs__execv_git_cmd(@args);
croak "exec failed: $!";
_execv_git_cmd(@args);
die "exec failed: $!";
}
# Execute the given Git command ($_[0]) with arguments ($_[1..])
@ -388,7 +390,8 @@ sub _cmd_close {
@@ -388,7 +390,8 @@ sub _cmd_close {
# It's just close, no point in fatalities
carp "error closing pipe: $!";
} elsif ($? >> 8) {
croak "exit status: ".($? >> 8);
# This is the best candidate for a custom exception class.
throw Error::Simple("exit status: ".($? >> 8));
}
# else we might e.g. closed a live stream; the command
# dying of SIGPIPE would drive us here.
@ -415,6 +418,8 @@ sub _call_gate {
@@ -415,6 +418,8 @@ sub _call_gate {
#xs_call_gate($self->{opts}->{Repository});
}
# Having to call throw from the C code is a sure path to insanity.
local $SIG{__DIE__} = sub { throw Error::Simple("@_"); };
&$xsfunc(@args);
}
@ -422,7 +427,7 @@ sub AUTOLOAD {
@@ -422,7 +427,7 @@ sub AUTOLOAD {
my $xsname;
our $AUTOLOAD;
($xsname = $AUTOLOAD) =~ s/.*:://;
croak "&Git::$xsname not defined" if $xsname =~ /^xs_/;
throw Error::Simple("&Git::$xsname not defined") if $xsname =~ /^xs_/;