summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--obnamlib/plugins/backup_plugin.py23
-rw-r--r--obnamlib/plugins/exclude_caches_plugin.py56
-rw-r--r--obnamlib/plugins/exclude_pathnames_plugin.py14
-rw-r--r--without-tests1
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