chiark / gitweb /
Introduce git_for_each_ref
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 21 Mar 2015 13:47:42 +0000 (13:47 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 22 Mar 2015 15:19:51 +0000 (15:19 +0000)
Debian/Dgit.pm
infra/dgit-repos-policy-debian

index 8b29ba2746be30267b9cef7cf73ff60b3d95e25e..4d9b81aa83af274469dbb2f302f090a82a9e46b8 100644 (file)
@@ -12,7 +12,7 @@ BEGIN {
     $VERSION     = 1.00;
     @ISA         = qw(Exporter);
     @EXPORT      = qw(debiantag server_branch server_ref
-                      stat_exists
+                      stat_exists git_for_each_ref
                       $package_re $branchprefix);
     %EXPORT_TAGS = ( policyflags => qw() );
     @EXPORT_OK   = qw();
@@ -51,4 +51,17 @@ sub stat_exists ($) {
     die "stat $f: $!";
 }
 
+sub git_for_each_ref ($$) {
+    my ($pattern,$func) = @_;
+    # calls $func->($objid,$objtype,$fullrefname,$reftail);
+    # $reftail is RHS of ref after refs/\w+/
+    # breaks if $pattern matches any ref `refs/blah' where blah has no `/'
+    my $fh = new IO::File, "-|", qw(git for-each-ref), $pattern or die $!;
+    while (<$fh>) {
+       m#^(\w+)\s+(\w+)\s+(refs/\w+/(\S+))\s# or die "$_ ?";
+       $func->($1,$2,$3,$4);
+    }
+    $!=0; $?=0; close $fh or die "$pattern $? $!";
+}
+
 1;
index 493fefdd6d9233c3d85056c6483888589c58e238..66bf8be6d63ffc937e776c78c04cb95fe8ef3b5a 100755 (executable)
@@ -221,14 +221,13 @@ 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".
+    git_for_each_ref('refs/tags', sub {
+       my ($objid,$objtype,$fullrefname,$tagname) = @_;
+       add_taint($objid,$objtype,
+                 "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)");
-    }
+    });
     $?=0; $!=0; close TAGL or die "git for-each-ref $? $!";
 
     return FRESHREPO;