chiark / gitweb /
test suite: import-dsc: Fix and uncomment missing object test
[dgit.git] / Debian / Dgit.pm
index 50e3b860a71ae409c6d803b1cd36788f7617e61a..be8cbeea2a8667a69e6f0c54a4b9bacc2ffad94a 100644 (file)
@@ -28,6 +28,7 @@ use IO::Handle;
 use Config;
 use Digest::SHA;
 use Data::Dumper;
+use IPC::Open2;
 
 BEGIN {
     use Exporter   ();
@@ -45,16 +46,18 @@ BEGIN {
                       waitstatusmsg failedcmd_waitstatus
                      failedcmd_report_cmd failedcmd
                       cmdoutput cmdoutput_errok
-                      git_rev_parse git_get_ref git_for_each_ref
+                      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
                       $branchprefix
                       initdebug enabledebug enabledebuglevel
                       printdebug debugcmd
                       $debugprefix *debuglevel *DEBUG
                       shellquote printcmd messagequote);
     # implicitly uses $main::us
-    %EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO)] );
+    %EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO NOCOMMITCHECK)] );
     @EXPORT_OK   = @{ $EXPORT_TAGS{policyflags} };
 }
 
@@ -63,6 +66,8 @@ 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';
 
 # policy hook exit status bits
@@ -71,6 +76,7 @@ our $branchprefix = 'dgit';
 # dynamic loader, runtime, etc., failures, which report 127 or 255
 sub NOFFCHECK () { return 0x2; }
 sub FRESHREPO () { return 0x4; }
+sub NOCOMMITCHECK () { return 0x8; }
 
 our $debugprefix;
 our $debuglevel = 0;
@@ -305,6 +311,29 @@ sub git_rev_parse ($) {
     return cmdoutput qw(git rev-parse), "$_[0]~0";
 }
 
+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);
+       debugcmd "GCF|", @cmd;
+       $gcf_pid = open2 $gcf_o, $gcf_i, @cmd or die $!;
+    }
+    printdebug "GCF>| ", $objname, "\n";
+    print $gcf_i $objname, "\n" or die $!;
+    my $x = <$gcf_o>;
+    printdebug "GCF<| ", $x;
+    if ($x =~ m/ (missing)$/) { return ($1, undef); }
+    my ($type, $size) = $x =~ m/^.* (\w+) (\d+)\n/ or die "$objname ?";
+    my $data;
+    (read $gcf_o, $data, $size) == $size or die "$objname $!";
+    $x = <$gcf_o>;
+    $x eq "\n" or die "$objname ($_) $!";
+    return ($type, $data);
+}
+
 sub git_for_each_ref ($$;$) {
     my ($pattern,$func,$gitdir) = @_;
     # calls $func->($objid,$objtype,$fullrefname,$reftail);