diff options
Diffstat (limited to 'lib/PublicInbox/LeiAddExternal.pm')
-rw-r--r-- | lib/PublicInbox/LeiAddExternal.pm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/PublicInbox/LeiAddExternal.pm b/lib/PublicInbox/LeiAddExternal.pm new file mode 100644 index 00000000..5eef206c --- /dev/null +++ b/lib/PublicInbox/LeiAddExternal.pm @@ -0,0 +1,72 @@ +# Copyright (C) all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> + +# "lei add-external" command +package PublicInbox::LeiAddExternal; +use strict; +use v5.10.1; + +sub _finish_add_external { + my ($lei, $location) = @_; + my $new_boost = $lei->{opt}->{boost} // 0; + my $key = "external.$location.boost"; + my $cur_boost = $lei->_lei_cfg(1)->{$key}; + return if defined($cur_boost) && $cur_boost == $new_boost; # idempotent + $lei->_config($key, $new_boost); +} + +sub lei_add_external { + my ($lei, $location) = @_; + my $mirror = $lei->{opt}->{mirror} // do { + my @fail; + for my $sw ($lei->index_opt, $lei->curl_opt, + qw(no-torsocks torsocks inbox-version)) { + my ($f) = (split(/|/, $sw, 2))[0]; + next unless defined $lei->{opt}->{$f}; + $f = length($f) == 1 ? "-$f" : "--$f"; + push @fail, $f; + } + if (scalar(@fail) == 1) { + return $lei->("@fail requires --mirror"); + } elsif (@fail) { + my $last = pop @fail; + my $fail = join(', ', @fail); + return $lei->("@fail and $last require --mirror"); + } + undef; + }; + $location = $lei->ext_canonicalize($location); + if (defined($mirror) && -d $location) { + $lei->fail(<<""); # TODO: did you mean "update-external?" +--mirror destination `$location' already exists + + } elsif (-d $location) { + index($location, "\n") >= 0 and + return $lei->fail("`\\n' not allowed in `$location'"); + } + if ($location !~ m!\Ahttps?://! && !-d $location) { + $mirror // return $lei->fail("$location not a directory"); + index($location, "\n") >= 0 and + return $lei->fail("`\\n' not allowed in `$location'"); + $mirror = $lei->ext_canonicalize($mirror); + require PublicInbox::LeiMirror; + PublicInbox::LeiMirror->start($lei, $mirror => $location); + } else { + _finish_add_external($lei, $location); + } +} + +sub _complete_add_external { # for bash, this relies on "compopt -o nospace" + my ($lei, @argv) = @_; + my $cfg = $lei->_lei_cfg or return (); + my $match_cb = $lei->complete_url_prepare(\@argv); + require URI; + map { + my $u = URI->new(substr($_, length('external.'))); + my ($base) = ($u->path =~ m!((?:/?.*)?/)[^/]+/?\z!); + $u->path($base); + $match_cb->($u->as_string); + } grep(m!\Aexternal\.https?://!, @{$cfg->{-section_order}}); +} + +1; |