[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