[Bf-blender-cvs] [8bc8015] asset-engine: WIP Amber: very quick, dirty, primitive and broken first implementation of tags handling.
Bastien Montagne
noreply at git.blender.org
Sat Mar 21 16:49:14 CET 2015
Commit: 8bc80156577ebd9e1104a0f4dd3b4c10f3821394
Author: Bastien Montagne
Date: Tue Mar 17 21:37:58 2015 +0100
Branches: asset-engine
https://developer.blender.org/rB8bc80156577ebd9e1104a0f4dd3b4c10f3821394
WIP Amber: very quick, dirty, primitive and broken first implementation of tags handling.
We cannot do that correctly with current listdir system, have to rework again
in asset-experiments brnach first, so that listing, filtering and sorting is
completely "delocalized" to asset engine (will also try to solve scalability issues).
===================================================================
M release/scripts/startup/bl_operators/amber.py
===================================================================
diff --git a/release/scripts/startup/bl_operators/amber.py b/release/scripts/startup/bl_operators/amber.py
index a80307c..897dc81 100644
--- a/release/scripts/startup/bl_operators/amber.py
+++ b/release/scripts/startup/bl_operators/amber.py
@@ -143,7 +143,7 @@ class AmberJobList(AmberJob):
self.ls_task = self.executor.submit(self.ls, self.root)
self.status = {'VALID', 'RUNNING'}
- def update(self, entries, uuids):
+ def update(self, repository, dirs, uuids):
self.status = {'VALID', 'RUNNING'}
if self.ls_task is not None:
if not self.ls_task.done():
@@ -151,8 +151,10 @@ class AmberJobList(AmberJob):
paths, repo = self.ls_task.result()
self.ls_task = None
self.tot = len(paths)
+ repository.clear()
+ dirs.clear()
if repo is not None:
- self.repo = repo
+ repository.update(repo)
for p in paths:
self.stat_tasks.add(self.executor.submit(self.stat, self.root, p))
@@ -163,73 +165,10 @@ class AmberJobList(AmberJob):
self.nbr += 1
if is_dir:
# We only list dirs from real file system.
- entry = entries.entries.add()
- entry.type = {'DIR'}
- entry.relpath = path
- entry.uuid = entry.relpath.encode()[:8] + b"|" + bytes(self.nbr)
- uuids[entry.uuid] = self.root + path
- variant = entry.variants.add()
- entry.variants.active = variant
- rev = variant.revisions.add()
- rev.size = size
- rev.timestamp = timestamp
- variant.revisions.active = rev
+ dirs.append((path, size, timestamp, path.encode()[:8] + b"|" + bytes(self.nbr)))
done.add(tsk)
self.stat_tasks -= done
- if self.repo is not None:
- existing = {}
- for e in entries.entries:
- vd = {}
- existing[e.uuid] = (e, vd)
- for v in e.variants:
- rd = {}
- vd[v.uuid] = (v, rd)
- for r in v.revisions:
- rd[r.uuid] = r
- for euuid, e in self.repo["entries"].items():
- entry_uuid = binascii.unhexlify(euuid)
- entry, existing_vuuids = existing.get(entry_uuid, (None, {}))
- if entry is None:
- entry = entries.entries.add()
- entry.uuid = entry_uuid
- entry.name = e["name"]
- entry.description = e["description"]
- entry.type = {e["file_type"]}
- entry.blender_type = e["blen_type"]
- existing[entry_uuid] = (entry, existing_vuuids) # Not really needed, but for sake of consistency...
- vuuids = {}
- 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, existing_ruuids = existing_vuuids.get(variant_uuid, (None, {}))
- if variant is None:
- variant = entry.variants.add()
- variant.uuid = variant_uuid
- variant.name = v["name"]
- variant.description = v["description"]
- existing_vuuids[variant_uuid] = (variant, existing_ruuids) # Not really needed, but for sake of consistency...
- ruuids = vuuids[variant_uuid] = {}
- if vuuid == e["variant_default"]:
- entry.variants.active = variant
- for ruuid, r in v["revisions"].items():
- revision_uuid = binascii.unhexlify(ruuid)
- revision = existing_ruuids.get(revision_uuid, None)
- if revision is None:
- 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.progress = self.nbr / self.tot
if not self.stat_tasks and self.ls_task is None:
self.status = {'VALID'}
@@ -237,7 +176,6 @@ class AmberJobList(AmberJob):
def __init__(self, executor, job_id, root):
super().__init__(executor, job_id)
self.root = root
- self.repo = None
self.ls_task = None
self.stat_tasks = set()
@@ -263,10 +201,25 @@ class AssetEngineAmber(AssetEngine):
min=10, max=10000, default=1000,
)
+ # *Very* primitive! Only 32 tags allowed...
+ def _tags_gen(self, context):
+ tags = getattr(self, "tags_source", [])
+ return [(tag, tag, str(prio)) for tag, prio in tags[:32]]
+ tags = EnumProperty(
+ items=_tags_gen,
+ name="Tags",
+ description="Active tags",
+ options={'ENUM_FLAG'},
+ )
+
def __init__(self):
self.executor = futures.ThreadPoolExecutor(8) # Using threads for now, if issues arise we'll switch to process.
self.jobs = {}
+ self.root = ""
self.uuids = {}
+ self.repo = {}
+ self.dirs = []
+ self.tags_source = []
self.job_uuid = 1
@@ -276,6 +229,81 @@ class AssetEngineAmber(AssetEngine):
# Even though it does not seem to be an issue, this is not nice and shall be fixed somehow.
#~ self.executor.shutdown(wait=False)
+ def fill_entries(self, entries):
+ if entries.root_path != self.root:
+ entries.entries.clear()
+ self.root = entries.root_path
+
+ existing = {}
+ for e in entries.entries:
+ vd = {}
+ existing[e.uuid] = (e, vd)
+ for v in e.variants:
+ rd = {}
+ vd[v.uuid] = (v, rd)
+ for r in v.revisions:
+ rd[r.uuid] = r
+
+ for path, size, timestamp, entry_uuid in self.dirs:
+ if entry_uuid in existing:
+ continue
+ entry = entries.entries.add()
+ entry.type = {'DIR'}
+ entry.relpath = path
+ entry.uuid = entry_uuid
+ variant = entry.variants.add()
+ entry.variants.active = variant
+ rev = variant.revisions.add()
+ rev.size = size
+ rev.timestamp = timestamp
+ variant.revisions.active = rev
+
+ if self.repo:
+ for euuid, e in self.repo["entries"].items():
+ entry_uuid = binascii.unhexlify(euuid)
+ entry, existing_vuuids = existing.get(entry_uuid, (None, {}))
+ if entry is None:
+ entry = entries.entries.add()
+ entry.uuid = entry_uuid
+ entry.name = e["name"]
+ entry.description = e["description"]
+ entry.type = {e["file_type"]}
+ entry.blender_type = e["blen_type"]
+ existing[entry_uuid] = (entry, existing_vuuids) # Not really needed, but for sake of consistency...
+ 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, existing_ruuids = existing_vuuids.get(variant_uuid, (None, {}))
+ if variant is None:
+ variant = entry.variants.add()
+ variant.uuid = variant_uuid
+ variant.name = v["name"]
+ variant.description = v["description"]
+ existing_vuuids[variant_uuid] = (variant, existing_ruuids) # Not really needed, but for sake of consistency...
+ ruuids = vuuids[variant_uuid] = {}
+ if vuuid == e["variant_default"]:
+ entry.variants.active = variant
+ for ruuid, r in v["revisions"].items():
+ revision_uuid = binascii.unhexlify(ruuid)
+ revision = existing_ruuids.get(revision_uuid, None)
+ if revision is None:
+ 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.tags_source = sorted(self.repo["tags"].items(), key=lambda i: i[1], reverse=True)
+
+
def status(self, job_id):
if job_id:
job = self.jobs.get(job_id, None)
@@ -307,11 +335,12 @@ class AssetEngineAmber(AssetEngine):
if job.root != entries.root_path:
self.jobs[job_id] = AmberJobList(
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list