[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