aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2021-02-20 11:56:41 +0100
committerFabian Groffen <grobian@gentoo.org>2021-02-20 11:56:41 +0100
commitb8c3bbcde2425b2b6160c1fc865eeebe705417c2 (patch)
treecf3487adb5b63704bfd19ed1ce08ba6391b7444d /qwhich.c
parentlibq/tree: add ability to match latest version per package in tree_match_atom (diff)
downloadportage-utils-b8c3bbcde2425b2b6160c1fc865eeebe705417c2.tar.gz
portage-utils-b8c3bbcde2425b2b6160c1fc865eeebe705417c2.tar.bz2
portage-utils-b8c3bbcde2425b2b6160c1fc865eeebe705417c2.zip
qwhich: add option for latest version match, print ebuild for vdb matches
- add -l to match latest version per package, e.g. query for dash would return both app-shells/dash as well as app-emacs/dash - for vdb matches, return the path to the (cached) ebuild in there, unless -d is given, of course, then print path Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'qwhich.c')
-rw-r--r--qwhich.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/qwhich.c b/qwhich.c
index 3a0c7910..b55b6e4a 100644
--- a/qwhich.c
+++ b/qwhich.c
@@ -19,7 +19,7 @@
#include "atom.h"
#include "tree.h"
-#define QWHICH_FLAGS "IbtpdfF:" COMMON_FLAGS
+#define QWHICH_FLAGS "IbtpdflF:" COMMON_FLAGS
static struct option const qwhich_long_opts[] = {
{"vdb", no_argument, NULL, 'I'},
{"binpkg", no_argument, NULL, 'b'},
@@ -27,6 +27,7 @@ static struct option const qwhich_long_opts[] = {
{"pretty", no_argument, NULL, 'p'},
{"dir", no_argument, NULL, 'd'},
{"first", no_argument, NULL, 'f'},
+ {"latest", no_argument, NULL, 'l'},
{"format", a_argument, NULL, 'F'},
COMMON_LONG_OPTS
};
@@ -36,7 +37,8 @@ static const char * const qwhich_opts_help[] = {
"Look in main tree and overlays",
"Print (pretty) atom instead of path for use with -F",
"Print directory instead of path",
- "Stop searching after first match",
+ "Stop searching after first match (implies -l)",
+ "Only return latest version for each match",
"Print matched using given format string",
COMMON_OPTS_HELP
};
@@ -51,6 +53,7 @@ struct qwhich_mode {
char print_atom:1;
char print_path:1;
char match_first:1;
+ char match_latest:1;
const char *fmt;
};
@@ -76,28 +79,29 @@ int qwhich_main(int argc, char **argv)
switch (ret) {
COMMON_GETOPTS_CASES(qwhich)
- case 'I': m.do_vdb = true; break;
- case 'b': m.do_binpkg = true; break;
- case 't': m.do_tree = true; break;
- case 'p': m.print_atom = true; break;
- case 'd': m.print_path = true; break;
- case 'f': m.match_first = true; break;
- case 'F': m.fmt = optarg; break;
+ case 'I': m.do_vdb = true; break;
+ case 'b': m.do_binpkg = true; break;
+ case 't': m.do_tree = true; break;
+ case 'p': m.print_atom = true; break;
+ case 'd': m.print_path = true; break;
+ case 'f': m.match_first = true; break;
+ case 'l': m.match_latest = true; break;
+ case 'F': m.fmt = optarg; break;
}
}
- /* defaults: no options at all, enable first match,
+ /* defaults: no options at all, enable latest match,
* no selectors, enable tree + overlays */
if (!m.do_vdb && !m.do_binpkg && !m.do_tree) {
if (!m.print_atom && !m.print_path && !m.match_first && m.fmt == NULL)
- m.match_first = true;
+ m.match_latest = true;
m.do_tree = true;
}
/* when printing path, we better just match the first, else we get a
* lot of dups */
- if (m.print_path)
- m.match_first = true;
+ if (m.print_path || m.match_first)
+ m.match_latest = true;
/* set format if none given */
if (m.fmt == NULL) {
@@ -150,8 +154,9 @@ int qwhich_main(int argc, char **argv)
repolen = 0;
array_for_each(atoms, i, atom) {
- tmc = tree_match_atom(t, atom,
- m.match_first ? TREE_MATCH_FIRST : TREE_MATCH_DEFAULT);
+ tmc = tree_match_atom(t, atom, TREE_MATCH_DEFAULT |
+ (m.match_latest ? TREE_MATCH_LATEST : 0) |
+ (m.match_first ? TREE_MATCH_FIRST : 0));
for (tmcw = tmc; tmcw != NULL; tmcw = tmcw->next) {
if (m.print_atom) {
printf("%s\n", atom_format(m.fmt, tmcw->atom));
@@ -172,6 +177,11 @@ int qwhich_main(int argc, char **argv)
DKBLUE, tmcw->atom->PN,
BLUE, tmcw->atom->P,
DKGREEN, NORM);
+ } else if (t->cachetype == CACHE_VDB && !m.print_path) {
+ printf("%s%s/%s%s%s.ebuild%s\n",
+ DKBLUE, tmcw->path,
+ BLUE, tmcw->atom->P,
+ DKGREEN, NORM);
} else {
printf("%s%s%s\n", DKBLUE, tmcw->path, NORM);
}