* [PATCH 0/3] lei *-external: split off into separate files
@ 2021-09-25 8:49 Eric Wong
2021-09-25 8:49 ` [PATCH 1/3] lei forget-external: split into separate file Eric Wong
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Eric Wong @ 2021-09-25 8:49 UTC (permalink / raw)
To: meta
Some of the early parts of lei predated the current autoloading
using lazy_cb. None of these commands are expected to be
frequently used, so wasting memory on them is unnecessary.
Eric Wong (3):
lei forget-external: split into separate file
lei add-external: split into separate file
lei ls-external: split into separate file
MANIFEST | 3 +
lib/PublicInbox/LeiAddExternal.pm | 72 ++++++++++++++
lib/PublicInbox/LeiExternal.pm | 140 +--------------------------
lib/PublicInbox/LeiForgetExternal.pm | 46 +++++++++
lib/PublicInbox/LeiLsExternal.pm | 32 ++++++
lib/PublicInbox/LeiMirror.pm | 3 +-
lib/PublicInbox/LeiQuery.pm | 6 +-
7 files changed, 161 insertions(+), 141 deletions(-)
create mode 100644 lib/PublicInbox/LeiAddExternal.pm
create mode 100644 lib/PublicInbox/LeiForgetExternal.pm
create mode 100644 lib/PublicInbox/LeiLsExternal.pm
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] lei forget-external: split into separate file
2021-09-25 8:49 [PATCH 0/3] lei *-external: split off into separate files Eric Wong
@ 2021-09-25 8:49 ` Eric Wong
2021-09-25 8:49 ` [PATCH 2/3] lei add-external: " Eric Wong
2021-09-25 8:49 ` [PATCH 3/3] lei ls-external: " Eric Wong
2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2021-09-25 8:49 UTC (permalink / raw)
To: meta
This was written before we had auto-loading, and forget-external
should be a rarely-used command that's not worth loading at
startup. Do some golfing while we're in the area, too.
---
MANIFEST | 1 +
lib/PublicInbox/LeiExternal.pm | 48 ++--------------------------
lib/PublicInbox/LeiForgetExternal.pm | 46 ++++++++++++++++++++++++++
lib/PublicInbox/LeiQuery.pm | 6 ++--
4 files changed, 52 insertions(+), 49 deletions(-)
create mode 100644 lib/PublicInbox/LeiForgetExternal.pm
diff --git a/MANIFEST b/MANIFEST
index 3595195a6996..a39afe24aa87 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -218,6 +218,7 @@ lib/PublicInbox/LeiEditSearch.pm
lib/PublicInbox/LeiExportKw.pm
lib/PublicInbox/LeiExternal.pm
lib/PublicInbox/LeiFinmsg.pm
+lib/PublicInbox/LeiForgetExternal.pm
lib/PublicInbox/LeiForgetMailSync.pm
lib/PublicInbox/LeiForgetSearch.pm
lib/PublicInbox/LeiHelp.pm
diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm
index f8e610cacb21..35a7d68a17b5 100644
--- a/lib/PublicInbox/LeiExternal.pm
+++ b/lib/PublicInbox/LeiExternal.pm
@@ -31,7 +31,7 @@ sub externals_each {
}
sub ext_canonicalize {
- my ($location) = @_;
+ my $location = $_[-1]; # $_[0] may be $lei
if ($location !~ m!\Ahttps?://!) {
PublicInbox::Config::rel2abs_collapsed($location);
} else {
@@ -185,39 +185,9 @@ sub lei_add_external {
}
}
-sub lei_forget_external {
- my ($self, @locations) = @_;
- my $cfg = $self->_lei_cfg(1);
- my $quiet = $self->{opt}->{quiet};
- my %seen;
- for my $loc (@locations) {
- my (@unset, @not_found);
- for my $l ($loc, ext_canonicalize($loc)) {
- next if $seen{$l}++;
- my $key = "external.$l.boost";
- delete($cfg->{$key});
- $self->_config('--unset', $key);
- if ($? == 0) {
- push @unset, $l;
- } elsif (($? >> 8) == 5) {
- push @not_found, $l;
- } else {
- $self->err("# --unset $key error");
- return $self->x_it($?);
- }
- }
- if (@unset) {
- next if $quiet;
- $self->err("# $_ gone") for @unset;
- } elsif (@not_found) {
- $self->err("# $_ not found") for @not_found;
- } # else { already exited
- }
-}
-
# returns an anonymous sub which returns an array of potential results
sub complete_url_prepare {
- my $argv = $_[-1];
+ my $argv = $_[-1]; # $_[0] may be $lei
# Workaround bash word-splitting URLs to ['https', ':', '//' ...]
# Maybe there's a better way to go about this in
# contrib/completion/lei-completion.bash
@@ -253,20 +223,6 @@ sub complete_url_prepare {
wantarray ? ($re, $cur, $match_cb) : $match_cb;
}
-# shell completion helper called by lei__complete
-sub _complete_forget_external {
- my ($self, @argv) = @_;
- my $cfg = $self->_lei_cfg;
- my ($cur, $re, $match_cb) = complete_url_prepare(\@argv);
- # FIXME: bash completion off "http:" or "https:" when the last
- # character is a colon doesn't work properly even if we're
- # returning "//$HTTP_HOST/$PATH_INFO/", not sure why, could
- # be a bash issue.
- map {
- $match_cb->(substr($_, length('external.')));
- } grep(/\Aexternal\.$re\Q$cur/, @{$cfg->{-section_order}});
-}
-
sub _complete_add_external { # for bash, this relies on "compopt -o nospace"
my ($self, @argv) = @_;
my $cfg = $self->_lei_cfg;
diff --git a/lib/PublicInbox/LeiForgetExternal.pm b/lib/PublicInbox/LeiForgetExternal.pm
new file mode 100644
index 000000000000..7a4bbcf80a3a
--- /dev/null
+++ b/lib/PublicInbox/LeiForgetExternal.pm
@@ -0,0 +1,46 @@
+# Copyright (C) all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# "lei forget-external" command
+package PublicInbox::LeiForgetExternal;
+use strict;
+use v5.10.1;
+
+sub lei_forget_external {
+ my ($lei, @locations) = @_;
+ my $cfg = $lei->_lei_cfg or
+ return $lei->fail('no externals configured');
+ my %seen;
+ for my $loc (@locations) {
+ for my $l ($loc, $lei->ext_canonicalize($loc)) {
+ next if $seen{$l}++;
+ my $key = "external.$l.boost";
+ delete($cfg->{$key});
+ $lei->_config('--unset', $key);
+ if ($? == 0) {
+ $lei->qerr("# $l forgotten ");
+ } elsif (($? >> 8) == 5) {
+ $lei->err("# $l not found");
+ } else {
+ $lei->err("# --unset $key error");
+ return $lei->x_it($?);
+ }
+ }
+ }
+}
+
+# shell completion helper called by lei__complete
+sub _complete_forget_external {
+ my ($lei, @argv) = @_;
+ my $cfg = $lei->_lei_cfg or return ();
+ my ($cur, $re, $match_cb) = $lei->complete_url_prepare(\@argv);
+ # FIXME: bash completion off "http:" or "https:" when the last
+ # character is a colon doesn't work properly even if we're
+ # returning "//$HTTP_HOST/$PATH_INFO/", not sure why, could
+ # be a bash issue.
+ map {
+ $match_cb->(substr($_, length('external.')));
+ } grep(/\Aexternal\.$re\Q$cur/, @{$cfg->{-section_order}});
+}
+
+1;
diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm
index cb5ac8fb84a7..c65b00ca0986 100644
--- a/lib/PublicInbox/LeiQuery.pm
+++ b/lib/PublicInbox/LeiQuery.pm
@@ -158,11 +158,11 @@ no query allowed on command-line with --stdin
# shell completion helper called by lei__complete
sub _complete_q {
my ($self, @argv) = @_;
- my $ext = qr/\A(?:-I|(?:--(?:include|exclude|only)))\z/;
my @cur;
+ my $cb = $self->lazy_cb(qw(forget-external _complete_));
while (@argv) {
- if ($argv[-1] =~ $ext) {
- my @c = $self->_complete_forget_external(@cur);
+ if ($argv[-1] =~ /\A(?:-I|(?:--(?:include|exclude|only)))\z/) {
+ my @c = $cb->($self, @cur);
# try basename match:
if (scalar(@cur) == 1 && index($cur[0], '/') < 0) {
my $all = $self->externals_each;
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] lei add-external: split into separate file
2021-09-25 8:49 [PATCH 0/3] lei *-external: split off into separate files Eric Wong
2021-09-25 8:49 ` [PATCH 1/3] lei forget-external: split into separate file Eric Wong
@ 2021-09-25 8:49 ` Eric Wong
2021-09-25 8:49 ` [PATCH 3/3] lei ls-external: " Eric Wong
2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2021-09-25 8:49 UTC (permalink / raw)
To: meta
Also was written before we had auto-loading and rarely used.
---
MANIFEST | 1 +
lib/PublicInbox/LeiAddExternal.pm | 72 +++++++++++++++++++++++++++++++
lib/PublicInbox/LeiExternal.pm | 66 ----------------------------
lib/PublicInbox/LeiMirror.pm | 3 +-
4 files changed, 75 insertions(+), 67 deletions(-)
create mode 100644 lib/PublicInbox/LeiAddExternal.pm
diff --git a/MANIFEST b/MANIFEST
index a39afe24aa87..8db9cdc791bb 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -207,6 +207,7 @@ lib/PublicInbox/KQNotify.pm
lib/PublicInbox/LEI.pm
lib/PublicInbox/LI2Wrap.pm
lib/PublicInbox/LeiALE.pm
+lib/PublicInbox/LeiAddExternal.pm
lib/PublicInbox/LeiAddWatch.pm
lib/PublicInbox/LeiAuth.pm
lib/PublicInbox/LeiBlob.pm
diff --git a/lib/PublicInbox/LeiAddExternal.pm b/lib/PublicInbox/LeiAddExternal.pm
new file mode 100644
index 000000000000..5eef206c761c
--- /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;
diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm
index 35a7d68a17b5..5a54cc19281e 100644
--- a/lib/PublicInbox/LeiExternal.pm
+++ b/lib/PublicInbox/LeiExternal.pm
@@ -132,59 +132,6 @@ sub lei_ls_external {
}
}
-sub add_external_finish {
- my ($self, $location) = @_;
- my $cfg = $self->_lei_cfg(1);
- my $new_boost = $self->{opt}->{boost} // 0;
- my $key = "external.$location.boost";
- my $cur_boost = $cfg->{$key};
- return if defined($cur_boost) && $cur_boost == $new_boost; # idempotent
- $self->_config($key, $new_boost);
-}
-
-sub lei_add_external {
- my ($self, $location) = @_;
- my $opt = $self->{opt};
- my $mirror = $opt->{mirror} // do {
- my @fail;
- for my $sw ($self->index_opt, $self->curl_opt,
- qw(no-torsocks torsocks inbox-version)) {
- my ($f) = (split(/|/, $sw, 2))[0];
- next unless defined $opt->{$f};
- $f = length($f) == 1 ? "-$f" : "--$f";
- push @fail, $f;
- }
- if (scalar(@fail) == 1) {
- return $self->("@fail requires --mirror");
- } elsif (@fail) {
- my $last = pop @fail;
- my $fail = join(', ', @fail);
- return $self->("@fail and $last require --mirror");
- }
- undef;
- };
- my $new_boost = $opt->{boost} // 0;
- $location = ext_canonicalize($location);
- if (defined($mirror) && -d $location) {
- $self->fail(<<""); # TODO: did you mean "update-external?"
---mirror destination `$location' already exists
-
- } elsif (-d $location) {
- index($location, "\n") >= 0 and
- return $self->fail("`\\n' not allowed in `$location'");
- }
- if ($location !~ m!\Ahttps?://! && !-d $location) {
- $mirror // return $self->fail("$location not a directory");
- index($location, "\n") >= 0 and
- return $self->fail("`\\n' not allowed in `$location'");
- $mirror = ext_canonicalize($mirror);
- require PublicInbox::LeiMirror;
- PublicInbox::LeiMirror->start($self, $mirror => $location);
- } else {
- add_external_finish($self, $location);
- }
-}
-
# returns an anonymous sub which returns an array of potential results
sub complete_url_prepare {
my $argv = $_[-1]; # $_[0] may be $lei
@@ -223,17 +170,4 @@ sub complete_url_prepare {
wantarray ? ($re, $cur, $match_cb) : $match_cb;
}
-sub _complete_add_external { # for bash, this relies on "compopt -o nospace"
- my ($self, @argv) = @_;
- my $cfg = $self->_lei_cfg;
- my $match_cb = 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;
diff --git a/lib/PublicInbox/LeiMirror.pm b/lib/PublicInbox/LeiMirror.pm
index 1ab5e0d898d2..5cfa6fea851c 100644
--- a/lib/PublicInbox/LeiMirror.pm
+++ b/lib/PublicInbox/LeiMirror.pm
@@ -23,7 +23,8 @@ sub _wq_done_wait { # dwaitpid callback (via wq_eof)
$lei->err("unlink($f): $!") unless $!{ENOENT};
} else {
if ($lei->{cmd} ne 'public-inbox-clone') {
- $lei->add_external_finish($mrr->{dst});
+ $lei->lazy_cb('add-external', '_finish_'
+ )->($lei, $mrr->{dst});
}
$lei->qerr("# mirrored $mrr->{src} => $mrr->{dst}");
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] lei ls-external: split into separate file
2021-09-25 8:49 [PATCH 0/3] lei *-external: split off into separate files Eric Wong
2021-09-25 8:49 ` [PATCH 1/3] lei forget-external: split into separate file Eric Wong
2021-09-25 8:49 ` [PATCH 2/3] lei add-external: " Eric Wong
@ 2021-09-25 8:49 ` Eric Wong
2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2021-09-25 8:49 UTC (permalink / raw)
To: meta
This was written before we had auto-loading and rarely used.
---
MANIFEST | 1 +
lib/PublicInbox/LeiExternal.pm | 26 +-------------------------
lib/PublicInbox/LeiLsExternal.pm | 32 ++++++++++++++++++++++++++++++++
3 files changed, 34 insertions(+), 25 deletions(-)
create mode 100644 lib/PublicInbox/LeiLsExternal.pm
diff --git a/MANIFEST b/MANIFEST
index 8db9cdc791bb..3e942855127f 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -230,6 +230,7 @@ lib/PublicInbox/LeiInit.pm
lib/PublicInbox/LeiInput.pm
lib/PublicInbox/LeiInspect.pm
lib/PublicInbox/LeiLcat.pm
+lib/PublicInbox/LeiLsExternal.pm
lib/PublicInbox/LeiLsLabel.pm
lib/PublicInbox/LeiLsMailSource.pm
lib/PublicInbox/LeiLsMailSync.pm
diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm
index 5a54cc19281e..701d1ad53adf 100644
--- a/lib/PublicInbox/LeiExternal.pm
+++ b/lib/PublicInbox/LeiExternal.pm
@@ -50,7 +50,7 @@ my %re_map = ( '*' => '[^/]*?', '?' => '[^/]',
'[' => '[', ']' => ']', ',' => ',' );
sub glob2re {
- my $re = $_[-1];
+ my $re = $_[-1]; # $_[0] may be $lei
my $p = '';
my $in_bracket = 0;
my $qm = 0;
@@ -108,30 +108,6 @@ sub get_externals {
();
}
-# TODO: does this need JSON output?
-sub lei_ls_external {
- my ($self, $filter) = @_;
- my $opt = $self->{opt};
- my $do_glob = !$opt->{globoff}; # glob by default
- my ($OFS, $ORS) = $opt->{z} ? ("\0", "\0\0") : (" ", "\n");
- $filter //= '*';
- my $re = $do_glob ? glob2re($filter) : undef;
- $re //= index($filter, '/') < 0 ?
- qr!/\Q$filter\E/?\z! : # exact basename match
- qr/\Q$filter\E/; # grep -F semantics
- my @ext = externals_each($self, my $boost = {});
- @ext = $opt->{'invert-match'} ? grep(!/$re/, @ext)
- : grep(/$re/, @ext);
- if ($opt->{'local'} && !$opt->{remote}) {
- @ext = grep(!m!\A[a-z\+]+://!, @ext);
- } elsif ($opt->{remote} && !$opt->{'local'}) {
- @ext = grep(m!\A[a-z\+]+://!, @ext);
- }
- for my $loc (@ext) {
- $self->out($loc, $OFS, 'boost=', $boost->{$loc}, $ORS);
- }
-}
-
# returns an anonymous sub which returns an array of potential results
sub complete_url_prepare {
my $argv = $_[-1]; # $_[0] may be $lei
diff --git a/lib/PublicInbox/LeiLsExternal.pm b/lib/PublicInbox/LeiLsExternal.pm
new file mode 100644
index 000000000000..dd2eb2e7d16e
--- /dev/null
+++ b/lib/PublicInbox/LeiLsExternal.pm
@@ -0,0 +1,32 @@
+# Copyright (C) all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# "lei ls-external" command
+package PublicInbox::LeiLsExternal;
+use strict;
+use v5.10.1;
+
+# TODO: does this need JSON output?
+sub lei_ls_external {
+ my ($lei, $filter) = @_;
+ my $do_glob = !$lei->{opt}->{globoff}; # glob by default
+ my ($OFS, $ORS) = $lei->{opt}->{z} ? ("\0", "\0\0") : (" ", "\n");
+ $filter //= '*';
+ my $re = $do_glob ? $lei->glob2re($filter) : undef;
+ $re //= index($filter, '/') < 0 ?
+ qr!/\Q$filter\E/?\z! : # exact basename match
+ qr/\Q$filter\E/; # grep -F semantics
+ my @ext = $lei->externals_each(my $boost = {});
+ @ext = $lei->{opt}->{'invert-match'} ? grep(!/$re/, @ext)
+ : grep(/$re/, @ext);
+ if ($lei->{opt}->{'local'} && !$lei->{opt}->{remote}) {
+ @ext = grep(!m!\A[a-z\+]+://!, @ext);
+ } elsif ($lei->{opt}->{remote} && !$lei->{opt}->{'local'}) {
+ @ext = grep(m!\A[a-z\+]+://!, @ext);
+ }
+ for my $loc (@ext) {
+ $lei->out($loc, $OFS, 'boost=', $boost->{$loc}, $ORS);
+ }
+}
+
+1;
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-09-25 8:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-25 8:49 [PATCH 0/3] lei *-external: split off into separate files Eric Wong
2021-09-25 8:49 ` [PATCH 1/3] lei forget-external: split into separate file Eric Wong
2021-09-25 8:49 ` [PATCH 2/3] lei add-external: " Eric Wong
2021-09-25 8:49 ` [PATCH 3/3] lei ls-external: " Eric Wong
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).