]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei: use client env as-is, drop daemon-env command
authorEric Wong <e@80x24.org>
Tue, 5 Jan 2021 09:04:36 +0000 (09:04 +0000)
committerEric Wong <e@80x24.org>
Wed, 6 Jan 2021 10:45:08 +0000 (10:45 +0000)
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
t/lei.t

index 6073a7134ade20296e8c035a53db4887c5533e1e..9c3308ad143e98085505507c066ac1c528a7bdcc 100644 (file)
@@ -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 5afb83511d11053be785c2db6f650a0a74415ff1..6d47e30707904d82ce60cdfaf75987d4f5bdd23c 100644 (file)
--- 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');