]> git.ipfire.org Git - pakfire.git/commitdiff
linter: Add result callback to print to the CLI
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 19 Oct 2024 14:48:49 +0000 (14:48 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 19 Oct 2024 14:48:49 +0000 (14:48 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/cli/lib/lint.c
src/libpakfire/archive.c
src/libpakfire/include/pakfire/archive.h
src/libpakfire/include/pakfire/linter.h
src/libpakfire/linter.c

index a94fad59fcbc7435365efe23598440c131bd4dfe..a89c16e0582ee511b22aa98c36ecfefa549ed2d1 100644 (file)
 
 #include <argp.h>
 
+#include <pakfire/ctx.h>
 #include <pakfire/archive.h>
+#include <pakfire/package.h>
 #include <pakfire/pakfire.h>
 
+#include "color.h"
 #include "command.h"
 #include "lint.h"
 #include "pakfire.h"
@@ -57,6 +60,30 @@ static error_t parse(int key, char* arg, struct argp_state* state, void* data) {
        return 0;
 }
 
+static int cli_linter_result(struct pakfire_ctx* ctx, struct pakfire_archive* archive,
+               struct pakfire_package* package, int priority, const char* result, void* data) {
+       const char* nevra = pakfire_package_get_string(package, PAKFIRE_PKG_NEVRA);
+
+       switch (priority) {
+               case PAKFIRE_LINTER_INFO:
+                       printf("%s: %s%s%s\n", nevra, color_highlight(), result, color_reset());
+                       break;
+
+               case PAKFIRE_LINTER_WARNING:
+                       printf("%s: %s%s%s\n", nevra, color_yellow(), result, color_reset());
+                       break;
+
+               case PAKFIRE_LINTER_ERROR:
+                       printf("%s: %s%s%s\n", nevra, color_red(), result, color_reset());
+                       break;
+
+               default:
+                       return -ENOTSUP;
+       }
+
+       return 0;
+}
+
 static int do_lint(struct pakfire* pakfire, const char* path) {
        struct pakfire_archive* archive = NULL;
        int r;
@@ -69,7 +96,7 @@ static int do_lint(struct pakfire* pakfire, const char* path) {
        }
 
        // Perform the linting...
-       r = pakfire_archive_lint(archive);
+       r = pakfire_archive_lint(archive, cli_linter_result, NULL);
        if (r < 0) {
                fprintf(stderr, "Could not lint %s: %s\n", path, strerror(-r));
                goto ERROR;
index 0a9fcff879fa059b10e1ff8e47b1446839e77999..8e40b48092ccc986fd5cf17073d68c52ca0f2003 100644 (file)
@@ -1449,7 +1449,8 @@ int pakfire_archive_apply_systemd_sysusers(struct pakfire_archive* archive) {
        return 0;
 }
 
-PAKFIRE_EXPORT int pakfire_archive_lint(struct pakfire_archive* archive) {
+PAKFIRE_EXPORT int pakfire_archive_lint(struct pakfire_archive* archive,
+               pakfire_linter_result_callback callback, void* data) {
        struct pakfire_linter* linter = NULL;
        int r;
 
@@ -1458,6 +1459,9 @@ PAKFIRE_EXPORT int pakfire_archive_lint(struct pakfire_archive* archive) {
        if (r < 0)
                goto ERROR;
 
+       // Set callback
+       pakfire_linter_set_result_callback(linter, callback, data);
+
        // Lint, lint, lint...
        r = pakfire_linter_lint(linter);
        if (r < 0)
index 55b71ff74c22cbabb1ea65df91d8789541b84b8e..2ad18890b1e0c0bf168dd5ae77a604325d783056 100644 (file)
@@ -27,6 +27,7 @@ struct pakfire_archive;
 
 #include <pakfire/digest.h>
 #include <pakfire/filelist.h>
+#include <pakfire/linter.h>
 #include <pakfire/package.h>
 #include <pakfire/repo.h>
 #include <pakfire/scriptlet.h>
@@ -55,7 +56,8 @@ ssize_t pakfire_archive_get_size(struct pakfire_archive* archive);
 int pakfire_archive_make_package(struct pakfire_archive* archive,
        struct pakfire_repo* repo, struct pakfire_package** package);
 
-int pakfire_archive_lint(struct pakfire_archive* archive);
+int pakfire_archive_lint(struct pakfire_archive* archive,
+       pakfire_linter_result_callback callback, void* data);
 
 #ifdef PAKFIRE_PRIVATE
 
index 1f6e2988b1f99c402d65f17cc5a18db9e253afdd..acaf7188776399a31655e9dcb6b361a01776aaa7 100644 (file)
 #ifndef PAKFIRE_LINTER_H
 #define PAKFIRE_LINTER_H
 
-#ifdef PAKFIRE_PRIVATE
-
 #include <pakfire/archive.h>
 #include <pakfire/ctx.h>
+#include <pakfire/package.h>
+
+enum pakfire_linter_priority {
+       PAKFIRE_LINTER_INFO,
+       PAKFIRE_LINTER_WARNING,
+       PAKFIRE_LINTER_ERROR,
+};
+
+typedef int (*pakfire_linter_result_callback)(struct pakfire_ctx* ctx,
+       struct pakfire_archive* archive, struct pakfire_package* package,
+       int priority, const char* message, void* data);
+
+#ifdef PAKFIRE_PRIVATE
 
 struct pakfire_linter;
 
@@ -34,6 +45,9 @@ int pakfire_linter_create(struct pakfire_linter** linter,
 struct pakfire_linter* pakfire_linter_ref(struct pakfire_linter* linter);
 struct pakfire_linter* pakfire_linter_unref(struct pakfire_linter* linter);
 
+void pakfire_linter_set_result_callback(struct pakfire_linter* linter,
+       pakfire_linter_result_callback callback, void* data);
+
 int pakfire_linter_lint(struct pakfire_linter* linter);
 
 #endif /* PAKFIRE_PRIVATE */
index 37b2a9d2ad1a5e8fb361bf7d7de1b2aa2f5717f8..616937d016f7a099fc12fe9e2c2df58c9ae1f0f7 100644 (file)
@@ -31,11 +31,7 @@ struct pakfire_linter_result {
        TAILQ_ENTRY(pakfire_linter_result) nodes;
 
        // Priority
-       enum pakfire_linter_priority {
-               PAKFIRE_LINTER_INFO,
-               PAKFIRE_LINTER_WARNING,
-               PAKFIRE_LINTER_ERROR,
-       } priority;
+       int priority;
 
        // Comment
        char* comment;
@@ -53,6 +49,10 @@ struct pakfire_linter {
 
        // Results
        TAILQ_HEAD(results, pakfire_linter_result) results;
+
+       // Result Callback
+       pakfire_linter_result_callback result_callback;
+       void* result_data;
 };
 
 static void pakfire_linter_result_free(struct pakfire_linter_result* result) {
@@ -100,6 +100,16 @@ static int pakfire_linter_result(
        CTX_DEBUG(linter->ctx, "%s: %s",
                pakfire_archive_get_path(linter->archive), result->comment);
 
+       // Call the callback
+       if (linter->result_callback) {
+               r = linter->result_callback(linter->ctx, linter->archive, linter->pkg,
+                       priority, result->comment, linter->result_data);
+               if (r < 0) {
+                       CTX_ERROR(linter->ctx, "Linter result callback failed: %s\n", strerror(-r));
+                       return r;
+               }
+       }
+
        return 0;
 }
 
@@ -179,6 +189,12 @@ struct pakfire_linter* pakfire_linter_unref(struct pakfire_linter* linter) {
        return NULL;
 }
 
+void pakfire_linter_set_result_callback(struct pakfire_linter* linter,
+               pakfire_linter_result_callback callback, void* data) {
+       linter->result_callback = callback;
+       linter->result_data     = data;
+}
+
 static int pakfire_linter_name(struct pakfire_linter* linter) {
        int r;