diff options
author | Phaedrus Leeds <mwleeds@protonmail.com> | 2021-11-15 11:43:25 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-15 11:43:25 -0800 |
commit | 3cb380dfe5126676f4e2137a6a9a535c87634951 (patch) | |
tree | 58b926d110b8711ebff8930f999a2d0be02a6a37 | |
parent | 9dbd265cdd68099b62119e06f94bab43cf1f5ea9 (diff) | |
parent | 6f5bb3597e14a28be5953d5d773c225a86039254 (diff) | |
download | flatpak-3cb380dfe5126676f4e2137a6a9a535c87634951.tar.gz |
Merge pull request #4520 from flatpak/fix-4200-configure-polkit-prompt-option-2
Change how automatic pinning is implemented (option 2)
-rw-r--r-- | common/flatpak-dir-private.h | 7 | ||||
-rw-r--r-- | common/flatpak-dir.c | 18 | ||||
-rw-r--r-- | common/flatpak-installation.c | 2 | ||||
-rw-r--r-- | common/flatpak-transaction.c | 81 | ||||
-rw-r--r-- | system-helper/flatpak-system-helper.c | 4 |
5 files changed, 63 insertions, 49 deletions
diff --git a/common/flatpak-dir-private.h b/common/flatpak-dir-private.h index db160368..ac229dd7 100644 --- a/common/flatpak-dir-private.h +++ b/common/flatpak-dir-private.h @@ -216,7 +216,7 @@ typedef enum { FLATPAK_HELPER_DEPLOY_FLAGS_NO_INTERACTION = 1 << 4, FLATPAK_HELPER_DEPLOY_FLAGS_APP_HINT = 1 << 5, FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT = 1 << 6, - FLATPAK_HELPER_DEPLOY_FLAGS, + FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED = 1 << 7, } FlatpakHelperDeployFlags; #define FLATPAK_HELPER_DEPLOY_FLAGS_ALL (FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE | \ @@ -225,7 +225,8 @@ typedef enum { FLATPAK_HELPER_DEPLOY_FLAGS_REINSTALL | \ FLATPAK_HELPER_DEPLOY_FLAGS_NO_INTERACTION | \ FLATPAK_HELPER_DEPLOY_FLAGS_APP_HINT | \ - FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT) + FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT | \ + FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED) typedef enum { FLATPAK_HELPER_UNINSTALL_FLAGS_NONE = 0, @@ -715,6 +716,7 @@ gboolean flatpak_dir_deploy_install (Fla const char **subpaths, const char **previous_ids, gboolean reinstall, + gboolean pin_on_deploy, GCancellable *cancellable, GError **error); gboolean flatpak_dir_install (FlatpakDir *self, @@ -723,6 +725,7 @@ gboolean flatpak_dir_install (Fla gboolean no_static_deltas, gboolean reinstall, gboolean app_hint, + gboolean pin_on_deploy, FlatpakRemoteState *state, FlatpakDecomposed *ref, const char *opt_commit, diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c index f43d3a87..1307f222 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -8563,6 +8563,7 @@ flatpak_dir_deploy_install (FlatpakDir *self, const char **subpaths, const char **previous_ids, gboolean reinstall, + gboolean pin_on_deploy, GCancellable *cancellable, GError **error) { @@ -8660,6 +8661,14 @@ flatpak_dir_deploy_install (FlatpakDir *self, if (!flatpak_dir_mark_changed (self, error)) goto out; + /* Pin runtimes that are installed explicitly rather than pulled as + * dependencies so they are not automatically removed. */ + if (pin_on_deploy && + !flatpak_dir_config_append_pattern (self, "pinned", + flatpak_decomposed_get_ref (ref), + TRUE, NULL, error)) + goto out; + ret = TRUE; commit = flatpak_dir_read_active (self, ref, cancellable); @@ -9064,6 +9073,7 @@ flatpak_dir_install (FlatpakDir *self, gboolean no_static_deltas, gboolean reinstall, gboolean app_hint, + gboolean pin_on_deploy, FlatpakRemoteState *state, FlatpakDecomposed *ref, const char *opt_commit, @@ -9273,6 +9283,9 @@ flatpak_dir_install (FlatpakDir *self, if (app_hint) helper_flags |= FLATPAK_HELPER_DEPLOY_FLAGS_APP_HINT; + if (pin_on_deploy) + helper_flags |= FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED; + helper_flags |= FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT; if (!flatpak_dir_system_helper_call_deploy (self, @@ -9302,7 +9315,8 @@ flatpak_dir_install (FlatpakDir *self, if (!no_deploy) { if (!flatpak_dir_deploy_install (self, ref, state->remote_name, opt_subpaths, - opt_previous_ids, reinstall, cancellable, error)) + opt_previous_ids, reinstall, pin_on_deploy, + cancellable, error)) return FALSE; } @@ -9579,7 +9593,7 @@ flatpak_dir_install_bundle (FlatpakDir *self, } else { - if (!flatpak_dir_deploy_install (self, ref, remote, NULL, NULL, FALSE, cancellable, error)) + if (!flatpak_dir_deploy_install (self, ref, remote, NULL, NULL, FALSE, FALSE, cancellable, error)) return FALSE; } diff --git a/common/flatpak-installation.c b/common/flatpak-installation.c index 0d5a3c10..aa11ebec 100644 --- a/common/flatpak-installation.c +++ b/common/flatpak-installation.c @@ -1926,7 +1926,7 @@ flatpak_installation_install_full (FlatpakInstallation *self, (flags & FLATPAK_INSTALL_FLAGS_NO_PULL) != 0, (flags & FLATPAK_INSTALL_FLAGS_NO_DEPLOY) != 0, (flags & FLATPAK_INSTALL_FLAGS_NO_STATIC_DELTAS) != 0, - FALSE, FALSE, state, + FALSE, FALSE, FALSE, state, ref, NULL, (const char **) subpaths, NULL, NULL, NULL, NULL, progress, cancellable, error)) return NULL; diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c index 418fa96b..551da495 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c @@ -107,6 +107,7 @@ struct _FlatpakTransactionOperation gboolean failed; gboolean skip; gboolean update_only_deploy; + gboolean pin_on_deploy; gboolean resolved; char *resolved_commit; @@ -165,7 +166,6 @@ struct _FlatpakTransactionPrivate GPtrArray *extra_sideload_repos; GList *ops; GPtrArray *added_origin_remotes; - GPtrArray *added_pinned_runtimes; GList *flatpakrefs; /* GKeyFiles */ GList *bundles; /* BundleData */ @@ -644,7 +644,8 @@ flatpak_transaction_operation_new (const char *remote, const char **previous_ids, const char *commit, GFile *bundle, - FlatpakTransactionOperationType kind) + FlatpakTransactionOperationType kind, + gboolean pin_on_deploy) { FlatpakTransactionOperation *self; @@ -658,6 +659,7 @@ flatpak_transaction_operation_new (const char *remote, if (bundle) self->bundle = g_object_ref (bundle); self->kind = kind; + self->pin_on_deploy = pin_on_deploy; return self; } @@ -1005,7 +1007,6 @@ flatpak_transaction_finalize (GObject *object) g_clear_object (&priv->dir); g_ptr_array_unref (priv->added_origin_remotes); - g_ptr_array_unref (priv->added_pinned_runtimes); g_ptr_array_free (priv->extra_dependency_dirs, TRUE); g_ptr_array_free (priv->extra_sideload_repos, TRUE); @@ -1456,7 +1457,6 @@ flatpak_transaction_init (FlatpakTransaction *self) priv->last_op_for_ref = g_hash_table_new_full ((GHashFunc)flatpak_decomposed_hash, (GEqualFunc)flatpak_decomposed_equal, (GDestroyNotify) flatpak_decomposed_unref, NULL); priv->remote_states = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) flatpak_remote_state_unref); priv->added_origin_remotes = g_ptr_array_new_with_free_func (g_free); - priv->added_pinned_runtimes = g_ptr_array_new_with_free_func ((GDestroyNotify)flatpak_decomposed_unref); priv->extra_dependency_dirs = g_ptr_array_new_with_free_func (g_object_unref); priv->extra_sideload_repos = g_ptr_array_new_with_free_func (g_free); priv->can_run = TRUE; @@ -1983,6 +1983,7 @@ flatpak_transaction_add_op (FlatpakTransaction *self, const char *commit, GFile *bundle, FlatpakTransactionOperationType kind, + gboolean pin_on_deploy, GError **error) { FlatpakTransactionPrivate *priv = flatpak_transaction_get_instance_private (self); @@ -2012,7 +2013,8 @@ flatpak_transaction_add_op (FlatpakTransaction *self, return op; } - op = flatpak_transaction_operation_new (remote, ref, subpaths, previous_ids, commit, bundle, kind); + op = flatpak_transaction_operation_new (remote, ref, subpaths, previous_ids, + commit, bundle, kind, pin_on_deploy); g_hash_table_insert (priv->last_op_for_ref, flatpak_decomposed_ref (ref), op); priv->ops = g_list_prepend (priv->ops, op); @@ -2113,7 +2115,7 @@ add_related (FlatpakTransaction *self, related_op = flatpak_transaction_add_op (self, rel->remote, rel->ref, NULL, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, - error); + FALSE, error); if (related_op == NULL) return FALSE; @@ -2137,7 +2139,7 @@ add_related (FlatpakTransaction *self, (const char **) rel->subpaths, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, - error); + FALSE, error); if (related_op == NULL) return FALSE; @@ -2374,7 +2376,7 @@ add_deps (FlatpakTransaction *self, return FALSE; runtime_op = flatpak_transaction_add_op (self, runtime_remote, runtime_ref, NULL, NULL, NULL, NULL, - FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, error); + FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, FALSE, error); if (runtime_op == NULL) return FALSE; } @@ -2385,7 +2387,7 @@ add_deps (FlatpakTransaction *self, { g_debug ("Updating dependent runtime %s", flatpak_decomposed_get_pref (runtime_ref)); runtime_op = flatpak_transaction_add_op (self, runtime_remote, runtime_ref, NULL, NULL, NULL, NULL, - FLATPAK_TRANSACTION_OPERATION_UPDATE, error); + FLATPAK_TRANSACTION_OPERATION_UPDATE, FALSE, error); if (runtime_op == NULL) return FALSE; runtime_op->non_fatal = TRUE; @@ -2419,6 +2421,7 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, FlatpakTransactionOperationType kind, GFile *bundle, const char *external_metadata, + gboolean pin_on_deploy, GError **error) { FlatpakTransactionPrivate *priv = flatpak_transaction_get_instance_private (self); @@ -2530,7 +2533,8 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, return FALSE; } - op = flatpak_transaction_add_op (self, remote, ref, subpaths, previous_ids, commit, bundle, kind, error); + op = flatpak_transaction_add_op (self, remote, ref, subpaths, previous_ids, + commit, bundle, kind, pin_on_deploy, error); if (op == NULL) return FALSE; @@ -2567,6 +2571,7 @@ flatpak_transaction_add_install (FlatpakTransaction *self, FlatpakTransactionPrivate *priv = flatpak_transaction_get_instance_private (self); g_autoptr(FlatpakDecomposed) decomposed = NULL; const char *all_paths[] = { NULL }; + gboolean pin_on_deploy; g_return_val_if_fail (ref != NULL, FALSE); g_return_val_if_fail (remote != NULL, FALSE); @@ -2579,24 +2584,12 @@ flatpak_transaction_add_install (FlatpakTransaction *self, if (subpaths == NULL) subpaths = all_paths; - if (!flatpak_transaction_add_ref (self, remote, decomposed, subpaths, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL, NULL, NULL, error)) - return FALSE; - - /* Pin runtimes that are installed explicitly rather than pulled as - * dependencies so they are not automatically removed. */ - if (flatpak_decomposed_is_runtime (decomposed) && !priv->disable_auto_pin) - { - gboolean already_pinned; + pin_on_deploy = flatpak_decomposed_is_runtime (decomposed) && !priv->disable_auto_pin; - if (!flatpak_dir_config_append_pattern (priv->dir, "pinned", flatpak_decomposed_get_ref (decomposed), TRUE, &already_pinned, error)) - return FALSE; - - if (!already_pinned) - { - g_ptr_array_add (priv->added_pinned_runtimes, flatpak_decomposed_ref (decomposed)); - flatpak_installation_drop_caches (priv->installation, NULL, NULL); - } - } + if (!flatpak_transaction_add_ref (self, remote, decomposed, subpaths, NULL, NULL, + FLATPAK_TRANSACTION_OPERATION_INSTALL, + NULL, NULL, pin_on_deploy, error)) + return FALSE; return TRUE; } @@ -2651,7 +2644,7 @@ flatpak_transaction_add_rebase (FlatpakTransaction *self, if (dir_ref_is_installed (priv->dir, decomposed, &installed_origin, NULL)) remote = installed_origin; - return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, error); + return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, FALSE, error); } /** @@ -2745,7 +2738,7 @@ flatpak_transaction_add_update (FlatpakTransaction *self, return FALSE; /* Note: we implement the merge when subpaths == NULL in flatpak_transaction_add_ref() */ - return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, error); + return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, FALSE, error); } /** @@ -2771,7 +2764,7 @@ flatpak_transaction_add_uninstall (FlatpakTransaction *self, if (decomposed == NULL) return FALSE; - return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, error); + return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, error); } static gboolean @@ -2883,7 +2876,7 @@ flatpak_transaction_add_auto_install (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, auto_install_ref, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, - NULL, NULL, + NULL, NULL, FALSE, &local_error)) g_debug ("Failed to add auto-install ref %s: %s", flatpak_decomposed_get_ref (auto_install_ref), local_error->message); @@ -4266,7 +4259,7 @@ flatpak_transaction_resolve_bundles (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, ref, NULL, NULL, commit, FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE, - data->file, metadata, error)) + data->file, metadata, FALSE, error)) return FALSE; } @@ -4308,6 +4301,7 @@ _run_op_kind (FlatpakTransaction *self, FlatpakRemoteState *remote_state, /* nullable */ gboolean *out_needs_prune, gboolean *out_needs_triggers, + gboolean *out_needs_cache_drop, GCancellable *cancellable, GError **error) { @@ -4336,6 +4330,7 @@ _run_op_kind (FlatpakTransaction *self, priv->disable_static_deltas, priv->reinstall, priv->max_op >= APP_UPDATE, + op->pin_on_deploy, remote_state, op->ref, op->resolved_commit, (const char **) op->subpaths, @@ -4373,6 +4368,9 @@ _run_op_kind (FlatpakTransaction *self, if (flatpak_decomposed_is_app (op->ref)) *out_needs_triggers = TRUE; + + if (op->pin_on_deploy) + *out_needs_cache_drop = TRUE; } } else if (op->kind == FLATPAK_TRANSACTION_OPERATION_UPDATE) @@ -4648,7 +4646,7 @@ add_uninstall_unused_ops (FlatpakTransaction *self, uninstall_op = flatpak_transaction_add_op (self, origin, unused_ref, NULL, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, - NULL); + FALSE, NULL); if (uninstall_op) run_operation_last (uninstall_op); } @@ -4667,6 +4665,7 @@ flatpak_transaction_real_run (FlatpakTransaction *self, gboolean succeeded = TRUE; gboolean needs_prune = FALSE; gboolean needs_triggers = FALSE; + gboolean needs_cache_drop = FALSE; gboolean ready_res = FALSE; int i; @@ -4826,7 +4825,9 @@ flatpak_transaction_real_run (FlatpakTransaction *self, } /* Here we execute the operation in a helper function */ - if (res && !_run_op_kind (self, op, state, &needs_prune, &needs_triggers, cancellable, &local_error)) + if (res && !_run_op_kind (self, op, state, + &needs_prune, &needs_triggers, &needs_cache_drop, + cancellable, &local_error)) res = FALSE; if (res) @@ -4885,15 +4886,9 @@ flatpak_transaction_real_run (FlatpakTransaction *self, for (i = 0; i < priv->added_origin_remotes->len; i++) flatpak_dir_prune_origin_remote (priv->dir, g_ptr_array_index (priv->added_origin_remotes, i)); - for (i = 0; i < priv->added_pinned_runtimes->len; i++) - { - FlatpakDecomposed *pinned_runtime = g_ptr_array_index (priv->added_pinned_runtimes, i); - if (!dir_ref_is_installed (priv->dir, pinned_runtime, NULL, NULL)) - { - flatpak_dir_config_remove_pattern (priv->dir, "pinned", flatpak_decomposed_get_ref (pinned_runtime), NULL); - flatpak_installation_drop_caches (priv->installation, NULL, NULL); - } - } + /* Reload config in case it changed via system helper */ + if (needs_cache_drop || priv->added_origin_remotes->len > 0) + flatpak_installation_drop_caches (priv->installation, NULL, NULL); return succeeded; } diff --git a/system-helper/flatpak-system-helper.c b/system-helper/flatpak-system-helper.c index f83ecdf4..03410e84 100644 --- a/system-helper/flatpak-system-helper.c +++ b/system-helper/flatpak-system-helper.c @@ -399,6 +399,7 @@ handle_deploy (FlatpakSystemHelper *object, gboolean no_deploy; gboolean local_pull; gboolean reinstall; + gboolean update_pinned; g_autofree char *url = NULL; g_autoptr(OngoingPull) ongoing_pull = NULL; g_autofree gchar *src_dir = NULL; @@ -483,6 +484,7 @@ handle_deploy (FlatpakSystemHelper *object, no_deploy = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_NO_DEPLOY) != 0; local_pull = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_LOCAL_PULL) != 0; reinstall = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_REINSTALL) != 0; + update_pinned = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED) != 0; deploy_dir = flatpak_dir_get_if_deployed (system, ref, NULL, NULL); @@ -699,7 +701,7 @@ handle_deploy (FlatpakSystemHelper *object, if (!flatpak_dir_deploy_install (system, ref, arg_origin, (const char **) arg_subpaths, (const char **) arg_previous_ids, - reinstall, NULL, &error)) + reinstall, update_pinned, NULL, &error)) { flatpak_invocation_return_error (invocation, error, "Error deploying"); return G_DBUS_METHOD_INVOCATION_HANDLED; |