X-Git-Url: https://code.delx.au/offlineimap/blobdiff_plain/71c8b2e7c489b6277dd862e9174784ca237ebead..f58ebe390d281e6fe526e70451e2377b77f68183:/offlineimap/accounts.py diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py index b0f51dc..fe536a7 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -1,8 +1,6 @@ # Copyright (C) 2003 John Goerzen # # -# Portions Copyright (C) 2007 David Favro -# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or @@ -47,6 +45,7 @@ class Account(CustomConfig.ConfigHelperMixin): self.localeval = config.getlocaleval() self.ui = UIBase.getglobalui() self.refreshperiod = self.getconffloat('autorefresh', 0.0) + self.quicknum = 0 if self.refreshperiod == 0.0: self.refreshperiod = None @@ -96,6 +95,16 @@ class Account(CustomConfig.ConfigHelperMixin): return sleepresult class AccountSynchronizationMixin: + def __init__(self, config, name, folderhash, folderhashlock): + Account.__init__(self, config, name) + self.folderhash = folderhash + self.folderhashlock = folderhashlock + self.folderhashlock.acquire() + try: + self.folderhash[name] = {} + finally: + self.folderhashlock.release() + def syncrunner(self): self.ui.registerthread(self.name) self.ui.acct(self.name) @@ -110,6 +119,18 @@ class AccountSynchronizationMixin: # Connect to the local cache. self.statusrepos = offlineimap.repository.LocalStatus.LocalStatusRepository(self.getconf('localrepository'), self) + + # FIXME: need new UI here? + self.ui.syncfolders(self.remoterepos, self.localrepos) + srcfolders = self.remoterepos.getfolders() + destfolders = self.localrepos.getfolders() + + self.folderhashlock.acquire() + try: + self.folderhash[name] = {'src': srcfolders, 'dest': destfolders} + self.folderhash['___sem'].release() + finally: + self.folderhashlock.release() if not self.refreshperiod: self.sync() @@ -127,12 +148,26 @@ class AccountSynchronizationMixin: def sync(self): # We don't need an account lock because syncitall() goes through # each account once, then waits for all to finish. + + quickconfig = self.getconfint('quick', 0) + if quickconfig < 0: + quick = True + elif quickconfig > 0: + if self.quicknum == 0 or self.quicknum > quickconfig: + self.quicknum = 1 + quick = False + else: + self.quicknum = self.quicknum + 1 + quick = True + else: + quick = False + try: remoterepos = self.remoterepos localrepos = self.localrepos statusrepos = self.statusrepos self.ui.syncfolders(remoterepos, localrepos) - remoterepos.syncfoldersto(localrepos) + remoterepos.syncfoldersto(localrepos, [statusrepos]) folderthreads = [] for remotefolder in remoterepos.getfolders(): @@ -142,12 +177,14 @@ class AccountSynchronizationMixin: name = "Folder sync %s[%s]" % \ (self.name, remotefolder.getvisiblename()), args = (self.name, remoterepos, remotefolder, localrepos, - statusrepos)) + statusrepos, quick)) thread.setDaemon(1) thread.start() folderthreads.append(thread) threadutil.threadsreset(folderthreads) mbnames.write() + localrepos.forgetfolders() + remoterepos.forgetfolders() localrepos.holdordropconnections() remoterepos.holdordropconnections() finally: @@ -157,7 +194,7 @@ class SyncableAccount(Account, AccountSynchronizationMixin): pass def syncfolder(accountname, remoterepos, remotefolder, localrepos, - statusrepos): + statusrepos, quick): global mailboxes ui = UIBase.getglobalui() ui.registerthread(accountname) @@ -167,12 +204,6 @@ def syncfolder(accountname, remoterepos, remotefolder, localrepos, replace(remoterepos.getsep(), localrepos.getsep())) # Write the mailboxes mbnames.add(accountname, localfolder.getvisiblename()) - # Load local folder - ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder) - ui.loadmessagelist(localrepos, localfolder) - localfolder.cachemessagelist() - ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys())) - # Load status folder. statusfolder = statusrepos.getfolder(remotefolder.getvisiblename().\ @@ -185,6 +216,19 @@ def syncfolder(accountname, remoterepos, remotefolder, localrepos, statusfolder.cachemessagelist() + if quick: + if not localfolder.quickchanged(statusfolder) \ + and not remotefolder.quickchanged(statusfolder): + ui.skippingfolder(remotefolder) + localrepos.restore_atime() + return + + # Load local folder + ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder) + ui.loadmessagelist(localrepos, localfolder) + localfolder.cachemessagelist() + ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys())) + # If either the local or the status folder has messages and there is a UID # validity problem, warn and abort. If there are no messages, UW IMAPd # loses UIDVALIDITY. But we don't really need it if both local folders are