mirror of
https://github.com/moparisthebest/pacman
synced 2024-11-11 03:54:59 -05:00
Move the fallback on providers from backend to frontend.
This reverts commit e28973169d
.
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.
This commit is contained in:
parent
33f6fda8b6
commit
47761d5aec
@ -301,16 +301,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
|
|||||||
repo_found = 1;
|
repo_found = 1;
|
||||||
spkg = _alpm_db_get_pkgfromcache(db, targ);
|
spkg = _alpm_db_get_pkgfromcache(db, targ);
|
||||||
if(spkg == NULL) {
|
if(spkg == NULL) {
|
||||||
/* Search provides */
|
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
|
||||||
_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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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);
|
spkg = _alpm_db_get_pkgfromcache(db, targ);
|
||||||
}
|
}
|
||||||
if(spkg == NULL) {
|
if(spkg == NULL) {
|
||||||
/* Search provides */
|
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
|
||||||
_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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(spkg == NULL) {
|
|
||||||
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(_alpm_pkg_should_ignore(spkg)) {
|
if(_alpm_pkg_should_ignore(spkg)) {
|
||||||
int resp;
|
int resp;
|
||||||
QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, spkg, NULL, NULL, &resp);
|
QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, spkg, NULL, NULL, &resp);
|
||||||
|
15
pactest/tests/sync501.py
Normal file
15
pactest/tests/sync501.py
Normal file
@ -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")
|
@ -605,9 +605,37 @@ static int sync_trans(alpm_list_t *targets, int sync_only)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!found) {
|
if(!found) {
|
||||||
fprintf(stderr, _("error: '%s': not found in sync db\n"), targ);
|
/* targ not found in sync db, searching for providers... */
|
||||||
retval = 1;
|
alpm_list_t *prov = NULL;
|
||||||
goto cleanup;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user