]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
buildservice: Build out listing uploads
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 19 Oct 2023 19:42:02 +0000 (19:42 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 19 Oct 2023 19:42:02 +0000 (19:42 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/cli/lib/dump.c
src/cli/lib/dump.h
src/cli/lib/upload_list.c
src/libpakfire/buildservice.c
src/libpakfire/include/pakfire/buildservice.h
src/libpakfire/libpakfire.sym

index 5d6edfc0f29191cf973b98289652aff40cee4646..5a51c1c6b834b6fce8c8c2904e75b16298e19b95 100644 (file)
@@ -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
index 762d9d5232f9519451c6259e71bf8a6d2363e4ee..4191beda8ebb1501ef2416588170fe79d919b004 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <json.h>
+
 #include <pakfire/package.h>
 #include <pakfire/packagelist.h>
 #include <pakfire/pakfire.h>
@@ -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;
+}
index e9eba5f10758992b9a219920c90f8299d3d7ae66..4b7d9ce845292ce6e882a0eaf0aa798c1bb68b37 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef PAKFIRE_CLI_DUMP_H
 #define PAKFIRE_CLI_DUMP_H
 
+#include <json.h>
+
 #include <pakfire/package.h>
 #include <pakfire/packagelist.h>
 #include <pakfire/pakfire.h>
@@ -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 */
index cfcd9753e7e84054085a6023769bf983a673fb77..46ad5ee2900cc66de45a611bd34d6537b05938fe 100644 (file)
 #                                                                             #
 #############################################################################*/
 
+#include <json.h>
+
 #include <pakfire/buildservice.h>
 #include <pakfire/ctx.h>
 
 #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;
 }
index d750684873496d8104cf79de3b39fc8bc2fdbaa8..950e451cdacbc78ac977d55834e7daa6553c0e72 100644 (file)
@@ -22,6 +22,8 @@
 #include <limits.h>
 #include <stdlib.h>
 
+#include <json.h>
+
 #include <pakfire/buildservice.h>
 #include <pakfire/config.h>
 #include <pakfire/ctx.h>
@@ -29,6 +31,7 @@
 #include <pakfire/logging.h>
 #include <pakfire/private.h>
 #include <pakfire/string.h>
+#include <pakfire/util.h>
 
 #include <krb5/krb5.h>
 
@@ -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;
+}
index 3104097b1ae11a79a488a64d4323a6e9809a38b5..b5b7fe578be15e50d8c90be894f5c88e4906adf6 100644 (file)
@@ -23,6 +23,8 @@
 
 struct pakfire_buildservice;
 
+#include <json.h>
+
 #include <pakfire/ctx.h>
 
 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 */
index 12812182b97be865684db1b40cfe991782214e45..4e0dbbc9f96a052303e59752b508c1a36057e50a 100644 (file)
@@ -86,6 +86,7 @@ global:
        pakfire_buildservice_create;
        pakfire_buildservice_ref;
        pakfire_buildservice_unref;
+       pakfire_buildservice_list_uploads;
 
        # dependencies
        pakfire_static_version_compare;