commit:     eadd293b14379b5f8f49dd000fed18139d90dc94
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 14 09:26:26 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Jul 14 09:26:26 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=eadd293b

qfile add -F argument

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 man/qcheck.1 |  5 ++++-
 man/qfile.1  |  5 ++++-
 qfile.c      | 49 ++++++++++++++++++++++++-------------------------
 3 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/man/qcheck.1 b/man/qcheck.1
index 9e4d873..f48fa63 100644
--- a/man/qcheck.1
+++ b/man/qcheck.1
@@ -1,5 +1,5 @@
 .\" generated by mkman.py, please do NOT edit!
-.TH qcheck "1" "May 2019" "Gentoo Foundation" "qcheck"
+.TH qcheck "1" "Jul 2019" "Gentoo Foundation" "qcheck"
 .SH NAME
 qcheck \- verify integrity of installed packages
 .SH SYNOPSIS
@@ -9,6 +9,9 @@ qcheck \- verify integrity of installed packages
 
 .SH OPTIONS
 .TP
+\fB\-F\fR \fI<arg>\fR, \fB\-\-format\fR \fI<arg>\fR
+Custom output format (default: %[CATEGORY]%[PN]).
+.TP
 \fB\-s\fR \fI<arg>\fR, \fB\-\-skip\fR \fI<arg>\fR
 Ignore files matching the regular expression <arg>.
 .TP

diff --git a/man/qfile.1 b/man/qfile.1
index 6dedef2..33dfbee 100644
--- a/man/qfile.1
+++ b/man/qfile.1
@@ -1,5 +1,5 @@
 .\" generated by mkman.py, please do NOT edit!
-.TH qfile "1" "May 2019" "Gentoo Foundation" "qfile"
+.TH qfile "1" "Jul 2019" "Gentoo Foundation" "qfile"
 .SH NAME
 qfile \- list all pkgs owning files
 .SH SYNOPSIS
@@ -35,6 +35,9 @@ After version \fB0.74\fR of portage-utils, the \fB-b\fR 
option was
 renamed to \fB-d\fR.
 .SH OPTIONS
 .TP
+\fB\-F\fR \fI<arg>\fR, \fB\-\-format\fR \fI<arg>\fR
+Print matched atom using given format string.
+.TP
 \fB\-S\fR, \fB\-\-slots\fR
 Display installed packages with slots.
 .TP

diff --git a/qfile.c b/qfile.c
index 1a6b470..bc5c9ac 100644
--- a/qfile.c
+++ b/qfile.c
@@ -20,8 +20,9 @@
 #include "rmspace.h"
 #include "tree.h"
 
-#define QFILE_FLAGS "doRx:S" COMMON_FLAGS
+#define QFILE_FLAGS "F:doRx:S" COMMON_FLAGS
 static struct option const qfile_long_opts[] = {
+       {"format",       a_argument, NULL, 'F'},
        {"slots",       no_argument, NULL, 'S'},
        {"root-prefix", no_argument, NULL, 'R'},
        {"dir",         no_argument, NULL, 'd'},
@@ -30,6 +31,7 @@ static struct option const qfile_long_opts[] = {
        COMMON_LONG_OPTS
 };
 static const char * const qfile_opts_help[] = {
+       "Print matched atom using given format string",
        "Display installed packages with slots",
        "Assume arguments are already prefixed by $ROOT",
        "Also match directories for single component arguments",
@@ -64,16 +66,13 @@ struct qfile_opt_state {
        char *exclude_pkg;
        char *exclude_slot;
        depend_atom *exclude_atom;
-       bool slotted;
        bool basename;
        bool orphans;
        bool assume_root_prefix;
+       const char *format;
+       bool need_full_atom;
 };
 
-/*
- * We assume the people calling us have chdir(/var/db/pkg) and so
- * we use relative paths throughout here.
- */
 static int qfile_cb(tree_pkg_ctx *pkg_ctx, void *priv)
 {
        struct qfile_opt_state *state = priv;
@@ -215,24 +214,9 @@ static int qfile_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                                continue;
 
                        if (non_orphans == NULL) {
-                               const char *fmt;
-
-                               atom = tree_get_atom(pkg_ctx, true);
+                               atom = tree_get_atom(pkg_ctx, 
state->need_full_atom);
 
-                               if (state->slotted) {
-                                       if (verbose) {
-                                               fmt = "%[CATEGORY]%[PF]%[SLOT]";
-                                       } else {
-                                               fmt = "%[CATEGORY]%[PN]%[SLOT]";
-                                       }
-                               } else {
-                                       if (verbose) {
-                                               fmt = "%[CATEGORY]%[PF]";
-                                       } else {
-                                               fmt = "%[CATEGORY]%[PN]";
-                                       }
-                               }
-                               printf("%s", atom_format(fmt, atom));
+                               printf("%s", atom_format(state->format, atom));
                                if (quiet)
                                        puts("");
                                else
@@ -402,10 +386,11 @@ int qfile_main(int argc, char **argv)
 {
        struct qfile_opt_state state = {
                .buflen = _Q_PATH_MAX,
-               .slotted = false,
+               .need_full_atom = false,
                .basename = false,
                .orphans = false,
                .assume_root_prefix = false,
+               .format = NULL,
        };
        int i, nb_of_queries, found = 0;
        char *p;
@@ -413,7 +398,8 @@ int qfile_main(int argc, char **argv)
        while ((i = GETOPT_LONG(QFILE, qfile, "")) != -1) {
                switch (i) {
                        COMMON_GETOPTS_CASES(qfile)
-                       case 'S': state.slotted = true;             break;
+                       case 'F': state.format = optarg;            /* fall 
through */
+                       case 'S': state.need_full_atom = true;      break;
                        case 'd': state.basename = true;            break;
                        case 'o': state.orphans = true;             break;
                        case 'R': state.assume_root_prefix = true;  break;
@@ -436,6 +422,19 @@ int qfile_main(int argc, char **argv)
        argc -= optind;
        argv += optind;
 
+       if (state.format == NULL) {
+               if (state.need_full_atom)
+                       if (verbose)
+                               state.format = "%[CATEGORY]%[PF]%[SLOT]";
+                       else
+                               state.format = "%[CATEGORY]%[PN]%[SLOT]";
+               else
+                       if (verbose)
+                               state.format = "%[CATEGORY]%[PF]";
+                       else
+                               state.format = "%[CATEGORY]%[PN]";
+       }
+
        state.buf = xmalloc(state.buflen);
        if (state.assume_root_prefix) {
                /* Get a copy of $ROOT, with no trailing slash

Reply via email to