chiark / gitweb /
Dgit.pm: runcmd: Break out from dgit
[dgit.git] / Debian / Dgit.pm
index 5e0bbd5e63ce0b8f8ddac59b63bbd34476cb9d03..5b5591d5499695def37c47f023a00f854bfa1738 100644 (file)
@@ -45,12 +45,12 @@ BEGIN {
                       fail ensuredir executable_on_path
                       waitstatusmsg failedcmd_waitstatus
                      failedcmd_report_cmd failedcmd
-                      cmdoutput cmdoutput_errok
+                      runcmd cmdoutput cmdoutput_errok
                       git_rev_parse git_cat_file
                      git_get_ref git_for_each_ref
                       git_for_each_tag_referring is_fast_fwd
                       $package_re $component_re $deliberately_re
-                     $distro_re $versiontag_re
+                     $distro_re $versiontag_re $series_filename_re
                       $branchprefix
                       initdebug enabledebug enabledebuglevel
                       printdebug debugcmd
@@ -69,6 +69,7 @@ our $deliberately_re = "(?:TEST-)?$package_re";
 our $distro_re = $component_re;
 our $versiontag_re = qr{[-+.\%_0-9a-zA-Z/]+};
 our $branchprefix = 'dgit';
+our $series_filename_re = qr{(?:^|\.)series(?!\n)$}s;
 
 # policy hook exit status bits
 # see dgit-repos-server head comment for documentation
@@ -137,6 +138,7 @@ sub messagequote ($) {
 sub shellquote {
     my @out;
     local $_;
+    defined or confess 'internal error' foreach @_;
     foreach my $a (@_) {
        $_ = $a;
        if (!length || m{[^-=_./:0-9a-z]}i) {
@@ -274,6 +276,12 @@ sub failedcmd {
     fail failedcmd_waitstatus();
 }
 
+sub runcmd {
+    debugcmd "+",@_;
+    $!=0; $?=-1;
+    failedcmd @_ if system @_;
+}
+
 sub cmdoutput_errok {
     confess Dumper(\@_)." ?" if grep { !defined } @_;
     debugcmd "|",@_;