py3: raise exceptions using six module
There is no other way to make Python2 and Python3 happy, because syntax raise E, V, T is incompatible with the latter. Signed-off-by: Łukasz Żarnowiecki <dolohow@outlook.com> Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:
parent
83539f8601
commit
0addcbabf0
@ -18,6 +18,8 @@ import os
|
||||
import re
|
||||
from sys import exc_info
|
||||
|
||||
import six
|
||||
|
||||
try:
|
||||
from ConfigParser import SafeConfigParser, Error
|
||||
except ImportError: #python3
|
||||
@ -75,8 +77,8 @@ class CustomConfigParser(SafeConfigParser):
|
||||
val = self.get(section, option).strip()
|
||||
return re.split(separator_re, val)
|
||||
except re.error as e:
|
||||
raise Error("Bad split regexp '%s': %s" % \
|
||||
(separator_re, e)), None, exc_info()[2]
|
||||
six.reraise(Error("Bad split regexp '%s': %s" % \
|
||||
(separator_re, e)), None, exc_info()[2])
|
||||
|
||||
def getdefaultlist(self, section, option, default, separator_re):
|
||||
"""Same as getlist, but returns the value of `default`
|
||||
|
@ -27,6 +27,8 @@ from offlineimap.repository import Repository
|
||||
from offlineimap.ui import getglobalui
|
||||
from offlineimap.threadutil import InstanceLimitedThread
|
||||
|
||||
import six
|
||||
|
||||
try:
|
||||
import fcntl
|
||||
except:
|
||||
@ -226,9 +228,9 @@ class SyncableAccount(Account):
|
||||
pass
|
||||
except IOError:
|
||||
self._lockfd.close()
|
||||
raise OfflineImapError("Could not lock account %s. Is another "
|
||||
six.reraise(OfflineImapError("Could not lock account %s. Is another "
|
||||
"instance using this account?"% self,
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2]
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
|
||||
def _unlock(self):
|
||||
"""Unlock the account, deleting the lock file"""
|
||||
@ -535,10 +537,10 @@ def syncfolder(account, remotefolder, quick):
|
||||
localstart = localfolder.getstartdate()
|
||||
remotestart = remotefolder.getstartdate()
|
||||
if (maxage != None) + (localstart != None) + (remotestart != None) > 1:
|
||||
raise OfflineImapError("You can set at most one of the "
|
||||
six.reraise(OfflineImapError("You can set at most one of the "
|
||||
"following: maxage, startdate (for the local folder), "
|
||||
"startdate (for the remote folder)",
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2]
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
if (maxage != None or localstart or remotestart) and quick:
|
||||
# IMAP quickchanged isn't compatible with options that
|
||||
# involve restricting the messagelist, since the "quick"
|
||||
|
@ -24,6 +24,8 @@ from offlineimap import imaplibutil
|
||||
import offlineimap.accounts
|
||||
from .IMAP import IMAPFolder
|
||||
|
||||
import six
|
||||
|
||||
"""Folder implementation to support features of the Gmail IMAP server."""
|
||||
|
||||
class GmailFolder(IMAPFolder):
|
||||
@ -139,11 +141,10 @@ class GmailFolder(IMAPFolder):
|
||||
res_type, response = imapobj.fetch("'%s'"% msgsToFetch,
|
||||
'(FLAGS X-GM-LABELS UID)')
|
||||
if res_type != 'OK':
|
||||
raise OfflineImapError("FETCHING UIDs in folder [%s]%s failed. " % \
|
||||
six.reraise(OfflineImapError("FETCHING UIDs in folder [%s]%s failed. " % \
|
||||
(self.getrepository(), self) + \
|
||||
"Server responded '[%s] %s'" % \
|
||||
(res_type, response), OfflineImapError.ERROR.FOLDER), \
|
||||
None, exc_info()[2]
|
||||
(res_type, response), OfflineImapError.ERROR.FOLDER), None, exc_info()[2])
|
||||
finally:
|
||||
self.imapserver.releaseconnection(imapobj)
|
||||
|
||||
|
@ -23,6 +23,8 @@ from offlineimap import OfflineImapError
|
||||
import offlineimap.accounts
|
||||
from offlineimap import imaputil
|
||||
|
||||
import six
|
||||
|
||||
class GmailMaildirFolder(MaildirFolder):
|
||||
"""Folder implementation to support adding labels to messages in a Maildir.
|
||||
"""
|
||||
@ -170,9 +172,8 @@ class GmailMaildirFolder(MaildirFolder):
|
||||
try:
|
||||
os.rename(tmppath, filepath)
|
||||
except OSError as e:
|
||||
raise OfflineImapError("Can't rename file '%s' to '%s': %s" % \
|
||||
(tmppath, filepath, e[1]), OfflineImapError.ERROR.FOLDER), \
|
||||
None, exc_info()[2]
|
||||
six.reraise(OfflineImapError("Can't rename file '%s' to '%s': %s" % \
|
||||
(tmppath, filepath, e[1]), OfflineImapError.ERROR.FOLDER), None, exc_info()[2])
|
||||
|
||||
# if utime_from_header=true, we don't want to change the mtime.
|
||||
if self.utime_from_header and mtime:
|
||||
|
@ -27,6 +27,8 @@ from offlineimap import imaputil, imaplibutil, emailutil, OfflineImapError
|
||||
from offlineimap import globals
|
||||
from offlineimap.imaplib2 import MonthNames
|
||||
|
||||
import six
|
||||
|
||||
|
||||
# Globals
|
||||
CRLF = '\r\n'
|
||||
@ -82,8 +84,8 @@ class IMAPFolder(BaseFolder):
|
||||
def getmaxage(self):
|
||||
if self.config.getdefault("Account %s"%
|
||||
self.accountname, "maxage", None):
|
||||
raise OfflineImapError("maxage is not supported on IMAP-IMAP sync",
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2]
|
||||
six.reraise(OfflineImapError("maxage is not supported on IMAP-IMAP sync",
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
|
||||
# Interface from BaseFolder
|
||||
def getcopyinstancelimit(self):
|
||||
@ -607,12 +609,11 @@ class IMAPFolder(BaseFolder):
|
||||
self.imapserver.releaseconnection(imapobj, True)
|
||||
imapobj = self.imapserver.acquireconnection()
|
||||
if not retry_left:
|
||||
raise OfflineImapError("Saving msg (%s) in folder '%s', "
|
||||
six.reraise(OfflineImapError("Saving msg (%s) in folder '%s', "
|
||||
"repository '%s' failed (abort). Server responded: %s\n"
|
||||
"Message content was: %s"%
|
||||
(msg_id, self, self.getrepository(), str(e), dbg_output),
|
||||
OfflineImapError.ERROR.MESSAGE), \
|
||||
None, exc_info()[2]
|
||||
OfflineImapError.ERROR.MESSAGE), None, exc_info()[2])
|
||||
# XXX: is this still needed?
|
||||
self.ui.error(e, exc_info()[2])
|
||||
except imapobj.error as e: # APPEND failed
|
||||
@ -621,10 +622,10 @@ class IMAPFolder(BaseFolder):
|
||||
# drop conn, it might be bad.
|
||||
self.imapserver.releaseconnection(imapobj, True)
|
||||
imapobj = None
|
||||
raise OfflineImapError("Saving msg (%s) folder '%s', repo '%s'"
|
||||
six.reraise(OfflineImapError("Saving msg (%s) folder '%s', repo '%s'"
|
||||
"failed (error). Server responded: %s\nMessage content was: "
|
||||
"%s" % (msg_id, self, self.getrepository(), str(e), dbg_output),
|
||||
OfflineImapError.ERROR.MESSAGE), None, exc_info()[2]
|
||||
OfflineImapError.ERROR.MESSAGE), None, exc_info()[2])
|
||||
# Checkpoint. Let it write out stuff, etc. Eg searches for
|
||||
# just uploaded messages won't work if we don't do this.
|
||||
(typ,dat) = imapobj.check()
|
||||
|
@ -21,6 +21,8 @@ import threading
|
||||
|
||||
from .Base import BaseFolder
|
||||
|
||||
import six
|
||||
|
||||
|
||||
class LocalStatusFolder(BaseFolder):
|
||||
"""LocalStatus backend implemented as a plain text file."""
|
||||
@ -74,7 +76,7 @@ class LocalStatusFolder(BaseFolder):
|
||||
errstr = "Corrupt line '%s' in cache file '%s'" % \
|
||||
(line, self.filename)
|
||||
self.ui.warn(errstr)
|
||||
raise ValueError(errstr), None, exc_info()[2]
|
||||
six.reraise(ValueError(errstr), None, exc_info()[2])
|
||||
self.messagelist[uid] = self.msglist_item_initializer(uid)
|
||||
self.messagelist[uid]['flags'] = flags
|
||||
|
||||
@ -97,7 +99,7 @@ class LocalStatusFolder(BaseFolder):
|
||||
errstr = "Corrupt line '%s' in cache file '%s'"% \
|
||||
(line, self.filename)
|
||||
self.ui.warn(errstr)
|
||||
raise ValueError(errstr), None, exc_info()[2]
|
||||
six.reraise(ValueError(errstr), None, exc_info()[2])
|
||||
self.messagelist[uid] = self.msglist_item_initializer(uid)
|
||||
self.messagelist[uid]['flags'] = flags
|
||||
self.messagelist[uid]['mtime'] = mtime
|
||||
|
@ -17,6 +17,9 @@
|
||||
import os
|
||||
from sys import exc_info
|
||||
from threading import Lock
|
||||
|
||||
import six
|
||||
|
||||
try:
|
||||
import sqlite3 as sqlite
|
||||
except:
|
||||
@ -68,15 +71,15 @@ class LocalStatusSQLiteFolder(BaseFolder):
|
||||
self.connection = sqlite.connect(self.filename, check_same_thread=False)
|
||||
except NameError:
|
||||
# sqlite import had failed.
|
||||
raise UserWarning("SQLite backend chosen, but cannot connect "
|
||||
six.reraise(UserWarning("SQLite backend chosen, but cannot connect "
|
||||
"with available bindings to '%s'. Is the sqlite3 package "
|
||||
"installed?."% self.filename), None, exc_info()[2]
|
||||
"installed?."% self.filename), None, exc_info()[2])
|
||||
except sqlite.OperationalError as e:
|
||||
# Operation had failed.
|
||||
raise UserWarning("cannot open database file '%s': %s.\nYou might "
|
||||
six.reraise(UserWarning("cannot open database file '%s': %s.\nYou might "
|
||||
"want to check the rights to that file and if it cleanly opens "
|
||||
"with the 'sqlite<3>' command."%
|
||||
(self.filename, e)), None, exc_info()[2]
|
||||
(self.filename, e)), None, exc_info()[2])
|
||||
|
||||
# Make sure sqlite is in multithreading SERIALIZE mode.
|
||||
assert sqlite.threadsafety == 1, 'Your sqlite is not multithreading safe.'
|
||||
|
@ -22,6 +22,9 @@ import os
|
||||
from sys import exc_info
|
||||
from .Base import BaseFolder
|
||||
from threading import Lock
|
||||
|
||||
import six
|
||||
|
||||
try:
|
||||
from hashlib import md5
|
||||
except ImportError:
|
||||
@ -309,8 +312,8 @@ class MaildirFolder(BaseFolder):
|
||||
time.sleep(0.23)
|
||||
continue
|
||||
severity = OfflineImapError.ERROR.MESSAGE
|
||||
raise OfflineImapError("Unique filename %s already exists."%
|
||||
filename, severity), None, exc_info()[2]
|
||||
six.reraise(OfflineImapError("Unique filename %s already exists."%
|
||||
filename, severity), None, exc_info()[2])
|
||||
else:
|
||||
raise
|
||||
|
||||
@ -430,10 +433,9 @@ class MaildirFolder(BaseFolder):
|
||||
os.rename(os.path.join(self.getfullname(), oldfilename),
|
||||
os.path.join(self.getfullname(), newfilename))
|
||||
except OSError as e:
|
||||
raise OfflineImapError("Can't rename file '%s' to '%s': %s" % (
|
||||
six.reraise(OfflineImapError("Can't rename file '%s' to '%s': %s" % (
|
||||
oldfilename, newfilename, e[1]),
|
||||
OfflineImapError.ERROR.FOLDER), \
|
||||
None, exc_info()[2]
|
||||
OfflineImapError.ERROR.FOLDER), None, exc_info()[2])
|
||||
|
||||
self.messagelist[uid]['flags'] = flags
|
||||
self.messagelist[uid]['filename'] = newfilename
|
||||
@ -511,10 +513,10 @@ class MaildirFolder(BaseFolder):
|
||||
try:
|
||||
os.rename(filename, newfilename)
|
||||
except OSError as e:
|
||||
raise OfflineImapError(
|
||||
six.reraise(OfflineImapError(
|
||||
"Can't rename file '%s' to '%s': %s" % (
|
||||
filename, newfilename, e[1]),
|
||||
OfflineImapError.ERROR.FOLDER), None, exc_info()[2]
|
||||
OfflineImapError.ERROR.FOLDER), None, exc_info()[2])
|
||||
elif match.group(1) != self._foldermd5:
|
||||
self.ui.warn(("Inconsistent FMD5 for file `%s':"
|
||||
" Neither `%s' nor `%s' found")
|
||||
|
@ -21,6 +21,8 @@ from offlineimap import OfflineImapError
|
||||
from .IMAP import IMAPFolder
|
||||
import os.path
|
||||
|
||||
import six
|
||||
|
||||
class MappedIMAPFolder(IMAPFolder):
|
||||
"""IMAP class to map between Folder() instances where both side assign a uid
|
||||
|
||||
@ -61,8 +63,8 @@ class MappedIMAPFolder(IMAPFolder):
|
||||
try:
|
||||
line = line.strip()
|
||||
except ValueError:
|
||||
raise Exception("Corrupt line '%s' in UID mapping file '%s'"%
|
||||
(line, mapfilename)), None, exc_info()[2]
|
||||
six.reraise(Exception("Corrupt line '%s' in UID mapping file '%s'"%
|
||||
(line, mapfilename)), None, exc_info()[2])
|
||||
(str1, str2) = line.split(':')
|
||||
loc = int(str1)
|
||||
rem = int(str2)
|
||||
@ -88,10 +90,10 @@ class MappedIMAPFolder(IMAPFolder):
|
||||
try:
|
||||
return [mapping[x] for x in items]
|
||||
except KeyError as e:
|
||||
raise OfflineImapError("Could not find UID for msg '{0}' (f:'{1}'."
|
||||
six.reraise(OfflineImapError("Could not find UID for msg '{0}' (f:'{1}'."
|
||||
" This is usually a bad thing and should be reported on the ma"
|
||||
"iling list.".format(e.args[0], self),
|
||||
OfflineImapError.ERROR.MESSAGE), None, exc_info()[2]
|
||||
OfflineImapError.ERROR.MESSAGE), None, exc_info()[2])
|
||||
|
||||
# Interface from BaseFolder
|
||||
def cachemessagelist(self, min_date=None, min_uid=None):
|
||||
|
@ -28,6 +28,8 @@ from offlineimap.ui import getglobalui
|
||||
from offlineimap import OfflineImapError
|
||||
from offlineimap.imaplib2 import IMAP4, IMAP4_SSL, zlib, InternalDate, Mon2num
|
||||
|
||||
import six
|
||||
|
||||
|
||||
class UsefulIMAPMixIn(object):
|
||||
def __getselectedfolder(self):
|
||||
@ -56,7 +58,7 @@ class UsefulIMAPMixIn(object):
|
||||
errstr = "Server '%s' closed connection, error on SELECT '%s'. Ser"\
|
||||
"ver said: %s" % (self.host, mailbox, e.args[0])
|
||||
severity = OfflineImapError.ERROR.FOLDER_RETRY
|
||||
raise OfflineImapError(errstr, severity), None, exc_info()[2]
|
||||
six.reraise(OfflineImapError(errstr, severity), None, exc_info()[2])
|
||||
if result[0] != 'OK':
|
||||
#in case of error, bail out with OfflineImapError
|
||||
errstr = "Error SELECTing mailbox '%s', server reply:\n%s" %\
|
||||
|
@ -34,6 +34,8 @@ from offlineimap import imaplibutil, imaputil, threadutil, OfflineImapError
|
||||
import offlineimap.accounts
|
||||
from offlineimap.ui import getglobalui
|
||||
|
||||
import six
|
||||
|
||||
|
||||
try:
|
||||
# do we have a recent pykerberos?
|
||||
@ -570,7 +572,7 @@ class IMAPServer:
|
||||
"'%s'. Make sure you have configured the ser"\
|
||||
"ver name correctly and that you are online."%\
|
||||
(self.hostname, self.repos)
|
||||
raise OfflineImapError(reason, severity), None, exc_info()[2]
|
||||
six.reraise(OfflineImapError(reason, severity), None, exc_info()[2])
|
||||
|
||||
elif isinstance(e, SSLError) and e.errno == errno.EPERM:
|
||||
# SSL unknown protocol error
|
||||
@ -583,7 +585,7 @@ class IMAPServer:
|
||||
reason = "Unknown SSL protocol connecting to host '%s' for "\
|
||||
"repository '%s'. OpenSSL responded:\n%s"\
|
||||
% (self.hostname, self.repos, e)
|
||||
raise OfflineImapError(reason, severity), None, exc_info()[2]
|
||||
six.reraise(OfflineImapError(reason, severity), None, exc_info()[2])
|
||||
|
||||
elif isinstance(e, socket.error) and e.args[0] == errno.ECONNREFUSED:
|
||||
# "Connection refused", can be a non-existing port, or an unauthorized
|
||||
@ -592,14 +594,14 @@ class IMAPServer:
|
||||
"refused. Make sure you have the right host and port "\
|
||||
"configured and that you are actually able to access the "\
|
||||
"network."% (self.hostname, self.port, self.repos)
|
||||
raise OfflineImapError(reason, severity), None, exc_info()[2]
|
||||
six.reraise(OfflineImapError(reason, severity), None, exc_info()[2])
|
||||
# Could not acquire connection to the remote;
|
||||
# socket.error(last_error) raised
|
||||
if str(e)[:24] == "can't open socket; error":
|
||||
raise OfflineImapError("Could not connect to remote server '%s' "\
|
||||
six.reraise(OfflineImapError("Could not connect to remote server '%s' "\
|
||||
"for repository '%s'. Remote does not answer."
|
||||
% (self.hostname, self.repos),
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2]
|
||||
OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
else:
|
||||
# re-raise all other errors
|
||||
raise
|
||||
|
@ -27,6 +27,8 @@ from offlineimap.folder.UIDMaps import MappedIMAPFolder
|
||||
from offlineimap.threadutil import ExitNotifyThread
|
||||
from offlineimap.utils.distro import get_os_sslcertfile, get_os_sslcertfile_searchpath
|
||||
|
||||
import six
|
||||
|
||||
|
||||
class IMAPRepository(BaseRepository):
|
||||
def __init__(self, reposname, account):
|
||||
@ -107,9 +109,8 @@ class IMAPRepository(BaseRepository):
|
||||
try:
|
||||
host = self.localeval.eval(host)
|
||||
except Exception as e:
|
||||
raise OfflineImapError("remotehosteval option for repository "
|
||||
"'%s' failed:\n%s"% (self, e), OfflineImapError.ERROR.REPO), \
|
||||
None, exc_info()[2]
|
||||
six.reraise(OfflineImapError("remotehosteval option for repository "
|
||||
"'%s' failed:\n%s"% (self, e), OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
if host:
|
||||
self._host = host
|
||||
return self._host
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
from sys import exc_info
|
||||
|
||||
import six
|
||||
|
||||
try:
|
||||
from configparser import NoSectionError
|
||||
except ImportError: #python2
|
||||
@ -68,16 +70,14 @@ class Repository(object):
|
||||
except NoSectionError as e:
|
||||
errstr = ("Could not find section '%s' in configuration. Required "
|
||||
"for account '%s'." % ('Repository %s' % name, account))
|
||||
raise OfflineImapError(errstr, OfflineImapError.ERROR.REPO), \
|
||||
None, exc_info()[2]
|
||||
six.reraise(OfflineImapError(errstr, OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
|
||||
try:
|
||||
repo = typemap[repostype]
|
||||
except KeyError:
|
||||
errstr = "'%s' repository not supported for '%s' repositories."% \
|
||||
(repostype, reqtype)
|
||||
raise OfflineImapError(errstr, OfflineImapError.ERROR.REPO), \
|
||||
None, exc_info()[2]
|
||||
six.reraise(OfflineImapError(errstr, OfflineImapError.ERROR.REPO), None, exc_info()[2])
|
||||
|
||||
return repo(name, account)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user