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
This commit is contained in:
Daniel Drake authored and Atomic Bot committed 2017-05-22 20:18:07 +00:00
1 parent cd65f85dcb
commit c1ed9a15c1
3 files changed
+119

No files matched your search

+46
View File
@@ -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,