Move ref parsing into core

We went through a lot of gyrations on this one.  It's only
relevant to server side composes, so having the core parse
the treefile for it directly just makes sense.
This commit is contained in:
Colin Walters 2021-04-12 09:15:57 -04:00
parent 53b4fc8c26
commit 834328f963
7 changed files with 29 additions and 32 deletions

View File

@ -251,6 +251,7 @@ pub mod ffi {
fn get_ostree_override_layers(&self) -> Vec<String>;
fn get_all_ostree_layers(&self) -> Vec<String>;
fn get_repos(&self) -> Vec<String>;
fn get_ref(&self) -> &str;
fn get_rojig_spec_path(&self) -> String;
fn get_rojig_name(&self) -> String;
fn get_cliwrap(&self) -> bool;

View File

@ -541,6 +541,10 @@ impl Treefile {
self.parsed.repos.clone().unwrap_or_default()
}
pub(crate) fn get_ref(&self) -> &str {
self.parsed.treeref.as_deref().unwrap_or_default()
}
pub(crate) fn get_rojig_spec_path(&self) -> String {
self.rojig_spec.clone().unwrap_or_default()
}

View File

@ -710,6 +710,8 @@ rpm_ostree_compose_context_new (const char *treefile_pathstr,
if (!opt_unified_core)
rpmostree_context_disable_selinux (self->corectx);
self->ref = g_strdup (rpmostree_context_get_ref (self->corectx));
if (opt_lockfiles)
{
rpmostree_context_set_lockfile (self->corectx, opt_lockfiles, opt_lockfile_strict);
@ -782,7 +784,6 @@ rpm_ostree_compose_context_new (const char *treefile_pathstr,
error);
if (!self->treespec)
return FALSE;
self->ref = rpmostree_treespec_get_ref (self->treespec);
*out_context = util::move_nullify (self);
return TRUE;

View File

@ -175,7 +175,6 @@ rpmostree_composeutil_get_treespec (RpmOstreeContext *ctx,
GError **error)
{
GLNX_AUTO_PREFIX_ERROR ("Parsing treefile", error);
auto varsubsts = rpmostree_dnfcontext_get_varsubsts (rpmostree_context_get_dnf (ctx));
g_autoptr(GKeyFile) treespec = g_key_file_new ();
if (!treespec_bind_array (treedata, treespec, "packages", NULL, TRUE, error))
@ -195,15 +194,6 @@ rpmostree_composeutil_get_treespec (RpmOstreeContext *ctx,
if (!treespec_bind_array (treedata, treespec, "install-langs", "instlangs", FALSE, error))
return NULL;
const char *input_ref = NULL;
if (!_rpmostree_jsonutil_object_get_optional_string_member (treedata, "ref", &input_ref, error))
return NULL;
if (input_ref)
{
auto ref = rpmostreecxx::varsubstitute (input_ref, *varsubsts);
g_key_file_set_string (treespec, "tree", "ref", ref.c_str());
}
return rpmostree_treespec_new_from_keyfile (treespec, error);
}

View File

@ -39,6 +39,7 @@ struct _RpmOstreeContext {
rpmostreecxx::Treefile *treefile_rs; /* For composes for now */
gboolean empty;
gboolean disable_selinux;
char *ref;
/* rojig-mode data */
const char *rojig_spec; /* The rojig spec like: repoid:package */

View File

@ -226,13 +226,6 @@ rpmostree_treespec_new_from_keyfile (GKeyFile *keyfile,
g_variant_builder_init (&builder, (GVariantType*)"a{sv}");
/* We allow the "ref" key to be missing for cases where we don't need one.
* This is abusing the Treespec a bit, but oh well... */
{ g_autofree char *ref = g_key_file_get_string (keyfile, "tree", "ref", NULL);
if (ref)
g_variant_builder_add (&builder, "{sv}", "ref", g_variant_new_string (ref));
}
#define BIND_STRING(k) \
{ g_autofree char *v = g_key_file_get_string (keyfile, "tree", k, NULL); \
if (v) \
@ -289,14 +282,6 @@ rpmostree_treespec_new (GVariant *variant)
return util::move_nullify (ret);
}
const char *
rpmostree_treespec_get_ref (RpmOstreeTreespec *spec)
{
const char *r = NULL;
g_variant_dict_lookup (spec->dict, "ref", "&s", &r);
return r;
}
GVariant *
rpmostree_treespec_to_variant (RpmOstreeTreespec *spec)
{
@ -317,6 +302,8 @@ rpmostree_context_finalize (GObject *object)
g_clear_object (&rctx->spec);
g_clear_object (&rctx->dnfctx);
g_clear_pointer (&rctx->ref, g_free);
g_clear_object (&rctx->rojig_pkg);
g_free (rctx->rojig_checksum);
g_free (rctx->rojig_inputhash);
@ -450,6 +437,15 @@ rpmostree_context_new_tree (int userroot_dfd,
dnf_context_set_lock_dir (ret->dnfctx, lockdir);
}
// The ref needs special handling as it gets variable-substituted.
auto ref = ret->treefile_rs->get_ref();
if (ref.length() > 0)
{
auto varsubsts = rpmostree_dnfcontext_get_varsubsts(ret->dnfctx);
auto subst_ref = rpmostreecxx::varsubstitute(ref, *varsubsts);
ret->ref = g_strdup(subst_ref.c_str());
}
return util::move_nullify (ret);
}
@ -520,6 +516,12 @@ rpmostree_context_disable_selinux (RpmOstreeContext *self)
self->disable_selinux = TRUE;
}
const char *
rpmostree_context_get_ref (RpmOstreeContext *self)
{
return self->ref;
}
/* XXX: or put this in new_system() instead? */
void
rpmostree_context_set_repos (RpmOstreeContext *self,
@ -4829,11 +4831,9 @@ rpmostree_context_commit (RpmOstreeContext *self,
return FALSE;
}
{ const char * ref = rpmostree_treespec_get_ref (self->spec);
if (ref != NULL)
ostree_repo_transaction_set_ref (self->ostreerepo, NULL, ref,
if (self->ref != NULL)
ostree_repo_transaction_set_ref (self->ostreerepo, NULL, self->ref,
ret_commit_checksum);
}
{ OstreeRepoTransactionStats stats;
g_autofree char *bytes_written_formatted = NULL;

View File

@ -113,7 +113,6 @@ RpmOstreeTreespec *rpmostree_treespec_new (GVariant *variant);
GVariant *rpmostree_context_get_rpmmd_repo_commit_metadata (RpmOstreeContext *self);
GVariant *rpmostree_treespec_to_variant (RpmOstreeTreespec *spec);
const char *rpmostree_treespec_get_ref (RpmOstreeTreespec *spec);
gboolean rpmostree_context_setup (RpmOstreeContext *self,
const char *install_root,
@ -129,6 +128,7 @@ rpmostree_context_configure_from_deployment (RpmOstreeContext *self,
void rpmostree_context_set_is_empty (RpmOstreeContext *self);
void rpmostree_context_disable_selinux (RpmOstreeContext *self);
const char *rpmostree_context_get_ref (RpmOstreeContext *self);
void rpmostree_context_set_repos (RpmOstreeContext *self,
OstreeRepo *base_repo,