On 04/01/16 at 02:23pm, Allan McRae wrote:
It is useful to be able to use "pacman -Qi" on any dependency, even if that dependency is a provide. For example, on Arch Linux systems, "sh" is provided by the "bash" package, and many packages depend on "sh". Querying the what package the "sh" dependency, currently first requires searching for "sh".
s/Querying the what package/Querying the package that provides/?
This patch allows the use of "pacman -Qi" on a provide.
Fixes FS#20650.
Signed-off-by: Allan McRae <allan@archlinux.org> --- src/pacman/query.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
diff --git a/src/pacman/query.c b/src/pacman/query.c index 0cc12e6..19e4b3f 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -80,6 +80,32 @@ static int search_path(char **filename, struct stat *bufptr) return -1; }
+static alpm_pkg_t *find_provider(alpm_db_t *db_local, const char *name) +{ + alpm_list_t *packages, *i; + alpm_pkg_t *pkg = NULL; + int found = 0; + + packages = alpm_db_get_pkgcache(db_local); + + for(i = packages; i && !found; i = alpm_list_next(i)) { + alpm_list_t *provides, *p; + + pkg = i->data; + provides = alpm_pkg_get_provides(pkg); + + for(p = provides; p; p = alpm_list_next(p)) { + alpm_depend_t *d = p->data; + if(strcmp(name, d->name) == 0) { + found = 1; + break; + } + } + } + + return pkg; +}
The package can be returned immediately, so there's no need for the found/break. More importantly, because pkg is used to refer to the package currently being checked, if no provider is found it will just return the last package in the list: pacman -Qi not-a-real-package-name # prints zziplib
+ static void print_query_fileowner(const char *filename, alpm_pkg_t *info) { if(!config->quiet) { @@ -462,6 +488,10 @@ int pacman_query(alpm_list_t *targets) alpm_pkg_load(config->handle, strname, 1, 0, &pkg); } else { pkg = alpm_db_get_pkg(db_local, strname); + /* if pkg is not found, return the first package that provides it */ + if(pkg == NULL) { + pkg = find_provider(db_local, strname);
Any reason not to just use alpm_find_satisfier here?
+ } }
if(pkg == NULL) { -- 2.7.4