]> git.ipfire.org Git - pakfire.git/commitdiff
sync: Allow keeping orphans
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 22 Jun 2021 14:27:21 +0000 (14:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 22 Jun 2021 14:27:21 +0000 (14:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/pakfire.c
src/libpakfire/build.c
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/include/pakfire/request.h
src/libpakfire/pakfire.c
src/libpakfire/request.c
src/pakfire/cli.py

index 9df2ec0082426f40e6022ddd55514f5647aecf3c..bcc4dab514ebcc016e98c1e0daacc4f07da55668 100644 (file)
@@ -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,
        },
        {
index 1ddff8a215ba24d93697ec5dbd257053bff92d1f..285ec9161423cbce6af8e6e768976e32567e3b77 100644 (file)
@@ -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;
index f241b6d7798848b292218d26f848011e6422bd94..48bbd1d9d1592d6409d1f3950eace1f89e09a9c6 100644 (file)
@@ -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
 
index d3968100e58a71ec2da0a413e15ac579e99f58b6..6f01a2768eae07fc4a3915639754313cc6d8eea5 100644 (file)
@@ -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
 
index 791905cd2e412a7ccb4cd697c03bf68d734f1ecf..635254dfcc7a4b845d3a54c7332c7f888bec8d90 100644 (file)
@@ -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);
 }
index 2a70f5d403ab8c879ad2dcc01b1a5d4338313cf2..30455c44ee03025fa71c40c1c622222127c76ef4 100644 (file)
@@ -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;
index c8370eec0d9d83cbe64e4d2e4d459a386b15e237..d3fac488c72c2d961e6e7ebdbc26f7de408f2135 100644 (file)
@@ -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)