Introduce dynamic filtering for repository folders

Allow people who want folder filtering to depend on the external
conditions or to make it dynamic for other reasons, to do what
they want.

New repository configuration knob 'dynamic_folderfilter' was
introduced; it defaults to 'False' that matches historical behaviour.

GitHub: #73
Signed-off-by: Eygene Ryabinkin <rea@codelabs.ru>
This commit is contained in:
Eygene Ryabinkin 2014-03-02 16:37:41 +04:00
parent b01274ce38
commit 829c9cf4be
3 changed files with 33 additions and 6 deletions

View File

@ -4,6 +4,13 @@ ChangeLog
:website: http://offlineimap.org
OfflineIMAP v6.5.6 (YYYY-MM-DD)
===============================
* Add knob to invoke folderfilter dynamically on each sync (GitHub#73)
OfflineIMAP v6.5.5 (2013-10-07)
===============================

View File

@ -540,6 +540,12 @@ remoteuser = username
#
# nametrans = lambda foldername: re.sub('^INBOX\.*', '.', foldername)
# Determines if folderfilter will be invoked on each run
# (dynamic folder filtering) or filtering status will be determined
# at startup (default behaviour).
#
# dynamic_folderfilter = False
# You can specify which folders to sync using the folderfilter
# setting. You can provide any python function (e.g. a lambda function)
# which will be invoked for each foldername. If the filter function

View File

@ -33,11 +33,8 @@ class BaseFolder(object):
:para repository: Repository() in which the folder is.
"""
self.ui = getglobalui()
"""Should this folder be included in syncing?"""
self._sync_this = repository.should_sync_folder(name)
if not self._sync_this:
self.ui.debug('', "Filtering out '%s'[%s] due to folderfilter" \
% (name, repository))
# Save original name for folderfilter operations
self.ffilter_name = name
# Top level dir name is always ''
self.name = name if not name == self.getsep() else ''
self.repository = repository
@ -47,6 +44,7 @@ class BaseFolder(object):
# return for the top-level dir.
if self.visiblename == self.getsep():
self.visiblename = ''
self.config = repository.getconfig()
utime_from_message_global = \
self.config.getdefaultboolean("general",
@ -56,6 +54,19 @@ class BaseFolder(object):
self.config.getdefaultboolean(repo,
"utime_from_message", utime_from_message_global)
# Determine if we're running static or dynamic folder filtering
# and check filtering status
self._dynamic_folderfilter = \
self.config.getdefaultboolean(repo, "dynamic_folderfilter", False)
self._sync_this = repository.should_sync_folder(self.ffilter_name)
if self._dynamic_folderfilter:
self.ui.debug('', "Running dynamic folder filtering on '%s'[%s]" \
% (self.ffilter_name, repository))
elif not self._sync_this:
self.ui.debug('', "Filtering out '%s'[%s] due to folderfilter" \
% (self.ffilter_name, repository))
def getname(self):
"""Returns name"""
return self.name
@ -71,7 +82,10 @@ class BaseFolder(object):
@property
def sync_this(self):
"""Should this folder be synced or is it e.g. filtered out?"""
if not self._dynamic_folderfilter:
return self._sync_this
else:
return this.repository.should_sync_folder(self.ffilter_name)
@property
def utime_from_message(self):