+
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:
try:
st = xstat.lstat(n)
except OSError as e:
- add_error(Exception('%s: %s' % (realpath(n), str(e))))
+ add_error(Exception('%s: %s' % (resolve_parent(n), str(e))))
continue
if (st.st_mode & _IFMT) == stat.S_IFDIR:
n += '/'
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:
if os.path.normpath(path) == bup_dir:
debug1('Skipping BUP_DIR.\n')
continue
- if xdev != None and pst.st_dev != xdev:
+ if xdev != None and pst.st_dev != xdev \
+ and path not in xdev_exceptions:
debug1('Skipping contents of %r: different filesystem.\n' % path)
else:
try:
for i in _recursive_dirlist(prepend=prepend+name, xdev=xdev,
bup_dir=bup_dir,
excluded_paths=excluded_paths,
- exclude_rxs=exclude_rxs):
+ 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(''))
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: