about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-05-25 11:01:36 +0000
committerEric Wong <e@80x24.org>2021-05-25 18:42:09 +0000
commitbfe6a3e13c286d60a5bfa46cef7625f83ae0ca18 (patch)
treea600016bf97e6364e1cb4990f11700d74a84c133 /lib
parent172d2d126cb9c0fa78b41a01f285f9294cc78f15 (diff)
downloadpublic-inbox-bfe6a3e13c286d60a5bfa46cef7625f83ae0ca18.tar.gz
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/LEI.pm3
-rw-r--r--lib/PublicInbox/LeiForgetMailSync.pm30
-rw-r--r--lib/PublicInbox/LeiMailSync.pm11
3 files changed, 43 insertions, 1 deletions
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;