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:
1 parent
cd65f85dcb
commit
c1ed9a15c1
3 files changed
+119
No files matched your search
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user