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-ASN: 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 E096B1F4B4 for ; Sat, 17 Apr 2021 20:19:12 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] lei_saved_search: avoid git-config Date: Sat, 17 Apr 2021 20:19:12 +0000 Message-Id: <20210417201912.26013-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Repeated vfork+execv costing us around 20ms on t/lei-q-save.t, so just learn to quote git-config values and write directly to the config file. --- lib/PublicInbox/LeiSavedSearch.pm | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm index e44779ee..f40fe76b 100644 --- a/lib/PublicInbox/LeiSavedSearch.pm +++ b/lib/PublicInbox/LeiSavedSearch.pm @@ -15,6 +15,14 @@ use Digest::SHA qw(sha256_hex); *squote_maybe = \&PublicInbox::Config::squote_maybe; +# move this to PublicInbox::Config if other things use it: +my %cquote = ("\n" => '\\n', "\t" => '\\t', "\b" => '\\b'); +sub cquote_val ($) { # cf. git-config(1) + my ($val) = @_; + $val =~ s/([\n\t\b])/$cquote{$1}/g; + $val; +} + sub lss_dir_for ($$) { my ($lei, $dstref) = @_; my @n; @@ -54,29 +62,32 @@ sub new { my $f = $self->{'-f'} = "$dir/lei.saved-search"; open my $fh, '>', $f or return $lei->fail("open $f: $!"); my $sq_dst = squote_maybe($dst); - print $fh <fail("print $f: $!"); -; to refresh with new results, run: lei up $sq_dst -EOM - close $fh or return $lei->fail("close $f: $!"); my $q = $lei->{mset_opt}->{q_raw} // die 'BUG: {q_raw} missing'; if (ref $q) { - cfg_set($self, '--add', 'lei.q', $_) for @$q; + $q = join("\n", map { "\tq = ".cquote_val($_) } @$q); } else { - cfg_set($self, 'lei.q', $q); + $q = "\tq = ".cquote_val($q); } $dst = "$lei->{ovv}->{fmt}:$dst" if $dst !~ m!\Aimaps?://!i; - cfg_set($self, 'lei.q.output', $dst); + print $fh <{opt}->{$k} // next; for my $x (@$ary) { - cfg_set($self, '--add', "lei.q.$k", $x); + print $fh "\t$k = ".cquote_val($x)."\n"; } } for my $k (qw(external local remote import-remote import-before threads)) { my $val = $lei->{opt}->{$k} // next; - cfg_set($self, "lei.q.$k", $val); + print $fh "\t$k = ".cquote_val($val)."\n"; } + close($fh) or return $lei->fail("close $f: $!"); } bless $self->{-cfg}, 'PublicInbox::Config'; $self->{lock_path} = "$self->{-f}.flock"; @@ -86,7 +97,7 @@ EOM sub description { $_[0]->{qstr} } # for WWW -sub cfg_set { +sub cfg_set { # called by LeiXSearch my ($self, @args) = @_; my $lk = $self->lock_for_scope; # git-config doesn't wait run_die([qw(git config -f), $self->{'-f'}, @args]);