From ffaa51ce240bac014f2dfeff40cd6eb4d588def4 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 26 Oct 2024 10:48:23 +0000 Subject: [PATCH] linter: Dump the result in a very human readable way Signed-off-by: Michael Tremer --- src/libpakfire/linter.c | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/libpakfire/linter.c b/src/libpakfire/linter.c index f380fff4e..44e24e61b 100644 --- a/src/libpakfire/linter.c +++ b/src/libpakfire/linter.c @@ -528,6 +528,94 @@ ERROR: return r; } +static int pakfire_linter_dump_results( + struct pakfire_linter* linter, struct pakfire_file* file, const char* prefix) { + struct pakfire_linter_result* result = NULL; + + TAILQ_FOREACH(result, &linter->results, nodes) { + // Also process if the file matches + if (result->file == file) { + switch (result->priority) { + case PAKFIRE_LINTER_INFO: + INFO(linter->ctx, "%s%s\n", prefix, result->comment); + break; + + case PAKFIRE_LINTER_WARNING: + WARN(linter->ctx, "%s%s\n", prefix, result->comment); + break; + + case PAKFIRE_LINTER_ERROR: + ERROR(linter->ctx, "%s%s\n", prefix, result->comment); + break; + } + } + } + + return 0; +} + +static int __pakfire_linter_dump_file( + struct pakfire_ctx* ctx, struct pakfire_file* file, void* data) { + struct pakfire_linter* linter = data; + + // Show information about the file + char* dump = pakfire_file_dump(file, PAKFIRE_FILE_DUMP_FULL); + if (!dump) + return -errno; + + // Show the file information + if (linter->stats.errors) + ERROR(linter->ctx, " %s:\n", dump); + else if (linter->stats.warnings) + WARN(linter->ctx, " %s:\n", dump); + else + INFO(linter->ctx, " %s:\n", dump); + + // Show all results + return pakfire_linter_dump_results(linter, file, " "); +} + +/* + Dumps the result of the linter... +*/ +static int pakfire_linter_dump(struct pakfire_linter* linter) { + int r; + + // Fetch nevra + const char* nevra = pakfire_package_get_string(linter->pkg, PAKFIRE_PKG_NEVRA); + + // Show a simply OK message if there have been no problems + if (!linter->stats.results) { + INFO(linter->ctx, "%s: OK\n", nevra); + + return 0; + + // Show an error header if we have errors + } else if (linter->stats.errors) { + ERROR(linter->ctx, "%s failed linting:\n", nevra); + + // Show a warning header if we have warnings + } else if (linter->stats.warnings) { + WARN(linter->ctx, "%s has warnings:\n", nevra); + + // As a last resort we only show a simple header + } else { + INFO(linter->ctx, "%s:\n", nevra); + } + + // Show everything about the package + r = pakfire_linter_dump_results(linter, NULL, " "); + if (r < 0) + return r; + + // Show package results + r = pakfire_filelist_walk(linter->filelist, __pakfire_linter_dump_file, linter, 0); + if (r < 0) + return r; + + return 0; +} + int pakfire_linter_lint(struct pakfire_linter* linter) { int r; @@ -541,5 +629,10 @@ int pakfire_linter_lint(struct pakfire_linter* linter) { if (r < 0) return r; + // Dump the result + r = pakfire_linter_dump(linter); + if (r < 0) + return r; + return 0; } -- 2.39.5