learn --delete-folder CLI option
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:
parent
bb8e03bced
commit
2e81331a3c
@ -153,6 +153,14 @@ is not usable. Possible interface choices are: quiet, basic, syslog, ttyui,
|
|||||||
blinkenlights, machineui.
|
blinkenlights, machineui.
|
||||||
|
|
||||||
|
|
||||||
|
--delete-folder::
|
||||||
|
Delete a folder on the remote repository.
|
||||||
|
+
|
||||||
|
Only one account must be specified/configured for this feature to work. The
|
||||||
|
folder name must be provided in IMAP encoding with the remote separators (likely
|
||||||
|
'/'). E.g.: "Remote/folder/name".
|
||||||
|
|
||||||
|
|
||||||
--migrate-fmd5-using-nametrans::
|
--migrate-fmd5-using-nametrans::
|
||||||
Migrate FMD5 hashes from versions prior to 6.3.5.
|
Migrate FMD5 hashes from versions prior to 6.3.5.
|
||||||
+
|
+
|
||||||
|
@ -183,6 +183,21 @@ class Account(CustomConfig.ConfigHelperMixin):
|
|||||||
self.ui.serverdiagnostics(local_repo, 'Local')
|
self.ui.serverdiagnostics(local_repo, 'Local')
|
||||||
#self.ui.serverdiagnostics(statusrepos, 'Status')
|
#self.ui.serverdiagnostics(statusrepos, 'Status')
|
||||||
|
|
||||||
|
def deletefolder(self, foldername):
|
||||||
|
remote_repo = Repository(self, 'remote')
|
||||||
|
|
||||||
|
try:
|
||||||
|
if self.dryrun:
|
||||||
|
self.ui.info("would try to remove '%s' on remote of '%s' "
|
||||||
|
"account"% (foldername, self))
|
||||||
|
else:
|
||||||
|
remote_repo.deletefolder(foldername)
|
||||||
|
self.ui.info("Folder '%s' deleted."% foldername)
|
||||||
|
return 0
|
||||||
|
except Exception as e:
|
||||||
|
self.ui.error(e)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
class SyncableAccount(Account):
|
class SyncableAccount(Account):
|
||||||
"""A syncable email account connecting 2 repositories.
|
"""A syncable email account connecting 2 repositories.
|
||||||
|
@ -27,7 +27,7 @@ from optparse import OptionParser
|
|||||||
|
|
||||||
import offlineimap
|
import offlineimap
|
||||||
import offlineimap.virtual_imaplib2 as imaplib
|
import offlineimap.virtual_imaplib2 as imaplib
|
||||||
from offlineimap import globals, accounts, threadutil, folder, mbnames
|
from offlineimap import globals, threadutil, accounts, folder, mbnames
|
||||||
from offlineimap.ui import UI_LIST, setglobalui, getglobalui
|
from offlineimap.ui import UI_LIST, setglobalui, getglobalui
|
||||||
from offlineimap.CustomConfig import CustomConfigParser
|
from offlineimap.CustomConfig import CustomConfigParser
|
||||||
from offlineimap.utils import stacktrace
|
from offlineimap.utils import stacktrace
|
||||||
@ -77,6 +77,8 @@ class OfflineImap(object):
|
|||||||
mbnames.init(self.config, self.ui, options.dryrun)
|
mbnames.init(self.config, self.ui, options.dryrun)
|
||||||
mbnames.prune(self.config.get("general", "accounts"))
|
mbnames.prune(self.config.get("general", "accounts"))
|
||||||
mbnames.write()
|
mbnames.write()
|
||||||
|
elif options.deletefolder:
|
||||||
|
return self.__deletefolder(options)
|
||||||
else:
|
else:
|
||||||
return self.__sync(options)
|
return self.__sync(options)
|
||||||
|
|
||||||
@ -148,6 +150,11 @@ class OfflineImap(object):
|
|||||||
help="specifies an alternative user interface"
|
help="specifies an alternative user interface"
|
||||||
" (quiet, basic, syslog, ttyui, blinkenlights, machineui)")
|
" (quiet, basic, syslog, ttyui, blinkenlights, machineui)")
|
||||||
|
|
||||||
|
parser.add_option("--delete-folder", dest="deletefolder",
|
||||||
|
default=None,
|
||||||
|
metavar="FOLDERNAME",
|
||||||
|
help="Delete a folder")
|
||||||
|
|
||||||
parser.add_option("--migrate-fmd5-using-nametrans",
|
parser.add_option("--migrate-fmd5-using-nametrans",
|
||||||
action="store_true", dest="migrate_fmd5", default=False,
|
action="store_true", dest="migrate_fmd5", default=False,
|
||||||
help="migrate FMD5 hashes from versions prior to 6.3.5")
|
help="migrate FMD5 hashes from versions prior to 6.3.5")
|
||||||
@ -475,6 +482,14 @@ class OfflineImap(object):
|
|||||||
account = accounts.Account(self.config, accountname)
|
account = accounts.Account(self.config, accountname)
|
||||||
account.serverdiagnostics()
|
account.serverdiagnostics()
|
||||||
|
|
||||||
|
def __deletefolder(self, options):
|
||||||
|
list_accounts = self._get_activeaccounts(options)
|
||||||
|
if len(list_accounts) != 1:
|
||||||
|
self.ui.error("you must supply only one account with '-a'")
|
||||||
|
return 1
|
||||||
|
account = accounts.Account(self.config, list_accounts.pop())
|
||||||
|
return account.deletefolder(options.deletefolder)
|
||||||
|
|
||||||
def __migratefmd5(self, options):
|
def __migratefmd5(self, options):
|
||||||
for accountname in self._get_activeaccounts(options):
|
for accountname in self._get_activeaccounts(options):
|
||||||
account = accounts.Account(self.config, accountname)
|
account = accounts.Account(self.config, accountname)
|
||||||
|
@ -15,17 +15,16 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
from threading import Event
|
|
||||||
import os
|
import os
|
||||||
from sys import exc_info
|
|
||||||
import netrc
|
import netrc
|
||||||
import errno
|
import errno
|
||||||
import six
|
|
||||||
import codecs
|
import codecs
|
||||||
|
from sys import exc_info
|
||||||
|
from threading import Event
|
||||||
|
import six
|
||||||
|
|
||||||
from offlineimap.repository.Base import BaseRepository
|
|
||||||
from offlineimap import folder, imaputil, imapserver, OfflineImapError
|
from offlineimap import folder, imaputil, imapserver, OfflineImapError
|
||||||
from offlineimap.folder.UIDMaps import MappedIMAPFolder
|
from offlineimap.repository.Base import BaseRepository
|
||||||
from offlineimap.threadutil import ExitNotifyThread
|
from offlineimap.threadutil import ExitNotifyThread
|
||||||
from offlineimap.utils.distro import get_os_sslcertfile, get_os_sslcertfile_searchpath
|
from offlineimap.utils.distro import get_os_sslcertfile, get_os_sslcertfile_searchpath
|
||||||
|
|
||||||
@ -471,6 +470,19 @@ class IMAPRepository(BaseRepository):
|
|||||||
self.folders = retval
|
self.folders = retval
|
||||||
return self.folders
|
return self.folders
|
||||||
|
|
||||||
|
def deletefolder(self, foldername):
|
||||||
|
"""Delete a folder on the IMAP server."""
|
||||||
|
|
||||||
|
imapobj = self.imapserver.acquireconnection()
|
||||||
|
try:
|
||||||
|
result = imapobj.delete(foldername)
|
||||||
|
if result[0] != 'OK':
|
||||||
|
raise OfflineImapError("Folder '%s'[%s] could not be deleted. "
|
||||||
|
"Server responded: %s"% (foldername, self, str(result)),
|
||||||
|
OfflineImapError.ERROR.FOLDER)
|
||||||
|
finally:
|
||||||
|
self.imapserver.releaseconnection(imapobj)
|
||||||
|
|
||||||
def makefolder(self, foldername):
|
def makefolder(self, foldername):
|
||||||
"""Create a folder on the IMAP server
|
"""Create a folder on the IMAP server
|
||||||
|
|
||||||
@ -502,4 +514,4 @@ class IMAPRepository(BaseRepository):
|
|||||||
|
|
||||||
class MappedIMAPRepository(IMAPRepository):
|
class MappedIMAPRepository(IMAPRepository):
|
||||||
def getfoldertype(self):
|
def getfoldertype(self):
|
||||||
return MappedIMAPFolder
|
return folder.UIDMaps.MappedIMAPFolder
|
||||||
|
Loading…
Reference in New Issue
Block a user