From 47761d5aec3f27fcbb4acc7d0f4f1881cd0c0e6a Mon Sep 17 00:00:00 2001 From: Chantry Xavier Date: Sat, 5 Jan 2008 19:45:07 +0100 Subject: Move the fallback on providers from backend to frontend. This reverts commit e28973169d2e5eda8b64ebdda11ece0dc761d978. This code might fit better in the frontend than in the backend finally. Ref: http://www.archlinux.org/pipermail/pacman-dev/2007-November/010150.html I also changed it for fixing FS#8763 : if there is exactly one provider, pacman will pull it and print a warning. if there are several providers, pacman will list them and fail. It's up to the user to pick one. Add sync501 pactest to reflect that. --- src/pacman/sync.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 00e8935f..c641dfec 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -605,9 +605,37 @@ static int sync_trans(alpm_list_t *targets, int sync_only) } } if(!found) { - fprintf(stderr, _("error: '%s': not found in sync db\n"), targ); - retval = 1; - goto cleanup; + /* targ not found in sync db, searching for providers... */ + alpm_list_t *prov = NULL; + for(j = sync_dbs; j; j = alpm_list_next(j)) { + pmdb_t *db = alpm_list_getdata(j); + prov = alpm_list_join(prov, alpm_db_whatprovides(db, targ)); + } + if(prov != NULL) { + if(alpm_list_count(prov) == 1) { + const char *pname = NULL; + pmpkg_t *pkg = alpm_list_getdata(prov); + pname = alpm_pkg_get_name(pkg); + alpm_list_free(prov); + printf(_("Warning: %s provides %s\n"), pname, targ); + targets = alpm_list_add(targets, strdup(pname)); + } else { + alpm_list_t *k; + fprintf(stderr, _("error: several packages provide %s, please specify one :\n"), targ); + for(k = prov; k; k = alpm_list_next(k)) { + pmpkg_t *pkg = alpm_list_getdata(k); + printf("%s ", alpm_pkg_get_name(pkg)); + } + printf("\n"); + alpm_list_free(prov); + retval = 1; + goto cleanup; + } + } else { + fprintf(stderr, _("error: '%s': not found in sync db\n"), targ); + retval = 1; + goto cleanup; + } } } } -- cgit v1.2.3-70-g09d2