diff options
author | Daniel Drake <drake@endlessm.com> | 2017-05-15 12:13:38 -0600 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2017-05-22 20:18:07 +0000 |
commit | c1ed9a15c1adb44ef30984f984c7ce199b88af03 (patch) | |
tree | 847c8bbbf1cf13012b97cc8f558a767f79c39ac7 /src/libostree/ostree-sysroot-upgrader.c | |
parent | cd65f85dcbed6930eb5d3fdb344b173c4356da30 (diff) | |
download | ostree-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.c | 46 |
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, |