[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