X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=lib%2Fbup%2Fdrecurse.py;h=14bb7212a9ecb3e5466f8236ed9674a9420d2332;hb=715706923d39c3f409017ce35cea799b97e5dabb;hp=694c403594d1aec45c6979629c20314fd4c948ea;hpb=cb354ed6baf6699f92717f42eb70d9bb6ff82933;p=bup.git diff --git a/lib/bup/drecurse.py b/lib/bup/drecurse.py index 694c403..14bb721 100644 --- a/lib/bup/drecurse.py +++ b/lib/bup/drecurse.py @@ -1,7 +1,10 @@ + 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 +42,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 += '/' @@ -51,7 +54,8 @@ def _dirlist(): def _recursive_dirlist(prepend, xdev, bup_dir=None, excluded_paths=None, - exclude_rxs=None): + exclude_rxs=None, + xdev_exceptions=frozenset()): for (name,pst) in _dirlist(): path = prepend + name if excluded_paths: @@ -61,29 +65,33 @@ def _recursive_dirlist(prepend, xdev, bup_dir=None, if exclude_rxs and should_rx_exclude_path(path, exclude_rxs): continue if name.endswith('/'): - if xdev != None and pst.st_dev != xdev: - debug1('Skipping %r: different filesystem.\n' % (prepend+name)) - continue if bup_dir != None: - if os.path.normpath(prepend+name) == bup_dir: + 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, - exclude_rxs=exclude_rxs): - yield i - os.chdir('..') - yield (prepend + name, pst) + 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): +def recursive_dirlist(paths, xdev, bup_dir=None, + excluded_paths=None, + exclude_rxs=None, + xdev_exceptions=frozenset()): startdir = OsFile('.') try: assert(type(paths) != type('')) @@ -93,12 +101,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() @@ -112,7 +120,8 @@ def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None, for i in _recursive_dirlist(prepend=prepend, xdev=xdev, bup_dir=bup_dir, excluded_paths=excluded_paths, - exclude_rxs=exclude_rxs): + exclude_rxs=exclude_rxs, + xdev_exceptions=xdev_exceptions): yield i startdir.fchdir() else: