commit: 16215c71c61da9cb44868d58b4c3ce0529c5d4ac Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> AuthorDate: Sun Jan 19 09:48:50 2020 +0000 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> CommitDate: Sun Jan 19 09:48:50 2020 +0000 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=16215c71
qatom: add -l option to match an atom against the tree returns the latest available version of the atom requested, or nothing when not found Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> man/qatom.1 | 5 ++++- qatom.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/man/qatom.1 b/man/qatom.1 index 6254912..4f6ccf2 100644 --- a/man/qatom.1 +++ b/man/qatom.1 @@ -1,5 +1,5 @@ .\" generated by mkman.py, please do NOT edit! -.TH qatom "1" "Nov 2019" "Gentoo Foundation" "qatom" +.TH qatom "1" "Jan 2020" "Gentoo Foundation" "qatom" .SH NAME qatom \- split atom strings .SH SYNOPSIS @@ -70,6 +70,9 @@ Compare two atoms. \fB\-p\fR, \fB\-\-print\fR Print reconstructed atom. .TP +\fB\-l\fR, \fB\-\-lookup\fR +Lookup atom in tree. +.TP \fB\-\-root\fR \fI<arg>\fR Set the ROOT env var. .TP diff --git a/qatom.c b/qatom.c index 23d10d8..59f7392 100644 --- a/qatom.c +++ b/qatom.c @@ -8,36 +8,37 @@ */ #include "main.h" - -#include <stdlib.h> -#include <stdbool.h> +#include "applets.h" #include "atom.h" -#include "applets.h" +#include "tree.h" #define QATOM_FORMAT "%{CATEGORY} %{PN} %{PV} %[PR] %[SLOT] %[pfx] %[sfx]" -#define QATOM_FLAGS "F:cp" COMMON_FLAGS +#define QATOM_FLAGS "F:cpl" COMMON_FLAGS static struct option const qatom_long_opts[] = { {"format", a_argument, NULL, 'F'}, {"compare", no_argument, NULL, 'c'}, {"print", no_argument, NULL, 'p'}, + {"lookup", no_argument, NULL, 'l'}, COMMON_LONG_OPTS }; static const char * const qatom_opts_help[] = { "Custom output format (default: " QATOM_FORMAT ")", "Compare two atoms", "Print reconstructed atom", + "Lookup atom in tree", COMMON_OPTS_HELP }; #define qatom_usage(ret) usage(ret, QATOM_FLAGS, qatom_long_opts, qatom_opts_help, NULL, lookup_applet_idx("qatom")) int qatom_main(int argc, char **argv) { - enum qatom_atom { _EXPLODE=0, _COMPARE, _PRINT } action = _EXPLODE; + enum qatom_atom { _EXPLODE=0, _COMPARE, _PRINT, _LOOKUP } action = _EXPLODE; const char *format = QATOM_FORMAT; depend_atom *atom; depend_atom *atomc; + tree_ctx *tree = NULL; int i; while ((i = GETOPT_LONG(QATOM, qatom, "")) != -1) { @@ -45,6 +46,7 @@ int qatom_main(int argc, char **argv) case 'F': format = optarg; break; case 'c': action = _COMPARE; break; case 'p': action = _PRINT; break; + case 'l': action = _LOOKUP; break; COMMON_GETOPTS_CASES(qatom) } } @@ -55,6 +57,12 @@ int qatom_main(int argc, char **argv) if (action == _COMPARE && (argc - optind) % 2) err("compare needs even number of arguments"); + if (action == _LOOKUP) { + tree = tree_open(portroot, main_overlay); + if (tree == NULL) + err("failed to open tree"); + } + for (i = optind; i < argc; i++) { atom = atom_explode(argv[i]); if (atom == NULL) { @@ -101,10 +109,23 @@ int qatom_main(int argc, char **argv) case _PRINT: printf("%s\n", atom_to_string(atom)); break; + case _LOOKUP: + { + tree_pkg_ctx *pkg = tree_match_atom(tree, atom); + if (pkg != NULL) { + atomc = tree_get_atom(pkg, true); + if (!quiet) + printf("%s: ", atom_to_string(atom)); + printf("%s\n", atom_format(format, atomc)); + } + } } atom_implode(atom); } + if (action == _LOOKUP) + tree_close(tree); + return EXIT_SUCCESS; }