diff --git a/bin/xbps-bin/Makefile b/bin/xbps-bin/Makefile index 546853bb..60c8cd85 100644 --- a/bin/xbps-bin/Makefile +++ b/bin/xbps-bin/Makefile @@ -1,5 +1,5 @@ BIN = xbps-bin -OBJS = check.o install.o main.o remove.o ../xbps-repo/util.o +OBJS = check.o install.o main.o remove.o show-deps.o ../xbps-repo/util.o TOPDIR = ../.. include $(TOPDIR)/prog.mk diff --git a/bin/xbps-bin/defs.h b/bin/xbps-bin/defs.h index e5664073..11a75f85 100644 --- a/bin/xbps-bin/defs.h +++ b/bin/xbps-bin/defs.h @@ -31,5 +31,7 @@ void xbps_autoremove_pkgs(void); void xbps_remove_installed_pkg(const char *, bool); void xbps_autoupdate_pkgs(bool); int xbps_check_pkg_integrity(const char *); +int xbps_show_pkg_deps(const char *); +int xbps_show_pkg_reverse_deps(const char *); #endif /* !_XBPS_BIN_DEFS_H_ */ diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c index 1b3ef8c1..78c54fb1 100644 --- a/bin/xbps-bin/main.c +++ b/bin/xbps-bin/main.c @@ -42,7 +42,7 @@ usage(void) printf("Usage: xbps-bin [options] [target] [arguments]\n\n" " Available targets:\n" " autoremove, autoupdate, check, files, install, list\n" - " purge, remove, show, update\n" + " purge, remove, show, show-deps, show-revdeps, update\n" " Targets with arguments:\n" " check\t\n" " files\t\n" @@ -51,6 +51,8 @@ usage(void) " reconfigure\t[|]\n" " remove\t\n" " show\t\n" + " show-deps\t\n" + " show-revdeps\t\n" " update\t\n" " Options shared by all targets:\n" " -r\t\t\n" @@ -238,6 +240,24 @@ main(int argc, char **argv) else rv = xbps_configure_pkg(argv[1], true); + } else if (strcasecmp(argv[0], "show-deps") == 0) { + /* + * Show dependencies for a package. + */ + if (argc != 2) + usage(); + + rv = xbps_show_pkg_deps(argv[1]); + + } else if (strcasecmp(argv[0], "show-revdeps") == 0) { + /* + * Show reverse dependencies for a package. + */ + if (argc != 2) + usage(); + + rv = xbps_show_pkg_reverse_deps(argv[1]); + } else { usage(); } diff --git a/bin/xbps-bin/show-deps.c b/bin/xbps-bin/show-deps.c new file mode 100644 index 00000000..7c3532b8 --- /dev/null +++ b/bin/xbps-bin/show-deps.c @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 2009 Juan Romero Pardines. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include +#include "../xbps-repo/util.h" +#include "defs.h" + +static int +list_deps(prop_object_t obj, void *arg, bool *loop_done) +{ + char *pkgname; + const char *version; + + (void)arg; + (void)loop_done; + + assert(prop_object_type(obj) == PROP_TYPE_STRING); + + pkgname = xbps_get_pkg_name(prop_string_cstring_nocopy(obj)); + version = xbps_get_pkg_version(prop_string_cstring_nocopy(obj)); + if (strcmp(version, "0") == 0) + printf("%s\n", pkgname); + else + printf("%s >= %s\n", pkgname, version); + + free(pkgname); + + return 0; +} + +int +xbps_show_pkg_deps(const char *pkgname) +{ + prop_dictionary_t pkgd, propsd; + const char *rootdir; + char *path; + int rv = 0; + + assert(pkgname != NULL); + + rootdir = xbps_get_rootdir(); + pkgd = xbps_find_pkg_installed_from_plist(pkgname); + if (pkgd == NULL) { + printf("Package %s is not installed.\n", pkgname); + return 0; + } + + /* + * Check for props.plist metadata file. + */ + path = xbps_xasprintf("%s/%s/metadata/%s/%s", rootdir, + XBPS_META_PATH, pkgname, XBPS_PKGPROPS); + if (path == NULL) + return errno; + + propsd = prop_dictionary_internalize_from_file(path); + free(path); + if (propsd == NULL) { + printf("%s: unexistent %s metadata file.\n", pkgname, + XBPS_PKGPROPS); + return errno; + } + + rv = xbps_callback_array_iter_in_dict(propsd, "run_depends", + list_deps, NULL); + xbps_release_regpkgdb_dict(); + + return rv; +} + +int +xbps_show_pkg_reverse_deps(const char *pkgname) +{ + prop_dictionary_t pkgd; + int rv = 0; + + pkgd = xbps_find_pkg_installed_from_plist(pkgname); + if (pkgd == NULL) { + printf("Package %s is not installed.\n", pkgname); + return 0; + } + + rv = xbps_callback_array_iter_in_dict(pkgd, "requiredby", + list_strings_sep_in_array, NULL); + + return rv; +} diff --git a/bin/xbps-repo/util.c b/bin/xbps-repo/util.c index ca4189ee..e21dce25 100644 --- a/bin/xbps-repo/util.c +++ b/bin/xbps-repo/util.c @@ -97,14 +97,6 @@ show_pkg_info(prop_dictionary_t dict) if (obj && prop_object_type(obj) == PROP_TYPE_STRING) printf("SHA256: %s\n", prop_string_cstring_nocopy(obj)); - obj = prop_dictionary_get(dict, "run_depends"); - if (obj && prop_object_type(obj) == PROP_TYPE_ARRAY) { - printf("Dependencies:\n"); - (void)xbps_callback_array_iter_in_dict(dict, "run_depends", - list_strings_in_array, NULL); - printf("\n\n"); - } - obj = prop_dictionary_get(dict, "conf_files"); if (obj && prop_object_type(obj) == PROP_TYPE_ARRAY) { printf("Configuration files:\n");