From 7945e10a7609d207b184cb06208eb2ab41c05f21 Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Wed, 29 Jun 2016 03:42:57 +0200 Subject: [PATCH] correctly reraise errors with six Signed-off-by: Nicolas Sebrecht --- offlineimap/CustomConfig.py | 9 ++++--- offlineimap/accounts.py | 19 ++++++++------ offlineimap/folder/Gmail.py | 12 ++++++--- offlineimap/folder/GmailMaildir.py | 9 ++++--- offlineimap/folder/IMAP.py | 31 ++++++++++++++--------- offlineimap/folder/LocalStatus.py | 6 ++--- offlineimap/folder/LocalStatusSQLite.py | 13 ++++++---- offlineimap/folder/Maildir.py | 31 ++++++++++++++--------- offlineimap/folder/UIDMaps.py | 30 +++++++++++++--------- offlineimap/imaplibutil.py | 10 +++++--- offlineimap/imapserver.py | 33 +++++++++++++++---------- offlineimap/repository/IMAP.py | 8 ++++-- offlineimap/repository/__init__.py | 14 ++++++----- 13 files changed, 139 insertions(+), 86 deletions(-) diff --git a/offlineimap/CustomConfig.py b/offlineimap/CustomConfig.py index 8fc62c6..b5d58e8 100644 --- a/offlineimap/CustomConfig.py +++ b/offlineimap/CustomConfig.py @@ -16,9 +16,8 @@ import os import re -from sys import exc_info - import six +from sys import exc_info try: from ConfigParser import SafeConfigParser, Error @@ -77,8 +76,10 @@ class CustomConfigParser(SafeConfigParser): val = self.get(section, option).strip() return re.split(separator_re, val) except re.error as e: - six.reraise(Error("Bad split regexp '%s': %s" % \ - (separator_re, e)), None, exc_info()[2]) + six.reraise(Error, + Error("Bad split regexp '%s': %s"% + (separator_re, e)), + exc_info()[2]) def getdefaultlist(self, section, option, default, separator_re): """Same as getlist, but returns the value of `default` diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py index 67dddfb..682a2d6 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -228,9 +228,12 @@ class SyncableAccount(Account): pass except IOError: self._lockfd.close() - six.reraise(OfflineImapError("Could not lock account %s. Is another " - "instance using this account?"% self, - OfflineImapError.ERROR.REPO), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError( + "Could not lock account %s. Is another " + "instance using this account?"% self, + OfflineImapError.ERROR.REPO), + exc_info()[2]) def _unlock(self): """Unlock the account, deleting the lock file""" @@ -552,10 +555,12 @@ def syncfolder(account, remotefolder, quick): localstart = localfolder.getstartdate() remotestart = remotefolder.getstartdate() if (maxage != None) + (localstart != None) + (remotestart != None) > 1: - 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]) + six.reraise(OfflineImapError, + OfflineImapError("You can set at most one of the " + "following: maxage, startdate (for the local " + "folder), startdate (for the remote folder)", + OfflineImapError.ERROR.REPO), + 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" diff --git a/offlineimap/folder/Gmail.py b/offlineimap/folder/Gmail.py index f81e1f2..bc39f8e 100644 --- a/offlineimap/folder/Gmail.py +++ b/offlineimap/folder/Gmail.py @@ -139,10 +139,14 @@ class GmailFolder(IMAPFolder): res_type, response = imapobj.fetch("'%s'"% msgsToFetch, '(FLAGS X-GM-LABELS UID)') if res_type != 'OK': - 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]) + six.reraise(OfflineImapError, + OfflineImapError( + "FETCHING UIDs in folder [%s]%s failed. "% + (self.getrepository(), self) + + "Server responded '[%s] %s'"% + (res_type, response), + OfflineImapError.ERROR.FOLDER), + exc_info()[2]) finally: self.imapserver.releaseconnection(imapobj) diff --git a/offlineimap/folder/GmailMaildir.py b/offlineimap/folder/GmailMaildir.py index 65626ea..8301623 100644 --- a/offlineimap/folder/GmailMaildir.py +++ b/offlineimap/folder/GmailMaildir.py @@ -1,5 +1,5 @@ # Maildir folder support with labels -# Copyright (C) 2002 - 2016 John Goerzen & contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -176,8 +176,11 @@ class GmailMaildirFolder(MaildirFolder): try: os.rename(tmppath, filepath) except OSError as e: - six.reraise(OfflineImapError("Can't rename file '%s' to '%s': %s" % \ - (tmppath, filepath, e[1]), OfflineImapError.ERROR.FOLDER), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError("Can't rename file '%s' to '%s': %s"% + (tmppath, filepath, e[1]), + OfflineImapError.ERROR.FOLDER), + exc_info()[2]) # if utime_from_header=true, we don't want to change the mtime. if self.utime_from_header and mtime: diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py index 11a3a2a..a3fbe08 100644 --- a/offlineimap/folder/IMAP.py +++ b/offlineimap/folder/IMAP.py @@ -1,5 +1,5 @@ # IMAP folder support -# Copyright (C) 2002-2016 John Goerzen & contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -84,8 +84,11 @@ class IMAPFolder(BaseFolder): def getmaxage(self): if self.config.getdefault("Account %s"% self.accountname, "maxage", None): - six.reraise(OfflineImapError("maxage is not supported on IMAP-IMAP sync", - OfflineImapError.ERROR.REPO), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError( + "maxage is not supported on IMAP-IMAP sync", + OfflineImapError.ERROR.REPO), + exc_info()[2]) # Interface from BaseFolder def getinstancelimitnamespace(self): @@ -613,11 +616,13 @@ class IMAPFolder(BaseFolder): self.imapserver.releaseconnection(imapobj, True) imapobj = self.imapserver.acquireconnection() if not retry_left: - 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]) + six.reraise(OfflineImapError, + 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), + exc_info()[2]) # XXX: is this still needed? self.ui.error(e, exc_info()[2]) except imapobj.error as e: # APPEND failed @@ -626,10 +631,12 @@ class IMAPFolder(BaseFolder): # drop conn, it might be bad. self.imapserver.releaseconnection(imapobj, True) imapobj = None - 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]) + six.reraise(OfflineImapError, + 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), + 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() diff --git a/offlineimap/folder/LocalStatus.py b/offlineimap/folder/LocalStatus.py index 356918f..9d4075a 100644 --- a/offlineimap/folder/LocalStatus.py +++ b/offlineimap/folder/LocalStatus.py @@ -1,5 +1,5 @@ # Local status cache virtual folder -# Copyright (C) 2002-2016 John Goerzen & contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -75,7 +75,7 @@ class LocalStatusFolder(BaseFolder): errstr = ("Corrupt line '%s' in cache file '%s'"% (line, self.filename)) self.ui.warn(errstr) - six.reraise(ValueError(errstr), None, exc_info()[2]) + six.reraise(ValueError, ValueError(errstr), exc_info()[2]) self.messagelist[uid] = self.msglist_item_initializer(uid) self.messagelist[uid]['flags'] = flags @@ -98,7 +98,7 @@ class LocalStatusFolder(BaseFolder): errstr = "Corrupt line '%s' in cache file '%s'"% \ (line, self.filename) self.ui.warn(errstr) - six.reraise(ValueError(errstr), None, exc_info()[2]) + six.reraise(ValueError, ValueError(errstr), exc_info()[2]) self.messagelist[uid] = self.msglist_item_initializer(uid) self.messagelist[uid]['flags'] = flags self.messagelist[uid]['mtime'] = mtime diff --git a/offlineimap/folder/LocalStatusSQLite.py b/offlineimap/folder/LocalStatusSQLite.py index 1806796..efff16e 100644 --- a/offlineimap/folder/LocalStatusSQLite.py +++ b/offlineimap/folder/LocalStatusSQLite.py @@ -1,5 +1,5 @@ # Local status cache virtual folder: SQLite backend -# Copyright (C) 2009-2016 Stewart Smith and contributors +# Copyright (C) 2009-2016 Stewart Smith and contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -67,10 +67,13 @@ class LocalStatusSQLiteFolder(BaseFolder): self.connection = sqlite.connect(self.filename, check_same_thread=False) except sqlite.OperationalError as e: # Operation had failed. - 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]) + six.reraise(UserWarning, + 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)), + exc_info()[2]) # Make sure sqlite is in multithreading SERIALIZE mode. assert sqlite.threadsafety == 1, 'Your sqlite is not multithreading safe.' diff --git a/offlineimap/folder/Maildir.py b/offlineimap/folder/Maildir.py index 91af24a..cfc820c 100644 --- a/offlineimap/folder/Maildir.py +++ b/offlineimap/folder/Maildir.py @@ -1,5 +1,5 @@ # Maildir folder support -# Copyright (C) 2002-2016 John Goerzen & contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -22,8 +22,6 @@ import os import six from sys import exc_info from threading import Lock -from .Base import BaseFolder - try: from hashlib import md5 except ImportError: @@ -34,6 +32,7 @@ except NameError: from sets import Set as set from offlineimap import OfflineImapError, emailutil +from .Base import BaseFolder # Find the UID in a message filename re_uidmatch = re.compile(',U=(\d+)') @@ -318,8 +317,11 @@ class MaildirFolder(BaseFolder): time.sleep(0.23) continue severity = OfflineImapError.ERROR.MESSAGE - six.reraise(OfflineImapError("Unique filename %s already exists."% - filename, severity), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError( + "Unique filename %s already exists."% + filename, severity), + exc_info()[2]) else: raise @@ -439,9 +441,12 @@ class MaildirFolder(BaseFolder): os.rename(os.path.join(self.getfullname(), oldfilename), os.path.join(self.getfullname(), newfilename)) except OSError as e: - six.reraise(OfflineImapError("Can't rename file '%s' to '%s': %s" % ( - oldfilename, newfilename, e[1]), - OfflineImapError.ERROR.FOLDER), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError( + "Can't rename file '%s' to '%s': %s"% + (oldfilename, newfilename, e[1]), + OfflineImapError.ERROR.FOLDER), + exc_info()[2]) self.messagelist[uid]['flags'] = flags self.messagelist[uid]['filename'] = newfilename @@ -519,10 +524,12 @@ class MaildirFolder(BaseFolder): try: os.rename(filename, newfilename) except OSError as e: - six.reraise(OfflineImapError( - "Can't rename file '%s' to '%s': %s" % ( - filename, newfilename, e[1]), - OfflineImapError.ERROR.FOLDER), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError( + "Can't rename file '%s' to '%s': %s"% + (filename, newfilename, e[1]), + OfflineImapError.ERROR.FOLDER), + exc_info()[2]) elif match.group(1) != self._foldermd5: self.ui.warn(("Inconsistent FMD5 for file `%s':" " Neither `%s' nor `%s' found") diff --git a/offlineimap/folder/UIDMaps.py b/offlineimap/folder/UIDMaps.py index 45c94bd..d4ec1e3 100644 --- a/offlineimap/folder/UIDMaps.py +++ b/offlineimap/folder/UIDMaps.py @@ -1,5 +1,5 @@ # Base folder support -# Copyright (C) 2002-2015 John Goerzen & contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -15,13 +15,14 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -from sys import exc_info +import six from threading import Lock -from offlineimap import OfflineImapError -from .IMAP import IMAPFolder +from sys import exc_info import os.path -import six +from offlineimap import OfflineImapError +from .IMAP import IMAPFolder + class MappedIMAPFolder(IMAPFolder): """IMAP class to map between Folder() instances where both side assign a uid @@ -63,8 +64,11 @@ class MappedIMAPFolder(IMAPFolder): try: line = line.strip() except ValueError: - six.reraise(Exception("Corrupt line '%s' in UID mapping file '%s'"% - (line, mapfilename)), None, exc_info()[2]) + six.reraise(Exception, + Exception( + "Corrupt line '%s' in UID mapping file '%s'"% + (line, mapfilename)), + exc_info()[2]) (str1, str2) = line.split(':') loc = int(str1) rem = int(str2) @@ -90,10 +94,14 @@ class MappedIMAPFolder(IMAPFolder): try: return [mapping[x] for x in items] except KeyError as e: - 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]) + six.reraise(OfflineImapError, + OfflineImapError( + "Could not find UID for msg '{0}' (f:'{1}'." + " This is usually a bad thing and should be " + "reported on the mailing list.".format( + e.args[0], self), + OfflineImapError.ERROR.MESSAGE), + exc_info()[2]) # Interface from BaseFolder def cachemessagelist(self, min_date=None, min_uid=None): diff --git a/offlineimap/imaplibutil.py b/offlineimap/imaplibutil.py index 4d6f64e..a3824dd 100644 --- a/offlineimap/imaplibutil.py +++ b/offlineimap/imaplibutil.py @@ -18,16 +18,16 @@ import os import fcntl import time import subprocess -from sys import exc_info import threading -from hashlib import sha1 import socket import errno import zlib import six +from sys import exc_info +from hashlib import sha1 -from offlineimap.ui import getglobalui from offlineimap import OfflineImapError +from offlineimap.ui import getglobalui from offlineimap.virtual_imaplib2 import IMAP4, IMAP4_SSL, InternalDate, Mon2num @@ -58,7 +58,9 @@ 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 - six.reraise(OfflineImapError(errstr, severity), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError(errstr, severity), + exc_info()[2]) if result[0] != 'OK': #in case of error, bail out with OfflineImapError errstr = "Error SELECTing mailbox '%s', server reply:\n%s" %\ diff --git a/offlineimap/imapserver.py b/offlineimap/imapserver.py index 9b39672..c0a5697 100644 --- a/offlineimap/imapserver.py +++ b/offlineimap/imapserver.py @@ -1,5 +1,5 @@ # IMAP server support -# Copyright (C) 2002 - 2016 John Goerzen & contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -15,24 +15,22 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -from threading import Lock, BoundedSemaphore, Thread, Event, currentThread import hmac import socket import base64 - import json import urllib - import socket import time import errno +import six from sys import exc_info from socket import gaierror from ssl import SSLError, cert_time_to_seconds -import six +from threading import Lock, BoundedSemaphore, Thread, Event, currentThread -from offlineimap import imaplibutil, imaputil, threadutil, OfflineImapError import offlineimap.accounts +from offlineimap import imaplibutil, imaputil, threadutil, OfflineImapError from offlineimap.ui import getglobalui @@ -574,7 +572,9 @@ class IMAPServer(object): "'%s'. Make sure you have configured the ser"\ "ver name correctly and that you are online."%\ (self.hostname, self.repos) - six.reraise(OfflineImapError(reason, severity), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError(reason, severity), + exc_info()[2]) elif isinstance(e, SSLError) and e.errno == errno.EPERM: # SSL unknown protocol error @@ -587,7 +587,9 @@ class IMAPServer(object): reason = "Unknown SSL protocol connecting to host '%s' for "\ "repository '%s'. OpenSSL responded:\n%s"\ % (self.hostname, self.repos, e) - six.reraise(OfflineImapError(reason, severity), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError(reason, severity), + 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 @@ -596,14 +598,19 @@ class IMAPServer(object): "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) - six.reraise(OfflineImapError(reason, severity), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError(reason, severity), + exc_info()[2]) # Could not acquire connection to the remote; # socket.error(last_error) raised if str(e)[:24] == "can't open socket; error": - 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]) + six.reraise(OfflineImapError, + OfflineImapError( + "Could not connect to remote server '%s' " + "for repository '%s'. Remote does not answer."% + (self.hostname, self.repos), + OfflineImapError.ERROR.REPO), + exc_info()[2]) else: # re-raise all other errors raise diff --git a/offlineimap/repository/IMAP.py b/offlineimap/repository/IMAP.py index fdd9955..5057a79 100644 --- a/offlineimap/repository/IMAP.py +++ b/offlineimap/repository/IMAP.py @@ -110,8 +110,12 @@ class IMAPRepository(BaseRepository): try: host = self.localeval.eval(host) except Exception as e: - six.reraise(OfflineImapError("remotehosteval option for repository " - "'%s' failed:\n%s"% (self, e), OfflineImapError.ERROR.REPO), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError( + "remotehosteval option for repository " + "'%s' failed:\n%s"% (self, e), + OfflineImapError.ERROR.REPO), + exc_info()[2]) if host: self._host = host return self._host diff --git a/offlineimap/repository/__init__.py b/offlineimap/repository/__init__.py index e594e9d..90b2366 100644 --- a/offlineimap/repository/__init__.py +++ b/offlineimap/repository/__init__.py @@ -1,5 +1,4 @@ -# Copyright (C) 2002-2007 John Goerzen -# 2010 Sebastian Spaeth and contributors +# Copyright (C) 2002-2016 John Goerzen & contributors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -15,9 +14,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -from sys import exc_info - import six +from sys import exc_info try: from configparser import NoSectionError @@ -70,14 +68,18 @@ class Repository(object): except NoSectionError as e: errstr = ("Could not find section '%s' in configuration. Required " "for account '%s'." % ('Repository %s' % name, account)) - six.reraise(OfflineImapError(errstr, OfflineImapError.ERROR.REPO), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError(errstr, OfflineImapError.ERROR.REPO), + exc_info()[2]) try: repo = typemap[repostype] except KeyError: errstr = "'%s' repository not supported for '%s' repositories."% \ (repostype, reqtype) - six.reraise(OfflineImapError(errstr, OfflineImapError.ERROR.REPO), None, exc_info()[2]) + six.reraise(OfflineImapError, + OfflineImapError(errstr, OfflineImapError.ERROR.REPO), + exc_info()[2]) return repo(name, account)