about summary refs log tree commit homepage
path: root/lib/PublicInbox/Fetch.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-09-24 10:56:45 +0000
committerEric Wong <e@80x24.org>2021-09-24 23:22:08 +0000
commit77b3dac08f58503e374e98c29b9e0ee7c866c0e5 (patch)
tree23b91c308d6a6293007ee3f807f8696700750fd4 /lib/PublicInbox/Fetch.pm
parent718d054be8b2cc23635b42e8ce880424492d3a84 (diff)
downloadpublic-inbox-77b3dac08f58503e374e98c29b9e0ee7c866c0e5.tar.gz
There may still be pre-manifest.js.gz versions of
PublicInbox::WWW running and serving v2 inboxes.

While -clone and "add-external --mirror" were working, -fetch
was failing due to 301 redirect to $INBOX_URL/manifest.js.gz/
and not the expected 404.  Update the code to deal with a JSON
decode error (from the 301) and ensure v2 epochs detection is
correct (and not using a shadowed variable).
Diffstat (limited to 'lib/PublicInbox/Fetch.pm')
-rw-r--r--lib/PublicInbox/Fetch.pm12
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/PublicInbox/Fetch.pm b/lib/PublicInbox/Fetch.pm
index 7f60b619..7881b402 100644
--- a/lib/PublicInbox/Fetch.pm
+++ b/lib/PublicInbox/Fetch.pm
@@ -60,11 +60,13 @@ sub do_manifest ($$$) {
         $opt->{$_} = $lei->{$_} for (0..2);
         my $cerr = PublicInbox::LeiMirror::run_reap($lei, $curl_cmd, $opt);
         if ($cerr) {
-                return [ 404 ] if ($cerr >> 8) == 22; # 404 Missing
+                return [ 404, $muri ] if ($cerr >> 8) == 22; # 404 Missing
                 $lei->child_error($cerr, "@$curl_cmd failed");
                 return;
         }
-        my $m1 = PublicInbox::LeiMirror::decode_manifest($ft, $fn, $muri);
+        my $m1 = eval {
+                PublicInbox::LeiMirror::decode_manifest($ft, $fn, $muri);
+        } or return [ 404, $muri ];
         my $mdiff = { %$m1 };
 
         # filter out unchanged entries.  We check modified, too, since
@@ -83,7 +85,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, $m1 ];
+        [ 200, $muri, $v1_path, \@v2_epochs, $ft, $mf, $m1 ];
 }
 
 sub get_fingerprint2 {
@@ -106,7 +108,7 @@ sub do_fetch { # main entry point
         } else { # v2:
                 require PublicInbox::MultiGit;
                 $mg = PublicInbox::MultiGit->new($dir, 'all.git', 'git');
-                my @epochs = $mg->git_epochs;
+                @epochs = $mg->git_epochs;
                 my ($git_url, $epoch);
                 for my $nr (@epochs) { # try newest epoch, first
                         my $edir = "$dir/git/$nr.git";
@@ -135,7 +137,7 @@ 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, $m1) = @$res;
+        my ($code, $muri, $v1_path, $v2_epochs, $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