diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2017-04-12 12:13:41 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2017-04-12 12:14:41 +0300 |
commit | e50b06dde8eba0c7118c87aef4c4811d206f219a (patch) | |
tree | a1e0accffde1d21ae88fdcdee3808194831f6507 /io_blend_utils | |
parent | 9e60a71da21e04d44466556f52b0db3bd93b0424 (diff) |
io_blend_utils: Upgraded BAM from 1.1.3 → 1.1.4
Not only updated the wheel, but also updated the py files that originate
from the BAM Git repository.
Diffstat (limited to 'io_blend_utils')
-rw-r--r-- | io_blend_utils/blend/blendfile.py | 13 | ||||
-rw-r--r-- | io_blend_utils/blend/blendfile_path_walker.py | 49 | ||||
-rw-r--r-- | io_blend_utils/blender_bam-1.1.4-py3-none-any.whl (renamed from io_blend_utils/blender_bam-1.1.3-py3-none-any.whl) | bin | 49194 -> 49430 bytes | |||
-rw-r--r-- | io_blend_utils/utils/system.py | 38 |
4 files changed, 77 insertions, 23 deletions
diff --git a/io_blend_utils/blend/blendfile.py b/io_blend_utils/blend/blendfile.py index c7a83c38..e471beae 100644 --- a/io_blend_utils/blend/blendfile.py +++ b/io_blend_utils/blend/blendfile.py @@ -30,6 +30,10 @@ log = logging.getLogger("blendfile") FILE_BUFFER_SIZE = 1024 * 1024 +class BlendFileError(Exception): + """Raised when there was an error reading/parsing a blend file.""" + + # ----------------------------------------------------------------------------- # module global routines # @@ -73,9 +77,9 @@ def open_blend(filename, access="rb"): bfile.filepath_orig = filename return bfile else: - raise Exception("filetype inside gzip not a blend") + raise BlendFileError("filetype inside gzip not a blend") else: - raise Exception("filetype not a blend or a gzip blend") + raise BlendFileError("filetype not a blend or a gzip blend") def pad_up_4(offset): @@ -143,11 +147,14 @@ class BlendFile: self.blocks.append(block) if not self.structs: - raise Exception("No DNA1 block in file, this is not a valid .blend file!") + raise BlendFileError("No DNA1 block in file, this is not a valid .blend file!") # cache (could lazy init, incase we never use?) self.block_from_offset = {block.addr_old: block for block in self.blocks if block.code != b'ENDB'} + def __repr__(self): + return '<%s %r>' % (self.__class__.__qualname__, self.handle) + def __enter__(self): return self diff --git a/io_blend_utils/blend/blendfile_path_walker.py b/io_blend_utils/blend/blendfile_path_walker.py index f9005520..1c7b0270 100644 --- a/io_blend_utils/blend/blendfile_path_walker.py +++ b/io_blend_utils/blend/blendfile_path_walker.py @@ -19,11 +19,16 @@ # ***** END GPL LICENCE BLOCK ***** import os +import logging + +from . import blendfile + # gives problems with scripts that use stdout, for testing 'bam deps' for eg. -VERBOSE = False # os.environ.get('BAM_VERBOSE', False) +DEBUG = False +VERBOSE = DEBUG or False # os.environ.get('BAM_VERBOSE', False) TIMEIT = False -USE_ALEMBIC_BRANCH = False +USE_ALEMBIC_BRANCH = True class C_defs: @@ -61,17 +66,18 @@ class C_defs: if USE_ALEMBIC_BRANCH: CACHE_LIBRARY_SOURCE_CACHE = 1 +log_deps = logging.getLogger("path_walker") +log_deps.setLevel({ + (True, True): logging.DEBUG, + (False, True): logging.INFO, + (False, False): logging.WARNING +}[DEBUG, VERBOSE]) if VERBOSE: - import logging - log_deps = logging.getLogger("path_walker") - del logging - def set_as_str(s): if s is None: return "None" - else: - return (", ".join(sorted(i.decode('ascii') for i in sorted(s)))) + return ", ".join(sorted(str(i) for i in s)) class FPElem: @@ -256,14 +262,15 @@ class FilePath: filepath = os.path.abspath(filepath) - if VERBOSE: - indent_str = " " * level - # print(indent_str + "Opening:", filepath) - # print(indent_str + "... blocks:", block_codes) + indent_str = " " * level + # print(indent_str + "Opening:", filepath) + # print(indent_str + "... blocks:", block_codes) - log_deps.info("~") - log_deps.info("%s%s" % (indent_str, filepath.decode('utf-8'))) - log_deps.info("%s%s" % (indent_str, set_as_str(block_codes))) + log = log_deps.getChild('visit_from_blend') + log.info("~") + log.info("%sOpening: %s", indent_str, filepath) + if VERBOSE: + log.info("%s blocks: %s", indent_str, set_as_str(block_codes)) blendfile_level_cb_enter, blendfile_level_cb_exit = blendfile_level_cb @@ -395,7 +402,6 @@ class FilePath: # store info to pass along with each iteration extra_info = rootdir, os.path.basename(filepath) - from . import blendfile with blendfile.open_blend(filepath_tmp, "rb" if readonly else "r+b") as blend: for code in blend.code_index.keys(): @@ -421,7 +427,7 @@ class FilePath: # print("A:", expand_addr_visit) # print("B:", block_codes) if VERBOSE: - log_deps.info("%s%s" % (indent_str, set_as_str(expand_addr_visit))) + log.info("%s expand_addr_visit=%s", indent_str, set_as_str(expand_addr_visit)) if recursive: @@ -508,11 +514,13 @@ class FilePath: # (no expanding or following references) @staticmethod - def from_block(block, basedir, extra_info, level): + def from_block(block: blendfile.BlendFileBlock, basedir, extra_info, level): assert(block.code != b'DATA') fn = FilePath._from_block_dict.get(block.code) - if fn is not None: - yield from fn(block, basedir, extra_info, level) + if fn is None: + return + + yield from fn(block, basedir, extra_info, level) @staticmethod def _from_block_OB(block, basedir, extra_info, level): @@ -811,6 +819,7 @@ class ExpandID: yield block.get_pointer(b'dup_group') elif block_ren_as == C_defs.PART_DRAW_OB: yield block.get_pointer(b'dup_ob') + yield from ExpandID._expand_generic_mtex(block) @staticmethod def expand_SC(block): # 'Scene' diff --git a/io_blend_utils/blender_bam-1.1.3-py3-none-any.whl b/io_blend_utils/blender_bam-1.1.4-py3-none-any.whl Binary files differindex 31150941..7535f822 100644 --- a/io_blend_utils/blender_bam-1.1.3-py3-none-any.whl +++ b/io_blend_utils/blender_bam-1.1.4-py3-none-any.whl diff --git a/io_blend_utils/utils/system.py b/io_blend_utils/utils/system.py index 970a6464..313173ee 100644 --- a/io_blend_utils/utils/system.py +++ b/io_blend_utils/utils/system.py @@ -72,6 +72,29 @@ def uuid_from_file(fn, block_size=1 << 20): return hex(size)[2:] + sha1.hexdigest() +def write_json_to_zip(zip_handle, path, data=None): + import json + zip_handle.writestr( + path, + json.dumps( + data, + check_circular=False, + # optional (pretty) + sort_keys=True, indent=4, separators=(',', ': '), + ).encode('utf-8')) + + +def write_json_to_file(path, data): + import json + with open(path, 'w') as file_handle: + json.dump( + data, file_handle, ensure_ascii=False, + check_circular=False, + # optional (pretty) + sort_keys=True, indent=4, separators=(',', ': '), + ) + + def is_compressed_filetype(filepath): """ Use to check if we should compress files in a zip. @@ -103,3 +126,18 @@ def is_compressed_filetype(filepath): # '.zip', } + +def is_subdir(path, directory): + """ + Returns true if *path* in a subdirectory of *directory*. + """ + import os + from os.path import normpath, normcase, sep + path = normpath(normcase(path)) + directory = normpath(normcase(directory)) + if len(path) > len(directory): + sep = sep.encode('ascii') if isinstance(directory, bytes) else sep + if path.startswith(directory.rstrip(sep) + sep): + return True + return False + |