]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
lei: consolidate stdin slurp, fix warnings
authorEric Wong <e@80x24.org>
Tue, 17 Oct 2023 10:11:04 +0000 (10:11 +0000)
committerEric Wong <e@80x24.org>
Tue, 17 Oct 2023 20:30:05 +0000 (20:30 +0000)
We can share more code amongst stdin slurper (not streaming)
commands.  This also fixes uninitialized variable warnings when
feeding an empty stdin to these commands.

lib/PublicInbox/LEI.pm
lib/PublicInbox/LeiInspect.pm
lib/PublicInbox/LeiLcat.pm
lib/PublicInbox/LeiQuery.pm
t/lei.t

index b00be1a1dfdc1ab6312ce11df3d3fac15c2e3dd7..1ff6d67fbac4c435f1b1608e9a59cab10eb09722 100644 (file)
@@ -1573,4 +1573,17 @@ sub request_umask {
        $u eq 'u' or warn "E: recv $v has no umask";
 }
 
+sub _stdin_cb { # PublicInbox::InputPipe::consume callback for --stdin
+       my ($lei, $cb) = @_; # $_[-1] = $rbuf
+       $_[1] // return $lei->fail("error reading stdin: $!");
+       $lei->{stdin_buf} .= $_[-1];
+       do_env($lei, $cb) if $_[-1] eq '';
+}
+
+sub slurp_stdin {
+       my ($lei, $cb) = @_;
+       require PublicInbox::InputPipe;
+       PublicInbox::InputPipe::consume($lei->{0}, \&_stdin_cb, $lei, $cb);
+}
+
 1;
index 65c64cf29f6c1a4d0021517430dfe5f233b27c68..d4ad03eb3344806121b1472e9b6578803317adcb 100644 (file)
@@ -253,20 +253,13 @@ sub inspect_start ($$) {
 
 sub do_inspect { # lei->do_env cb
        my ($lei) = @_;
-       my $str = delete $lei->{istr};
+       my $str = delete $lei->{stdin_buf};
        PublicInbox::Eml::strip_from($str);
        my $eml = PublicInbox::Eml->new(\$str);
        inspect_start($lei, [ 'blob:'.$lei->git_oid($eml)->hexdigest,
                        map { "mid:$_" } @{mids($eml)} ]);
 }
 
-sub ins_add { # InputPipe->consume callback
-       my ($lei) = @_; # $_[1] = $rbuf
-       $_[1] // return $lei->fail("error reading stdin: $!");
-       return $lei->{istr} .= $_[1] if $_[1] ne '';
-       $lei->do_env(\&do_inspect);
-}
-
 sub lei_inspect {
        my ($lei, @argv) = @_;
        $lei->{json} = ref(PublicInbox::Config::json())->new->utf8->canonical;
@@ -281,8 +274,7 @@ sub lei_inspect {
                return $lei->fail(<<'') if @argv;
 no args allowed on command-line with --stdin
 
-               require PublicInbox::InputPipe;
-               PublicInbox::InputPipe::consume($lei->{0}, \&ins_add, $lei);
+               $lei->slurp_stdin(\&do_inspect);
        } else {
                inspect_start($lei, \@argv);
        }
index 72875dc653437060c4f9718778bc2afd652fbcd3..274a9605c30cd27c6220702481bd535c4d9191cf 100644 (file)
@@ -124,18 +124,11 @@ could not extract Message-ID from $x
 
 sub do_lcat { # lei->do_env cb
        my ($lei) = @_;
-       my @argv = split(/\s+/, $lei->{mset_opt}->{qstr});
+       my @argv = split(/\s+/, delete($lei->{stdin_buf}));
        $lei->{mset_opt}->{qstr} = extract_all($lei, @argv) or return;
        $lei->_start_query;
 }
 
-sub _stdin { # PublicInbox::InputPipe::consume callback for --stdin
-       my ($lei) = @_; # $_[1] = $rbuf
-       $_[1] // return $lei->fail("error reading stdin: $!");
-       return $lei->{mset_opt}->{qstr} .= $_[1] if $_[1] ne '';
-       $lei->do_env(\&do_lcat);
-}
-
 sub lei_lcat {
        my ($lei, @argv) = @_;
        my $lxs = $lei->lxs_prepare or return;
@@ -152,9 +145,7 @@ sub lei_lcat {
                return $lei->fail(<<'') if @argv;
 no args allowed on command-line with --stdin
 
-               require PublicInbox::InputPipe;
-               PublicInbox::InputPipe::consume($lei->{0}, \&_stdin, $lei);
-               return;
+               return $lei->slurp_stdin(\&do_lcat);
        }
        $lei->{mset_opt}->{qstr} = extract_all($lei, @argv) or return;
        $lei->_start_query;
index e2d8a096a96f0db2e609b52ea1073e8af0442a93..eadf811f43f73f4cc79d2e92724e74c5afc317f9 100644 (file)
@@ -61,19 +61,13 @@ sub _start_query { # used by "lei q" and "lei up"
 
 sub do_qry { # do_env cb
        my ($lei) = @_;
-       $lei->{mset_opt}->{q_raw} = $lei->{mset_opt}->{qstr};
+       $lei->{mset_opt}->{q_raw} = $lei->{mset_opt}->{qstr}
+                                               = delete $lei->{stdin_buf};
        $lei->{lse}->query_approxidate($lei->{lse}->git,
                                        $lei->{mset_opt}->{qstr});
        _start_query($lei);
 }
 
-sub qstr_add { # PublicInbox::InputPipe::consume callback for --stdin
-       my ($lei) = @_; # $_[1] = $rbuf
-       $_[1] // $lei->fail("error reading stdin: $!");
-       return $lei->{mset_opt}->{qstr} .= $_[1] if $_[1] ne '';
-       $lei->do_env(\&do_qry);
-}
-
 # make the URI||PublicInbox::{Inbox,ExtSearch} a config-file friendly string
 sub cfg_ext ($) {
        my ($x) = @_;
@@ -159,9 +153,7 @@ sub lei_q {
                return $self->fail(<<'') if @argv;
 no query allowed on command-line with --stdin
 
-               require PublicInbox::InputPipe;
-               PublicInbox::InputPipe::consume($self->{0}, \&qstr_add, $self);
-               return;
+               return $self->slurp_stdin(\&do_qry);
        }
        chomp(@argv) and $self->qerr("# trailing `\\n' removed");
        $mset_opt{q_raw} = [ @argv ]; # copy
diff --git a/t/lei.t b/t/lei.t
index 3ac804a8e64d2bee6372633d0e7129fdede18339..1dbc9d4cea035b4d28e3649baf44f2db2587d8ae 100644 (file)
--- a/t/lei.t
+++ b/t/lei.t
@@ -182,6 +182,11 @@ my $test_fail = sub {
        }
        lei_ok('sucks', \'yes, but hopefully less every day');
        like($lei_out, qr/loaded features/, 'loaded features shown');
+
+       lei_ok([qw(q --stdin -f text)], undef, { 0 => \'', %$lei_opt });
+       is($lei_err, '', 'no errors on empty stdin');
+       is($lei_out, '', 'no output on empty query');
+
 SKIP: {
        skip 'no curl', 3 unless require_cmd('curl', 1);
        lei(qw(q --only http://127.0.0.1:99999/bogus/ t:m));