]> code.delx.au - offlineimap/blobdiff - offlineimap/repository/Maildir.py
Now create cur,new,tmp in '.' even if existsok is false
[offlineimap] / offlineimap / repository / Maildir.py
index fc92bc44efe761a40cb33cdd8528a2da3301deb7..717ffcbf64c9b51798d191bcdbe62a42ac96469f 100644 (file)
@@ -21,6 +21,7 @@ from offlineimap import folder, imaputil
 from offlineimap.ui import UIBase
 from mailbox import Maildir
 import os
+from stat import *
 
 class MaildirRepository(BaseRepository):
     def __init__(self, reposname, account):
@@ -32,6 +33,28 @@ class MaildirRepository(BaseRepository):
         self.folders = None
         self.ui = UIBase.getglobalui()
         self.debug("MaildirRepository initialized, sep is " + repr(self.getsep()))
+       self.folder_atimes = []
+
+        # Create the top-level folder if it doesn't exist
+        if not os.path.isdir(self.root):
+            os.mkdir(self.root, 0700)
+
+    def _append_folder_atimes(self, foldername):
+       p = os.path.join(self.root, foldername)
+       new = os.path.join(p, 'new')
+       cur = os.path.join(p, 'cur')
+       f = p, os.stat(new)[ST_ATIME], os.stat(cur)[ST_ATIME]
+       self.folder_atimes.append(f)
+
+    def restore_folder_atimes(self):
+       if not self.folder_atimes:
+           return
+
+       for f in self.folder_atimes:
+           t = f[1], os.stat(os.path.join(f[0], 'new'))[ST_MTIME]
+           os.utime(os.path.join(f[0], 'new'), t)
+           t = f[2], os.stat(os.path.join(f[0], 'cur'))[ST_MTIME]
+           os.utime(os.path.join(f[0], 'cur'), t)
 
     def getlocalroot(self):
         return os.path.expanduser(self.getconf('localfolders'))
@@ -64,7 +87,7 @@ class MaildirRepository(BaseRepository):
         # makedirs will fail because the higher-up dir already exists.
         # So, check to see if this is indeed the case.
 
-        if (self.getsep() == '/' or self.getconfboolean('existsok', 0)) \
+        if (self.getsep() == '/' or self.getconfboolean('existsok', 0) or foldername == '.') \
             and os.path.isdir(foldername):
             self.debug("makefolder: %s already is a directory" % foldername)
             # Already exists.  Sanity-check that it's not a Maildir.
@@ -86,6 +109,8 @@ class MaildirRepository(BaseRepository):
         self.ui.warn("NOT YET IMPLEMENTED: DELETE FOLDER %s" % foldername)
 
     def getfolder(self, foldername):
+       if self.config.has_option('Repository ' + self.name, 'restoreatime') and self.config.getboolean('Repository ' + self.name, 'restoreatime'):
+           self._append_folder_atimes(foldername)
         return folder.Maildir.MaildirFolder(self.root, foldername,
                                             self.getsep(), self, self.accountname)
     
@@ -130,6 +155,8 @@ class MaildirRepository(BaseRepository):
 
                 self.debug("  foldername = %s" % foldername)
 
+               if self.config.has_option('Repository ' + self.name, 'restoreatime') and self.config.getboolean('Repository ' + self.name, 'restoreatime'):
+                   self._append_folder_atimes(foldername)
                 retval.append(folder.Maildir.MaildirFolder(self.root, foldername,
                                                            self.getsep(), self, self.accountname))
             if self.getsep() == '/' and dirname != '.':