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";
$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;
}
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);
}
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;
}
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");
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;
@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};
$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 $!;