From 9ffd5d1035216e8b1d89453da57890587fa72011 Mon Sep 17 00:00:00 2001 From: Tim Riemenschneider Date: Thu, 21 Mar 2013 01:29:23 +0100 Subject: [PATCH] new option "--exclude-caches" for bup-index Excludes all directories that contain a file CACHEDIR.TAG that begins with "Signature: 8a477f597d28d172789f06886806bc55". See http://www.brynosaurus.com/cachedir/ for more information about cache-directory tagging. Signed-off-by: Tim Riemenschneider (cherry picked from commit 9b2598fb08c62d8904982c9b45ecd3929c7acc7b) --- Documentation/bup-index.md | 8 +++++++- cmd/index-cmd.py | 4 +++- lib/bup/drecurse.py | 22 ++++++++++++++++++---- t/test-index-excludes.sh | 20 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/Documentation/bup-index.md b/Documentation/bup-index.md index 75506a2..7b5a6ba 100644 --- a/Documentation/bup-index.md +++ b/Documentation/bup-index.md @@ -12,7 +12,7 @@ bup index \<-p|-m|-s|-u|\--clear|\--check\> [-H] [-l] [-x] [\--fake-valid] [\--no-check-device] [\--fake-invalid] [-f *indexfile*] [\--exclude *path*] [\--exclude-from *filename*] [\--exclude-rx *pattern*] [\--exclude-rx-from *filename*] [\--exclude-if-present *filename*] -[-v] \ +[\--exclude-caches] [-v] \ # DESCRIPTION @@ -188,6 +188,12 @@ does, due to the accommodations described above. So you can "touch .do-not-backup-me" to exclude a directory from backup. +\--exclude-caches +: exclude all directories that contain a file CACHEDIR.TAG, whose + content begins with "Signature: 8a477f597d28d172789f06886806bc55". + For more information on cachedir-tagging, see + http://www.brynosaurus.com/cachedir/ + \--no-check-device : don't mark a an entry invalid if the device number (stat(2) st_dev) changes. This can be useful when indexing remote, diff --git a/cmd/index-cmd.py b/cmd/index-cmd.py index 4354eec..c07252b 100755 --- a/cmd/index-cmd.py +++ b/cmd/index-cmd.py @@ -85,7 +85,8 @@ def update_index(top, excluded_paths, exclude_rxs): bup_dir=bup_dir, excluded_paths=excluded_paths, exclude_rxs=exclude_rxs, - exclude_if_present=opt['exclude-if-present']): + exclude_if_present=opt['exclude-if-present'], + exclude_caches=opt.exclude_caches): if opt.verbose>=2 or (opt.verbose==1 and stat.S_ISDIR(pst.st_mode)): sys.stdout.write('%s\n' % path) sys.stdout.flush() @@ -207,6 +208,7 @@ exclude-from= skip --exclude paths in file (may be repeated) exclude-rx= skip paths matching the unanchored regex (may be repeated) exclude-rx-from= skip --exclude-rx patterns in file (may be repeated) exclude-if-present= exclude directory if the given file is present +exclude-caches exclude CACHEDIR.TAG-directories v,verbose increase log output (can be used more than once) x,xdev,one-file-system don't cross filesystem boundaries """ diff --git a/lib/bup/drecurse.py b/lib/bup/drecurse.py index 61da2c5..8404f8b 100644 --- a/lib/bup/drecurse.py +++ b/lib/bup/drecurse.py @@ -52,7 +52,8 @@ def _dirlist(): def _recursive_dirlist(prepend, xdev, bup_dir=None, excluded_paths=None, exclude_rxs=None, - exclude_if_present=None): + exclude_if_present=None, + exclude_caches=None): for (name,pst) in _dirlist(): path = prepend + name if excluded_paths: @@ -65,6 +66,16 @@ def _recursive_dirlist(prepend, xdev, bup_dir=None, if exclude_if_present != None and os.path.exists(prepend+name+exclude_if_present): debug1('Skipping %r: exclude-file present.\n' % (prepend+name)) continue + if exclude_caches: + tag_filename = 'CACHEDIR.TAG' + tag_contents = 'Signature: 8a477f597d28d172789f06886806bc55' + if os.path.exists(prepend+name+tag_filename): + f = open(prepend+name+tag_filename, 'rb') + data = f.read(len(tag_contents)) + f.close() + if data == tag_contents: + debug1('Skipping %r: excluding cache dir' % (prepend+name)) + continue if bup_dir != None: if os.path.normpath(path) == bup_dir: debug1('Skipping BUP_DIR.\n') @@ -81,7 +92,8 @@ def _recursive_dirlist(prepend, xdev, bup_dir=None, bup_dir=bup_dir, excluded_paths=excluded_paths, exclude_rxs=exclude_rxs, - exclude_if_present=exclude_if_present): + exclude_if_present=exclude_if_present, + exclude_caches=exclude_caches): yield i os.chdir('..') yield (path, pst) @@ -89,7 +101,8 @@ def _recursive_dirlist(prepend, xdev, bup_dir=None, def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None, exclude_rxs=None, - exclude_if_present=None): + exclude_if_present=None, + exclude_caches=None): startdir = OsFile('.') try: assert(type(paths) != type('')) @@ -119,7 +132,8 @@ def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None, bup_dir=bup_dir, excluded_paths=excluded_paths, exclude_rxs=exclude_rxs, - exclude_if_present=exclude_if_present): + exclude_if_present=exclude_if_present, + exclude_caches=exclude_caches): yield i startdir.fchdir() else: diff --git a/t/test-index-excludes.sh b/t/test-index-excludes.sh index 5b89d2e..d667a3f 100755 --- a/t/test-index-excludes.sh +++ b/t/test-index-excludes.sh @@ -25,3 +25,23 @@ b f" rm -rf "$D" ) || WVFAIL + +WVSTART "exclude-caches" +( + set -e -o pipefail + D="$(wvmktempdir)" + force-delete $D + mkdir $D + export BUP_DIR="$D/.bup" + WVPASS bup init + touch $D/a + WVPASS bup random 128k >$D/b + mkdir $D/d $D/d/e + WVPASS bup random 512 >$D/f + echo 'Signature: 8a477f597d28d172789f06886806bc55' > $D/d/CACHEDIR.TAG + WVPASS bup index -ux --exclude-caches $D + bup save -n exclude $D + WVPASSEQ "$(bup ls exclude/latest/$TOP/$D/)" "a +b +f" +) || WVFAIL -- 2.39.5