From: Michael Tremer Date: Tue, 22 Jun 2021 14:27:21 +0000 (+0000) Subject: sync: Allow keeping orphans X-Git-Tag: 0.9.28~1196 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=550c7c1f7ac557e71e069af4e99d3f3305a0ad64;p=pakfire.git sync: Allow keeping orphans Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/pakfire.c b/src/_pakfire/pakfire.c index 9df2ec008..bcc4dab51 100644 --- a/src/_pakfire/pakfire.c +++ b/src/_pakfire/pakfire.c @@ -875,8 +875,18 @@ static PyObject* Pakfire_check(PakfireObject* self) { Py_RETURN_NONE; } -static PyObject* Pakfire_sync(PakfireObject* self) { - int r = pakfire_sync(self->pakfire, NULL); +static PyObject* Pakfire_sync(PakfireObject* self, PyObject* args, PyObject* kwargs) { + char* kwlist[] = {"keep_orphaned", NULL}; + int keep_orphaned = 0; + int flags = 0; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|$p", kwlist, &keep_orphaned)) + return NULL; + + if (keep_orphaned) + flags |= PAKFIRE_REQUEST_KEEP_ORPHANED; + + int r = pakfire_sync(self->pakfire, flags, NULL); if (r) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -991,7 +1001,7 @@ static struct PyMethodDef Pakfire_methods[] = { { "sync", (PyCFunction)Pakfire_sync, - METH_NOARGS, + METH_VARARGS|METH_KEYWORDS, NULL, }, { diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index 1ddff8a21..285ec9161 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -90,7 +90,7 @@ static int pakfire_build_install_packages(Pakfire pakfire, int* snapshot_needs_u *snapshot_needs_update = 1; // Update everything - r = pakfire_sync(pakfire, &changed); + r = pakfire_sync(pakfire, 0, &changed); if (r) { ERROR(pakfire, "Could not update packages: %m\n"); goto ERROR; diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index f241b6d77..48bbd1d9d 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -87,7 +87,7 @@ int pakfire_check(Pakfire pakfire); // Sync -int pakfire_sync(Pakfire pakfire, int* changed); +int pakfire_sync(Pakfire pakfire, int flags, int* changed); #ifdef PAKFIRE_PRIVATE diff --git a/src/libpakfire/include/pakfire/request.h b/src/libpakfire/include/pakfire/request.h index d3968100e..6f01a2768 100644 --- a/src/libpakfire/include/pakfire/request.h +++ b/src/libpakfire/include/pakfire/request.h @@ -28,6 +28,7 @@ struct pakfire_request; enum _pakfire_request_op_flags { PAKFIRE_CHECK_INSTALLED = 1 << 0, PAKFIRE_CLEAN_DEPS = 1 << 1, + PAKFIRE_REQUEST_KEEP_ORPHANED = 1 << 2, }; enum _pakfire_solver_flags { @@ -58,12 +59,12 @@ int pakfire_request_upgrade(struct pakfire_request* request, const char* what, i int pakfire_request_upgrade_package(struct pakfire_request* request, PakfirePackage package); int pakfire_request_upgrade_all(struct pakfire_request* request); -int pakfire_request_sync(struct pakfire_request* request); +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, PakfirePackage package); -int pakfire_request_verify(struct pakfire_request* request); +int pakfire_request_verify(struct pakfire_request* request, int flags); #ifdef PAKFIRE_PRIVATE diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 791905cd2..635254dfc 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1677,7 +1677,8 @@ PAKFIRE_EXPORT int pakfire_update(Pakfire pakfire, const char** packages, } static int pakfire_perform_transaction_simple(Pakfire pakfire, - int (*action)(struct pakfire_request* request), int* changed) { + int (*action)(struct pakfire_request* request, int flags), + int flags, int* changed) { struct pakfire_request* request = NULL; struct pakfire_transaction* transaction = NULL; int r = 1; @@ -1693,7 +1694,7 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire, goto ERROR; // Perform action - r = action(request); + r = action(request, flags); if (r) goto ERROR; @@ -1729,7 +1730,7 @@ ERROR: } static int pakfire_verify(Pakfire pakfire, int *changed) { - return pakfire_perform_transaction_simple(pakfire, pakfire_request_verify, changed); + return pakfire_perform_transaction_simple(pakfire, pakfire_request_verify, 0, changed); } PAKFIRE_EXPORT int pakfire_check(Pakfire pakfire) { @@ -1758,6 +1759,6 @@ ERROR: return r; } -PAKFIRE_EXPORT int pakfire_sync(Pakfire pakfire, int* changed) { - return pakfire_perform_transaction_simple(pakfire, pakfire_request_sync, changed); +PAKFIRE_EXPORT int pakfire_sync(Pakfire pakfire, int flags, int* changed) { + return pakfire_perform_transaction_simple(pakfire, pakfire_request_sync, flags, changed); } diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index 2a70f5d40..30455c44e 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -477,8 +477,14 @@ PAKFIRE_EXPORT int pakfire_request_upgrade_all(struct pakfire_request* request) return 0; } -PAKFIRE_EXPORT int pakfire_request_sync(struct pakfire_request* request) { - queue_push2(&request->jobs, SOLVER_SOLVABLE_ALL|SOLVER_DISTUPGRADE|SOLVER_DROP_ORPHANED, 0); +PAKFIRE_EXPORT 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; } @@ -491,7 +497,7 @@ PAKFIRE_EXPORT int pakfire_request_lock_package(struct pakfire_request* request, return pakfire_request_add_package(request, SOLVER_LOCK, package, 0); } -PAKFIRE_EXPORT int pakfire_request_verify(struct pakfire_request* request) { +PAKFIRE_EXPORT int pakfire_request_verify(struct pakfire_request* request, int flags) { queue_push2(&request->jobs, SOLVER_SOLVABLE_ALL|SOLVER_VERIFY, 0); return 0; diff --git a/src/pakfire/cli.py b/src/pakfire/cli.py index c8370eec0..d3fac488c 100644 --- a/src/pakfire/cli.py +++ b/src/pakfire/cli.py @@ -120,6 +120,8 @@ class Cli(object): # sync sync = subparsers.add_parser("sync", help=_("Sync all installed with the latest one in the distribution")) + sync.add_argument("--keep-orphaned", action="store_true", + help=_("Keep orphaned packages")) sync.set_defaults(func=self.handle_sync) # update @@ -257,7 +259,7 @@ class Cli(object): ) def handle_sync(self, ns): - self.pakfire(ns).sync() + self.pakfire(ns).sync(keep_orphaned=ns.keep_orphaned) def handle_install(self, ns): p = self.pakfire(ns)