[pacman-dev] [PATCH] Versioned provisions

Xavier shiningxc at gmail.com
Fri Nov 16 19:10:32 EST 2007


On Fri, Nov 16, 2007 at 11:20:30PM +0100, Nagy Gabor wrote:
> 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);
> +	}
> +}
> +

Hmm ok, you restore it, but does that count ? :)
I thought a const shouldn't be modified in any cases.
But gcc doesn't seem to complain about it.

Also, I think something like _alpm_prov_cmp would be more consistent with the
other function names.

>  /* 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 */

It isn't a comment on your patch, but on the actual state of pacman :
why do we have a provide.c and provide.h just for the private
_alpm_db_whatprovides function ?
What's even more strange is that the public alpm_db_whatprovides is defined
in db.c . So any objections for eliminating provide.{c,h} , and moving
_alpm_db_whatprovides to db.c ?

> 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")

I don't understand the rules, why should this pactest fail?

> 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")

Interesting, the code for handling this is both in libalpm/sync.c (addtarget)
and in pacman/sync.c .
I suppose if we remove the part from the frontend, and this pactest still
pass, it would be a good confirmation :)




More information about the pacman-dev mailing list