diff options
Diffstat (limited to 'io_blend_utils/blender_bam-1.1.7-py3-none-any.whl/bam/blend/blendfile_copy.py')
-rw-r--r-- | io_blend_utils/blender_bam-1.1.7-py3-none-any.whl/bam/blend/blendfile_copy.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/io_blend_utils/blender_bam-1.1.7-py3-none-any.whl/bam/blend/blendfile_copy.py b/io_blend_utils/blender_bam-1.1.7-py3-none-any.whl/bam/blend/blendfile_copy.py new file mode 100644 index 00000000..595f2b0f --- /dev/null +++ b/io_blend_utils/blender_bam-1.1.7-py3-none-any.whl/bam/blend/blendfile_copy.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 + +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ***** END GPL LICENCE BLOCK ***** + +""" +A simply utility to copy blend files and their deps to a new location. + +Similar to packing, but don't attempt any path remapping. +""" + +from bam.blend import blendfile_path_walker + +TIMEIT = False + +# ------------------ +# Ensure module path +import os +import sys +path = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "modules")) +if path not in sys.path: + sys.path.append(path) +del os, sys, path +# -------- + + +def copy_paths( + paths, + output, + base, + + # load every libs dep, not just used deps. + all_deps=False, + # yield reports + report=None, + + # Filename filter, allow to exclude files from the pack, + # function takes a string returns True if the files should be included. + filename_filter=None, + ): + + import os + import shutil + + from bam.utils.system import colorize, is_subdir + + path_copy_files = set(paths) + + # Avoid walking over same libs many times + lib_visit = {} + + yield report("Reading %d blend file(s)\n" % len(paths)) + for blendfile_src in paths: + yield report(" %s: %r\n" % (colorize("blend", color='blue'), blendfile_src)) + for fp, (rootdir, fp_blend_basename) in blendfile_path_walker.FilePath.visit_from_blend( + blendfile_src, + readonly=True, + recursive=True, + recursive_all=all_deps, + lib_visit=lib_visit, + ): + + f_abs = os.path.normpath(fp.filepath_absolute) + path_copy_files.add(f_abs) + + # Source -> Dest Map + path_src_dst_map = {} + + for path_src in sorted(path_copy_files): + + if filename_filter and not filename_filter(path_src): + yield report(" %s: %r\n" % (colorize("exclude", color='yellow'), path_src)) + continue + + if not os.path.exists(path_src): + yield report(" %s: %r\n" % (colorize("missing path", color='red'), path_src)) + continue + + if not is_subdir(path_src, base): + yield report(" %s: %r\n" % (colorize("external path ignored", color='red'), path_src)) + continue + + path_rel = os.path.relpath(path_src, base) + path_dst = os.path.join(output, path_rel) + + path_src_dst_map[path_src] = path_dst + + # Create directories + path_dst_dir = {os.path.dirname(path_dst) for path_dst in path_src_dst_map.values()} + yield report("Creating %d directories in %r\n" % (len(path_dst_dir), output)) + for path_dir in sorted(path_dst_dir): + os.makedirs(path_dir, exist_ok=True) + del path_dst_dir + + # Copy files + yield report("Copying %d files to %r\n" % (len(path_src_dst_map), output)) + for path_src, path_dst in sorted(path_src_dst_map.items()): + yield report(" %s: %r -> %r\n" % (colorize("copying", color='blue'), path_src, path_dst)) + shutil.copy(path_src, path_dst) |