From: Michael Tremer Date: Wed, 10 Nov 2021 11:48:25 +0000 (+0000) Subject: transaction: Perform file conflict check X-Git-Tag: 0.9.28~876 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7c60b92f83dad31b857d6582dac179620c17d41;p=pakfire.git transaction: Perform file conflict check Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 7aac78687..aa3faa522 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -23,6 +23,8 @@ #include #include + +#include #include #include @@ -579,6 +581,53 @@ PAKFIRE_EXPORT char* pakfire_transaction_dump(struct pakfire_transaction* transa return string; } +static void* pakfire_transaction_fileconflict_callback( + Pool* pool, Id p, void* data) { + return NULL; +} + +static int pakfire_transaction_check_fileconflicts( + struct pakfire_transaction* transaction) { + Pool* pool = pakfire_get_solv_pool(transaction->pakfire); + + const int flags = + FINDFILECONFLICTS_USE_SOLVABLEFILELIST | + FINDFILECONFLICTS_CHECK_DIRALIASING | + FINDFILECONFLICTS_USE_ROOTDIR; + + Queue pkgs; + queue_init(&pkgs); + + Queue conflicts; + queue_init(&conflicts); + + // Fetch all installed packages + int newpkgs = transaction_installedresult(transaction->transaction, &pkgs); + + // Perform check + int count = pool_findfileconflicts(pool, &pkgs, newpkgs, &conflicts, flags, + pakfire_transaction_fileconflict_callback, NULL); + + DEBUG(transaction->pakfire, "Found %d file conflict(s)\n", count); + + // Free everything + queue_free(&pkgs); + queue_free(&conflicts); + + return (count > 0); +} + +static int pakfire_transaction_check(struct pakfire_transaction* transaction) { + int r; + + // Check for any file conflicts + r = pakfire_transaction_check_fileconflicts(transaction); + if (r) + return r; + + return 0; +} + static int pakfire_transaction_verify(struct pakfire_transaction* transaction, struct pakfire_package* pkg, struct pakfire_archive* archive) { int r; @@ -1148,6 +1197,11 @@ PAKFIRE_EXPORT int pakfire_transaction_run(struct pakfire_transaction* transacti // Write transaction dump to log INFO(transaction->pakfire, "%s\n", dump); + // Perform a check if this can actually be run + r = pakfire_transaction_check(transaction); + if (r) + goto ERROR; + // Download what we need r = pakfire_transaction_download(transaction); if (r)