commit: 04cd07b4cd72c4a7a2593bf5cceef839c8136130
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 8 14:13:56 2026 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Feb 8 14:13:56 2026 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=04cd07b4
qdepends: reflow for 2026 style
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
qdepends.c | 869 +++++++++++++++++++++++++++++++++----------------------------
1 file changed, 465 insertions(+), 404 deletions(-)
diff --git a/qdepends.c b/qdepends.c
index f2882103..aa780dca 100644
--- a/qdepends.c
+++ b/qdepends.c
@@ -24,48 +24,48 @@
#define QDEPENDS_FLAGS "drpbIQitUF:SR" COMMON_FLAGS
static struct option const qdepends_long_opts[] = {
- {"depend", no_argument, NULL, 'd'},
- {"rdepend", no_argument, NULL, 'r'},
- {"pdepend", no_argument, NULL, 'p'},
- {"bdepend", no_argument, NULL, 'b'},
- {"idepend", no_argument, NULL, 'I'},
- {"query", no_argument, NULL, 'Q'},
- {"installed", no_argument, NULL, 'i'},
- {"tree", no_argument, NULL, 't'},
- {"use", no_argument, NULL, 'U'},
- {"format", a_argument, NULL, 'F'},
- {"pretty", no_argument, NULL, 'S'},
- {"resolve", no_argument, NULL, 'R'},
- COMMON_LONG_OPTS
+ {"depend", no_argument, NULL, 'd'},
+ {"rdepend", no_argument, NULL, 'r'},
+ {"pdepend", no_argument, NULL, 'p'},
+ {"bdepend", no_argument, NULL, 'b'},
+ {"idepend", no_argument, NULL, 'I'},
+ {"query", no_argument, NULL, 'Q'},
+ {"installed", no_argument, NULL, 'i'},
+ {"tree", no_argument, NULL, 't'},
+ {"use", no_argument, NULL, 'U'},
+ {"format", a_argument, NULL, 'F'},
+ {"pretty", no_argument, NULL, 'S'},
+ {"resolve", no_argument, NULL, 'R'},
+ COMMON_LONG_OPTS
};
static const char * const qdepends_opts_help[] = {
- "Show DEPEND info",
- "Show RDEPEND info",
- "Show PDEPEND info",
- "Show BDEPEND info",
- "Show IDEPEND info",
- "Query reverse deps",
- "Search installed packages using VDB",
- "Search available ebuilds in the tree",
- "Apply profile USE-flags to conditional deps",
- "Print matched atom using given format string",
- "Pretty format specified depend strings",
- "Resolve found dependencies to package versions",
- COMMON_OPTS_HELP
+ "Show DEPEND info",
+ "Show RDEPEND info",
+ "Show PDEPEND info",
+ "Show BDEPEND info",
+ "Show IDEPEND info",
+ "Query reverse deps",
+ "Search installed packages using VDB",
+ "Search available ebuilds in the tree",
+ "Apply profile USE-flags to conditional deps",
+ "Print matched atom using given format string",
+ "Pretty format specified depend strings",
+ "Resolve found dependencies to package versions",
+ COMMON_OPTS_HELP
};
#define qdepends_usage(ret) usage(ret, QDEPENDS_FLAGS, qdepends_long_opts,
qdepends_opts_help, NULL, lookup_applet_idx("qdepends"))
/* structures / types / etc ... */
struct qdepends_opt_state {
- unsigned int qmode;
- array *atoms;
- set *udeps;
- char *depend;
- size_t depend_len;
- const char *format;
- char resolve:1;
- tree_ctx *vdb;
- tree_ctx *rtree;
+ unsigned int qmode;
+ array *atoms;
+ set *udeps;
+ char *depend;
+ size_t depend_len;
+ const char *format;
+ char resolve:1;
+ tree_ctx *vdb;
+ tree_ctx *rtree;
};
#define QMODE_DEPEND (1<<0)
@@ -82,394 +82,455 @@ struct qdepends_opt_state {
#define QMODE_DEP_LAST QMODE_IDEPEND
const char *depend_files[] = { /* keep *DEPEND aligned with above defines */
- /* 0 */ "DEPEND",
- /* 1 */ "RDEPEND",
- /* 2 */ "PDEPEND",
- /* 3 */ "BDEPEND",
- /* 4 */ "IDEPEND",
- /* 5 */ NULL
+ /* 0 */ "DEPEND",
+ /* 1 */ "RDEPEND",
+ /* 2 */ "PDEPEND",
+ /* 3 */ "BDEPEND",
+ /* 4 */ "IDEPEND",
+ /* 5 */ NULL
};
-static bool
-qdepends_print_depend(FILE *fp, const char *depend)
+static bool qdepends_print_depend
+(
+ FILE *fp,
+ const char *depend
+)
{
- dep_node_t *dep_tree;
+ dep_node_t *dep_tree;
- dep_tree = dep_grow_tree(depend);
- if (dep_tree == NULL)
- return false;
+ dep_tree = dep_grow_tree(depend);
+ if (dep_tree == NULL)
+ return false;
- if (!quiet)
- fprintf(fp, "DEPEND=\"\n");
+ if (!quiet)
+ fprintf(fp, "DEPEND=\"\n");
- dep_print_tree(fp, dep_tree, 1, NULL, NORM, verbose > 1);
+ dep_print_tree(fp, dep_tree, 1, NULL, NORM, verbose > 1);
- dep_burn_tree(dep_tree);
- if (!quiet)
- fprintf(fp, "\"\n");
+ dep_burn_tree(dep_tree);
+ if (!quiet)
+ fprintf(fp, "\"\n");
- return true;
+ return true;
}
static int
-qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
+qdepends_results_cb
+(
+ tree_pkg_ctx *pkg_ctx,
+ void *priv
+)
{
- struct qdepends_opt_state *state = priv;
- depend_atom *atom;
- depend_atom *datom;
- depend_atom *fatom;
- array *deps;
- bool firstmatch = false;
- char buf[_Q_PATH_MAX];
- const char **dfile;
- size_t i;
- size_t n;
- size_t m;
- int ret = 0;
- dep_node_t *dep_tree;
- char **d;
- char *depstr;
-
- /* matrix consists of:
- * - QMODE_*DEPEND
- * - QMODE_REVERSE or not
- *
- * REVERSE vs forward mode requires a different search strategy,
- * *DEPEND alters the search somewhat and affects results printing.
- */
-
- datom = tree_pkg_atom(pkg_ctx, false);
- if (datom == NULL)
- return ret;
-
- if ((state->qmode & QMODE_REVERSE) == 0) {
- /* see if this cat/pkg is requested */
- array_for_each(state->atoms, i, atom) {
- if (atom->blocker != ATOM_BL_NONE ||
- atom->SLOT != NULL ||
- atom->REPO != NULL)
- datom = tree_pkg_atom(pkg_ctx, true);
- if (atom_compare(datom, atom) == EQUAL) {
- atom = NULL;
- break;
- }
- }
-
- /* nothing matched */
- if (atom != NULL)
- return ret;
-
- ret = 1;
-
- datom = tree_pkg_atom(pkg_ctx, true);
- printf("%s:", atom_format(state->format, datom));
- }
-
- clear_set(state->udeps);
+ char buf[_Q_PATH_MAX];
+ struct qdepends_opt_state *state = priv;
+ atom_ctx *atom;
+ atom_ctx *datom;
+ atom_ctx *fatom;
+ array *deps;
+ dep_node_t *dep_tree;
+ char *depstr;
+ char **d;
+ const char **dfile;
+ size_t i;
+ size_t n;
+ size_t m;
+ int ret = 0;
+ bool firstmatch = false;
+
+ /* matrix consists of:
+ * - QMODE_*DEPEND
+ * - QMODE_REVERSE or not
+ *
+ * REVERSE vs forward mode requires a different search strategy,
+ * *DEPEND alters the search somewhat and affects results printing. */
+
+ datom = tree_pkg_atom(pkg_ctx, false);
+ if (datom == NULL)
+ return ret;
+
+ if ((state->qmode & QMODE_REVERSE) == 0)
+ {
+ /* see if this cat/pkg is requested */
+ array_for_each(state->atoms, i, atom)
+ {
+ if (atom->blocker != ATOM_BL_NONE ||
+ atom->SLOT != NULL ||
+ atom->REPO != NULL)
+ datom = tree_pkg_atom(pkg_ctx, true);
+ if (atom_compare(datom, atom) == EQUAL)
+ {
+ atom = NULL;
+ break;
+ }
+ }
+
+ /* nothing matched */
+ if (atom != NULL)
+ return ret;
+
+ ret = 1;
+
+ datom = tree_pkg_atom(pkg_ctx, true);
+ printf("%s:", atom_format(state->format, datom));
+ }
+
+ clear_set(state->udeps);
#define get_depstr(X,Y) \
- X == QMODE_DEPEND ? tree_pkg_meta(Y, Q_DEPEND) : \
- X == QMODE_RDEPEND ? tree_pkg_meta(Y, Q_RDEPEND) : \
- X == QMODE_PDEPEND ? tree_pkg_meta(Y, Q_PDEPEND) : \
- X == QMODE_BDEPEND ? tree_pkg_meta(Y, Q_BDEPEND) : \
- tree_pkg_meta(Y, Q_IDEPEND) ;
-
- dfile = depend_files;
- for (i = QMODE_DEP_FIRST; i <= QMODE_DEP_LAST; i <<= 1, dfile++) {
- if (!(state->qmode & i))
- continue;
-
- depstr = get_depstr(i, pkg_ctx);
- if (depstr == NULL)
- continue;
- dep_tree = dep_grow_tree(depstr);
- if (dep_tree == NULL) {
- warn("failed to parse depstring from %s\n",
atom_to_string(datom));
- continue;
- }
-
- deps = array_new();
-
- if (state->qmode & QMODE_TREE &&
- !(state->qmode & QMODE_REVERSE) &&
- verbose)
- {
- if (state->resolve)
- {
- set_t *use = NULL;
- array *ma = tree_match_atom(state->vdb,
-
datom,
-
(TREE_MATCH_DEFAULT |
-
TREE_MATCH_FIRST));
- if (array_cnt(ma) > 0)
- {
- tree_pkg_ctx *p = array_get(ma, 0);
- use = set_add_from_string(NULL,
tree_pkg_meta(p, Q_USE));
- }
- dep_resolve_tree(dep_tree, state->vdb, use);
- array_free(ma);
- set_free(use);
- }
- } else {
- if (state->qmode & QMODE_FILTERUSE)
- dep_prune_use(dep_tree, ev_use);
- dep_flatten_tree(dep_tree, deps);
- }
-
- if (verbose) {
- if (state->qmode & QMODE_REVERSE) {
- array_for_each(deps, m, atom) {
- array_for_each(state->atoms, n, fatom) {
- if (atom_compare(atom, fatom)
== EQUAL) {
- fatom = NULL;
- break;
- }
- }
- if (fatom == NULL) {
- atom = NULL;
- break;
- }
- }
- if (atom == NULL) {
- ret = 1;
-
- if (!firstmatch) {
- datom = tree_pkg_atom(pkg_ctx,
true);
- printf("%s:",
atom_format(state->format, datom));
- }
- firstmatch = true;
-
- printf("\n%s=\"\n", *dfile);
- dep_print_tree(stdout, dep_tree, 1,
state->atoms,
- RED, verbose > 1);
- printf("\"");
- }
- } else {
- /* try and resolve expressions to real package
atoms */
- if (state->resolve)
- dep_resolve_tree(dep_tree, state->vdb,
ev_use);
-
- printf("\n%s=\"\n", *dfile);
- dep_print_tree(stdout, dep_tree, 1, deps,
- GREEN, verbose > 1);
- printf("\"");
- }
- } else {
- if (state->qmode & QMODE_REVERSE) {
- array_for_each(deps, m, atom) {
- array_for_each(state->atoms, n, fatom) {
- if (atom_compare(atom, fatom)
== EQUAL) {
- fatom = NULL;
- break;
- }
- }
- if (fatom == NULL) {
- ret = 1;
-
- if (!firstmatch) {
- datom =
tree_pkg_atom(pkg_ctx, true);
- printf("%s%s",
atom_format(state->format, datom),
- quiet <
2 ? ":" : "");
- }
- firstmatch = true;
-
- snprintf(buf, sizeof(buf),
"%s%s%s",
- RED,
atom_to_string(atom), NORM);
- if (quiet < 2)
- state->udeps =
add_set_unique(buf,
-
state->udeps, NULL);
- } else if (!quiet) {
- state->udeps =
add_set_unique(atom_to_string(atom),
-
state->udeps, NULL);
- }
- }
- } else {
- array_for_each(deps, m, atom)
- state->udeps =
add_set_unique(atom_to_string(atom),
-
state->udeps, NULL);
- }
- }
-
- array_free(deps);
- dep_burn_tree(dep_tree);
- }
- if (verbose && ret == 1)
- printf("\n");
+ X == QMODE_DEPEND ? tree_pkg_meta(Y, Q_DEPEND) : \
+ X == QMODE_RDEPEND ? tree_pkg_meta(Y, Q_RDEPEND) : \
+ X == QMODE_PDEPEND ? tree_pkg_meta(Y, Q_PDEPEND) : \
+ X == QMODE_BDEPEND ? tree_pkg_meta(Y, Q_BDEPEND) : \
+ tree_pkg_meta(Y, Q_IDEPEND) ;
+
+ dfile = depend_files;
+ for (i = QMODE_DEP_FIRST; i <= QMODE_DEP_LAST; i <<= 1, dfile++)
+ {
+ if (!(state->qmode & i))
+ continue;
+
+ depstr = get_depstr(i, pkg_ctx);
+ if (depstr == NULL)
+ continue;
+ dep_tree = dep_grow_tree(depstr);
+ if (dep_tree == NULL) {
+ warn("failed to parse depstring from %s\n", atom_to_string(datom));
+ continue;
+ }
+
+ deps = array_new();
+
+ if (state->qmode & QMODE_TREE &&
+ !(state->qmode & QMODE_REVERSE) &&
+ verbose)
+ {
+ if (state->resolve)
+ {
+ set_t *use = NULL;
+ array *ma = tree_match_atom(state->vdb,
+ datom,
+ (TREE_MATCH_DEFAULT |
+ TREE_MATCH_FIRST));
+ if (array_cnt(ma) > 0)
+ {
+ tree_pkg_ctx *p = array_get(ma, 0);
+ use = set_add_from_string(NULL, tree_pkg_meta(p, Q_USE));
+ }
+ dep_resolve_tree(dep_tree, state->vdb, use);
+ array_free(ma);
+ set_free(use);
+ }
+ }
+ else
+ {
+ if (state->qmode & QMODE_FILTERUSE)
+ dep_prune_use(dep_tree, ev_use);
+ dep_flatten_tree(dep_tree, deps);
+ }
+
+ if (verbose) {
+ if (state->qmode & QMODE_REVERSE)
+ {
+ array_for_each(deps, m, atom)
+ {
+ array_for_each(state->atoms, n, fatom)
+ {
+ if (atom_compare(atom, fatom) == EQUAL)
+ {
+ fatom = NULL;
+ break;
+ }
+ }
+ if (fatom == NULL)
+ {
+ atom = NULL;
+ break;
+ }
+ }
+ if (atom == NULL)
+ {
+ ret = 1;
+
+ if (!firstmatch)
+ {
+ datom = tree_pkg_atom(pkg_ctx, true);
+ printf("%s:", atom_format(state->format, datom));
+ }
+ firstmatch = true;
+
+ printf("\n%s=\"\n", *dfile);
+ dep_print_tree(stdout, dep_tree, 1, state->atoms,
+ RED, verbose > 1);
+ printf("\"");
+ }
+ }
+ else
+ {
+ /* try and resolve expressions to real package atoms */
+ if (state->resolve)
+ dep_resolve_tree(dep_tree, state->vdb, ev_use);
+
+ printf("\n%s=\"\n", *dfile);
+ dep_print_tree(stdout, dep_tree, 1, deps,
+ GREEN, verbose > 1);
+ printf("\"");
+ }
+ }
+ else
+ {
+ if (state->qmode & QMODE_REVERSE)
+ {
+ array_for_each(deps, m, atom)
+ {
+ array_for_each(state->atoms, n, fatom)
+ {
+ if (atom_compare(atom, fatom) == EQUAL)
+ {
+ fatom = NULL;
+ break;
+ }
+ }
+ if (fatom == NULL)
+ {
+ ret = 1;
+
+ if (!firstmatch)
+ {
+ datom = tree_pkg_atom(pkg_ctx, true);
+ printf("%s%s", atom_format(state->format, datom),
+ quiet < 2 ? ":" : "");
+ }
+ firstmatch = true;
+
+ snprintf(buf, sizeof(buf), "%s%s%s",
+ RED, atom_to_string(atom), NORM);
+ if (quiet < 2)
+ state->udeps = add_set_unique(buf,
+ state->udeps, NULL);
+ }
+ else if (!quiet)
+ {
+ state->udeps = add_set_unique(atom_to_string(atom),
+ state->udeps, NULL);
+ }
+ }
+ }
+ else
+ {
+ array_for_each(deps, m, atom)
+ state->udeps = add_set_unique(atom_to_string(atom),
+ state->udeps, NULL);
+ }
+ }
+
+ array_free(deps);
+ dep_burn_tree(dep_tree);
+ }
+ if (verbose && ret == 1)
+ printf("\n");
#undef get_depstr
- if (!verbose) {
- if ((state->qmode & QMODE_REVERSE) == 0 || ret == 1) {
- for (n = list_set(state->udeps, &d); n > 0; n--)
- printf(" %s", d[n -1]);
- free(d);
- printf("\n");
- }
- }
-
- return ret;
+ if (!verbose)
+ {
+ if ((state->qmode & QMODE_REVERSE) == 0 ||
+ ret == 1)
+ {
+ for (n = list_set(state->udeps, &d); n > 0; n--)
+ printf(" %s", d[n -1]);
+ free(d);
+ printf("\n");
+ }
+ }
+
+ return ret;
}
int qdepends_main(int argc, char **argv)
{
- depend_atom *atom;
- struct qdepends_opt_state state = {
- .atoms = array_new(),
- .udeps = create_set(),
- .qmode = 0,
- .format = "%[CATEGORY]%[PF]",
- .resolve = false,
- .vdb = NULL,
- .rtree = NULL,
- };
- size_t i;
- int ret;
- bool do_pretty = false;
-
- if (quiet)
- state.format = "%[CATEGORY]%[PN]";
-
- while ((ret = GETOPT_LONG(QDEPENDS, qdepends, "")) != -1) {
- switch (ret) {
- COMMON_GETOPTS_CASES(qdepends)
-
- case 'd': state.qmode |= QMODE_DEPEND; break;
- case 'r': state.qmode |= QMODE_RDEPEND; break;
- case 'p': state.qmode |= QMODE_PDEPEND; break;
- case 'b': state.qmode |= QMODE_BDEPEND; break;
- case 'I': state.qmode |= QMODE_IDEPEND; break;
- case 'Q': state.qmode |= QMODE_REVERSE; break;
- case 'i': state.qmode |= QMODE_INSTALLED; break;
- case 't': state.qmode |= QMODE_TREE; break;
- case 'U': state.qmode |= QMODE_FILTERUSE; break;
- case 'S': do_pretty = true; break;
- case 'R': state.resolve = true; break;
- case 'F': state.format = optarg; break;
- }
- }
-
- if ((state.qmode & (QMODE_DEPEND |
- QMODE_RDEPEND |
- QMODE_PDEPEND |
- QMODE_BDEPEND |
- QMODE_IDEPEND )) == 0)
- {
- /* default mode of printing: -drpb */
- state.qmode |= QMODE_DEPEND |
- QMODE_RDEPEND |
- QMODE_PDEPEND |
- QMODE_BDEPEND |
- QMODE_IDEPEND ;
- }
-
- /* default to installed packages */
- if (!(state.qmode & QMODE_INSTALLED) && !(state.qmode & QMODE_TREE))
- state.qmode |= QMODE_INSTALLED;
-
- /* don't allow both installed and from tree */
- if (state.qmode & QMODE_INSTALLED && state.qmode & QMODE_TREE) {
- warn("-i and -t cannot be used together, dropping -i");
- state.qmode &= ~QMODE_INSTALLED;
- }
-
- if ((argc == optind) && !do_pretty) {
- free_set(state.udeps);
- array_free(state.atoms);
- qdepends_usage(EXIT_FAILURE);
- }
-
- if (do_pretty) {
- ret = EXIT_SUCCESS;
- while (optind < argc) {
- if (!qdepends_print_depend(stdout, argv[optind++])) {
- ret = EXIT_FAILURE;
- break;
- }
- if (optind < argc)
- fprintf(stdout, "\n");
- }
- array_free(state.atoms);
- free_set(state.udeps);
- return ret;
- }
-
- argc -= optind;
- argv += optind;
-
- for (i = 0; i < (size_t)argc; ++i) {
- atom = atom_explode(argv[i]);
- if (!atom)
- warn("invalid atom: %s", argv[i]);
- else
- array_append(state.atoms, atom);
- }
-
- if (state.qmode & QMODE_INSTALLED ||
- verbose)
- {
- state.vdb = tree_new(portroot, portvdb, TREETYPE_VDB, false);
- if (state.vdb == NULL)
- {
- free_set(state.udeps);
- array_deepfree(state.atoms, (array_free_cb
*)atom_implode);
- err("failed to open VDB at %s", portvdb);
- }
- }
-
- ret = 0;
- if (state.qmode & QMODE_TREE) {
- char *overlay;
- size_t n;
- tree_ctx *t;
-
- array_for_each(overlays, n, overlay) {
- t = tree_new(portroot, overlay, TREETYPE_EBUILD, false);
- if (t != NULL) {
- state.rtree = NULL;
- if (state.resolve)
- state.rtree = tree_new(portroot,
overlay,
-
TREETYPE_EBUILD, false);
- if (!(state.qmode & QMODE_REVERSE) &&
- array_cnt(state.atoms) > 0)
- {
- array_for_each(state.atoms, i, atom) {
- ret |=
tree_foreach_pkg_sorted(t,
-
qdepends_results_cb, &state, atom);
- }
- } else {
- ret |= tree_foreach_pkg_sorted(t,
- qdepends_results_cb,
&state, NULL);
- }
- tree_close(t);
- if (state.rtree)
- tree_close(state.rtree);
- }
- }
- } else { /* INSTALLED */
- if (state.resolve)
- state.rtree = tree_new(portroot, portvdb, TREETYPE_VDB,
false);
- if (!(state.qmode & QMODE_REVERSE) && array_cnt(state.atoms) >
0) {
- array_for_each(state.atoms, i, atom) {
- ret |= tree_foreach_pkg_fast(state.vdb,
- qdepends_results_cb, &state,
atom);
- }
- } else {
- ret |= tree_foreach_pkg_fast(state.vdb,
- qdepends_results_cb, &state, NULL);
- }
- if (state.rtree)
- tree_close(state.rtree);
- }
-
- if (state.vdb != NULL)
- tree_close(state.vdb);
- if (state.depend != NULL)
- free(state.depend);
-
- array_deepfree(state.atoms, (array_free_cb *)atom_implode);
- free_set(state.udeps);
-
- if (!ret)
- warn("no matches found for your query");
- return ret ? EXIT_SUCCESS : EXIT_FAILURE;
+ struct qdepends_opt_state state = {
+ .atoms = array_new(),
+ .udeps = create_set(),
+ .qmode = 0,
+ .format = "%[CATEGORY]%[PF]",
+ .resolve = false,
+ .vdb = NULL,
+ .rtree = NULL,
+ };
+ atom_ctx *atom;
+ size_t i;
+ int ret;
+ bool do_pretty = false;
+
+ if (quiet)
+ state.format = "%[CATEGORY]%[PN]";
+
+ while ((ret = GETOPT_LONG(QDEPENDS, qdepends, "")) != -1)
+ {
+ switch (ret)
+ {
+ COMMON_GETOPTS_CASES(qdepends)
+
+ case 'd': state.qmode |= QMODE_DEPEND; break;
+ case 'r': state.qmode |= QMODE_RDEPEND; break;
+ case 'p': state.qmode |= QMODE_PDEPEND; break;
+ case 'b': state.qmode |= QMODE_BDEPEND; break;
+ case 'I': state.qmode |= QMODE_IDEPEND; break;
+ case 'Q': state.qmode |= QMODE_REVERSE; break;
+ case 'i': state.qmode |= QMODE_INSTALLED; break;
+ case 't': state.qmode |= QMODE_TREE; break;
+ case 'U': state.qmode |= QMODE_FILTERUSE; break;
+ case 'S': do_pretty = true; break;
+ case 'R': state.resolve = true; break;
+ case 'F': state.format = optarg; break;
+ }
+ }
+
+ if ((state.qmode & (QMODE_DEPEND |
+ QMODE_RDEPEND |
+ QMODE_PDEPEND |
+ QMODE_BDEPEND |
+ QMODE_IDEPEND )) == 0)
+ {
+ /* default mode of printing: -drpb */
+ state.qmode |= (QMODE_DEPEND |
+ QMODE_RDEPEND |
+ QMODE_PDEPEND |
+ QMODE_BDEPEND |
+ QMODE_IDEPEND);
+ }
+
+ /* default to installed packages */
+ if (!(state.qmode & QMODE_INSTALLED) &&
+ !(state.qmode & QMODE_TREE))
+ state.qmode |= QMODE_INSTALLED;
+
+ /* don't allow both installed and from tree */
+ if (state.qmode & QMODE_INSTALLED &&
+ state.qmode & QMODE_TREE)
+ {
+ warn("-i and -t cannot be used together, dropping -i");
+ state.qmode &= ~QMODE_INSTALLED;
+ }
+
+ if ((argc == optind) &&
+ !do_pretty)
+ {
+ free_set(state.udeps);
+ array_free(state.atoms);
+ qdepends_usage(EXIT_FAILURE);
+ }
+
+ if (do_pretty)
+ {
+ ret = EXIT_SUCCESS;
+ while (optind < argc)
+ {
+ if (!qdepends_print_depend(stdout, argv[optind++]))
+ {
+ ret = EXIT_FAILURE;
+ break;
+ }
+ if (optind < argc)
+ fprintf(stdout, "\n");
+ }
+ array_free(state.atoms);
+ free_set(state.udeps);
+ return ret;
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ for (i = 0; i < (size_t)argc; i++)
+ {
+ atom = atom_explode(argv[i]);
+ if (!atom)
+ warn("invalid atom: %s", argv[i]);
+ else
+ array_append(state.atoms, atom);
+ }
+
+ if (state.qmode & QMODE_INSTALLED ||
+ verbose)
+ {
+ state.vdb = tree_new(portroot, portvdb, TREETYPE_VDB, false);
+ if (state.vdb == NULL)
+ {
+ free_set(state.udeps);
+ array_deepfree(state.atoms, (array_free_cb *)atom_implode);
+ err("failed to open VDB at %s", portvdb);
+ }
+ }
+
+ ret = 0;
+ if (state.qmode & QMODE_TREE)
+ {
+ tree_ctx *t;
+ char *overlay;
+ size_t n;
+
+ array_for_each(overlays, n, overlay)
+ {
+ t = tree_new(portroot, overlay, TREETYPE_EBUILD, false);
+ if (t != NULL) {
+ state.rtree = NULL;
+ if (state.resolve)
+ state.rtree = tree_new(portroot, overlay,
+ TREETYPE_EBUILD, false);
+ if (!(state.qmode & QMODE_REVERSE) &&
+ array_cnt(state.atoms) > 0)
+ {
+ array_for_each(state.atoms, i, atom)
+ {
+ ret |= tree_foreach_pkg_sorted(t,
+ qdepends_results_cb, &state, atom);
+ }
+ }
+ else
+ {
+ ret |= tree_foreach_pkg_sorted(t,
+ qdepends_results_cb, &state, NULL);
+ }
+ tree_close(t);
+ if (state.rtree)
+ tree_close(state.rtree);
+ }
+ }
+ }
+ else
+ { /* INSTALLED */
+ if (state.resolve)
+ state.rtree = tree_new(portroot, portvdb, TREETYPE_VDB, false);
+ if (!(state.qmode & QMODE_REVERSE) &&
+ array_cnt(state.atoms) > 0)
+ {
+ array_for_each(state.atoms, i, atom)
+ {
+ ret |= tree_foreach_pkg_fast(state.vdb,
+ qdepends_results_cb, &state, atom);
+ }
+ }
+ else
+ {
+ ret |= tree_foreach_pkg_fast(state.vdb,
+ qdepends_results_cb, &state, NULL);
+ }
+ if (state.rtree)
+ tree_close(state.rtree);
+ }
+
+ if (state.vdb != NULL)
+ tree_close(state.vdb);
+ if (state.depend != NULL)
+ free(state.depend);
+
+ array_deepfree(state.atoms, (array_free_cb *)atom_implode);
+ free_set(state.udeps);
+
+ if (!ret)
+ warn("no matches found for your query");
+ return ret ? EXIT_SUCCESS : EXIT_FAILURE;
}
+
+/* vim: set ts=2 sw=2 expandtab cino+=\:0 foldmethod=marker: */