commit: 26b9374ee23d16b3957b6ebc0cd80f53b22a4d16 Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> AuthorDate: Sun Jul 14 13:30:06 2019 +0000 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> CommitDate: Sun Jul 14 13:30:06 2019 +0000 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=26b9374e
quse: add -F argument, move some -v functionality to -D -v now controls default atom formatting, as with other applets, the ability to list USE-flags, their state and description per package now is enabled by the -D (describe) flag, which incidentally also makes more sense. Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> man/include/quse.optdesc.yaml | 11 +++--- man/quse.1 | 14 ++++--- quse.c | 85 ++++++++++++++++++++++++------------------- 3 files changed, 62 insertions(+), 48 deletions(-) diff --git a/man/include/quse.optdesc.yaml b/man/include/quse.optdesc.yaml index 693aade..71fcd2d 100644 --- a/man/include/quse.optdesc.yaml +++ b/man/include/quse.optdesc.yaml @@ -1,10 +1,11 @@ exact: Search for exact string, e.g.\ do not use regular expression matching. verbose: | - Show descriptions for USE-flags for packages that match the search. + Show versions for packages that match the search. Also shows problems encountered during parsing. These are mostly diagnostic and indicate possible incorrectness in the results. quiet: Ignored for compatibility with other qapplets. -installed: | - Only search installed packages. Together with \fB-v\fR this shows - USE-flags and their descriptions, and currently enabled flags - prefixed with an asterisk (\fI*\fR). +describe: | + Describe the USE flag, when no USE-flag given and combined with + \fB-p\fR, lists all USE-flags with their descriptions (and enabled + state prefixed with an asterisk when used with \fB-I\fR) per + package. diff --git a/man/quse.1 b/man/quse.1 index a30e189..8306ca5 100644 --- a/man/quse.1 +++ b/man/quse.1 @@ -20,12 +20,13 @@ List all ebuilds, don't match anything. Use the LICENSE vs IUSE. .TP \fB\-D\fR, \fB\-\-describe\fR -Describe the USE flag. +Describe the USE flag, when no USE-flag given and combined with +\fB-p\fR, lists all USE-flags with their descriptions (and enabled +state prefixed with an asterisk when used with \fB-I\fR) per +package. .TP \fB\-I\fR, \fB\-\-installed\fR -Only search installed packages. Together with \fB-v\fR this shows -USE-flags and their descriptions, and currently enabled flags -prefixed with an asterisk (\fI*\fR). +Only search installed packages. .TP \fB\-p\fR \fI<arg>\fR, \fB\-\-package\fR \fI<arg>\fR Restrict matching to package or category. @@ -33,11 +34,14 @@ Restrict matching to package or category. \fB\-R\fR, \fB\-\-repo\fR Show repository the ebuild originates from. .TP +\fB\-F\fR \fI<arg>\fR, \fB\-\-format\fR \fI<arg>\fR +Print matched atom using given format string. +.TP \fB\-\-root\fR \fI<arg>\fR Set the ROOT env var. .TP \fB\-v\fR, \fB\-\-verbose\fR -Show descriptions for USE-flags for packages that match the search. +Show versions for packages that match the search. Also shows problems encountered during parsing. These are mostly diagnostic and indicate possible incorrectness in the results. .TP diff --git a/quse.c b/quse.c index bc99c3b..df8626e 100644 --- a/quse.c +++ b/quse.c @@ -27,7 +27,7 @@ #include "xarray.h" #include "xregex.h" -#define QUSE_FLAGS "eaLDIp:R" COMMON_FLAGS +#define QUSE_FLAGS "eaLDIp:RF:" COMMON_FLAGS static struct option const quse_long_opts[] = { {"exact", no_argument, NULL, 'e'}, {"all", no_argument, NULL, 'a'}, @@ -36,6 +36,7 @@ static struct option const quse_long_opts[] = { {"installed", no_argument, NULL, 'I'}, {"package", a_argument, NULL, 'p'}, {"repo", no_argument, NULL, 'R'}, + {"format", a_argument, NULL, 'F'}, COMMON_LONG_OPTS }; static const char * const quse_opts_help[] = { @@ -46,6 +47,7 @@ static const char * const quse_opts_help[] = { "Only search installed packages", "Restrict matching to package or category", "Show repository the ebuild originates from", + "Print matched atom using given format string", COMMON_OPTS_HELP }; #define quse_usage(ret) usage(ret, QUSE_FLAGS, quse_long_opts, quse_opts_help, NULL, lookup_applet_idx("quse")) @@ -61,9 +63,10 @@ struct quse_state { bool do_licence:1; bool do_installed:1; bool do_list:1; - bool do_repo:1; + bool need_full_atom:1; depend_atom *match; regex_t *pregv; + const char *fmt; }; static char *_quse_getline_buf = NULL; @@ -142,9 +145,8 @@ quse_search_use_local_desc(int portdirfd, struct quse_state *state) if (state->do_list) { state->retv[i] = xstrdup(q); } else { - printf("%s%s/%s%s%s[%s%s%s] %s\n", - BOLD, atom->CATEGORY, - BLUE, atom->PN, NORM, + printf("%s[%s%s%s] %s\n", + atom_format(state->fmt, atom), MAGENTA, p, NORM, q); } } @@ -424,7 +426,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) int cnt; int portdirfd = -1; /* pacify compiler */ - if (state->match || verbose) { + if (state->match || state->do_describe) { atom = tree_get_atom(pkg_ctx, 0); if (atom == NULL) return 0; @@ -471,7 +473,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) free(s); } - if (verbose) { + if (state->do_describe) { portdirfd = openat(pkg_ctx->cat_ctx->ctx->portroot_fd, state->overlay == NULL ? main_overlay : state->overlay, O_RDONLY | O_CLOEXEC | O_PATH); @@ -487,7 +489,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) v = buf; w = buf + sizeof(buf); - if (state->do_all && !verbose) { + if (state->do_all && !state->do_describe) { match = true; v = q; } else { @@ -546,18 +548,10 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) } if (match) { - const char *qfmt; - - atom = tree_get_atom(pkg_ctx, state->do_repo); - if (state->do_repo) { - qfmt = "%[CATEGORY]%[PF]%[REPO]"; - } else { - qfmt = "%[CATEGORY]%[PF]"; - } - + atom = tree_get_atom(pkg_ctx, state->need_full_atom); if (quiet) { - printf("%s\n", atom_format(qfmt, atom)); - } else if (verbose && !state->do_licence) { + printf("%s\n", atom_format(state->fmt, atom)); + } else if (state->do_describe && !state->do_licence) { /* multi-line result, printing USE-flags with their descs */ size_t desclen; struct quse_state us = { @@ -571,7 +565,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) .overlay = NULL, }; - printf("%s\n", atom_format(qfmt, atom)); + printf("%s\n", atom_format(state->fmt, atom)); q = p = meta->IUSE; buf[0] = '\0'; @@ -654,7 +648,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) free(us.retv); free(us.argv); } else { - printf("%s: %s\n", atom_format(qfmt, atom), v); + printf("%s: %s\n", atom_format(state->fmt, atom), v); } } @@ -668,7 +662,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv) if (use != NULL) free_set(use); } - if (verbose) + if (state->do_describe) close(portdirfd); return EXIT_SUCCESS; @@ -681,25 +675,27 @@ int quse_main(int argc, char **argv) const char *overlay; char *match = NULL; struct quse_state state = { - .do_all = false, - .do_regex = true, - .do_describe = false, - .do_licence = false, - .do_installed = false, - .do_repo = false, - .match = NULL, - .overlay = NULL, + .do_all = false, + .do_regex = true, + .do_describe = false, + .do_licence = false, + .do_installed = false, + .need_full_atom = false, + .match = NULL, + .overlay = NULL, + .fmt = NULL, }; while ((i = GETOPT_LONG(QUSE, quse, "")) != -1) { switch (i) { - case 'e': state.do_regex = false; break; - case 'a': state.do_all = true; break; - case 'L': state.do_licence = true; break; - case 'D': state.do_describe = true; break; - case 'I': state.do_installed = true; break; - case 'R': state.do_repo = true; break; - case 'p': match = optarg; break; + case 'e': state.do_regex = false; break; + case 'a': state.do_all = true; break; + case 'L': state.do_licence = true; break; + case 'D': state.do_describe = true; break; + case 'I': state.do_installed = true; break; + case 'p': match = optarg; break; + case 'F': state.fmt = optarg; /* fall through */ + case 'R': state.need_full_atom = true; break; COMMON_GETOPTS_CASES(quse) } } @@ -727,7 +723,20 @@ int quse_main(int argc, char **argv) xregcomp(&state.pregv[i], state.argv[i], REG_EXTENDED | REG_NOSUB); } - if (state.do_describe) { + if (state.fmt == NULL) { + if (state.need_full_atom) + if (verbose) + state.fmt = "%[CATEGORY]%[PF]%[REPO]"; + else + state.fmt = "%[CATEGORY]%[PN]%[REPO]"; + else + if (verbose) + state.fmt = "%[CATEGORY]%[PF]"; + else + state.fmt = "%[CATEGORY]%[PN]"; + } + + if (state.do_describe && state.match == NULL) { array_for_each(overlays, n, overlay) quse_describe_flag(portroot, overlay, &state); } else if (state.do_installed) {