summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2019-02-23 12:35:00 +0100
committerJürg Billeter <j@bitron.ch>2019-02-26 13:06:53 +0100
commitc9fb6488c57f3b7133283929c549bc3ea5b564a0 (patch)
treef40f40463bcbd47e39cac69c1eeda8a4b7da1f41
parentee9c1bf522d1f5ee05210c9267af82a9abc54806 (diff)
downloadbuildstream-c9fb6488c57f3b7133283929c549bc3ea5b564a0.tar.gz
utils.py: Add filter_callback parameter to copy_files and link_files
-rw-r--r--buildstream/utils.py25
1 files changed, 21 insertions, 4 deletions
diff --git a/buildstream/utils.py b/buildstream/utils.py
index 204afca0c..37bcfbeed 100644
--- a/buildstream/utils.py
+++ b/buildstream/utils.py
@@ -352,12 +352,16 @@ def safe_remove(path):
.format(path, e))
-def copy_files(src, dest, *, files=None, ignore_missing=False, report_written=False):
+def copy_files(src, dest, *, filter_callback=None, files=None, ignore_missing=False, report_written=False):
"""Copy files from source to destination.
Args:
src (str): The source file or directory
dest (str): The destination directory
+ filter_callback (callable): Optional filter callback. Called with the relative path as
+ argument for every file in the source directory. The file is
+ copied only if the callable returns True. If no filter callback
+ is specified, all files will be copied.
files (list): Optional list of files in `src` to copy
ignore_missing (bool): Dont raise any error if a source file is missing
report_written (bool): Add to the result object the full list of files written
@@ -383,7 +387,9 @@ def copy_files(src, dest, *, files=None, ignore_missing=False, report_written=Fa
result = FileListResult()
try:
- _process_list(src, dest, files, safe_copy, result, ignore_missing=ignore_missing,
+ _process_list(src, dest, files, safe_copy, result,
+ filter_callback=filter_callback,
+ ignore_missing=ignore_missing,
report_written=report_written, presorted=presorted)
except OSError as e:
raise UtilError("Failed to copy '{} -> {}': {}"
@@ -391,12 +397,16 @@ def copy_files(src, dest, *, files=None, ignore_missing=False, report_written=Fa
return result
-def link_files(src, dest, *, files=None, ignore_missing=False, report_written=False):
+def link_files(src, dest, *, filter_callback=None, files=None, ignore_missing=False, report_written=False):
"""Hardlink files from source to destination.
Args:
src (str): The source file or directory
dest (str): The destination directory
+ filter_callback (callable): Optional filter callback. Called with the relative path as
+ argument for every file in the source directory. The file is
+ hardlinked only if the callable returns True. If no filter
+ callback is specified, all files will be hardlinked.
files (list): Optional list of files in `src` to link
ignore_missing (bool): Dont raise any error if a source file is missing
report_written (bool): Add to the result object the full list of files written
@@ -427,7 +437,9 @@ def link_files(src, dest, *, files=None, ignore_missing=False, report_written=Fa
result = FileListResult()
try:
- _process_list(src, dest, files, safe_link, result, ignore_missing=ignore_missing,
+ _process_list(src, dest, files, safe_link, result,
+ filter_callback=filter_callback,
+ ignore_missing=ignore_missing,
report_written=report_written, presorted=presorted)
except OSError as e:
raise UtilError("Failed to link '{} -> {}': {}"
@@ -810,11 +822,13 @@ def _ensure_real_directory(root, path):
# filelist: List of relative file paths
# actionfunc: The function to call for regular files
# result: The FileListResult
+# filter_callback: Optional callback to invoke for every directory entry
# ignore_missing: Dont raise any error if a source file is missing
# presorted: Whether the passed list is known to be presorted
#
#
def _process_list(srcdir, destdir, filelist, actionfunc, result,
+ filter_callback=None,
ignore_missing=False, report_written=False,
presorted=False):
@@ -822,6 +836,9 @@ def _process_list(srcdir, destdir, filelist, actionfunc, result,
# *after* files have been written.
permissions = []
+ if filter_callback:
+ filelist = [path for path in filelist if filter_callback(path)]
+
# Sorting the list of files is necessary to ensure that we processes
# symbolic links which lead to directories before processing files inside
# those directories.