[Bf-blender-cvs] [7454f83cca3] asset-engine: Working basic repository list.
Bastien Montagne
noreply at git.blender.org
Mon Sep 11 16:21:47 CEST 2017
Commit: 7454f83cca3c715c0f0ca121e9c878414a36c2a8
Author: Bastien Montagne
Date: Mon Sep 11 16:20:37 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB7454f83cca3c715c0f0ca121e9c878414a36c2a8
Working basic repository list.
Also, fixed uuids generation.
And finalized/added to UI operator to add a new, empty Amber repo in
current directory.
===================================================================
M release/scripts/startup/bl_operators/amber/engine.py
M release/scripts/startup/bl_operators/amber/operators.py
M release/scripts/startup/bl_operators/amber/repository.py
M release/scripts/startup/bl_operators/amber/ui.py
M release/scripts/startup/bl_operators/amber/utils.py
===================================================================
diff --git a/release/scripts/startup/bl_operators/amber/engine.py b/release/scripts/startup/bl_operators/amber/engine.py
index 8872a81b7fb..ec2715d374b 100644
--- a/release/scripts/startup/bl_operators/amber/engine.py
+++ b/release/scripts/startup/bl_operators/amber/engine.py
@@ -392,6 +392,7 @@ class AssetEngineAmber(AssetEngine):
if self.repositories.repositories.get(uuid_repo, (None, None))[1] != self.root:
self.repositories.repositories[uuid_repo] = (self.repository.name, self.root) # XXX Not resistant to uuids collisions (use a set instead)...
self.repositories.save()
+ self.repositories.to_pg(self.repositories_pg)
self.repos[uuid_repo] = self.repo
entries.nbr_entries = len(self.repository.assets) + 1 # Don't forget the 'up' entry!
else:
diff --git a/release/scripts/startup/bl_operators/amber/operators.py b/release/scripts/startup/bl_operators/amber/operators.py
index 9201213dbae..6a3f3ee0b3d 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -41,6 +41,7 @@ from . import (repository, utils)
from .repository import (
AmberDataRepository,
+ AmberDataRepositoryList,
)
@@ -74,8 +75,13 @@ class AmberOpsRepositoryAdd(Operator, AmberOpsEditing):
def execute(self, context):
ae = context.space_data.asset_engine
+ path = context.space_data.params.directory
+
if getattr(ae, "repo", None) is not None:
- self.report({'INFO'}, "Current directory is already an Amber repository, '%s'" % ae.repository.name)
+ self.report({'INFO'}, "Current directory is already an Amber repository, '%s'" % ae.repo.name)
+ return {'CANCELLED'}
+ if os.path.exists(os.path.join(path, utils.AMBER_DB_NAME)):
+ self.report({'INFO'}, "Current directory is already an Amber repository")
return {'CANCELLED'}
repository = getattr(ae, "repository", None)
@@ -83,7 +89,9 @@ class AmberOpsRepositoryAdd(Operator, AmberOpsEditing):
repository = ae.repository = AmberDataRepository()
repository.clear()
- repository.path = context.space_data.params.directory
+ repository.path = path
+ repository.name = "Amber " + os.path.split(repository.path)[0].split(os.path.sep)[-1]
+ repository.uuid = utils.uuid_repo_gen(set(AmberDataRepositoryList().repositories), repository.path, repository.name)
# TODO more default settings, probably default set of basic tags...
diff --git a/release/scripts/startup/bl_operators/amber/repository.py b/release/scripts/startup/bl_operators/amber/repository.py
index b1c32ee6fed..73d51d99510 100644
--- a/release/scripts/startup/bl_operators/amber/repository.py
+++ b/release/scripts/startup/bl_operators/amber/repository.py
@@ -537,8 +537,17 @@ class AmberDataRepository:
class AmberDataRepositoryListItemPG(PropertyGroup):
+ def repository_update(self, context):
+ space = context.space_data
+ if space and space.type == 'FILE_BROWSER':
+ ae = space.asset_engine
+ if ae and space.asset_engine_type == "AssetEngineAmber":
+ repos = AmberDataRepositoryList()
+ repos.from_pg(ae.repositories_pg)
+ repos.save()
+
uuid = IntVectorProperty(name="UUID", description="Repository unique identifier", size=4)
- name = StringProperty(name="Name")
+ name = StringProperty(name="Name", update=repository_update)
path = StringProperty(name="Path", description="Path to this Amber repository", subtype='DIR_PATH')
is_valid = BoolProperty(name="Is Valid")
@@ -581,7 +590,7 @@ class AmberDataRepositoryList:
self.repositories = {utils.uuid_unpack(uuid): name_path for uuid, name_path in json.load(ar_f).items()}
def save(self):
- ar = {utils.uuid_pack(uuid).decode(): name_path for uuid, name_path in self.repositories.items()}
+ ar = {utils.uuid_pack(uuid): name_path for uuid, name_path in self.repositories.items()}
with open(self.path, 'w') as ar_f:
json.dump(ar, ar_f)
@@ -605,6 +614,9 @@ class AmberDataRepositoryList:
for idx in range(len(pg.repositories), len(self.repositories), -1):
pg.repositories.remove(idx - 1)
+ def from_pg(self, pg):
+ self.repositories = {pg_item.uuid[:]: (pg_item.name, pg_item.path) for pg_item in pg.repositories}
+
classes = (
AmberDataTagPG,
diff --git a/release/scripts/startup/bl_operators/amber/ui.py b/release/scripts/startup/bl_operators/amber/ui.py
index 4cb3ba5e432..5d0f1c7b342 100644
--- a/release/scripts/startup/bl_operators/amber/ui.py
+++ b/release/scripts/startup/bl_operators/amber/ui.py
@@ -62,9 +62,13 @@ class AMBER_PT_repositories(Panel, AmberPanel):
def draw(self, context):
ae = context.space_data.asset_engine
- self.layout.template_list("FILEBROWSER_UL_dir", "amber_repositories",
- ae.repositories_pg, "repositories", ae.repositories_pg, "repository_index_active",
- item_dyntip_propname="path")
+ row = self.layout.row()
+ row.template_list("FILEBROWSER_UL_dir", "amber_repositories",
+ ae.repositories_pg, "repositories", ae.repositories_pg, "repository_index_active",
+ item_dyntip_propname="path")
+
+ col = row.column()
+ col.operator("AMBER_OT_repository_add", text="", icon='ZOOMIN')
class AMBER_UL_tags_filter(UIList):
diff --git a/release/scripts/startup/bl_operators/amber/utils.py b/release/scripts/startup/bl_operators/amber/utils.py
index 060e2fb6543..12155500a69 100644
--- a/release/scripts/startup/bl_operators/amber/utils.py
+++ b/release/scripts/startup/bl_operators/amber/utils.py
@@ -45,43 +45,55 @@ AMBER_LIST_FILENAME = "amber_repos.json"
# Doubt this will be practical issue though.
# * We keep eight first bytes of 'clear' identifier, to (try to) keep some readable uuid.
-def _uuid_gen_single(used_uuids, uuid_root, h, str_arg):
+def _uuid_gen_single(used_uuids, pattern, uuid_root, h, str_arg):
h.update(str_arg.encode())
- uuid = uuid_root + h.digest()
- uuid = uuid[:23].replace(b'\0', b'\1') # No null chars, RNA 'bytes' use them as in regular strings... :/
+ hd = h.digest()
+ hd = hd[:32 - len(uuid_root)]
+ uuid_bytes = uuid_root + hd
+ assert(len(uuid_bytes) == 16)
+ uuid = uuid_unpack_bytes(uuid_bytes)
+ if pattern is not (0, 1, 2, 3):
+ uuid = tuple(0 if idx is ... else uuid[idx] for idx in pattern)
if uuid not in used_uuids: # *Very* likely, but...
used_uuids.add(uuid)
return uuid
return None
-def _uuid_gen(used_uuids, uuid_root, bytes_seed, *str_args):
+def _uuid_gen(used_uuids, pattern=(0, 1, 2, 3), uuid_root=b"", bytes_seed=b"", *str_args):
h = hashlib.md5(bytes_seed)
for arg in str_args:
- uuid = _uuid_gen_single(used_uuids, uuid_root, h, arg)
+ uuid = _uuid_gen_single(used_uuids, pattern, uuid_root, h, arg)
if uuid is not None:
return uuid
# This is a fallback in case we'd get a collision... Should never be needed in real life!
for i in range(100000):
- uuid = _uuid_gen_single(used_uuids, uuid_root, h, i.to_bytes(4, 'little'))
+ uuid = _uuid_gen_single(used_uuids, pattern, uuid_root, h, str(i))
if uuid is not None:
return uuid
return None # If this happens...
-def uuid_asset_gen(used_uuids, path_db, name, tags):
- uuid_root = name.encode()[:8] + b'|'
- return _uuid_gen_single(used_uuids, uuid_root, path_db.encode(), name, *tags)
+def uuid_repo_gen(used_uuids, path, name):
+ uuid = _uuid_gen(used_uuids, (0, 1, ..., ...), b"", name.encode(), path)
+ assert(uuid is not None)
+ return uuid
+
+
+def uuid_asset_gen(used_uuids, path, name, tags):
+ uuid = _uuid_gen(used_uuids, (..., ..., 0, 1), b"", name.encode(), path, *tags)
+ assert(uuid is not None)
+ return uuid
def uuid_variant_gen(used_uuids, asset_uuid, name):
uuid_root = name.encode()[:8] + b'|'
- return _uuid_gen_single(used_uuids, uuid_root, asset_uuid, name)
+ return _uuid_gen(used_uuids, (0, 1, 2, 3), uuid_root, str(asset_uuid), name)
def uuid_revision_gen(used_uuids, variant_uuid, number, size, time):
uuid_root = str(number).encode() + b'|'
- return _uuid_gen_single(used_uuids, uuid_root, variant_uuid, str(number), str(size), str(timestamp))
+ return _uuid_gen(used_uuids, (0, 1, 2, 3), uuid_root, str(variant_uuid), str(number), str(size), str(timestamp))
def uuid_unpack_bytes(uuid_bytes):
More information about the Bf-blender-cvs
mailing list