]> code.delx.au - offlineimap/blobdiff - offlineimap/folder/LocalStatus.py
Merge commit 'origin' into v7
[offlineimap] / offlineimap / folder / LocalStatus.py
index 5057cc139c9ba77cc183a03b4e0a1b10feae75ca..9f2cf88442dc690ce655c557605ad7b8d74f4ecf 100644 (file)
@@ -22,10 +22,12 @@ import os, threading
 magicline = "OFFLINEIMAP LocalStatus CACHE DATA - DO NOT MODIFY - FORMAT 1"
 
 class LocalStatusFolder(BaseFolder):
-    def __init__(self, root, name, repository, accountname):
+    def __init__(self, root, name, repository, accountname, config):
         self.name = name
         self.root = root
         self.sep = '.'
+        self.config = config
+        self.dofsync = config.getdefaultboolean("general", "fsync", True)
         self.filename = os.path.join(root, name)
         self.filename = repository.getfolderfilename(name)
         self.messagelist = None
@@ -67,6 +69,11 @@ class LocalStatusFolder(BaseFolder):
         file = open(self.filename, "rt")
         self.messagelist = {}
         line = file.readline().strip()
+        if not line and not line.read():
+            # The status file is empty - should not have happened,
+            # but somehow did.
+            file.close()
+            return
         assert(line == magicline)
         for line in file.xreadlines():
             line = line.strip()
@@ -91,16 +98,18 @@ class LocalStatusFolder(BaseFolder):
                 flags = ''.join(flags)
                 file.write("%s:%s\n" % (msg['uid'], flags))
             file.flush()
-            os.fsync(file.fileno())
+            if self.dofsync:
+                os.fsync(file.fileno())
             file.close()
             os.rename(self.filename + ".tmp", self.filename)
 
-            try:
-                fd = os.open(os.path.dirname(self.filename), os.O_RDONLY)
-                os.fsync(fd)
-                os.close(fd)
-            except:
-                pass
+            if self.dofsync:
+                try:
+                    fd = os.open(os.path.dirname(self.filename), os.O_RDONLY)
+                    os.fsync(fd)
+                    os.close(fd)
+                except:
+                    pass
 
         finally:
             self.savelock.release()