static gchar * pacman_package_make_replaces_ids (PacmanPackage *package) { const PacmanList *list; GString *string = NULL; g_return_val_if_fail (local_database != NULL, NULL); g_return_val_if_fail (package != NULL, NULL); /* make a list of the packages that package replaces */ for (list = pacman_package_get_replaces (package); list != NULL; list = pacman_list_next (list)) { const gchar *name = pacman_list_get (list); PacmanPackage *replaces = pacman_database_find_package (local_database, name); if (replaces != NULL) { gchar *package_id = pacman_package_make_id (replaces); if (string == NULL) { string = g_string_new (package_id); } else { g_string_append_printf (string, "&%s", package_id); } g_free (package_id); } } if (string != NULL) { return g_string_free (string, FALSE); } else { return NULL; } }
static gboolean backend_get_update_detail_thread (PkBackend *backend) { guint iterator; gchar **package_ids; g_return_val_if_fail (local_database != NULL, FALSE); g_return_val_if_fail (backend != NULL, FALSE); package_ids = pk_backend_get_strv (backend, "package_ids"); g_return_val_if_fail (package_ids != NULL, FALSE); /* collect details about updates */ for (iterator = 0; package_ids[iterator] != NULL; ++iterator) { PacmanPackage *package, *upgrades; PacmanDatabase *database; gchar *upgrades_id, *replaces_ids, *vendor_url; const gchar *message; PkRestartEnum restart; PkUpdateStateEnum state; GTimeVal built = { 0 }, installed = { 0 }; gchar *issued, *updated; if (backend_cancelled (backend)) { break; } package = backend_get_package (backend, package_ids[iterator]); if (package == NULL) { backend_finished (backend); return FALSE; } upgrades = pacman_database_find_package (local_database, pacman_package_get_name (package)); if (upgrades != NULL) { upgrades_id = pacman_package_make_id (upgrades); if (pacman_package_compare_pkgver (package, upgrades) != 0) { message = "Update to newest upstream version"; } else { message = "Update to newest release"; } } else { upgrades_id = NULL; message = "Install as a replacement for an older package"; } database = pacman_package_get_database (package); replaces_ids = pacman_package_make_replaces_ids (package); vendor_url = pacman_package_make_vendor_url (package); if (g_str_has_prefix (pacman_package_get_name (package), "kernel")) { restart = PK_RESTART_ENUM_SYSTEM; } else { restart = PK_RESTART_ENUM_NONE; } if (g_str_has_suffix (pacman_database_get_name (database), "testing")) { state = PK_UPDATE_STATE_ENUM_TESTING; } else { state = PK_UPDATE_STATE_ENUM_STABLE; } built.tv_sec = pacman_package_get_build_date (package); if (built.tv_sec > 0) { issued = g_time_val_to_iso8601 (&built); } else { issued = NULL; } if (upgrades != NULL) { installed.tv_sec = pacman_package_get_install_date (upgrades); if (installed.tv_sec > 0) { updated = g_time_val_to_iso8601 (&installed); } else { updated = NULL; } } else { updated = NULL; } pk_backend_update_detail (backend, package_ids[iterator], upgrades_id, replaces_ids, vendor_url, NULL, NULL, restart, message, NULL, state, issued, updated); g_free (issued); g_free (updated); g_free (vendor_url); g_free (replaces_ids); g_free (upgrades_id); } backend_finished (backend); return TRUE; }
static void pacman_transaction_question_cb (pmtransconv_t question, gpointer data1, gpointer data2, gpointer data3, gint *response) { PacmanTransaction *transaction; g_return_if_fail (pacman_manager != NULL); transaction = pacman_manager_get_transaction (pacman_manager); g_return_if_fail (transaction != NULL); switch (question) { case PM_TRANS_CONV_INSTALL_IGNOREPKG: { /* called in sync_addtarget only, data1 = ignored package */ const gchar *name = pacman_package_get_name ((PacmanPackage *) data1), *version = pacman_package_get_version ((PacmanPackage *) data1); pacman_transaction_set_marked_packages (transaction, pacman_list_add (NULL, data1)); *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_INSTALL_IGNORE_PACKAGE, _("%s is marked as ignored. Do you want to install version %s anyway?"), name, version); pacman_transaction_set_marked_packages (transaction, NULL); break; } case PM_TRANS_CONV_REPLACE_PKG: { /* called in sync_sysupgrade, data1 = package to replace, data2 = replacement package, data3 = database name */ const gchar *replace = pacman_package_get_name ((PacmanPackage *) data1), *replacement = pacman_package_get_name ((PacmanPackage *) data2); PacmanConflict *conflict = pacman_conflict_new (replacement, replace, replace); pacman_transaction_set_conflicts (transaction, pacman_list_add (NULL, conflict)); *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_REPLACE_PACKAGE, _("Do you want to replace %s with %s from [%s]?"), replace, replacement, (const gchar *) data3); pacman_transaction_set_conflicts (transaction, NULL); break; } case PM_TRANS_CONV_CONFLICT_PKG: { /* called in sync_prepare, data1 = name of sync package, data2 = name of local package, data3 = conflict reason */ const gchar *replacement = (const gchar *) data1, *replace = (const gchar *) data2, *reason = (const gchar *) data3; PacmanConflict *conflict = pacman_conflict_new (replacement, replace, reason); pacman_transaction_set_conflicts (transaction, pacman_list_add (NULL, conflict)); if (g_strcmp0 (reason, replacement) == 0 || g_strcmp0 (reason, replace) == 0) { *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_REMOVE_CONFLICTING_PACKAGE, _("%s conflicts with %s. Do you want to remove %s?"), replacement, replace, replace); } else { *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_REMOVE_CONFLICTING_PACKAGE, _("%s conflicts with %s (%s). Do you want to remove %s?"), replacement, replace, reason, replace); } pacman_transaction_set_conflicts (transaction, NULL); break; } case PM_TRANS_CONV_REMOVE_PKGS: { /* called in sync_prepare, data1 = list of unsyncable packages */ gchar *packages = pacman_package_make_list ((PacmanList *) data1); pacman_transaction_set_marked_packages (transaction, pacman_list_copy ((PacmanList *) data1)); *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_SKIP_UNRESOLVABLE_PACKAGES, _("The following packages have unresolved dependencies: %s. Do you want to continue without them?"), packages); pacman_transaction_set_marked_packages (transaction, NULL); g_free (packages); break; } case PM_TRANS_CONV_LOCAL_NEWER: { /* isn't called anywhere..., data1 = package that is older than local version */ PacmanDatabase *database; PacmanPackage *package; const gchar *version, *name = (const gchar *) data1; database = pacman_manager_get_local_database (pacman_manager); g_return_if_fail (database != NULL); package = pacman_database_find_package (database, name); version = pacman_package_get_version (package); pacman_transaction_set_marked_packages (transaction, pacman_list_add (NULL, package)); *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_INSTALL_OLDER_PACKAGE, _("%s-%s is older than the installed version. Do you want to install it anyway?"), name, version); pacman_transaction_set_marked_packages (transaction, NULL); break; } case PM_TRANS_CONV_CORRUPTED_PKG: { /* called in sync_commit, data1 = location of corrupted package */ pacman_transaction_set_invalid_files (transaction, pacman_list_add (NULL, data1)); *response = (gint) pacman_transaction_ask (transaction, PACMAN_TRANSACTION_QUESTION_DELETE_CORRUPTED_PACKAGE, _("The package at %s is corrupted. Do you want to delete it?"), (const gchar *) data1); pacman_transaction_set_invalid_files (transaction, NULL); break; } default: { g_debug ("Unrecognised question: %d\n", question); break; } } }