about summary refs log tree commit homepage
path: root/lib/PublicInbox/Import.pm
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-21 01:52:58 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-22 00:12:39 +0000
commit8e52e5fdea416d6fda0b8d301144af0c043a5a76 (patch)
treedafe724cfb77f00e8cb50d89a2f03b50d8c330cb /lib/PublicInbox/Import.pm
parent54590383027a67d11953690cbb6390347757730b (diff)
downloadpublic-inbox-8e52e5fdea416d6fda0b8d301144af0c043a5a76.tar.gz
We want to rely on Date: to sort messages within individual
threads since it keeps messages from git-send-email(1) sorted.
However, since developers occasionally have the clock set
wrong on their machines, sort overall messages by the newest
date in a Received: header so the landing page isn't forever
polluted by messages from the future.

This also gives us determinism for commit times in most cases,
as we'll used the Received: timestamp there, as well.
Diffstat (limited to 'lib/PublicInbox/Import.pm')
-rw-r--r--lib/PublicInbox/Import.pm17
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm
index e50f1156..d69934b0 100644
--- a/lib/PublicInbox/Import.pm
+++ b/lib/PublicInbox/Import.pm
@@ -11,7 +11,7 @@ use base qw(PublicInbox::Lock);
 use PublicInbox::Spawn qw(spawn);
 use PublicInbox::MID qw(mids mid_mime mid2path);
 use PublicInbox::Address;
-use PublicInbox::MsgTime qw(msg_timestamp);
+use PublicInbox::MsgTime qw(msg_timestamp msg_datestamp);
 use PublicInbox::ContentId qw(content_digest);
 use PublicInbox::MDA;
 
@@ -244,9 +244,8 @@ sub remove {
         (($self->{tip} = ":$commit"), $cur);
 }
 
-sub parse_date ($) {
-        my ($mime) = @_;
-        my ($ts, $zone) = msg_timestamp($mime->header_obj);
+sub git_timestamp {
+        my ($ts, $zone) = @_;
         $ts = 0 if $ts < 0; # git uses unsigned times
         "$ts $zone";
 }
@@ -295,7 +294,11 @@ sub add {
         my ($self, $mime, $check_cb) = @_; # mime = Email::MIME
 
         my ($name, $email) = extract_author_info($mime);
-        my $date_raw = parse_date($mime);
+        my $hdr = $mime->header_obj;
+        my @at = msg_datestamp($hdr);
+        my @ct = msg_timestamp($hdr);
+        my $author_time_raw = git_timestamp(@at);
+        my $commit_time_raw = git_timestamp(@ct);
         my $subject = $mime->header('Subject');
         $subject = '(no subject)' unless defined $subject;
         my $path_type = $self->{path_type};
@@ -349,8 +352,8 @@ sub add {
 
         utf8::encode($subject);
         print $w "commit $ref\nmark :$commit\n",
-                "author $name <$email> $date_raw\n",
-                "committer $self->{ident} ", now_raw(), "\n" or wfail;
+                "author $name <$email> $author_time_raw\n",
+                "committer $self->{ident} $commit_time_raw\n" or wfail;
         print $w "data ", (length($subject) + 1), "\n",
                 $subject, "\n\n" or wfail;
         if ($tip ne '') {