chiark / gitweb /
Tag change: Update dgit-repos-policy-debian
[dgit.git] / infra / dgit-repos-policy-debian
index b6310d958d1ee61273f2348181ce7a7cc2056a98..e37690c0b495791cdc2adac29cc6b3e87dc950ce 100755 (executable)
@@ -2,7 +2,9 @@
 # dgit repos policy hook script for Debian
 
 use strict;
-$SIG{__WARN__} = sub { die $_[0]; };
+
+use Debian::Dgit qw(:DEFAULT :policyflags);
+setup_sigwarn();
 
 use POSIX;
 use JSON;
@@ -11,7 +13,6 @@ use DBI;
 use IPC::Open2;
 use Data::Dumper;
 
-use Debian::Dgit qw(:DEFAULT :policyflags);
 use Debian::Dgit::Policy::Debian;
 
 initdebug('%');
@@ -108,12 +109,20 @@ sub apiquery ($) {
 sub vsn_in_our_history ($) {
     my ($vsn) = @_;
 
-    my $tagref = "refs/tags/".debiantag $vsn, $distro;
-    printdebug " checking history  vsn=$vsn tagref=$tagref\n";
-    $?=0; my $r = system qw(git show-ref --verify --quiet), $tagref;
-    return 1 if !$r;
-    return 0 if $r==256;
-    die "$pkg tagref $tagref $? $!";
+    # Eventually, when we withdraw support for old-format (DEP-14
+    # namespace) tags, we will need to change this to only look
+    # for debiantag_new.  See the commit
+    #   "Tag change: Update dgit-repos-policy-debian"
+    # (reverting which is a good start for that change).
+
+    my @tagrefs = map { "refs/tags/".$_ } debiantags $vsn, $distro;
+    printdebug " checking history  vsn=$vsn tagrefs=@tagrefs\n";
+    open F, "-|", qw(git-for-each-ref), @tagrefs;
+    $_ = <F>;
+    close F;
+    return 1 if defined && m/\S/;
+    die "$pkg tagrefs @tagrefs $? $!" if $?;
+    return 0;
 }
 
 sub specific_suite_has_suitable_vsn ($$) {
@@ -351,19 +360,21 @@ END
     my $mustreject=0;
 
     while (my $taintid = shift @taintids) {
-       # git cat-file prints a spurious newline after it gets EOF
-       # This is not documented.  I guess it might go away.  So we
-       # just read what we expect and then let it get SIGPIPE.
        $!=0; $_ = <CHKOUT>;
-       die "$? $!" unless defined $_;
+       die "($taintid @objscatcmd) $!" unless defined $_;
        printdebug "|< ", $_ if $debuglevel>=2;
 
        next if m/^\w+ missing$/;
-       die "$_ ?" unless m/^(\w+) (\w+) (\d+)\s/;
+       die "($taintid @objscatcmd) $_ ?" unless m/^(\w+) (\w+) (\d+)\s/;
        my ($objid,$objtype,$nbytes) = ($1,$2,$3);
 
        my $drop;
-       (read CHKOUT, $drop, $nbytes) == $nbytes or die;
+       (read CHKOUT, $drop, $nbytes) == $nbytes
+           or die "($taintid @objscatcmd) $!";
+
+       $!=0; $_ = <CHKOUT>;
+       die "($taintid @objscatcmd) $!" unless defined $_;
+       die "($taintid @objscatcmd) $_ ?" if m/\S/;
 
        $taintinfoq ||= $poldbh->prepare(<<END);
             SELECT package, time, comment FROM taints WHERE taint_id =  ?
@@ -371,7 +382,7 @@ END
         $taintinfoq->execute($taintid);
 
        my $ti = $taintinfoq->fetchrow_hashref();
-       die unless $ti;
+       die "($taintid)" unless $ti;
 
        my $timeshow = defined $ti->{time}
            ? " at time ".strftime("%Y-%m-%d %H:%M:%S Z", gmtime $ti->{time})