sysroot: Add _require_booted_deployment() API
authorColin Walters <walters@verbum.org>
Wed, 17 Mar 2021 14:03:49 +0000 (14:03 +0000)
committerColin Walters <walters@verbum.org>
Wed, 17 Mar 2021 19:55:56 +0000 (19:55 +0000)
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
src/libostree/libostree-devel.sym
src/libostree/ostree-sysroot-deploy.c
src/libostree/ostree-sysroot.c
src/libostree/ostree-sysroot.h
src/ostree/ot-admin-builtin-set-origin.c
src/ostree/ot-admin-builtin-unlock.c
tests/admin-test.sh

index 400eb53a4ebf4ddcf2f60d82968cbfee3c7fc5ea..e4954c7073145e15dae3e5621632ed251d31840c 100644 (file)
@@ -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
index 541caaa2c76ef1fb19587f56a5ce6f26319f55b9..02159cd2f492d8135dbda0fe45d7b1b5cd17aa5f 100644 (file)
@@ -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
index 2a06f166aa6cfd73c9add4ccd98406e52b901722..32748a62f58d808ad5d863c0f090ae186f0545c8 100644 (file)
@@ -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). */
index 2db47a53bf6b31335ee1553ebd30c29c0c08607b..b0ae66cf5bed2ec507a4233bc146c1e1c1679826 100644 (file)
@@ -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
index 3a3b6a774a55be2479329c0315abbe113096420d..036b81e8eab1f0f1004cb8a3bc0629adf4486f5e 100644 (file)
@@ -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
index 4dc68a00a3bf279d6412ef1477366a54ef1638db..b133dc58486438f53e69498abc09dc77ec72415f 100644 (file)
@@ -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);
     }
index 6c265f54a58a5cd292be1f858b2ebb32d96416c8..77fe8be325355913ea2e2910310d06a586a09180 100644 (file)
@@ -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)
     {
index b05893ae4aca58b4a67b29e9ff5104746886eec6..a7016a8769c9ebd9719c001d91a9503f872c1be1 100644 (file)
@@ -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)