chiark / gitweb /
wip list
[topbloke.git] / Topbloke.pm
index f5c469fe48515c99abbb43696223133ad0769350..56055cf688bb42dc3a007c5603c7c2499b3b3fad 100644 (file)
@@ -309,19 +309,34 @@ sub check_no_unwanted_metadata ($) {
                           qw(.topbloke));
 }
 
+sub patch_matches_spec ($$) {
+    my ($parsedname, $spec) = @_;
+    foreach my $k (qw(Email Domain Nick)) {
+       debug("patch_matches_spec  mismatch $k"), return 0
+           if defined $spec->{$k} &&
+              $parsedname->{$k} ne $spec->{$k};
+    }
+    debug("patch_matches_spec  mismatch DatePrefix"), return 0
+       if defined $spec->{DatePrefix} &&
+          substr($parsedname->{Date}, 0, length $spec->{DatePrefix})
+              ne $spec->{DatePrefix};
+    debug("patch_matches_spec  match"), return 1;
+}
+
 sub foreach_patch ($$$$) {
     my ($spec, $deleted_ok, $want, $body) = @_;
-    # runs $body->($fullname, \%flags, \%deps, \%pflags, \%included)
-    #                        $Want->[0]   1        2         3
+    # runs $body->($patch, $parsedname, \%flags, \%deps, \%pflags, \%included)
+    #                                   $want->[0]   1        2         3
     # where $deps->{$fullname} etc. are 1 for true or nonexistent for false
     #  and if $want->[$item] is not true, the corresponding item may be undef
+    # and $parsedname is only valid if $spec is not undef
+    #  (say $spec { }  if you want the name parsed but no restrictions)
     run_git(sub {
        debug("foreach_patch considering $_");
        m/ / or die "$_ ?";
        my $objname = $`;
        my @out;
        my $patch = substr($',19); #');
-       push @out, $patch;
        $want->[0] ||= !$deleted_ok;
        foreach my $file (qw(flags deps pflags included)) {
 
@@ -331,15 +346,11 @@ sub foreach_patch ($$$$) {
                # right, check the spec next
                if ($spec) {
                    my $have = parse_patch_name($patch);
-                   foreach my $k (qw(Email Domain Nick)) {
-                       debug("foreach_patch  mismatch $k"), return
-                           if defined $spec->{$k} &&
-                              $have->{$k} ne $spec->{$k};
-                   }
-                   debug("foreach_patch  mismatch DatePrefix"), return
-                       if defined $spec->{DatePrefix} &&
-                          substr($have->{Date}, 0, length $spec->{DatePrefix})
-                              ne $spec->{DatePrefix};
+                   debug("foreach_patch  mismatch"), return
+                       unless patch_matches_spec($have, $spec);
+                   unshift @out, $have;
+               } else {
+                   unshift @out, undef;
                }
            }
 
@@ -361,7 +372,7 @@ sub foreach_patch ($$$$) {
            push @out, \%data;
        }
        debug("foreach_patch  YES @out"), return
-       $body->(@out);
+       $body->($patch, @out);
            },
            qw(for-each-ref --format), '%(objectname) %(refname)',
                qw(refs/topbloke-tips));