]> Sergey Matveev's repositories - public-inbox.git/blob - lib/PublicInbox/LeiForgetSearch.pm
lei forget-search: support --prune=<local|remote>
[public-inbox.git] / lib / PublicInbox / LeiForgetSearch.pm
1 # Copyright (C) 2021 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3
4 # "lei forget-search" forget/remove a saved search "lei q --save"
5 package PublicInbox::LeiForgetSearch;
6 use strict;
7 use v5.10.1;
8 use parent qw(PublicInbox::LeiUp);
9 use PublicInbox::LeiSavedSearch;
10 use File::Path ();
11 use SelectSaver;
12
13 sub do_forget_search {
14         my ($lei, @outs) = @_;
15         my @dirs; # paths in ~/.local/share/lei/saved-search/
16         my $cwd;
17         for my $o (@outs) {
18                 my $d = PublicInbox::LeiSavedSearch::lss_dir_for($lei, \$o, 1);
19                 if (-e $d) {
20                         push @dirs, $d
21                 } else { # keep going, like rm(1):
22                         $cwd //= $lei->rel2abs('.');
23                         warn "--save was not used with $o cwd=$cwd\n";
24                 }
25         }
26         my $save;
27         my $opt = { safe => 1 };
28         if ($lei->{opt}->{verbose}) {
29                 $opt->{verbose} = 1;
30                 $save = SelectSaver->new($lei->{2});
31         }
32         File::Path::remove_tree(@dirs, $opt);
33         $lei->child_error(0) if defined $cwd;
34 }
35
36 sub lei_forget_search {
37         my ($lei, @outs) = @_;
38         my $prune = $lei->{opt}->{prune};
39         $prune // return do_forget_search($lei, @outs);
40         return $lei->fail("--prune and @outs incompatible") if @outs;
41         my @tmp = PublicInbox::LeiSavedSearch::list($lei);
42         my $self = bless { -mail_sync => 1 }, __PACKAGE__;
43         $self->filter_lss($lei, $prune) // return
44                         $lei->fail("only --prune=$prune not understood");
45         if ($self->{o_remote}) { # setup lei->{auth}
46                 $self->prepare_inputs($lei, $self->{o_remote}) or return;
47         }
48         my $ops = {};
49         $lei->{auth}->op_merge($ops, $self) if $lei->{auth};
50         (my $op_c, $ops) = $lei->workers_start($self, 1, $ops);
51         $lei->{wq1} = $self;
52         net_merge_all_done($self) unless $lei->{auth};
53         $lei->wait_wq_events($op_c, $ops);
54 }
55
56 sub do_prune {
57         my ($self) = @_;
58         my $lei = $self->{lei};
59         for my $o (@{$self->{o_local} // []}) {
60                 next if -e $o;
61                 $lei->qerr("# pruning $o");
62                 eval { do_forget_search($lei, $o) };
63                 $lei->child_error(0, "E: $@") if $@;
64         }
65         for my $o (@{$self->{o_remote} // []}) {
66                 my $uri = PublicInbox::URIimap->new($o);
67                 next if $lei->{net}->mic_for_folder($uri);
68                 $lei->qerr("# pruning $uri");
69                 eval { do_forget_search($lei, $o) };
70                 $lei->child_error(0, "E: $@") if $@;
71         }
72 }
73
74 # called in top-level lei-daemon when LeiAuth is done
75 sub net_merge_all_done {
76         my ($self) = @_;
77         $self->wq_do('do_prune');
78         $self->wq_close;
79 }
80
81 *_wq_done_wait = \&PublicInbox::LEI::wq_done_wait;
82 *_complete_forget_search = \&PublicInbox::LeiUp::_complete_up;
83
84 1;