From e4cf193cd75e90ffb78ba0fdaadebdbbd69c684e Mon Sep 17 00:00:00 2001 From: Robin Schneider Date: Mon, 25 Jan 2016 23:52:16 +0100 Subject: [PATCH] Added support for file globs in source_directories. source_directories_glob can be used to enable glob support (defaults to disabled). --- README.md | 1 + atticmatic/backends/shared.py | 7 ++++++- atticmatic/tests/unit/backends/test_shared.py | 16 ++++++++++++++++ sample/config | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 509b1dd..d29687e 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Here's an example config file: [location] # Space-separated list of source directories to backup. source_directories: /home /etc +# source_directories_glob: 1 # Path to local or remote backup repository. repository: user@backupserver:sourcehostname.attic diff --git a/atticmatic/backends/shared.py b/atticmatic/backends/shared.py index f300d1e..65a39df 100644 --- a/atticmatic/backends/shared.py +++ b/atticmatic/backends/shared.py @@ -3,6 +3,8 @@ import os import re import platform import subprocess +from glob import glob +from itertools import chain from atticmatic.config import Section_format, option from atticmatic.verbosity import VERBOSITY_SOME, VERBOSITY_LOTS @@ -19,6 +21,7 @@ CONFIG_FORMAT = ( 'location', ( option('source_directories'), + option('source_directories_glob', int, required=False), option('repository'), ), ), @@ -58,7 +61,7 @@ def initialize(storage_config, command): def create_archive( excludes_filename, verbosity, storage_config, source_directories, repository, command, - one_file_system=None, + one_file_system=None, source_directories_glob=None ): ''' Given an excludes filename (or None), a vebosity flag, a storage config dict, a space-separated @@ -66,6 +69,8 @@ def create_archive( attic archive. ''' sources = tuple(re.split('\s+', source_directories)) + if source_directories_glob: + sources = tuple(chain.from_iterable([glob(x) for x in sources])) exclude_flags = ('--exclude-from', excludes_filename) if excludes_filename else () compression = storage_config.get('compression', None) compression_flags = ('--compression', compression) if compression else () diff --git a/atticmatic/tests/unit/backends/test_shared.py b/atticmatic/tests/unit/backends/test_shared.py index 8babc58..684c6d6 100644 --- a/atticmatic/tests/unit/backends/test_shared.py +++ b/atticmatic/tests/unit/backends/test_shared.py @@ -177,6 +177,22 @@ def test_create_archive_with_umask_should_call_attic_with_umask_parameters(): ) +def test_create_archive_with_globs(): + insert_subprocess_mock(('attic', 'create', 'repo::host-now', 'setup.py', 'setup.cfg')) + insert_platform_mock() + insert_datetime_mock() + + module.create_archive( + excludes_filename=None, + verbosity=None, + storage_config={}, + source_directories='setup*', + repository='repo', + command='attic', + source_directories_glob=1, + ) + + BASE_PRUNE_FLAGS = ( ('--keep-daily', '1'), ('--keep-weekly', '2'), diff --git a/sample/config b/sample/config index 70527e4..c698a91 100644 --- a/sample/config +++ b/sample/config @@ -1,6 +1,7 @@ [location] # Space-separated list of source directories to backup. source_directories: /home /etc +# source_directories_glob: 1 # For Borg only, you can specify to stay in same file system (do not cross # mount points).