Exemplo n.º 1
0
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;
	}
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
		}
	}
}