From 17980baea61e15ade88186ee413757298ebc1249 Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Thu, 8 Jan 2015 12:28:36 +0100 Subject: [PATCH 1/6] v6.5.7-rc2 Signed-off-by: Nicolas Sebrecht --- Changelog.rst | 51 ++++++++++++++++++++++++++++++++++++++++- offlineimap/__init__.py | 2 +- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/Changelog.rst b/Changelog.rst index 5580e69..1954dbc 100644 --- a/Changelog.rst +++ b/Changelog.rst @@ -5,13 +5,62 @@ ChangeLog :website: http://offlineimap.org +OfflineIMAP v6.5.7-rc2 (2015-01-18) +=================================== + +Notes +----- + +This release candidate should be minor for most users. + +The best points are about SSL not falling back on other authentication methods +when failing, better RAM footprint and reduced I/O access. + +Documentation had our attention, too. + +There's some code cleanups and code refactoring, as usual. + +Features +-------- + +* Do not keep reloading pyhtonfile, make it stateful. +* HACKING: how to create tags. +* MANUAL: add minor sample on how to retrieve a password with a helper python file. + +Fixes +----- + +* Make OS-default CA certificate file to be requested explicitely. +* SSL: do not fallback on other authentication mode if it fails. +* Fix regression introduced while style patching. +* API documentation: properly auto-document main class, fixes. +* ui: Machine: remove offending param for a _printData() call. +* Drop caches after having processed folders. + +Changes +------- + +* Fix unexpected garbage code. +* Properly re-raise exception to save original tracebacks. +* Refactoring: avoid redefining various Python keywords. +* Code: improvements of comments and more style consistency. +* Configuration file: better design and other small improvements. +* nametrans documentation: fix minor error. +* Unused import removal. +* Add a note about the incorrect rendering of the docstring with Sphinx. +* Errors handling: log the messages with level ERROR. +* MAINTAINERS: add mailing list maintainers. +* Fixed copyright statement. +* COPYING: fix unexpected characters. + + OfflineIMAP v6.5.7-rc1 (2015-01-07) =================================== Notes ----- -I think it's time for a new release candidate. Our release cycle are long +I think it's time for a new release candidate. Our release cycles are long enough and users are asked to use the current TIP of the next branch to test our recent patches. diff --git a/offlineimap/__init__.py b/offlineimap/__init__.py index ff6acd9..441af44 100644 --- a/offlineimap/__init__.py +++ b/offlineimap/__init__.py @@ -2,7 +2,7 @@ __all__ = ['OfflineImap'] __productname__ = 'OfflineIMAP' __version__ = "6.5.7" -__revision__ = "-rc1" +__revision__ = "-rc2" __bigversion__ = __version__ + __revision__ __copyright__ = "Copyright 2002-2015 John Goerzen & contributors" __author__ = "John Goerzen" From 9e6b23933ace1b56065aaeb4b52302838aefb4f1 Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Sun, 18 Jan 2015 21:45:15 +0100 Subject: [PATCH 2/6] Changelog: prepare for coming updates Signed-off-by: Nicolas Sebrecht --- Changelog.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Changelog.rst b/Changelog.rst index 1954dbc..5e499c1 100644 --- a/Changelog.rst +++ b/Changelog.rst @@ -5,6 +5,11 @@ ChangeLog :website: http://offlineimap.org +OfflineIMAP v6.5.7-rc3 (2015- - ) +=================================== + + + OfflineIMAP v6.5.7-rc2 (2015-01-18) =================================== @@ -163,7 +168,7 @@ OfflineIMAP v6.5.6 (2014-05-14) to Tomasz Żok) -OfflineIMAP v6.5.6-RC1 (2014-05-14) +OfflineIMAP v6.5.6-rc1 (2014-05-14) =================================== * Add knob to invoke folderfilter dynamically on each sync (GitHub#73) From 285295c4f251517018a5812cb1b76e4c011ce5bb Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Sun, 18 Jan 2015 03:49:15 +0100 Subject: [PATCH 3/6] folder: LocalStatus: revamp cachemessagelist() - Do not redefine "file". - break loop as soon as possible. Signed-off-by: Nicolas Sebrecht --- offlineimap/folder/LocalStatus.py | 48 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/offlineimap/folder/LocalStatus.py b/offlineimap/folder/LocalStatus.py index d3b6cf0..7190c0c 100644 --- a/offlineimap/folder/LocalStatus.py +++ b/offlineimap/folder/LocalStatus.py @@ -117,33 +117,33 @@ class LocalStatusFolder(BaseFolder): self.messagelist = {} return - # loop as many times as version, and update format - for i in range(1, self.cur_version+1): - file = open(self.filename, "rt") + # Loop as many times as version, and update format. + for i in range(1, self.cur_version + 1): self.messagelist = {} - line = file.readline().strip() + cache = open(self.filename, "rt") + line = cache.readline().strip() - # convert from format v1 - if line == (self.magicline % 1): - self.ui._msg('Upgrading LocalStatus cache from version 1 to version 2 for %s:%s' %\ - (self.repository, self)) - self.readstatus_v1(file) - file.close() + # Format is up to date. break. + if line == (self.magicline % self.cur_version): + break + + # Convert from format v1. + elif line == (self.magicline % 1): + self.ui._msg('Upgrading LocalStatus cache from version 1' + 'to version 2 for %s:%s'% (self.repository, self)) + self.readstatus_v1(cache) + cache.close() self.save() # NOTE: Add other format transitions here in the future. # elif line == (self.magicline % 2): - # self.ui._msg('Upgrading LocalStatus cache from version 2 to version 3 for %s:%s' %\ - # (self.repository, self)) - # self.readstatus_v2(file) - # file.close() - # file.save() + # self.ui._msg(u'Upgrading LocalStatus cache from version 2' + # 'to version 3 for %s:%s'% (self.repository, self)) + # self.readstatus_v2(cache) + # cache.close() + # cache.save() - # format is up to date. break - elif line == (self.magicline % self.cur_version): - break - - # something is wrong + # Something is wrong. else: errstr = "Unrecognized cache magicline in '%s'" % self.filename self.ui.warn(errstr) @@ -152,14 +152,14 @@ class LocalStatusFolder(BaseFolder): if not line: # The status file is empty - should not have happened, # but somehow did. - errstr = "Cache file '%s' is empty. Closing..." % self.filename + errstr = "Cache file '%s' is empty."% self.filename self.ui.warn(errstr) - file.close() + cache.close() return assert(line == (self.magicline % self.cur_version)) - self.readstatus(file) - file.close() + self.readstatus(cache) + cache.close() def dropmessagelistcache(self): self.messagelist = None From 2af3d93a852ef8806ee82d36396a7dcfa14cf4ad Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Fri, 16 Jan 2015 00:00:07 +0100 Subject: [PATCH 4/6] folder: LocalStatusSQLite: remove unused import Signed-off-by: Nicolas Sebrecht --- offlineimap/folder/LocalStatusSQLite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/offlineimap/folder/LocalStatusSQLite.py b/offlineimap/folder/LocalStatusSQLite.py index 9d7e559..e1a24ab 100644 --- a/offlineimap/folder/LocalStatusSQLite.py +++ b/offlineimap/folder/LocalStatusSQLite.py @@ -15,15 +15,15 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os -import re from sys import exc_info from threading import Lock -from .Base import BaseFolder try: import sqlite3 as sqlite except: pass #fail only if needed later on, not on import +from .Base import BaseFolder + class LocalStatusSQLiteFolder(BaseFolder): """LocalStatus backend implemented with an SQLite database From d0cb96781cc827ffde887ba77e2ae45d0ddc1ccc Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Fri, 16 Jan 2015 12:09:29 +0100 Subject: [PATCH 5/6] folder: LocalStatus(SQLite): avoid redefining unchanged Base method Signed-off-by: Nicolas Sebrecht --- offlineimap/folder/LocalStatus.py | 4 ---- offlineimap/folder/LocalStatusSQLite.py | 3 --- 2 files changed, 7 deletions(-) diff --git a/offlineimap/folder/LocalStatus.py b/offlineimap/folder/LocalStatus.py index 7190c0c..d9cfa70 100644 --- a/offlineimap/folder/LocalStatus.py +++ b/offlineimap/folder/LocalStatus.py @@ -45,10 +45,6 @@ class LocalStatusFolder(BaseFolder): def isnewfolder(self): return not os.path.exists(self.filename) - # Interface from BaseFolder - def getname(self): - return self.name - # Interface from BaseFolder def getfullname(self): return self.filename diff --git a/offlineimap/folder/LocalStatusSQLite.py b/offlineimap/folder/LocalStatusSQLite.py index e1a24ab..7dceec1 100644 --- a/offlineimap/folder/LocalStatusSQLite.py +++ b/offlineimap/folder/LocalStatusSQLite.py @@ -88,9 +88,6 @@ class LocalStatusSQLiteFolder(BaseFolder): def storesmessages(self): return False - def getname(self): - return self.name - def getfullname(self): return self.filename From cb6790b8041ed917f5defee5977cfbf56b5634ec Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Thu, 15 Jan 2015 17:40:27 +0100 Subject: [PATCH 6/6] minor: fix indentation Signed-off-by: Nicolas Sebrecht --- offlineimap/folder/LocalStatusSQLite.py | 8 +++++--- offlineimap/repository/__init__.py | 10 +++++----- offlineimap/ui/UIBase.py | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/offlineimap/folder/LocalStatusSQLite.py b/offlineimap/folder/LocalStatusSQLite.py index 7dceec1..4f5efb1 100644 --- a/offlineimap/folder/LocalStatusSQLite.py +++ b/offlineimap/folder/LocalStatusSQLite.py @@ -56,7 +56,8 @@ class LocalStatusSQLiteFolder(BaseFolder): if not os.path.exists(dirname): os.makedirs(dirname) if not os.path.isdir(dirname): - raise UserWarning("SQLite database path '%s' is not a directory." % dirname) + raise UserWarning("SQLite database path '%s' is not a directory."% + dirname) # dblock protects against concurrent writes in same connection self._dblock = Lock() @@ -67,14 +68,15 @@ class LocalStatusSQLiteFolder(BaseFolder): except NameError: # sqlite import had failed raise UserWarning('SQLite backend chosen, but no sqlite python ' - 'bindings available. Please install.'), None, exc_info()[2] + 'bindings available. Please install.'), None, exc_info()[2] #Make sure sqlite is in multithreading SERIALIZE mode assert sqlite.threadsafety == 1, 'Your sqlite is not multithreading safe.' #Test if db version is current enough and if db is readable. try: - cursor = self.connection.execute("SELECT value from metadata WHERE key='db_version'") + cursor = self.connection.execute( + "SELECT value from metadata WHERE key='db_version'") except sqlite.DatabaseError: #db file missing or corrupt, recreate it. self.__create_db() diff --git a/offlineimap/repository/__init__.py b/offlineimap/repository/__init__.py index 076255e..59a7bb6 100644 --- a/offlineimap/repository/__init__.py +++ b/offlineimap/repository/__init__.py @@ -44,13 +44,13 @@ class Repository(object): name = account.getconf('remoterepository') # We don't support Maildirs on the remote side. typemap = {'IMAP': IMAPRepository, - 'Gmail': GmailRepository} + 'Gmail': GmailRepository} elif reqtype == 'local': name = account.getconf('localrepository') typemap = {'IMAP': MappedIMAPRepository, - 'Maildir': MaildirRepository, - 'GmailMaildir': GmailMaildirRepository} + 'Maildir': MaildirRepository, + 'GmailMaildir': GmailMaildirRepository} elif reqtype == 'status': # create and return a LocalStatusRepository @@ -69,7 +69,7 @@ class Repository(object): 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] + None, exc_info()[2] try: repo = typemap[repostype] @@ -77,7 +77,7 @@ class Repository(object): errstr = "'%s' repository not supported for '%s' repositories." \ % (repostype, reqtype) raise OfflineImapError(errstr, OfflineImapError.ERROR.REPO), \ - None, exc_info()[2] + None, exc_info()[2] return repo(name, account) diff --git a/offlineimap/ui/UIBase.py b/offlineimap/ui/UIBase.py index 3c6e499..41ce1a4 100644 --- a/offlineimap/ui/UIBase.py +++ b/offlineimap/ui/UIBase.py @@ -539,7 +539,7 @@ class UIBase(object): abortsleep = False while sleepsecs > 0 and not abortsleep: if account.get_abort_event(): - abortsleep = True + abortsleep = True else: abortsleep = self.sleeping(10, sleepsecs) sleepsecs -= 10