xbps-query: implemented -X, --revdeps in repository mode.

This commit is contained in:
Juan RP 2012-11-21 02:52:36 +01:00
parent 37e5d7ebe0
commit 79a31bb6bc
5 changed files with 62 additions and 4 deletions

4
NEWS
View File

@ -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:
<rootdir>/etc/xbps/virtualpkg.d. Only files that end in ".conf" will

2
TODO
View File

@ -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

View File

@ -28,10 +28,15 @@
#include <xbps_api.h>
#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);

View File

@ -251,8 +251,13 @@ main(int argc, char **argv)
} else if (show_rdeps) {
/* show-rdeps mode */
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);

View File

@ -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);
}