commit: 8b01bccbd469e034736f4d88f595a61e6ef6f7b4
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Oct 4 12:32:00 2020 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Oct 4 12:32:00 2020 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=8b01bccb
qlop: treat either terminating or exiting or both as a termination of Portage
It seems Portage is very inconsistent sometimes terminating, sometimes
exiting, most of the time exiting and terminating. Deal with it.
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
qlop.c | 49 +++++++++++++++++++++++++++----------------------
1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/qlop.c b/qlop.c
index dce46f2..a5d8678 100644
--- a/qlop.c
+++ b/qlop.c
@@ -374,6 +374,7 @@ static int do_emerge_log(
time_t tlast = tbegin;
time_t tstart_emerge = 0;
time_t last_merge = 0;
+ time_t last_exit = 0;
time_t sync_start = 0;
time_t sync_time = 0;
size_t sync_cnt = 0;
@@ -392,6 +393,7 @@ static int do_emerge_log(
char afmt[BUFSIZ];
struct pkg_match *pkg;
struct pkg_match *pkgw;
+#define strpfx(X, Y) strncmp(X, Y, sizeof(Y) - 1)
/* support relative path in here and now, when using ROOT, stick to
* it, turning relative into a moot point */
@@ -420,14 +422,14 @@ static int do_emerge_log(
continue;
if (flags->show_lastmerge) {
- if (strncmp(p, " *** emerge ", 13) == 0)
+ if (strpfx(p, " *** emerge ") == 0)
tstart_emerge = tstart;
if (!all_atoms)
continue;
}
atom = NULL;
- if (strncmp(p, " >>> emerge ", 13) == 0 &&
+ if (strpfx(p, " >>> emerge ") == 0 &&
(q = strchr(p + 13, ')')) != NULL)
{
p = q + 2;
@@ -436,8 +438,8 @@ static int do_emerge_log(
*q = '\0';
atom = atom_explode(p);
}
- } else if (strncmp(p, " === Unmerging... (", 20) == 0
||
- strncmp(p, " === Unmerging... (", 19)
== 0)
+ } else if (strpfx(p, " === Unmerging... (") == 0 ||
+ strpfx(p, " === Unmerging... (") == 0)
{
if (p[1] == ' ')
p++;
@@ -493,17 +495,23 @@ static int do_emerge_log(
continue;
*p++ = '\0';
+ tstart = atol(buf);
+
/* keeping track of parallel merges needs to be done before
* applying dates, for a subset of the log might show emerge
* finished without knowledge of another instance */
if (flags->do_running &&
- (strncmp(p, " *** emerge ", 13) == 0 ||
- strncmp(p, " *** terminating.", 18) == 0))
+ (strpfx(p, " *** emerge ") == 0 ||
+ strpfx(p, " *** exiting ") == 0 ||
+ strpfx(p, " *** terminating.") == 0))
{
if (p[7] == 'm') {
parallel_emerge++;
} else if (parallel_emerge > 0) {
- parallel_emerge--;
+ if (p[7] != 'e' || tstart != last_exit)
+ parallel_emerge--;
+ if (p[7] == 'x')
+ last_exit = tstart;
}
/* for bug #687508, this cannot be in the else if case
@@ -531,7 +539,6 @@ static int do_emerge_log(
}
}
- tstart = atol(buf);
if (tstart < tlast)
continue;
tlast = tstart;
@@ -539,15 +546,14 @@ static int do_emerge_log(
continue;
/* are we interested in this line? */
- if (flags->show_emerge && verbose && (
- strncmp(p, " *** emerge ", 13) == 0))
+ if (flags->show_emerge && verbose && (strpfx(p, " *** emerge
") == 0))
{
char shortopts[8]; /* must hold as many opts converted
below */
int numopts = 0;
printf("%semerge%s", DKBLUE, NORM);
for (p += 13; (q = strtok(p, " \n")) != NULL; p = NULL)
{
- if (strncmp(q, "--", 2) == 0) {
+ if (strpfx(q, "--") == 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
@@ -596,7 +602,7 @@ static int do_emerge_log(
continue;
}
- if (strncmp(q, "--", 2) == 0) {
+ if (strpfx(q, "--") == 0) {
printf(" %s%s%s", GREEN, q, NORM);
} else if (strcmp(q, "@world") == 0 ||
strcmp(q, "@system") == 0)
@@ -622,7 +628,7 @@ static int do_emerge_log(
}
printf("\n");
} else if (flags->do_sync && (
- strncmp(p, " === Sync completed ", 20)
== 0 ||
+ strpfx(p, " === Sync completed ") == 0
||
strcmp(p, " === sync\n") == 0))
{
/* sync start or stop, we have nothing to detect
parallel
@@ -636,7 +642,7 @@ static int do_emerge_log(
elapsed = tstart - sync_start;
p += 20;
- if (strncmp(p, "for ", 4) == 0) {
+ if (strpfx(p, "for ") == 0) {
p += 4;
} else { /* "with " */
p += 5;
@@ -670,8 +676,8 @@ static int do_emerge_log(
sync_start = 0; /* reset */
}
} else if (flags->do_merge && (
- strncmp(p, " >>> emerge (", 14) == 0 ||
- strncmp(p, " ::: completed emerge (",
24) == 0))
+ strpfx(p, " >>> emerge (") == 0 ||
+ strpfx(p, " ::: completed emerge (")
== 0))
{
/* merge start/stop (including potential unmerge of old
pkg) */
if (p[3] == '>') { /* >>> emerge */
@@ -810,11 +816,11 @@ static int do_emerge_log(
}
} else if (
(flags->do_unmerge &&
- strncmp(p, " === Unmerging... (", 19) == 0) ||
+ strpfx(p, " === Unmerging... (") == 0) ||
(flags->do_autoclean &&
- strncmp(p, " === Unmerging... (", 20) == 0) ||
+ strpfx(p, " === Unmerging... (") == 0) ||
((flags->do_unmerge || flags->do_autoclean) &&
- strncmp(p, " >>> unmerge success: ", 23) ==
0))
+ strpfx(p, " >>> unmerge success: ") == 0))
{
/* unmerge action */
if (p[2] == '=') {
@@ -1230,7 +1236,7 @@ static array_t *probe_proc(array_t *atoms)
if (eat_file(npath, &cmdline, &cmdlinesize)) {
if (cmdlinesize > 0 && cmdline[0] == '[' &&
(p = strchr(cmdline, ']')) !=
NULL &&
- strncmp(p, "] sandbox",
sizeof("] sandbox") - 1) == 0)
+ strpfx(p, "] sandbox") == 0)
{
*p = '\0';
atom = atom_explode(cmdline + 1);
@@ -1268,8 +1274,7 @@ static array_t *probe_proc(array_t *atoms)
if ((size_t)rpathlen >
sizeof(".log.gz") &&
(p = strrchr(rpath,
'.')) != NULL &&
p - (sizeof(".log") -
1) > rpath &&
- strncmp(p -
(sizeof(".log") - 1), ".log",
- sizeof(".log")
- 1) == 0)
+ strpfx(p -
(sizeof(".log") - 1), ".log") == 0)
{
*p = '\0';
rpathlen -= rpath - p;