chiark / gitweb /
dgit: Regularise patch filenames, and defend against funny commit subjects
[dgit.git] / Debian / Dgit.pm
index 314bd8c712c6159fe031bfe8073a62f902666f84..dcecbd1a840e7f0c7718b398d585e2e4d4e3fe77 100644 (file)
@@ -36,7 +36,7 @@ BEGIN {
 
     $VERSION     = 1.00;
     @ISA         = qw(Exporter);
-    @EXPORT      = qw(setup_sigwarn
+    @EXPORT      = qw(setup_sigwarn forkcheck_setup forkcheck_mainprocess
                      dep14_version_mangle
                       debiantags debiantag_old debiantag_new
                      server_branch server_ref
@@ -50,6 +50,7 @@ BEGIN {
                      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 $series_filename_re
                       $branchprefix
                       initdebug enabledebug enabledebuglevel
                       printdebug debugcmd
@@ -65,7 +66,10 @@ our @EXPORT_OK;
 our $package_re = '[0-9a-z][-+.0-9a-z]*';
 our $component_re = '[0-9a-zA-Z][-+.0-9a-zA-Z]*';
 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
@@ -78,10 +82,21 @@ sub NOCOMMITCHECK () { return 0x8; }
 our $debugprefix;
 our $debuglevel = 0;
 
+our $forkcheck_mainprocess;
+
+sub forkcheck_setup () {
+    $forkcheck_mainprocess = $$;
+}
+
+sub forkcheck_mainprocess () {
+    # You must have called forkcheck_setup or setup_sigwarn already
+    getppid != $forkcheck_mainprocess;
+}
+
 sub setup_sigwarn () {
-    our $sigwarn_mainprocess = $$;
+    forkcheck_setup();
     $SIG{__WARN__} = sub { 
-       die $_[0] unless getppid == $sigwarn_mainprocess;
+       die $_[0] if forkcheck_mainprocess;
     };
 }
 
@@ -123,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) {
@@ -311,6 +327,7 @@ sub git_rev_parse ($) {
 sub git_cat_file ($) {
     my ($objname) = @_;
     # => ($type, $data) or ('missing', undef)
+    # in scalar context, just the data
     our ($gcf_pid, $gcf_i, $gcf_o);
     if (!$gcf_pid) {
        my @cmd = qw(git cat-file --batch);