[PackageKit] Fix several reported problems with the offline-update funtionality.
Richard Hughes
rhughes at fedoraproject.org
Mon Jul 2 16:00:18 UTC 2012
commit c92024ccb5852e4c152e1d96c4b7f2116e42b3c1
Author: Richard Hughes <richard at hughsie.com>
Date: Mon Jul 2 16:58:33 2012 +0100
Fix several reported problems with the offline-update funtionality.
PackageKit-0.8.1-master.patch | 498 +++++++++++++++++++++++++++++------------
PackageKit.spec | 5 +-
2 files changed, 363 insertions(+), 140 deletions(-)
---
diff --git a/PackageKit-0.8.1-master.patch b/PackageKit-0.8.1-master.patch
index d486aa8..832e17e 100644
--- a/PackageKit-0.8.1-master.patch
+++ b/PackageKit-0.8.1-master.patch
@@ -132,6 +132,63 @@ index 491f044..896d32b 100755
pct = div * (ts_current - 1) + pct_start + ((div / 100.0) * val)
self.base.percentage(pct)
+diff --git a/client/pk-console.c b/client/pk-console.c
+index ade188e..edbe593 100644
+--- a/client/pk-console.c
++++ b/client/pk-console.c
+@@ -978,6 +978,41 @@ out:
+ }
+
+ /**
++ * pk_console_update_system:
++ **/
++static gboolean
++pk_console_update_system (GError **error)
++{
++ gboolean ret = TRUE;
++ gchar **package_ids = NULL;
++ PkPackageSack *sack = NULL;
++ PkResults *results;
++
++ /* get the current updates */
++ results = pk_task_get_updates_sync (PK_TASK (task), 0, cancellable,
++ (PkProgressCallback) pk_console_progress_cb, NULL,
++ error);
++ if (results == NULL) {
++ ret = FALSE;
++ goto out;
++ }
++
++ /* do the async action */
++ sack = pk_results_get_package_sack (results);
++ package_ids = pk_package_sack_get_ids (sack);
++ pk_task_update_packages_async (PK_TASK(task), package_ids, cancellable,
++ (PkProgressCallback) pk_console_progress_cb, NULL,
++ (GAsyncReadyCallback) pk_console_finished_cb, NULL);
++out:
++ if (sack != NULL)
++ g_object_unref (sack);
++ if (results != NULL)
++ g_object_unref (results);
++ g_strfreev (package_ids);
++ return ret;
++}
++
++/**
+ * pk_console_get_requires:
+ **/
+ static gboolean
+@@ -1565,9 +1600,7 @@ main (int argc, char *argv[])
+ } else if (strcmp (mode, "update") == 0) {
+ if (value == NULL) {
+ /* do the system update */
+- pk_task_update_system_async (PK_TASK(task), cancellable,
+- (PkProgressCallback) pk_console_progress_cb, NULL,
+- (GAsyncReadyCallback) pk_console_finished_cb, NULL);
++ nowait = !pk_console_update_system (&error);
+ } else {
+ nowait = !pk_console_update_packages (argv+2, &error);
+ }
diff --git a/contrib/systemd-updates/pk-offline-update.c b/contrib/systemd-updates/pk-offline-update.c
index 5d6604d..a6fdaaf 100644
--- a/contrib/systemd-updates/pk-offline-update.c
@@ -311,7 +368,7 @@ index b9ae2b8..477552f 100644
}
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
-index afdd563..c5a29f1 100644
+index afdd563..1818723 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -689,23 +689,24 @@ pk_transaction_category_cb (PkBackend *backend,
@@ -344,122 +401,81 @@ index afdd563..c5a29f1 100644
NULL);
}
-@@ -1106,14 +1107,75 @@ pk_transaction_set_full_paths (PkTransaction *transaction,
+@@ -1058,6 +1059,18 @@ pk_transaction_get_package_ids (PkTransaction *transaction)
}
/**
-+ * pk_transaction_get_existing_prepared_updates:
++ * pk_transaction_get_transaction_flags:
++ *
++ * Returns: transaction flags for the transaction
+ **/
-+static GPtrArray *
-+pk_transaction_get_existing_prepared_updates (const gchar *filename)
++PkBitfield
++pk_transaction_get_transaction_flags (PkTransaction *transaction)
+{
-+ gboolean ret;
-+ gchar **package_ids = NULL;
-+ gchar *packages_data = NULL;
-+ GError *error = NULL;
-+ GPtrArray *packages;
-+ guint i;
-+
-+ /* always return a valid array, even for failure */
-+ packages = g_ptr_array_new_with_free_func (g_free);
-+
-+ /* does the file exist ? */
-+ if (!g_file_test (filename, G_FILE_TEST_EXISTS))
-+ goto out;
-+
-+ /* get the list of packages to update */
-+ ret = g_file_get_contents (filename,
-+ &packages_data,
-+ NULL,
-+ &error);
-+ if (!ret) {
-+ g_warning ("failed to read: %s", error->message);
-+ g_error_free (error);
-+ goto out;
-+ }
-+
-+ /* add them to the new array */
-+ package_ids = g_strsplit (packages_data, "\n", -1);
-+ for (i = 0; package_ids[i] != NULL; i++)
-+ g_ptr_array_add (packages, g_strdup (package_ids[i]));
-+out:
-+ g_free (packages_data);
-+ g_strfreev (package_ids);
-+ return packages;
-+}
-+
-+/**
-+ * pk_transaction_array_str_exists:
-+ **/
-+static gboolean
-+pk_transaction_array_str_exists (GPtrArray *array, const gchar *str)
-+{
-+ guint i;
-+ const gchar *tmp;
-+ for (i = 0; i < array->len; i++) {
-+ tmp = g_ptr_array_index (array, i);
-+ if (g_strcmp0 (tmp, str) == 0)
-+ return TRUE;
-+ }
-+ return FALSE;
++ g_return_val_if_fail (PK_IS_TRANSACTION (transaction), 0);
++ return transaction->priv->cached_transaction_flags;
+}
+
+/**
- * pk_transaction_write_prepared_file:
+ * pk_transaction_set_package_ids:
**/
- static void
- pk_transaction_write_prepared_file (PkTransaction *transaction)
- {
- gboolean ret;
-+ gchar **package_ids;
-+ gchar *packages_str = NULL;
- gchar *path;
- GError *error = NULL;
-+ GPtrArray *packages;
-+ guint i;
-
- /* not interesting to us */
- if (transaction->priv->role != PK_ROLE_ENUM_UPDATE_PACKAGES &&
-@@ -1121,14 +1183,28 @@ pk_transaction_write_prepared_file (PkTransaction *transaction)
- return;
- }
+ void
+@@ -1106,40 +1119,6 @@ pk_transaction_set_full_paths (PkTransaction *transaction,
+ }
+ /**
+- * pk_transaction_write_prepared_file:
+- **/
+-static void
+-pk_transaction_write_prepared_file (PkTransaction *transaction)
+-{
+- gboolean ret;
+- gchar *path;
+- GError *error = NULL;
+-
+- /* not interesting to us */
+- if (transaction->priv->role != PK_ROLE_ENUM_UPDATE_PACKAGES &&
+- transaction->priv->role != PK_ROLE_ENUM_UPDATE_SYSTEM) {
+- return;
+- }
+-
- /* write filename */
-+ /* get the existing prepared updates */
- path = g_build_filename (LOCALSTATEDIR,
- "lib",
- "PackageKit",
- "prepared-update",
- NULL);
-+ packages = pk_transaction_get_existing_prepared_updates (path);
-+
-+ /* add any new ones */
-+ package_ids = transaction->priv->cached_package_ids;
-+ for (i = 0; package_ids[i] != NULL; i++) {
-+ if (!pk_transaction_array_str_exists (packages, package_ids[i])) {
-+ g_ptr_array_add (packages,
-+ g_strdup (package_ids[i]));
-+ }
-+ }
-+ g_ptr_array_add (packages, NULL);
-+
-+ /* write filename */
-+ packages_str = g_strjoinv ("\n", (gchar **) packages->pdata);
- ret = g_file_set_contents (path,
+- path = g_build_filename (LOCALSTATEDIR,
+- "lib",
+- "PackageKit",
+- "prepared-update",
+- NULL);
+- ret = g_file_set_contents (path,
- pk_role_enum_to_string (transaction->priv->role),
-+ packages_str,
- -1,
- &error);
- if (!ret) {
-@@ -1136,6 +1212,7 @@ pk_transaction_write_prepared_file (PkTransaction *transaction)
- path, error->message);
- g_error_free (error);
- }
-+ g_free (packages_str);
- g_free (path);
- }
-
-@@ -1751,7 +1828,7 @@ pk_transaction_transaction_cb (PkTransactionDb *tdb,
+- -1,
+- &error);
+- if (!ret) {
+- g_warning ("failed to write %s: %s",
+- path, error->message);
+- g_error_free (error);
+- }
+- g_free (path);
+-}
+-
+-/**
+ * pk_transaction_finished_cb:
+ **/
+ static void
+@@ -1244,13 +1223,6 @@ pk_transaction_finished_cb (PkBackend *backend, PkExitEnum exit_enum, PkTransact
+ if (exit_enum == PK_EXIT_ENUM_SUCCESS)
+ pk_transaction_db_action_time_reset (transaction->priv->transaction_db, transaction->priv->role);
+
+- /* write notification files if anything is pending */
+- if (exit_enum == PK_EXIT_ENUM_SUCCESS &&
+- pk_bitfield_contain (transaction->priv->cached_transaction_flags,
+- PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD)) {
+- pk_transaction_write_prepared_file (transaction);
+- }
+-
+ /* did we finish okay? */
+ if (exit_enum == PK_EXIT_ENUM_SUCCESS)
+ pk_transaction_db_set_finished (transaction->priv->transaction_db, transaction->priv->tid, TRUE, time_ms);
+@@ -1751,7 +1723,7 @@ pk_transaction_transaction_cb (PkTransactionDb *tdb,
transaction->priv->tid,
PK_DBUS_INTERFACE_TRANSACTION,
"Transaction",
@@ -468,7 +484,7 @@ index afdd563..c5a29f1 100644
tid,
timespec,
succeeded,
-@@ -2880,6 +2957,21 @@ pk_transaction_obtain_authorization (PkTransaction *transaction,
+@@ -2880,6 +2852,21 @@ pk_transaction_obtain_authorization (PkTransaction *transaction,
g_return_val_if_fail (priv->sender != NULL, FALSE);
@@ -483,14 +499,14 @@ index afdd563..c5a29f1 100644
+ PK_TRANSACTION_ERROR_COMMIT_FAILED,
+ "Could not commit to a transaction object");
+ pk_transaction_release_tid (transaction);
-+ goto out;
+ }
++ goto out;
+ }
+
/* we should always have subject */
if (priv->subject == NULL) {
g_set_error (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_REFUSED_BY_POLICY,
-@@ -3029,6 +3121,18 @@ pk_transaction_get_role (PkTransaction *transaction)
+@@ -3029,6 +3016,18 @@ pk_transaction_get_role (PkTransaction *transaction)
}
/**
@@ -509,7 +525,7 @@ index afdd563..c5a29f1 100644
* pk_transaction_dbus_return:
**/
static void
-@@ -3065,7 +3169,6 @@ pk_transaction_accept_eula (PkTransaction *transaction,
+@@ -3065,7 +3064,6 @@ pk_transaction_accept_eula (PkTransaction *transaction,
g_return_if_fail (PK_IS_TRANSACTION (transaction));
g_return_if_fail (transaction->priv->tid != NULL);
@@ -517,7 +533,7 @@ index afdd563..c5a29f1 100644
g_variant_get (params, "(&s)",
&eula_id);
-@@ -3077,6 +3180,8 @@ pk_transaction_accept_eula (PkTransaction *transaction,
+@@ -3077,6 +3075,8 @@ pk_transaction_accept_eula (PkTransaction *transaction,
goto out;
}
@@ -526,7 +542,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
PK_ROLE_ENUM_ACCEPT_EULA,
-@@ -3319,7 +3424,7 @@ pk_transaction_download_packages (PkTransaction *transaction,
+@@ -3319,7 +3319,7 @@ pk_transaction_download_packages (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_package_ids = g_strdupv (package_ids);
transaction->priv->cached_directory = g_strdup (directory);
@@ -535,7 +551,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3360,7 +3465,7 @@ pk_transaction_get_categories (PkTransaction *transaction,
+@@ -3360,7 +3360,7 @@ pk_transaction_get_categories (PkTransaction *transaction,
goto out;
}
@@ -544,7 +560,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3434,7 +3539,7 @@ pk_transaction_get_depends (PkTransaction *transaction,
+@@ -3434,7 +3434,7 @@ pk_transaction_get_depends (PkTransaction *transaction,
transaction->priv->cached_filters = filter;
transaction->priv->cached_package_ids = g_strdupv (package_ids);
transaction->priv->cached_force = recursive;
@@ -553,7 +569,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3504,7 +3609,7 @@ pk_transaction_get_details (PkTransaction *transaction,
+@@ -3504,7 +3504,7 @@ pk_transaction_get_details (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_package_ids = g_strdupv (package_ids);
@@ -562,7 +578,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3545,7 +3650,7 @@ pk_transaction_get_distro_upgrades (PkTransaction *transaction,
+@@ -3545,7 +3545,7 @@ pk_transaction_get_distro_upgrades (PkTransaction *transaction,
}
/* save so we can run later */
@@ -571,7 +587,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3613,7 +3718,7 @@ pk_transaction_get_files (PkTransaction *transaction,
+@@ -3613,7 +3613,7 @@ pk_transaction_get_files (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_package_ids = g_strdupv (package_ids);
@@ -580,7 +596,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3659,7 +3764,7 @@ pk_transaction_get_packages (PkTransaction *transaction,
+@@ -3659,7 +3659,7 @@ pk_transaction_get_packages (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
@@ -589,7 +605,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3692,7 +3797,7 @@ pk_transaction_get_old_transactions (PkTransaction *transaction,
+@@ -3692,7 +3692,7 @@ pk_transaction_get_old_transactions (PkTransaction *transaction,
g_debug ("GetOldTransactions method called");
@@ -598,7 +614,7 @@ index afdd563..c5a29f1 100644
pk_transaction_db_get_list (transaction->priv->transaction_db, number);
idle_id = g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
g_source_set_name_by_id (idle_id, "[PkTransaction] finished from get-old-transactions");
-@@ -3731,7 +3836,7 @@ pk_transaction_get_repo_list (PkTransaction *transaction,
+@@ -3731,7 +3731,7 @@ pk_transaction_get_repo_list (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
@@ -607,7 +623,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3806,7 +3911,7 @@ pk_transaction_get_requires (PkTransaction *transaction,
+@@ -3806,7 +3806,7 @@ pk_transaction_get_requires (PkTransaction *transaction,
transaction->priv->cached_filters = filter;
transaction->priv->cached_package_ids = g_strdupv (package_ids);
transaction->priv->cached_force = recursive;
@@ -616,7 +632,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -3875,7 +3980,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction,
+@@ -3875,7 +3875,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_package_ids = g_strdupv (package_ids);
@@ -625,7 +641,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -4004,7 +4109,7 @@ pk_transaction_get_updates (PkTransaction *transaction,
+@@ -4004,7 +4004,7 @@ pk_transaction_get_updates (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
@@ -634,7 +650,7 @@ index afdd563..c5a29f1 100644
/* try and reuse cache */
ret = pk_transaction_try_emit_cache (transaction);
-@@ -4166,7 +4271,7 @@ pk_transaction_install_files (PkTransaction *transaction,
+@@ -4166,7 +4166,7 @@ pk_transaction_install_files (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_transaction_flags = transaction_flags;
transaction->priv->cached_full_paths = g_strdupv (full_paths);
@@ -643,7 +659,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4239,7 +4344,7 @@ pk_transaction_install_packages (PkTransaction *transaction,
+@@ -4239,7 +4239,7 @@ pk_transaction_install_packages (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_transaction_flags = transaction_flags;
transaction->priv->cached_package_ids = g_strdupv (package_ids);
@@ -652,7 +668,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4309,7 +4414,7 @@ pk_transaction_install_signature (PkTransaction *transaction,
+@@ -4309,7 +4309,7 @@ pk_transaction_install_signature (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_package_id = g_strdup (package_id);
transaction->priv->cached_key_id = g_strdup (key_id);
@@ -661,7 +677,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4357,7 +4462,7 @@ pk_transaction_refresh_cache (PkTransaction *transaction,
+@@ -4357,7 +4357,7 @@ pk_transaction_refresh_cache (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_force = force;
@@ -670,7 +686,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4435,7 +4540,7 @@ pk_transaction_remove_packages (PkTransaction *transaction,
+@@ -4435,7 +4435,7 @@ pk_transaction_remove_packages (PkTransaction *transaction,
transaction->priv->cached_package_ids = g_strdupv (package_ids);
transaction->priv->cached_allow_deps = allow_deps;
transaction->priv->cached_autoremove = autoremove;
@@ -679,7 +695,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4491,7 +4596,7 @@ pk_transaction_repo_enable (PkTransaction *transaction,
+@@ -4491,7 +4491,7 @@ pk_transaction_repo_enable (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_repo_id = g_strdup (repo_id);
transaction->priv->cached_enabled = enabled;
@@ -688,7 +704,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4550,7 +4655,7 @@ pk_transaction_repo_set_data (PkTransaction *transaction,
+@@ -4550,7 +4550,7 @@ pk_transaction_repo_set_data (PkTransaction *transaction,
transaction->priv->cached_repo_id = g_strdup (repo_id);
transaction->priv->cached_parameter = g_strdup (parameter);
transaction->priv->cached_value = g_strdup (value);
@@ -697,7 +713,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -4630,7 +4735,7 @@ pk_transaction_resolve (PkTransaction *transaction,
+@@ -4630,7 +4630,7 @@ pk_transaction_resolve (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_package_ids = g_strdupv (packages);
transaction->priv->cached_filters = filter;
@@ -706,7 +722,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -4687,7 +4792,7 @@ pk_transaction_search_details (PkTransaction *transaction,
+@@ -4687,7 +4687,7 @@ pk_transaction_search_details (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
transaction->priv->cached_values = g_strdupv (values);
@@ -715,7 +731,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -4754,7 +4859,7 @@ pk_transaction_search_files (PkTransaction *transaction,
+@@ -4754,7 +4754,7 @@ pk_transaction_search_files (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
transaction->priv->cached_values = g_strdupv (values);
@@ -724,7 +740,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -4821,7 +4926,7 @@ pk_transaction_search_groups (PkTransaction *transaction,
+@@ -4821,7 +4821,7 @@ pk_transaction_search_groups (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
transaction->priv->cached_values = g_strdupv (values);
@@ -733,7 +749,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -4877,7 +4982,7 @@ pk_transaction_search_names (PkTransaction *transaction,
+@@ -4877,7 +4877,7 @@ pk_transaction_search_names (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_filters = filter;
transaction->priv->cached_values = g_strdupv (values);
@@ -742,7 +758,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -5112,7 +5217,7 @@ pk_transaction_update_packages (PkTransaction *transaction,
+@@ -5112,7 +5112,7 @@ pk_transaction_update_packages (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_transaction_flags = transaction_flags;
transaction->priv->cached_package_ids = g_strdupv (package_ids);
@@ -751,7 +767,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -5165,7 +5270,7 @@ pk_transaction_update_system (PkTransaction *transaction,
+@@ -5165,7 +5165,7 @@ pk_transaction_update_system (PkTransaction *transaction,
}
transaction->priv->cached_transaction_flags = transaction_flags;
@@ -760,7 +776,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -5225,7 +5330,7 @@ pk_transaction_what_provides (PkTransaction *transaction,
+@@ -5225,7 +5225,7 @@ pk_transaction_what_provides (PkTransaction *transaction,
transaction->priv->cached_filters = filter;
transaction->priv->cached_values = g_strdupv (values);
transaction->priv->cached_provides = provides;
@@ -769,7 +785,7 @@ index afdd563..c5a29f1 100644
/* try to commit this */
ret = pk_transaction_commit (transaction);
-@@ -5274,7 +5379,7 @@ pk_transaction_upgrade_system (PkTransaction *transaction,
+@@ -5274,7 +5274,7 @@ pk_transaction_upgrade_system (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_value = g_strdup (distro_id);
transaction->priv->cached_provides = upgrade_kind;
@@ -778,7 +794,7 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
-@@ -5319,7 +5424,7 @@ pk_transaction_repair_system (PkTransaction *transaction,
+@@ -5319,7 +5319,7 @@ pk_transaction_repair_system (PkTransaction *transaction,
/* save so we can run later */
transaction->priv->cached_transaction_flags = transaction_flags;
@@ -787,6 +803,42 @@ index afdd563..c5a29f1 100644
/* try to get authorization */
ret = pk_transaction_obtain_authorization (transaction,
+diff --git a/src/pk-transaction.h b/src/pk-transaction.h
+index 4f247b3..79c68a5 100644
+--- a/src/pk-transaction.h
++++ b/src/pk-transaction.h
+@@ -82,6 +82,7 @@ void pk_transaction_set_backend (PkTransaction *transaction,
+ PkBackend *backend);
+ PkResults *pk_transaction_get_results (PkTransaction *transaction);
+ gchar **pk_transaction_get_package_ids (PkTransaction *transaction);
++PkBitfield pk_transaction_get_transaction_flags (PkTransaction *transaction);
+ void pk_transaction_set_package_ids (PkTransaction *transaction,
+ gchar **package_ids);
+ gchar **pk_transaction_get_values (PkTransaction *transaction);
+diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
+index c1bf30d..f693c2c 100644
+--- a/src/plugins/Makefile.am
++++ b/src/plugins/Makefile.am
+@@ -58,6 +58,7 @@ plugin_LTLIBRARIES = \
+ libpk_plugin-update-package-cache.la \
+ libpk_plugin-no-update-process.la \
+ libpk_plugin-scan-desktop-files.la \
++ libpk_plugin-systemd-updates.la \
+ libpk_plugin-update-check-processes.la \
+ libpk_plugin-check-shared-libraries-in-use.la \
+ libpk_plugin-clear-system-update.la \
+@@ -68,6 +69,11 @@ libpk_plugin_example_la_LIBADD = $(PK_PLUGIN_LIBS)
+ libpk_plugin_example_la_LDFLAGS = -module -avoid-version
+ libpk_plugin_example_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(WARNINGFLAGS_C)
+
++libpk_plugin_systemd_updates_la_SOURCES = pk-plugin-systemd-updates.c
++libpk_plugin_systemd_updates_la_LIBADD = $(PK_PLUGIN_LIBS)
++libpk_plugin_systemd_updates_la_LDFLAGS = -module -avoid-version
++libpk_plugin_systemd_updates_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(WARNINGFLAGS_C)
++
+ libpk_plugin_scripts_la_SOURCES = pk-plugin-scripts.c
+ libpk_plugin_scripts_la_LIBADD = $(PK_PLUGIN_LIBS)
+ libpk_plugin_scripts_la_LDFLAGS = -module -avoid-version
diff --git a/src/plugins/pk-plugin-clear-firmware-requests.c b/src/plugins/pk-plugin-clear-firmware-requests.c
index 8b4216a..f9326f4 100644
--- a/src/plugins/pk-plugin-clear-firmware-requests.c
@@ -800,3 +852,171 @@ index 8b4216a..f9326f4 100644
g_debug ("clearing udev firmware requests at %s", filename);
ret = pk_directory_remove_contents (filename);
if (!ret)
+diff --git a/src/plugins/pk-plugin-systemd-updates.c b/src/plugins/pk-plugin-systemd-updates.c
+new file mode 100644
+index 0000000..b0abc8d
+--- /dev/null
++++ b/src/plugins/pk-plugin-systemd-updates.c
+@@ -0,0 +1,162 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2012 Richard Hughes <richard at hughsie.com>
++ *
++ * Licensed under the GNU General Public License Version 2
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ */
++
++#include <config.h>
++#include <gio/gio.h>
++#include <pk-plugin.h>
++
++/**
++ * pk_plugin_get_description:
++ */
++const gchar *
++pk_plugin_get_description (void)
++{
++ return "A plugin to write the prepared-updates file";
++}
++
++/**
++ * pk_plugin_get_existing_prepared_updates:
++ **/
++static GPtrArray *
++pk_plugin_get_existing_prepared_updates (const gchar *filename)
++{
++ gboolean ret;
++ gchar **package_ids = NULL;
++ gchar *packages_data = NULL;
++ GError *error = NULL;
++ GPtrArray *packages;
++ guint i;
++
++ /* always return a valid array, even for failure */
++ packages = g_ptr_array_new_with_free_func (g_free);
++
++ /* does the file exist ? */
++ if (!g_file_test (filename, G_FILE_TEST_EXISTS))
++ goto out;
++
++ /* get the list of packages to update */
++ ret = g_file_get_contents (filename,
++ &packages_data,
++ NULL,
++ &error);
++ if (!ret) {
++ g_warning ("failed to read: %s", error->message);
++ g_error_free (error);
++ goto out;
++ }
++
++ /* add them to the new array */
++ package_ids = g_strsplit (packages_data, "\n", -1);
++ for (i = 0; package_ids[i] != NULL; i++)
++ g_ptr_array_add (packages, g_strdup (package_ids[i]));
++out:
++ g_free (packages_data);
++ g_strfreev (package_ids);
++ return packages;
++}
++
++/**
++ * pk_plugin_array_str_exists:
++ **/
++static gboolean
++pk_plugin_array_str_exists (GPtrArray *array, const gchar *str)
++{
++ guint i;
++ const gchar *tmp;
++ for (i = 0; i < array->len; i++) {
++ tmp = g_ptr_array_index (array, i);
++ if (g_strcmp0 (tmp, str) == 0)
++ return TRUE;
++ }
++ return FALSE;
++}
++
++/**
++ * pk_plugin_transaction_finished_end:
++ */
++void
++pk_plugin_transaction_finished_end (PkPlugin *plugin,
++ PkTransaction *transaction)
++{
++ gboolean ret;
++ gchar **package_ids;
++ gchar *packages_str = NULL;
++ gchar *path = NULL;
++ GError *error = NULL;
++ GPtrArray *packages;
++ guint i;
++ PkBitfield transaction_flags;
++ PkExitEnum exit_enum;
++ PkResults *results;
++ PkRoleEnum role;
++
++ /* check the role */
++ role = pk_transaction_get_role (transaction);
++ if (role != PK_ROLE_ENUM_UPDATE_PACKAGES)
++ goto out;
++
++ /* check for success */
++ results = pk_transaction_get_results (transaction);
++ exit_enum = pk_results_get_exit_code (results);
++ if (exit_enum != PK_EXIT_ENUM_SUCCESS)
++ goto out;
++
++ /* only write the file for only-download */
++ transaction_flags = pk_transaction_get_transaction_flags (transaction);
++ if (!pk_bitfield_contain (transaction_flags,
++ PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD))
++ return;
++
++ /* get the existing prepared updates */
++ path = g_build_filename (LOCALSTATEDIR,
++ "lib",
++ "PackageKit",
++ "prepared-update",
++ NULL);
++ packages = pk_plugin_get_existing_prepared_updates (path);
++
++ /* add any new ones */
++ package_ids = pk_transaction_get_package_ids (transaction);
++ for (i = 0; package_ids[i] != NULL; i++) {
++ if (!pk_plugin_array_str_exists (packages, package_ids[i])) {
++ g_ptr_array_add (packages,
++ g_strdup (package_ids[i]));
++ }
++ }
++ g_ptr_array_add (packages, NULL);
++
++ /* write filename */
++ packages_str = g_strjoinv ("\n", (gchar **) packages->pdata);
++ ret = g_file_set_contents (path,
++ packages_str,
++ -1,
++ &error);
++ if (!ret) {
++ g_warning ("failed to write %s: %s",
++ path, error->message);
++ g_error_free (error);
++ goto out;
++ }
++out:
++ g_free (packages_str);
++ g_free (path);
++ return;
++}
diff --git a/PackageKit.spec b/PackageKit.spec
index 088c147..81e4cdd 100644
--- a/PackageKit.spec
+++ b/PackageKit.spec
@@ -3,7 +3,7 @@
Summary: Package management service
Name: PackageKit
Version: 0.8.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: GPLv2+ and LGPLv2+
URL: http://www.packagekit.org
Source0: http://www.packagekit.org/releases/%{name}-%{version}.tar.xz
@@ -472,6 +472,9 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
%{_libdir}/pkgconfig/packagekit-plugin.pc
%changelog
+* Mon Jul 02 2012 Richard Hughes <rhughes at redhat.com> - 0.8.1-4
+- Fix several reported problems with the offline-update funtionality.
+
* Fri Jun 29 2012 Richard Hughes <rhughes at redhat.com> - 0.8.1-3
- Fix several reported problems with the offline-update funtionality.
More information about the scm-commits
mailing list