From b45a1dffa647f6427d0c900fcc55753db7a1994c Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 12 Sep 2021 07:47:12 +0000 Subject: new public-inbox-{clone,fetch} commands Setting up and maintaining git-only mirrors of v2 inboxes is complex since multiple commands are required to clone and fetch into epochs. Unlike grokmirror, these commands do not require any configuration. Instead, they rely on existing git config files and work like "git clone --mirror" and "git fetch", respectively. Like grokmirror, they use manifest.js.gz, but only on a per-inbox basis so users won't have to clone every inbox of a large instance nor edit config files to include/exclude inboxes they're interested in. --- script/public-inbox-clone | 58 +++++++++++++++++++++++++++++++++++++++++++++++ script/public-inbox-fetch | 35 ++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100755 script/public-inbox-clone create mode 100755 script/public-inbox-fetch (limited to 'script') diff --git a/script/public-inbox-clone b/script/public-inbox-clone new file mode 100755 index 00000000..2b18969f --- /dev/null +++ b/script/public-inbox-clone @@ -0,0 +1,58 @@ +#!perl -w +# Copyright (C) all contributors +# License: AGPL-3.0+ +# Wrapper to git clone remote public-inboxes +use strict; +use v5.10.1; +use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev); +my $opt = {}; +my $help = <{help}) { print $help; exit }; +require PublicInbox::Admin; # loads Config +PublicInbox::Admin::do_chdir(delete $opt->{C}); +PublicInbox::Admin::setup_signals(); +$SIG{PIPE} = 'IGNORE'; + +my ($url, $dst, $extra) = @ARGV; +die $help if !defined($url) || defined($extra); +defined($dst) or ($dst) = ($url =~ m!/([^/]+)/?\z!); +index($dst, "\n") >= 0 and die "`\\n' not allowed in `$dst'"; + +# n.b. this is still a truckload of code... +require URI; +require PublicInbox::LEI; +require PublicInbox::LeiExternal; +require PublicInbox::LeiMirror; +require PublicInbox::LeiCurl; +require PublicInbox::Lock; + +$url = PublicInbox::LeiExternal::ext_canonicalize($url); +my $lei = bless { + env => \%ENV, opt => $opt, cmd => 'public-inbox-clone', + 0 => *STDIN{GLOB}, 2 => *STDERR{GLOB}, +}, 'PublicInbox::LEI'; +open $lei->{1}, '+<&=', 1 or die "dup: $!"; +open $lei->{3}, '.' or die "open . $!"; +my $mrr = bless { + lei => $lei, + src => $url, + dst => $dst, +}, 'PublicInbox::LeiMirror'; +$mrr->do_mirror; +$mrr->can('do_finish_mirror')->([$mrr, $lei], $$); +exit(($lei->{child_error} // 0) >> 8); diff --git a/script/public-inbox-fetch b/script/public-inbox-fetch new file mode 100755 index 00000000..5d303574 --- /dev/null +++ b/script/public-inbox-fetch @@ -0,0 +1,35 @@ +#!perl -w +# Copyright (C) all contributors +# License: AGPL-3.0+ +# Wrapper to git fetch remote public-inboxes +use strict; +use v5.10.1; +use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev); +my $opt = {}; +my $help = <{help}) { print $help; exit }; +require PublicInbox::Fetch; # loads Admin +PublicInbox::Admin::do_chdir(delete $opt->{C}); +PublicInbox::Admin::setup_signals(); +$SIG{PIPE} = 'IGNORE'; + +my $lei = bless { + env => \%ENV, opt => $opt, cmd => 'public-inbox-fetch', + 0 => *STDIN{GLOB}, 1 => *STDOUT{GLOB}, 2 => *STDERR{GLOB}, +}, 'PublicInbox::LEI'; +PublicInbox::Fetch->do_fetch($lei, '.'); -- cgit v1.2.3-24-ge0c7