[Bf-blender-cvs] [bc9fe321a17] asset-engine: Moar WIP work towards editing Amber repo.

Bastien Montagne noreply at git.blender.org
Thu Aug 24 20:56:44 CEST 2017


Commit: bc9fe321a174d9c75cd9b3a0cb70cc10a5c3c0b1
Author: Bastien Montagne
Date:   Thu Aug 24 20:55:45 2017 +0200
Branches: asset-engine
https://developer.blender.org/rBbc9fe321a174d9c75cd9b3a0cb70cc10a5c3c0b1

Moar WIP work towards editing Amber repo.

Adding skeleton for adding Amber repos, adding new assets... Not
finished yet, by far.

===================================================================

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/utils.py

===================================================================

diff --git a/release/scripts/startup/bl_operators/amber/engine.py b/release/scripts/startup/bl_operators/amber/engine.py
index 71e48d5fbdd..2cfca419ff8 100644
--- a/release/scripts/startup/bl_operators/amber/engine.py
+++ b/release/scripts/startup/bl_operators/amber/engine.py
@@ -45,6 +45,7 @@ from . import (repository, utils)
 from .repository import (
         AmberDataRepository,
         AmberDataRepositoryPG,
+        AmberDataRepositoryListPG,
         )
 
 
@@ -201,6 +202,7 @@ class AssetEngineAmber(AssetEngine):
     bl_version = (0 << 16) + (0 << 8) + 4  # Usual maj.min.rev version scheme...
 
     repository_pg = PointerProperty(name="Repository", type=AmberDataRepositoryPG, description="Current Amber repository")
+    repositories_pg = PointerProperty(name="Repositories", type=AmberDataRepositoryListPG, description="Known Amber repositories")
 
     def __init__(self):
         self.executor = futures.ThreadPoolExecutor(8)  # Using threads for now, if issues arise we'll switch to process.
@@ -382,8 +384,8 @@ class AssetEngineAmber(AssetEngine):
             self.repository.from_dict(self.repo, self.root)
             self.repository.to_pg(self.repository_pg)
             uuid_repo = tuple(self.repository.uuid)
-            if utils.amber_repos.get(uuid_repo, None) != self.root:
-                utils.amber_repos[uuid_repo] = self.root  # XXX Not resistant to uuids collisions (use a set instead)...
+            if utils.amber_repos.get(uuid_repo, (None, None))[1] != self.root:
+                utils.amber_repos[uuid_repo] = (self.repository.name, self.root)  # XXX Not resistant to uuids collisions (use a set instead)...
                 utils.save_amber_repos()
             self.repos[uuid_repo] = self.repo
             entries.nbr_entries = len(self.repository.assets)
@@ -399,7 +401,7 @@ class AssetEngineAmber(AssetEngine):
                   (self.pretty_version(uuids.asset_engine_version), self.pretty_version()))
         for uuid in uuids.uuids:
             repo_uuid = uuid.uuid_asset[:2] + (0, 0)
-            if repo_uuid not in utils.amber_repos or not os.path.exists(os.path.join(utils.amber_repos[repo_uuid], utils.AMBER_DB_NAME)):
+            if repo_uuid not in utils.amber_repos or not os.path.exists(os.path.join(utils.amber_repos[repo_uuid][1], utils.AMBER_DB_NAME)):
                 uuid.is_asset_missing = True
                 continue
             # Here in theory we'd reload given repo (async process) and check for asset's status...
@@ -428,8 +430,8 @@ class AssetEngineAmber(AssetEngine):
             assert(repo_uuid in utils.amber_repos)
             repo = self.repos.get(repo_uuid, None)
             if repo is None:
-                repo = self.repos[repo_uuid] = AmberDataRepository.ls_repo(os.path.join(utils.amber_repos[repo_uuid], utils.AMBER_DB_NAME))
-            self.repository.from_dict(repo, utils.amber_repos[repo_uuid])
+                repo = self.repos[repo_uuid] = AmberDataRepository.ls_repo(os.path.join(utils.amber_repos[repo_uuid][1], utils.AMBER_DB_NAME))
+            self.repository.from_dict(repo, utils.amber_repos[repo_uuid][1])
             euuid = uuid.uuid_asset[:]
             vuuid = uuid.uuid_variant[:]
             ruuid = uuid.uuid_revision[:]
@@ -441,7 +443,7 @@ class AssetEngineAmber(AssetEngine):
             entry.type = {e.file_type}
             entry.blender_type = e.blender_type
             # archive part not yet implemented!
-            entry.relpath = os.path.join(utils.amber_repos[repo_uuid], r.path)
+            entry.relpath = os.path.join(utils.amber_repos[repo_uuid][1], r.path)
 #                print("added entry for", entry.relpath)
             entry.uuid = e.uuid
             var = entry.variants.add()
diff --git a/release/scripts/startup/bl_operators/amber/operators.py b/release/scripts/startup/bl_operators/amber/operators.py
index cbc12381017..9201213dbae 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -66,6 +66,57 @@ class AmberOpsEditing(AmberOps):
         return False
 
 
+class AmberOpsRepositoryAdd(Operator, AmberOpsEditing):
+    """Create a new, empty Amber repository in current directory (WARNING! No undo!)"""
+    bl_idname = "amber.repository_add"
+    bl_label = "Add Repository"
+    bl_options = set()
+
+    def execute(self, context):
+        ae = context.space_data.asset_engine
+        if getattr(ae, "repo", None) is not None:
+            self.report({'INFO'}, "Current directory is already an Amber repository, '%s'" % ae.repository.name)
+            return {'CANCELLED'}
+
+        repository = getattr(ae, "repository", None)
+        if repository is None:
+            repository = ae.repository = AmberDataRepository()
+        repository.clear()
+
+        repository.path = context.space_data.params.directory
+
+        # TODO more default settings, probably default set of basic tags...
+
+        repository.to_pg(ae.repository_pg)
+        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+
+        bpy.ops.file.refresh()
+
+        return {'FINISHED'}
+
+
+class AmberOpsAssetAdd(Operator, AmberOpsEditing):
+    """Add an Amber asset to the repository (WARNING! No undo!)"""
+    bl_idname = "amber.asset_add"
+    bl_label = "Add Asset"
+    bl_options = set()
+
+    def execute(self, context):
+        ae = context.space_data.asset_engine
+        asset = ae.repository_pg.assets.add()
+
+        repository = getattr(ae, "repository", None)
+        if repository is None:
+            repository = ae.repository = AmberDataRepository()
+        repository.from_pg(ae.repository_pg)
+
+        repository.wrt_repo(os.path.join(ae.repository.path, utils.AMBER_DB_NAME), ae.repository.to_dict())
+
+        bpy.ops.file.refresh()
+
+        return {'FINISHED'}
+
+
 class AmberOpsAssetDelete(Operator, AmberOpsEditing):
     """Delete active Amber asset from the repository (WARNING! No undo!)"""
     bl_idname = "amber.asset_delete"
@@ -81,7 +132,7 @@ class AmberOpsAssetDelete(Operator, AmberOpsEditing):
             repository = ae.repository = AmberDataRepository()
         repository.from_pg(ae.repository_pg)
 
-        repository.wrt_repo(os.path.join(ae.repository.path, utils.AMBER_DB_NAME), ae.repository.to_dict())
+        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
 
         bpy.ops.file.refresh()
 
@@ -89,5 +140,6 @@ class AmberOpsAssetDelete(Operator, AmberOpsEditing):
 
 
 classes = (
+    AmberOpsRepositoryAdd,
     AmberOpsAssetDelete,
     )
diff --git a/release/scripts/startup/bl_operators/amber/repository.py b/release/scripts/startup/bl_operators/amber/repository.py
index 3691ffbfade..d20f637af05 100644
--- a/release/scripts/startup/bl_operators/amber/repository.py
+++ b/release/scripts/startup/bl_operators/amber/repository.py
@@ -527,10 +527,39 @@ class AmberDataRepository:
         AmberDataAsset.to_pg(pg.assets, self.assets, self.tags)
 
 
+class AmberDataRepositoryListPG(PropertyGroup):
+    def repositories_itemf(self, context):
+        if not hasattr(self, "repositories_items"):
+            self.repositories_items = [(utils.uuid_pack(uuid), name, path, idx) for idx, (uuid, (name, path)) in enumerate(utils.amber_repos.items())]
+        return self.repositories_items
+    def repositories_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":
+                uuid = utils.uuid_unpack(self.repositories)
+                space.params.directory = utils.amber_repos[uuid][1]
+    repositories = EnumProperty(items=repositories_itemf, update=repositories_update,
+                                name="Current Repository", description="Active Amber asset repository")
+
+
+class AmberDataRepositoryList:
+    """
+    Amber repository main class.
+
+    Note: Remember that in Amber, first 8 bytes of asset's UUID are same as first 8 bytes of repository UUID.
+          Repository UUID's last 8 bytes shall always be NULL.
+          This allows us to store repository identifier into all assets, and ensure we have uniqueness of
+          Amber assets UUIDs (which is mandatory from Blender point of view).
+    """
+    pass
+
+
 classes = (
     AmberDataTagPG,
     AmberDataAssetRevisionPG,
     AmberDataAssetVariantPG,
     AmberDataAssetPG,
     AmberDataRepositoryPG,
+    AmberDataRepositoryListPG,
 )
diff --git a/release/scripts/startup/bl_operators/amber/utils.py b/release/scripts/startup/bl_operators/amber/utils.py
index adb20cc25a6..b38a56d7cfa 100644
--- a/release/scripts/startup/bl_operators/amber/utils.py
+++ b/release/scripts/startup/bl_operators/amber/utils.py
@@ -101,11 +101,11 @@ if not os.path.exists(amber_repos_path):
     with open(amber_repos_path, 'w') as ar_f:
         json.dump({}, ar_f)
 with open(amber_repos_path, 'r') as ar_f:
-    amber_repos = {uuid_unpack(uuid): path for uuid, path in json.load(ar_f).items()}
+    amber_repos = {uuid_unpack(uuid): name_path for uuid, name_path in json.load(ar_f).items()}
 assert(amber_repos != None)
 
 
 def save_amber_repos():
-    ar = {uuid_pack(uuid).decode(): path for uuid, path in amber_repos.items()}
+    ar = {uuid_pack(uuid).decode(): name_path for uuid, name_path in amber_repos.items()}
     with open(amber_repos_path, 'w') as ar_f:
         json.dump(ar, ar_f)



More information about the Bf-blender-cvs mailing list