[gnome-ostree] build: Add a single JSON file caching build data



commit eee57ea465420cf171205541c55a107b8f8ea336
Author: Colin Walters <walters verbum org>
Date:   Tue Nov 20 18:40:51 2012 -0500

    build: Add a single JSON file caching build data
    
    This speeds up lookups for old builds significantly.

 src/ostbuild/pyostbuild/builtin_build.py |   45 ++++++++++++++++++++++-------
 1 files changed, 34 insertions(+), 11 deletions(-)
---
diff --git a/src/ostbuild/pyostbuild/builtin_build.py b/src/ostbuild/pyostbuild/builtin_build.py
index 504704f..91b2228 100755
--- a/src/ostbuild/pyostbuild/builtin_build.py
+++ b/src/ostbuild/pyostbuild/builtin_build.py
@@ -211,6 +211,15 @@ class OstbuildBuild(builtins.Builtin):
             result.append(csum.hexdigest())
         return result
 
+    def _save_component_build(self, buildname, expanded_component):
+        build_ref = 'components/%s' % (buildname, )
+        cachedata = dict(expanded_component)
+        cachedata['ostree'] = run_sync_get_output(['ostree', '--repo=' + self.repo,
+                                                   'rev-parse', build_ref])
+        self._component_build_cache[buildname] = cachedata
+        fileutil.write_json_file_atomic(self._component_build_cache_path, self._component_build_cache)
+        return cachedata['ostree']
+
     def _build_one_component(self, component, architecture):
         basename = component['name']
 
@@ -223,14 +232,18 @@ class OstbuildBuild(builtins.Builtin):
 
         skip_rebuild = self.args.compose_only
 
-        previous_build_version = run_sync_get_output(['ostree', '--repo=' + self.repo,
-                                                      'rev-parse', build_ref],
-                                                     stderr=open('/dev/null', 'w'),
-                                                     none_on_error=True)
-        previous_vcs_version = None
-        previous_metadata = None
-
-        if previous_build_version is not None:
+        previous_metadata = self._component_build_cache.get(buildname)
+        was_in_build_cache = (previous_metadata is not None)
+        if was_in_build_cache:
+            previous_build_version = previous_metadata['ostree']
+        else:
+            previous_build_version = run_sync_get_output(['ostree', '--repo=' + self.repo,
+                                                          'rev-parse', build_ref],
+                                                         stderr=open('/dev/null', 'w'),
+                                                         none_on_error=True)
+        if previous_metadata is not None:
+            previous_vcs_version = previous_metadata.get('revision')
+        elif previous_build_version is not None:
             previous_metadata_text = run_sync_get_output(['ostree', '--repo=' + self.repo,
                                                           'cat', previous_build_version,
                                                           '/_ostbuild-meta.json'])
@@ -240,6 +253,7 @@ class OstbuildBuild(builtins.Builtin):
             log("Previous build of %s is ostree:%s " % (buildname, previous_build_version))
         else:
             log("No previous build for '%s' found" % (buildname, ))
+            previous_vcs_version = None
             if skip_rebuild:
                 fatal("--compose-only specified but no previous build of %s found" % (buildname, ))
 
@@ -274,7 +288,9 @@ class OstbuildBuild(builtins.Builtin):
             rebuild_reason = self._needs_rebuild(previous_metadata, expanded_component)
             if rebuild_reason is None:
                 if not force_rebuild:
-                    log("Reusing cached build at %s" % (previous_vcs_version)) 
+                    log("Reusing cached build of %s at %s" % (buildname, previous_vcs_version)) 
+                    if not was_in_build_cache:
+                        return self._save_component_build(buildname, expanded_component)
                     return previous_build_version
                 else:
                     log("Build forced regardless") 
@@ -389,10 +405,11 @@ class OstbuildBuild(builtins.Builtin):
 
         shutil.rmtree(tmpdir)
 
+        ostree_revision = self._save_component_build(buildname, expanded_component)
+
         build_taskset.finish(True)
 
-        return run_sync_get_output(['ostree', '--repo=' + self.repo,
-                                    'rev-parse', build_ref])
+        return ostree_revision
 
     def _compose_one_target(self, target, component_build_revs):
         base = target['base']
@@ -612,6 +629,12 @@ and the manifest input."""
             for architecture in architectures:
                 components_to_build.append((component, architecture))
 
+        self._component_build_cache_path = os.path.join(self.workdir, 'component-builds.json')
+        if os.path.exists(self._component_build_cache_path):
+            self._component_build_cache = json.load(open(self._component_build_cache_path))
+        else:
+            self._component_build_cache = {}
+
         log("%d components to build" % (len(components_to_build), ))
         for (component, architecture) in components_to_build:
             archname = '%s/%s' % (component['name'], architecture)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]