From 1b28e6041c33b3f1508dda458ed7ed97aed4375e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 17 Mar 2021 14:03:49 +0000 Subject: [PATCH] sysroot: Add _require_booted_deployment() API This is a common pattern that is replicated both in our code and in rpm-ostree a lot. Let's add a canonical API. --- apidoc/ostree-sections.txt | 1 + src/libostree/libostree-devel.sym | 1 + src/libostree/ostree-sysroot-deploy.c | 4 ++-- src/libostree/ostree-sysroot.c | 21 +++++++++++++++++++++ src/libostree/ostree-sysroot.h | 3 +++ src/ostree/ot-admin-builtin-set-origin.c | 8 ++------ src/ostree/ot-admin-builtin-unlock.c | 8 ++------ tests/admin-test.sh | 2 +- 8 files changed, 33 insertions(+), 15 deletions(-) diff --git a/apidoc/ostree-sections.txt b/apidoc/ostree-sections.txt index 400eb53a..e4954c70 100644 --- a/apidoc/ostree-sections.txt +++ b/apidoc/ostree-sections.txt @@ -533,6 +533,7 @@ ostree_sysroot_get_bootversion ostree_sysroot_get_subbootversion ostree_sysroot_get_deployments ostree_sysroot_get_booted_deployment +ostree_sysroot_require_booted_deployment ostree_sysroot_get_deployment_directory ostree_sysroot_get_deployment_dirpath ostree_sysroot_get_deployment_origin_path diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym index 541caaa2..02159cd2 100644 --- a/src/libostree/libostree-devel.sym +++ b/src/libostree/libostree-devel.sym @@ -25,6 +25,7 @@ LIBOSTREE_2021.1 { global: ostree_commit_metadata_for_bootable; + ostree_sysroot_require_booted_deployment; } LIBOSTREE_2020.8; /* Stub section for the stable release *after* this development one; don't diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 2a06f166..32748a62 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -3066,9 +3066,9 @@ ostree_sysroot_stage_tree_with_options (OstreeSysroot *self, if (!_ostree_sysroot_ensure_writable (self, error)) return FALSE; - OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (self); + OstreeDeployment *booted_deployment = ostree_sysroot_require_booted_deployment (self, error); if (booted_deployment == NULL) - return glnx_throw (error, "Cannot stage a deployment when not currently booted into an OSTree system"); + return glnx_prefix_error (error, "Cannot stage deployment"); /* This is used by the testsuite to exercise the path unit, until it becomes the default * (which is pending on the preset making it everywhere). */ diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index 2db47a53..b0ae66cf 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -1246,6 +1246,27 @@ ostree_sysroot_get_booted_deployment (OstreeSysroot *self) return self->booted_deployment; } + +/** + * ostree_sysroot_require_booted_deployment: + * @self: Sysroot + * + * Find the booted deployment, or return an error if not booted via OSTree. + * + * Returns: (transfer none) (not nullable): The currently booted deployment, or an error + * Since: 2021.1 + */ +OstreeDeployment * +ostree_sysroot_require_booted_deployment (OstreeSysroot *self, GError **error) +{ + g_return_val_if_fail (self->loadstate == OSTREE_SYSROOT_LOAD_STATE_LOADED, NULL); + + if (!self->booted_deployment) + return glnx_null_throw (error, "Not currently booted into an OSTree system"); + return self->booted_deployment; +} + + /** * ostree_sysroot_get_staged_deployment: * @self: Sysroot diff --git a/src/libostree/ostree-sysroot.h b/src/libostree/ostree-sysroot.h index 3a3b6a77..036b81e8 100644 --- a/src/libostree/ostree-sysroot.h +++ b/src/libostree/ostree-sysroot.h @@ -85,6 +85,9 @@ GPtrArray *ostree_sysroot_get_deployments (OstreeSysroot *self); _OSTREE_PUBLIC OstreeDeployment *ostree_sysroot_get_booted_deployment (OstreeSysroot *self); _OSTREE_PUBLIC +OstreeDeployment * +ostree_sysroot_require_booted_deployment (OstreeSysroot *self, GError **error); +_OSTREE_PUBLIC OstreeDeployment *ostree_sysroot_get_staged_deployment (OstreeSysroot *self); _OSTREE_PUBLIC diff --git a/src/ostree/ot-admin-builtin-set-origin.c b/src/ostree/ot-admin-builtin-set-origin.c index 4dc68a00..b133dc58 100644 --- a/src/ostree/ot-admin-builtin-set-origin.c +++ b/src/ostree/ot-admin-builtin-set-origin.c @@ -75,13 +75,9 @@ ot_admin_builtin_set_origin (int argc, char **argv, OstreeCommandInvocation *inv if (opt_index == -1) { - target_deployment = ostree_sysroot_get_booted_deployment (sysroot); + target_deployment = ostree_sysroot_require_booted_deployment (sysroot, error); if (target_deployment == NULL) - { - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Not currently booted into an OSTree system"); - goto out; - } + goto out; /* To match the below */ target_deployment = g_object_ref (target_deployment); } diff --git a/src/ostree/ot-admin-builtin-unlock.c b/src/ostree/ot-admin-builtin-unlock.c index 6c265f54..77fe8be3 100644 --- a/src/ostree/ot-admin-builtin-unlock.c +++ b/src/ostree/ot-admin-builtin-unlock.c @@ -61,13 +61,9 @@ ot_admin_builtin_unlock (int argc, char **argv, OstreeCommandInvocation *invocat goto out; } - booted_deployment = ostree_sysroot_get_booted_deployment (sysroot); + booted_deployment = ostree_sysroot_require_booted_deployment (sysroot, error); if (!booted_deployment) - { - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Not currently booted into an OSTree system"); - goto out; - } + goto out; if (opt_hotfix && opt_transient) { diff --git a/tests/admin-test.sh b/tests/admin-test.sh index b05893ae..a7016a87 100644 --- a/tests/admin-test.sh +++ b/tests/admin-test.sh @@ -95,7 +95,7 @@ echo "ok layout" if ${CMD_PREFIX} ostree admin deploy --stage --os=testos testos:testos/buildmaster/x86_64-runtime 2>err.txt; then fatal "staged when not booted" fi -assert_file_has_content_literal err.txt "Cannot stage a deployment when not currently booted into an OSTree system" +assert_file_has_content_literal err.txt "Cannot stage deployment: Not currently booted into an OSTree system" echo "ok staging does not work when not booted" orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)