use IO::Handle; # ->autoflush
use File::Temp qw(tempfile);
-my $x40 = qr/[a-f0-9]{40}/;
+my $OID = qr/[a-f0-9]{40,}/;
# an estimate of the post-packed size to the raw uncompressed size
my $PACKING_FACTOR = 0.4;
local $/ = "\n";
chomp(my $oid = <$r>);
close $r or die "git hash-object failed: $?";
- $oid =~ /\A[a-f0-9]{40}\z/ or die "OID not expected: $oid";
+ $oid =~ /\A$OID\z/ or die "OID not expected: $oid";
$oid;
}
num => $smsg->{num},
mid => $smsg->{mid},
}, 'PublicInbox::Smsg';
- my $v2w = { autime => $smsg->{ds}, cotime => $smsg->{ts} };
- $new_smsg->populate($new_mime, $v2w);
+ my $sync = { autime => $smsg->{ds}, cotime => $smsg->{ts} };
+ $new_smsg->populate($new_mime, $sync);
do_idx($self, \$raw, $new_mime, $new_smsg);
}
$rewritten->{rewrites};
my $pfx = "$self->{-inbox}->{inboxdir}/git";
my $all = "$self->{-inbox}->{inboxdir}/all.git";
-
- unless (-d $all) {
- PublicInbox::Import::init_bare($all);
- }
+ PublicInbox::Import::init_bare($all) unless -d $all;
my $info_dir = "$all/objects/info";
my $alt = "$info_dir/alternates";
my (%alt, $new);
$mode = (stat($fh))[2] & 07777;
# we assign a sort score to every alternate and favor
- # the newest (highest numbered) one when we
+ # the newest (highest numbered) one because loose objects
+ # require scanning epochs and only the latest epoch is
+ # expected to see loose objects
my $score;
my $other = 0; # in case admin adds non-epoch repos
%alt = map {;
blob => $oid,
mid => $mid0,
}, 'PublicInbox::Smsg';
- $smsg->populate($mime, $self);
+ $smsg->populate($mime, $sync);
if (do_idx($self, $msgref, $mime, $smsg)) {
reindex_checkpoint($self, $sync, $git);
}
$range);
my ($at, $ct, $stk);
while (<$fh>) {
- if (/\A([0-9]+)-([0-9]+)-($x40)$/o) {
+ if (/\A([0-9]+)-([0-9]+)-($OID)$/o) {
($at, $ct) = ($1 + 0, $2 + 0);
$stk //= PublicInbox::IdxStack->new($3);
- } elsif (/\A:\d{6} 100644 $x40 ($x40) [AM]\td$/o) {
+ } elsif (/\A:\d{6} 100644 $OID ($OID) [AM]\td$/o) {
my $oid = $1;
if ($D) { # reindex case
$D->{pack('H*', $oid)}++;
} else { # non-reindex case:
$stk->push_rec('d', $at, $ct, $oid);
}
- } elsif (/\A:\d{6} 100644 $x40 ($x40) [AM]\tm$/o) {
+ } elsif (/\A:\d{6} 100644 $OID ($OID) [AM]\tm$/o) {
my $oid = $1;
if ($D) {
my $oid_bin = pack('H*', $oid);
next if $?; # new repo
my $range = log_range($self, $sync, $git, $i, $tip) or next;
- $sync->{ranges}->[$i] = $range;
-
# can't use 'rev-list --count' if we use --diff-filter
$pr->("$i.git counting $range ... ") if $pr;
my $stk = prepare_range_stack($git, $sync, $range);
--no-notes --no-color --no-abbrev --no-renames);
my $fh = $self->{reindex_pipe} = $git->popen(@cmd, $unindex_range);
while (<$fh>) {
- /\A:\d{6} 100644 $x40 ($x40) [AM]\tm$/o or next;
+ /\A:\d{6} 100644 $OID ($OID) [AM]\tm$/o or next;
unindex_oid($self, $git, $1, $unindexed);
}
delete $self->{reindex_pipe};
my $git_dir = git_dir_n($self, $i);
die 'BUG: already reindexing!' if $self->{reindex_pipe};
-d $git_dir or return; # missing epochs are fine
- fill_alternates($self, $i);
my $git = PublicInbox::Git->new($git_dir);
if (my $unindex_range = delete $sync->{unindex_range}->{$i}) {
unindex($self, $sync, $git, $unindex_range);
}
defined(my $stk = $sync->{stacks}->[$i]) or return;
$sync->{stacks}->[$i] = undef;
- my $range = $sync->{ranges}->[$i];
- if (my $pr = $sync->{-opt}->{-progress}) {
- $pr->("$i.git indexing $range\n");
- }
while (my ($f, $at, $ct, $oid) = $stk->pop_rec) {
$self->{current_info} = "$i.git $oid";
if ($f eq 'm') {
- $self->{autime} = $at;
- $self->{cotime} = $ct;
+ $sync->{autime} = $at;
+ $sync->{cotime} = $ct;
reindex_oid($self, $sync, $git, $oid);
} elsif ($f eq 'd') {
unindex_oid($self, $git, $oid);
}
}
- delete @$self{qw(autime cotime)};
+ delete @$sync{qw(autime cotime)};
update_last_commit($self, $git, $i, $stk->{latest_cmt});
}
my $latest = git_dir_latest($self, \$epoch_max);
return unless defined $latest;
$self->idx_init($opt); # acquire lock
+ fill_alternates($self, $epoch_max);
$self->{over}->rethread_prepare($opt);
my $sync = {
unindex_range => {}, # EPOCH => oid_old..oid_new