diff options
author | Philip Withnall <withnall@endlessm.com> | 2020-04-28 16:00:47 +0100 |
---|---|---|
committer | Philip Withnall <withnall@endlessm.com> | 2020-04-30 13:14:45 +0100 |
commit | 82d0a3f50ab948e825d45928015444d2154a5eb4 (patch) | |
tree | 6c1da03accec9b97439b59cd9064f621b22e58d9 | |
parent | 1b8d5ecfe3801c2e99a63a7a12efbdf494c3d635 (diff) | |
download | flatpak-82d0a3f50ab948e825d45928015444d2154a5eb4.tar.gz |
flatpak-transaction: Change related_to_op to related_to_ops
Since a single runtime (for example) can be related-to several apps,
that needs to be representable in the data format.
This is an API break, but only of API which has not been released yet.
See https://github.com/flatpak/flatpak/pull/3568#issuecomment-618251958
Signed-off-by: Philip Withnall <withnall@endlessm.com>
-rw-r--r-- | common/flatpak-installation.c | 35 | ||||
-rw-r--r-- | common/flatpak-transaction.c | 47 | ||||
-rw-r--r-- | common/flatpak-transaction.h | 2 | ||||
-rw-r--r-- | common/flatpak-utils-private.h | 4 |
4 files changed, 56 insertions, 32 deletions
diff --git a/common/flatpak-installation.c b/common/flatpak-installation.c index 3668ee04..5e030033 100644 --- a/common/flatpak-installation.c +++ b/common/flatpak-installation.c @@ -987,7 +987,7 @@ transaction_ready (FlatpakTransaction *transaction, for (GList *l = ops; l != NULL; l = l->next) { FlatpakTransactionOperation *op = l->data; - FlatpakTransactionOperation *related_to_op = flatpak_transaction_operation_get_related_to_op (op); + GPtrArray *op_related_to_ops = flatpak_transaction_operation_get_related_to_ops (op); /* (element-type FlatpakTransactionOperation) */ FlatpakTransactionOperationType type = flatpak_transaction_operation_get_operation_type (op); /* There is currently no way for a set of updates to lead to an @@ -1002,7 +1002,7 @@ transaction_ready (FlatpakTransaction *transaction, g_hash_table_insert (*related_to_ops, g_object_ref (op), - related_to_op ? g_object_ref (related_to_op) : NULL); + op_related_to_ops ? g_ptr_array_ref (op_related_to_ops) : NULL); } g_list_free_full (ops, g_object_unref); @@ -1039,7 +1039,7 @@ installed_ref_compare (gconstpointer _iref_a, * again via an update operation in #FlatpakTransaction. * * In case more than one app needs an update of the same runtime or extension, - * it is possible that only one of the apps will be returned by this function. + * this function will return all of those apps. * * Returns: (transfer container) (element-type FlatpakInstalledRef): a GPtrArray of * #FlatpakInstalledRef instances, or %NULL on error @@ -1053,7 +1053,7 @@ flatpak_installation_list_installed_refs_for_update (FlatpakInstallation *self, g_autoptr(GHashTable) installed_refs_hash = NULL; /* (element-type utf8 FlatpakInstalledRef) */ g_autoptr(GPtrArray) installed_refs_for_update = NULL; /* (element-type FlatpakInstalledRef) */ g_autoptr(GHashTable) installed_refs_for_update_set = NULL; /* (element-type utf8) */ - g_autoptr(GHashTable) related_to_ops = NULL; /* (element-type FlatpakTransactionOperation FlatpakTransactionOperation) */ + g_autoptr(GHashTable) related_to_ops = NULL; /* (element-type FlatpakTransactionOperation GPtrArray<FlatpakTransactionOperation>) */ g_autoptr(FlatpakTransaction) transaction = NULL; g_autoptr(GError) local_error = NULL; @@ -1094,7 +1094,7 @@ flatpak_installation_list_installed_refs_for_update (FlatpakInstallation *self, } } - related_to_ops = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, null_safe_g_object_unref); + related_to_ops = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, null_safe_g_ptr_array_unref); g_signal_connect (transaction, "ready", G_CALLBACK (transaction_ready), &related_to_ops); @@ -1122,7 +1122,7 @@ flatpak_installation_list_installed_refs_for_update (FlatpakInstallation *self, */ GLNX_HASH_TABLE_FOREACH_KV (related_to_ops, FlatpakTransactionOperation *, op, - FlatpakTransactionOperation *, related_to_op) + GPtrArray *, op_related_to_ops) { const char *op_ref = flatpak_transaction_operation_get_ref (op); FlatpakInstalledRef *installed_ref; @@ -1141,18 +1141,23 @@ flatpak_installation_list_installed_refs_for_update (FlatpakInstallation *self, g_object_ref (installed_ref)); } } - else if (related_to_op != NULL) + else { - const char *related_op_ref = flatpak_transaction_operation_get_ref (related_to_op); - if (!g_hash_table_contains (installed_refs_for_update_set, related_op_ref)) + for (gsize i = 0; op_related_to_ops != NULL && i < op_related_to_ops->len; i++) { - installed_ref = g_hash_table_lookup (installed_refs_hash, related_op_ref); - if (installed_ref != NULL) + FlatpakTransactionOperation *related_to_op = g_ptr_array_index (op_related_to_ops, i); + + const char *related_op_ref = flatpak_transaction_operation_get_ref (related_to_op); + if (!g_hash_table_contains (installed_refs_for_update_set, related_op_ref)) { - g_hash_table_add (installed_refs_for_update_set, (char *)related_op_ref); - g_debug ("%s: Installed ref %s needs update", G_STRFUNC, related_op_ref); - g_ptr_array_add (installed_refs_for_update, - g_object_ref (installed_ref)); + installed_ref = g_hash_table_lookup (installed_refs_hash, related_op_ref); + if (installed_ref != NULL) + { + g_hash_table_add (installed_refs_for_update_set, (char *)related_op_ref); + g_debug ("%s: Installed ref %s needs update", G_STRFUNC, related_op_ref); + g_ptr_array_add (installed_refs_for_update, + g_object_ref (installed_ref)); + } } } } diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c index 9d22c6df..6fd16dba 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c @@ -127,7 +127,10 @@ struct _FlatpakTransactionOperation int run_after_prio; /* Higher => run later (when it becomes runnable). Used to run related ops (runtime extensions) before deps (apps using the runtime) */ GList *run_before_ops; FlatpakTransactionOperation *fail_if_op_fails; /* main app/runtime for related extensions, runtime for apps */ - FlatpakTransactionOperation *related_to_op; /* main app/runtime for related extensions, app for runtimes */ + /* main app/runtime for related extensions, app for runtimes; could be multiple + * related-to-ops if this op is for a runtime which is needed by multiple apps + * in the transaction: */ + GPtrArray *related_to_ops; /* (element-type FlatpakTransactionOperation) (nullable) */ }; typedef struct _FlatpakTransactionPrivate FlatpakTransactionPrivate; @@ -603,6 +606,8 @@ flatpak_transaction_operation_finalize (GObject *object) g_key_file_unref (self->resolved_old_metakey); g_free (self->resolved_token); g_list_free (self->run_before_ops); + if (self->related_to_ops) + g_ptr_array_unref (self->related_to_ops); if (self->summary_metadata) g_variant_unref (self->summary_metadata); @@ -676,27 +681,41 @@ flatpak_transaction_operation_get_ref (FlatpakTransactionOperation *self) } /** - * flatpak_transaction_operation_get_related_to_op: + * flatpak_transaction_operation_get_related_to_ops: * @self: a #FlatpakTransactionOperation * - * Gets the operation which caused this operation to be added to the - * transaction. In the case of a runtime, it's the app whose runtime it is. In + * Gets the operations which caused this operation to be added to the + * transaction. In the case of a runtime, it's the apps whose runtime it is (and + * this could be multiple apps, if they all require the same runtime). In * the case of a related ref such as an extension, it's the main app or * runtime. In the case of a main app or something added to the transaction by - * flatpak_transaction_add_ref(), %NULL will be returned. + * flatpak_transaction_add_ref(), %NULL or an empty array will be returned. * * Note that an op will be returned even if it’s marked as to be skipped when * the transaction is run. Check that using * flatpak_transaction_operation_get_is_skipped(). * - * Returns: (transfer none) (nullable): the #FlatpakTransactionOperation this - * one is related to, or %NULL + * Elements in the returned array are only safe to access while the parent + * #FlatpakTransaction is alive. + * + * Returns: (transfer none) (element-type FlatpakTransactionOperation) (nullable): the + * #FlatpakTransactionOperations this one is related to (may be %NULL or an + * empty array, which are equivalent) * Since: 1.7.3 */ -FlatpakTransactionOperation * -flatpak_transaction_operation_get_related_to_op (FlatpakTransactionOperation *self) +GPtrArray * +flatpak_transaction_operation_get_related_to_ops (FlatpakTransactionOperation *self) +{ + return self->related_to_ops; +} + +static void +flatpak_transaction_operation_add_related_to_op (FlatpakTransactionOperation *op, + FlatpakTransactionOperation *related_op) { - return self->related_to_op; + if (op->related_to_ops == NULL) + op->related_to_ops = g_ptr_array_new (); + g_ptr_array_add (op->related_to_ops, related_op); } /** @@ -709,7 +728,7 @@ flatpak_transaction_operation_get_related_to_op (FlatpakTransactionOperation *se * updated but no update is available. By default, skipped * operations are not returned by flatpak_transaction_get_operations() — but * they can be accessed by traversing the operation graph using - * flatpak_transaction_operation_get_related_to_op(). + * flatpak_transaction_operation_get_related_to_ops(). * * Returns: %TRUE if the operation has been marked as to skip, %FALSE otherwise * Since: 1.7.3 @@ -1828,7 +1847,7 @@ add_related (FlatpakTransaction *self, FLATPAK_TRANSACTION_OPERATION_UNINSTALL); related_op->non_fatal = TRUE; related_op->fail_if_op_fails = op; - related_op->related_to_op = op; + flatpak_transaction_operation_add_related_to_op (related_op, op); run_operation_before (op, related_op, 1); } } @@ -1848,7 +1867,7 @@ add_related (FlatpakTransaction *self, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE); related_op->non_fatal = TRUE; related_op->fail_if_op_fails = op; - related_op->related_to_op = op; + flatpak_transaction_operation_add_related_to_op (related_op, op); run_operation_before (related_op, op, 1); } } @@ -1986,7 +2005,7 @@ add_deps (FlatpakTransaction *self, runtime_op->ref, op->ref); op->fail_if_op_fails = runtime_op; - runtime_op->related_to_op = op; + flatpak_transaction_operation_add_related_to_op (runtime_op, op); run_operation_before (runtime_op, op, 2); } diff --git a/common/flatpak-transaction.h b/common/flatpak-transaction.h index 5307393f..ea3d7bb7 100644 --- a/common/flatpak-transaction.h +++ b/common/flatpak-transaction.h @@ -174,7 +174,7 @@ FlatpakTransactionOperationType flatpak_transaction_operation_get_operation_type FLATPAK_EXTERN const char * flatpak_transaction_operation_get_ref (FlatpakTransactionOperation *self); FLATPAK_EXTERN -FlatpakTransactionOperation * flatpak_transaction_operation_get_related_to_op (FlatpakTransactionOperation *self); +GPtrArray * flatpak_transaction_operation_get_related_to_ops (FlatpakTransactionOperation *self); FLATPAK_EXTERN gboolean flatpak_transaction_operation_get_is_skipped (FlatpakTransactionOperation *self); FLATPAK_EXTERN diff --git a/common/flatpak-utils-private.h b/common/flatpak-utils-private.h index 3fc1a243..27893f03 100644 --- a/common/flatpak-utils-private.h +++ b/common/flatpak-utils-private.h @@ -873,9 +873,9 @@ gboolean flatpak_repo_resolve_rev (OstreeRepo *repo, GError **error); static inline void -null_safe_g_object_unref (gpointer data) +null_safe_g_ptr_array_unref (gpointer data) { - g_clear_object (&data); + g_clear_pointer (&data, g_ptr_array_unref); } #define FLATPAK_MESSAGE_ID "c7b39b1e006b464599465e105b361485" |