From: Michael Tremer Date: Mon, 14 Jun 2021 16:46:42 +0000 (+0000) Subject: pakfire: Add convenience functions to install packages X-Git-Tag: 0.9.28~1246 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0893704bcb144709e552834932052876f23c3b6;p=pakfire.git pakfire: Add convenience functions to install packages This is being used by the builder to install the source package Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index e4e9797b2..464e8d410 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -816,17 +816,28 @@ PAKFIRE_EXPORT int pakfire_build(Pakfire pakfire, const char* path, pakfire_repo_unref(repo); } + const char* packages[] = { + path, NULL + }; + + // Install the package into the build environment + r = pakfire_install(pakfire, packages, 0); + if (r) { + ERROR(pakfire, "Could not install %s\n", path); + goto ERROR; + } + const char* root = pakfire_get_path(pakfire); // Create BUILDROOT pakfire_make_path(pakfire, buildroot, "/tmp/.buildroot.XXXXXX"); if (!pakfire_mkdtemp(buildroot)) - return 1; + goto ERROR; // Make relative BUILDROOT path const char* buildroot_rel = pakfire_path_relpath(root, buildroot); if (!buildroot_rel) - return 1; + goto ERROR; // Read makefile r = pakfire_read_makefile(&makefile, pakfire, path, &error); diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 456a7361b..a3c19e4ac 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -85,6 +85,12 @@ void pakfire_log_set_priority(Pakfire pakfire, int priority); int pakfire_read_makefile(PakfireParser* parser, Pakfire pakfire, const char* path, struct pakfire_parser_error** error); +// Install/Erase/Update + +int pakfire_install(Pakfire pakfire, const char** packages, int flags); +int pakfire_erase(Pakfire pakfire, const char** packages, int flags); +int pakfire_update(Pakfire pakfire, const char** packages, int flags); + #ifdef PAKFIRE_PRIVATE #include diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index a3543db6a..6f68c2f2c 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -26,6 +26,7 @@ global: pakfire_copy_out; pakfire_count_packages; pakfire_create; + pakfire_erase; pakfire_execute; pakfire_execute_command; pakfire_execute_script; @@ -35,12 +36,14 @@ global: pakfire_get_pool; pakfire_get_repo; pakfire_get_repos; + pakfire_install; pakfire_make_cache_path; pakfire_read_makefile; pakfire_ref; pakfire_search; pakfire_set_installonly; pakfire_unref; + pakfire_update; pakfire_version_compare; pakfire_whatprovides; diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 0e45750cc..38d8273c5 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -53,6 +53,8 @@ #include #include #include +#include +#include #include #include @@ -1553,3 +1555,71 @@ struct archive* pakfire_make_archive_disk_writer(Pakfire pakfire) { return archive; } + +// Convenience functions to install/erase/update packages + +static int pakfire_perform_transaction(Pakfire pakfire, + int (*action)(struct pakfire_request* request, const char* what, int flags), + const char** packages, int flags) { + struct pakfire_request* request = NULL; + struct pakfire_transaction* transaction = NULL; + int r = 1; + + // Packages cannot be NULL + if (!packages) { + errno = EINVAL; + return 1; + } + + // Create a new request + r = pakfire_request_create(&request, pakfire, 0); + if (r) + goto ERROR; + + // Perform action on all packages + for (const char** package = packages; *package; package++) { + r = action(request, *package, flags); + if (r) { + ERROR(pakfire, "Could not find '%s': %m\n", *package); + goto ERROR; + } + } + + // Solve the request + r = pakfire_request_solve(request, 0); + if (r) + goto ERROR; + + // Fetch the transaction + transaction = pakfire_request_get_transaction(request); + if (!transaction) + goto ERROR; + + // Run the transaction + r = pakfire_transaction_run(transaction); + if (r) + goto ERROR; + + // Success + r = 0; + +ERROR: + if (transaction) + pakfire_transaction_unref(transaction); + if (request) + pakfire_request_unref(request); + + return r; +} + +PAKFIRE_EXPORT int pakfire_install(Pakfire pakfire, const char** packages, int flags) { + return pakfire_perform_transaction(pakfire, pakfire_request_install, packages, flags); +} + +PAKFIRE_EXPORT int pakfire_erase(Pakfire pakfire, const char** packages, int flags) { + return pakfire_perform_transaction(pakfire, pakfire_request_erase, packages, flags); +} + +PAKFIRE_EXPORT int pakfire_update(Pakfire pakfire, const char** packages, int flags) { + return pakfire_perform_transaction(pakfire, pakfire_request_upgrade, packages, flags); +}