about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiConfig.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/LeiConfig.pm')
-rw-r--r--lib/PublicInbox/LeiConfig.pm42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/PublicInbox/LeiConfig.pm b/lib/PublicInbox/LeiConfig.pm
new file mode 100644
index 00000000..23be9aaf
--- /dev/null
+++ b/lib/PublicInbox/LeiConfig.pm
@@ -0,0 +1,42 @@
+# Copyright (C) 2021 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+package PublicInbox::LeiConfig;
+use strict;
+use v5.10.1;
+use PublicInbox::PktOp;
+
+sub cfg_do_edit ($;$) {
+        my ($self, $reason) = @_;
+        my $lei = $self->{lei};
+        $lei->pgr_err($reason) if defined $reason;
+        my $cmd = [ qw(git config --edit -f), $self->{-f} ];
+        my $env = { GIT_CONFIG => $self->{-f} };
+        $self->cfg_edit_begin if $self->can('cfg_edit_begin');
+        # run in script/lei foreground
+        my ($op_c, $op_p) = PublicInbox::PktOp->pair;
+        # $op_p will EOF when $EDITOR is done
+        $op_c->{ops} = { '' => [\&cfg_edit_done, $self] };
+        $lei->send_exec_cmd([ @$lei{qw(0 1 2)}, $op_p->{op_p} ], $cmd, $env);
+}
+
+sub cfg_edit_done { # PktOp
+        my ($self) = @_;
+        eval {
+                my $cfg = $self->{lei}->cfg_dump($self->{-f}, $self->{lei}->{2})
+                        // return cfg_do_edit($self, "\n");
+                $self->cfg_verify($cfg) if $self->can('cfg_verify');
+        };
+        $self->{lei}->fail($@) if $@;
+}
+
+sub lei_config {
+        my ($lei, @argv) = @_;
+        $lei->{opt}->{'config-file'} and return $lei->fail(
+                "config file switches not supported by `lei config'");
+        return $lei->_config(@argv) unless $lei->{opt}->{edit};
+        my $f = $lei->_lei_cfg(1)->{-f};
+        my $self = bless { lei => $lei, -f => $f }, __PACKAGE__;
+        cfg_do_edit($self);
+}
+
+1;