-# Copyright (C) 2016-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# git fast-import-based ssoma-mda MDA replacement
{ GIT_CONFIG => undef });
chomp(my $h = <$r> // '');
close $r;
- $h eq '' ? 'refs/heads/master' : $h;
+ $h eq '' ? 'refs/heads/master' : "refs/heads/$h";
}
}
return if $tip eq '';
print $w "ls $tip $path\n" or wfail;
local $/ = "\n";
- defined(my $info = <$r>) or die "EOF from fast-import: $!";
+ my $info = <$r> // die "EOF from fast-import: $!";
$info =~ /\Amissing / ? undef : $info;
}
my ($r, $w, $oid) = @_;
print $w "cat-blob $oid\n" or wfail;
local $/ = "\n";
- my $info = <$r>;
- defined $info or die "EOF from fast-import / cat-blob: $!";
+ my $info = <$r> // die "EOF from fast-import / cat-blob: $!";
$info =~ /\A[a-f0-9]{40,} blob ([0-9]+)\n\z/ or return;
my $left = $1;
my $offset = 0;
my $buf = '';
my $n;
while ($left > 0) {
- $n = read($r, $buf, $left, $offset);
- defined($n) or die "read cat-blob failed: $!";
+ $n = read($r, $buf, $left, $offset) //
+ die "read cat-blob failed: $!";
$n == 0 and die 'fast-export (cat-blob) died';
$left -= $n;
$offset += $n;
}
- $n = read($r, my $lf, 1);
- defined($n) or die "read final byte of cat-blob failed: $!";
+ $n = read($r, my $lf, 1) //
+ die "read final byte of cat-blob failed: $!";
die "bad read on final byte: <$lf>" if $lf ne "\n";
# fixup some bugginess in old versions:
my $oid = $1;
my $msg = _cat_blob($r, $w, $oid) or die "BUG: cat-blob $1 failed";
my $cur = PublicInbox::Eml->new($msg);
- my $cur_s = $cur->header('Subject');
- $cur_s = '' unless defined $cur_s;
- my $cur_m = $mime->header('Subject');
- $cur_m = '' unless defined $cur_m;
+ my $cur_s = $cur->header('Subject') // '';
+ my $cur_m = $mime->header('Subject') // '';
if ($cur_s ne $cur_m || norm_body($cur) ne norm_body($mime)) {
return ('MISMATCH', $cur);
}
my $env = { GIT_INDEX_FILE => $index };
run_die([@cmd, qw(read-tree -m -v -i), $self->{ref}], $env);
}
- eval { run_die([@cmd, 'update-server-info']) };
my $ibx = $self->{ibx};
+ eval { run_die([@cmd, 'update-server-info']) } if $ibx;
if ($ibx && $ibx->version == 1 && -d "$ibx->{inboxdir}/public-inbox" &&
eval { require PublicInbox::SearchIdx }) {
eval {
};
warn "$ibx->{inboxdir} index failed: $@\n" if $@;
}
- eval { run_die([@cmd, qw(gc --auto)]) } if $do_gc;
+ if ($do_gc) {
+ my @quiet = (-t STDERR ? () : '-q');
+ eval { run_die([@cmd, qw(gc --auto), @quiet]) }
+ }
}
sub barrier {
die "not active\n" unless $self->{in};
my ($r, $w) = $self->gfi_start;
print $w "get-mark $mark\n" or wfail;
- defined(my $oid = <$r>) or die "get-mark failed, need git 2.6.0+\n";
+ my $oid = <$r> // die "get-mark failed, need git 2.6.0+\n";
chomp($oid);
$oid;
}
$smsg->{blob} = $self->get_mark(":$blob");
$smsg->set_bytes($raw_email, $n);
if (my $oidx = delete $smsg->{-oidx}) { # used by LeiStore
- my @docids = $oidx->blob_exists($smsg->{blob});
- my @vivify_xvmd;
- for my $id (@docids) {
- if (my $cur = $oidx->get_art($id)) {
- # already imported if bytes > 0
- return if $cur->{bytes} > 0;
- push @vivify_xvmd, $id;
- } else {
- warn "W: $smsg->{blob} ",
- "#$id gone (bug?)\n";
- }
- }
- $smsg->{-vivify_xvmd} = \@vivify_xvmd;
+ 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};
}
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
}
}
-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
# 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';
}