]> git.donarmstrong.com Git - debbugs.git/blobdiff - migrate/debbugs-makeversions
fix inversion of date/versions in Debbugs::Status leading to negative times argument
[debbugs.git] / migrate / debbugs-makeversions
index 2891dfeba0f4e878b0a4627790a35d9666eae502..fd70f2dcfb6262a3f810effa1334555bc0a41fb1 100755 (executable)
@@ -3,6 +3,12 @@
 # guesswork, based on Version: pseudo-headers and closing mails that look
 # like Debian changelogs. The latter in particular is somewhat heuristic.
 
+# <@aj> Hackin' on the BTS, Feelin' like it'll take forever; Oh you better
+#       hold it's hand, when it dies on names so clever. These are the best
+#       bugs of our life. It's up to archive-slash-69, man we were killin'
+#       time, we were young and resltess, we needed to unwind. I guess
+#       nothin' can last forever - forever, no...
+
 my $config_path = '/etc/debbugs';
 my $lib_path = '/usr/lib/debbugs';
 
@@ -75,7 +81,7 @@ sub getbuginfo ($)
                $fv =~ s/;.*//;
                $fv =~ s/ *\(.*\)//;
                # Strip off other random junk at the end of a version.
-               $fv =~ s/ *[A-Za-z].*//;
+               $fv =~ s/ +[A-Za-z].*//;
                $ver = $fv;
            }
        }
@@ -136,17 +142,18 @@ sub mergeinto ($$)
     }
 }
 
+chdir $gSpoolDir or die "Can't chdir $gSpoolDir: $!";
+
 my $db = $ARGV[0];
-opendir DB, "$gSpoolDir/$db" or die "Can't opendir $db: $!";
+opendir DB, $db or die "Can't opendir $db: $!";
 
 while (defined(my $dir = readdir DB)) {
-    next if $dir =~ /^\.\.?$/ or not -d "$gSpoolDir/$db/$dir";
-    opendir HASH, "$gSpoolDir/$db/$dir"
-       or die "Can't opendir $gSpoolDir/$db/$dir: $!";
+    next if $dir =~ /^\.\.?$/ or not -d "$db/$dir";
+    opendir HASH, "$db/$dir" or die "Can't opendir $db/$dir: $!";
 
     while (defined(my $file = readdir HASH)) {
        next unless $file =~ /\.log$/;
-       next if -z "$gSpoolDir/$db/$dir/$file";
+       next if -z "$db/$dir/$file";
        (my $bug = $file) =~ s/\..*//;
 
        $bug =~ /(..)$/;
@@ -160,21 +167,29 @@ while (defined(my $dir = readdir DB)) {
            next;
        }
 
-       my ($found_versions, $fixed_versions) =
-           getbuginfo("$gSpoolDir/$db/$dir/$file");
+       if (@{$status->{found_versions}} or @{$status->{fixed_versions}}) {
+           unlockreadbugmerge($locks);
+           next;
+       }
 
+       my @merges = ();
+       # Only process the lowest of each set of merged bugs.
        if (length $status->{mergedwith}) {
            @merges = sort { $a <=> $b } split ' ', $status->{mergedwith};
            if ($merges[0] < $bug) {
-               # already processed
                unlockreadbugmerge($locks);
                next;
            }
+       }
+
+       my ($found_versions, $fixed_versions) = getbuginfo("$db/$dir/$file");
+
+       if (length $status->{mergedwith}) {
            for my $merge (@merges) {
                $merge =~ /(..)$/;
                my $mergehash = $1;
                my ($mfound, $mfixed) =
-                   getbuginfo("$gSpoolDir/$db/$mergehash/$merge.log");
+                   getbuginfo("$db/$mergehash/$merge.log");
                mergeinto($found_versions, $mfound);
                mergeinto($fixed_versions, $mfixed);
            }
@@ -182,14 +197,14 @@ while (defined(my $dir = readdir DB)) {
 
        @$fixed_versions = () unless length $status->{done};
 
-       for my $out ($bug, (split ' ', $status->{mergedwith})) {
+       for my $out ($bug, @merges) {
            if ($out != $bug) {
                filelock("lock/$out");
            }
            my $outstatus = readbug($out, $db);
            $outstatus->{found_versions} = [@$found_versions];
            $outstatus->{fixed_versions} = [@$fixed_versions];
-           writebug($out, $mergestatus);
+           writebug($out, $outstatus, $db, 2, 'disable bughook');
            if ($out != $bug) {
                unfilelock();
            }