[pacman-dev] [PATCH] Show 'Required By' in -Si output

Nagy Gabor ngaba at bibl.u-szeged.hu
Thu Oct 8 12:35:06 EDT 2009


> Just as we do in -Qi, we can compute required by information for sync
> database packages. The behavior seems sane; for a given package, the -Si
> required by will show all packages in *any* sync database that require it.
> 
> Implements FS#16244.
> 
> Signed-off-by: Dan McGee <dan at archlinux.org>
> ---
>  lib/libalpm/package.c |   46 ++++++++++++++++++++++++++++++++++++----------
>  src/pacman/package.c  |   13 ++++---------
>  2 files changed, 40 insertions(+), 19 deletions(-)
> 
> diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
> index de17166..b0b6480 100644
> --- a/lib/libalpm/package.c
> +++ b/lib/libalpm/package.c
> @@ -556,6 +556,21 @@ unsigned short SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
>  	return pkg->scriptlet;
>  }
>  
> +static void find_requiredby(pmpkg_t *pkg, pmdb_t *db, alpm_list_t **reqs)
> +{
> +	const alpm_list_t *i;
> +	for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
> +		if(!i->data) {
> +			continue;
> +		}
> +		pmpkg_t *cachepkg = i->data;
> +		if(_alpm_dep_edge(cachepkg, pkg)) {
> +			const char *cachepkgname = alpm_pkg_get_name(cachepkg);
> +			*reqs = alpm_list_add(*reqs, strdup(cachepkgname));
> +		}
> +	}
> +}
> +
>  /**
>   * @brief Compute the packages requiring a given package.
>   * @param pkg a package
> @@ -565,18 +580,29 @@ alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
>  {
>  	const alpm_list_t *i;
>  	alpm_list_t *reqs = NULL;
> +	pmdb_t *db;
>  
> -	pmdb_t *localdb = alpm_option_get_localdb();
> -	for(i = _alpm_db_get_pkgcache(localdb); i; i = i->next) {
> -		if(!i->data) {
> -			continue;
> -		}
> -		pmpkg_t *cachepkg = i->data;
> -		if(_alpm_dep_edge(cachepkg, pkg)) {
> -			const char *cachepkgname = alpm_pkg_get_name(cachepkg);
> -			reqs = alpm_list_add(reqs, strdup(cachepkgname));
> +	if(pkg->origin == PKG_FROM_FILE) {
> +		/* The sane option; search locally for things that require this. */
> +		db = alpm_option_get_localdb();
> +		fprintf(stderr, "db name: %s\n", db->treename);
> +		find_requiredby(pkg, db, &reqs);
> +	} else {
> +		/* We have a DB package. if it is a local package, then we should
> +		 * only search the local DB; else search all known sync databases. */
> +		db = pkg->origin_data.db;
> +		if(db->is_local) {
> +			fprintf(stderr, "db name: %s\n", db->treename);
> +			find_requiredby(pkg, db, &reqs);
> +		} else {
> +			for(i = handle->dbs_sync; i; i = i->next) {
> +				db = i->data;
> +				fprintf(stderr, "db name: %s\n", db->treename);
> +				find_requiredby(pkg, db, &reqs);
> +			}
>  		}
>  	}
> +
>  	return(reqs);
>  }
>  
> diff --git a/src/pacman/package.c b/src/pacman/package.c
> index 3b14516..e7e2552 100644
> --- a/src/pacman/package.c
> +++ b/src/pacman/package.c
> @@ -83,10 +83,8 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
>  		depstrings = alpm_list_add(depstrings, alpm_dep_compute_string(dep));
>  	}
>  
> -	if(level>0) {
> -		/* compute this here so we don't get a pause in the middle of output */
> -		requiredby = alpm_pkg_compute_requiredby(pkg);
> -	}
> +	/* compute this here so we don't get a pause in the middle of output */
> +	requiredby = alpm_pkg_compute_requiredby(pkg);
>  
>  	/* actual output */
>  	string_display(_("Name           :"), alpm_pkg_get_name(pkg));
> @@ -97,11 +95,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
>  	list_display(_("Provides       :"), alpm_pkg_get_provides(pkg));
>  	list_display(_("Depends On     :"), depstrings);
>  	list_display_linebreak(_("Optional Deps  :"), alpm_pkg_get_optdepends(pkg));
> -	/* Only applicable if installed */
> -	if(level > 0) {
> -		list_display(_("Required By    :"), requiredby);
> -		FREELIST(requiredby);
> -	}
> +	list_display(_("Required By    :"), requiredby);
>  	list_display(_("Conflicts With :"), alpm_pkg_get_conflicts(pkg));
>  	list_display(_("Replaces       :"), alpm_pkg_get_replaces(pkg));
>  	if(level < 0) {
> @@ -142,6 +136,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
>  	printf("\n");
>  
>  	FREELIST(depstrings);
> +	FREELIST(requiredby);
>  }
>  
>  /* Display the content of a sync package

I suspect that the "fprintf(stderr, ...)" debug lines were left
accidentally in the patch. ;-) The rest seems fine.

About the -Si vs. -Sii question: I don't know. Default -Si requiredby
would slow down the the operation (with cold cache) and may spam the
output, -Sii would not be coherent with -Qii.

Bye




More information about the pacman-dev mailing list