From dda4ac413007e12639f709e8e1a41c3583e78e36 Mon Sep 17 00:00:00 2001 From: Don Armstrong Date: Wed, 20 Mar 2013 07:31:12 -0700 Subject: [PATCH] add rebuild index support --- Debbugs/Status.pm | 49 ++++++++++---- bin/debbugs-rebuild-index.db | 26 ++++--- t/15_rebuild_indexdb.t | 128 +++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 27 deletions(-) create mode 100644 t/15_rebuild_indexdb.t diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index 9c9551b..76dab74 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -70,6 +70,7 @@ BEGIN{ qw(removefoundversions removefixedversions) ], hook => [qw(bughook bughook_archive)], + indexdb => [qw(generate_index_db_line)], fields => [qw(%fields)], ); @EXPORT_OK = (); @@ -1599,6 +1600,40 @@ sub isstrongseverity { return grep { $_ eq $severity } @{$config{strong_severities}}; } +=head1 indexdb + +=head2 generate_index_db_line + + my $data = read_bug(bug => $bug, + location => $initialdir); + # generate_index_db_line hasn't been written yet at all. + my $line = generate_index_db_line($data); + +Returns a line for a bug suitable to be written out to index.db. + +=cut + +sub generate_index_db_line { + my ($data) = @_; + + # just in case someone has given us a split out data + $data = join_status_fields($data); + + my $whendone = "open"; + my $severity = $config{default_severity}; + (my $pkglist = $data->{package}) =~ s/[,\s]+/,/g; + $pkglist =~ s/^,+//; + $pkglist =~ s/,+$//; + $whendone = "forwarded" if defined $data->{forwarded} and length $data->{forwarded}; + $whendone = "done" if defined $data->{done} and length $data->{done}; + $severity = $data->{severity} if length $data->{severity}; + + return sprintf "%s %d %d %s [%s] %s %s\n", + $pkglist, $data->{bug_num}, $data->{date}, $whendone, + $data->{originator}, $severity, $data->{keywords}; +} + + =head1 PRIVATE FUNCTIONS @@ -1681,19 +1716,7 @@ sub bughook { my $data = $bugs_temp{$bug}; appendfile("$config{spool_dir}/debbugs.trace","$type $bug\n",makestatus($data, 1)); - my $whendone = "open"; - my $severity = $config{default_severity}; - (my $pkglist = $data->{package}) =~ s/[,\s]+/,/g; - $pkglist =~ s/^,+//; - $pkglist =~ s/,+$//; - $whendone = "forwarded" if defined $data->{forwarded} and length $data->{forwarded}; - $whendone = "done" if defined $data->{done} and length $data->{done}; - $severity = $data->{severity} if length $data->{severity}; - - my $k = sprintf "%s %d %d %s [%s] %s %s\n", - $pkglist, $bug, $data->{date}, $whendone, - $data->{originator}, $severity, $data->{keywords}; - $bugs{$bug} = $k; + $bugs{$bug} = generate_index_db_line($data); } update_realtime("$config{spool_dir}/index.db.realtime", %bugs); diff --git a/bin/debbugs-rebuild-index.db b/bin/debbugs-rebuild-index.db index 6523ef4..49b925b 100755 --- a/bin/debbugs-rebuild-index.db +++ b/bin/debbugs-rebuild-index.db @@ -66,13 +66,7 @@ use vars qw($DEBUG); use Debbugs::Common qw(checkpid lockpid get_hashname getparsedaddrs getbugcomponent make_list); use Debbugs::Config qw(:config); -use Debbugs::Status qw(read_bug split_status_fields); -use Debbugs::Log; -use Debbugs::DB; -use Debbugs::DB::Load qw(load_bug handle_load_bug_queue); -use DateTime; -use File::stat; - +use Debbugs::Status qw(read_bug split_status_fields generate_index_db_line); my %options = (debug => 0, help => 0, @@ -119,14 +113,14 @@ if (not lockpid($config{spool_dir}.'/lock/debbugs-rebuild-index.db')) { exit 1; } -my $time = 0; -my $start_time = time; +my $file = "index.${initialdir}.realtime"; +my $idx_rebuild = IO::File->new($file.'.rebuild','w') + or die "Couldn't open ${file}.rebuild: $!"; my @dirs = ($initialdir); my $cnt = 0; -my %tags; -my %queue; +my %bugs; while (my $dir = shift @dirs) { printf "Doing dir %s ...\n", $dir if $verbose; @@ -146,10 +140,14 @@ while (my $dir = shift @dirs) { } my $data = read_bug(bug => $bug, location => $initialdir); - # generate_index.db_line hasn't been written yet at all. - my $line = generate_index.db_line($data); - print {$index_db} $line; + my $line = generate_index_db_line($data); + $bugs{$bug} = $line; } } +binmode($idx_rebuild,':raw:encoding(UTF-8)'); +print {$idx_rebuild} $bugs{$_} foreach sort keys %bugs; +close($idx_rebuild); +rename("$file.rebuild", $file); + __END__ diff --git a/t/15_rebuild_indexdb.t b/t/15_rebuild_indexdb.t new file mode 100644 index 0000000..a3036ec --- /dev/null +++ b/t/15_rebuild_indexdb.t @@ -0,0 +1,128 @@ +# -*- mode: cperl;-*- + +use Test::More tests => 9; + +use warnings; +use strict; + +use utf8; + +# Here, we're going to shoot messages through a set of things that can +# happen. + +# First, we're going to send mesages to receive. +# To do so, we'll first send a message to submit, +# then send messages to the newly created bugnumber. + +use IO::File; +use File::Temp qw(tempdir); +use Cwd qw(getcwd); +use Debbugs::MIME qw(create_mime_message); +use File::Basename qw(dirname basename); +# The test functions are placed here to make things easier +use lib qw(t/lib); +use DebbugsTest qw(:all); +use Data::Dumper; +use Encode qw(decode encode decode_utf8 encode_utf8); + +# HTTP::Server:::Simple defines a SIG{CHLD} handler that breaks system; undef it here. +$SIG{CHLD} = sub {}; +my %config; +eval { + %config = create_debbugs_configuration(debug => exists $ENV{DEBUG}?$ENV{DEBUG}:0); +}; +if ($@) { + BAIL_OUT($@); +} + +my $sendmail_dir = $config{sendmail_dir}; +my $spool_dir = $config{spool_dir}; +my $config_dir = $config{config_dir}; + +END{ + if ($ENV{DEBUG}) { + diag("spool_dir: $spool_dir\n"); + diag("config_dir: $config_dir\n"); + diag("sendmail_dir: $sendmail_dir\n"); + } +} + +# We're going to use create mime message to create these messages, and +# then just send them to receive. + +send_message(to=>'submit@bugs.something', + headers => [To => 'submit@bugs.something', + From => 'föoff@bugs.something', + Subject => 'Submiting a bug', + ], + body => < [{Type=>"text/plain",Charset=>"utf-8",Data=>< '1@bugs.something', + headers => [To => '1@bugs.something', + From => 'föoff@bugs.something', + Subject => 'Sending a message to a bug', + ], + body => < 'control@bugs.something', + headers => [To => 'control@bugs.something', + From => 'föoff@bugs.something', + Subject => 'Munging a bug', + ], + body => <