commit:     3dc607a8a6cfd3bafbc2f10d9a7c3aae90c3a757
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Tue Sep 10 18:21:51 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Tue Sep 10 18:21:51 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=3dc607a8

qlop: add mode to print last run in a similar way like emerge(1) does

For example, the output could be like this, showing upgrade information:

% ./qlop -E -t
  U  app-shells/bash-5.0_p11 [5.0_p9-r0]: 2′38″
  U  app-admin/eselect-1.4.15 [1.4.14-r0]: 19s
  U  sys-libs/talloc-2.3.0 [2.2.0-r0]: 1′56″
  U  app-portage/prefix-toolkit-5 [4-r0]: 10s
  U  dev-python/cryptography-2.7 [2.6.1-r0]: 1′59″
  U  net-dns/bind-tools-9.14.5 [9.14.4-r0]: 4′17″
 R   dev-python/sphinxcontrib-applehelp-1.0.1: 28s
 R   dev-python/sphinxcontrib-devhelp-1.0.1: 27s
 R   dev-python/sphinxcontrib-jsmath-1.0.1: 25s
 R   dev-python/sphinxcontrib-htmlhelp-1.0.2: 28s
 R   dev-python/sphinxcontrib-serializinghtml-1.1.3: 28s
 R   dev-python/sphinxcontrib-qthelp-1.0.2: 28s
  U  dev-python/sphinx-2.0.1 [1.7.5-r1]: 1′13″
  U  net-mail/notmuch-0.29.1-r1 [0.28.4-r0]: 1′00″

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

 man/qlop.1 |  5 ++++-
 qlop.c     | 49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/man/qlop.1 b/man/qlop.1
index baa5bf5..de1e525 100644
--- a/man/qlop.1
+++ b/man/qlop.1
@@ -1,5 +1,5 @@
 .\" generated by mkman.py, please do NOT edit!
-.TH qlop "1" "Jul 2019" "Gentoo Foundation" "qlop"
+.TH qlop "1" "Sep 2019" "Gentoo Foundation" "qlop"
 .SH NAME
 qlop \- emerge log analyzer
 .SH SYNOPSIS
@@ -65,6 +65,9 @@ Show autoclean unmerge history.
 \fB\-s\fR, \fB\-\-sync\fR
 Show sync history.
 .TP
+\fB\-E\fR, \fB\-\-emerge\fR
+Show last merge like how emerge(1) -v would show it.
+.TP
 \fB\-e\fR, \fB\-\-endtime\fR
 Report time at which the operation finished (iso started).
 .TP

diff --git a/qlop.c b/qlop.c
index 243c8b6..3cc3367 100644
--- a/qlop.c
+++ b/qlop.c
@@ -24,7 +24,7 @@
 
 #define QLOP_DEFAULT_LOGFILE "emerge.log"
 
-#define QLOP_FLAGS "ctaHMmuUslerd:f:w:F:" COMMON_FLAGS
+#define QLOP_FLAGS "ctaHMmuUsElerd:f:w:F:" COMMON_FLAGS
 static struct option const qlop_long_opts[] = {
        {"summary",   no_argument, NULL, 'c'},
        {"time",      no_argument, NULL, 't'},
@@ -35,6 +35,7 @@ static struct option const qlop_long_opts[] = {
        {"unmerge",   no_argument, NULL, 'u'},
        {"autoclean", no_argument, NULL, 'U'},
        {"sync",      no_argument, NULL, 's'},
+       {"emerge",    no_argument, NULL, 'E'},
        {"endtime",   no_argument, NULL, 'e'},
        {"running",   no_argument, NULL, 'r'},
        {"date",       a_argument, NULL, 'd'},
@@ -54,6 +55,7 @@ static const char * const qlop_opts_help[] = {
        "Show unmerge history",
        "Show autoclean unmerge history",
        "Show sync history",
+       "Show last merge like how emerge(1) -v would show it",
        "Report time at which the operation finished (iso started)",
        "Show current emerging packages",
        "Limit selection to this time (1st -d is start, 2nd -d is end)",
@@ -85,6 +87,7 @@ struct qlop_mode {
        char do_machine:1;
        char do_endtime:1;
        char show_lastmerge:1;
+       char show_emerge:1;
        const char *fmt;
 };
 
@@ -334,6 +337,7 @@ static int do_emerge_log(
        time_t elapsed;
        depend_atom *atom;
        depend_atom *atomw;
+       depend_atom *upgrade_atom = NULL;
        DECLARE_ARRAY(merge_matches);
        DECLARE_ARRAY(merge_averages);
        DECLARE_ARRAY(unmerge_matches);
@@ -638,6 +642,34 @@ static int do_emerge_log(
                                                                flags->do_time 
? ": " : "",
                                                                flags->do_time ?
                                                                        
fmt_elapsedtime(flags, elapsed) : "");
+                                       } else if (flags->show_emerge) {
+                                               int state = NOT_EQUAL;
+                                               if (upgrade_atom != NULL)
+                                                       state = 
atom_compare(pkgw->atom, upgrade_atom);
+                                               switch (state) {
+                                                       /*         "NRUD " */
+                                                       case EQUAL:
+                                                               printf(" %sR%s  
 ", YELLOW, NORM);
+                                                               break;
+                                                       case NOT_EQUAL:
+                                                               printf("%sN%s   
 ", GREEN, NORM);
+                                                               break;
+                                                       case NEWER:
+                                                               printf("  %sU%s 
 ", BLUE, NORM);
+                                                               break;
+                                                       case OLDER:
+                                                               printf("  
%sU%sD%s ", BLUE, DKBLUE, NORM);
+                                                               break;
+                                               }
+                                               printf("%s", 
atom_format(flags->fmt, pkgw->atom));
+                                               if (state == NEWER || state == 
OLDER)
+                                                       printf(" %s[%s%s%s]%s", 
DKBLUE, NORM,
+                                                                       
atom_format("%[PVR]", upgrade_atom),
+                                                                       DKBLUE, 
NORM);
+                                               if (flags->do_time)
+                                                       printf(": %s\n", 
fmt_elapsedtime(flags, elapsed));
+                                               else
+                                                       printf("\n");
                                        } else if (flags->do_time) {
                                                printf("%s >>> %s: %s\n",
                                                                fmt_date(flags, 
pkgw->tbegin, tstart),
@@ -675,6 +707,14 @@ static int do_emerge_log(
                                if (atom == NULL)
                                        continue;
 
+                               if (p[-20] == ' ' && flags->show_emerge)
+                               {
+                                       if (upgrade_atom != NULL)
+                                               atom_implode(upgrade_atom);
+                                       upgrade_atom = atom;
+                                       continue;
+                               }
+
                                /* see if we need this atom */
                                atomw = NULL;
                                array_for_each(atoms, i, atomw) {
@@ -942,6 +982,7 @@ int qlop_main(int argc, char **argv)
        m.do_machine = 0;
        m.do_endtime = 0;
        m.show_lastmerge = 0;
+       m.show_emerge = 0;
        m.fmt = NULL;
 
        while ((ret = GETOPT_LONG(QLOP, qlop, "")) != -1) {
@@ -953,6 +994,12 @@ int qlop_main(int argc, char **argv)
                        case 'u': m.do_unmerge = 1;     break;
                        case 'U': m.do_autoclean = 1;   break;
                        case 's': m.do_sync = 1;        break;
+                       case 'E': m.do_merge = 1;
+                                         m.do_unmerge = 1;
+                                         m.do_autoclean = 1;
+                                         m.show_lastmerge = 1;
+                                         m.show_emerge = 1;
+                                         verbose = 1;          break;
                        case 'r': m.do_running = 1;     break;
                        case 'a': m.do_average = 1;     break;
                        case 'c': m.do_summary = 1;     break;

Reply via email to