예제 #1
0
static gboolean
disabled_repos_configure (GHashTable *disabled, GError **error)
{
	const PacmanList *databases;

	g_return_val_if_fail (pacman != NULL, FALSE);

	g_debug ("pacman: reading config from %s", PACMAN_CONFIG_FILE);

	/* read configuration from pacman config file */
	if (!pacman_manager_configure (pacman, PACMAN_CONFIG_FILE, error)) {
		return FALSE;
	}

	local_database = pacman_manager_get_local_database (pacman);

	/* disable disabled repos */
	for (databases = pacman_manager_get_sync_databases (pacman); databases != NULL; databases = pacman_list_next (databases)) {
		PacmanDatabase *database = (PacmanDatabase *) pacman_list_get (databases);
		const gchar *repo = pacman_database_get_name (database);

		if (g_hash_table_lookup (disabled, repo) != NULL) {
			if (!pacman_manager_unregister_database (pacman, database, error)) {
				return FALSE;
			}

			/* start again as the list gets invalidated */
			databases = pacman_manager_get_sync_databases (pacman);
		}
	}

	return TRUE;
}
예제 #2
0
/**
 * pacman_manager_test_dependencies:
 * @manager: A #PacmanManager.
 * @dependencies: A list of strings representing dependencies. See pacman_dependency_to_string().
 *
 * Tests each dependency in @dependencies to determine whether it is satisfied by an installed package.
 *
 * Returns: A list of strings from @dependencies, corresponding to the dependencies which were not satisfied. Free with pacman_list_free().
 */
PacmanList *pacman_manager_test_dependencies (PacmanManager *manager, const PacmanList *dependencies) {
	PacmanDatabase *database;
	
	g_return_val_if_fail (manager != NULL, NULL);
	
	database = pacman_manager_get_local_database (manager);
	g_return_val_if_fail (database != NULL, NULL);
	
	return alpm_deptest (database, (PacmanList *) dependencies);
}
예제 #3
0
/**
 * pacman_manager_find_missing_dependencies:
 * @manager: A #PacmanManager.
 * @remove: A list of #PacmanPackage.
 * @install: A list of #PacmanPackage.
 *
 * Finds dependencies of installed packages that will no longer be satisfied once the packages in @remove are removed and those in @install are installed.
 *
 * Returns: A list of #PacmanMissingDependency. Free the contents with pacman_missing_dependency_free(), then free the list with pacman_list_free().
 */
PacmanList *pacman_manager_find_missing_dependencies (PacmanManager *manager, const PacmanList *remove, const PacmanList *install) {
	PacmanDatabase *database;
	
	g_return_val_if_fail (manager != NULL, NULL);
	
	database = pacman_manager_get_local_database (manager);
	g_return_val_if_fail (database != NULL, NULL);
	
	return alpm_checkdeps ((PacmanList *) pacman_database_get_packages (database), 1, (PacmanList *) remove, (PacmanList *) install);
}
예제 #4
0
PacmanTransaction *pacman_manager_new_transaction (PacmanManager *manager, GType type) {
	PacmanManagerPrivate *priv;
	
	g_return_val_if_fail (manager != NULL, NULL);
	g_return_val_if_fail (pacman_manager_get_local_database (manager) != NULL, NULL);
	
	priv = PACMAN_MANAGER_GET_PRIVATE (manager);
	
	if (type == G_TYPE_NONE) {
		return priv->transaction = NULL;
	} else {
		g_return_val_if_fail (priv->transaction == NULL, NULL);
	}
	
	return priv->transaction = PACMAN_TRANSACTION (g_object_new (type, NULL));
}
예제 #5
0
/**
 * pacman_manager_register_local_database:
 * @manager: A #PacmanManager.
 * @error: A #GError, or %NULL.
 *
 * Gets the local database, or registers one if it was not found.
 *
 * Returns: A #PacmanDatabase, or %NULL if @error is set.
 */
PacmanDatabase *pacman_manager_register_local_database (PacmanManager *manager, GError **error) {
	PacmanDatabase *database;
	
	g_return_val_if_fail (manager != NULL, NULL);
	
	database = pacman_manager_get_local_database (manager);
	if (database == NULL) {
		database = alpm_db_register_local ();
		
		if (database == NULL) {
			g_set_error (error, PACMAN_ERROR, pm_errno, _("Could not register database [%s]: %s"), "local", alpm_strerrorlast ());
			return NULL;
		}
	}
	
	return database;
}
예제 #6
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;
		}
	}
}