diff --git a/NEWS b/NEWS index 0d6c841c..11065ac1 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ xbps-0.18 (???): + * xbps-query(8): implemented support to know reverse dependencies + in repository mode; that means you can now exactly what packages + require the target package from all registered repositories. + * The virtual package configuration files are now read dynamically by libxbps at initialization time from default configuration directory: /etc/xbps/virtualpkg.d. Only files that end in ".conf" will diff --git a/TODO b/TODO index 656db01a..280cf050 100644 --- a/TODO +++ b/TODO @@ -9,8 +9,6 @@ xbps-create: All: - Add support to sign with PGP or RSA the repository index files. - - Add requiredby support to pkg's dictionaries in repository's index, - to know reverse deps from remote repos. Issues listed at http://code.google.com/p/xbps/issues/list diff --git a/bin/xbps-query/defs.h b/bin/xbps-query/defs.h index 9a0b0b64..cd0cffea 100644 --- a/bin/xbps-query/defs.h +++ b/bin/xbps-query/defs.h @@ -28,10 +28,15 @@ #include +#ifndef __UNCONST +#define __UNCONST(a) ((void *)(unsigned long)(const void *)(a)) +#endif + /* from show-deps.c */ int show_pkg_deps(struct xbps_handle *, const char *); int show_pkg_revdeps(struct xbps_handle *, const char *); int repo_show_pkg_deps(struct xbps_handle *, const char *); +int repo_show_pkg_revdeps(struct xbps_handle *, const char *); /* from show-info-files.c */ void show_pkg_info(prop_dictionary_t); diff --git a/bin/xbps-query/main.c b/bin/xbps-query/main.c index 7053e173..3a6cfa91 100644 --- a/bin/xbps-query/main.c +++ b/bin/xbps-query/main.c @@ -251,8 +251,13 @@ main(int argc, char **argv) } else if (show_rdeps) { /* show-rdeps mode */ - rv = show_pkg_revdeps(&xh, argv[optind]); - + if (repo_mode) + rv = repo_show_pkg_revdeps(&xh, argv[optind]); + else { + rv = show_pkg_revdeps(&xh, argv[optind]); + if (rv == ENOENT) + rv = repo_show_pkg_revdeps(&xh, argv[optind]); + } } xbps_end(&xh); diff --git a/bin/xbps-query/show-deps.c b/bin/xbps-query/show-deps.c index 2786a1b4..f6f755f6 100644 --- a/bin/xbps-query/show-deps.c +++ b/bin/xbps-query/show-deps.c @@ -90,3 +90,49 @@ repo_show_pkg_deps(struct xbps_handle *xhp, const char *pattern) return 0; } + +static int +repo_revdeps_cb(struct xbps_handle *xhp, + struct xbps_rpool_index *rpi, + void *arg, + bool *done) +{ + prop_dictionary_t pkgd; + prop_array_t pkgdeps; + const char *pkgver, *arch, *pattern = arg; + size_t i; + + (void)done; + + for (i = 0; i < prop_array_count(rpi->repo); i++) { + pkgd = prop_array_get(rpi->repo, i); + pkgdeps = prop_dictionary_get(pkgd, "run_depends"); + if (pkgdeps == NULL || prop_array_count(pkgdeps) == 0) + continue; + + if (xbps_match_pkgdep_in_array(pkgdeps, pattern)) { + prop_dictionary_get_cstring_nocopy(pkgd, + "architecture", &arch); + if (xbps_pkg_arch_match(xhp, arch, NULL)) { + prop_dictionary_get_cstring_nocopy(pkgd, + "pkgver", &pkgver); + printf("%s\n", pkgver); + } + } + } + + return 0; +} + +int +repo_show_pkg_revdeps(struct xbps_handle *xhp, const char *pkg) +{ + char *pattern; + + if (xbps_pkg_version(pkg)) + pattern = strdup(pkg); + else + pattern = xbps_xasprintf("%s-9999999", pkg); + + return xbps_rpool_foreach(xhp, repo_revdeps_cb, pattern); +}