From f58ebe390d281e6fe526e70451e2377b77f68183 Mon Sep 17 00:00:00 2001 From: John Goerzen Date: Tue, 20 May 2008 01:38:15 -0500 Subject: [PATCH] Checkpointing work on mailbox deletion --- offlineimap/accounts.py | 22 ++++++++++++++++++++++ offlineimap/syncmaster.py | 21 ++++++++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py index 8e96347..fe536a7 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -95,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) @@ -109,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() diff --git a/offlineimap/syncmaster.py b/offlineimap/syncmaster.py index 64f2380..22e126f 100644 --- a/offlineimap/syncmaster.py +++ b/offlineimap/syncmaster.py @@ -26,8 +26,8 @@ import re, os, os.path, offlineimap, sys from ConfigParser import ConfigParser from threading import * -def syncaccount(threads, config, accountname): - account = SyncableAccount(config, accountname) +def syncaccount(threads, config, accountname, folderhash, folderhashlock): + account = SyncableAccount(config, accountname, folderhash, folderhashlock) thread = InstanceLimitedThread(instancename = 'ACCOUNTLIMIT', target = account.syncrunner, name = "Account sync %s" % accountname) @@ -36,11 +36,26 @@ def syncaccount(threads, config, accountname): threads.add(thread) def syncitall(accounts, config): + folderhash = {'___sem': Semaphore(0)} + folderhashlock = Lock() currentThread().setExitMessage('SYNC_WITH_TIMER_TERMINATE') ui = UIBase.getglobalui() threads = threadutil.threadlist() mbnames.init(config, accounts) + + accountcout = 0 + for accountname in accounts: + syncaccount(threads, config, accountname, folderhash, folderhashlock) + accountcount += 1 + + # Gather up folder info + for i in range(0, accountcount): + folderhash['___sem'].acquire() + + # Now we can tally. + srcnames = for accountname in accounts: - syncaccount(threads, config, accountname) + + # Wait for the threads to finish. threads.reset() -- 2.39.2