commit:     b2418b1406551ce5b540aaf8d332ec53ddd52e01
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Thu Jun 13 18:13:57 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Thu Jun 13 18:13:57 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=b2418b14

libq/atom: make atom_format smarter to unbreak Puppet

The default portage provider in Puppet uses qatom in a rather clumpsy
way.  The newer formatting broke it because they don't use explicit
formatting.  Make atom_format somewhat smarter to unbreak Puppet's
usage.

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

 libq/atom.c        | 38 ++++++++++++++++++++++----------------
 libq/atom.h        |  4 ++--
 qatom.c            |  2 +-
 qcheck.c           |  6 +++---
 qdepends.c         |  6 +++---
 qfile.c            |  4 ++--
 qgrep.c            |  2 +-
 qlist.c            |  4 ++--
 qlop.c             | 24 ++++++++++++------------
 qmerge.c           |  2 +-
 qsearch.c          |  2 +-
 qsize.c            |  2 +-
 quse.c             |  6 +++---
 tests/qatom/dotest | 12 +++++++++---
 14 files changed, 63 insertions(+), 51 deletions(-)

diff --git a/libq/atom.c b/libq/atom.c
index 12a393a..8ce7f18 100644
--- a/libq/atom.c
+++ b/libq/atom.c
@@ -683,7 +683,7 @@ atom_to_string_r(char *buf, size_t buflen, depend_atom *a)
 /**
  * Run printf on an atom.  The format field takes the form:
  *  %{keyword}: Always display the field that matches "keyword" or <unset>
- *  %[keyword]: Only display the field when it's set (or pverbose)
+ *  %[keyword]: Only display the field when it's set
  * The possible "keywords" are:
  *  CATEGORY  P  PN  PV  PVR  PF  PR  SLOT  SUBSLOT  REPO  USE
  *    - these are all the standard portage variables (so see ebuild(5))
@@ -695,14 +695,14 @@ atom_format_r(
                char *buf,
                size_t buflen,
                const char *format,
-               const depend_atom *atom,
-               int pverbose)
+               const depend_atom *atom)
 {
        char bracket;
        const char *fmt;
        const char *p;
        size_t len;
        bool showit;
+       bool connected;
        char *ret;
 
        if (!atom) {
@@ -725,21 +725,25 @@ atom_format_r(
                        return ret;
                } else if (fmt != p) {
                        append_buf(buf, buflen, "%.*s", (int)(fmt - p), p);
+                       connected = false;
+               } else {
+                       connected = true;
                }
 
                bracket = fmt[1];
                if (bracket == '{' || bracket == '[') {
+                       connected &= bracket == '[';
                        fmt += 2;
-                       p = strchr(fmt, bracket == '{' ? '}' : ']');
-                       if (p) {
+                       if ((p = strchr(fmt, bracket == '{' ? '}' : ']')) != 
NULL) {
                                len = p - fmt;
-                               showit = (bracket == '{') || pverbose;
+                               showit = bracket == '{';
 #define HN(X) (X ? X : "<unset>")
                                if (!strncmp("CATEGORY", fmt, len)) {
+                                       connected = (p[1] == '%') & (bracket == 
'[');
                                        if (showit || atom->CATEGORY)
                                                append_buf(buf, buflen, 
"%s%s%s%s",
                                                                BOLD, 
HN(atom->CATEGORY),
-                                                               bracket == '[' 
? "/" : "", NORM);
+                                                               connected ? "/" 
: "", NORM);
                                } else if (!strncmp("P", fmt, len)) {
                                        if (showit || atom->P)
                                                append_buf(buf, buflen, 
"%s%s%s",
@@ -772,21 +776,21 @@ atom_format_r(
                                        if (showit || atom->SLOT)
                                                append_buf(buf, buflen, 
"%s%s%s%s",
                                                                YELLOW,
-                                                               bracket == '[' 
? ":" : "",
+                                                               connected ? ":" 
: "",
                                                                atom->SLOT ? 
atom->SLOT : "<unset>",
                                                                NORM);
                                } else if (!strncmp("SUBSLOT", fmt, len)) {
                                        if (showit || atom->SUBSLOT)
                                                append_buf(buf, buflen, 
"%s%s%s%s%s",
                                                                YELLOW,
-                                                               bracket == '[' 
? "/" : "",
+                                                               connected ? "/" 
: "",
                                                                atom->SUBSLOT ? 
atom->SUBSLOT : "",
                                                                
atom_slotdep_str[atom->slotdep],
                                                                NORM);
                                } else if (!strncmp("REPO", fmt, len)) {
                                        if (showit || atom->REPO)
                                                append_buf(buf, buflen, 
"%s%s%s%s",
-                                                               GREEN, bracket 
== '[' ? "::" : "",
+                                                               GREEN, 
connected ? "::" : "",
                                                                HN(atom->REPO), 
NORM);
                                } else if (!strncmp("pfx", fmt, len)) {
                                        if (showit || atom->pfx_op != 
ATOM_OP_NONE)
@@ -810,12 +814,14 @@ atom_format_r(
                                        }
                                } else
                                        append_buf(buf, buflen, "<BAD:%.*s>", 
(int)len, fmt);
-                               ++p;
+                               p++;
 #undef HN
-                       } else
+                       } else {
                                p = fmt + 1;
-               } else
-                       ++p;
+                       }
+               } else {
+                       p++;
+               }
        }
 #undef append_buf
 
@@ -832,7 +838,7 @@ atom_to_string(depend_atom *a)
 }
 
 char *
-atom_format(const char *format, const depend_atom *atom, int pverbose)
+atom_format(const char *format, const depend_atom *atom)
 {
-       return atom_format_r(_atom_buf, sizeof(_atom_buf), format, atom, 
pverbose);
+       return atom_format_r(_atom_buf, sizeof(_atom_buf), format, atom);
 }

diff --git a/libq/atom.h b/libq/atom.h
index b24783d..72266d5 100644
--- a/libq/atom.h
+++ b/libq/atom.h
@@ -95,8 +95,8 @@ int atom_compare(const depend_atom *a1, const depend_atom 
*a2);
 int atom_compare_str(const char * const s1, const char * const s2);
 char *atom_to_string_r(char *buf, size_t buflen, depend_atom *a);
 char *atom_format_r(char *buf, size_t buflen,
-               const char *format, const depend_atom *atom, int pverbose);
+               const char *format, const depend_atom *atom);
 char *atom_to_string(depend_atom *a);
-char *atom_format(const char *format, const depend_atom *atom, int pverbose);
+char *atom_format(const char *format, const depend_atom *atom);
 
 #endif

diff --git a/qatom.c b/qatom.c
index 6228cbc..4ad6116 100644
--- a/qatom.c
+++ b/qatom.c
@@ -96,7 +96,7 @@ int qatom_main(int argc, char **argv)
                        break;
                }
                case _EXPLODE:
-                       printf("%s\n", atom_format(format, atom, verbose));
+                       printf("%s\n", atom_format(format, atom));
                        break;
                case _PRINT:
                        printf("%s\n", atom_to_string(atom));

diff --git a/qcheck.c b/qcheck.c
index efbb191..8eb1f08 100644
--- a/qcheck.c
+++ b/qcheck.c
@@ -98,7 +98,7 @@ qcheck_process_contents(tree_pkg_ctx *pkg_ctx, struct 
qcheck_opt_state *state)
        num_files = num_files_ok = num_files_unknown = num_files_ignored = 0;
        qcprintf("%sing %s ...\n",
                (state->qc_update ? "Updat" : "Check"),
-               atom_format("%[CATEGORY]%[PF]", atom, 0));
+               atom_format("%[CATEGORY]%[PF]", atom));
        if (state->qc_update) {
                fp_contents_update = tree_pkg_vdb_fopenat_rw(pkg_ctx, 
"CONTENTS~");
                if (fp_contents_update == NULL) {
@@ -331,9 +331,9 @@ qcheck_process_contents(tree_pkg_ctx *pkg_ctx, struct 
qcheck_opt_state *state)
        }
        if (state->bad_only && num_files_ok != num_files) {
                if (verbose)
-                       printf("%s\n", atom_format("%[CATEGORY]%[PF]", atom, 
0));
+                       printf("%s\n", atom_format("%[CATEGORY]%[PF]", atom));
                else {
-                       printf("%s\n", atom_format("%[CATEGORY]%[PN]", atom, 
0));
+                       printf("%s\n", atom_format("%[CATEGORY]%[PN]", atom));
                }
        }
        qcprintf("  %2$s*%1$s %3$s%4$zu%1$s out of %3$s%5$zu%1$s file%6$s are 
good",

diff --git a/qdepends.c b/qdepends.c
index f560c31..f5aa5a5 100644
--- a/qdepends.c
+++ b/qdepends.c
@@ -149,7 +149,7 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                ret = 1;
 
                datom = tree_get_atom(pkg_ctx, true);
-               printf("%s:", atom_format(state->format, datom, 0));
+               printf("%s:", atom_format(state->format, datom));
        }
 
        xarrayfree_int(state->deps);
@@ -222,7 +222,7 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
 
                                        if (!firstmatch) {
                                                datom = tree_get_atom(pkg_ctx, 
true);
-                                               printf("%s:", 
atom_format(state->format, datom, 0));
+                                               printf("%s:", 
atom_format(state->format, datom));
                                        }
                                        firstmatch = true;
 
@@ -251,7 +251,7 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
 
                                                if (!firstmatch) {
                                                        datom = 
tree_get_atom(pkg_ctx, true);
-                                                       printf("%s:", 
atom_format(state->format, datom, 0));
+                                                       printf("%s:", 
atom_format(state->format, datom));
                                                }
                                                firstmatch = true;
 

diff --git a/qfile.c b/qfile.c
index 1480789..1a6b470 100644
--- a/qfile.c
+++ b/qfile.c
@@ -175,7 +175,7 @@ static int qfile_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                                                atom = tree_get_atom(pkg_ctx, 
false);
                                                warnp("Could not read real path 
of \"%s\" (from %s)",
                                                                fullpath,
-                                                               
atom_format("%[CATEGORY]%[PF]", atom, false));
+                                                               
atom_format("%[CATEGORY]%[PF]", atom));
                                                warn("We'll never know whether 
\"%s\" was a result "
                                                                "for your 
query...", e->name);
                                        }
@@ -232,7 +232,7 @@ static int qfile_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                                                fmt = "%[CATEGORY]%[PN]";
                                        }
                                }
-                               printf("%s", atom_format(fmt, atom, false));
+                               printf("%s", atom_format(fmt, atom));
                                if (quiet)
                                        puts("");
                                else

diff --git a/qgrep.c b/qgrep.c
index 058026e..003ead2 100644
--- a/qgrep.c
+++ b/qgrep.c
@@ -424,7 +424,7 @@ qgrep_cache_cb(tree_pkg_ctx *pkg_ctx, void *priv)
        if (data->show_name) {
                if (data->show_repo)
                        patom = tree_get_atom(pkg_ctx, true);
-               atom_format_r(name, sizeof(name), "%[CATEGORY]%[P]%[REPO]", 
patom, 0);
+               atom_format_r(name, sizeof(name), "%[CATEGORY]%[P]%[REPO]", 
patom);
                label = name;
        } else if (data->show_filename) {
                label = buf;

diff --git a/qlist.c b/qlist.c
index 0299d54..ab3fb4f 100644
--- a/qlist.c
+++ b/qlist.c
@@ -364,7 +364,7 @@ qlist_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                                                state->show_repo ? "%[REPO]" : 
"");
                        }
                        printf("%s%s\n",
-                                       atom_format(qfmt, atom, 0),
+                                       atom_format(qfmt, atom),
                                        umapstr(state->show_umap, pkg_ctx));
                }
 
@@ -374,7 +374,7 @@ qlist_cb(tree_pkg_ctx *pkg_ctx, void *priv)
 
        if (verbose)
                printf("%s %sCONTENTS%s:\n",
-                               atom_format("%[CATEGORY]%[PF]", atom, 0), 
DKBLUE, NORM);
+                               atom_format("%[CATEGORY]%[PF]", atom), DKBLUE, 
NORM);
 
        fp = tree_pkg_vdb_fopenat_ro(pkg_ctx, "CONTENTS");
        if (fp == NULL)

diff --git a/qlop.c b/qlop.c
index 2aa14a5..bd16018 100644
--- a/qlop.c
+++ b/qlop.c
@@ -621,19 +621,19 @@ static int do_emerge_log(
                                        }
                                        if (quiet && !flags->do_average) {
                                                printf("%s%s%s\n",
-                                                               
atom_format(afmt, pkgw->atom, 0),
+                                                               
atom_format(afmt, pkgw->atom),
                                                                flags->do_time 
? ": " : "",
                                                                flags->do_time ?
                                                                        
fmt_elapsedtime(flags, elapsed) : "");
                                        } else if (flags->do_time) {
                                                printf("%s >>> %s: %s\n",
                                                                fmt_date(flags, 
pkgw->tbegin, tstart),
-                                                               
atom_format(afmt, pkgw->atom, 0),
+                                                               
atom_format(afmt, pkgw->atom),
                                                                
fmt_elapsedtime(flags, elapsed));
                                        } else if (!flags->do_average) {
                                                printf("%s >>> %s\n",
                                                                fmt_date(flags, 
pkgw->tbegin, tstart),
-                                                               
atom_format(afmt, pkgw->atom, 0));
+                                                               
atom_format(afmt, pkgw->atom));
                                        }
                                        atom_implode(pkgw->atom);
                                        xarraydelete(merge_matches, i);
@@ -726,19 +726,19 @@ static int do_emerge_log(
                                        }
                                        if (quiet && !flags->do_average) {
                                                printf("%s%s%s\n",
-                                                               
atom_format(afmt, pkgw->atom, 0),
+                                                               
atom_format(afmt, pkgw->atom),
                                                                flags->do_time 
? ": " : "",
                                                                flags->do_time ?
                                                                        
fmt_elapsedtime(flags, elapsed) : "");
                                        } else if (flags->do_time) {
                                                printf("%s <<< %s: %s\n",
                                                                fmt_date(flags, 
pkgw->tbegin, tstart),
-                                                               
atom_format(afmt, pkgw->atom, 0),
+                                                               
atom_format(afmt, pkgw->atom),
                                                                
fmt_elapsedtime(flags, elapsed));
                                        } else if (!flags->do_average) {
                                                printf("%s <<< %s\n",
                                                                fmt_date(flags, 
pkgw->tbegin, tstart),
-                                                               
atom_format(afmt, pkgw->atom, 0));
+                                                               
atom_format(afmt, pkgw->atom));
                                        }
                                        atom_implode(pkgw->atom);
                                        xarraydelete(unmerge_matches, i);
@@ -800,7 +800,7 @@ static int do_emerge_log(
                        if (flags->do_time) {
                                printf("%s >>> %s: %s...%s ETA: %s\n",
                                                fmt_date(flags, pkgw->tbegin, 
0),
-                                               atom_format(afmt, pkgw->atom, 
0),
+                                               atom_format(afmt, pkgw->atom),
                                                fmt_elapsedtime(flags, elapsed),
                                                p == NULL ? "" : p,
                                                maxtime == 0 ? "unknown" :
@@ -808,7 +808,7 @@ static int do_emerge_log(
                        } else {
                                printf("%s >>> %s...%s ETA: %s\n",
                                                fmt_date(flags, pkgw->tbegin, 
0),
-                                               atom_format(afmt, pkgw->atom, 
0),
+                                               atom_format(afmt, pkgw->atom),
                                                p == NULL ? "" : p,
                                                maxtime == 0 ? "unknown" :
                                                        fmt_elapsedtime(flags, 
maxtime - elapsed));
@@ -833,14 +833,14 @@ static int do_emerge_log(
                        if (flags->do_time) {
                                printf("%s <<< %s: %s... ETA: %s\n",
                                                fmt_date(flags, pkgw->tbegin, 
0),
-                                               atom_format(afmt, pkgw->atom, 
0),
+                                               atom_format(afmt, pkgw->atom),
                                                fmt_elapsedtime(flags, elapsed),
                                                maxtime == 0 ? "unknown" :
                                                        fmt_elapsedtime(flags, 
maxtime - elapsed));
                        } else {
                                printf("%s <<< %s... ETA: %s\n",
                                                fmt_date(flags, pkgw->tbegin, 
0),
-                                               atom_format(afmt, pkgw->atom, 
0),
+                                               atom_format(afmt, pkgw->atom),
                                                maxtime == 0 ? "unknown" :
                                                        fmt_elapsedtime(flags, 
maxtime - elapsed));
                        }
@@ -852,7 +852,7 @@ static int do_emerge_log(
 
                array_for_each(merge_averages, i, pkg) {
                        printf("%s: %s average for %s%zd%s merge%s\n",
-                                       atom_format(afmt, pkg->atom, 0),
+                                       atom_format(afmt, pkg->atom),
                                        fmt_elapsedtime(flags, pkg->time / 
pkg->cnt),
                                        GREEN, pkg->cnt, NORM, pkg->cnt == 1 ? 
"" : "s");
                        total_merges += pkg->cnt;
@@ -860,7 +860,7 @@ static int do_emerge_log(
                }
                array_for_each(unmerge_averages, i, pkg) {
                        printf("%s: %s average for %s%zd%s unmerge%s\n",
-                                       atom_format(afmt, pkg->atom, 0),
+                                       atom_format(afmt, pkg->atom),
                                        fmt_elapsedtime(flags, pkg->time / 
pkg->cnt),
                                        GREEN, pkg->cnt, NORM, pkg->cnt == 1 ? 
"" : "s");
                        total_unmerges += pkg->cnt;

diff --git a/qmerge.c b/qmerge.c
index c48ecd2..47a6e9b 100644
--- a/qmerge.c
+++ b/qmerge.c
@@ -1465,7 +1465,7 @@ pkg_unmerge(tree_pkg_ctx *pkg_ctx, set *keep,
        T = "${PWD}/temp";
 
        printf("%s<<<%s %s\n", YELLOW, NORM,
-                       atom_format("%[CATEGORY]%[PF]", tree_get_atom(pkg_ctx, 
false), 0));
+                       atom_format("%[CATEGORY]%[PF]", tree_get_atom(pkg_ctx, 
false)));
 
        if (pretend == 100)
                return 0;

diff --git a/qsearch.c b/qsearch.c
index 1b953ac..db220c7 100644
--- a/qsearch.c
+++ b/qsearch.c
@@ -107,7 +107,7 @@ qsearch_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                        qfmt = "%[CATEGORY]%[PN]";
                }
                printf("%s%s%s\n",
-                               atom_format(qfmt, atom, 0),
+                               atom_format(qfmt, atom),
                                (state->show_name ? "" : " "),
                                (state->show_name ? "" : desc ? desc : ""));
        }

diff --git a/qsize.c b/qsize.c
index 5e9daaa..ce4acc1 100644
--- a/qsize.c
+++ b/qsize.c
@@ -162,7 +162,7 @@ qsize_cb(tree_pkg_ctx *pkg_ctx, void *priv)
        if (!state->summary_only) {
                atom = tree_get_atom(pkg_ctx, 0);
                printf("%s: %'zu files, %'zu non-files, ",
-                               atom_format("%[CATEGORY]%[PF]", atom, 0),
+                               atom_format("%[CATEGORY]%[PF]", atom),
                                num_files, num_nonfiles);
                if (num_ignored)
                        printf("%'zu names-ignored, ", num_ignored);

diff --git a/quse.c b/quse.c
index 8a9f78a..bc99c3b 100644
--- a/quse.c
+++ b/quse.c
@@ -556,7 +556,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                }
 
                if (quiet) {
-                       printf("%s\n", atom_format(qfmt, atom, 0));
+                       printf("%s\n", atom_format(qfmt, atom));
                } else if (verbose && !state->do_licence) {
                        /* multi-line result, printing USE-flags with their 
descs */
                        size_t desclen;
@@ -571,7 +571,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                                .overlay = NULL,
                        };
 
-                       printf("%s\n", atom_format(qfmt, atom, 0));
+                       printf("%s\n", atom_format(qfmt, atom));
 
                        q = p = meta->IUSE;
                        buf[0] = '\0';
@@ -654,7 +654,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, 0), v);
+                       printf("%s: %s\n", atom_format(qfmt, atom), v);
                }
        }
 

diff --git a/tests/qatom/dotest b/tests/qatom/dotest
index d6b4943..0d04f40 100755
--- a/tests/qatom/dotest
+++ b/tests/qatom/dotest
@@ -23,14 +23,14 @@ test l01 "<unset> pkg <unset>" "pkg"
 test l02 "cat pkg <unset>" "cat/pkg"
 test l03 "cat pkg 123" "cat/pkg-123"
 test l04 "cat pkg 123 r4" "cat/pkg-123-r4"
-test l05 "cat pkg 123 r4 :5" "cat/pkg-123-r4:5"
-test l06 "cat pkg 123 :5" "cat/pkg-123:5"
+test l05 "cat pkg 123 r4 5" "cat/pkg-123-r4:5"
+test l06 "cat pkg 123 5" "cat/pkg-123:5"
 test l07 "cat pkg 123 >=" ">=cat/pkg-123"
 test l07 "cat pkg 123 = *" "=cat/pkg-123*"
 
 # Explicit format.
 test f01 "cat"        -F '%{CATEGORY}' "cat/pkg"
-test f19 "cat/"       -F '%[CATEGORY]' "cat/pkg"
+test f19 "cat"        -F '%[CATEGORY]' "cat/pkg"
 test f02 "<unset>"    -F '%{CATEGORY}' "pkg"
 test f03 ""           -F '%[CATEGORY]' "pkg"
 test f04 "cat"        -F '%{CATEGORY}' "cat/pkg-123-r4:5"
@@ -58,6 +58,12 @@ test f17 "games-rpg eschalon-book-1-demo 106 r1" \
                                        "games-rpg/eschalon-book-1-demo-106-r1"
 test f18 "bla"        -F 'bla'         "cat/pkg-c"  # bug #687416
 test f19 ":pkg-c-1.4" -F ':%{PN}-1.4'  "cat/pkg-c"  # bug #687416
+# Joining format.
+test f20 "cat/pkg"    -F '%[CATEGORY]%[PF]' \
+                                       "cat/pkg"
+test f21 "pkg-123-r4:5::repo" \
+                      -F '%[PF]%[SLOT]%[REPO]' \
+                                       "cat/pkg-123-r4:5::repo"
 
 # Comparison tests
 test c01 "cat/pkg-123-r3 == pkg" \

Reply via email to