From 0e18dd46286c3d3aacc86f8b2ceeabbfe24e0a20 Mon Sep 17 00:00:00 2001 From: Nagy Gabor Date: Fri, 16 Nov 2007 22:37:57 +0100 Subject: [PATCH] Versioned provisions This patch introduces versioned provisions in "provision 1.0-1" format. _alpm_db_whatprovides was modified accordingly (added sync500.py) alpm_depcmp was modified accordingly (add043.py passes now; added add044.py and add045.py) Note: alpm_db_search now uses the whole versioned %PROVIDES% string in its search Note: debugging was removed from alpm_depcmp Signed-off-by: Nagy Gabor --- lib/libalpm/deps.c | 42 ++++++++++++++++++++---------------------- lib/libalpm/provide.c | 21 ++++++++++++++++++++- lib/libalpm/provide.h | 1 + lib/libalpm/sync.c | 4 ++-- pactest/tests/add044.py | 15 +++++++++++++++ pactest/tests/add045.py | 15 +++++++++++++++ pactest/tests/sync500.py | 10 ++++++++++ 7 files changed, 83 insertions(+), 25 deletions(-) create mode 100644 pactest/tests/add044.py create mode 100644 pactest/tests/add045.py create mode 100644 pactest/tests/sync500.py diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 548b643..f545d14 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -470,38 +470,36 @@ static int dep_vercmp(const char *version1, pmdepmod_t mod, int SYMEXPORT alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep) { - int equal = 0; + alpm_list_t *i; ALPM_LOG_FUNC; const char *pkgname = alpm_pkg_get_name(pkg); const char *pkgversion = alpm_pkg_get_version(pkg); - if(strcmp(pkgname, dep->name) == 0 - || alpm_list_find_str(alpm_pkg_get_provides(pkg), dep->name)) { - - equal = dep_vercmp(pkgversion, dep->mod, dep->version); - - char *mod = "~="; - switch(dep->mod) { - case PM_DEP_MOD_EQ: mod = "=="; break; - case PM_DEP_MOD_GE: mod = ">="; break; - case PM_DEP_MOD_LE: mod = "<="; break; - default: break; - } - - if(strlen(dep->version) > 0) { - _alpm_log(PM_LOG_DEBUG, "depcmp: %s-%s %s %s-%s => %s\n", - pkgname, pkgversion, - mod, dep->name, dep->version, (equal ? "match" : "no match")); + /* check (pkg->name, pkg->version) */ + if(!strcmp(pkgname, dep->name) && dep_vercmp(pkgversion, dep->mod, dep->version)) { + return(1); + } + /* check provisions */ + for(i = alpm_pkg_get_provides(pkg); i; i = i->next) { + char *provname = i->data; + char *provver = strchr(pkgname, ' '); + if(provver == NULL) { /* no provision version */ + if(dep->mod == PM_DEP_MOD_ANY && !strcmp(provname, dep->name)) { + return(1); + } } else { - _alpm_log(PM_LOG_DEBUG, "depcmp: %s-%s %s %s => %s\n", - pkgname, pkgversion, - mod, dep->name, (equal ? "match" : "no match")); + *provver = '\0'; + int satisfy = !strcmp(provname, dep->name) && dep_vercmp(provver + 1, dep->mod, dep->version); + *provver = ' '; + if(satisfy) { + return(1); + } } } - return(equal); + return(0); } pmdepend_t SYMEXPORT *alpm_splitdep(const char *depstring) diff --git a/lib/libalpm/provide.c b/lib/libalpm/provide.c index df600be..0e3664f 100644 --- a/lib/libalpm/provide.c +++ b/lib/libalpm/provide.c @@ -31,6 +31,25 @@ #include "db.h" #include "log.h" +/* helper function for alpm_list_find and _alpm_db_whatprovides + * + * @return "provision.name" == needle (as string) + */ +int provisioncmp(const void *provision, const void *needle) +{ + char *tmpptr; + tmpptr = strchr((char *)provision, ' '); + + if(tmpptr == NULL) { /* no provision-version */ + return(strcmp(provision, needle)); + } else { + *tmpptr='\0'; /* we will restore this, so we won't break the function definition */ + int retval = strcmp(provision, needle); + *tmpptr=' '; + return(retval); + } +} + /* return a alpm_list_t of packages in "db" that provide "package" */ alpm_list_t *_alpm_db_whatprovides(pmdb_t *db, const char *package) @@ -47,7 +66,7 @@ alpm_list_t *_alpm_db_whatprovides(pmdb_t *db, const char *package) for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) { pmpkg_t *info = lp->data; - if(alpm_list_find_str(alpm_pkg_get_provides(info), package)) { + if(alpm_list_find(alpm_pkg_get_provides(info), (const void *)package, provisioncmp)) { pkgs = alpm_list_add(pkgs, info); } } diff --git a/lib/libalpm/provide.h b/lib/libalpm/provide.h index b5c55db..80c6f8b 100644 --- a/lib/libalpm/provide.h +++ b/lib/libalpm/provide.h @@ -25,6 +25,7 @@ #include "alpm_list.h" #include "config.h" +int provisioncmp(const void *provision, const void *needle); alpm_list_t *_alpm_db_whatprovides(pmdb_t *db, const char *package); #endif /* _ALPM_PROVIDE_H */ diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index e5748e6..de236bc 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -500,8 +500,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } pmpkg_t *local = _alpm_db_get_pkgfromcache(db_local, miss->depend.name); /* check if this package provides the package it's conflicting with */ - if(alpm_list_find_str(alpm_pkg_get_provides(sync->pkg), - miss->depend.name)) { + if(alpm_list_find(alpm_pkg_get_provides(sync->pkg), + miss->depend.name, provisioncmp)) { /* treat like a replaces item so requiredby fields are * inherited properly. */ _alpm_log(PM_LOG_DEBUG, "package '%s' provides its own conflict\n", diff --git a/pactest/tests/add044.py b/pactest/tests/add044.py new file mode 100644 index 0000000..929a9af --- /dev/null +++ b/pactest/tests/add044.py @@ -0,0 +1,15 @@ +self.description = "provision>=1.0-2 dependency (2)" + +p = pmpkg("pkg1", "1.0-2") +p.depends = ["provision>=1.0-2"] +self.addpkg(p) + +lp = pmpkg("pkg2", "1.0-2") +lp.provides = ["provision 1.0-2"] +self.addpkg2db("local", lp) + +self.args = "-A %s" % p.filename() + +self.addrule("PACMAN_RETCODE=1") +self.addrule("!PKG_EXIST=pkg1") +self.addrule("PKG_EXIST=pkg2") diff --git a/pactest/tests/add045.py b/pactest/tests/add045.py new file mode 100644 index 0000000..b53e090 --- /dev/null +++ b/pactest/tests/add045.py @@ -0,0 +1,15 @@ +self.description = "provision>=1.0-2 dependency (3)" + +p = pmpkg("pkg1", "1.0-2") +p.depends = ["provision>=1.0-2"] +self.addpkg(p) + +lp = pmpkg("pkg2", "1.0-2") +lp.provides = ["provision 1.0-1"] +self.addpkg2db("local", lp) + +self.args = "-A %s" % p.filename() + +self.addrule("PACMAN_RETCODE=1") +self.addrule("!PKG_EXIST=pkg1") +self.addrule("PKG_EXIST=pkg2") diff --git a/pactest/tests/sync500.py b/pactest/tests/sync500.py new file mode 100644 index 0000000..36364c1 --- /dev/null +++ b/pactest/tests/sync500.py @@ -0,0 +1,10 @@ +self.description = "-S provision" + +sp = pmpkg("pkg1") +sp.provides = ["provision 1.0-1"] +self.addpkg2db("sync", sp) + +self.args = "-S provision" + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_EXIST=pkg1") -- 1.5.3.5