]> git.donarmstrong.com Git - bugscan.git/blobdiff - scanlib.pm
Store taginfo and relinfo in a hash instead of a string. This is probably
[bugscan.git] / scanlib.pm
index 4c97a1c690c25d4fbd5f968a0030d9b49af0eddf..c52291eb18cfa989b6bc9cbc0cae619f06a73dc7 100644 (file)
@@ -6,13 +6,11 @@
 # which was based on an unknown other script.
 #
 # Global variables:
-#   %comments       - map from bugnumber to bug description
 #   %premature      - list of prematurely closed bugreports
 #   %exclude        - list of bugreports to exclude from the report
 #   %maintainer     - map from packagename to maintainer
 #   %section        - map from packagename to section in the FTP-site
 #   %packagelist    - map from packagename to bugreports
-#   %NMU            - map with NMU information
 
 use lib qw(/org/bugs.debian.org/perl);
 use LWP::UserAgent;
@@ -26,43 +24,7 @@ use warnings;
 require bugcfg;
 package scanlib;
 
-our (%comments,%premature,%exclude,%maintainer,%section,%packagelist,%NMU,%debbugssection,%bugs);
-
-sub readcomments() {
-# Read bug commentary 
-# It is in paragraph format, with the first line of each paragraph being
-# the bug number or package name to which the comment applies.
-# Prefix a bug number with a * to force it to be listed even if it's closed.
-# (This deals with prematurely closed bugs)
-
-       my $index;                                      # Bug-number for current comment
-       my $file;                                       # Name of comments-file
-
-       %comments = ();                                 # Initialize our data
-       %premature = ();
-       %exclude = ();
-       $file=shift;
-       open(C, $file) or die "open $file: $!\n";
-       while (<C>) {
-               chomp;
-               if (m/^\s*$/) {                         # Check for paragraph-breaks
-                       undef $index;
-               } elsif (defined $index) {
-                       $comments{$index} .= $_ . "\n";
-               } else {
-                       if (s/^\*//) {                  # Test & remove initial *
-                               $premature{$_} = 1;
-                       }
-                       if (s/\s+EXCLUDE\s*//) {        # Test & remove EXCLUDE
-                               $exclude{$_} = 1;
-                               next;
-                       }
-                       $index = $_;
-                       $comments{$index} = ''; # New comment, initialize data
-               }
-       }
-       close(C);
-}
+our (%premature,%exclude,%maintainer,%section,%packagelist,%debbugssection,%bugs);
 
 
 # Read the list of maintainer 
@@ -215,57 +177,56 @@ sub scanspooldir() {
                $disttags{'testing'}      = grep(/^etch$/, @tags);
                $disttags{'unstable'}     = grep(/^sid$/, @tags);
                $disttags{'experimental'} = grep(/^experimental$/, @tags);
-
+                       
                # default according to dondelelcaro 2006-11-11
                if (!$disttags{'oldstable'} && !$disttags{'stable'} && !$disttags{'testing'} && !$disttags{'unstable'} && !$disttags{'experimental'}) {
                        $disttags{'testing'} = 1;
                        $disttags{'unstable'} = 1;
                        $disttags{'experimental'} = 1;
                }
-
-               # only bother to check the versioning status for the distributions indicated by the tags 
-               my $relinfo = "";
-               for my $dist qw(oldstable stable testing unstable experimental) {
-                       local $SIG{__WARN__} = sub {};
-
-                       next if (!$disttags{$dist});
-
-                       # only check for the archs we care about
-                       my %svhash = ();
-                       for my $arch qw(alpha amd64 arm hppa i386 ia64 mips mipsel powerpc s390 sparc) {
-                               my @versions = Debbugs::Packages::getversions($bug->{'package'}, $dist, $arch);
-                               my @sourceversions = Debbugs::Packages::makesourceversions($bug->{'package'}, $arch, @versions);
-
-                               for my $sv (@sourceversions) {
-                                       $svhash{$sv} = 1;
+               
+               my $bi = {};
+               if (defined($section{$bug->{'package'}}) && $section{$bug->{'package'}} eq 'pseudo') {
+                       # versioning information makes no sense for pseudo packages,
+                       # just use the tags
+                       for my $dist qw(oldstable stable testing unstable experimental) {
+                               $bi->{$dist} = $disttags{$dist};
+                       }
+                       next if (length($bug->{'done'}));
+               } else {
+                       my $affects_any = 0;
+               
+                       # only bother to check the versioning status for the distributions indicated by the tags 
+                       for my $dist qw(oldstable stable testing unstable experimental) {
+                               local $SIG{__WARN__} = sub {};
+
+                               $bi->{$dist} = 0;
+                               next if (!$disttags{$dist});
+
+                               my $presence = Debbugs::Status::bug_presence(
+                                       bug => $f, 
+                                       status => $bug, 
+                                       dist => $dist, 
+                                       arch => \@bugcfg::architectures
+                               );
+
+                               # ignore bugs that are absent/fixed in this distribution, include everything
+                               # else (that is, "found" which says that the bug is present, and undef, which
+                               # indicates that no versioning information is present and it's not closed
+                               # unversioned)
+                               if (!defined($presence) || ($presence ne 'absent' && $presence ne 'fixed')) {
+                                       $bi->{$dist} = 1;
+                                       $affects_any = 1;
                                }
                        }
+                       
+                       next if !$affects_any and not $premature{$f};
+                       $premature{$f}++ if !$affects_any;
+               }
 
-                       my @sourceversions = keys %svhash;
-                       my $presence = Debbugs::Status::bug_presence(bug => $f, status => $bug, sourceversions => \@sourceversions);
-
-                       # ignore bugs that are absent/fixed in this distribution, include everything
-                       # else (that is, "found" which says that the bug is present, and undef, which
-                       # indicates that no versioning information is present and it's not closed
-                       # unversioned)
-                       if (!defined($presence) || ($presence ne 'absent' && $presence ne 'fixed')) {
-                               $relinfo .= uc(substr($dist, 0, 1));
-                       }
+               for my $keyword qw(pending patch help moreinfo unreproducible security upstream etch-ignore) {
+                       $bi->{$keyword} = ($bug->{'keywords'} =~ /\b$keyword\b/) ? 1 : 0;
                }
-               
-               next if $relinfo eq '' and not $premature{$f};
-               $premature{$f}++ if $relinfo eq '';
-
-               $taginfo = "[";
-               $taginfo .= ($bug->{'keywords'} =~ /\bpending\b/        ? "P" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\bpatch\b/          ? "+" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\bhelp\b/           ? "H" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\bmoreinfo\b/       ? "M" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\bunreproducible\b/ ? "R" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\bsecurity\b/       ? "S" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\bupstream\b/       ? "U" : " ");
-               $taginfo .= ($bug->{'keywords'} =~ /\betch-ignore\b/    ? "I" : " ");
-               $taginfo .= "]";
 
                if (length($bug->{'mergedwith'})) {
                        my @merged = split(' ', $bug->{'mergedwith'});
@@ -274,24 +235,13 @@ sub scanspooldir() {
 
                for my $package (split /[,\s]+/, $bug->{'package'}) {
                        $_= $package; y/A-Z/a-z/; $_= $` if m/[^-+._a-z0-9]/;
-                       if (not defined $section{$_}) {
-                               if (defined $debbugssection{$_}) {
-                                       $relinfo .= "X";
-                               } else {
-                                       next;   # Skip unavailable packages
-                               }
-                       }
-
                        push @{$packagelist{$_}}, $f;
                }
 
-               if ($relinfo eq "") { # or $relinfo eq "U" # confuses e.g. #210306
-                       $relinfo = "";
-               } else {
-                       $relinfo = " [$relinfo]";
-               }
+               my $taginfo = get_taginfo($bi);
+               my $relinfo = get_relinfo($bi);
 
-               $bugs{$f} = "$f $taginfo$relinfo " . $bug->{'subject'};
+               $bugs{$f} = "$f [$taginfo] [$relinfo] " . $bug->{'subject'};
        }
 }
 
@@ -323,39 +273,6 @@ sub readstatus() {
 }
 
 
-sub readNMUstatus() {
-       my $bug;       # Number of current bug
-       my $source;    # Source upload which closes this bug.
-       my $version;   # Version where this bug was closed.
-       my $flag;      # Whether this paragraph has been processed.
-       my ($field, $value);
-
-       for (split /\n/, LWP::UserAgent->new->request(HTTP::Request->new(GET => shift))->content) {
-               chomp;
-               if (m/^$/) {
-                       $NMU{$bug} = 1;
-                       $NMU{$bug, "source"} = $source;
-                       $NMU{$bug, "version"} = $version;
-#                      $comments{$bug} .= "[FIXED] Fixed package $source is in Incoming\n";
-                       $flag = 0;
-               } else {
-                       ($field, $value) = split(/: /, $_, 2);
-                       $bug = $value if($field =~ /bug/i);
-                       $source = $value if($field =~ /source/i);
-                       $version = $value if($field =~ /version/i);
-                       $flag = 1;
-               }
-       }
-       if ($flag) {
-               $NMU{$bug} = 1;
-               $NMU{$bug, "source"} = $source;
-               $NMU{$bug, "version"} = $version;
-#              $comments{$bug} .= "[FIXED] Fixed package $source in in Incoming\n";
-       }
-       close P;
-}
-
-
 sub urlsanit {
        my $url = shift;
        $url =~ s/%/%25/g;
@@ -374,12 +291,9 @@ sub htmlsanit {
 
 sub wwwnumber() {
        my $number = shift;             # Number of bug to html-ize
-#      my $section);                           # Section for the bug
 
        "<A HREF=\"http://bugs.debian.org/cgi-bin/bugreport.cgi?archive=no&amp;bug=" .
                urlsanit($number) . '">' . htmlsanit($number) . '</A>';
-#      ($section=$number) =~ s/([0-9]{2}).*/$1/;
-#      "<A HREF=\"${btsURL}/db/$section/$number.html\">$number</A>";
 }
 
 sub wwwname() {
@@ -387,18 +301,53 @@ sub wwwname() {
 
        "<A HREF=\"http://bugs.debian.org/cgi-bin/pkgreport.cgi?archive=no&amp;pkg=" .
                urlsanit($name) . '">' . htmlsanit($name) . '</A>';
-#      "<A HREF=\"${btsURL}/db/pa/l$name.html\">$name</A>";
 }
 
 sub check_worry {
        my ($status) = @_;
 
        if ($status =~ m/^\[[^]]*I/ or
-           $status =~ m/ \[[^]]*X/ or
-            ($status =~ m/ \[[^]]*[OSUE]/ and $status !~ m/ \[[^]]*T/)) {
+            $status !~ m/ \[[^]]*T/) {
+               return 0;
+       }
+       return 1;
+}
+
+sub check_worry_stable {
+       my ($status) = @_;
+
+       if ($status !~ m/ \[[^]]*S/) {
                return 0;
        }
        return 1;
 }
 
+sub get_taginfo {
+    my $bi = shift;
+
+       my $taginfo = "";
+       $taginfo .= $bi->{'pending'}        ? "P" : " ";
+       $taginfo .= $bi->{'patch'}          ? "+" : " ";
+       $taginfo .= $bi->{'help'}           ? "H" : " ";
+       $taginfo .= $bi->{'moreinfo'}       ? "M" : " ";
+       $taginfo .= $bi->{'unreproducible'} ? "R" : " ";
+       $taginfo .= $bi->{'security'}       ? "S" : " ";
+       $taginfo .= $bi->{'upstream'}       ? "U" : " ";
+       $taginfo .= $bi->{'etch-ignore'}    ? "I" : " ";
+
+       return $taginfo;
+}
+
+sub get_relinfo {
+    my $bi = shift;
+
+    my $relinfo = "";
+       for my $dist qw(oldstable stable testing unstable experimental) {
+           $relinfo .= uc(substr($dist, 0, 1)) if $bi->{$dist};
+       }
+
+       return $relinfo;
+}
+
+
 1;