From: Michael Tremer Date: Thu, 19 Oct 2023 19:42:02 +0000 (+0000) Subject: buildservice: Build out listing uploads X-Git-Tag: 0.9.30~1442 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57a8b2d49082ccd7a0f0f5dddcc5ad1a75be4361;p=pakfire.git buildservice: Build out listing uploads Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 5d6edfc0f..5a51c1c6b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -521,10 +521,12 @@ libcli_la_CPPFLAGS = \ -I$(top_srcdir)/src/libpakfire/include libcli_la_CFLAGS = \ - $(AM_CFLAGS) + $(AM_CFLAGS) \ + $(JSON_C_CFLAGS) libcli_la_LDFLAGS = \ - $(AM_LDFLAGS) + $(AM_LDFLAGS) \ + $(JSON_C_LIBS) libcli_la_LIBADD = \ libpakfire.la diff --git a/src/cli/lib/dump.c b/src/cli/lib/dump.c index 762d9d523..4191beda8 100644 --- a/src/cli/lib/dump.c +++ b/src/cli/lib/dump.c @@ -22,6 +22,8 @@ #include #include +#include + #include #include #include @@ -91,3 +93,18 @@ int cli_dump_repolist(struct pakfire_repolist* list, int flags) { ERROR: return r; } + +int cli_dump_json(struct json_object* object) { + int r; + + // Serialize the object as a JSON string + const char* buffer = json_object_to_json_string_ext(object, + JSON_C_TO_STRING_PRETTY|JSON_C_TO_STRING_PRETTY_TAB); + + // Print to the console + r = printf("%s\n", buffer); + if (r < 0) + return r; + + return 0; +} diff --git a/src/cli/lib/dump.h b/src/cli/lib/dump.h index e9eba5f10..4b7d9ce84 100644 --- a/src/cli/lib/dump.h +++ b/src/cli/lib/dump.h @@ -21,6 +21,8 @@ #ifndef PAKFIRE_CLI_DUMP_H #define PAKFIRE_CLI_DUMP_H +#include + #include #include #include @@ -31,4 +33,6 @@ int cli_dump_packagelist(struct pakfire_packagelist* list, int flags); int cli_dump_repolist(struct pakfire_repolist* list, int flags); +int cli_dump_json(struct json_object* object); + #endif /* PAKFIRE_CLI_DUMP_H */ diff --git a/src/cli/lib/upload_list.c b/src/cli/lib/upload_list.c index cfcd9753e..46ad5ee29 100644 --- a/src/cli/lib/upload_list.c +++ b/src/cli/lib/upload_list.c @@ -18,16 +18,20 @@ # # #############################################################################*/ +#include + #include #include #include "command.h" +#include "dump.h" #include "upload_list.h" static const char* doc = "Lists all uploads"; int cli_upload_list(void* data, int argc, char* argv[]) { struct pakfire_buildservice* service = NULL; + struct json_object* uploads = NULL; int r; struct pakfire_ctx* ctx = data; @@ -42,11 +46,21 @@ int cli_upload_list(void* data, int argc, char* argv[]) { if (r) goto ERROR; - // XXX TODO + // List uploads + r = pakfire_buildservice_list_uploads(service, &uploads); + if (r) + goto ERROR; + + // Dump everything + r = cli_dump_json(uploads); + if (r) + goto ERROR; ERROR: if (service) pakfire_buildservice_unref(service); + if (uploads) + json_object_put(uploads); return r; } diff --git a/src/libpakfire/buildservice.c b/src/libpakfire/buildservice.c index d75068487..950e451cd 100644 --- a/src/libpakfire/buildservice.c +++ b/src/libpakfire/buildservice.c @@ -22,6 +22,8 @@ #include #include +#include + #include #include #include @@ -29,6 +31,7 @@ #include #include #include +#include #include @@ -177,3 +180,96 @@ PAKFIRE_EXPORT struct pakfire_buildservice* pakfire_buildservice_unref( pakfire_buildservice_free(service); return NULL; } + +static int pakfire_buildservice_create_transfer(struct pakfire_transfer** transfer, + struct pakfire_buildservice* service, const char* url) { + struct pakfire_transfer* t = NULL; + int r; + + // Create a new transfer + r = pakfire_downloader_transfer_create(&t, service->httpclient, url); + if (r) + goto ERROR; + + // Set the base URL + r = pakfire_downloader_transfer_set_baseurl(t, service->url); + if (r) + goto ERROR; + + // Return the new transfer + *transfer = pakfire_downloader_transfer_ref(t); + +ERROR: + if (t) + pakfire_downloader_transfer_unref(t); + + return r; +} + +// Uploads + +PAKFIRE_EXPORT int pakfire_buildservice_list_uploads( + struct pakfire_buildservice* service, struct json_object** p) { + struct pakfire_transfer* transfer = NULL; + struct json_object* response = NULL; + struct json_object* uploads = NULL; + char* buffer = NULL; + size_t length = 0; + int r; + + // Create a new transfer + r = pakfire_downloader_transfer_create(&transfer, service->httpclient, "/api/v1/uploads"); + if (r) + goto ERROR; + + // Set the base URL + r = pakfire_downloader_transfer_set_baseurl(transfer, service->url); + if (r) + goto ERROR; + + // Enable authentication + r = pakfire_downloader_transfer_auth(transfer); + if (r) + goto ERROR; + + // Write the response to the buffer + r = pakfire_downloader_transfer_set_output_buffer(transfer, &buffer, &length); + if (r) + goto ERROR; + + // Run the transfer + r = pakfire_downloader_transfer_run(transfer, PAKFIRE_TRANSFER_NO_PROGRESS); + if (r) + goto ERROR; + + // XXX would be nice to have the JSON error here + + // Parse the response + response = pakfire_json_parse(service->ctx, buffer, length); + if (!response) { + CTX_ERROR(service->ctx, "Could not parse the response\n"); + r = -EBADMSG; + goto ERROR; + } + + // Fetch the uploads + uploads = json_object_object_get(response, "uploads"); + if (!uploads) { + CTX_ERROR(service->ctx, "Malformed response\n"); + r = -EBADMSG; + goto ERROR; + } + + // Return the pointer + *p = json_object_get(uploads); + +ERROR: + if (transfer) + pakfire_downloader_transfer_unref(transfer); + if (response) + json_object_put(response); + if (buffer) + free(buffer); + + return r; +} diff --git a/src/libpakfire/include/pakfire/buildservice.h b/src/libpakfire/include/pakfire/buildservice.h index 3104097b1..b5b7fe578 100644 --- a/src/libpakfire/include/pakfire/buildservice.h +++ b/src/libpakfire/include/pakfire/buildservice.h @@ -23,6 +23,8 @@ struct pakfire_buildservice; +#include + #include int pakfire_buildservice_create(struct pakfire_buildservice** service, struct pakfire_ctx* ctx); @@ -30,4 +32,9 @@ int pakfire_buildservice_create(struct pakfire_buildservice** service, struct pa struct pakfire_buildservice* pakfire_buildservice_ref(struct pakfire_buildservice* service); struct pakfire_buildservice* pakfire_buildservice_unref(struct pakfire_buildservice* service); +// Uploads + +int pakfire_buildservice_list_uploads( + struct pakfire_buildservice* service, struct json_object** uploads); + #endif /* PAKFIRE_BUILDSERVICE_H */ diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 12812182b..4e0dbbc9f 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -86,6 +86,7 @@ global: pakfire_buildservice_create; pakfire_buildservice_ref; pakfire_buildservice_unref; + pakfire_buildservice_list_uploads; # dependencies pakfire_static_version_compare;