Fix mbox.select(foldername) readonly parameter comparison

The default parameter value was "None", and we were comparing that
directly to the imaplib2 value of is_readonly which is False or True, so
the comparison always returned "False".

Fix this by setting the default parameter to "False" and not
"None". Also convert all users of that function to use False/True.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>

Conflicts:

	Changelog.draft.rst
This commit is contained in:
Sebastian Spaeth 2011-11-02 08:40:03 +01:00
parent 5f5aec6114
commit 8b3ed8b004
4 changed files with 14 additions and 10 deletions

View File

@ -29,3 +29,7 @@ Bug Fixes
* New folders on the remote would be skipped on the very sync run they
are created and only by synced in subsequent runs. Fixed.
* a readonly parameter to select() was not always treated correctly,
which could result in some folders being opened read-only when we
really needed read-write.

View File

@ -55,7 +55,7 @@ class IMAPFolder(BaseFolder):
try:
imapobj.select(self.getfullname())
except imapobj.readonly:
imapobj.select(self.getfullname(), readonly = 1)
imapobj.select(self.getfullname(), readonly = True)
def suggeststhreads(self):
return 1
@ -205,7 +205,7 @@ class IMAPFolder(BaseFolder):
fails_left = 2 # retry on dropped connection
while fails_left:
try:
imapobj.select(self.getfullname(), readonly = 1)
imapobj.select(self.getfullname(), readonly = True)
res_type, data = imapobj.uid('fetch', str(uid),
'(BODY.PEEK[])')
fails_left = 0

View File

@ -34,37 +34,37 @@ except ImportError:
#fails on python <2.6
pass
class UsefulIMAPMixIn:
class UsefulIMAPMixIn(object):
def getselectedfolder(self):
if self.state == 'SELECTED':
return self.mailbox
return None
def select(self, mailbox='INBOX', readonly=None, force = 0):
def select(self, mailbox='INBOX', readonly=False, force = 0):
"""Selects a mailbox on the IMAP server
:returns: 'OK' on success, nothing if the folder was already
selected or raises an :exc:`OfflineImapError`"""
if (not force) and self.getselectedfolder() == mailbox \
and self.is_readonly == readonly:
if self.getselectedfolder() == mailbox and self.is_readonly == readonly \
and not force:
# No change; return.
return
# Wipe out all old responses, to maintain semantics with old imaplib2
del self.untagged_responses[:]
try:
result = self.__class__.__bases__[1].select(self, mailbox, readonly)
result = super(UsefulIMAPMixIn, self).select(mailbox, readonly)
except self.abort, e:
# self.abort is raised when we are supposed to retry
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)
raise OfflineImapError(errstr, severity)
if result[0] != 'OK':
#in case of error, bail out with OfflineImapError
errstr = "Error SELECTing mailbox '%s', server reply:\n%s" %\
(mailbox, result)
severity = OfflineImapError.ERROR.FOLDER
raise OfflineImapError(errstr, severity)
raise OfflineImapError(errstr, severity)
return result
def _mesg(self, s, tn=None, secs=None):

View File

@ -290,7 +290,7 @@ class IMAPRepository(BaseRepository):
try:
for foldername in self.folderincludes:
try:
imapobj.select(foldername, readonly = 1)
imapobj.select(foldername, readonly = True)
except OfflineImapError, e:
# couldn't select this folderinclude, so ignore folder.
if e.severity > OfflineImapError.ERROR.FOLDER: