add path remapping on file pack
This commit is contained in:
@@ -30,6 +30,46 @@ Blender asset manager
|
|||||||
# * definition of project (.bam (like .git)) ... json
|
# * definition of project (.bam (like .git)) ... json
|
||||||
|
|
||||||
|
|
||||||
|
class bam_config:
|
||||||
|
# fake module
|
||||||
|
__slots__ = ()
|
||||||
|
def __new__(cls, *args, **kwargs):
|
||||||
|
raise RuntimeError("%s should not be instantiated" % cls)
|
||||||
|
|
||||||
|
CONFIG_DIR = ".bam"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def find_basedir():
|
||||||
|
"""
|
||||||
|
Return the config path (or None when not found)
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
parent = (os.path.normpath(
|
||||||
|
os.path.abspath(
|
||||||
|
os.getcwd())))
|
||||||
|
|
||||||
|
parent_prev = None
|
||||||
|
|
||||||
|
while parent != parent_prev:
|
||||||
|
test_dir = os.path.join(parent, bam_config.CONFIG_DIR)
|
||||||
|
if os.path.isdir(test_dir):
|
||||||
|
return test_dir
|
||||||
|
|
||||||
|
parent_prev = parent
|
||||||
|
parent = os.path.dirname(parent)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def load(id_):
|
||||||
|
# bam_config.find_basedir()
|
||||||
|
# data =
|
||||||
|
pass
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def write(id_, data):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class bam_utils:
|
class bam_utils:
|
||||||
# fake module
|
# fake module
|
||||||
@@ -44,7 +84,7 @@ class bam_utils:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def session_request_url(req_path):
|
def session_request_url(req_path):
|
||||||
# TODO, get from config
|
# TODO, get from config
|
||||||
BAM_SERVER = "http://localhost:5000"
|
BAM_SERVER = bam_utils.session_find_url()
|
||||||
result = "%s/%s" % (BAM_SERVER, req_path)
|
result = "%s/%s" % (BAM_SERVER, req_path)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@@ -95,6 +135,8 @@ class bam_utils:
|
|||||||
import sys
|
import sys
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
# print(bam_config.find_config())
|
||||||
|
|
||||||
path = paths[0]
|
path = paths[0]
|
||||||
del paths
|
del paths
|
||||||
|
|
||||||
|
@@ -23,12 +23,13 @@ import blendfile_path_walker
|
|||||||
TIMEIT = True
|
TIMEIT = True
|
||||||
|
|
||||||
|
|
||||||
def pack(blendfile_src, blendfile_dst, mode='FILE', pathmap=None):
|
def pack(blendfile_src, blendfile_dst, mode='FILE',
|
||||||
|
deps_remap=None, paths_remap=None):
|
||||||
"""
|
"""
|
||||||
:param pathmap: Store path pathmap info as follows.
|
:param deps_remap: Store path deps_remap info as follows.
|
||||||
{"file.blend": {"path_new": "path_old", ...}, ...}
|
{"file.blend": {"path_new": "path_old", ...}, ...}
|
||||||
|
|
||||||
:type pathmap: dict or None
|
:type deps_remap: dict or None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Internal details:
|
# Internal details:
|
||||||
@@ -111,9 +112,9 @@ def pack(blendfile_src, blendfile_dst, mode='FILE', pathmap=None):
|
|||||||
if not isinstance(fp, blendfile_path_walker.FPElem_block_path) or fp.userdata[0].code != b'LI':
|
if not isinstance(fp, blendfile_path_walker.FPElem_block_path) or fp.userdata[0].code != b'LI':
|
||||||
path_copy_files.add((path_src, path_dst))
|
path_copy_files.add((path_src, path_dst))
|
||||||
|
|
||||||
if pathmap is not None:
|
if deps_remap is not None:
|
||||||
# this needs to become JSON later... ugh, need to use strings
|
# this needs to become JSON later... ugh, need to use strings
|
||||||
pathmap.setdefault(
|
deps_remap.setdefault(
|
||||||
fp_blend_basename.decode('utf-8'),
|
fp_blend_basename.decode('utf-8'),
|
||||||
{})[path_dst_final.decode('utf-8')] = path_src_orig.decode('utf-8')
|
{})[path_dst_final.decode('utf-8')] = path_src_orig.decode('utf-8')
|
||||||
|
|
||||||
@@ -122,16 +123,23 @@ def pack(blendfile_src, blendfile_dst, mode='FILE', pathmap=None):
|
|||||||
if TIMEIT:
|
if TIMEIT:
|
||||||
print(" Time: %.4f\n" % (time.time() - t))
|
print(" Time: %.4f\n" % (time.time() - t))
|
||||||
|
|
||||||
# handle pathmap and file renaming
|
# handle deps_remap and file renaming
|
||||||
if pathmap is not None:
|
if deps_remap is not None:
|
||||||
blendfile_src_basename = os.path.basename(blendfile_src).decode('utf-8')
|
blendfile_src_basename = os.path.basename(blendfile_src).decode('utf-8')
|
||||||
blendfile_dst_basename = os.path.basename(blendfile_dst).decode('utf-8')
|
blendfile_dst_basename = os.path.basename(blendfile_dst).decode('utf-8')
|
||||||
|
|
||||||
if blendfile_src_basename != blendfile_dst_basename:
|
if blendfile_src_basename != blendfile_dst_basename:
|
||||||
pathmap[blendfile_dst_basename] = pathmap[blendfile_src_basename]
|
deps_remap[blendfile_dst_basename] = deps_remap[blendfile_src_basename]
|
||||||
del pathmap[blendfile_src_basename]
|
del deps_remap[blendfile_src_basename]
|
||||||
del blendfile_src_basename, blendfile_dst_basename
|
del blendfile_src_basename, blendfile_dst_basename
|
||||||
|
|
||||||
|
# store path mapping {dst: src}
|
||||||
|
if paths_remap:
|
||||||
|
for src, dst in path_copy_files:
|
||||||
|
# TODO. relative to project-basepath
|
||||||
|
paths_remap[os.path.relpath(dst, base_dir_dst).decode('utf-8')] = src
|
||||||
|
# paths_remap[os.path.relpath(dst, base_dir_dst)] = blendfile_src
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
# Handle File Copy/Zip
|
# Handle File Copy/Zip
|
||||||
|
|
||||||
@@ -154,6 +162,7 @@ def pack(blendfile_src, blendfile_dst, mode='FILE', pathmap=None):
|
|||||||
print(" Copying %r -> %r" % (src, dst))
|
print(" Copying %r -> %r" % (src, dst))
|
||||||
shutil.copy(src, dst)
|
shutil.copy(src, dst)
|
||||||
|
|
||||||
|
|
||||||
print(" Written:", blendfile_dst)
|
print(" Written:", blendfile_dst)
|
||||||
|
|
||||||
elif mode == 'ZIP':
|
elif mode == 'ZIP':
|
||||||
@@ -205,8 +214,11 @@ def create_argparse():
|
|||||||
choices=('FILE', 'ZIP'), default='FILE',
|
choices=('FILE', 'ZIP'), default='FILE',
|
||||||
help="Output file or a directory when multiple inputs are passed")
|
help="Output file or a directory when multiple inputs are passed")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-r", "--remap", dest="path_remap", metavar='FILE',
|
"-r", "--deps_remap", dest="deps_remap", metavar='FILE',
|
||||||
help="Write out the path mapping to a JSON file")
|
help="Write out the path mapping to a JSON file")
|
||||||
|
parser.add_argument(
|
||||||
|
"-s", "--paths_remap", dest="paths_remap", metavar='FILE',
|
||||||
|
help="Write out the original paths to a JSON file")
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
@@ -219,23 +231,29 @@ def main():
|
|||||||
|
|
||||||
encoding = sys.getfilesystemencoding()
|
encoding = sys.getfilesystemencoding()
|
||||||
|
|
||||||
if args.path_remap:
|
if args.deps_remap:
|
||||||
pathmap = {}
|
deps_remap = {}
|
||||||
else:
|
else:
|
||||||
pathmap = None
|
deps_remap = None
|
||||||
|
|
||||||
|
if args.paths_remap:
|
||||||
|
paths_remap = {}
|
||||||
|
else:
|
||||||
|
paths_remap = None
|
||||||
|
|
||||||
pack(args.path_src.encode(encoding),
|
pack(args.path_src.encode(encoding),
|
||||||
args.path_dst.encode(encoding),
|
args.path_dst.encode(encoding),
|
||||||
args.mode,
|
args.mode,
|
||||||
pathmap,
|
deps_remap,
|
||||||
|
paths_remap,
|
||||||
)
|
)
|
||||||
|
|
||||||
if pathmap is not None:
|
if deps_remap is not None:
|
||||||
import json
|
import json
|
||||||
|
|
||||||
with open(args.path_remap, 'w', encoding='utf-8') as f:
|
with open(args.deps_remap, 'w', encoding='utf-8') as f:
|
||||||
json.dump(
|
json.dump(
|
||||||
pathmap, f, ensure_ascii=False,
|
deps_remap, f, ensure_ascii=False,
|
||||||
# optional (pretty)
|
# optional (pretty)
|
||||||
sort_keys=True, indent=4, separators=(',', ': '),
|
sort_keys=True, indent=4, separators=(',', ': '),
|
||||||
)
|
)
|
||||||
|
@@ -29,7 +29,7 @@ VERBOSE = 1
|
|||||||
import blendfile_path_walker
|
import blendfile_path_walker
|
||||||
|
|
||||||
|
|
||||||
def blendfile_remap(blendfile_src, blendpath_dst, path_remap):
|
def blendfile_remap(blendfile_src, blendpath_dst, deps_remap):
|
||||||
import os
|
import os
|
||||||
|
|
||||||
def temp_remap_cb(filepath, level):
|
def temp_remap_cb(filepath, level):
|
||||||
@@ -57,7 +57,7 @@ def blendfile_remap(blendfile_src, blendpath_dst, path_remap):
|
|||||||
# path_src_orig - original path from JSON.
|
# path_src_orig - original path from JSON.
|
||||||
|
|
||||||
path_dst_final = fp.filepath.decode('utf-8')
|
path_dst_final = fp.filepath.decode('utf-8')
|
||||||
path_src_orig = path_remap.get(path_dst_final)
|
path_src_orig = deps_remap.get(path_dst_final)
|
||||||
if path_src_orig is not None:
|
if path_src_orig is not None:
|
||||||
fp.filepath = path_src_orig.encode('utf-8')
|
fp.filepath = path_src_orig.encode('utf-8')
|
||||||
if VERBOSE:
|
if VERBOSE:
|
||||||
@@ -100,7 +100,7 @@ def create_argparse():
|
|||||||
"-o", "--output", dest="path_dst", metavar='DIR', required=True,
|
"-o", "--output", dest="path_dst", metavar='DIR', required=True,
|
||||||
help="Output directory ")
|
help="Output directory ")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-r", "--remap", dest="path_remap", metavar='JSON', required=True,
|
"-r", "--deps_remap", dest="deps_remap", metavar='JSON', required=True,
|
||||||
help="JSON file containing the path remapping info")
|
help="JSON file containing the path remapping info")
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
@@ -115,7 +115,7 @@ def main():
|
|||||||
|
|
||||||
encoding = sys.getfilesystemencoding()
|
encoding = sys.getfilesystemencoding()
|
||||||
|
|
||||||
with open(args.path_remap, 'r', encoding='utf-8') as f:
|
with open(args.deps_remap, 'r', encoding='utf-8') as f:
|
||||||
pathmap = json.load(f)
|
pathmap = json.load(f)
|
||||||
|
|
||||||
pack_restore(
|
pack_restore(
|
||||||
|
Reference in New Issue
Block a user