about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--MANIFEST1
-rw-r--r--lib/PublicInbox/LEI.pm3
-rw-r--r--lib/PublicInbox/LeiForgetMailSync.pm30
-rw-r--r--lib/PublicInbox/LeiMailSync.pm11
-rw-r--r--t/lei-import-imap.t4
5 files changed, 48 insertions, 1 deletions
diff --git a/MANIFEST b/MANIFEST
index 2d1ad5c3..23423e0b 100644
--- 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
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index 628908b5..c8d2f315 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -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
index 00000000..46dde1a7
--- /dev/null
+++ b/lib/PublicInbox/LeiForgetMailSync.pm
@@ -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;
diff --git a/lib/PublicInbox/LeiMailSync.pm b/lib/PublicInbox/LeiMailSync.pm
index 094cf1fd..d9c30580 100644
--- a/lib/PublicInbox/LeiMailSync.pm
+++ b/lib/PublicInbox/LeiMailSync.pm
@@ -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;
diff --git a/t/lei-import-imap.t b/t/lei-import-imap.t
index d3935c82..5283cc23 100644
--- a/t/lei-import-imap.t
+++ b/t/lei-import-imap.t
@@ -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;