summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <withnall@endlessm.com>2020-04-28 16:00:47 +0100
committerPhilip Withnall <withnall@endlessm.com>2020-04-30 13:14:45 +0100
commit82d0a3f50ab948e825d45928015444d2154a5eb4 (patch)
tree6c1da03accec9b97439b59cd9064f621b22e58d9
parent1b8d5ecfe3801c2e99a63a7a12efbdf494c3d635 (diff)
downloadflatpak-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.c35
-rw-r--r--common/flatpak-transaction.c47
-rw-r--r--common/flatpak-transaction.h2
-rw-r--r--common/flatpak-utils-private.h4
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"