Skip to content

Commit

Permalink
Introduce dynamic filtering for repository folders
Browse files Browse the repository at this point in the history
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: OfflineIMAP#73
Signed-off-by: Eygene Ryabinkin <[email protected]>
  • Loading branch information
konvpalto committed Mar 2, 2014
1 parent b01274c commit 829c9cf
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 6 deletions.
7 changes: 7 additions & 0 deletions Changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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)
===============================

Expand Down
6 changes: 6 additions & 0 deletions offlineimap.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 20 additions & 6 deletions offlineimap/folder/Base.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,8 @@ def __init__(self, name, repository):
: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
Expand All @@ -47,6 +44,7 @@ def __init__(self, name, repository):
# 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",
Expand All @@ -56,6 +54,19 @@ def __init__(self, name, repository):
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
Expand All @@ -71,7 +82,10 @@ def accountname(self):
@property
def sync_this(self):
"""Should this folder be synced or is it e.g. filtered out?"""
return self._sync_this
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):
Expand Down

0 comments on commit 829c9cf

Please sign in to comment.