]> 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 d35b0cc50f4d76e9fca6250df1c39b96d1b0028d..717ffcbf64c9b51798d191bcdbe62a42ac96469f 100644 (file)
 #
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 
 from Base import BaseRepository
 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,9 +33,28 @@ class MaildirRepository(BaseRepository):
         self.folders = None
         self.ui = UIBase.getglobalui()
         self.debug("MaildirRepository initialized, sep is " + repr(self.getsep()))
+       self.folder_atimes = []
 
-    def getrestoreatime(self):
-       return self.getconfboolean('restoreatime', 0)
+        # 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'))
@@ -67,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.
@@ -89,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)
     
@@ -133,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 != '.':