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; }
/** * 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); }
/** * 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); }
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)); }
/** * 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; }
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; } } }