]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/V2Writable.pm
v2writable: move {ranges} into $sync state
[public-inbox.git] / lib / PublicInbox / V2Writable.pm
index efb9f42bc6327f0cf1a60a245f9bcb0731ba1c8f..eef5576ca6f9e7b6af37ce694b85981e26f20b5a 100644 (file)
@@ -706,7 +706,7 @@ sub mark_deleted {
 }
 
 sub reindex_oid {
-       my ($self, $sync, $git, $oid, $regen, $reindex) = @_;
+       my ($self, $sync, $git, $oid) = @_;
        my $len;
        my $msgref = $git->cat_file($oid, \$len);
        my $mime = PublicInbox::MIME->new($$msgref);
@@ -727,8 +727,8 @@ sub reindex_oid {
                        $self->{mm}->mid_set($num, $mid0);
                }
        }
-       if (!defined($mid0) && $regen && !$del) {
-               $num = $$regen--;
+       if (!defined($mid0) && !$del) {
+               $num = $sync->{regen}--;
                die "BUG: ran out of article numbers\n" if $num <= 0;
                my $mm = $self->{mm};
                foreach my $mid (reverse @$mids) {
@@ -749,8 +749,8 @@ sub reindex_oid {
 
        if (!defined($mid0) || $del) {
                if (!defined($mid0) && $del) { # expected for deletes
-                       $num = $$regen--;
-                       $self->{mm}->num_highwater($num) unless $reindex;
+                       $num = $sync->{regen}--;
+                       $self->{mm}->num_highwater($num) if !$sync->{reindex};
                        return
                }
 
@@ -813,14 +813,14 @@ sub last_commits {
 
 # returns a revision range for git-log(1)
 sub log_range ($$$$$) {
-       my ($self, $git, $ranges, $i, $tip) = @_;
-       my $cur = $ranges->[$i] or return $tip; # all of it
+       my ($self, $sync, $git, $i, $tip) = @_;
+       my $cur = $sync->{ranges}->[$i] or return $tip; # all of it
        my $range = "$cur..$tip";
        if (is_ancestor($git, $cur, $tip)) { # common case
                my $n = $git->qx(qw(rev-list --count), $range);
                chomp($n);
                if ($n == 0) {
-                       $ranges->[$i] = undef;
+                       $sync->{ranges}->[$i] = undef;
                        return; # nothing to do
                }
        } else {
@@ -845,8 +845,8 @@ $range
        $range;
 }
 
-sub index_prepare {
-       my ($self, $opts, $epoch_max, $ranges) = @_;
+sub sync_prepare {
+       my ($self, $sync, $opts, $epoch_max) = @_;
        my $pr = $opts->{-progress};
        my $regen_max = 0;
        my $head = $self->{-inbox}->{ref_head} || 'refs/heads/master';
@@ -866,8 +866,8 @@ sub index_prepare {
                chomp(my $tip = $git->qx(qw(rev-parse -q --verify), $head));
 
                next if $?; # new repo
-               my $range = log_range($self, $git, $ranges, $i, $tip) or next;
-               $ranges->[$i] = $range;
+               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 changes\n\t$range ... ") if $pr;
@@ -879,7 +879,10 @@ sub index_prepare {
                $pr->("$n\n") if $pr;
                $regen_max += $n;
        }
-       \$regen_max;
+       # reindex should NOT see new commits anymore, if we do,
+       # it's a problem and we need to notice it via die()
+       return -1 if $opts->{reindex};
+       $regen_max + $self->{mm}->num_highwater() || 0;
 }
 
 sub unindex_oid_remote {
@@ -940,10 +943,11 @@ sub unindex {
                qw(-c gc.reflogExpire=now gc --prune=all)]);
 }
 
-sub index_ranges ($$$) {
-       my ($self, $reindex, $epoch_max) = @_;
-       return last_commits($self, $epoch_max) unless $reindex;
+sub sync_ranges ($$$) {
+       my ($self, $sync, $epoch_max) = @_;
+       my $reindex = $sync->{reindex};
 
+       return last_commits($self, $epoch_max) unless $reindex;
        return [] if ref($reindex) ne 'HASH';
 
        my $ranges = $reindex->{from}; # arrayref;
@@ -964,19 +968,10 @@ sub index_sync {
        my $sync = {
                mm_tmp => $self->{mm}->tmp_clone,
                D => {}, # "$mid\0$cid" => $oid
+               reindex => $opts->{reindex},
        };
-       my $reindex = $opts->{reindex};
-       my $ranges = index_ranges($self, $reindex, $epoch_max);
-
-       my $high = $self->{mm}->num_highwater();
-       my $regen = $self->index_prepare($opts, $epoch_max, $ranges);
-       if ($opts->{reindex}) {
-               # reindex should NOT see new commits anymore, if we do,
-               # it's a problem and we need to notice it via die()
-               $$regen = -1;
-       } else {
-               $$regen += $high;
-       }
+       $sync->{ranges} = sync_ranges($self, $sync, $epoch_max);
+       $sync->{regen} = sync_prepare($self, $sync, $opts, $epoch_max);
 
        my @cmd = qw(log --raw -r --pretty=tformat:%H
                        --no-notes --no-color --no-abbrev --no-renames);
@@ -990,7 +985,7 @@ sub index_sync {
                my $git = PublicInbox::Git->new($git_dir);
                my $unindex = delete $self->{"unindex-range.$i"};
                $self->unindex($opts, $git, $unindex) if $unindex;
-               defined(my $range = $ranges->[$i]) or next;
+               defined(my $range = $sync->{ranges}->[$i]) or next;
                my $fh = $self->{reindex_pipe} = $git->popen(@cmd, $range);
                my $cmt;
                while (<$fh>) {
@@ -999,8 +994,7 @@ sub index_sync {
                        if (/\A$x40$/o && !defined($cmt)) {
                                $cmt = $_;
                        } elsif (/\A:\d{6} 100644 $x40 ($x40) [AM]\tm$/o) {
-                               $self->reindex_oid($sync, $git, $1,
-                                               $regen, $reindex);
+                               $self->reindex_oid($sync, $git, $1);
                        } elsif (/\A:\d{6} 100644 $x40 ($x40) [AM]\td$/o) {
                                $self->mark_deleted($sync, $git, $1);
                        }