commit: f926e13ef6202ec76ba057141933e835ee571787
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sat May 2 09:46:57 2020 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sat May 2 09:58:33 2020 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=f926e13e
qlop: add -v mode to -E that displays emerge invocation
Really complete the --emerge option with --verbose to get:
% qlop -Ev
emerge -uaD @world
U sys-kernel/linux-firmware-20200421 [20200316]
N www-servers/nginx-1.18.0
D www-servers/nginx-1.17.10
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
man/include/qlop.optdesc.yaml | 13 +++++++
qlop.c | 84 ++++++++++++++++++++++++++++++++++++++++---
2 files changed, 92 insertions(+), 5 deletions(-)
diff --git a/man/include/qlop.optdesc.yaml b/man/include/qlop.optdesc.yaml
index 463a19d..c6e0833 100644
--- a/man/include/qlop.optdesc.yaml
+++ b/man/include/qlop.optdesc.yaml
@@ -55,3 +55,16 @@ running: |
observed, or no previous occurrences for the operation exist,
\fIunknown\fR is printed. When combined with \fB-t\fR the
elapsed time is also displayed.
+emerge: |
+ Immitate \fBemerge\fR(1) output, as if \fBemerge -pv\fR had been
+ run. This produces a list of packages that were installed (N),
+ upgraded (U), downgraded (UD), re-installed (R) or unmerged (D).
+ The list always includes the version numbers, and for up/downgrades
+ the previous version is listed between square brackets after the
+ package. When \fB-v\fR is used, the \fBemerge\fR invocations are
+ printed as well, to really show what happened. When concurrent
+ merges are present in the displayed timeframe, the output will be
+ hard to read. This is a limitation of the \fIemerge.log\fR format.
+ It is possible to combine this flag with the \fB-d\fR flag, in which
+ case the default behaviour of displaying the last merge (\fB-l\fR)
+ is disabled.
diff --git a/qlop.c b/qlop.c
index 69133bb..d5ace83 100644
--- a/qlop.c
+++ b/qlop.c
@@ -539,7 +539,82 @@ static int do_emerge_log(
continue;
/* are we interested in this line? */
- if (flags->do_sync && (
+ if (flags->show_emerge && verbose && (
+ strncmp(p, " *** emerge ", 13) == 0))
+ {
+ char shortopts[8]; /* must hold as many opts converted
below */
+ int numopts = 0;
+
+ printf("emerge");
+ for (p += 13; (q = strtok(p, " \n")) != NULL; p = NULL)
{
+ if (strncmp(q, "--", 2) == 0) {
+ /* portage seems to normalise options
given into
+ * their long forms always; I don't
want to keep a
+ * mapping table to short forms here,
but it's
+ * tempting, so I just do a few of the
often used
+ * ones */
+ q += 2;
+ if (strcmp(q, "ask") == 0) {
+ shortopts[numopts++] = 'a';
+ } else if (strcmp(q, "verbose") == 0) {
+ shortopts[numopts++] = 'v';
+ } else if (strcmp(q, "oneshot") == 0) {
+ shortopts[numopts++] = '1';
+ } else if (strcmp(q, "deep") == 0) {
+ shortopts[numopts++] = 'D';
+ } else if (strcmp(q, "update") == 0) {
+ shortopts[numopts++] = 'u';
+ } else if (strcmp(q, "depclean") == 0) {
+ shortopts[numopts++] = 'c';
+ } else if (strcmp(q, "unmerge") == 0) {
+ shortopts[numopts++] = 'C';
+ } else {
+ q = NULL;
+ }
+
+ /* process next token */
+ if (q != NULL)
+ continue;
+ }
+
+ /* if we're here, we've assembled opts whatever
we could */
+ if (numopts > 0) {
+ printf(" %s-%.*s%s",
+ GREEN, numopts,
shortopts, NORM);
+ numopts = 0;
+ }
+
+ if (*q == '\0') {
+ /* skip empty token, likely the
trailing \n */
+ continue;
+ }
+
+ if (strncmp(q, "--", 2) == 0) {
+ printf(" %s--%s%s", GREEN, q, NORM);
+ } else if (strcmp(q, "@world") == 0 ||
+ strcmp(q, "@system") == 0)
+ {
+ printf(" %s%s%s", YELLOW, q, NORM);
+ } else if (strcmp(q, "world") == 0 ||
+ strcmp(q, "system") == 0)
+ {
+ printf(" %s@%s%s", YELLOW, q, NORM);
+ } else {
+ /* this should be an atom */
+ atom = atom_explode(q);
+ if (atom == NULL) {
+ /* or not ... just print it */
+ printf(" %s", q);
+ } else {
+ printf(" %s", atom_format(
+
"%[pfx]%[CAT]%[PF]%[sfx]"
+
"%[SLOT]%[SUBSLOT]%[REPO]", atom));
+ atom_implode(atom);
+ }
+ }
+ }
+ printf("\n");
+ } else if (flags->do_sync && (
strncmp(p, " === Sync completed ", 20)
== 0 ||
strcmp(p, " === sync\n") == 0))
{
@@ -702,7 +777,7 @@ static int do_emerge_log(
printf("
%sU%sD%s ", BLUE, DKBLUE, NORM);
break;
}
- printf("%s",
atom_format(flags->fmt, pkgw->atom));
+ printf("%s",
atom_format("%[CAT]%[PF]", pkgw->atom));
if (state == NEWER || state ==
OLDER)
printf(" %s[%s%s%s]%s",
DKBLUE, NORM,
atom_format("%[PVR]", upgrade_atom),
@@ -836,7 +911,7 @@ static int do_emerge_log(
* is the only distinquishable
choice, appearing
* in the place of N(ew). */
printf("%sD%s %s", RED, NORM,
-
atom_format(flags->fmt, pkgw->atom));
+
atom_format("%[CAT]%[PF]", pkgw->atom));
if (flags->do_time)
printf(": %s\n",
fmt_elapsedtime(flags, elapsed));
else
@@ -1266,8 +1341,7 @@ int qlop_main(int argc, char **argv)
m.do_unmerge = 1;
m.do_autoclean = 1;
m.show_lastmerge = 1;
- m.show_emerge = 1;
- verbose = 1; break;
+ m.show_emerge = 1; break;
case 'r': m.do_running = 1;
runningmode++; break;
case 'a': m.do_average = 1; break;