summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-sysroot-deploy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libostree/ostree-sysroot-deploy.c')
-rw-r--r--src/libostree/ostree-sysroot-deploy.c57
1 files changed, 52 insertions, 5 deletions
diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c
index e7dc25d0..3843a89e 100644
--- a/src/libostree/ostree-sysroot-deploy.c
+++ b/src/libostree/ostree-sysroot-deploy.c
@@ -2144,6 +2144,38 @@ ostree_sysroot_write_deployments_with_options (OstreeSysroot *self,
{
g_assert (self->loaded);
+ /* It dramatically simplifies a lot of the logic below if we
+ * drop the staged deployment from both the source deployment list,
+ * as well as the target list. We don't want to write it to the bootloader
+ * now, which is mostly what this function is concerned with.
+ * In the future we though should probably adapt things to keep it.
+ */
+ if (self->staged_deployment)
+ {
+ if (!glnx_unlinkat (AT_FDCWD, _OSTREE_SYSROOT_RUNSTATE_STAGED, 0, error))
+ return FALSE;
+
+ if (!_ostree_sysroot_rmrf_deployment (self, self->staged_deployment, cancellable, error))
+ return FALSE;
+
+ g_assert (self->staged_deployment == self->deployments->pdata[0]);
+ g_ptr_array_remove_index (self->deployments, 0);
+ }
+ /* First new deployment; we'll see if it's staged */
+ OstreeDeployment *first_new =
+ (new_deployments->len > 0 ? new_deployments->pdata[0] : NULL);
+ g_autoptr(GPtrArray) new_deployments_copy = NULL;
+ if (first_new && ostree_deployment_is_staged (first_new))
+ {
+ g_assert_cmpint (new_deployments->len, >, 0);
+ new_deployments_copy = g_ptr_array_sized_new (new_deployments->len - 1);
+ for (guint i = 1; i < new_deployments->len; i++)
+ g_ptr_array_add (new_deployments_copy, new_deployments->pdata[i]);
+ }
+ else
+ new_deployments_copy = g_ptr_array_ref (new_deployments);
+ new_deployments = new_deployments_copy;
+
/* Assign a bootserial to each new deployment.
*/
assign_bootserials (new_deployments);
@@ -2162,6 +2194,8 @@ ostree_sysroot_write_deployments_with_options (OstreeSysroot *self,
for (guint i = 0; i < new_deployments->len; i++)
{
OstreeDeployment *cur_deploy = self->deployments->pdata[i];
+ if (ostree_deployment_is_staged (cur_deploy))
+ continue;
OstreeDeployment *new_deploy = new_deployments->pdata[i];
if (!deployment_bootconfigs_equal (cur_deploy, new_deploy))
{
@@ -2185,12 +2219,12 @@ ostree_sysroot_write_deployments_with_options (OstreeSysroot *self,
for (guint i = 0; i < new_deployments->len; i++)
{
OstreeDeployment *deployment = new_deployments->pdata[i];
- g_autoptr(GFile) deployment_root = NULL;
+ g_assert (!ostree_deployment_is_staged (deployment));
if (deployment == self->booted_deployment)
found_booted_deployment = TRUE;
- deployment_root = ostree_sysroot_get_deployment_directory (self, deployment);
+ g_autoptr(GFile) deployment_root = ostree_sysroot_get_deployment_directory (self, deployment);
if (!g_file_query_exists (deployment_root, NULL))
return glnx_throw (error, "Unable to find expected deployment root: %s",
gs_file_get_path_cached (deployment_root));
@@ -2672,7 +2706,10 @@ ostree_sysroot_stage_tree (OstreeSysroot *self,
return FALSE;
}
- if (!_ostree_sysroot_reload_staged (self, error))
+ /* Bump mtime so external processes know something changed, and then reload. */
+ if (!_ostree_sysroot_bump_mtime (self, error))
+ return FALSE;
+ if (!ostree_sysroot_load (self, cancellable, error))
return FALSE;
return TRUE;
@@ -2716,10 +2753,17 @@ _ostree_sysroot_finalize_staged (OstreeSysroot *self,
cancellable, error))
return FALSE;
+ /* Now, take ownership of the staged state, as normally the API below strips
+ * it out.
+ */
+ g_autoptr(OstreeDeployment) staged = g_steal_pointer (&self->staged_deployment);
+ staged->staged = FALSE;
+ g_ptr_array_remove_index (self->deployments, 0);
+
/* TODO: Proxy across flags too? */
OstreeSysrootSimpleWriteDeploymentFlags flags = 0;
- if (!ostree_sysroot_simple_write_deployment (self, ostree_deployment_get_osname (self->staged_deployment),
- self->staged_deployment, merge_deployment, flags,
+ if (!ostree_sysroot_simple_write_deployment (self, ostree_deployment_get_osname (staged),
+ staged, merge_deployment, flags,
cancellable, error))
return FALSE;
@@ -2744,6 +2788,9 @@ ostree_sysroot_deployment_set_kargs (OstreeSysroot *self,
GCancellable *cancellable,
GError **error)
{
+ /* For now; instead of this do a redeployment */
+ g_assert (!ostree_deployment_is_staged (deployment));
+
g_autoptr(OstreeDeployment) new_deployment = ostree_deployment_clone (deployment);
OstreeBootconfigParser *new_bootconfig = ostree_deployment_get_bootconfig (new_deployment);