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 236DB1FA13 for ; Tue, 5 Jan 2021 09:04:38 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/4] lei: use client env as-is, drop daemon-env command Date: Tue, 5 Jan 2021 09:04:36 +0000 Message-Id: <20210105090437.22801-4-e@80x24.org> In-Reply-To: <20210105090437.22801-1-e@80x24.org> References: <20210105090437.22801-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: There may be subtle misbehaviours when mixing the existing daemon env and the client-supplied env. Just do the simplest thing and use the client env as-is. We'll also start the ->event_step callback since we'll need to remember some things for long-lived commands. --- lib/PublicInbox/LEI.pm | 38 ++++++++++++-------------------------- t/lei.t | 30 +----------------------------- 2 files changed, 13 insertions(+), 55 deletions(-) diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 6073a713..9c3308ad 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -149,8 +149,6 @@ our %CMD = ( # sorted in order of importance/use: 'daemon-kill' => [ '[-SIGNAL]', 'signal the lei-daemon', opt_dash('signal|s=s', '[0-9]+|(?:[A-Z][A-Z0-9]+)') ], 'daemon-pid' => [ '', 'show the PID of the lei-daemon' ], -'daemon-env' => [ '[NAME=VALUE...]', 'set, unset, or show daemon environment', - qw(clear| unset|u=s@ z|0) ], 'help' => [ '[SUBCOMMAND]', 'show help' ], # XXX do we need this? @@ -230,12 +228,6 @@ my %OPTDESC = ( # xargs, env, use "-0", git(1) uses "-z". We support z|0 everywhere 'z|0' => 'use NUL \\0 instead of newline (CR) to delimit lines', -# note: no "--ignore-environment" / "-i" support like env(1) since that -# is one-shot and this is for a persistent daemon: -'clear|' => 'clear the daemon environment', -'unset|u=s@' => ['NAME', - 'unset matching NAME, may be specified multiple times'], - 'signal|s=s' => [ 'SIG', 'signal to send lei-daemon (default: TERM)' ], ); # %OPTDESC @@ -538,24 +530,6 @@ sub lei_daemon_kill { kill($sig, $$) or fail($self, "kill($sig, $$): $!"); } -sub lei_daemon_env { - my ($self, @argv) = @_; - my $opt = $self->{opt}; - if (defined $opt->{clear}) { - %ENV = (); - } elsif (my $u = $opt->{unset}) { - delete @ENV{@$u}; - } - if (@argv) { - %ENV = (%ENV, map { split(/=/, $_, 2) } @argv); - } elsif (!defined($opt->{clear}) && !$opt->{unset}) { - my $eor = $opt->{z} ? "\0" : "\n"; - my $buf = ''; - while (my ($k, $v) = each %ENV) { $buf .= "$k=$v$eor" } - out $self, $buf; - } -} - sub lei_help { _help($_[0]) } # Shell completion helper. Used by lei-completion.bash and hopefully @@ -678,6 +652,7 @@ sub accept_dispatch { # Listener {post_accept} callback }; my %env = map { split(/=/, $_, 2) } split(/\0/, $env); if (chdir($env{PWD})) { + local %ENV = %env; $self->{env} = \%env; $self->{pid} = $client_pid; eval { dispatch($self, split(/\]\0\[/, $argv)) }; @@ -687,6 +662,17 @@ sub accept_dispatch { # Listener {post_accept} callback } } +# for long-running results +sub event_step { + my ($self) = @_; + local %ENV = %{$self->{env}}; + eval {}; # TODO + if ($@) { + say { $self->{sock} } $@; + $self->close; # PublicInbox::DS::close + } +} + sub noop {} # lei(1) calls this when it can't connect diff --git a/t/lei.t b/t/lei.t index 5afb8351..6d47e307 100644 --- a/t/lei.t +++ b/t/lei.t @@ -192,7 +192,7 @@ if ($ENV{TEST_LEI_ONESHOT}) { } SKIP: { # real socket - require_mods(qw(Cwd), my $nr = 46); + require_mods(qw(Cwd), my $nr = 105); my $nfd = eval { require IO::FDPass; 1 } // do { require PublicInbox::Spawn; PublicInbox::Spawn->can('send_3fds') ? 3 : undef; @@ -215,34 +215,6 @@ SKIP: { # real socket chomp(my $pid_again = $out); is($pid, $pid_again, 'daemon-pid idempotent'); - ok($lei->(qw(daemon-env -0)), 'show env'); - is($err, '', 'no errors in env dump'); - my @env = split(/\0/, $out); - is(scalar grep(/\AHOME=\Q$home\E\z/, @env), 1, 'env has HOME'); - is(scalar grep(/\AFOO=BAR\z/, @env), 1, 'env has FOO=BAR'); - is(scalar grep(/\AXDG_RUNTIME_DIR=/, @env), 1, 'has XDG_RUNTIME_DIR'); - - ok($lei->(qw(daemon-env -u FOO)), 'unset'); - is($out.$err, '', 'no output for unset'); - ok($lei->(qw(daemon-env -0)), 'show again'); - is($err, '', 'no errors in env dump'); - @env = split(/\0/, $out); - is(scalar grep(/\AFOO=BAR\z/, @env), 0, 'env unset FOO'); - - ok($lei->(qw(daemon-env -u FOO -u HOME -u XDG_RUNTIME_DIR)), - 'unset multiple'); - is($out.$err, '', 'no errors output for unset'); - - ok($lei->(qw(daemon-env -0)), 'show again'); - is($err, '', 'no errors in env dump'); - @env = split(/\0/, $out); - is(scalar grep(/\A(?:HOME|XDG_RUNTIME_DIR)=\z/, @env), 0, 'env unset@'); - - ok($lei->(qw(daemon-env -)), 'clear env'); - is($out.$err, '', 'no output'); - ok($lei->(qw(daemon-env)), 'env is empty'); - is($out, '', 'env cleared'); - ok($lei->(qw(daemon-kill)), 'daemon-kill'); is($out, '', 'no output from daemon-kill'); is($err, '', 'no error from daemon-kill');