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 89D991FA18 for ; Fri, 16 Apr 2021 23:10:36 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 7/9] lei up: support output destination as arg Date: Fri, 16 Apr 2021 16:10:33 -0700 Message-Id: <20210416231035.31807-8-e@80x24.org> In-Reply-To: <20210416231035.31807-1-e@80x24.org> References: <20210416231035.31807-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Specifying a directory in ~/.local/share/lei/saved-searches/ is painful, so support (and start encouraging) the use of the output. --- lib/PublicInbox/LeiSavedSearch.pm | 55 ++++++++++++++++++++++++------- lib/PublicInbox/LeiUp.pm | 4 +-- t/lei-q-save.t | 11 +++++++ 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm index ebc63091..93b1b23a 100644 --- a/lib/PublicInbox/LeiSavedSearch.pm +++ b/lib/PublicInbox/LeiSavedSearch.pm @@ -13,24 +13,39 @@ use PublicInbox::Spawn qw(run_die); use PublicInbox::ContentHash qw(git_sha); use Digest::SHA qw(sha256_hex); +sub lss_dir_for ($$) { + my ($lei, $dstref) = @_; + my @n; + if ($$dstref =~ m,\Aimaps?://,i) { # already canonicalized + require PublicInbox::URIimap; + my $uri = PublicInbox::URIimap->new($$dstref)->canonical; + $$dstref = $$uri; + @n = ($uri->mailbox); + } else { # basename + @n = ($$dstref =~ m{([\w\-\.]+)/*\z}); + $$dstref = $lei->rel2abs($$dstref); + } + push @n, sha256_hex($$dstref); + $lei->share_path . '/saved-searches/' . join('-', @n); +} + sub new { my ($cls, $lei, $dir) = @_; - my $self = bless { ale => $lei->ale, -cfg => {} }, $cls; + my $self = bless { ale => $lei->ale }, $cls; if (defined $dir) { # updating existing saved search via "lei up" - my $f = $self->{'-f'} = "$dir/lei.saved-search"; - -f $f && -r _ or + my $f = "$dir/lei.saved-search"; + ((-f $f && -r _) || output2lssdir($self, $lei, \$dir, \$f)) or return $lei->fail("$f non-existent or unreadable"); - $self->{-cfg} = PublicInbox::Config::git_config_dump($f); + $self->{-cfg} //= PublicInbox::Config::git_config_dump($f); + $self->{'-f'} = $f; } else { # new saved search "lei q --save" - my $saved_dir = $lei->share_path . '/saved-searches/'; - my (@n) = ($lei->{ovv}->{dst} =~ m{([\w\-\.]+)/*\z}); - my $q = $lei->{mset_opt}->{q_raw} // die 'BUG: {q_raw} missing'; - push @n, sha256_hex("$lei->{ovv}->{fmt}\0$lei->{ovv}->{dst}"); - - $dir = $saved_dir . join('-', @n); + my $dst = $lei->{ovv}->{dst}; + $dir = lss_dir_for($lei, \$dst); require File::Path; File::Path::make_path($dir); # raises on error + $self->{-cfg} = {}; $self->{'-f'} = "$dir/lei.saved-search"; + my $q = $lei->{mset_opt}->{q_raw} // die 'BUG: {q_raw} missing'; if (ref $q) { cfg_set($self, '--add', 'lei.q', $_) for @$q; } else { @@ -38,7 +53,8 @@ sub new { } my $fmt = $lei->{opt}->{'format'}; cfg_set($self, 'lei.q.format', $fmt) if defined $fmt; - cfg_set($self, 'lei.q.output', $lei->{opt}->{output}); + $dst = "$lei->{ovv}->{fmt}:$dst" if $dst !~ m!\Aimaps?://!i; + cfg_set($self, 'lei.q.output', $dst); for my $k (qw(only include exclude)) { my $ary = $lei->{opt}->{$k} // next; for my $x (@$ary) { @@ -127,6 +143,23 @@ sub mm { undef } sub altid_map { {} } sub cloneurl { [] } + +# find existing directory containing a `lei.saved-search' file based on +# $dir_ref which is an output +sub output2lssdir { + my ($self, $lei, $dir_ref, $fn_ref) = @_; + my $dst = $$dir_ref; # imap://$MAILBOX, /path/to/maildir, /path/to/mbox + my $dir = lss_dir_for($lei, \$dst); + my $f = "$dir/lei.saved-search"; + if (-f $f && -r _) { + $self->{-cfg} = PublicInbox::Config::git_config_dump($f); + $$dir_ref = $dir; + $$fn_ref = $f; + return 1; + } + undef; +} + no warnings 'once'; *nntp_url = \&cloneurl; *base_url = \&PublicInbox::Inbox::base_url; diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm index 386a7566..7ddb1dd0 100644 --- a/lib/PublicInbox/LeiUp.pm +++ b/lib/PublicInbox/LeiUp.pm @@ -9,9 +9,9 @@ use PublicInbox::LeiSavedSearch; use PublicInbox::LeiOverview; sub lei_up { - my ($lei, $dir) = @_; + my ($lei, $out) = @_; $lei->{lse} = $lei->_lei_store(1)->search; - my $lss = PublicInbox::LeiSavedSearch->new($lei, $dir) or return; + my $lss = PublicInbox::LeiSavedSearch->new($lei, $out) or return; my $mset_opt = $lei->{mset_opt} = { relevance => -2 }; $mset_opt->{limit} = $lei->{opt}->{limit} // 10000; my $q = $mset_opt->{q_raw} = $lss->{-cfg}->{'lei.q'} // diff --git a/t/lei-q-save.t b/t/lei-q-save.t index 6cfac20b..d43f508b 100644 --- a/t/lei-q-save.t +++ b/t/lei-q-save.t @@ -7,6 +7,8 @@ my $doc1 = eml_load('t/plack-qp.eml'); $doc1->header_set('Date', PublicInbox::Smsg::date({ds => time - (86400 * 5)})); my $doc2 = eml_load('t/utf8.eml'); $doc2->header_set('Date', PublicInbox::Smsg::date({ds => time - (86400 * 4)})); +my $doc3 = eml_load('t/msg_iter-order.eml'); +$doc3->header_set('Date', PublicInbox::Smsg::date({ds => time - (86400 * 4)})); test_lei(sub { my $home = $ENV{HOME}; @@ -38,5 +40,14 @@ test_lei(sub { $cfg = PublicInbox::Config->new("$s[0]/lei.saved-search"); is_deeply $cfg->{'lei.q'}, 'd:last.week..', 'q --stdin stores relative time'; + my $size = -s "$home/mbcl2"; + ok(defined($size) && $size > 0, 'results written'); + lei_ok([qw(up mbcl2)], undef, { -C => $home, %$lei_opt }); + is(-s "$home/mbcl2", $size, 'size unchanged on noop up'); + + $in = $doc3->as_string; + lei_ok [qw(import -q -F eml -)], undef, { 0 => \$in, %$lei_opt }; + lei_ok([qw(up mbcl2)], undef, { -C => $home, %$lei_opt }); + ok(-s "$home/mbcl2" > $size, 'size increased after up'); }); done_testing;