X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fbup%2Fdrecurse.py;h=24a0db941538e68b95d2db061d16b6b0d2b30073;hb=c40b3dd5fd74e72024fbaad3daf5a958aefa1c54;hp=2dbe50c7934420f5e11d7b525d63f3f1626749d0;hpb=37f43d741eb44ae8f9e36f42770d2bb494999d92;p=bup.git diff --git a/lib/bup/drecurse.py b/lib/bup/drecurse.py index 2dbe50c..24a0db9 100644 --- a/lib/bup/drecurse.py +++ b/lib/bup/drecurse.py @@ -1,7 +1,11 @@ + +from __future__ import absolute_import import stat, os -from bup.helpers import * + +from bup.helpers import add_error, should_rx_exclude_path, debug1, resolve_parent import bup.xstat as xstat + try: O_LARGEFILE = os.O_LARGEFILE except AttributeError: @@ -39,8 +43,8 @@ def _dirlist(): for n in os.listdir('.'): try: st = xstat.lstat(n) - except OSError, e: - add_error(Exception('%s: %s' % (realpath(n), str(e)))) + except OSError as e: + add_error(Exception('%s: %s' % (resolve_parent(n), str(e)))) continue if (st.st_mode & _IFMT) == stat.S_IFDIR: n += '/' @@ -49,34 +53,46 @@ def _dirlist(): return l -def _recursive_dirlist(prepend, xdev, bup_dir=None, excluded_paths=None): +def _recursive_dirlist(prepend, xdev, bup_dir=None, + excluded_paths=None, + exclude_rxs=None, + xdev_exceptions=frozenset()): for (name,pst) in _dirlist(): - if name.endswith('/'): - if xdev != None and pst.st_dev != xdev: - log('Skipping %r: different filesystem.\n' % (prepend+name)) + path = prepend + name + if excluded_paths: + if os.path.normpath(path) in excluded_paths: + debug1('Skipping %r: excluded.\n' % path) continue + if exclude_rxs and should_rx_exclude_path(path, exclude_rxs): + continue + if name.endswith('/'): if bup_dir != None: - if os.path.normpath(prepend+name) == bup_dir: - log('Skipping BUP_DIR.\n') - continue - if excluded_paths: - if os.path.normpath(prepend+name) in excluded_paths: - log('Skipping %r: excluded.\n' % (prepend+name)) + if os.path.normpath(path) == bup_dir: + debug1('Skipping BUP_DIR.\n') continue - try: - OsFile(name).fchdir() - except OSError, e: - add_error('%s: %s' % (prepend, e)) + if xdev != None and pst.st_dev != xdev \ + and path not in xdev_exceptions: + debug1('Skipping contents of %r: different filesystem.\n' % path) else: - for i in _recursive_dirlist(prepend=prepend+name, xdev=xdev, - bup_dir=bup_dir, - excluded_paths=excluded_paths): - yield i - os.chdir('..') - yield (prepend + name, pst) - - -def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None): + try: + OsFile(name).fchdir() + except OSError as e: + add_error('%s: %s' % (prepend, e)) + else: + for i in _recursive_dirlist(prepend=prepend+name, xdev=xdev, + bup_dir=bup_dir, + excluded_paths=excluded_paths, + exclude_rxs=exclude_rxs, + xdev_exceptions=xdev_exceptions): + yield i + os.chdir('..') + yield (path, pst) + + +def recursive_dirlist(paths, xdev, bup_dir=None, + excluded_paths=None, + exclude_rxs=None, + xdev_exceptions=frozenset()): startdir = OsFile('.') try: assert(type(paths) != type('')) @@ -86,12 +102,12 @@ def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None): if stat.S_ISLNK(pst.st_mode): yield (path, pst) continue - except OSError, e: + except OSError as e: add_error('recursive_dirlist: %s' % e) continue try: pfile = OsFile(path) - except OSError, e: + except OSError as e: add_error(e) continue pst = pfile.stat() @@ -104,7 +120,9 @@ def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None): prepend = os.path.join(path, '') for i in _recursive_dirlist(prepend=prepend, xdev=xdev, bup_dir=bup_dir, - excluded_paths=excluded_paths): + excluded_paths=excluded_paths, + exclude_rxs=exclude_rxs, + xdev_exceptions=xdev_exceptions): yield i startdir.fchdir() else: @@ -116,25 +134,3 @@ def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None): except: pass raise - -def parse_excludes(flags): - excluded_paths = [] - - for flag in flags: - (option, parameter) = flag - if option == '--exclude': - excluded_paths.append(realpath(parameter)) - - if option == '--exclude-from': - try: - try: - f = open(realpath(parameter)) - for exclude_path in f.readlines(): - excluded_paths.append(realpath(exclude_path.strip())) - except Error, e: - log("warning: couldn't read %s" % parameter) - finally: - f.close() - - return excluded_paths -