summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhaedrus Leeds <mwleeds@protonmail.com>2021-11-15 11:43:25 -0800
committerGitHub <noreply@github.com>2021-11-15 11:43:25 -0800
commit3cb380dfe5126676f4e2137a6a9a535c87634951 (patch)
tree58b926d110b8711ebff8930f999a2d0be02a6a37
parent9dbd265cdd68099b62119e06f94bab43cf1f5ea9 (diff)
parent6f5bb3597e14a28be5953d5d773c225a86039254 (diff)
downloadflatpak-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.h7
-rw-r--r--common/flatpak-dir.c18
-rw-r--r--common/flatpak-installation.c2
-rw-r--r--common/flatpak-transaction.c81
-rw-r--r--system-helper/flatpak-system-helper.c4
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;