X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=blobdiff_plain;f=tb-list.pl;h=8fc3c3bd8784067feb62c4fb4b604904461c61e7;hp=e1fea3981c919b894943e03a36492730a8131025;hb=2799df8533bddff6feeee7c1b9d31cc6583e04f9;hpb=63df00008c476657609d9fb6d4cd23bc74238a09;ds=sidebyside diff --git a/tb-list.pl b/tb-list.pl index e1fea39..8fc3c3b 100755 --- a/tb-list.pl +++ b/tb-list.pl @@ -8,18 +8,28 @@ use strict; use Getopt::Long; use Topbloke; +#----- option parsing ----- + Getopt::Long::Configure(qw(bundling)); our $deleted=0; our $deleted_only=0; our $current=0; -our $relatedto=0; +our $relatedto; our $leaves=0; our $sort=''; GetOptions("d|deleted!" => \$deleted, # including deleted patches "deleted-only!" => \$deleted_only, # only deleted patches - "r|related=s" => \$relatedto, # only patches related to this one + "r|related=s" => sub { # only patches related to that + $relatedto = parse_patch_spec($_[1]); + }, + "c|related-current" => sub { # only patches related to current + my $current_branch = current_branch(); + die "-c only permitted when on a topbloke branch\n" + unless $current_branch->{Kind} =~ m/^(?:tip|base)$/; + $relatedto = $current_branch; + }, "l|last|leaf|leaves" => \$leaves, # only leaf patches "sort=s" => \$sort, ) or die "bad options\n"; @@ -43,24 +53,34 @@ foreach $sort (@sort) { $toposort=1 if $sort eq $toposort; } -$relatedto = $relatedto ? parse_patch_spec($relatedto) : undef; +#----- list patches ----- 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 ----- + if ($leaves) { + debug("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; } @@ -71,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); @@ -80,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; } @@ -94,14 +114,16 @@ 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); push @output, $p; } +#----- sorting ----- + sub sortsub () { my $txt = "sub sort_cmp {\n my \$r;\n"; debug("@sort"); @@ -133,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; @@ -148,11 +170,18 @@ eval sortsub()." 1;" or die "$@ ?"; @output = sort sort_cmp @output; -use Data::Dumper; +#----- 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}; @@ -163,8 +192,8 @@ foreach my $p (@output) { $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 $!;