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)
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;
+ }
}
}
}