If I do a base install to a new root:

    setup-x86_64.exe --root "$(cygpath -wa .cygtest)" --no-admin \
        --no-shortcuts --no-replaceonreboot --no-version-check \
        --prune-install --verbose

And then run the same install again, I get:

    libsolv: orphaned packages:
    libsolv:   base-0.0-0.any (erased)
    libsolv:   _windows-10.0.19045.any (kept)
    libsolv:
    libsolv: ordering transaction
    libsolv: transaction elements: 33
    libsolv: edges: 41, edge space: 70
    libsolv: edge creation took 0 ms
    libsolv: cycles broken: 0
    libsolv: cycle breaking took 0 ms
    libsolv: invedge space: 76
    libsolv: creating new transaction took 0 ms
    libsolv: transaction ordering took 0 ms
    libsolv: 33 erased packages:
    libsolv:   - base-0.0-0.any
    libsolv:   - ca-certificates-2023.2.62_v7.0.401-2.any
    libsolv:   - cygutils-1.4.17-1.any
    libsolv:   - file-5.44-1.any
    libsolv:   - gawk-5.3.0-1.any
    libsolv:   - groff-1.23.0-1.any
    libsolv:   - less-643-1.any
    libsolv:   - libfdisk1-2.39.3-2.any
    libsolv:   - libffi6-3.2.1-2.any
    libsolv:   - libgdbm6-1.18.1-1.any
    libsolv:   - liblz4_1-1.9.4-1.any
    libsolv:   - liblzma5-5.6.2-1.any
    libsolv:   - libmpfr6-4.2.1-1.any
    libsolv:   - libp11-kit0-0.23.20-1.any
    libsolv:   - libpcre1-8.45-1.any
    libsolv:   - libpipeline1-1.5.6-1.any
    libsolv:   - libpopt-common-1.19-1.any
    libsolv:   - libpopt0-1.19-1.any
    libsolv:   - libsmartcols1-2.39.3-2.any
    libsolv:   - libssl1.1-1.1.1w-1.any
    libsolv:   - libssl3-3.0.14-1.any
    libsolv:   - libstdc++6-11.4.0-1.any
    libsolv:   - libtasn1_6-4.14-1.any
    libsolv:   - libuchardet0-0.0.8-1.any
    libsolv:   - libuuid1-2.39.3-2.any
    libsolv:   - man-db-2.12.1-1.any
    libsolv:   - openssl-3.0.14-1.any
    libsolv:   - p11-kit-0.23.20-1.any
    libsolv:   - p11-kit-trust-0.23.20-1.any
    libsolv:   - tar-1.35-2.any
    libsolv:   - util-linux-2.39.3-2.any
    libsolv:   - xz-5.6.2-1.any
    libsolv:   - zstd-1.5.6-1.any
    libsolv:
    Can't happen.  No packagemeta for base

The "Can't happen" error results in all following transactions being skipped:

        // Can't happen - throw an exception?
        {
          Log (LOG_PLAIN) << "Can't happen.  No packagemeta for "
                          << pv.Name() << endLog;
          return;
        }

This results in setup always showing no pending changes, even if you
have installed additional packages that should be pruned by
--prune-install, or if setup.ini has different contents.

The problem seems to be that we use SOLVER_ERASE jobs to remove all
non-base installed packages, and they take precedence over keeping the
pseudo-package 'base' installed.

Making the erase jobs weak seems to solve the problem:

diff --git a/libsolv.cc b/libsolv.cc
index 3f083a4..95f21a2 100644
--- a/libsolv.cc
+++ b/libsolv.cc
@@ -850,7 +850,7 @@ SolverSolution::tasksToJobs(SolverTasks &tasks, updateMode 
update, Queue &job)
           queue_push2(&job, SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES, 
sv.name_id());
           break;
         case SolverTasks::taskUninstall:
-          queue_push2(&job, SOLVER_ERASE | SOLVER_SOLVABLE, sv.id);
+          queue_push2(&job, SOLVER_ERASE | SOLVER_WEAK | SOLVER_SOLVABLE, 
sv.id);
           break;
         case SolverTasks::taskReinstall:
           // we don't know how to ask solver for this, so we just add the erase

However, I'm not sure if this is a good idea. Perhaps it should only be
done for pruned packages, and not explicitly uninstalled ones. I did try
various things to strengthen the requirement on 'base', but had no luck.

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to