From 797c190f93d24ff1e352549f320a0612cd04382b Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 2 Dec 2007 14:14:14 -0600 Subject: Remove frontend add code that is no longer necessary Change the pacman_upgrade stub function to do what pacman_add used to do so we can eliminate pacman_add. Move the code to the more-descriptive name of upgrade.c. Note that we have made no changes to the backend libalpm, where an ADD type transaction could still be supported. Signed-off-by: Dan McGee --- src/pacman/Makefile.am | 2 +- src/pacman/add.c | 191 ------------------------------------------------- src/pacman/conf.h | 1 - src/pacman/pacman.h | 9 ++- src/pacman/upgrade.c | 171 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 176 insertions(+), 198 deletions(-) delete mode 100644 src/pacman/add.c create mode 100644 src/pacman/upgrade.c (limited to 'src') diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am index 0395432e..fbb50a29 100644 --- a/src/pacman/Makefile.am +++ b/src/pacman/Makefile.am @@ -22,7 +22,6 @@ INCLUDES = -I$(top_srcdir)/lib/libalpm AM_CFLAGS = -pedantic -D_GNU_SOURCE pacman_SOURCES = \ - add.c \ conf.h conf.c \ deptest.c \ package.h package.c \ @@ -31,6 +30,7 @@ pacman_SOURCES = \ remove.c \ sync.c \ callback.h callback.c \ + upgrade.c \ util.h util.c pacman_LDADD = $(top_builddir)/lib/libalpm/.libs/libalpm.la diff --git a/src/pacman/add.c b/src/pacman/add.c deleted file mode 100644 index fd40f005..00000000 --- a/src/pacman/add.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * add.c - * - * Copyright (c) 2002-2007 by Judd Vinet - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "config.h" - -#include -#include -#include - -#include -#include - -/* pacman */ -#include "pacman.h" -#include "callback.h" -#include "conf.h" -#include "util.h" - -/* Free the current transaction and print an error if unsuccessful */ -static int add_cleanup(void) -{ - int ret = alpm_trans_release(); - if(ret != 0) { - pm_printf(PM_LOG_ERROR, _("failed to release transaction (%s)\n"), - alpm_strerrorlast()); - ret = 1; - } - - return(ret); -} - -/** - * @brief Upgrade a specified list of packages. - * - * @param targets a list of packages (as strings) to upgrade - * - * @return 0 on success, 1 on failure - */ -int pacman_upgrade(alpm_list_t *targets) -{ - /* this is basically just a remove-then-add process. pacman_add() will */ - /* handle it */ - config->upgrade = 1; - return(pacman_add(targets)); -} - -/** - * @brief Add a specified list of packages which cannot already be installed. - * - * @param targets a list of packages (as strings) to add - * - * @return 0 on success, 1 on failure - */ -int pacman_add(alpm_list_t *targets) -{ - alpm_list_t *i, *data = NULL; - pmtranstype_t transtype = PM_TRANS_TYPE_ADD; - int retval = 0; - - if(targets == NULL) { - pm_printf(PM_LOG_ERROR, _("no targets specified (use -h for help)\n")); - return(1); - } - - /* Check for URL targets and process them - */ - for(i = targets; i; i = alpm_list_next(i)) { - if(strstr(i->data, "://")) { - char *str = alpm_fetch_pkgurl(i->data); - if(str == NULL) { - return(1); - } else { - free(i->data); - i->data = str; - } - } - } - - /* Step 1: create a new transaction */ - if(config->upgrade == 1) { - /* if upgrade flag was set, change this to an upgrade transaction */ - transtype = PM_TRANS_TYPE_UPGRADE; - } - - if(alpm_trans_init(transtype, config->flags, cb_trans_evt, - cb_trans_conv, cb_trans_progress) == -1) { - /* TODO: error messages should be in the front end, not the back */ - fprintf(stderr, _("error: %s\n"), alpm_strerrorlast()); - if(pm_errno == PM_ERR_HANDLE_LOCK) { - /* TODO this and the 2 other places should probably be on stderr */ - printf(_(" if you're sure a package manager is not already\n" - " running, you can remove %s.\n"), alpm_option_get_lockfile()); - } - return(1); - } - - /* add targets to the created transaction */ - printf(_("loading package data...\n")); - for(i = targets; i; i = alpm_list_next(i)) { - char *targ = alpm_list_getdata(i); - if(alpm_trans_addtarget(targ) == -1) { - fprintf(stderr, _("error: '%s': %s\n"), - targ, alpm_strerrorlast()); - add_cleanup(); - return(1); - } - } - - /* Step 2: "compute" the transaction based on targets and flags */ - /* TODO: No, compute nothing. This is stupid. */ - if(alpm_trans_prepare(&data) == -1) { - fprintf(stderr, _("error: failed to prepare transaction (%s)\n"), - alpm_strerrorlast()); - switch(pm_errno) { - case PM_ERR_UNSATISFIED_DEPS: - for(i = data; i; i = alpm_list_next(i)) { - pmdepmissing_t *miss = alpm_list_getdata(i); - pmdepend_t *dep = alpm_miss_get_dep(miss); - char *depstring = alpm_dep_get_string(dep); - - /* TODO indicate if the error was a virtual package or not: - * :: %s: requires %s, provided by %s - */ - printf(_(":: %s: requires %s\n"), alpm_miss_get_target(miss), - depstring); - free(depstring); - } - break; - case PM_ERR_CONFLICTING_DEPS: - for(i = data; i; i = alpm_list_next(i)) { - pmconflict_t *conflict = alpm_list_getdata(i); - printf(_(":: %s: conflicts with %s\n"), - alpm_conflict_get_package1(conflict), alpm_conflict_get_package2(conflict)); - } - break; - case PM_ERR_FILE_CONFLICTS: - for(i = data; i; i = alpm_list_next(i)) { - pmfileconflict_t *conflict = alpm_list_getdata(i); - switch(alpm_fileconflict_get_type(conflict)) { - case PM_FILECONFLICT_TARGET: - printf(_("%s exists in both '%s' and '%s'\n"), - alpm_fileconflict_get_file(conflict), - alpm_fileconflict_get_target(conflict), - alpm_fileconflict_get_ctarget(conflict)); - break; - case PM_FILECONFLICT_FILESYSTEM: - printf(_("%s: %s exists in filesystem\n"), - alpm_fileconflict_get_target(conflict), - alpm_fileconflict_get_file(conflict)); - break; - } - } - printf(_("\nerrors occurred, no packages were upgraded.\n")); - break; - default: - break; - } - add_cleanup(); - FREELIST(data); - return(1); - } - alpm_list_free(data); - - /* Step 3: perform the installation */ - if(alpm_trans_commit(NULL) == -1) { - fprintf(stderr, _("error: failed to commit transaction (%s)\n"), alpm_strerrorlast()); - add_cleanup(); - return(1); - } - - retval = add_cleanup(); - return(retval); -} - -/* vim: set ts=2 sw=2 noet: */ diff --git a/src/pacman/conf.h b/src/pacman/conf.h index beabf469..d53db08f 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -27,7 +27,6 @@ typedef struct __config_t { unsigned short verbose; unsigned short version; unsigned short help; - unsigned short upgrade; unsigned short noconfirm; unsigned short noprogressbar; unsigned short logmask; diff --git a/src/pacman/pacman.h b/src/pacman/pacman.h index 9d23a89c..97d0301e 100644 --- a/src/pacman/pacman.h +++ b/src/pacman/pacman.h @@ -21,15 +21,14 @@ #include -/* add.c, this should merge with upgrade.c */ -int pacman_add(alpm_list_t *targets); -int pacman_upgrade(alpm_list_t *targets); -/* sync.c */ -int pacman_sync(alpm_list_t *targets); /* query.c */ int pacman_query(alpm_list_t *targets); /* remove.c */ int pacman_remove(alpm_list_t *targets); +/* sync.c */ +int pacman_sync(alpm_list_t *targets); +/* upgrade.c */ +int pacman_upgrade(alpm_list_t *targets); /* deptest.c */ int pacman_deptest(alpm_list_t *targets); diff --git a/src/pacman/upgrade.c b/src/pacman/upgrade.c new file mode 100644 index 00000000..e5626516 --- /dev/null +++ b/src/pacman/upgrade.c @@ -0,0 +1,171 @@ +/* + * upgrade.c + * + * Copyright (c) 2002-2007 by Judd Vinet + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" + +#include +#include +#include + +#include +#include + +/* pacman */ +#include "pacman.h" +#include "callback.h" +#include "conf.h" +#include "util.h" + +/* Free the current transaction and print an error if unsuccessful */ +static int upgrade_cleanup(void) +{ + int ret = alpm_trans_release(); + if(ret != 0) { + pm_printf(PM_LOG_ERROR, _("failed to release transaction (%s)\n"), + alpm_strerrorlast()); + ret = 1; + } + + return(ret); +} + +/** + * @brief Upgrade a specified list of packages. + * + * @param targets a list of packages (as strings) to upgrade + * + * @return 0 on success, 1 on failure + */ +int pacman_upgrade(alpm_list_t *targets) +{ + alpm_list_t *i, *data = NULL; + pmtranstype_t transtype = PM_TRANS_TYPE_UPGRADE; + int retval = 0; + + if(targets == NULL) { + pm_printf(PM_LOG_ERROR, _("no targets specified (use -h for help)\n")); + return(1); + } + + /* Check for URL targets and process them + */ + for(i = targets; i; i = alpm_list_next(i)) { + if(strstr(i->data, "://")) { + char *str = alpm_fetch_pkgurl(i->data); + if(str == NULL) { + return(1); + } else { + free(i->data); + i->data = str; + } + } + } + + /* Step 1: create a new transaction */ + if(alpm_trans_init(transtype, config->flags, cb_trans_evt, + cb_trans_conv, cb_trans_progress) == -1) { + /* TODO: error messages should be in the front end, not the back */ + fprintf(stderr, _("error: %s\n"), alpm_strerrorlast()); + if(pm_errno == PM_ERR_HANDLE_LOCK) { + /* TODO this and the 2 other places should probably be on stderr */ + printf(_(" if you're sure a package manager is not already\n" + " running, you can remove %s.\n"), alpm_option_get_lockfile()); + } + return(1); + } + + /* add targets to the created transaction */ + printf(_("loading package data...\n")); + for(i = targets; i; i = alpm_list_next(i)) { + char *targ = alpm_list_getdata(i); + if(alpm_trans_addtarget(targ) == -1) { + fprintf(stderr, _("error: '%s': %s\n"), + targ, alpm_strerrorlast()); + upgrade_cleanup(); + return(1); + } + } + + /* Step 2: "compute" the transaction based on targets and flags */ + /* TODO: No, compute nothing. This is stupid. */ + if(alpm_trans_prepare(&data) == -1) { + fprintf(stderr, _("error: failed to prepare transaction (%s)\n"), + alpm_strerrorlast()); + switch(pm_errno) { + case PM_ERR_UNSATISFIED_DEPS: + for(i = data; i; i = alpm_list_next(i)) { + pmdepmissing_t *miss = alpm_list_getdata(i); + pmdepend_t *dep = alpm_miss_get_dep(miss); + char *depstring = alpm_dep_get_string(dep); + + /* TODO indicate if the error was a virtual package or not: + * :: %s: requires %s, provided by %s + */ + printf(_(":: %s: requires %s\n"), alpm_miss_get_target(miss), + depstring); + free(depstring); + } + break; + case PM_ERR_CONFLICTING_DEPS: + for(i = data; i; i = alpm_list_next(i)) { + pmconflict_t *conflict = alpm_list_getdata(i); + printf(_(":: %s: conflicts with %s\n"), + alpm_conflict_get_package1(conflict), alpm_conflict_get_package2(conflict)); + } + break; + case PM_ERR_FILE_CONFLICTS: + for(i = data; i; i = alpm_list_next(i)) { + pmfileconflict_t *conflict = alpm_list_getdata(i); + switch(alpm_fileconflict_get_type(conflict)) { + case PM_FILECONFLICT_TARGET: + printf(_("%s exists in both '%s' and '%s'\n"), + alpm_fileconflict_get_file(conflict), + alpm_fileconflict_get_target(conflict), + alpm_fileconflict_get_ctarget(conflict)); + break; + case PM_FILECONFLICT_FILESYSTEM: + printf(_("%s: %s exists in filesystem\n"), + alpm_fileconflict_get_target(conflict), + alpm_fileconflict_get_file(conflict)); + break; + } + } + printf(_("\nerrors occurred, no packages were upgraded.\n")); + break; + default: + break; + } + upgrade_cleanup(); + FREELIST(data); + return(1); + } + alpm_list_free(data); + + /* Step 3: perform the installation */ + if(alpm_trans_commit(NULL) == -1) { + fprintf(stderr, _("error: failed to commit transaction (%s)\n"), alpm_strerrorlast()); + upgrade_cleanup(); + return(1); + } + + retval = upgrade_cleanup(); + return(retval); +} + +/* vim: set ts=2 sw=2 noet: */ -- cgit v1.2.3