From e9d2b567d4fab47037f0ed04488d62c670854b2a Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 4 Nov 2022 11:02:16 +0000 Subject: [PATCH] request: Refactor and remove all those customs functions Signed-off-by: Michael Tremer --- src/libpakfire/build.c | 2 +- src/libpakfire/include/pakfire/request.h | 30 ++- src/libpakfire/pakfire.c | 23 +- src/libpakfire/request.c | 285 +++++++++-------------- 4 files changed, 132 insertions(+), 208 deletions(-) diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index a146cee4e..e605f2904 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -1307,7 +1307,7 @@ static int pakfire_build_install_package(struct pakfire* pakfire, struct pakfire_package* pkg, void* p) { struct pakfire_request* request = (struct pakfire_request*)p; - return pakfire_request_install_package(request, pkg); + return pakfire_request_add_package(request, PAKFIRE_REQ_INSTALL, pkg, 0); } static int pakfire_build_install_test(struct pakfire_build* build) { diff --git a/src/libpakfire/include/pakfire/request.h b/src/libpakfire/include/pakfire/request.h index 12be470d2..72f2f7914 100644 --- a/src/libpakfire/include/pakfire/request.h +++ b/src/libpakfire/include/pakfire/request.h @@ -44,6 +44,16 @@ enum pakfire_request_job_flags { struct pakfire_request; +enum pakfire_request_action { + PAKFIRE_REQ_INSTALL, + PAKFIRE_REQ_ERASE, + PAKFIRE_REQ_UPDATE, + PAKFIRE_REQ_UPDATE_ALL, + PAKFIRE_REQ_SYNC, + PAKFIRE_REQ_LOCK, + PAKFIRE_REQ_VERIFY, +}; + int pakfire_request_create(struct pakfire_request** request, struct pakfire* pakfire, int flags); struct pakfire_request* pakfire_request_ref(struct pakfire_request* request); @@ -52,22 +62,10 @@ struct pakfire_request* pakfire_request_unref(struct pakfire_request* request); int pakfire_request_solve(struct pakfire_request* request, struct pakfire_transaction** transaction); -int pakfire_request_install(struct pakfire_request* request, const char* what, int flags); -int pakfire_request_install_package(struct pakfire_request* request, struct pakfire_package* package); - -int pakfire_request_erase(struct pakfire_request* request, const char* what, int flags); -int pakfire_request_erase_package(struct pakfire_request* request, struct pakfire_package* package, int flags); - -int pakfire_request_update(struct pakfire_request* request, const char* what, int flags); -int pakfire_request_update_package(struct pakfire_request* request, struct pakfire_package* package); - -int pakfire_request_update_all(struct pakfire_request* request, int flags); -int pakfire_request_sync(struct pakfire_request* request, int flags); - -int pakfire_request_lock(struct pakfire_request* request, const char* what); -int pakfire_request_lock_package(struct pakfire_request* request, struct pakfire_package* package); - -int pakfire_request_verify(struct pakfire_request* request, int flags); +int pakfire_request_add(struct pakfire_request* request, + const enum pakfire_request_action action, const char* what, int flags); +int pakfire_request_add_package(struct pakfire_request* request, + const enum pakfire_request_action action, struct pakfire_package* package, int flags); int pakfire_request_take_solution(struct pakfire_request* request, struct pakfire_solution* solution); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 11e908d9b..19dff85b7 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1704,7 +1704,7 @@ static int pakfire_perform_transaction( struct pakfire* pakfire, int transaction_flags, int solver_flags, - int (*action)(struct pakfire_request* request, const char* what, int flags), + const enum pakfire_request_action action, const char** packages, const char** locks, int job_flags, @@ -1734,7 +1734,7 @@ static int pakfire_perform_transaction( // Lock anything that should be locked if (locks) { for (const char** lock = locks; *lock; lock++) { - r = pakfire_request_lock(request, *lock); + r = pakfire_request_add(request, PAKFIRE_REQ_LOCK, *lock, 0); if (r) { ERROR(pakfire, "Could not lock '%s': %m\n", *lock); goto ERROR; @@ -1744,7 +1744,7 @@ static int pakfire_perform_transaction( // Perform action on all packages for (const char** package = packages; *package; package++) { - r = action(request, *package, job_flags); + r = pakfire_request_add(request, action, *package, job_flags); if (r) { ERROR(pakfire, "Could not find '%s': %m\n", *package); goto ERROR; @@ -1818,7 +1818,7 @@ PAKFIRE_EXPORT int pakfire_install( pakfire, transaction_flags, solver_flags, - pakfire_request_install, + PAKFIRE_REQ_INSTALL, packages, locks, flags, @@ -1841,7 +1841,7 @@ PAKFIRE_EXPORT int pakfire_erase( pakfire, transaction_flags, solver_flags, - pakfire_request_erase, + PAKFIRE_REQ_ERASE, packages, locks, flags, @@ -1851,8 +1851,7 @@ PAKFIRE_EXPORT int pakfire_erase( } static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solver_flags, - int (*action)(struct pakfire_request* request, int flags), - int job_flags, int* changed, + const enum pakfire_request_action action, int job_flags, int* changed, pakfire_status_callback status_callback, void* status_callback_data) { struct pakfire_request* request = NULL; struct pakfire_transaction* transaction = NULL; @@ -1869,7 +1868,7 @@ static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solve goto ERROR; // Perform action - r = action(request, job_flags); + r = pakfire_request_add(request, action, NULL, job_flags); if (r) goto ERROR; @@ -1941,16 +1940,16 @@ PAKFIRE_EXPORT int pakfire_update( // XXX add locks if (!packages) return pakfire_perform_transaction_simple( - pakfire, solver_flags, pakfire_request_update_all, flags, changed, + pakfire, solver_flags, PAKFIRE_REQ_UPDATE_ALL, flags, changed, status_callback, status_callback_data); return pakfire_perform_transaction(pakfire, transaction_flags, solver_flags, - pakfire_request_update, packages, locks, flags, changed, + PAKFIRE_REQ_UPDATE, packages, locks, flags, changed, status_callback, status_callback_data); } static int pakfire_verify(struct pakfire* pakfire, int *changed) { - return pakfire_perform_transaction_simple(pakfire, 0, pakfire_request_verify, + return pakfire_perform_transaction_simple(pakfire, 0, PAKFIRE_REQ_VERIFY, 0, changed, NULL, NULL); } @@ -2008,5 +2007,5 @@ ERROR: PAKFIRE_EXPORT int pakfire_sync(struct pakfire* pakfire, int solver_flags, int flags, int* changed, pakfire_status_callback status_callback, void* status_callback_data) { return pakfire_perform_transaction_simple(pakfire, solver_flags, - pakfire_request_sync, flags, changed, status_callback, status_callback_data); + PAKFIRE_REQ_SYNC, flags, changed, status_callback, status_callback_data); } diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index 4962fdda3..0e9331f73 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -80,6 +80,14 @@ static int pakfire_request_job_flags(int flags) { if (flags & PAKFIRE_REQUEST_ESSENTIAL) solver_flags |= SOLVER_ESSENTIAL; + // Keep any dependencies + if (!(flags & PAKFIRE_REQUEST_KEEP_DEPS)) + solver_flags |= SOLVER_CLEANDEPS; + + // Drop orphans + if (!(flags & PAKFIRE_REQUEST_KEEP_ORPHANED)) + solver_flags |= SOLVER_DROP_ORPHANED; + return solver_flags; } @@ -268,22 +276,78 @@ static int pakfire_request_is_file(const char* what) { return pakfire_string_endswith(what, ".pfm"); } -static int pakfire_request_add_package(struct pakfire_request* request, int action, - struct pakfire_package* pkg, int flags) { - // Get the solvable ID - Id id = pakfire_package_id(pkg); +static int __pakfire_request_add(struct pakfire_request* request, + const enum pakfire_request_action action, const Id type, const Id id, int flags) { + Id _action = ID_NULL; + int permitted_flags = PAKFIRE_REQUEST_ESSENTIAL; + + // Check if type/ID is not set for actions that don't support it + switch (action) { + case PAKFIRE_REQ_INSTALL: + case PAKFIRE_REQ_ERASE: + case PAKFIRE_REQ_UPDATE: + case PAKFIRE_REQ_LOCK: + break; + + default: + if (type || id) { + errno = EINVAL; + return 1; + } + } + + // Select the correct action + switch (action) { + case PAKFIRE_REQ_INSTALL: + _action = SOLVER_INSTALL; + break; + + case PAKFIRE_REQ_ERASE: + _action = SOLVER_ERASE; + + permitted_flags |= PAKFIRE_REQUEST_KEEP_DEPS; + break; + + case PAKFIRE_REQ_UPDATE: + _action = SOLVER_UPDATE; + break; + + case PAKFIRE_REQ_UPDATE_ALL: + _action = SOLVER_UPDATE|SOLVER_SOLVABLE_ALL; + break; + + case PAKFIRE_REQ_SYNC: + _action = SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_ALL; + + permitted_flags |= PAKFIRE_REQUEST_KEEP_ORPHANED; + break; + + case PAKFIRE_REQ_LOCK: + _action = SOLVER_LOCK; + break; + + case PAKFIRE_REQ_VERIFY: + _action = SOLVER_VERIFY|SOLVER_SOLVABLE_ALL; + break; + } + + // Filter out any unsupported flags for the selected action + flags &= permitted_flags; // Translate flags flags = pakfire_request_job_flags(flags); + // XXX reset flags because the translation is broken + flags = 0; + // Add it to the job queue - queue_push2(&request->jobs, SOLVER_SOLVABLE|action|flags, id); + queue_push2(&request->jobs, _action|type|flags, id); return 0; } -static int pakfire_request_add_job(struct pakfire_request* request, int action, - const char* what, int extra_flags) { +static int pakfire_request_add_job(struct pakfire_request* request, + const enum pakfire_request_action action, const char* what, int extra_flags) { Pool* pool = pakfire_get_solv_pool(request->pakfire); // Make the pool ready @@ -324,201 +388,64 @@ static int pakfire_request_add_job(struct pakfire_request* request, int action, DEBUG(request->pakfire, "Found %d match(es) for '%s'\n", jobs.count / 2, what); - // Translate flags - const int job_flags = pakfire_request_job_flags(extra_flags); - // Set action and global flags for (int i = 0; i < jobs.count; i += 2) - jobs.elements[i] |= action | job_flags; + __pakfire_request_add(request, action, jobs.elements[i], jobs.elements[i+1], extra_flags); - // Merge jobs into the main job queue - queue_insertn(&request->jobs, request->jobs.count, jobs.count, jobs.elements); queue_free(&jobs); return 0; } -static int pakfire_request_add_archive(struct pakfire_request* request, int action, - struct pakfire_archive* archive, int extra_flags) { +int pakfire_request_add(struct pakfire_request* request, + const enum pakfire_request_action action, const char* what, int flags) { struct pakfire_package* package = NULL; int r; - struct pakfire_repo* repo = pakfire_get_repo(request->pakfire, PAKFIRE_REPO_COMMANDLINE); - if (!repo) - return 1; + // Remove leading whitespace + if (what) { + while (*what && isspace(*what)) + what++; + } - // Add it to the repository - r = pakfire_repo_add_archive(repo, archive, &package); - if (r) - goto ERROR; + if (!what) { + r = __pakfire_request_add(request, action, ID_NULL, ID_NULL, flags); + if (r) + goto ERROR; - r = pakfire_request_add_package(request, action, package, extra_flags); - if (r) - goto ERROR; + // Check if we got given a URL or some file + } else if (pakfire_string_is_url(what) || pakfire_request_is_file(what)) { + // Add them to the commandline repository + r = pakfire_commandline_add(request->pakfire, what, &package); + if (r) + goto ERROR; - // Success - r = 0; + // Then add the package + r = pakfire_request_add_package(request, action, package, flags); + if (r) + goto ERROR; + + // Otherwise try adding this as a job + } else { + r = pakfire_request_add_job(request, action, what, flags); + if (r) + goto ERROR; + } ERROR: if (package) pakfire_package_unref(package); - pakfire_repo_unref(repo); - - return r; -} - -static int pakfire_request_add_file(struct pakfire_request* request, int action, - const char* path, int extra_flags) { - struct pakfire_archive* archive = NULL; - - // Open the archive - int r = pakfire_archive_open(&archive, request->pakfire, path); - if (r) - goto ERROR; - - // Add it to the request - r = pakfire_request_add_archive(request, action, archive, extra_flags); - if (r) - goto ERROR; - - // Success - r = 0; - -ERROR: - if (archive) - pakfire_archive_unref(archive); - - return r; -} - -static int pakfire_request_add_url(struct pakfire_request* request, int action, - const char* url, int extra_flags) { - struct pakfire_downloader* downloader; - char path[PATH_MAX] = PAKFIRE_TMP_DIR "/pakfire-download.XXXXXX"; - - // Allocate a temporary file name - FILE* f = pakfire_mktemp(path, 0); - if (!f) - return 1; - - // Create a downloader - int r = pakfire_downloader_create(&downloader, request->pakfire); - if (r) - return r; - - // Download the file - r = pakfire_downloader_retrieve(downloader, NULL, NULL, NULL, - url, path, 0, NULL, 0, PAKFIRE_TRANSFER_NOTEMP); - if (r) - goto ERROR; - - // Try adding the archive - r = pakfire_request_add_file(request, action, path, extra_flags); - if (r) - goto ERROR; - - // Success - r = 0; - -ERROR: - if (f) - fclose(f); - pakfire_downloader_unref(downloader); return r; } -static int pakfire_request_add(struct pakfire_request* request, int action, - const char* what, int extra_flags) { - if (!what) { - errno = EINVAL; - return 1; - } - - // Remove leading whitespace - while (*what && isspace(*what)) - what++; - - // Download and add any remote files - if (pakfire_string_is_url(what)) - return pakfire_request_add_url(request, action, what, extra_flags); - - // Add any local files - if (pakfire_request_is_file(what)) - return pakfire_request_add_file(request, action, what, extra_flags); - - // Add anything else as a job - return pakfire_request_add_job(request, action, what, extra_flags); -} - -int pakfire_request_install(struct pakfire_request* request, - const char* what, int flags) { - return pakfire_request_add(request, SOLVER_INSTALL, what, flags); -} - -int pakfire_request_install_package( - struct pakfire_request* request, struct pakfire_package* package) { - return pakfire_request_add_package(request, SOLVER_INSTALL, package, 0); -} - -static int erase_flags(int flags) { - int additional = 0; - - // Keep dependencies - if (!(flags & PAKFIRE_REQUEST_KEEP_DEPS)) - additional |= SOLVER_CLEANDEPS; - - return additional; -} - -int pakfire_request_erase(struct pakfire_request* request, const char* what, int flags) { - return pakfire_request_add(request, SOLVER_ERASE, what, erase_flags(flags)); -} - -int pakfire_request_erase_package( - struct pakfire_request* request, struct pakfire_package* package, int flags) { - return pakfire_request_add_package(request, SOLVER_ERASE, package, erase_flags(flags)); -} - -int pakfire_request_update(struct pakfire_request* request, const char* what, int flags) { - return pakfire_request_add(request, SOLVER_UPDATE, what, flags); -} - -int pakfire_request_update_package( - struct pakfire_request* request, struct pakfire_package* package) { - return pakfire_request_add_package(request, SOLVER_UPDATE, package, 0); -} - -int pakfire_request_update_all(struct pakfire_request* request, int flags) { - queue_push2(&request->jobs, SOLVER_SOLVABLE_ALL|SOLVER_UPDATE|erase_flags(flags), 0); - - return 0; -} - -int pakfire_request_sync(struct pakfire_request* request, int flags) { - int solver_flags = SOLVER_SOLVABLE_ALL|SOLVER_DISTUPGRADE; - - // Drop orphans - if (!(flags & PAKFIRE_REQUEST_KEEP_ORPHANED)) - solver_flags |= SOLVER_DROP_ORPHANED; - - queue_push2(&request->jobs, solver_flags, 0); - - return 0; -} - -int pakfire_request_lock(struct pakfire_request* request, const char* what) { - return pakfire_request_add(request, SOLVER_LOCK, what, 0); -} - -int pakfire_request_lock_package(struct pakfire_request* request, struct pakfire_package* package) { - return pakfire_request_add_package(request, SOLVER_LOCK, package, 0); -} - -int pakfire_request_verify(struct pakfire_request* request, int flags) { - queue_push2(&request->jobs, SOLVER_SOLVABLE_ALL|SOLVER_VERIFY, 0); +int pakfire_request_add_package(struct pakfire_request* request, + const enum pakfire_request_action action, struct pakfire_package* package, int flags) { + // Get the solvable ID + Id id = pakfire_package_id(package); - return 0; + // Add it to the job queue + return __pakfire_request_add(request, action, SOLVER_SOLVABLE, id, flags); } int pakfire_request_next_problem( -- 2.39.5