#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"
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;
}
// 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;
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;
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)
#include <pakfire/digest.h>
#include <pakfire/filelist.h>
+#include <pakfire/linter.h>
#include <pakfire/package.h>
#include <pakfire/repo.h>
#include <pakfire/scriptlet.h>
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
#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;
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 */
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;
// 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) {
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;
}
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;