summaryrefslogtreecommitdiffstats
path: root/src/pacman/upgrade.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pacman/upgrade.c')
-rw-r--r--src/pacman/upgrade.c154
1 files changed, 21 insertions, 133 deletions
diff --git a/src/pacman/upgrade.c b/src/pacman/upgrade.c
index 8cd29da0..e4b2e2bf 100644
--- a/src/pacman/upgrade.c
+++ b/src/pacman/upgrade.c
@@ -41,23 +41,23 @@
*/
int pacman_upgrade(alpm_list_t *targets)
{
- alpm_list_t *i, *data = NULL;
- int retval = 0;
+ alpm_list_t *i;
+ alpm_siglevel_t level = alpm_option_get_default_siglevel(config->handle);
if(targets == NULL) {
- pm_printf(PM_LOG_ERROR, _("no targets specified (use -h for help)\n"));
- return(1);
+ pm_printf(ALPM_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);
+ char *str = alpm_fetch_pkgurl(config->handle, i->data);
if(str == NULL) {
- pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n",
- (char *)i->data, alpm_strerrorlast());
- return(1);
+ pm_fprintf(stderr, ALPM_LOG_ERROR, "'%s': %s\n",
+ (char *)i->data, alpm_strerror(alpm_errno(config->handle)));
+ return 1;
} else {
free(i->data);
i->data = str;
@@ -66,144 +66,32 @@ int pacman_upgrade(alpm_list_t *targets)
}
/* Step 1: create a new transaction */
- if(trans_init(config->flags) == -1) {
- return(1);
+ if(trans_init(config->flags, 1) == -1) {
+ return 1;
}
/* add targets to the created transaction */
for(i = targets; i; i = alpm_list_next(i)) {
char *targ = alpm_list_getdata(i);
- pmpkg_t *pkg;
+ alpm_pkg_t *pkg;
- if(alpm_pkg_load(targ, 1, &pkg) != 0) {
- pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n",
- targ, alpm_strerrorlast());
+ if(alpm_pkg_load(config->handle, targ, 1, level, &pkg) != 0) {
+ pm_fprintf(stderr, ALPM_LOG_ERROR, "'%s': %s\n",
+ targ, alpm_strerror(alpm_errno(config->handle)));
trans_release();
- return(1);
+ return 1;
}
- if(alpm_add_pkg(pkg) == -1) {
- pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n",
- targ, alpm_strerrorlast());
+ if(alpm_add_pkg(config->handle, pkg) == -1) {
+ pm_fprintf(stderr, ALPM_LOG_ERROR, "'%s': %s\n",
+ targ, alpm_strerror(alpm_errno(config->handle)));
alpm_pkg_free(pkg);
trans_release();
- return(1);
+ 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) {
- pm_fprintf(stderr, PM_LOG_ERROR, _("failed to prepare transaction (%s)\n"),
- alpm_strerrorlast());
- switch(pm_errno) {
- case PM_ERR_PKG_INVALID_ARCH:
- for(i = data; i; i = alpm_list_next(i)) {
- char *pkg = alpm_list_getdata(i);
- printf(_(":: package %s does not have a valid architecture\n"), pkg);
- }
- break;
- 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_compute_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);
- const char *package1 = alpm_conflict_get_package1(conflict);
- const char *package2 = alpm_conflict_get_package2(conflict);
- const char *reason = alpm_conflict_get_reason(conflict);
- /* only print reason if it contains new information */
- if(strcmp(package1, reason) == 0 || strcmp(package2, reason) == 0) {
- printf(_(":: %s and %s are in conflict\n"), package1, package2);
- } else {
- printf(_(":: %s and %s are in conflict (%s)\n"), package1, package2, reason);
- }
- }
- break;
- default:
- break;
- }
- trans_release();
- FREELIST(data);
- return(1);
- }
-
- /* Step 3: perform the installation */
-
- if(config->print) {
- print_packages(alpm_trans_get_add());
- trans_release();
- return(0);
- }
-
- /* print targets and ask user confirmation */
- alpm_list_t *packages = alpm_trans_get_add();
- if(packages == NULL) { /* we are done */
- printf(_(" there is nothing to do\n"));
- trans_release();
- return(retval);
- }
- display_targets(alpm_trans_get_remove(), 0);
- display_targets(alpm_trans_get_add(), 1);
- printf("\n");
- int confirm = yesno(_("Proceed with installation?"));
- if(!confirm) {
- trans_release();
- return(retval);
- }
-
- if(alpm_trans_commit(&data) == -1) {
- pm_fprintf(stderr, PM_LOG_ERROR, _("failed to commit transaction (%s)\n"),
- alpm_strerrorlast());
- switch(pm_errno) {
- alpm_list_t *i;
- 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;
- }
- }
- break;
- case PM_ERR_PKG_INVALID:
- case PM_ERR_DLT_INVALID:
- for(i = data; i; i = alpm_list_next(i)) {
- char *filename = alpm_list_getdata(i);
- printf(_("%s is invalid or corrupted\n"), filename);
- }
- break;
- default:
- break;
- }
- FREELIST(data);
- trans_release();
- return(1);
- }
-
- if(trans_release() == -1) {
- retval = 1;
- }
- return(retval);
+ /* now that targets are resolved, we can hand it all off to the sync code */
+ return sync_prepare_execute();
}
/* vim: set ts=2 sw=2 noet: */