pacman: process all sync targets before exiting on error

If someone specifies a bogus line such as

    pacman -S baz adsf/boo base-devel

we are better off trying to process all targets and showing all relevant
errors before exiting. This is easier in -U and -R operations where we
aren't dealing with groups, but here we attempt to skip group selection
once we know a target has errored to avoid cluttering the output and
hiding the real problem.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2011-12-12 10:53:14 -06:00
parent 074cf4cb95
commit 1a1f5540a4

View file

@ -616,7 +616,7 @@ static int process_pkg(alpm_pkg_t *pkg)
return 0; return 0;
} }
static int process_group(alpm_list_t *dbs, const char *group) static int process_group(alpm_list_t *dbs, const char *group, int error)
{ {
int ret = 0; int ret = 0;
alpm_list_t *i; alpm_list_t *i;
@ -628,6 +628,12 @@ static int process_group(alpm_list_t *dbs, const char *group)
return 1; return 1;
} }
if(error) {
/* we already know another target errored. there is no reason to prompt the
* user here; we already validated the group name so just move on since we
* won't actually be installing anything anyway. */
goto cleanup;
}
if(config->print == 0) { if(config->print == 0) {
printf(_(":: There are %d members in group %s:\n"), count, printf(_(":: There are %d members in group %s:\n"), count,
@ -666,12 +672,14 @@ static int process_group(alpm_list_t *dbs, const char *group)
} }
} }
} }
cleanup: cleanup:
alpm_list_free(pkgs); alpm_list_free(pkgs);
return ret; return ret;
} }
static int process_targname(alpm_list_t *dblist, const char *targname) static int process_targname(alpm_list_t *dblist, const char *targname,
int error)
{ {
alpm_pkg_t *pkg = alpm_find_dbs_satisfier(config->handle, dblist, targname); alpm_pkg_t *pkg = alpm_find_dbs_satisfier(config->handle, dblist, targname);
@ -685,20 +693,20 @@ static int process_targname(alpm_list_t *dblist, const char *targname)
return process_pkg(pkg); return process_pkg(pkg);
} }
/* fallback on group */ /* fallback on group */
return process_group(dblist, targname); return process_group(dblist, targname, error);
} }
static int process_target(const char *target) static int process_target(const char *target, int error)
{ {
/* process targets */ /* process targets */
char *targstring = strdup(target); char *targstring = strdup(target);
char *targname = strchr(targstring, '/'); char *targname = strchr(targstring, '/');
char *dbname = NULL;
int ret = 0; int ret = 0;
alpm_list_t *dblist = NULL; alpm_list_t *dblist;
if(targname && targname != targstring) { if(targname && targname != targstring) {
alpm_db_t *db = NULL; alpm_db_t *db;
const char *dbname;
*targname = '\0'; *targname = '\0';
targname++; targname++;
@ -710,14 +718,15 @@ static int process_target(const char *target)
ret = 1; ret = 1;
goto cleanup; goto cleanup;
} }
dblist = alpm_list_add(dblist, db); dblist = alpm_list_add(NULL, db);
ret = process_targname(dblist, targname); ret = process_targname(dblist, targname, error);
alpm_list_free(dblist); alpm_list_free(dblist);
} else { } else {
targname = targstring; targname = targstring;
dblist = alpm_option_get_syncdbs(config->handle); dblist = alpm_option_get_syncdbs(config->handle);
ret = process_targname(dblist, targname); ret = process_targname(dblist, targname, error);
} }
cleanup: cleanup:
free(targstring); free(targstring);
if(ret && access(target, R_OK) == 0) { if(ret && access(target, R_OK) == 0) {
@ -730,6 +739,7 @@ cleanup:
static int sync_trans(alpm_list_t *targets) static int sync_trans(alpm_list_t *targets)
{ {
int retval = 0;
alpm_list_t *i; alpm_list_t *i;
/* Step 1: create a new transaction... */ /* Step 1: create a new transaction... */
@ -740,12 +750,16 @@ static int sync_trans(alpm_list_t *targets)
/* process targets */ /* process targets */
for(i = targets; i; i = alpm_list_next(i)) { for(i = targets; i; i = alpm_list_next(i)) {
const char *targ = i->data; const char *targ = i->data;
if(process_target(targ) == 1) { if(process_target(targ, retval) == 1) {
trans_release(); retval = 1;
return 1;
} }
} }
if(retval) {
trans_release();
return retval;
}
if(config->op_s_upgrade) { if(config->op_s_upgrade) {
printf(_(":: Starting full system upgrade...\n")); printf(_(":: Starting full system upgrade...\n"));
alpm_logaction(config->handle, "starting full system upgrade\n"); alpm_logaction(config->handle, "starting full system upgrade\n");