From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 395CA1FA00 for ; Wed, 10 Feb 2021 07:07:50 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/6] lei ls-external: support --local and --remote Date: Wed, 10 Feb 2021 07:07:47 +0000 Message-Id: <20210210070749.30391-5-e@80x24.org> In-Reply-To: <20210210070749.30391-1-e@80x24.org> References: <20210210070749.30391-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Similar to "lei q", "--local" means only local and "--remote" means remote only. I can't think of a reason to have --no-* variants for these switches. There's also updates to the TestCommon for more common lei cases. --- lib/PublicInbox/LeiExternal.pm | 12 +++++++++--- lib/PublicInbox/TestCommon.pm | 11 ++++++++++- t/lei-externals.t | 36 +++++++++++++++++++++++++--------- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm index b4e1918d..b402eed4 100644 --- a/lib/PublicInbox/LeiExternal.pm +++ b/lib/PublicInbox/LeiExternal.pm @@ -101,16 +101,22 @@ sub get_externals { sub lei_ls_external { my ($self, $filter) = @_; - my $do_glob = !$self->{opt}->{globoff}; # glob by default - my ($OFS, $ORS) = $self->{opt}->{z} ? ("\0", "\0\0") : (" ", "\n"); + 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 = $self->{opt}->{'invert-match'} ? grep(!/$re/, @ext) + @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); } diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index 64fe0499..f5b3fae4 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -9,12 +9,14 @@ use v5.10.1; use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD :seek); use POSIX qw(dup2); use IO::Socket::INET; +use File::Spec; our @EXPORT; BEGIN { @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods run_script start_script key2sub xsys xsys_e xqx eml_load tick have_xapian_compact json_utf8 setup_public_inboxes - tcp_host_port test_lei lei $lei $lei_out $lei_err $lei_opt); + tcp_host_port test_lei lei lei_ok + $lei $lei_out $lei_err $lei_opt); require Test::More; my @methods = grep(!/\W/, @Test::More::EXPORT); eval(join('', map { "*$_=\\&Test::More::$_;" } @methods)); @@ -459,6 +461,13 @@ our $lei = sub { sub lei (@) { $lei->(@_) } +sub lei_ok (@) { + my $msg = ref($_[-1]) ? pop(@_) : undef; + # filter out anything that looks like a path name for consistent logs + my @msg = grep(!m!\A/!, @_); + ok($lei->(@_), "lei @msg". ($msg ? " ($$msg)" : '')); +} + sub json_utf8 () { state $x = ref(PublicInbox::Config->json)->new->utf8->canonical; } diff --git a/t/lei-externals.t b/t/lei-externals.t index 28c01174..9fc8bae9 100644 --- a/t/lei-externals.t +++ b/t/lei-externals.t @@ -35,20 +35,20 @@ test_lei(sub { my $home = $ENV{HOME}; my $config_file = "$home/.config/lei/config"; my $store_dir = "$home/.local/share/lei"; - ok($lei->('ls-external'), 'ls-external works'); + lei_ok 'ls-external', \'ls-external on fresh install'; is($lei_out.$lei_err, '', 'ls-external no output, yet'); ok(!-e $config_file && !-e $store_dir, 'nothing created by ls-external'); - ok(!$lei->('add-external', "$home/nonexistent"), - "fails on non-existent dir"); - ok($lei->('ls-external'), 'ls-external works after add failure'); + ok(!lei('add-external', "$home/nonexistent", + "fails on non-existent dir")); + lei_ok('ls-external', \'ls-external works after add failure'); is($lei_out.$lei_err, '', 'ls-external still has no output'); my $cfg = PublicInbox::Config->new($cfg_path); $cfg->each_inbox(sub { my ($ibx) = @_; - ok($lei->(qw(add-external -q), $ibx->{inboxdir}), - 'added external'); + lei_ok(qw(add-external -q), $ibx->{inboxdir}, + \'added external'); is($lei_out.$lei_err, '', 'no output'); }); ok(-s $config_file && -e $store_dir, @@ -59,12 +59,30 @@ test_lei(sub { is($lcfg->{"external.$ibx->{inboxdir}.boost"}, 0, "configured boost on $ibx->{name}"); }); - $lei->('ls-external'); + lei_ok 'ls-external'; like($lei_out, qr/boost=0\n/s, 'ls-external has output'); - ok($lei->(qw(add-external -q https://EXAMPLE.com/ibx)), 'add remote'); + lei_ok qw(add-external -q https://EXAMPLE.com/ibx), \'add remote'; is($lei_err, '', 'no warnings after add-external'); - ok($lei->(qw(_complete lei forget-external)), 'complete for externals'); + { + lei_ok qw(ls-external --remote); + my $r_only = +{ map { $_ => 1 } split(/^/m, $lei_out) }; + lei_ok qw(ls-external --local); + my $l_only = +{ map { $_ => 1 } split(/^/m, $lei_out) }; + lei_ok 'ls-external'; + is_deeply([grep { $l_only->{$_} } keys %$r_only], [], + 'no locals in --remote'); + is_deeply([grep { $r_only->{$_} } keys %$l_only], [], + 'no remotes in --local'); + my $all = +{ map { $_ => 1 } split(/^/m, $lei_out) }; + is_deeply($all, { %$r_only, %$l_only }, + 'default output combines remote + local'); + lei_ok qw(ls-external --remote --local); + my $both = +{ map { $_ => 1 } split(/^/m, $lei_out) }; + is_deeply($all, $both, '--remote --local == no args'); + } + + lei_ok qw(_complete lei forget-external), \'complete for externals'; my %comp = map { $_ => 1 } split(/\s+/, $lei_out); ok($comp{'https://example.com/ibx/'}, 'forget external completion'); $cfg->each_inbox(sub {