add sync_this variable to all Folder() instances

This variable shows if this folder should be synced or is disabled due to
a folderfilter statement. This lets us distinguish between a non-existent
folder and one that has been filtered out. Previously any filtered folder
would simply appear to be non-existing.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
This commit is contained in:
Sebastian Spaeth 2011-08-14 13:38:13 +02:00
parent 32ca20d0da
commit 8ba17c5bd1
3 changed files with 24 additions and 6 deletions

View File

@ -274,6 +274,10 @@ class SyncableAccount(Account):
# iterate through all folders on the remote repo and sync # iterate through all folders on the remote repo and sync
for remotefolder in remoterepos.getfolders(): for remotefolder in remoterepos.getfolders():
if not remotefolder.sync_this:
self.ui.debug('', "Not syncing filtered remote folder '%s'"
"[%s]" % (remotefolder, remoterepos))
continue # Filtered out remote folder
thread = InstanceLimitedThread(\ thread = InstanceLimitedThread(\
instancename = 'FOLDER_' + self.remoterepos.getname(), instancename = 'FOLDER_' + self.remoterepos.getname(),
target = syncfolder, target = syncfolder,
@ -323,7 +327,9 @@ class SyncableAccount(Account):
def syncfolder(accountname, remoterepos, remotefolder, localrepos, def syncfolder(accountname, remoterepos, remotefolder, localrepos,
statusrepos, quick): statusrepos, quick):
"""This function is called as target for the """This function is called as target for the
InstanceLimitedThread invokation in SyncableAccount.""" InstanceLimitedThread invokation in SyncableAccount.
Filtered folders on the remote side will not invoke this function."""
ui = getglobalui() ui = getglobalui()
ui.registerthread(accountname) ui.registerthread(accountname)
try: try:
@ -331,6 +337,14 @@ def syncfolder(accountname, remoterepos, remotefolder, localrepos,
localfolder = localrepos.\ localfolder = localrepos.\
getfolder(remotefolder.getvisiblename().\ getfolder(remotefolder.getvisiblename().\
replace(remoterepos.getsep(), localrepos.getsep())) replace(remoterepos.getsep(), localrepos.getsep()))
#Filtered folders on the remote side will not invoke this
#function, but we need to NOOP if the local folder is filtered
#out too:
if not localfolder.sync_this:
ui.debug('', "Not syncing filtered local folder '%s'" \
% localfolder)
return
# Write the mailboxes # Write the mailboxes
mbnames.add(accountname, localfolder.getvisiblename()) mbnames.add(accountname, localfolder.getvisiblename())

View File

@ -33,6 +33,8 @@ class BaseFolder(object):
:para name: Path & name of folder minus root or reference :para name: Path & name of folder minus root or reference
:para repository: Repository() in which the folder is. :para repository: Repository() in which the folder is.
""" """
self.sync_this = True
"""Should this folder be included in syncing?"""
self.ui = getglobalui() self.ui = getglobalui()
self.name = name self.name = name
self.repository = repository self.repository = repository

View File

@ -295,12 +295,14 @@ class IMAPRepository(BaseRepository):
if '\\noselect' in flaglist: if '\\noselect' in flaglist:
continue continue
foldername = imaputil.dequote(name) foldername = imaputil.dequote(name)
if not self.folderfilter(foldername):
self.ui.debug('imap',"Filtering out '%s' due to folderfilter" %\
foldername)
continue
retval.append(self.getfoldertype()(self.imapserver, foldername, retval.append(self.getfoldertype()(self.imapserver, foldername,
self)) self))
# filter out the folder?
if not self.folderfilter(foldername):
self.ui.debug('imap', "Filtering out '%s'[%s] due to folderfilt"
"er" % (foldername, self))
retval[-1].sync_this = False
# Add all folderincludes
if len(self.folderincludes): if len(self.folderincludes):
imapobj = self.imapserver.acquireconnection() imapobj = self.imapserver.acquireconnection()
try: try:
@ -322,7 +324,7 @@ class IMAPRepository(BaseRepository):
retval.sort(lambda x, y: self.foldersort(x.getvisiblename(), y.getvisiblename())) retval.sort(lambda x, y: self.foldersort(x.getvisiblename(), y.getvisiblename()))
self.folders = retval self.folders = retval
return retval return self.folders
def makefolder(self, foldername): def makefolder(self, foldername):
#if self.getreference() != '""': #if self.getreference() != '""':