diff options
author | Eric Wong <e@80x24.org> | 2021-04-17 20:19:12 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-04-18 03:58:48 +0000 |
commit | 7060701075dcb467ed1328f048b96dc0bd446fbb (patch) | |
tree | e578ee0e1d4a69395738ccf701b952b0b9f30636 /lib/PublicInbox/LeiSavedSearch.pm | |
parent | 9c08efbbdb078f403feb1f9821fb13f12d868244 (diff) | |
download | public-inbox-7060701075dcb467ed1328f048b96dc0bd446fbb.tar.gz |
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.
Diffstat (limited to 'lib/PublicInbox/LeiSavedSearch.pm')
-rw-r--r-- | lib/PublicInbox/LeiSavedSearch.pm | 31 |
1 files 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 <<EOM or return $lei->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 <<EOM; +; to refresh with new results, run: lei up $sq_dst +[lei] +$q +[lei "q"] + output = $dst +EOM for my $k (qw(only include exclude)) { my $ary = $lei->{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]); |