static void pacman_transaction_finalize (GObject *object) { PacmanTransactionPrivate *priv; g_return_if_fail (object != NULL); priv = PACMAN_TRANSACTION_GET_PRIVATE (PACMAN_TRANSACTION (object)); pacman_list_free (priv->marked_packages); pacman_list_free_full (priv->missing_dependencies, (GDestroyNotify) pacman_missing_dependency_free); pacman_list_free_full (priv->conflicts, (GDestroyNotify) pacman_conflict_free); pacman_list_free_full (priv->file_conflicts, (GDestroyNotify) pacman_file_conflict_free); pacman_list_free (priv->invalid_files); pacman_transaction_end (NULL); pacman_manager_new_transaction (pacman_manager, G_TYPE_NONE); G_OBJECT_CLASS (pacman_transaction_parent_class)->finalize (object); }
void pacman_transaction_set_invalid_files (PacmanTransaction *transaction, PacmanList *filenames) { PacmanTransactionPrivate *priv; g_return_if_fail (transaction != NULL); priv = PACMAN_TRANSACTION_GET_PRIVATE (transaction); pacman_list_free (priv->invalid_files); priv->invalid_files = filenames; }
void pacman_transaction_set_marked_packages (PacmanTransaction *transaction, PacmanList *packages) { PacmanTransactionPrivate *priv; g_return_if_fail (transaction != NULL); priv = PACMAN_TRANSACTION_GET_PRIVATE (transaction); pacman_list_free (priv->marked_packages); priv->marked_packages = packages; }
/** * pacman_list_free_full: * @list: A #PacmanList to free. * @func: A #GDestroyNotify function. * * Frees every item in @list using @func, then frees @list itself. */ void pacman_list_free_full (PacmanList *list, GDestroyNotify func) { pacman_list_free_contents (list, func); pacman_list_free (list); }
static void pacman_transaction_event_cb (pmtransevt_t event, gpointer data1, gpointer data2) { PacmanTransaction *transaction; g_return_if_fail (pacman_manager != NULL); transaction = pacman_manager_get_transaction (pacman_manager); g_return_if_fail (transaction != NULL); switch (event) { case PM_TRANS_EVT_CHECKDEPS_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DEPENDENCY_CHECK_START, _("Checking dependencies")); break; } case PM_TRANS_EVT_CHECKDEPS_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DEPENDENCY_CHECK_END, _("Finished checking dependencies")); break; } case PM_TRANS_EVT_FILECONFLICTS_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_FILE_CONFLICT_CHECK_START, _("Checking for file conflicts")); break; } case PM_TRANS_EVT_FILECONFLICTS_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_FILE_CONFLICT_CHECK_END, _("Finished checking for file conflicts")); break; } case PM_TRANS_EVT_RESOLVEDEPS_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DEPENDENCY_RESOLVE_START, _("Resolving dependencies")); break; } case PM_TRANS_EVT_RESOLVEDEPS_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DEPENDENCY_RESOLVE_END, _("Finished resolving dependencies")); break; } case PM_TRANS_EVT_INTERCONFLICTS_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_CONFLICT_CHECK_START, _("Checking for conflicts")); break; } case PM_TRANS_EVT_INTERCONFLICTS_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_CONFLICT_CHECK_END, _("Finished checking for conflicts")); break; } case PM_TRANS_EVT_ADD_START: { pacman_transaction_set_marked_packages (transaction, pacman_list_add (NULL, data1)); pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_INSTALL_START, _("Installing %s"), pacman_package_get_name ((PacmanPackage *) data1)); pacman_transaction_set_marked_packages (transaction, NULL); break; } case PM_TRANS_EVT_ADD_DONE: { PacmanPackage *package = (PacmanPackage *) data1; const PacmanList *optional_dependencies, *i; alpm_logaction ("installed %s (%s)\n", pacman_package_get_name (package), pacman_package_get_version (package)); pacman_transaction_set_marked_packages (transaction, pacman_list_add (NULL, data1)); pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_INSTALL_END, _("Finished installing %s"), pacman_package_get_name (package)); pacman_transaction_set_marked_packages (transaction, NULL); optional_dependencies = pacman_package_get_optional_dependencies (package); if (optional_dependencies != NULL) { GString *depends = g_string_new (""); gchar *message; g_string_append_printf (depends, _("Optional dependencies for %s:\n"), pacman_package_get_name (package)); for (i = optional_dependencies; i != NULL; i = pacman_list_next (i)) { const gchar *line = (const gchar *) pacman_list_get (i); g_string_append_printf (depends, "%s\n", line); } message = g_string_free (depends, FALSE); g_message ("%s", message); g_free (message); } break; } case PM_TRANS_EVT_REMOVE_START: { pacman_transaction_set_marked_packages (transaction, pacman_list_add (NULL, data1)); pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_REMOVE_START, _("Removing %s"), pacman_package_get_name ((PacmanPackage *) data1)); pacman_transaction_set_marked_packages (transaction, NULL); break; } case PM_TRANS_EVT_REMOVE_DONE: { PacmanPackage *package = (PacmanPackage *) data1; alpm_logaction ("removed %s (%s)\n", pacman_package_get_name (package), pacman_package_get_version (package)); pacman_transaction_set_marked_packages (transaction, pacman_list_add (NULL, data1)); pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_REMOVE_END, _("Finished removing %s"), pacman_package_get_name (package)); pacman_transaction_set_marked_packages (transaction, NULL); break; } case PM_TRANS_EVT_UPGRADE_START: { PacmanList *new_then_old = NULL; new_then_old = pacman_list_add (new_then_old, data1); new_then_old = pacman_list_add (new_then_old, data2); pacman_transaction_set_marked_packages (transaction, new_then_old); pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_UPGRADE_START, _("Upgrading %s"), pacman_package_get_name ((PacmanPackage *) data1)); pacman_transaction_set_marked_packages (transaction, NULL); break; } case PM_TRANS_EVT_UPGRADE_DONE: { PacmanPackage *package = (PacmanPackage *) data1, *old_package = (PacmanPackage *) data2; PacmanList *optional_dependencies, *i, *new_then_old = NULL; alpm_logaction ("upgraded %s (%s -> %s)\n", pacman_package_get_name (package), pacman_package_get_version (old_package), pacman_package_get_version (package)); new_then_old = pacman_list_add (new_then_old, data1); new_then_old = pacman_list_add (new_then_old, data2); pacman_transaction_set_marked_packages (transaction, new_then_old); pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_UPGRADE_END, _("Finished upgrading %s"), pacman_package_get_name (package)); pacman_transaction_set_marked_packages (transaction, NULL); optional_dependencies = pacman_list_diff (pacman_package_get_optional_dependencies (package), pacman_package_get_optional_dependencies (old_package), (GCompareFunc) g_strcmp0); if (optional_dependencies != NULL) { GString *depends = g_string_new (""); gchar *message; g_string_append_printf (depends, _("New optional dependencies for %s\n"), pacman_package_get_name (package)); for (i = optional_dependencies; i != NULL; i = pacman_list_next (i)) { const gchar *line = (const gchar *) pacman_list_get (i); g_string_append_printf (depends, "%s\n", line); } message = g_string_free (depends, FALSE); g_message ("%s", message); g_free (message); pacman_list_free (optional_dependencies); } break; } case PM_TRANS_EVT_INTEGRITY_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_PACKAGE_INTEGRITY_CHECK_START, _("Checking package integrity")); break; } case PM_TRANS_EVT_INTEGRITY_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_PACKAGE_INTEGRITY_CHECK_END, _("Finished checking package integrity")); break; } case PM_TRANS_EVT_DELTA_INTEGRITY_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DELTA_INTEGRITY_CHECK_START, _("Checking delta integrity")); break; } case PM_TRANS_EVT_DELTA_INTEGRITY_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DELTA_INTEGRITY_CHECK_END, _("Finished checking delta integrity")); break; } case PM_TRANS_EVT_DELTA_PATCHES_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DELTA_PATCHING_START, _("Applying delta patches")); break; } case PM_TRANS_EVT_DELTA_PATCHES_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DELTA_PATCHING_END, _("Finished applying delta patches")); break; } case PM_TRANS_EVT_DELTA_PATCH_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DELTA_PATCH_START, _("Creating %s from the delta patch %s"), (const gchar *) data1, (const gchar *) data2); break; } case PM_TRANS_EVT_DELTA_PATCH_DONE: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DELTA_PATCH_END, _("Finished applying delta patch")); break; } case PM_TRANS_EVT_DELTA_PATCH_FAILED: { /* already reported as an error */ break; } case PM_TRANS_EVT_SCRIPTLET_INFO: { g_message ("%s\n", (const gchar *) data1); break; } case PM_TRANS_EVT_RETRIEVE_START: { pacman_transaction_tell (transaction, PACMAN_TRANSACTION_STATUS_DOWNLOAD_FROM, _("Downloading packages from [%s]"), (const gchar *) data1); break; } default: { g_debug ("Unrecognised event: %d\n", event); break; } } }
int install_pkgs(GList *pkgs) { int i = 0, questret; PM_LIST *pdata = NULL, *pkgsl; char *ptr, *file; /* nothing to install */ if(pkgs == NULL) return 0; if(pacman_initialize(TARGETDIR) == -1) { LOG("Failed to initialize pacman library (%s)\n", pacman_strerror(pm_errno)); return -1; } if (pacman_parse_config("/etc/pacman-g2.conf", NULL, "") == -1) { LOG("Failed to parse pacman-g2 configuration file (%s)", pacman_strerror(pm_errno)); pacman_release(); return(-1); } //* Set pacman options *// #ifndef NDEBUG pacman_set_option(PM_OPT_LOGMASK, -1); #else pacman_set_option(PM_OPT_LOGMASK, PM_LOG_ERROR | PM_LOG_WARNING); #endif pacman_set_option(PM_OPT_LOGCB, (long)cb_log); pacman_set_option (PM_OPT_DLCB, (long)progress_update); pacman_set_option (PM_OPT_DLOFFSET, (long)&offset); pacman_set_option (PM_OPT_DLRATE, (long)&rate); pacman_set_option (PM_OPT_DLFNM, (long)reponame); pacman_set_option (PM_OPT_DLHOWMANY, (long)&howmany); pacman_set_option (PM_OPT_DLREMAIN, (long)&remains); pacman_set_option (PM_OPT_DLT0, (long)&t0); pacman_set_option (PM_OPT_DLT0, (long)&t); pacman_set_option (PM_OPT_DLXFERED1, (long)&xferred1); PM_DB *db_local = pacman_db_register("local"); if(db_local == NULL) { LOG("Could not register 'local' database (%s)\n", pacman_strerror(pm_errno)); pacman_release(); return -1; } retry: if(pacman_trans_init(PM_TRANS_TYPE_SYNC, PM_TRANS_FLAG_FORCE|PM_TRANS_FLAG_NODEPS, progress_event, progress_conv, progress_install) == -1) { if (pm_errno == PM_ERR_HANDLE_LOCK) { file = g_strdup_printf("%s/tmp/pacman-g2.lck", TARGETDIR); g_remove (file); free(file); goto retry; } LOG("Failed to initialize transaction %s\n", pacman_strerror (pm_errno)); pacman_release(); return -1; } for (i = 0; i<g_list_length(pkgs); i++) { ptr = strdup((char*)g_list_nth_data(pkgs, i)); if(pacman_trans_addtarget(strdup(drop_version(ptr))) == -1) LOG("Error adding packet %s", pacman_strerror (pm_errno)); free(ptr); } //* prepare transaction *// if(pacman_trans_prepare(&pdata) == -1) { LOG("Failed to prepare transaction (%s)", pacman_strerror (pm_errno)); pacman_list_free(pdata); pacman_trans_release(); pacman_release(); return -1; } pkgsl = pacman_trans_getinfo (PM_TRANS_PACKAGES); if (pkgsl == NULL) { LOG("Error getting transaction info %s\n", pacman_strerror (pm_errno)); pacman_trans_release(); pacman_release(); return -1; } /* commit transaction */ if (pacman_trans_commit(&pdata) == -1) { switch(pm_errno) { case PM_ERR_DISK_FULL: fwife_error(_("Disk full, cannot install more packages")); break; case PM_ERR_PKG_CORRUPTED: questret = fwife_question(_("Some packages seems corrupted, do you want to download them again?")); if(questret == GTK_RESPONSE_YES) { pacman_list_free(pdata); pacman_trans_release(); goto retry; } break; case PM_ERR_RETRIEVE: fwife_error(_("Failed to retrieve packages")); break; default: break; } LOG("Failed to commit transaction (%s)\n", pacman_strerror (pm_errno)); pacman_list_free(pdata); pacman_trans_release(); pacman_release(); return -1; } /* release the transaction */ pacman_trans_release(); pacman_release(); return 0; }