]> git.donarmstrong.com Git - debbugs.git/blobdiff - bin/add_bug_to_estraier
allow specifying the dist in source_to_binary (for DB actions)
[debbugs.git] / bin / add_bug_to_estraier
index e27f8782393dfb71045f9e6574d97409e79963fe..a83699abc61af0016711e3db00c7113d52988247 100755 (executable)
@@ -16,13 +16,20 @@ use Pod::Usage;
 
 =head1 NAME
 
-add_bug_to_estraier
+add_bug_to_estraier -- add a bug log to an estraier database
 
 =head1 SYNOPSIS
 
 add_bug_to_estraier [options] < list_of_bugs_to_add
 
  Options:
+  --url, -u url to estraier node
+  --user, -U user to log into the estraier node
+  --pass, -P password for the estraier node
+  --spool, -s spool location
+  --conf, -c addbug configuration file
+  --cron add all bugs to estraier
+  --timestamp bug timestamp file
   --debug, -d debugging level (Default 0)
   --help, -h display this help
   --man, -m display manual
@@ -81,16 +88,24 @@ Display this manual.
 
   test_bts --bug 7 --host donbugs.donarmstrong.com
 
+=head1 DATABASE CREATION
+
+estcmd create -si -xh3 -attr status str -attr subject str \
+    -attr date num -attr submitter str -attr package str \
+    -attr severity str -attr tags str bts
+
 
 =cut
 
 
+use Debbugs::Config qw(:globals);
 use Debbugs::Mail qw(send_mail_message);
 use Debbugs::MIME qw(create_mime_message);
 
 use Search::Estraier;
 use Debbugs::Estraier qw(:add);
 use File::Find;
+use File::stat;
 
 use vars qw($DEBUG $VERBOSE);
 
@@ -127,7 +142,7 @@ else {
          chomp;
          next if /^\s*\#/;
          my ($key,$value) = split /\s*[:=]\s*/,$_,2;
-         $options{$key} = $value if not defined $options{$key};
+         $options{$key} = $value if defined $key and not defined $options{$key};
      }
      $ERRORS .= "url must be set\n" if not defined $options{url};
      $ERRORS .= "user must be set\n" if not defined $options{user};
@@ -143,18 +158,21 @@ pod2usage({verbose=>2}) if $options{man};
 
 $DEBUG = $options{debug};
 
+$Debbugs::Estraier::DEBUG = $DEBUG;
 $VERBOSE = 0;
 
 my $node =  new Search::Estraier::Node (url    => $options{url},
                                        user   => $options{user},
                                        passwd => $options{passwd},
                                       );
-$Debbugs::Config::gSpoolDir = $options{spool} if defined $options{spool};
+$gSpoolDir = $options{spool} if defined $options{spool};
 
 if ($options{cron}) {
      my %timestamps;
      my $start_time = time;
+     my $unlink = 0;
      my %seen_dirs;
+     check_pid($options{timestamp});
      # read timestamp file
      if (defined $options{timestamp}) {
          my $timestamp_fh = new IO::File $options{timestamp},'r' or
@@ -165,30 +183,41 @@ if ($options{cron}) {
               $timestamps{$key} = $value;
          }
      }
-     find(sub {
-              print STDERR "Examining $_\n" if $DEBUG;
-              return if not /^(\d+)\.log$/;
-              my $bug_num = $1;
-              my $stat = stat $_ or next;
-              return unless -f _;
-              return if exists $timestamps{$File::Find::dir} and
-                   $timestamps{$File::Find::dir} > $stat->mtime;
-              $seen_dirs{$File::Find::dir} = $start_time;
-              add_bug_log($node,$1);
-         },
-         map {(-d "$options{spool}/$_")?"$options{spool}/$_":()}
-         qw(db-h archived db),
-        );
-     # write timestamp file
-     if (defined $options{timestamp}) {
-         %timestamps = (%timestamps,%seen_dirs);
-         my $timestamp_fh = new IO::File $options{timestamp},'w' or
-              die "Unable to open timestamp $options{timestamp}: $!";
-         foreach my $key (keys %timestamps) {
-              print {$timestamp_fh} $key,' ',
-                   $timestamps{$key}||'',qq(\n);
+     for my $hash (map {sprintf '%02d',$_ } 0..99) {
+         find(sub {
+                   print STDERR "Examining $_\n" if $DEBUG > 1;
+                   return if not /^(\d+)\.log$/;
+                   my $bug_num = $1;
+                   my $stat = stat $_ or next;
+                   return unless -f _;
+                   return if exists $timestamps{$File::Find::dir} and
+                        ($timestamps{$File::Find::dir} > $stat->mtime);
+                   $seen_dirs{$File::Find::dir} = $start_time;
+                   print STDERR "Adding $bug_num\n" if $DEBUG;
+                   my $max_message = 0;
+                   eval{
+                        $max_message = add_bug_log($node,$bug_num);
+                   };
+                   if ($@) {
+                        print STDERR "Adding $bug_num failed with $@\n";
+                   }
+              },
+              map {(-d "$options{spool}/$_/$hash")?
+                        "$options{spool}/$_/$hash":()}
+              qw(db-h archive),
+             );
+         # write timestamp file
+         if (defined $options{timestamp}) {
+              %timestamps = (%timestamps,%seen_dirs);
+              my $timestamp_fh = new IO::File $options{timestamp},'w' or
+                   die "Unable to open timestamp $options{timestamp}: $!";
+              foreach my $key (keys %timestamps) {
+                   print {$timestamp_fh} $key,' ',
+                        $timestamps{$key}||'',qq(\n);
+              }
          }
      }
+     unlink("$options{timestamp}.pid");
 }
 else {
      while (my $bug_num = <STDIN>) {
@@ -198,5 +227,20 @@ else {
 }
 
 
+sub check_pid{
+     my ($timestamp) = @_;
+     if (-e "${timestamp}.pid") {
+         my $time_fh = new IO::File  "${timestamp}.pid", 'r' or die "Unable to read pidfile";
+         local $/;
+         my $pid = <$time_fh>;
+         if (kill(0,$pid)) {
+              print STDERR "Another cron is running" and exit 0;
+         }
+     }
+     my $time_fh = new IO::File  "${timestamp}.pid", 'w' or
+         die "Unable to read pidfile";
+     print {$time_fh} $$;
+}
+
 
 __END__