diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2015-10-01 19:02:11 -0400 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2015-10-13 12:34:56 -0400 |
commit | 39b732ffaab5b95169448c911844fcf969a288d1 (patch) | |
tree | 8aba27dadd8e1da0ea97c08edb15aebf05a44738 /src/libostree/ostree-sysroot-upgrader.c | |
parent | 41ab26356c082e110c20e8e1601216584a46004b (diff) | |
download | ostree-39b732ffaab5b95169448c911844fcf969a288d1.tar.gz |
upgrader: Allow overriding the commit to pull
Upgrader now looks for an "override-commit" key in the origin file
with a commit checksum, which causes the upgrader to pull and deploy
the specified commit rather than the latest available commit on the
origin refspec.
Diffstat (limited to 'src/libostree/ostree-sysroot-upgrader.c')
-rw-r--r-- | src/libostree/ostree-sysroot-upgrader.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/libostree/ostree-sysroot-upgrader.c b/src/libostree/ostree-sysroot-upgrader.c index 7ee19f63..5c8f9d1d 100644 --- a/src/libostree/ostree-sysroot-upgrader.c +++ b/src/libostree/ostree-sysroot-upgrader.c @@ -47,6 +47,7 @@ struct OstreeSysrootUpgrader { GKeyFile *origin; char *origin_remote; char *origin_ref; + char *override_csum; char *new_revision; }; @@ -72,6 +73,7 @@ parse_refspec (OstreeSysrootUpgrader *self, gboolean ret = FALSE; g_autofree char *origin_refspec = NULL; g_autofree char *unconfigured_state = NULL; + g_autofree char *csum = NULL; if ((self->flags & OSTREE_SYSROOT_UPGRADER_FLAGS_IGNORE_UNCONFIGURED) == 0) { @@ -99,7 +101,12 @@ parse_refspec (OstreeSysrootUpgrader *self, &self->origin_ref, error)) goto out; - + + csum = g_key_file_get_string (self->origin, "origin", "override-commit", NULL); + if (csum != NULL && !ostree_validate_checksum_string (csum, error)) + goto out; + self->override_csum = g_steal_pointer (&csum); + ret = TRUE; out: return ret; @@ -180,6 +187,7 @@ ostree_sysroot_upgrader_finalize (GObject *object) g_key_file_unref (self->origin); g_free (self->origin_remote); g_free (self->origin_ref); + g_free (self->override_csum); G_OBJECT_CLASS (ostree_sysroot_upgrader_parent_class)->finalize (object); } @@ -520,11 +528,16 @@ ostree_sysroot_upgrader_pull_one_dir (OstreeSysrootUpgrader *self, { gboolean ret = FALSE; glnx_unref_object OstreeRepo *repo = NULL; - char *refs_to_fetch[] = { self->origin_ref, NULL }; + char *refs_to_fetch[] = { NULL, NULL }; const char *from_revision = NULL; g_autofree char *new_revision = NULL; g_autofree char *origin_refspec = NULL; + if (self->override_csum != NULL) + refs_to_fetch[0] = self->override_csum; + else + refs_to_fetch[0] = self->origin_ref; + if (!ostree_sysroot_get_repo (self->sysroot, &repo, cancellable, error)) goto out; @@ -547,9 +560,25 @@ ostree_sysroot_upgrader_pull_one_dir (OstreeSysrootUpgrader *self, ostree_async_progress_finish (progress); } - if (!ostree_repo_resolve_rev (repo, origin_refspec, FALSE, &self->new_revision, - error)) - goto out; + if (self->override_csum != NULL) + { + if (!ostree_repo_set_ref_immediate (repo, + self->origin_remote, + self->origin_ref, + self->override_csum, + cancellable, + error)) + goto out; + + self->new_revision = g_strdup (self->override_csum); + } + else + { + if (!ostree_repo_resolve_rev (repo, origin_refspec, FALSE, + &self->new_revision, error)) + goto out; + + } if (g_strcmp0 (from_revision, self->new_revision) == 0) { |