[Bf-blender-cvs] [52db103] asset-engine: WIP better/fixed support of uuid's in asset engines.
Bastien Montagne
noreply at git.blender.org
Tue Apr 14 22:50:23 CEST 2015
Commit: 52db10355b18750f496aae2cf0d6120282bdc100
Author: Bastien Montagne
Date: Tue Apr 14 22:49:28 2015 +0200
Branches: asset-engine
https://developer.blender.org/rB52db10355b18750f496aae2cf0d6120282bdc100
WIP better/fixed support of uuid's in asset engines.
Still not working as expected it seems... Not having a real bytes type in RNA is a real PITA. :/
===================================================================
M release/scripts/startup/bl_operators/amber.py
M source/blender/blenkernel/BKE_asset.h
M source/blender/editors/space_file/filelist.c
M source/blender/makesdna/DNA_space_types.h
M source/blender/makesrna/intern/rna_asset.c
===================================================================
diff --git a/release/scripts/startup/bl_operators/amber.py b/release/scripts/startup/bl_operators/amber.py
index 0955e67..9ddcfc7 100644
--- a/release/scripts/startup/bl_operators/amber.py
+++ b/release/scripts/startup/bl_operators/amber.py
@@ -38,6 +38,7 @@ import hashlib
import json
import os
import stat
+import struct
import time
AMBER_DB_NAME = "__amber_db.json"
@@ -116,6 +117,26 @@ class AmberJobList(AmberJob):
repo = None
else:
repo = None
+ if repo is not None:
+ # Convert hexa string to array of four uint32...
+ # XXX will have to check endianess mess here, for now always use same one ('network' one).
+ new_entries = {}
+ for euuid, e in repo["entries"].items():
+ new_variants = {}
+ for vuuid, v in e["variants"].items():
+ new_revisions = {}
+ for ruuid, r in v["revisions"].items():
+ new_revisions[struct.unpack("!iiii", binascii.unhexlify(ruuid).ljust(16, b'\0'))] = r
+ new_variants[struct.unpack("!iiii", binascii.unhexlify(vuuid).ljust(16, b'\0'))] = v
+ v["revisions"] = new_revisions
+ ruuid = v["revision_default"]
+ v["revision_default"] = struct.unpack("!iiii", binascii.unhexlify(ruuid).ljust(16, b'\0'))
+ new_entries[struct.unpack("!iiii", binascii.unhexlify(euuid).ljust(16, b'\0'))] = e
+ e["variants"] = new_variants
+ vuuid = e["variant_default"]
+ e["variant_default"] = struct.unpack("!iiii", binascii.unhexlify(vuuid).ljust(16, b'\0'))
+ repo["entries"] = new_entries
+ print(repo)
return repo
@staticmethod
@@ -143,7 +164,7 @@ class AmberJobList(AmberJob):
self.ls_task = self.executor.submit(self.ls, self.root)
self.status = {'VALID', 'RUNNING'}
- def update(self, repository, dirs, uuids):
+ def update(self, repository, dirs):
self.status = {'VALID', 'RUNNING'}
if self.ls_task is not None:
if not self.ls_task.done():
@@ -165,7 +186,8 @@ class AmberJobList(AmberJob):
self.nbr += 1
if is_dir:
# We only list dirs from real file system.
- dirs.append((path, size, timestamp, path.encode()[:8] + b"|" + bytes(self.nbr)))
+ uuid = (path.encode()[:8] + b"|" + bytes([self.nbr])).ljust(16, b'\0')
+ dirs.append((path, size, timestamp, uuid))
done.add(tsk)
self.stat_tasks -= done
@@ -229,7 +251,6 @@ class AssetEngineAmber(AssetEngine):
def reset(self):
print("Amber Reset!")
self.root = ""
- self.uuids = {}
self.repo = {}
self.dirs = []
self.tags_source = []
@@ -269,7 +290,7 @@ class AssetEngineAmber(AssetEngine):
self.jobs[job_id] = AmberJobList(self.executor, job_id, entries.root_path)
self.root = entries.root_path
else:
- job.update(self.repo, self.dirs, self.uuids)
+ job.update(self.repo, self.dirs)
elif self.root != entries.root_path:
self.reset()
job_id = self.job_uuid
@@ -286,23 +307,23 @@ class AssetEngineAmber(AssetEngine):
def load_pre(self, uuids, entries):
# Not quite sure this engine will need it in the end, but for sake of testing...
- root_path = None
- for uuid in uuids.uuids:
- root, file_type, blen_type, vuuids = self.uuids[uuid.uuid_asset]
- var, ruuids = vuuids[uuid.uuid_variant]
- path_archive, path = ruuids[uuid.uuid_revision]
- if root_path is None:
- root_path = root
- elif root_path != root:
- print("ERROR!!! mismatch in root paths for a same set of data, shall *never* happen (%s vs %s)" % (root_path, root))
- entry = entries.entries.add()
- entry.type = file_type
- entry.blender_type = blen_type
- # archive part not yet implemented!
- entry.relpath = path
- if root_path is not None:
- entries.root_path = root_path
- return True
+ if self.repo:
+ for uuid in uuids.uuids:
+ euuid = tuple(uuid.uuid_asset)
+ vuuid = tuple(uuid.uuid_variant)
+ ruuid = tuple(uuid.uuid_revision)
+ e = self.repo["entries"][euuid]
+ v = e["variants"][vuuid]
+ r = v["revisions"][ruuid]
+
+ entry = entries.entries.add()
+ entry.type = {e["file_type"]}
+ entry.blender_type = e["blen_type"]
+ # archive part not yet implemented!
+ entry.relpath = r["path"]
+ entries.root_path = self.root
+ return True
+ return False
def sort_filter(self, use_sort, use_filter, filter_glob, filter_search, entries):
if use_filter:
@@ -326,44 +347,67 @@ class AssetEngineAmber(AssetEngine):
return True
return False
+ def entry_from_uuid(self, entries, euuid, vuuid, ruuid):
+ e = self.repo["entries"][euuid]
+ entry = entries.entries.add()
+ entry.uuid = euuid
+ entry.name = e["name"]
+ entry.description = e["description"]
+ entry.type = {e["file_type"]}
+ entry.blender_type = e["blen_type"]
+ act_rev = None
+ if vuuid == (0, 0, 0, 0):
+ for vuuid, v in e["variants"].items():
+ variant = entry.variants.add()
+ variant.uuid = vuuid
+ variant.name = v["name"]
+ variant.description = v["description"]
+ if vuuid == e["variant_default"]:
+ entry.variants.active = variant
+ for ruuid, r in v["revisions"].items():
+ revision = variant.revisions.add()
+ revision.uuid = ruuid
+ #~ revision.comment = r["comment"]
+ revision.size = r["size"]
+ revision.timestamp = r["timestamp"]
+ if ruuid == v["revision_default"]:
+ variant.revisions.active = revision
+ if vuuid == e["variant_default"]:
+ act_rev = r
+ else:
+ v = e["variants"][vuuid]
+ variant = entry.variants.add()
+ variant.uuid = vuuid
+ variant.name = v["name"]
+ variant.description = v["description"]
+ entry.variants.active = variant
+ if ruuid == (0, 0, 0, 0):
+ for ruuid, r in v["revisions"].items():
+ revision = variant.revisions.add()
+ revision.uuid = ruuid
+ #~ revision.comment = r["comment"]
+ revision.size = r["size"]
+ revision.timestamp = r["timestamp"]
+ if ruuid == v["revision_default"]:
+ variant.revisions.active = revision
+ act_rev = r
+ else:
+ r = v["revisions"][ruuid]
+ revision = variant.revisions.add()
+ revision.uuid = ruuid
+ #~ revision.comment = r["comment"]
+ revision.size = r["size"]
+ revision.timestamp = r["timestamp"]
+ variant.revisions.active = revision
+ act_rev = r
+ if act_rev:
+ entry.relpath = act_rev["path"]
+
def entries_block_get(self, start_index, end_index, entries):
if self.repo:
print("self repo", len(self.sortedfiltered), start_index, end_index)
for _n, euuid, e in self.sortedfiltered[start_index:end_index]:
- uuid = binascii.unhexlify(euuid)
- entry = entries.entries.add()
- entry.uuid = uuid
- entry.name = e["name"]
- entry.description = e["description"]
- entry.type = {e["file_type"]}
- entry.blender_type = e["blen_type"]
- vuuids = {}
- self.uuids[entry.uuid] = (self.root, entry.type, entry.blender_type, vuuids)
- act_rev = None
- for vuuid, v in e["variants"].items():
- variant_uuid = binascii.unhexlify(vuuid)
- variant = entry.variants.add()
- variant.uuid = variant_uuid
- variant.name = v["name"]
- variant.description = v["description"]
- ruuids = {}
- vuuids[variant_uuid] = (variant, ruuids) # Not really needed, but for sake of consistency...
- if vuuid == e["variant_default"]:
- entry.variants.active = variant
- for ruuid, r in v["revisions"].items():
- revision_uuid = binascii.unhexlify(ruuid)
- revision = variant.revisions.add()
- revision.uuid = revision_uuid
- #~ revision.comment = r["comment"]
- revision.size = r["size"]
- revision.timestamp = r["timestamp"]
- ruuids[revision_uuid] = (r["path_archive"], r["path"])
- if ruuid == v["revision_default"]:
- variant.revisions.active = revision
- if vuuid == e["variant_default"]:
- act_rev = r
- if act_rev:
- entry.relpath = act_rev["path"]
+ self.entry_from_uuid(entries, euuid, (0, 0, 0, 0), (0, 0, 0, 0))
else:
print("self dirs", len(self.sortedfiltered), start_index, end_index)
for path, size, timestamp, uuid in self.sortedfiltered[start_index:end_index]:
@@ -379,6 +423,13 @@ class AssetEngineAmber(AssetEngine):
variant.revisions.active = rev
r
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list