diff options
author | Chantry Xavier <shiningxc@gmail.com> | 2008-01-05 19:45:07 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2008-01-09 18:33:11 -0600 |
commit | 47761d5aec3f27fcbb4acc7d0f4f1881cd0c0e6a (patch) | |
tree | 38337d8d741cdf4bf76f17aa189ed95cf4c63ebc | |
parent | 33f6fda8b669443d6f6ca81fc433afffd53ecfda (diff) |
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.
-rw-r--r-- | lib/libalpm/sync.c | 28 | ||||
-rw-r--r-- | pactest/tests/sync501.py | 15 | ||||
-rw-r--r-- | src/pacman/sync.c | 34 |
3 files changed, 48 insertions, 29 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index ec4af9f4..50de07ef 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -301,16 +301,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy repo_found = 1; spkg = _alpm_db_get_pkgfromcache(db, targ); if(spkg == NULL) { - /* Search provides */ - _alpm_log(PM_LOG_DEBUG, "target '%s' not found in db '%s' -- looking for provisions\n", targ, db->treename); - alpm_list_t *p = _alpm_db_whatprovides(db, targ); - if(!p) { - RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); - } - spkg = (pmpkg_t *) p->data; - _alpm_log(PM_LOG_DEBUG, "found '%s' as a provision for '%s'\n", - alpm_pkg_get_name(spkg), targ); - alpm_list_free(p); + RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); } } } @@ -325,25 +316,10 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy spkg = _alpm_db_get_pkgfromcache(db, targ); } if(spkg == NULL) { - /* Search provides */ - _alpm_log(PM_LOG_DEBUG, "target '%s' not found -- looking for provisions\n", targ); - for(j = dbs_sync; j && !spkg; j = j->next) { - pmdb_t *db = j->data; - alpm_list_t *p = _alpm_db_whatprovides(db, targ); - if(p) { - spkg = (pmpkg_t *) p->data; - _alpm_log(PM_LOG_DEBUG, "found '%s' as a provision for '%s' in db '%s'\n", - alpm_pkg_get_name(spkg), targ, db->treename); - alpm_list_free(p); - } - } + RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); } } - if(spkg == NULL) { - RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); - } - if(_alpm_pkg_should_ignore(spkg)) { int resp; QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, spkg, NULL, NULL, &resp); diff --git a/pactest/tests/sync501.py b/pactest/tests/sync501.py new file mode 100644 index 00000000..fa5f3688 --- /dev/null +++ b/pactest/tests/sync501.py @@ -0,0 +1,15 @@ +self.description = "-S provision" + +sp = pmpkg("pkg1") +sp.provides = ["provision 1.0-1"] +self.addpkg2db("sync", sp) + +sp = pmpkg("pkg2") +sp.provides = ["provision 1.0-1"] +self.addpkg2db("sync", sp) + +self.args = "-S provision" + +self.addrule("PACMAN_RETCODE=1") +self.addrule("!PKG_EXIST=pkg1") +self.addrule("!PKG_EXIST=pkg2") 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; + } } } } |