X-Git-Url: https://code.delx.au/offlineimap/blobdiff_plain/6949a311647932f2968e181cd78f23c9f7493106..c6d95bd47132f58a9836586451db6f98aa3dd3d4:/offlineimap/folder/Maildir.py diff --git a/offlineimap/folder/Maildir.py b/offlineimap/folder/Maildir.py index 643f57a..d1d5077 100644 --- a/offlineimap/folder/Maildir.py +++ b/offlineimap/folder/Maildir.py @@ -16,13 +16,17 @@ # 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.path, os, re, time, socket from Base import BaseFolder from offlineimap import imaputil from offlineimap.ui import UIBase from threading import Lock -import os.path, os, re, time, socket, md5 -foldermatchre = re.compile(',FMD5=([0-9a-f]{32})') +try: + from hashlib import md5 +except ImportError: + import md5 + uidmatchre = re.compile(',U=(\d+)') flagmatchre = re.compile(':.*2,([A-Z]+)') @@ -46,8 +50,10 @@ def gettimeseq(): timelock.release() class MaildirFolder(BaseFolder): - def __init__(self, root, name, sep, repository, accountname): + def __init__(self, root, name, sep, repository, accountname, config): self.name = name + self.config = config + self.dofsync = config.getdefaultboolean("general", "fsync", True) self.root = root self.sep = sep self.messagelist = None @@ -78,16 +84,16 @@ class MaildirFolder(BaseFolder): files = [] nouidcounter = -1 # Messages without UIDs get # negative UID numbers. + foldermd5 = md5.new(self.getvisiblename()).hexdigest() + folderstr = ',FMD5=' + foldermd5 for dirannex in ['new', 'cur']: fulldirname = os.path.join(self.getfullname(), dirannex) files.extend([os.path.join(fulldirname, filename) for filename in os.listdir(fulldirname)]) for file in files: messagename = os.path.basename(file) - foldermatch = foldermatchre.search(messagename) - if (not foldermatch) or \ - md5.new(self.getvisiblename()).hexdigest() \ - != foldermatch.group(1): + foldermatch = messagename.find(folderstr) != -1 + if not foldermatch: # If there is no folder MD5 specified, or if it mismatches, # assume it is a foreign (new) message and generate a # negative uid for it @@ -111,8 +117,21 @@ class MaildirFolder(BaseFolder): 'filename': file} return retval + def quickchanged(self, statusfolder): + self.cachemessagelist() + savedmessages = statusfolder.getmessagelist() + if len(self.messagelist) != len(savedmessages): + return True + for uid in self.messagelist.keys(): + if uid not in savedmessages: + return True + if self.messagelist[uid]['flags'] != savedmessages[uid]['flags']: + return True + return False + def cachemessagelist(self): - self.messagelist = self._scanfolder() + if self.messagelist is None: + self.messagelist = self._scanfolder() def getmessagelist(self): return self.messagelist @@ -171,7 +190,8 @@ class MaildirFolder(BaseFolder): # Make sure the data hits the disk file.flush() - os.fsync(file.fileno()) + if self.dofsync: + os.fsync(file.fileno()) file.close() if rtime != None: @@ -183,13 +203,14 @@ class MaildirFolder(BaseFolder): os.path.join(tmpdir, messagename)) os.unlink(os.path.join(tmpdir, tmpmessagename)) - try: - # fsync the directory (safer semantics in Linux) - fd = os.open(tmpdir, os.O_RDONLY) - os.fsync(fd) - os.close(fd) - except: - pass + if self.dofsync: + try: + # fsync the directory (safer semantics in Linux) + fd = os.open(tmpdir, os.O_RDONLY) + os.fsync(fd) + os.close(fd) + except: + pass self.messagelist[uid] = {'uid': uid, 'flags': [], 'filename': os.path.join(tmpdir, messagename)}