diff options
author | Jürg Billeter <j@bitron.ch> | 2019-02-23 12:35:00 +0100 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2019-02-26 13:06:53 +0100 |
commit | c9fb6488c57f3b7133283929c549bc3ea5b564a0 (patch) | |
tree | f40f40463bcbd47e39cac69c1eeda8a4b7da1f41 /buildstream | |
parent | ee9c1bf522d1f5ee05210c9267af82a9abc54806 (diff) | |
download | buildstream-c9fb6488c57f3b7133283929c549bc3ea5b564a0.tar.gz |
utils.py: Add filter_callback parameter to copy_files and link_files
Diffstat (limited to 'buildstream')
-rw-r--r-- | buildstream/utils.py | 25 |
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. |