summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-sysroot-upgrader.c
diff options
context:
space:
mode:
authorDaniel Drake <drake@endlessm.com>2017-05-15 12:13:38 -0600
committerAtomic Bot <atomic-devel@projectatomic.io>2017-05-22 20:18:07 +0000
commitc1ed9a15c1adb44ef30984f984c7ce199b88af03 (patch)
tree847c8bbbf1cf13012b97cc8f558a767f79c39ac7 /src/libostree/ostree-sysroot-upgrader.c
parentcd65f85dcbed6930eb5d3fdb344b173c4356da30 (diff)
downloadostree-c1ed9a15c1adb44ef30984f984c7ce199b88af03.tar.gz
Allow commits to mark refs as EOL, replaced by others
A commit can now include a "ostree.endoflife-rebase" metadata key pointing to a new ref. When updating, the sysroot upgrader will see this and proceed to pull and deploy the new ref instead. The origin file in the new deployment will point to the new ref. This functionality is planned to be used in Endless OS. We will create a lesser tested branch for brand new, cutting edge hardware support, and ship that on hardware platforms that require the latest drivers. However, once our slower-moving official release is later updated to support the new hardware, we will use this functionality to migrate those bleeding-edge users over to the official release. Closes: #874 Approved by: cgwalters
Diffstat (limited to 'src/libostree/ostree-sysroot-upgrader.c')
-rw-r--r--src/libostree/ostree-sysroot-upgrader.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/libostree/ostree-sysroot-upgrader.c b/src/libostree/ostree-sysroot-upgrader.c
index 9816b3d6..45ef90e6 100644
--- a/src/libostree/ostree-sysroot-upgrader.c
+++ b/src/libostree/ostree-sysroot-upgrader.c
@@ -512,6 +512,10 @@ ostree_sysroot_upgrader_pull_one_dir (OstreeSysrootUpgrader *self,
char *refs_to_fetch[] = { NULL, NULL };
const char *from_revision = NULL;
g_autofree char *origin_refspec = NULL;
+ g_autofree char *new_revision = NULL;
+ g_autoptr(GVariant) new_variant = NULL;
+ g_autoptr(GVariant) new_metadata = NULL;
+ g_autoptr(GVariant) rebase = NULL;
if (self->override_csum != NULL)
refs_to_fetch[0] = self->override_csum;
@@ -541,6 +545,48 @@ ostree_sysroot_upgrader_pull_one_dir (OstreeSysrootUpgrader *self,
ostree_async_progress_finish (progress);
}
+ /* Check to see if the commit marks the ref as EOL, redirecting to
+ * another. */
+ if (!ostree_repo_resolve_rev (repo, origin_refspec, FALSE,
+ &new_revision, error))
+ return FALSE;
+
+ if (!ostree_repo_load_variant (repo,
+ OSTREE_OBJECT_TYPE_COMMIT,
+ new_revision,
+ &new_variant,
+ error))
+ return FALSE;
+
+ g_variant_get_child (new_variant, 0, "@a{sv}", &new_metadata);
+ rebase = g_variant_lookup_value (new_metadata, "ostree.endoflife-rebase", G_VARIANT_TYPE_STRING);
+ if (rebase)
+ {
+ const char *new_ref = g_variant_get_string (rebase, 0);
+
+ /* Pull the new ref */
+ if (self->origin_remote &&
+ (upgrader_flags & OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC) == 0)
+ {
+ refs_to_fetch[0] = (char *) new_ref;
+ if (!ostree_repo_pull_one_dir (repo, self->origin_remote, dir_to_pull, refs_to_fetch,
+ flags, progress, cancellable, error))
+ return FALSE;
+ }
+
+ /* Use the new ref for the rest of the update process */
+ g_free (self->origin_ref);
+ self->origin_ref = g_strdup(new_ref);
+ g_free (origin_refspec);
+
+ if (self->origin_remote)
+ origin_refspec = g_strconcat (self->origin_remote, ":", new_ref, NULL);
+ else
+ origin_refspec = g_strdup (new_ref);
+
+ g_key_file_set_string (self->origin, "origin", "refspec", origin_refspec);
+ }
+
if (self->override_csum != NULL)
{
if (!ostree_repo_set_ref_immediate (repo,