chiark / gitweb /
dgit-repos-server: Further fixes to locking; rename acquiretree to acquirermtree
[dgit.git] / infra / dgit-repos-policy-debian
index 4ba3e8e144432071193092f6fd61223d265f01ff..0f9d70f514edcd62431465132d29c1de10874fea 100755 (executable)
@@ -12,6 +12,8 @@
 # cwd for push is a temporary repo where the to-be-pushed objects have
 #  been received; TAGNAME is the version-based tag
 #
+# if push requested FRESHREPO, push-confirm happens in said fresh repo
+#
 # policy hook for a particular package will be invoked only once at
 # a time
 
@@ -166,11 +168,11 @@ sub getpackage () {
     $pkg_secret = !!(~(stat _)[2] & 05);
 }
 
-sub add_taint ($$) {
-    my ($gitobjid, $gitobjtype, $reason) = @_;
+sub add_taint_by_tag ($$$) {
+    my ($tagname, $refobjid, $refobjtype) = @_;
 
     my $tf = new File::Temp or die $!;
-    print $tf "$gitobjid\n" or die $!;
+    print $tf "$refobjid^0\n" or die $!;
 
     my $gcfpid = open GCF, "-|";
     defined $gcfpid or die $!;
@@ -183,14 +185,22 @@ sub add_taint ($$) {
     close $tf or die $!;
     $_ = <GCF>;
     m/^(\w+) (\w+) (\d+)\n/ or die "$objline ?";
-    $1 eq $gitobjid or die "$! $gitobjid ?";
-    $2 eq $gitobjtype or die "$! $gitobjtype ?";
+    my $gitobjid = $1;
+    my $gitobjtype = $2;
     my $bytes = $3;
 
     my $gitobjdata;
-    $!=0; read GCF, $gitobjdata, $bytes == $bytes or die "$gitobjid $bytes $!";
+    if ($gitobjtype eq 'commit' or $gitobjtype eq 'tag') {
+       $!=0; read GCF, $gitobjdata, $bytes == $bytes
+           or die "$gitobjid $bytes $!";
+    }
     close GCF;
 
+    my $reason =
+       "tag $tagname referred to this object in git tree but all".
+       " previously pushed versions were found to have been".
+       " removed from NEW (ie, rejected) (or never arrived)";
+
     $poldbh->do("INSERT INTO taints".
                " (package, gitobjid, gitobjtype, gitobjdata, time, comment)",
                " VALUES (?,?,?,?,?,?)", {},
@@ -219,14 +229,10 @@ sub action__check_package () {
        return 0;
     }
 
-    open TAGL, "git for-each-ref '[r]efs/tags/*' |" or die $!;
-    while (<TAGL>) {
-       m#^(\w+) (\w+) (refs/tags/\S+)\s# or die "$_ ?";
-       add_taint($1,$2,
-                 "tag $3 referred to this object in git tree but all".
-                 " previously pushed versions were found to have been".
-                 " removed from NEW (ie, rejected) (or never arrived)");
-    }
+    git_for_each_ref('refs/tags', sub {
+       my ($objid,$objtype,$fullrefname,$tagname) = @_;
+       add_taint_by_tag($tagname,$objid,$objtype);
+    });
     $?=0; $!=0; close TAGL or die "git for-each-ref $? $!";
 
     return FRESHREPO;