- 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):
- startdir = OsFile('.')
- try:
- assert(type(paths) != type(''))
- for path in paths:
- try:
- pst = xstat.lstat(path)
- if stat.S_ISLNK(pst.st_mode):
- yield (path, pst)
- continue
- except OSError, e:
- add_error('recursive_dirlist: %s' % e)
- continue
- try:
- pfile = OsFile(path)
- except OSError, e:
- add_error(e)
- continue
- pst = pfile.stat()
- if xdev:
- xdev = pst.st_dev
- else:
- xdev = None
- if stat.S_ISDIR(pst.st_mode):
- pfile.fchdir()
- prepend = os.path.join(path, '')
- for i in _recursive_dirlist(prepend=prepend, xdev=xdev,
- bup_dir=bup_dir,
- excluded_paths=excluded_paths):
- yield i
- startdir.fchdir()
- else:
- prepend = path
- yield (prepend,pst)
- except:
+ try:
+ with finalized_fd(name) as fd:
+ os.fchdir(fd)
+ 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(b'..')
+ yield (path, pst)
+
+
+def recursive_dirlist(paths, xdev, bup_dir=None,
+ excluded_paths=None,
+ exclude_rxs=None,
+ xdev_exceptions=frozenset()):
+ with finalized_fd(b'.') as startdir: