2 # debbugs-rebuild-index.db is part of debbugs, and is released
3 # under the terms of the GPL version 2, or any later version, at your
4 # option. See the file README and COPYING for more information.
5 # Copyright 2012 by Don Armstrong <don@donarmstrong.com>.
11 use Getopt::Long qw(:config no_ignore_case);
16 debbugs-rebuild-index.db -- rebuild Debbug's index.db
20 debbugs-rebuild-index.db [options]
23 --spool-dir debbugs spool directory
24 --debug, -d debugging level (Default 0)
25 --help, -h display this help
26 --man, -m display manual
34 Debbugs spool directory; defaults to the value configured in the
35 debbugs configuration file.
43 Display brief useage information.
53 Rebuild the index.db for db-h.
55 debbugs-rebuild-index.db;
57 Rebuild the index.db for archive
59 debbugs-rebuild-index.db archive;
67 use Debbugs::Common qw(checkpid lockpid get_hashname getparsedaddrs getbugcomponent make_list);
68 use Debbugs::Config qw(:config);
69 use Debbugs::Status qw(read_bug split_status_fields);
72 use Debbugs::DB::Load qw(load_bug handle_load_bug_queue);
77 my %options = (debug => 0,
91 'spool_dir|spool-dir=s',
92 'debug|d+','help|h|?','man|m');
94 pod2usage() if $options{help};
95 pod2usage({verbose=>2}) if $options{man};
97 $DEBUG = $options{debug};
100 $options{verbose} = $options{verbose} - $options{quiet};
102 pod2usage(join("\n",@USAGE_ERRORS)) if @USAGE_ERRORS;
104 if (exists $options{spool_dir} and defined $options{spool_dir}) {
105 $config{spool_dir} = $options{spool_dir};
107 chdir($config{spool_dir}) or die "chdir $config{spool_dir} failed: $!";
109 my $verbose = $options{debug};
111 my $initialdir = "db-h";
113 if (defined $ARGV[0] and $ARGV[0] eq "archive") {
114 $initialdir = "archive";
117 if (not lockpid($config{spool_dir}.'/lock/debbugs-rebuild-index.db')) {
118 print STDERR "Another debbugs-rebuild-index.db is running; stopping\n";
123 my $start_time = time;
126 my @dirs = ($initialdir);
130 while (my $dir = shift @dirs) {
131 printf "Doing dir %s ...\n", $dir if $verbose;
133 opendir(DIR, "$dir/.") or die "opendir $dir: $!";
134 my @subdirs = readdir(DIR);
137 my @list = map { m/^(\d+)\.summary$/?($1):() } @subdirs;
138 push @dirs, map { m/^(\d+)$/ && -d "$dir/$1"?("$dir/$1"):() } @subdirs;
140 for my $bug (@list) {
141 print "Up to $cnt bugs...\n" if (++$cnt % 100 == 0 && $verbose);
142 my $stat = stat(getbugcomponent($bug,'summary',$initialdir));
143 if (not defined $stat) {
144 print STDERR "Unable to stat $bug $!\n";
147 my $data = read_bug(bug => $bug,
148 location => $initialdir);
149 # generate_index.db_line hasn't been written yet at all.
150 my $line = generate_index.db_line($data);
151 print {$index_db} $line;