static gboolean apply_revision_override (RpmostreedTransaction *transaction, OstreeRepo *repo, OstreeAsyncProgress *progress, RpmOstreeSysrootUpgrader *upgrader, const char *revision, GCancellable *cancellable, GError **error) { g_autoptr(GKeyFile) origin = NULL; g_autofree char *checksum = NULL; g_autofree char *version = NULL; const char *refspec; origin = rpmostree_sysroot_upgrader_dup_origin (upgrader); if (origin == NULL) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Booted deployment has no origin"); return FALSE; } if (!rpmostreed_parse_revision (revision, &checksum, &version, error)) return FALSE; refspec = rpmostree_sysroot_upgrader_get_refspec (upgrader); if (refspec == NULL) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Could not find refspec for booted deployment"); return FALSE; } if (version != NULL) { rpmostreed_transaction_emit_message_printf (transaction, "Resolving version '%s'", version); if (!rpmostreed_repo_lookup_version (repo, refspec, version, progress, cancellable, &checksum, error)) return FALSE; } else { g_assert (checksum != NULL); rpmostreed_transaction_emit_message_printf (transaction, "Validating checksum '%s'", checksum); if (!rpmostreed_repo_lookup_checksum (repo, refspec, checksum, progress, cancellable, error)) return FALSE; } g_key_file_set_string (origin, "origin", "override-commit", checksum); if (version != NULL) { g_autofree char *comment = NULL; /* Add a comment with the version, to be nice. */ comment = g_strdup_printf ("Version %s [%.10s]", version, checksum); g_key_file_set_comment (origin, "origin", "override-commit", comment, NULL); } if (!rpmostree_sysroot_upgrader_set_origin (upgrader, origin, cancellable, error)) return FALSE; return TRUE; }
static gboolean package_diff_transaction_execute (RpmostreedTransaction *transaction, GCancellable *cancellable, GError **error) { PackageDiffTransaction *self; OstreeSysroot *sysroot; glnx_unref_object OstreeSysrootUpgrader *upgrader = NULL; glnx_unref_object OstreeAsyncProgress *progress = NULL; glnx_unref_object OstreeRepo *repo = NULL; g_autoptr(GKeyFile) origin = NULL; g_autofree gchar *origin_description = NULL; OstreeSysrootUpgraderPullFlags upgrader_flags = 0; gboolean upgrading = FALSE; gboolean changed = FALSE; gboolean ret = FALSE; self = (PackageDiffTransaction *) transaction; sysroot = rpmostreed_transaction_get_sysroot (transaction); upgrader = ostree_sysroot_upgrader_new_for_os (sysroot, self->osname, cancellable, error); if (upgrader == NULL) goto out; if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; origin = ostree_sysroot_upgrader_dup_origin (upgrader); /* Determine if we're upgrading before we set the refspec. */ upgrading = (self->refspec == NULL && self->revision == NULL); if (self->refspec != NULL) { if (!change_upgrader_refspec (sysroot, upgrader, self->refspec, cancellable, NULL, NULL, error)) goto out; } else if (origin != NULL) { self->refspec = g_key_file_get_string (origin, "origin", "refspec", NULL); if (self->refspec == NULL) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Could not find refspec for booted deployment"); } } else { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Booted deployment has no origin"); goto out; } progress = ostree_async_progress_new (); rpmostreed_transaction_connect_download_progress (transaction, progress); rpmostreed_transaction_connect_signature_progress (transaction, repo); if (self->revision != NULL) { g_autofree char *checksum = NULL; g_autofree char *version = NULL; upgrader_flags |= OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER; if (!rpmostreed_parse_revision (self->revision, &checksum, &version, error)) goto out; if (version != NULL) { rpmostreed_transaction_emit_message_printf (transaction, "Resolving version '%s'", version); if (!rpmostreed_repo_lookup_version (repo, self->refspec, version, progress, cancellable, &checksum, error)) goto out; } g_key_file_set_string (origin, "origin", "override-commit", checksum); if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, cancellable, error)) goto out; } else if (upgrading) { if (g_key_file_remove_key (origin, "origin", "override-commit", NULL)) { if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, cancellable, error)) goto out; } } origin_description = ostree_sysroot_upgrader_get_origin_description (upgrader); if (origin_description != NULL) rpmostreed_transaction_emit_message_printf (transaction, "Updating from: %s", origin_description); if (!ostree_sysroot_upgrader_pull_one_dir (upgrader, "/usr/share/rpm", 0, upgrader_flags, progress, &changed, cancellable, error)) goto out; rpmostree_transaction_emit_progress_end (RPMOSTREE_TRANSACTION (transaction)); if (!changed) { if (upgrading) rpmostreed_transaction_emit_message_printf (transaction, "No upgrade available."); else rpmostreed_transaction_emit_message_printf (transaction, "No change."); } ret = TRUE; out: return ret; }
static gboolean apply_revision_override (RpmostreedTransaction *transaction, OstreeRepo *repo, OstreeAsyncProgress *progress, RpmOstreeSysrootUpgrader *upgrader, const char *revision, GCancellable *cancellable, GError **error) { RpmOstreeOrigin *origin = rpmostree_sysroot_upgrader_get_origin (upgrader); g_autoptr(GKeyFile) new_origin = NULL; g_autofree char *checksum = NULL; g_autofree char *version = NULL; new_origin = rpmostree_origin_dup_keyfile (origin); if (!rpmostreed_parse_revision (revision, &checksum, &version, error)) return FALSE; if (version != NULL) { rpmostreed_transaction_emit_message_printf (transaction, "Resolving version '%s'", version); if (!rpmostreed_repo_lookup_version (repo, rpmostree_origin_get_refspec (origin), version, progress, cancellable, &checksum, error)) return FALSE; } else { g_assert (checksum != NULL); rpmostreed_transaction_emit_message_printf (transaction, "Validating checksum '%s'", checksum); if (!rpmostreed_repo_lookup_checksum (repo, rpmostree_origin_get_refspec (origin), checksum, progress, cancellable, error)) return FALSE; } g_key_file_set_string (new_origin, "origin", "override-commit", checksum); if (version != NULL) { g_autofree char *comment = NULL; /* Add a comment with the version, to be nice. */ comment = g_strdup_printf ("Version %s [%.10s]", version, checksum); g_key_file_set_comment (new_origin, "origin", "override-commit", comment, NULL); } if (!rpmostree_sysroot_upgrader_set_origin (upgrader, new_origin, cancellable, error)) return FALSE; return TRUE; }