From 91ba02924f3079cab165bdde49107ba92b60136f Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 4 Apr 2016 13:48:08 +0200 Subject: [PATCH] compose: add cache for added files Signed-off-by: Giuseppe Scrivano Closes: #253 Approved by: cgwalters --- src/app/rpmostree-compose-builtin-tree.c | 45 ++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/app/rpmostree-compose-builtin-tree.c b/src/app/rpmostree-compose-builtin-tree.c index 80039fe6..5c3f5c8d 100644 --- a/src/app/rpmostree-compose-builtin-tree.c +++ b/src/app/rpmostree-compose-builtin-tree.c @@ -101,6 +101,8 @@ typedef struct { static gboolean compute_checksum_from_treefile_and_goal (RpmOstreeTreeComposeContext *self, HyGoal goal, + GFile *contextdir, + JsonArray *add_files, char **out_checksum, GError **error) { @@ -118,6 +120,43 @@ compute_checksum_from_treefile_and_goal (RpmOstreeTreeComposeContext *self, g_checksum_update (checksum, buf, len); } + if (add_files) + { + guint i, len = json_array_get_length (add_files); + for (i = 0; i < len; i++) + { + gs_unref_object GFile *srcfile = NULL; + const char *src, *dest; + JsonArray *add_el = json_array_get_array_element (add_files, i); + gs_unref_object GFile *child = NULL; + + if (!add_el) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Element in add-files is not an array"); + goto out; + } + src = _rpmostree_jsonutil_array_require_string_element (add_el, 0, error); + if (!src) + goto out; + + dest = _rpmostree_jsonutil_array_require_string_element (add_el, 1, error); + if (!dest) + goto out; + + srcfile = g_file_resolve_relative_path (contextdir, src); + + if (!_rpmostree_util_update_checksum_from_file (checksum, + srcfile, + NULL, + error)) + goto out; + + g_checksum_update (checksum, (const guint8 *) dest, strlen (dest)); + } + + } + /* FIXME; we should also hash the post script */ /* Hash in each package */ @@ -126,6 +165,7 @@ compute_checksum_from_treefile_and_goal (RpmOstreeTreeComposeContext *self, ret_checksum = g_strdup (g_checksum_get_string (checksum)); ret = TRUE; + out: gs_transfer_out_value (out_checksum, &ret_checksum); if (checksum) g_checksum_free (checksum); return ret; @@ -190,6 +230,7 @@ install_packages_in_root (RpmOstreeTreeComposeContext *self, gs_free char *ret_new_inputhash = NULL; g_autoptr(GKeyFile) treespec = g_key_file_new (); JsonArray *enable_repos = NULL; + JsonArray *add_files = NULL; /* TODO - uncomment this once we have SELinux working */ #if 0 @@ -268,8 +309,12 @@ install_packages_in_root (RpmOstreeTreeComposeContext *self, if (!rpmostree_context_prepare_install (ctx, &hifinstall, cancellable, error)) goto out; + if (json_object_has_member (treedata, "add-files")) + add_files = json_object_get_array_member (treedata, "add-files"); + /* FIXME - just do a depsolve here before we compute download requirements */ if (!compute_checksum_from_treefile_and_goal (self, hif_context_get_goal (hifctx), + contextdir, add_files, &ret_new_inputhash, error)) goto out;