diff options
-rw-r--r-- | obnamlib/plugins/backup_plugin.py | 23 | ||||
-rw-r--r-- | obnamlib/plugins/exclude_caches_plugin.py | 56 | ||||
-rw-r--r-- | obnamlib/plugins/exclude_pathnames_plugin.py | 14 | ||||
-rw-r--r-- | without-tests | 1 |
4 files changed, 64 insertions, 30 deletions
diff --git a/obnamlib/plugins/backup_plugin.py b/obnamlib/plugins/backup_plugin.py index e366bc46..5ff54413 100644 --- a/obnamlib/plugins/backup_plugin.py +++ b/obnamlib/plugins/backup_plugin.py @@ -209,15 +209,6 @@ class BackupPlugin(obnamlib.ObnamPlugin): group=backup_group) self.app.settings.boolean( - ['exclude-caches'], - 'exclude directories (and their subdirs) ' - 'that contain a CACHEDIR.TAG file (see ' - 'http://www.brynosaurus.com/cachedir/spec.html for what ' - 'it needs to contain, and http://liw.fi/cachedir/ for a ' - 'helper tool)', - group=backup_group) - - self.app.settings.boolean( ['one-file-system'], 'exclude directories (and their subdirs) ' 'that are in a different filesystem', @@ -710,22 +701,10 @@ class BackupPlugin(obnamlib.ObnamPlugin): logging.debug('Excluding (one-file-system): %s' % pathname) return False - if stat.S_ISDIR(st.st_mode) and self.app.settings['exclude-caches']: - tag_filename = 'CACHEDIR.TAG' - tag_contents = 'Signature: 8a477f597d28d172789f06886806bc55' - tag_path = os.path.join(pathname, 'CACHEDIR.TAG') - if self.fs.exists(tag_path): - # Can't use with, because Paramiko's SFTPFile does not work. - f = self.fs.open(tag_path, 'rb') - data = f.read(len(tag_contents)) - f.close() - if data == tag_contents: - logging.debug('Excluding (cache dir): %s' % pathname) - return False - exclude = [False] self.app.hooks.call( 'backup-exclude', + fs=self.fs, pathname=pathname, stat_result=st, exclude=exclude) diff --git a/obnamlib/plugins/exclude_caches_plugin.py b/obnamlib/plugins/exclude_caches_plugin.py new file mode 100644 index 00000000..6dc0872b --- /dev/null +++ b/obnamlib/plugins/exclude_caches_plugin.py @@ -0,0 +1,56 @@ +# Copyright (C) 2015 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +import logging +import os +import stat + +import obnamlib + + +class ExcludeCachesPlugin(obnamlib.ObnamPlugin): + + def enable(self): + backup_group = obnamlib.option_group['backup'] = 'Backing up' + + self.app.settings.boolean( + ['exclude-caches'], + 'exclude directories (and their subdirs) ' + 'that contain a CACHEDIR.TAG file (see ' + 'http://www.brynosaurus.com/cachedir/spec.html for what ' + 'it needs to contain, and http://liw.fi/cachedir/ for a ' + 'helper tool)', + group=backup_group) + + self.app.hooks.add_callback('config-loaded', self.config_loaded) + + def config_loaded(self): + if self.app.settings['exclude-caches']: + self.app.hooks.add_callback('backup-exclude', self.exclude) + + def exclude(self, fs=None, pathname=None, stat_result=None, exclude=None): + if stat.S_ISDIR(stat_result.st_mode): + tag_filename = 'CACHEDIR.TAG' + tag_contents = 'Signature: 8a477f597d28d172789f06886806bc55' + tag_path = os.path.join(pathname, 'CACHEDIR.TAG') + if fs.exists(tag_path): + # Can't use with, because Paramiko's SFTPFile does not work. + f = fs.open(tag_path, 'rb') + data = f.read(len(tag_contents)) + f.close() + if data == tag_contents: + logging.debug('Excluding (cache dir): %s' % pathname) + return False diff --git a/obnamlib/plugins/exclude_pathnames_plugin.py b/obnamlib/plugins/exclude_pathnames_plugin.py index 92acd7c8..8b19985f 100644 --- a/obnamlib/plugins/exclude_pathnames_plugin.py +++ b/obnamlib/plugins/exclude_pathnames_plugin.py @@ -48,17 +48,15 @@ class ExcludePathnamesPlugin(obnamlib.ObnamPlugin): '(can be used multiple times)', group=backup_group) - self.app.hooks.add_callback('backup-exclude', self.exclude) + self.app.hooks.add_callback('config-loaded', self.config_loaded) + def config_loaded(self): + self.app.hooks.add_callback('backup-exclude', self.exclude) self.pathname_excluder = obnamlib.PathnameExcluder() - self.init_done = False - - def exclude(self, pathname=None, stat_result=None, exclude=None): - if not self.init_done: - self.compile_exclusion_patterns() - self.compile_inclusion_patterns() - self.init_done = True + self.compile_exclusion_patterns() + self.compile_inclusion_patterns() + def exclude(self, fs=None, pathname=None, stat_result=None, exclude=None): is_excluded, regexp = self.pathname_excluder.exclude(pathname) if is_excluded: logging.debug('Exclude (pattern): %s', pathname) diff --git a/without-tests b/without-tests index 5d847ae5..9ec98686 100644 --- a/without-tests +++ b/without-tests @@ -29,3 +29,4 @@ test-plugins/wrongversion_plugin.py obnamlib/plugins/dump_repo_plugin.py obnamlib/fmt_simple/__init__.py obnamlib/plugins/exclude_pathnames_plugin.py +obnamlib/plugins/exclude_caches_plugin.py |