[pacman-dev] [PATCH] Handle provides with -Q
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". 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; +} + 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); + } } if(pkg == NULL) { -- 2.7.4
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
On 01/04/16 22:26, Andrew Gregory wrote:
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(+)
<snip>
Any reason not to just use alpm_find_satisfier here?
No... That would make this patch much more simple! A
participants (2)
-
Allan McRae
-
Andrew Gregory