X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FDB%2FLoad.pm;h=d3019830e7b48d02e1e4482523c66829c7ac85b6;hb=3bea92b28cbdee9bd8bf97eb996ad91f4ea4a4e5;hp=040e2a77ab491d5f6290278117b47f5a718c7608;hpb=a49cb351d4461ea6b757413efa8490da9339d4d6;p=debbugs.git diff --git a/Debbugs/DB/Load.pm b/Debbugs/DB/Load.pm index 040e2a7..d301983 100644 --- a/Debbugs/DB/Load.pm +++ b/Debbugs/DB/Load.pm @@ -357,17 +357,19 @@ sub load_bug_log { next if defined $msg_id and $msg_id =~ /handler\..+\.ack(?:info)?\@/; my $entity = parse_to_mime_entity($record); # search for a message with this message id in the database - $msg_id = $entity->head->get('Message-Id:'); + $msg_id = $entity->head->get('Message-Id') // + $entity->head->get('Resent-Message-ID') // + ''; $msg_id =~ s/^\s*\\s*$//; # check to see if the subject, to, and from match. if so, it's # probably the same message. - my $subject = decode_rfc1522($entity->head->get('Subject:')); - $subject =~ s/\n(?:(\s)\s*|\s*$)/$1/g; - my $to = decode_rfc1522($entity->head->get('To:')); - $to =~ s/\n(?:(\s)\s*|\s*$)/$1/g; - my $from = decode_rfc1522($entity->head->get('From:')); - $from =~ s/\n(?:(\s)\s*|\s*$)/$1/g; + my $subject = decode_rfc1522($entity->head->get('Subject')//''); + $subject =~ s/\n(?:(\s)\s*|\s*$)//g; + my $to = decode_rfc1522($entity->head->get('To')//''); + $to =~ s/\n(?:(\s)\s*|\s*$)//g; + my $from = decode_rfc1522($entity->head->get('From')//''); + $from =~ s/\n(?:(\s)\s*|\s*$)//g; my $m = $s->resultset('Message')-> find({msgid => $msg_id, from_complete => $from, @@ -383,17 +385,21 @@ sub load_bug_log { subject => $subject }); eval { - $m->sent_date(DateTime::Format::Mail-> - parse_datetime($entity->head->get('Date:',0))); + my $date = DateTime::Format::Mail-> + parse_datetime($entity->head->get('Date',0)); + if (abs($date->offset) >= 60 * 60 * 12) { + $date = $date->set_time_zone('UTC'); + } + $m->sent_date($date); }; - my $spam = $entity->head->get('X-Spam-Status:',0); + my $spam = $entity->head->get('X-Spam-Status',0)//''; if ($spam=~ /score=([\d\.]+)/) { $m->spam_score($1); } my %corr; @{$corr{from}} = getparsedaddrs($from); @{$corr{to}} = getparsedaddrs($to); - @{$corr{cc}} = getparsedaddrs($entity->head->get('Cc:')); + @{$corr{cc}} = getparsedaddrs($entity->head->get('Cc')); # add correspondents if necessary my @cors; for my $type (keys %corr) { @@ -413,7 +419,7 @@ sub load_bug_log { ); } my $recv; - if ($entity->head->get('Received:',0) + if ($entity->head->get('Received',0) =~ /via spool by (\S+)/) { $recv = $s->resultset('Correspondent')-> get_correspondent_id($1); @@ -445,17 +451,52 @@ Commands to handle src and package version loading from debinfo files =cut sub load_debinfo { - my ($schema,$binname, $binver, $binarch, $srcname, $srcver) = @_; - my $sp = $schema->resultset('SrcPkg')->find_or_create({pkg => $srcname}); - my $sv = $schema->resultset('SrcVer')->find_or_create({src_pkg=>$sp->id(), - ver => $srcver}); - my $arch = $schema->resultset('Arch')->find_or_create({arch => $binarch}); - my $bp = $schema->resultset('BinPkg')->find_or_create({pkg => $binname}); - $schema->resultset('BinVer')->find_or_create({bin_pkg_id => $bp->id(), - src_ver_id => $sv->id(), - arch_id => $arch->id(), - ver => $binver, - }); + my ($s,$binname, $binver, $binarch, $srcname, $srcver,$ct_date,$cache) = @_; + $cache //= {}; + my $sp; + if (not defined $cache->{sp}{$srcname}) { + $cache->{sp}{$srcname} = + $s->resultset('SrcPkg')->find_or_create({pkg => $srcname}); + } + $sp = $cache->{sp}{$srcname}; + # update the creation date if the data we have is earlier + if (defined $ct_date and + (not defined $sp->creation or + $ct_date < $sp->creation)) { + $sp->creation($ct_date); + $sp->last_modified(DateTime->now); + $sp->update; + } + my $sv; + if (not defined $cache->{sv}{$srcname}{$srcver}) { + $cache->{sv}{$srcname}{$srcver} = + $s->resultset('SrcVer')-> + find_or_create({src_pkg =>$sp->id(), + ver => $srcver}); + } + $sv = $cache->{sv}{$srcname}{$srcver}; + if (defined $ct_date and + (not defined $sv->upload_date() or $ct_date < $sv->upload_date())) { + $sv->upload_date($ct_date); + $sv->update; + } + my $arch; + if (not defined $cache->{arch}{$binarch}) { + $cache->{arch}{$binarch} = + $s->resultset('Arch')-> + find_or_create({arch => $binarch}, + )->id(); + } + $arch = $cache->{arch}{$binarch}; + my $bp; + if (not defined $cache->{bp}{$binname}) { + $cache->{bp}{$binname} = + $s->resultset('BinPkg')-> + get_bin_pkg_id($binname); + } + $bp = $cache->{bp}{$binname}; + $s->resultset('BinVer')-> + get_bin_ver_id($bp,$binver,$arch,$sv->id()); }