diff options
-rw-r--r-- | src/ostree/ot-admin-builtin-switch.c | 43 | ||||
-rw-r--r-- | src/ostree/ot-admin-builtin-upgrade.c | 32 | ||||
-rw-r--r-- | src/ostree/ot-admin-functions.c | 60 | ||||
-rw-r--r-- | src/ostree/ot-admin-functions.h | 10 |
4 files changed, 88 insertions, 57 deletions
diff --git a/src/ostree/ot-admin-builtin-switch.c b/src/ostree/ot-admin-builtin-switch.c index e524de85..d7446184 100644 --- a/src/ostree/ot-admin-builtin-switch.c +++ b/src/ostree/ot-admin-builtin-switch.c @@ -73,38 +73,13 @@ ot_admin_builtin_switch (int argc, char **argv, OstreeSysroot *sysroot, GCancell if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; - if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname, - cancellable, error)) - goto out; - merge_deployment = ostree_sysroot_get_merge_deployment (sysroot, opt_osname); - if (merge_deployment == NULL) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "No previous deployment for OS '%s'", opt_osname); - goto out; - } - - deployment_path = ostree_sysroot_get_deployment_directory (sysroot, merge_deployment); - deployment_origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path); - if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; - origin = ostree_deployment_get_origin (merge_deployment); - if (!origin) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "No origin known for current deployment"); - goto out; - } - origin_refspec = g_key_file_get_string (origin, "origin", "refspec", NULL); - if (!origin_refspec) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "No origin/refspec in current deployment origin; cannot change via ostree"); - goto out; - } - if (!ostree_parse_refspec (origin_refspec, &origin_remote, &origin_ref, error)) + if (!ot_admin_deploy_prepare (sysroot, opt_osname, &merge_deployment, + &origin_remote, &origin_ref, + &origin, + cancellable, error)) goto out; if (strcmp (origin_ref, new_ref) == 0) @@ -114,6 +89,16 @@ ot_admin_builtin_switch (int argc, char **argv, OstreeSysroot *sysroot, GCancell goto out; } + { + gs_free char *new_refspec = NULL; + if (origin_remote) + new_refspec = g_strconcat (origin_remote, ":", new_ref, NULL); + else + new_refspec = g_strdup (new_ref); + g_key_file_unref (origin); + origin = ostree_sysroot_origin_new_from_refspec (sysroot, new_refspec); + } + if (origin_remote) { OstreeRepoPullFlags pullflags = 0; diff --git a/src/ostree/ot-admin-builtin-upgrade.c b/src/ostree/ot-admin-builtin-upgrade.c index d222e9e0..1b86cddc 100644 --- a/src/ostree/ot-admin-builtin-upgrade.c +++ b/src/ostree/ot-admin-builtin-upgrade.c @@ -67,38 +67,14 @@ ot_admin_builtin_upgrade (int argc, char **argv, OstreeSysroot *sysroot, GCancel if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; - if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname, - cancellable, error)) - goto out; - merge_deployment = ostree_sysroot_get_merge_deployment (sysroot, opt_osname); - if (merge_deployment == NULL) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "No previous deployment for OS '%s'", opt_osname); - goto out; - } - - deployment_path = ostree_sysroot_get_deployment_directory (sysroot, merge_deployment); - deployment_origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path); if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; - origin = ostree_deployment_get_origin (merge_deployment); - if (!origin) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "No origin known for current deployment"); - goto out; - } - origin_refspec = g_key_file_get_string (origin, "origin", "refspec", NULL); - if (!origin_refspec) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "No origin/refspec in current deployment origin; cannot upgrade via ostree"); - goto out; - } - if (!ostree_parse_refspec (origin_refspec, &origin_remote, &origin_ref, error)) + if (!ot_admin_deploy_prepare (sysroot, opt_osname, &merge_deployment, + &origin_remote, &origin_ref, + &origin, + cancellable, error)) goto out; if (origin_remote) diff --git a/src/ostree/ot-admin-functions.c b/src/ostree/ot-admin-functions.c index 6d81655d..6b54fb2c 100644 --- a/src/ostree/ot-admin-functions.c +++ b/src/ostree/ot-admin-functions.c @@ -106,3 +106,63 @@ ot_admin_complete_deploy_one (OstreeSysroot *sysroot, out: return ret; } + +gboolean +ot_admin_deploy_prepare (OstreeSysroot *sysroot, + const char *osname, + OstreeDeployment **out_merge_deployment, + char **out_origin_remote, + char **out_origin_ref, + GKeyFile **out_origin, + GCancellable *cancellable, + GError **error) +{ + gboolean ret = FALSE; + gs_free char *origin_refspec = NULL; + gs_free char *origin_remote = NULL; + gs_free char *origin_ref = NULL; + gs_unref_object GFile *deployment_path = NULL; + gs_unref_object GFile *deployment_origin_path = NULL; + gs_unref_object OstreeDeployment *merge_deployment = NULL; + GKeyFile *origin; + + if (!ot_admin_require_booted_deployment_or_osname (sysroot, osname, + cancellable, error)) + goto out; + merge_deployment = ostree_sysroot_get_merge_deployment (sysroot, osname); + if (merge_deployment == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "No previous deployment for OS '%s'", osname); + goto out; + } + + deployment_path = ostree_sysroot_get_deployment_directory (sysroot, merge_deployment); + deployment_origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path); + + origin = ostree_deployment_get_origin (merge_deployment); + if (!origin) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "No origin known for current deployment"); + goto out; + } + origin_refspec = g_key_file_get_string (origin, "origin", "refspec", NULL); + if (!origin_refspec) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "No origin/refspec in current deployment origin; cannot upgrade via ostree"); + goto out; + } + if (!ostree_parse_refspec (origin_refspec, &origin_remote, &origin_ref, error)) + goto out; + + ret = TRUE; + gs_transfer_out_value (out_merge_deployment, &merge_deployment); + gs_transfer_out_value (out_origin_remote, &origin_remote); + gs_transfer_out_value (out_origin_ref, &origin_ref); + gs_transfer_out_value (out_origin, &origin); + out: + g_clear_pointer (&origin, g_key_file_unref); + return ret; +} diff --git a/src/ostree/ot-admin-functions.h b/src/ostree/ot-admin-functions.h index 1b26948d..d42c974c 100644 --- a/src/ostree/ot-admin-functions.h +++ b/src/ostree/ot-admin-functions.h @@ -34,6 +34,16 @@ ot_admin_require_booted_deployment_or_osname (OstreeSysroot *sysroot, GError **error); gboolean +ot_admin_deploy_prepare (OstreeSysroot *sysroot, + const char *osname, + OstreeDeployment **merge_deployment, + char **origin_remote, + char **origin_ref, + GKeyFile **out_origin, + GCancellable *cancellable, + GError **error); + +gboolean ot_admin_complete_deploy_one (OstreeSysroot *sysroot, const char *osname, OstreeDeployment *new_deployment, |