From 73337e7e6ecebf85306741ff4c1bc34c3fccc90f Mon Sep 17 00:00:00 2001 From: Don Armstrong Date: Fri, 20 Feb 2015 23:45:18 -0800 Subject: [PATCH 1/1] support or matching in fields in usercategories --- Debbugs/CGI/Pkgreport.pm | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/Debbugs/CGI/Pkgreport.pm b/Debbugs/CGI/Pkgreport.pm index 8c217d7..4664eff 100644 --- a/Debbugs/CGI/Pkgreport.pm +++ b/Debbugs/CGI/Pkgreport.pm @@ -469,19 +469,30 @@ sub get_bug_order_index { for my $el (@${order}) { $pos++; - my $match = 1; - for my $item (split /[+]/, $el) { - my ($f, $v) = split /=/, $item, 2; - next unless (defined $f and defined $v); - my $isokay = 0; - $isokay = 1 if (defined $status->{$f} and $v eq $status->{$f}); - $isokay = 1 if ($f eq "tag" && defined $tags{$v}); - unless ($isokay) { - $match = 0; - last; - } - } - if ($match) { + my $match = 0; + my $first_field = 1; # true if no previous fields have been + # checked + while ($el =~ /(?^|\+|,)(?[^=]+)=(?[^=,\+])/) { + my ($j,$f,$v) = @+{qw(joiner field value)}; + if (not defined $j) { + $j = '+'; + } + if ($j eq '+' and $first_field) { + $match = 1; + } + my $isokay = 0; + $isokay = 1 if (defined $status->{$f} and $v eq $status->{$f}); + $isokay = 1 if ($f eq "tag" && defined $tags{$v}); + if ($j eq ',') { + $match ||= $isokay; + } else { + $match &&= $isokay; + } + $first_field = 0; + } + # if there is a match, or if there were no fields to check, + # this usertag matched. + if ($match || $first_field) { return $pos; last; } -- 2.39.2