localrepos = self.localrepos
statusrepos = self.statusrepos
self.ui.syncfolders(remoterepos, localrepos)
- remoterepos.syncfoldersto(localrepos)
+
+ (remoteignored,remotenew) = remoterepos.syncfoldersto(localrepos,statusrepos)
+ if len(remotenew):
+ localrepos.forgetfolders()
+
+ (localignored,localnew) = localrepos.syncfoldersto(remoterepos,statusrepos)
+ if len(localnew):
+ remoterepos.forgetfolders()
folderthreads = []
for remotefolder in remoterepos.getfolders():
+ if remotefolder.getvisiblename() in remoteignored:
+ continue
thread = InstanceLimitedThread(\
instancename = 'FOLDER_' + self.remoterepos.getname(),
target = syncfolder,
#
+ if ((statusfolder.isnewfolder()) and
+ (len(localfolder.getmessagelist()) > 0) and
+ (len(remotefolder.getmessagelist()) == 0)):
+ # This is a locally created folder. Copy its contents to the
+ # remote folder, and to the StatusFolder.
+
+ localfolder.syncmessagesto(statusfolder, [remotefolder, statusfolder])
+
if not statusfolder.isnewfolder():
# Delete local copies of remote messages. This way,
# if a message's flag is modified locally but it has been
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
from offlineimap import CustomConfig
+from offlineimap.ui import UIBase
import os.path
def LoadRepository(name, account, reqtype):
def getfolder(self, foldername):
raise NotImplementedError
- def syncfoldersto(self, dest):
+ def syncfoldersto(self, dest, status):
"""Syncs the folders in this repository to those in dest.
It does NOT sync the contents of those folders."""
src = self
srchash = {}
for folder in srcfolders:
+ if (folder.getvisiblename()[-2:] == src.getsep() + "."):
+ continue
srchash[folder.getvisiblename().replace(src.getsep(), dest.getsep())] = \
folder
desthash = {}
# Find new folders.
#
+ ignoredfolders = []
+ newfolders = []
+
for key in srchash.keys():
if not key in desthash:
- dest.makefolder(key)
+ srckey = key.replace(dest.getsep(),src.getsep())
+ if status.getfolder(key.replace(dest.getsep(),status.getsep())).isnewfolder():
+ dest.makefolder(key)
+ newfolders.append(srckey)
+ else:
+ UIBase.getglobalui().ignorefolder (key, src, dest)
+ ignoredfolders.append(srckey)
#
# Find deleted folders.
#for key in desthash.keys():
# if not key in srchash:
# dest.deletefolder(key)
+
+ return (ignoredfolders,newfolders)
##### Keepalive
def syncfolders(s, srcrepos, destrepos):
if s.verbose >= 0:
- s._msg("Copying folder structure from %s to %s" % \
+ s._msg("Copying folder structure between %s and %s" % \
(s.getnicename(srcrepos), s.getnicename(destrepos)))
############################## Folder syncing
(folder.getname(), folder.getrepository().getname(),
folder.getsaveduidvalidity(), folder.getuidvalidity()))
+ def ignorefolder(s, foldername, here, there):
+ s.warn("Folder %s disappeared from %s; skipping it" % \
+ (foldername, there.getname()))
+
def loadmessagelist(s, repos, folder):
if s.verbose > 0:
s._msg("Loading message list for %s[%s]" % (s.getnicename(repos),