summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChantry Xavier <shiningxc@gmail.com>2008-01-05 19:45:07 +0100
committerDan McGee <dan@archlinux.org>2008-01-09 18:33:11 -0600
commit47761d5aec3f27fcbb4acc7d0f4f1881cd0c0e6a (patch)
tree38337d8d741cdf4bf76f17aa189ed95cf4c63ebc
parent33f6fda8b669443d6f6ca81fc433afffd53ecfda (diff)
downloadpacman-47761d5aec3f27fcbb4acc7d0f4f1881cd0c0e6a.tar.xz
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.c28
-rw-r--r--pactest/tests/sync501.py15
-rw-r--r--src/pacman/sync.c34
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;
+ }
}
}
}