]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Import.pm
www: drop --subject from "git send-email" instructions
[public-inbox.git] / lib / PublicInbox / Import.pm
index 8a06a661654b861975efbd88cc0df7fdcb010122..60ce7b66419b3ee0e9ad2dca4b93644497539378 100644 (file)
@@ -21,10 +21,11 @@ use POSIX qw(strftime);
 
 sub default_branch () {
        state $default_branch = do {
-               delete local $ENV{GIT_CONFIG};
-               my $r = popen_rd([qw(git config --global init.defaultBranch)]);
+               my $r = popen_rd([qw(git config --global init.defaultBranch)],
+                                { GIT_CONFIG => undef });
                chomp(my $h = <$r> // '');
-               $h eq '' ? 'refs/heads/master' : $h;
+               close $r;
+               $h eq '' ? 'refs/heads/master' : "refs/heads/$h";
        }
 }
 
@@ -67,11 +68,9 @@ sub gfi_start {
                chomp($self->{tip} = $git->qx(qw(rev-parse --revs-only), $ref));
                die "fatal: rev-parse --revs-only $ref: \$?=$?" if $?;
                if ($self->{path_type} ne '2/38' && $self->{tip}) {
-                       local $/ = "\0";
-                       my @t = $git->qx(qw(ls-tree -r -z --name-only), $ref);
+                       my $t = $git->qx(qw(ls-tree -r -z --name-only), $ref);
                        die "fatal: ls-tree -r -z --name-only $ref: \$?=$?" if $?;
-                       chomp @t;
-                       $self->{-tree} = { map { $_ => 1 } @t };
+                       $self->{-tree} = { map { $_ => 1 } split(/\0/, $t) };
                }
                $in_r = $self->{in} = $git->popen(qw(fast-import
                                        --quiet --done --date-format=raw),
@@ -414,7 +413,19 @@ sub add {
                $smsg->{blob} = $self->get_mark(":$blob");
                $smsg->set_bytes($raw_email, $n);
                if (my $oidx = delete $smsg->{-oidx}) { # used by LeiStore
-                       return if $oidx->blob_exists($smsg->{blob});
+                       my $eidx_git = delete $smsg->{-eidx_git};
+
+                       # we need this sharedkv to dedupe blobs added in the
+                       # same fast-import transaction
+                       my $u = $self->{uniq_skv} //= do {
+                               require PublicInbox::SharedKV;
+                               my $x = PublicInbox::SharedKV->new;
+                               $x->dbh;
+                               $x;
+                       };
+                       return if !$u->set_maybe($smsg->oidbin, 1);
+                       return if (!$oidx->vivify_xvmd($smsg) &&
+                                       $eidx_git->check($smsg->{blob}));
                }
        }
        my $ref = $self->{ref};
@@ -440,9 +451,6 @@ sub add {
 }
 
 my @INIT_FILES = ('HEAD' => undef, # filled in at runtime
-               'description' => <<EOD,
-Unnamed repository; edit this file 'description' to name the repository.
-EOD
                'config' => <<EOC);
 [core]
        repositoryFormatVersion = 0
@@ -499,8 +507,8 @@ sub atfork_child {
        }
 }
 
-sub digest2mid ($$) {
-       my ($dig, $hdr) = @_;
+sub digest2mid ($$;$) {
+       my ($dig, $hdr, $fallback_time) = @_;
        my $b64 = $dig->clone->b64digest;
        # Make our own URLs nicer:
        # See "Base 64 Encoding with URL and Filename Safe Alphabet" in RFC4648
@@ -509,7 +517,7 @@ sub digest2mid ($$) {
        # Add a date prefix to prevent a leading '-' in case that trips
        # up some tools (e.g. if a Message-ID were a expected as a
        # command-line arg)
-       my $dt = msg_datestamp($hdr);
+       my $dt = msg_datestamp($hdr, $fallback_time);
        $dt = POSIX::strftime('%Y%m%d%H%M%S', gmtime($dt));
        "$dt.$b64" . '@z';
 }