From a948036243a4cbfe09ebee1531e5b0fb5c73207c Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 19 Oct 2024 14:48:49 +0000 Subject: [PATCH] linter: Add result callback to print to the CLI Signed-off-by: Michael Tremer --- src/cli/lib/lint.c | 29 +++++++++++++++++++++++- src/libpakfire/archive.c | 6 ++++- src/libpakfire/include/pakfire/archive.h | 4 +++- src/libpakfire/include/pakfire/linter.h | 18 +++++++++++++-- src/libpakfire/linter.c | 26 +++++++++++++++++---- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/src/cli/lib/lint.c b/src/cli/lib/lint.c index a94fad59f..a89c16e05 100644 --- a/src/cli/lib/lint.c +++ b/src/cli/lib/lint.c @@ -20,9 +20,12 @@ #include +#include #include +#include #include +#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; diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 0a9fcff87..8e40b4809 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -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) diff --git a/src/libpakfire/include/pakfire/archive.h b/src/libpakfire/include/pakfire/archive.h index 55b71ff74..2ad18890b 100644 --- a/src/libpakfire/include/pakfire/archive.h +++ b/src/libpakfire/include/pakfire/archive.h @@ -27,6 +27,7 @@ struct pakfire_archive; #include #include +#include #include #include #include @@ -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 diff --git a/src/libpakfire/include/pakfire/linter.h b/src/libpakfire/include/pakfire/linter.h index 1f6e2988b..acaf71887 100644 --- a/src/libpakfire/include/pakfire/linter.h +++ b/src/libpakfire/include/pakfire/linter.h @@ -21,10 +21,21 @@ #ifndef PAKFIRE_LINTER_H #define PAKFIRE_LINTER_H -#ifdef PAKFIRE_PRIVATE - #include #include +#include + +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 */ diff --git a/src/libpakfire/linter.c b/src/libpakfire/linter.c index 37b2a9d2a..616937d01 100644 --- a/src/libpakfire/linter.c +++ b/src/libpakfire/linter.c @@ -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; -- 2.47.2