115 lines
3.6 KiB
Python
115 lines
3.6 KiB
Python
#!/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)
|