[ostree] deploy/main: Unify some bits between admin-switch and admin-upgrade



commit d98eb901c4cf5b923a163aefdef0cdf1075af621
Author: Colin Walters <walters verbum org>
Date:   Sun Jan 19 11:28:30 2014 -0500

    deploy/main: Unify some bits between admin-switch and admin-upgrade

 src/ostree/ot-admin-builtin-switch.c  |   43 ++++++++----------------
 src/ostree/ot-admin-builtin-upgrade.c |   32 ++---------------
 src/ostree/ot-admin-functions.c       |   60 +++++++++++++++++++++++++++++++++
 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 e524de8..d744618 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 d222e9e..1b86cdd 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 6d81655..6b54fb2 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 1b26948..d42c974 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,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]