X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FFetch.pm;h=7f60b619e0a4c7b2270cc59882f9410dd86cbb86;hb=718d054be8b2cc23635b42e8ce880424492d3a84;hp=993e5b190818548d4bc07d0f8202ac7d7146561e;hpb=5a5d2496f139e45823dbee3361ab790b2db4d31f;p=public-inbox.git diff --git a/lib/PublicInbox/Fetch.pm b/lib/PublicInbox/Fetch.pm index 993e5b19..7f60b619 100644 --- a/lib/PublicInbox/Fetch.pm +++ b/lib/PublicInbox/Fetch.pm @@ -12,6 +12,8 @@ use PublicInbox::LEI; use PublicInbox::LeiCurl; use PublicInbox::LeiMirror; use File::Temp (); +use PublicInbox::Config; +use IO::Compress::Gzip qw(gzip $GzipError); sub new { bless {}, __PACKAGE__ } @@ -81,7 +83,7 @@ sub do_manifest ($$$) { } my (undef, $v1_path, @v2_epochs) = PublicInbox::LeiMirror::deduce_epochs($mdiff, $ibx_uri->path); - [ 200, $v1_path, \@v2_epochs, $muri, $ft, $mf ]; + [ 200, $v1_path, \@v2_epochs, $muri, $ft, $mf, $m1 ]; } sub get_fingerprint2 { @@ -96,7 +98,7 @@ sub do_fetch { # main entry point my $ibx_ver; $lei->{curl} //= PublicInbox::LeiCurl->new($lei) or return; my $dir = PublicInbox::Admin::resolve_inboxdir($cd, \$ibx_ver); - my ($ibx_uri, @git_dir, @epochs, $mg, @new_epoch); + my ($ibx_uri, @git_dir, @epochs, $mg, @new_epoch, $skip); if ($ibx_ver == 1) { my $url = remote_url($lei, $dir) // die "E: $dir missing remote.origin.url\n"; @@ -108,14 +110,20 @@ sub do_fetch { # main entry point my ($git_url, $epoch); for my $nr (@epochs) { # try newest epoch, first my $edir = "$dir/git/$nr.git"; + unless (-d $edir && -w _) { # must be writable dir + $skip->{$nr} = 1; + next; + } + next if defined $git_url; if (defined(my $url = remote_url($lei, $edir))) { $git_url = $url; $epoch = $nr; - last; } else { warn "W: $edir missing remote.origin.url\n"; } } + @epochs = grep { !$skip->{$_} } @epochs if $skip; + $skip //= {}; # makes code below easier $git_url or die "Unable to determine git URL\n"; my $inbox_url = $git_url; $inbox_url =~ s!/git/$epoch(?:\.git)?/?\z!! or @@ -127,21 +135,33 @@ EOM PublicInbox::LeiMirror::write_makefile($dir, $ibx_ver); $lei->qerr("# inbox URL: $ibx_uri/"); my $res = do_manifest($lei, $dir, $ibx_uri) or return; - my ($code, $v1_path, $v2_epochs, $muri, $ft, $mf) = @$res; + my ($code, $v1_path, $v2_epochs, $muri, $ft, $mf, $m1) = @$res; if ($code == 404) { # any pre-manifest.js.gz instances running? Just fetch all # existing ones and unconditionally try cloning the next $v2_epochs = [ map { "$dir/git/$_.git" } @epochs ]; - push @$v2_epochs, "$dir/git/".($epochs[-1] + 1) if @epochs; + if (@epochs) { + my $n = $epochs[-1] + 1; + push @$v2_epochs, "$dir/git/$n.git" if !$skip->{$n}; + } } else { $code == 200 or die "BUG unexpected code $code\n"; } + my $mculled; if ($ibx_ver == 2) { defined($v1_path) and warn <, WTF? EOM - @git_dir = map { "$dir/git/$_.git" } sort { $a <=> $b } - map { my ($nr) = (m!/([0-9]+)\.git\z!g) } @$v2_epochs; + @git_dir = map { "$dir/git/$_.git" } sort { $a <=> $b } map { + my ($nr) = (m!/([0-9]+)\.git\z!g); + $skip->{$nr} ? () : $nr; + } @$v2_epochs; + if ($m1 && scalar keys %$skip) { + my $re = join('|', keys %$skip); + my @del = grep(m!/git/$re\.git\z!, keys %$m1); + delete @$m1{@del}; + $mculled = 1; + } } else { $git_dir[0] = $dir; } @@ -182,6 +202,10 @@ EOM for my $i (@new_epoch) { $mg->epoch_cfg_set($i) } if ($ft) { my $fn = $ft->filename; + if ($mculled) { + my $json = PublicInbox::Config->json->encode($m1); + gzip(\$json => $fn) or die "gzip: $GzipError"; + } rename($fn, $mf) or die "E: rename($fn, $mf): $!\n"; $ft->unlink_on_destroy(0); }