X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=migrate%2Fdebbugs-makeversions;h=fd70f2dcfb6262a3f810effa1334555bc0a41fb1;hb=ee73b48c52cedb53381b6c0291693fa1e2a66d2c;hp=dfc565b7c8c6063de09cfd74d66e4f2844c06333;hpb=79e24b055553a91bfae8596c304e77cb2a849f8a;p=debbugs.git diff --git a/migrate/debbugs-makeversions b/migrate/debbugs-makeversions index dfc565b..fd70f2d 100755 --- a/migrate/debbugs-makeversions +++ b/migrate/debbugs-makeversions @@ -3,13 +3,24 @@ # guesswork, based on Version: pseudo-headers and closing mails that look # like Debian changelogs. The latter in particular is somewhat heuristic. -use strict; +# <@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'; + +require "$config_path/config"; +require "$lib_path/errorlib"; + use Debbugs::Log; use Debbugs::MIME; -if (@ARGV != 2) { +if (@ARGV != 1) { print <{body}}; ++$i) { last if $decoded->{body}[$i] !~ /^(\S+):\s*(.*)/; my ($fn, $fv) = (lc $1, $2); - next if $fn ne 'version'; - next if $fv !~ /^(\d[^,\s]*(?:[,\s]+|$))+/; - if ($closing) { - for my $v (split /[,\s]+/, $fv) { - push @fixed_versions, $v - unless exists $fixed_versions{$v}; - $fixed_versions{$v} = 1; - @found_versions = grep { $_ ne $v } @found_versions; - delete $found_versions{$v}; - } - } else { - for my $v (split /[,\s]+/, $fv) { - push @found_versions, $v - unless exists $found_versions{$v}; - $found_versions{$v} = 1; - @fixed_versions = grep { $_ ne $v } @fixed_versions; - delete $fixed_versions{$v}; - } + if ($fn eq 'source') { + $source = $fv; + } elsif ($fn eq 'source-version' and + $fv =~ /^(\d[^,\s]*(?:[,\s]+|$))+/) { + $sourcever = $fv; + } elsif ($fn eq 'version' and $fv =~ /^(\d[^,\s]*(?:[,\s]+|$))+/) { + # Deal with reportbug brain-damage. + next if $fv =~ /^unavailable/i; + $fv =~ s/;.*//; + $fv =~ s/ *\(.*\)//; + # Strip off other random junk at the end of a version. + $fv =~ s/ +[A-Za-z].*//; + $ver = $fv; + } + } + + my @parsedvers; + if (defined $ver) { + push @parsedvers, split /[,\s]+/, $ver; + } elsif (defined $source and defined $sourcever) { + push @parsedvers, map "$source/$_", split /[,\s]+/, $sourcever; + } + + if ($closing) { + for my $v (@parsedvers) { + push @fixed_versions, $v + unless exists $fixed_versions{$v}; + $fixed_versions{$v} = 1; + @found_versions = grep { $_ ne $v } @found_versions; + delete $found_versions{$v}; + } + } else { + for my $v (@parsedvers) { + push @found_versions, $v + unless exists $found_versions{$v}; + $found_versions{$v} = 1; + @fixed_versions = grep { $_ ne $v } @fixed_versions; + delete $fixed_versions{$v}; } } @@ -84,13 +115,13 @@ sub getbuginfo ($) # Look for Debian changelogs. for (; $i < @{$decoded->{body}}; ++$i) { if ($decoded->{body}[$i] =~ - /\S+ \(([^)]+)\) \S+; urgency=\S+/i) { - my $v = $1; - push @fixed_versions, $v - unless exists $fixed_versions{$v}; - $fixed_versions{$v} = 1; - @found_versions = grep { $_ ne $v } @found_versions; - delete $found_versions{$v}; + /(\w[-+0-9a-z.]+) \(([^\(\) \t]+)\) \S+; urgency=\S+/i) { + my ($p, $v) = ($1, $2); + push @fixed_versions, "$p/$v" + unless exists $fixed_versions{"$p/$v"}; + $fixed_versions{"$p/$v"} = 1; + @found_versions = grep { $_ ne "$p/$v" } @found_versions; + delete $found_versions{"$p/$v"}; last; } } @@ -111,11 +142,10 @@ sub mergeinto ($$) } } -my ($db, $verdb) = @ARGV[0, 1]; +chdir $gSpoolDir or die "Can't chdir $gSpoolDir: $!"; + +my $db = $ARGV[0]; opendir DB, $db or die "Can't opendir $db: $!"; -unless (-d $verdb) { - mkdir $verdb or die "Can't mkdir $verdb: $!"; -} while (defined(my $dir = readdir DB)) { next if $dir =~ /^\.\.?$/ or not -d "$db/$dir"; @@ -128,21 +158,34 @@ while (defined(my $dir = readdir DB)) { $bug =~ /(..)$/; my $bughash = $1; - next if -e "$verdb/$bughash/$bug.versions" and - (stat "$verdb/$bughash/$bug.versions")[9] >= - (stat "$db/$dir/$file")[9]; - open STATUS, "$db/$dir/$bug.status" or next; - for 1 .. 6; # done is field 7 - chomp (my $done = ); - ; # mergedwith is field 9 - chomp (my $mergedwith = ); - close STATUS; + print "Processing $bug ...\n" if $ENV{DEBBUGS_VERBOSE}; + + my ($locks, $status) = lockreadbugmerge($bug, $db); + unless (defined $status) { + unlockreadbugmerge($locks); + next; + } + + 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) { + unlockreadbugmerge($locks); + next; + } + } my ($found_versions, $fixed_versions) = getbuginfo("$db/$dir/$file"); - if (length $mergedwith) { - for my $merge (split ' ', $mergedwith) { + if (length $status->{mergedwith}) { + for my $merge (@merges) { $merge =~ /(..)$/; my $mergehash = $1; my ($mfound, $mfixed) = @@ -152,22 +195,22 @@ while (defined(my $dir = readdir DB)) { } } - @$fixed_versions = () unless length $done; - - for my $out ($bug, (split ' ', $mergedwith)) { - $out =~ /(..)$/; - my $outhash = $1; + @$fixed_versions = () unless length $status->{done}; - unless (-d "$verdb/$outhash") { - mkdir "$verdb/$outhash" or die "Can't mkdir $verdb/$outhash: $!"; + 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, $outstatus, $db, 2, 'disable bughook'); + if ($out != $bug) { + unfilelock(); } - - open VERSIONS, "> $verdb/$outhash/$out.versions" - or die "Can't open $verdb/$outhash/$out.versions: $!"; - print VERSIONS "Found-in: @$found_versions\n"; - print VERSIONS "Fixed-in: @$fixed_versions\n"; - close VERSIONS; } + + unlockreadbugmerge($locks); } closedir HASH;