]> git.ipfire.org Git - pakfire.git/commitdiff
linter: Dump the result in a very human readable way
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Oct 2024 10:48:23 +0000 (10:48 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Oct 2024 10:48:23 +0000 (10:48 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/linter.c

index f380fff4e84aa748a23d1e6159a6b67b6a0ad13d..44e24e61b46183ed3f54539cd95826e37a84e890 100644 (file)
@@ -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;
 }