]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/drecurse.py
Add support for "bup index --exclude-rx <pattern> ...".
[bup.git] / lib / bup / drecurse.py
index 4196dec0faabb6377db279892c956cf0cb437826..694c403594d1aec45c6979629c20314fd4c948ea 100644 (file)
@@ -1,5 +1,6 @@
 import stat, os
 from bup.helpers import *
+import bup.xstat as xstat
 
 try:
     O_LARGEFILE = os.O_LARGEFILE
@@ -29,7 +30,7 @@ class OsFile:
         os.fchdir(self.fd)
 
     def stat(self):
-        return os.fstat(self.fd)
+        return xstat.fstat(self.fd)
 
 
 _IFMT = stat.S_IFMT(0xffffffff)  # avoid function call in inner loop
@@ -37,7 +38,7 @@ def _dirlist():
     l = []
     for n in os.listdir('.'):
         try:
-            st = os.lstat(n)
+            st = xstat.lstat(n)
         except OSError, e:
             add_error(Exception('%s: %s' % (realpath(n), str(e))))
             continue
@@ -48,19 +49,24 @@ 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):
     for (name,pst) in _dirlist():
+        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 xdev != None and pst.st_dev != xdev:
-                log('Skipping %r: different filesystem.\n' % (prepend+name))
+                debug1('Skipping %r: different filesystem.\n' % (prepend+name))
                 continue
             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))
+                    debug1('Skipping BUP_DIR.\n')
                     continue
             try:
                 OsFile(name).fchdir()
@@ -69,19 +75,21 @@ def _recursive_dirlist(prepend, xdev, bup_dir=None, excluded_paths=None):
             else:
                 for i in _recursive_dirlist(prepend=prepend+name, xdev=xdev,
                                             bup_dir=bup_dir,
-                                            excluded_paths=excluded_paths):
+                                            excluded_paths=excluded_paths,
+                                            exclude_rxs=exclude_rxs):
                     yield i
                 os.chdir('..')
         yield (prepend + name, pst)
 
 
-def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None):
+def recursive_dirlist(paths, xdev, bup_dir=None, excluded_paths=None,
+                      exclude_rxs=None):
     startdir = OsFile('.')
     try:
         assert(type(paths) != type(''))
         for path in paths:
             try:
-                pst = os.lstat(path)
+                pst = xstat.lstat(path)
                 if stat.S_ISLNK(pst.st_mode):
                     yield (path, pst)
                     continue
@@ -103,7 +111,8 @@ 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):
                     yield i
                 startdir.fchdir()
             else:
@@ -115,25 +124,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
-