]> git.donarmstrong.com Git - debhelper.git/blobdiff - Debian/Debhelper/Dh_Lib.pm
Improve error messages when child commands fail.
[debhelper.git] / Debian / Debhelper / Dh_Lib.pm
index 4df64c8748a1b3f98d9abcab5d449eabc905e063..a11c36a37ce7b5bfd8a900ccd307a516d6e78e07 100644 (file)
@@ -27,6 +27,7 @@ sub init {
        # If so, we need to pass this off to the resource intensive 
        # Getopt::Long, which I'd prefer to avoid loading at all if possible.
        if ((defined $ENV{DH_OPTIONS} && length $ENV{DH_OPTIONS}) ||
+           (defined $ENV{DH_INTERNAL_OPTIONS} && length $ENV{DH_INTERNAL_OPTIONS}) ||
            grep /^-/, @ARGV) {
                eval "use Debian::Debhelper::Dh_Getopt";
                error($@) if $@;
@@ -102,14 +103,20 @@ sub init {
 my $write_log=1;
 sub END {
        if ($? == 0 && $write_log) {
-               my $cmd=basename($0);
-               foreach my $package (@{$dh{DOPACKAGES}}) {
-                       my $ext=pkgext($package);
-                       my $log="debian/${ext}debhelper.log";
-                       open(LOG, ">>", $log) || error("failed to write to ${log}: $!");
-                       print LOG $cmd."\n";
-                       close LOG;
-               }
+               write_log(basename($0), @{$dh{DOPACKAGES}});
+       }
+}      
+
+sub write_log {
+       my $cmd=shift;
+       my @packages=@_;
+
+       foreach my $package (@packages) {
+               my $ext=pkgext($package);
+               my $log="debian/${ext}debhelper.log";
+               open(LOG, ">>", $log) || error("failed to write to ${log}: $!");
+               print LOG $cmd."\n";
+               close LOG;
        }
 }
 
@@ -155,8 +162,7 @@ sub doit {
        verbose_print(escape_shell(@_));
 
        if (! $dh{NO_ACT}) {
-               my $ret=system(@_);
-               $ret == 0 || error("command returned error code $ret");
+               system(@_) == 0 || _error_exitcode($_[0]);
        }
 }
 
@@ -169,11 +175,23 @@ sub complex_doit {
        
        if (! $dh{NO_ACT}) {
                # The join makes system get a scalar so it forks off a shell.
-               system(join(" ",@_)) == 0
-                       || error("command returned error code");
+               system(join(" ", @_)) == 0 || _error_exitcode(join(" ", @_))
        }                       
 }
 
+sub _error_exitcode {
+       my $command=shift;
+       if ($? == -1) {
+               error("$command failed to to execute: $!");
+       }
+       elsif ($? & 127) {
+               error("$command died with signal ".($? & 127));
+        }
+       else {
+               error("$command returned exit code ".($? >> 8));
+       }
+}
+
 # Run a command that may have a huge number of arguments, like xargs does.
 # Pass in a reference to an array containing the arguments, and then other
 # parameters that are the command and any parameters that should be passed to