]> git.donarmstrong.com Git - debbugs.git/blobdiff - bin/debbugs-loadsql
if the upload date is not defined, update it
[debbugs.git] / bin / debbugs-loadsql
index b63fdf3cf2774d91e85db1e490c33986ec794e1b..b1140794d08177390d60882b2527b2a1ec7a3e8f 100755 (executable)
@@ -115,22 +115,21 @@ my %options =
      verbose         => 0,
      quiet           => 0,
      quick           => 0,
-     service         => 'debbugs',
+     service         => $config{debbugs_db},
      progress        => 0,
     );
 
-my $gop = Getopt::Long::Parser->new();
-$gop->configure('pass_through');
-$gop->getoptions(\%options,
-                 'quick|q',
-                 'service|s',
-                 'sysconfdir|c',
-                 'progress!',
-                 'spool_dir|spool-dir=s',
-                 'verbose|v+',
-                 'quiet+',
-                 'debug|d+','help|h|?','man|m');
-$gop->getoptions('default');
+Getopt::Long::Configure('pass_through');
+GetOptions(\%options,
+           'quick|q',
+           'service|s=s',
+           'sysconfdir|c=s',
+           'progress!',
+           'spool_dir|spool-dir=s',
+           'verbose|v+',
+           'quiet+',
+           'debug|d+','help|h|?','man|m');
+Getopt::Long::Configure('default');
 
 pod2usage() if $options{help};
 pod2usage({verbose=>2}) if $options{man};
@@ -148,6 +147,8 @@ my %subcommands =
                       },
      'configuration' => {function => \&add_configuration,
                         },
+     'suites' => {function => \&add_suites,
+                 },
      'logs' => {function => \&add_logs,
                },
      'help' => {function => sub {pod2usage({verbose => 2});}}
@@ -184,9 +185,17 @@ if ($options{progress}) {
 
 
 my ($subcommand) = shift @ARGV;
+if (not defined $subcommand) {
+    $subcommand = 'help';
+    print STDERR "You must provide a subcommand; displaying usage.\n";
+    pod2usage();
+} elsif (not exists $subcommands{$subcommand}) {
+    print STDERR "$subcommand is not a valid subcommand; displaying usage.\n";
+    pod2usage();
+}
 
 my $opts =
-    handle_subcommand_arguments(\@ARGV,$subcommands{$subcommand}{arguments},$gop);
+    handle_subcommand_arguments(\@ARGV,$subcommands{$subcommand}{arguments});
 $subcommands{$subcommand}{function}->(\%options,$opts,$prog_bar,\%config,\@ARGV);
 
 sub add_bugs {
@@ -206,63 +215,41 @@ sub add_bugs {
 
     my $time = 0;
     my $start_time = time;
-
-
-    my @dirs = (@{$argv}?@{$argv} : $initialdir);
-    my $cnt = 0;
     my %tags;
     my %severities;
     my %queue;
-    my $tot_dirs = @{$argv}? @{$argv} : 0;
-    my $done_dirs = 0;
-    my $avg_subfiles = 0;
-    my $completed_files = 0;
-    while (my $dir = shift @dirs) {
-        printf "Doing dir %s ...\n", $dir if $verbose;
-
-        opendir(DIR, "$dir/.") or die "opendir $dir: $!";
-        my @subdirs = readdir(DIR);
-        closedir(DIR);
-
-        my @list = map { m/^(\d+)\.summary$/?($1):() } @subdirs;
-        $tot_dirs -= @dirs;
-        push @dirs, map { m/^(\d+)$/ && -d "$dir/$1"?("$dir/$1"):() } @subdirs;
-        $tot_dirs += @dirs;
-        if ($avg_subfiles == 0) {
-            $avg_subfiles = @list;
-        }
-
-        $p->target($avg_subfiles*($tot_dirs-$done_dirs)+$completed_files+@list) if $p;
-        $avg_subfiles = ($avg_subfiles * $done_dirs + @list) / ($done_dirs+1);
-        $done_dirs += 1;
 
-        for my $bug (@list) {
-            $completed_files++;
-            $p->update($completed_files) if $p;
-            print "Up to $cnt bugs...\n" if (++$cnt % 100 == 0 && $verbose);
-            my $stat = stat(getbugcomponent($bug,'summary',$initialdir));
-            if (not defined $stat) {
-                print STDERR "Unable to stat $bug $!\n";
-                next;
-            }
-            next if $stat->mtime < $time;
-            my $data = read_bug(bug => $bug,
-                                location => $initialdir);
-            eval {
-                load_bug(db => $s,
-                         data => split_status_fields($data),
-                         tags => \%tags,
-                         severities => \%severities,
-                         queue => \%queue);
-            };
-            if ($@) {
-                use Data::Dumper;
-                print STDERR Dumper($data) if $DEBUG;
-                die "failure while trying to load bug $bug\n$@";
-            }
-        }
-    }
-    $p->remove() if $p;
+    walk_bugs([(@{$argv}?@{$argv} : $initialdir)],
+              $p,
+              'summary',
+              $verbose,
+              sub {
+                  my $bug = shift;
+                  my $stat = stat(getbugcomponent($bug,'summary',$initialdir));
+                  if (not defined $stat) {
+                      print STDERR "Unable to stat $bug $!\n";
+                      next;
+                  }
+                  if ($options{quick}) {
+                      my $rs = $s->resultset('Bug')->search({bug=>$bug})->single();
+                      next if defined $rs and $stat->mtime < $rs->last_modified()->epoch();
+                  }
+                  my $data = read_bug(bug => $bug,
+                                      location => $initialdir);
+                  eval {
+                      load_bug(db => $s,
+                               data => split_status_fields($data),
+                               tags => \%tags,
+                               severities => \%severities,
+                               queue => \%queue);
+                  };
+                  if ($@) {
+                      use Data::Dumper;
+                      print STDERR Dumper($data) if $DEBUG;
+                      die "failure while trying to load bug $bug\n$@";
+                  }
+              }
+             );
     handle_load_bug_queue(db => $s,
                           queue => \%queue);
 }
@@ -336,8 +323,19 @@ sub add_debinfo {
                 ($binarch) = $file =~ /_([^\.]+)\.debinfo/;
             }
             my $sp = $s->resultset('SrcPkg')->find_or_create({pkg => $srcname});
+            # update the creation date if the data we have is earlier
+            my $ct_date = DateTime->from_epoch(epoch => $f_stat->ctime);
+            if ($ct_date < $sp->creation) {
+                $sp->creation($ct_date);
+                $sp->last_modified(DateTime->now);
+                $sp->update;
+            }
             my $sv = $s->resultset('SrcVer')->find_or_create({src_pkg =>$sp->id(),
                                                               ver => $srcver});
+            if (not defined $sv->upload_date() or $ct_date < $sv->upload_date()) {
+                $sv->upload_date($ct_date);
+                $sv->update;
+            }
             my $arch;
             if (defined $arch{$binarch}) {
                 $arch = $arch{$binarch};
@@ -404,16 +402,85 @@ sub add_maintainers {
 
 sub add_configuration {
     my ($options,$opts,$p,$config,$argv) = @_;
+
+    my $s = db_connect($options);
+
+    # tags
+    # add all tags
+    # mark obsolete tags
+
+    # severities
+    my %sev_names;
+    my $order = 0;
+    for my $sev_name (@{$config{severities}}) {
+        # add all severitites
+        my $sev = $s->resultset('Severity')->find_or_create({severity => $sev_name});
+        # mark strong severities
+        if (grep {$_ eq $sev_name} @{$config{strong_severities}}) {
+            $sev->strong(1);
+        }
+        $sev->order($order);
+        $sev->update();
+        $order++;
+        $sev_names{$sev_name} = 1;
+    }
+    # mark obsolete severities
+    for my $sev ($s->resultset('Severity')->find()) {
+        next if exists $sev_names{$sev->severity()};
+        $sev->obsolete(1);
+        $sev->update();
+    }
+}
+
+sub add_suite {
+    my ($options,$opts,$p,$config,$argv) = @_;
+    # suites
+    die "add_suite is currently not implemented; modify suites manually using SQL."
 }
 
 sub add_logs {
     my ($options,$opts,$p,$config,$argv) = @_;
+
+    chdir($config->{spool_dir}) or
+        die "chdir $config->{spool_dir} failed: $!";
+
+    my $verbose = $options->{debug};
+
+    my $initialdir = "db-h";
+
+    if (defined $argv->[0] and $argv->[0] eq "archive") {
+        $initialdir = "archive";
+    }
+    my $s = db_connect($options);
+
+
+    my $time = 0;
+    my $start_time = time;
+
+    walk_bugs([(@{$argv}?@{$argv} : $initialdir)],
+              $p,
+              'log',
+              $verbose,
+              sub {
+                  my $bug = shift;
+                  eval { 
+                      load_bug_log(db => $s,
+                                   bug => $bug);
+                  };
+                  if ($@) {
+                      die "failure while trying to load bug log $bug\n$@";
+                  }
+              });
+}
+
+sub add_packages {
+
 }
 
 sub handle_subcommand_arguments {
-    my ($argv,$args,$gop) = @_;
+    my ($argv,$args) = @_;
     my $subopt = {};
-    $gop->getoptionsfromarray($argv,
+    Getopt::Long::GetOptionsFromArray($argv,
                               $subopt,
                               keys %{$args},
                              );
@@ -451,6 +518,42 @@ sub db_connect {
         die "Unable to connect to database: ";
 }
 
+sub walk_bugs {
+    my ($dirs,$p,$what,$verbose,$sub) = @_;
+    my @dirs = @{$dirs};
+    my $tot_dirs = @dirs;
+    my $done_dirs = 0;
+    my $avg_subfiles = 0;
+    my $completed_files = 0;
+    while (my $dir = shift @dirs) {
+        printf "Doing dir %s ...\n", $dir if $verbose;
+
+        opendir(DIR, "$dir/.") or die "opendir $dir: $!";
+        my @subdirs = readdir(DIR);
+        closedir(DIR);
+
+        my @list = map { m/^(\d+)\.$what$/?($1):() } @subdirs;
+        $tot_dirs -= @dirs;
+        push @dirs, map { m/^(\d+)$/ && -d "$dir/$1"?("$dir/$1"):() } @subdirs;
+        $tot_dirs += @dirs;
+        if ($avg_subfiles == 0) {
+            $avg_subfiles = @list;
+        }
+
+        $p->target($avg_subfiles*($tot_dirs-$done_dirs)+$completed_files+@list) if $p;
+        $avg_subfiles = ($avg_subfiles * $done_dirs + @list) / ($done_dirs+1);
+        $done_dirs += 1;
+
+        for my $bug (@list) {
+            $completed_files++;
+            $p->update($completed_files) if $p;
+            print "Up to $completed_files bugs...\n" if ($completed_files % 100 == 0 && $verbose);
+            $sub->($bug);
+        }
+    }
+    $p->remove() if $p;
+}
+
 
 
 __END__