]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei forget-mail-sync: new command to drop sync information
authorEric Wong <e@80x24.org>
Tue, 25 May 2021 11:01:36 +0000 (11:01 +0000)
committerEric Wong <e@80x24.org>
Tue, 25 May 2021 18:42:09 +0000 (18:42 +0000)
Sometimes a user stops caring to sync an IMAP or Maildir
folder, or wants to force a resync.  Let them run this
command to have lei forget all the sync information about
the mail folder.

This won't delete any stored messages in git, but will
leave "lei index" users with dangling references.

MANIFEST
lib/PublicInbox/LEI.pm
lib/PublicInbox/LeiForgetMailSync.pm [new file with mode: 0644]
lib/PublicInbox/LeiMailSync.pm
t/lei-import-imap.t

index 2d1ad5c3312ab7da990c2a40c383fd4e08a1f1e2..23423e0b80fe38c590a09745977a3ec74d6b9572 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -204,6 +204,7 @@ lib/PublicInbox/LeiDedupe.pm
 lib/PublicInbox/LeiEditSearch.pm
 lib/PublicInbox/LeiExportKw.pm
 lib/PublicInbox/LeiExternal.pm
+lib/PublicInbox/LeiForgetMailSync.pm
 lib/PublicInbox/LeiForgetSearch.pm
 lib/PublicInbox/LeiHelp.pm
 lib/PublicInbox/LeiImport.pm
index 628908b5bc22ae8e098c4be376fb9aa651e038e4..c8d2f315b72b02da5dbed1f205fdab074649e24d 100644 (file)
@@ -243,7 +243,8 @@ our %CMD = ( # sorted in order of importance/use:
        qw(stdin| offset=i recursive|r exclude=s include|I=s
        lock=s@ in-format|F=s kw! verbose|v+ incremental! mail-sync!),
        qw(no-torsocks torsocks=s), PublicInbox::LeiQuery::curl_opt(), @c_opt ],
-
+'forget-mail-sync' => [ 'LOCATION...',
+       'forget sync information for a mail folder', @c_opt ],
 'export-kw' => [ 'LOCATION...|--all',
        'one-time export of keywords of sync sources',
        qw(all:s mode=s), @c_opt ],
diff --git a/lib/PublicInbox/LeiForgetMailSync.pm b/lib/PublicInbox/LeiForgetMailSync.pm
new file mode 100644 (file)
index 0000000..46dde1a
--- /dev/null
@@ -0,0 +1,30 @@
+# Copyright (C) 2021 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# "lei forget-mail-sync" drop synchronization information
+# TODO: figure out what to do about "lei index" users having
+# dangling references.  Perhaps just documenting "lei index"
+# use being incompatible with "forget-mail-sync" use is
+# sufficient.
+
+package PublicInbox::LeiForgetMailSync;
+use strict;
+use v5.10.1;
+use PublicInbox::LeiExportKw;
+
+sub lei_forget_mail_sync {
+       my ($lei, @folders) = @_;
+       my $sto = $lei->_lei_store or return;
+       my $lms = $sto->search->lms or return;
+       my $err = $lms->arg2folder($lei, \@folders);
+       $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
+       return $lei->fail($err->{fail}) if $err->{fail};
+       delete $lms->{dbh};
+       $lms->lms_begin;
+       $lms->forget_folder($_) for @folders;
+       $lms->lms_commit;
+}
+
+*_complete_forget_mail_sync = \&PublicInbox::LeiExportKw::_complete_export_kw;
+
+1;
index 094cf1fd86ca41918cc8abf1c6123d5384cfaa82..d9c305800bad91bb4eab51f45e6609dec3afcc31 100644 (file)
@@ -345,4 +345,15 @@ EOF
        $err;
 }
 
+sub forget_folder {
+       my ($self, $folder) = @_;
+       my ($fid, $sth);
+       $fid = delete($self->{fmap}->{$folder}) //
+               _fid_for($self, $folder) // return;
+       my $dbh = $self->{dbh};
+       $dbh->do('DELETE FROM blob2name WHERE fid = ?', undef, $fid);
+       $dbh->do('DELETE FROM blob2num WHERE fid = ?', undef, $fid);
+       $dbh->do('DELETE FROM folders WHERE fid = ?', undef, $fid);
+}
+
 1;
index d3935c828514c4895cc4f511419b10be88e7758b..5283cc23c6e96c151066e742c4be134a87f6cd8d 100644 (file)
@@ -71,5 +71,9 @@ test_lei({ tmpdir => $tmpdir }, sub {
        like($lei_out, qr!^Content-Type: multipart/mixed;!sm, 'got full blob');
        lei_ok('blob', "$psgi_attach:2");
        is($lei_out, "b64\xde\xad\xbe\xef\n", 'got attachment');
+
+       lei_ok 'forget-mail-sync', $url;
+       lei_ok 'ls-mail-sync';
+       unlike($lei_out, qr!\Q$host_port\E!, 'sync info gone after forget');
 });
 done_testing;