chiark / gitweb /
fix a few bugs in THEORY
[topbloke.git] / tb-list.pl
index 1e952704a152cdf08da42eb617e51d1a5aaabe26..c23f6a00e58d394fd4604065e36d08b7195ed08e 100755 (executable)
@@ -59,11 +59,16 @@ our %patches;
 
 foreach_patch($relatedto || $leaves || !$spec ? { } : $spec, 
              $deleted || $deleted_only, 
-             [0, !!$leaves, 0, $toposort || !!$relatedto],
+             [qw(B_deps +included)],
              sub { 
-                 my ($patch,$parsedname,@info) = @_;
-                 $patches{$patch}{Info} = \@info;
+                 my ($patch,$parsedname,$meta) = @_;
+                 $patches{$patch}{Meta} = $meta;
                  $patches{$patch}{ParsedName} = $parsedname;
+                 $patches{$patch}{Deps} =
+                     grep { m/^[^-]/ } split /\n/, $meta->{'B_deps'};
+                 $patches{$patch}{Included} = { };
+                 $patches{$patch}{Included}{$_} = 1
+                     foreach split /\n/, $meta->{'+included'};
              });
 
 #----- selection -----
@@ -73,8 +78,8 @@ if ($leaves) {
     foreach my $p (keys %patches) {
        debug("leaves $p");
        my $v = $patches{$p};
-       next if $v->{Info}[0]{Deleted};
-       foreach my $dep (keys %{ $v->{Info}[1] }) {
+       next if defined $v->{Meta}{'deleted'};
+       foreach my $dep (@{ $v->{Deps} }) {
            debug("leaves $p $dep");
            next unless exists $patches{$dep};
            $patches{$dep}{NotLeaf} = 1;
@@ -86,7 +91,7 @@ if ($relatedto) {
     foreach my $p (keys %patches) {
        my $v = $patches{$p};
        # mark Related=1 if any patch matching $relatedto includes us
-       foreach my $dep (keys %{ $v->{Info}[3] }) {
+       foreach my $dep (keys %{ $v->{Included} }) {
            next unless exists $patches{$dep};
            my $depv = $patches{$dep};
            next unless patch_matches_spec($depv->{ParsedName}, $relatedto);
@@ -95,7 +100,7 @@ if ($relatedto) {
        }
        if (patch_matches_spec($v->{ParsedName}, $relatedto)) {
            # if we match $relatedto, mark all our inclusions as Related=1
-           foreach my $dep (keys %{ $v->{Info}[3] }) {
+           foreach my $dep (keys %{ $v->{Included} }) {
                next unless exists $patches{$dep};
                $patches{$dep}{Related} = 1;
            }
@@ -109,8 +114,8 @@ our @output;
 
 foreach my $p (keys %patches) {
     my $v = $patches{$p};
-    next if !$deleted && $v->{Info}[0]{Deleted};
-    next if $deleted_only && !$v->{Info}[0]{Deleted};
+    next if !$deleted && defined $v->{Meta}{'deleted'};
+    next if $deleted_only && !defined $v->{Meta}{'deleted'};
     next if $leaves && $v->{NotLeaf};
     next if $relatedto && !$v->{Related};
     next if $spec && !patch_matches_spec($v->{ParsedName}, $spec);
@@ -150,8 +155,8 @@ sub sortsub () {
            foreach my $ix (qw(0 1)) {
                my $ab = (qw(a b))[$ix];
                my $ba = (qw(b a))[$ix];
-               my $r = (qw(-1 1))[$ix];
-               $txt .= "    return $r if \$v${ab}->{Info}[3]{\$$ba};\n";
+               my $r = (qw(1 -1))[$ix];
+               $txt .= "    return $r if \$v${ab}->{Included}{\$$ba};\n";
            }
         } else {
            die $sort;
@@ -168,20 +173,30 @@ eval sortsub()." 1;" or die "$@ ?";
 #----- printing -----
 
 my $current_branch = current_branch();
-my $current_patch = $current_branch->{Kind} eq 'tip'
-    ? $current_branch->{Fullname} : '';
+my $current_patch = '';
+my $ifcurrent;
+if ($current_branch->{Kind} eq 'tip') {
+    $current_patch = $current_branch->{Fullname};
+    $ifcurrent = '>';
+} elsif ($current_branch->{Kind} eq 'base') {
+    $current_patch = $current_branch->{Fullname};
+    $ifcurrent = '#';
+}
 
 foreach my $p (@output) {
     my $v = $patches{$p};
     my $pa = $v->{ParsedName};
     my ($msgkind, $msg) = git_get_object("$pa->{Ref}:.topbloke/msg");
-    die "$p $msgkind ?" unless $msgkind eq 'blob';
+    if ($msgkind ne 'blob') {
+       warn "$p $msgkind ?";
+       next;
+    }
     my $subject =
        $msg =~ m/^Subject:\s*(?:\[[^][]*\]\s*)?(.*\S)\s*$/mi
        ? $1 : "[no subject]";  
     printf("%1s%1s %s\@%s/%s/%-20s %s\n",
-          $p eq $current_patch ? '>' : '',
-          $v->{Info}[0]{Deleted} ? 'D' : '',
+          $p eq $current_patch ? $ifcurrent : '',
+          defined $v->{Meta}{'deleted'} ? 'D' : '',
           $pa->{Email}, $pa->{Domain}, $pa->{Date}, $pa->{Nick},
           $subject)
        or die $!;