public-inbox.git  about / heads / tags
an "archives first" approach to mailing lists
blob a50ff2b600006a8c81ed6145bdc2fd2b76b55b05 1718 bytes (raw)
$ git show HEAD:lib/PublicInbox/LeiConfig.pm	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
package PublicInbox::LeiConfig; # subclassed by LeiEditSearch
use v5.12;
use PublicInbox::PktOp;
use Fcntl qw(SEEK_SET);
use autodie qw(open seek);
use PublicInbox::IO qw(read_all);

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, $lei, $self] };
	$lei->send_exec_cmd([ @$lei{qw(0 1 2)}, $op_p->{op_p} ], $cmd, $env);
}

sub cfg_edit_done { # PktOp lei->do_env cb
	my ($lei, $self) = @_;
	open my $fh, '+>', undef;
	my $cfg = do {
		local $lei->{2} = $fh;
		$lei->cfg_dump($self->{-f});
	} or do {
		seek($fh, 0, SEEK_SET);
		return cfg_do_edit($self, read_all($fh));
	};
	$self->cfg_verify($cfg) if $self->can('cfg_verify');
}

sub lei_config {
	my ($lei, @argv) = @_;
	$lei->{opt}->{'config-file'} and return $lei->fail(
		"config file switches not supported by `lei config'");
	if ($lei->{opt}->{edit}) {
		@argv and return $lei->fail(
'--edit must be used without other arguments');
		$lei->{opt}->{c} and return $lei->fail(
"`-c $lei->{opt}->{c}->[0]' not allowed with --edit");
		my $f = $lei->_lei_cfg(1)->{-f};
		cfg_do_edit(bless { lei => $lei, -f => $f }, __PACKAGE__);
	} elsif (@argv) { # let git-config do error-checking
		$lei->_config(@argv);
	} else {
		$lei->_help('no options given');
	}
}

1;

git clone https://public-inbox.org/public-inbox.git
git clone http://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/public-inbox.git