public inbox for cygwin-apps@cygwin.com
 help / color / mirror / Atom feed
From: Ken Brown <kbrown@cornell.edu>
To: cygwin-apps@cygwin.com
Subject: Re: [PATCH setup 00/14] Use libsolv, solve all our problems... (WIP)
Date: Sun, 24 Dec 2017 15:00:00 -0000	[thread overview]
Message-ID: <d206a798-722c-6093-43a3-4d1c798b0f5d@cornell.edu> (raw)
In-Reply-To: <31df6cf0-1abd-9cb0-a5c3-3c2b0a7d069c@cornell.edu>

[-- Attachment #1: Type: text/plain, Size: 1857 bytes --]

On 12/13/2017 5:31 PM, Ken Brown wrote:
> On 12/13/2017 1:05 PM, Achim Gratz wrote:
>> Ken Brown writes:
>>> 1. Uninstall A.
>>> 2. Don't uninstall B.
>>>
>>> On the surface, it would seem that libsolv chose 2 by default, because
>>> it returned an empty transaction list.  This was reflected in the log
>>> and was also clear when I selected 'Back'.
>>
>> I don't think there is a default in this case.  I also see in zypper
>> that the order of the proposed solutions (there can be way more than two
>> if the dependencies are more complicated) is not always the same, so
>> there is no preference implied by the order as well.
>>
>>> Maybe we have to deal with this situation ourselves.  Whenever a
>>> problem involves a missing dependency, we could choose as default
>>> solution the one that installs/keeps the dependent package, as is
>>> currently done.
>>
>> That solution unfortunately isn't always the one that causes the least
>> amount of transactions or even the least amount of breakage.
> 
> That may be true, but I still think it's a reasonable default.  The user 
> doesn't have to accept it.  Also, it's consistent with what setup 
> currently does, so it won't surprise anyone.
> 
> The attached patch attempts to implement my suggestion.
> 
> Ken
> 
> 
> 0001-Implement-a-default-solution-for-SOLVER_RULE_PKG_REQ.patch
> 
> +      if (type == SOLVER_RULE_PKG_REQUIRES)
> +	{
> +	  packagemeta *pkg = db.findBinary(PackageSpecification(pool_dep2str(pool.pool, dep)));
> +	  if (!pkg->desired && pkg->installed < pkg->default_version)
> +	    // User chose to uninstall or skip a required package.
> +	    trans.push_back(SolverTransaction(pkg->default_version,
> +					      SolverTransaction::transInstall));

This isn't quite right.  We also need a transErase if the package is 
installed.  Revised patch attached.

Ken

[-- Attachment #2: 0001-Implement-a-default-solution-for-SOLVER_RULE_PKG_REQ.patch --]
[-- Type: text/plain, Size: 2908 bytes --]

From 1930460c9f5c8a4c1aea0837778d76d8322642fa Mon Sep 17 00:00:00 2001
From: Ken Brown <kbrown@cornell.edu>
Date: Wed, 13 Dec 2017 17:20:26 -0500
Subject: [PATCH setup libsolv v2] Implement a default solution for
 SOLVER_RULE_PKG_REQUIRES

If libsolv reports a SOLVER_RULE_PKG_REQUIRES problem, it means that
the user chose to uninstall or skip a required package.  Add
appropriate transactions, if necessary, to override this choice.  The
user will have to uncheck the "Accept default problem solutions" box
to insist on the original choice.
---
 libsolv.cc | 26 +++++++++++++++++++++++---
 libsolv.h  |  2 +-
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/libsolv.cc b/libsolv.cc
index 0fb39c7..48c24c4 100644
--- a/libsolv.cc
+++ b/libsolv.cc
@@ -868,7 +868,7 @@ SolverSolution::transactions() const
 
 // Construct a string reporting the problems and solutions
 std::string
-SolverSolution::report() const
+SolverSolution::report()
 {
   packagedb db;
   std::string r = "";
@@ -881,8 +881,28 @@ SolverSolution::report() const
       Id probr = solver_findproblemrule(solv, problem);
       Id dep, source, target;
       SolverRuleinfo type = solver_ruleinfo(solv, probr, &source, &target, &dep);
-      if (source == db.basepkg.id)
-	r += "package " + std::string(pool_dep2str(pool.pool, dep)) + " is a Base package and is therefore required";
+      if (type == SOLVER_RULE_PKG_REQUIRES)
+	{
+	  // The user chose to uninstall or skip a required package.
+	  // libsolv will not create an erase transaction, but we
+	  // might need to create our own transactions to implement a
+	  // default solution to the problem.
+	  packagemeta *pkg = db.findBinary(PackageSpecification(pool_dep2str(pool.pool, dep)));
+	  if (!pkg->desired && pkg->installed < pkg->default_version)
+	    {
+	      trans.push_back(SolverTransaction(pkg->default_version,
+						SolverTransaction::transInstall));
+	      if (pkg->installed)
+		trans.push_back(SolverTransaction(pkg->installed,
+						  SolverTransaction::transErase));
+	    }
+	  if (source == db.basepkg.id)
+	    r += "package " + std::string(pool_dep2str(pool.pool, dep))
+	      + " is a Base package and is therefore required";
+	  else
+	    r += "package " + std::string(pool_dep2str(pool.pool, dep)) +
+	      " is  required by " + std::string(pool_solvid2str(pool.pool, source));
+	}
       else
 	r += solver_problemruleinfo2str(solv, type, source, target, dep);
       r += "\n";
diff --git a/libsolv.h b/libsolv.h
index cddf76f..391a96d 100644
--- a/libsolv.h
+++ b/libsolv.h
@@ -253,7 +253,7 @@ class SolverSolution
     updateForce, // distupdate: downgrade if necessary to best version in repo
   };
   bool update(SolverTasks &tasks, updateMode update, bool use_test_packages, bool include_source);
-  std::string report() const;
+  std::string report();
 
   const SolverTransactionList &transactions() const;
 
-- 
2.15.1


  parent reply	other threads:[~2017-12-24 15:00 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-31 10:53 Jon Turney
2017-05-31 10:53 ` [PATCH setup 03/14] Hoist addScript() etc. up from packageversion to packagemeta Jon Turney
2017-05-31 10:53 ` [PATCH setup 01/14] Opaque how PackageDepends is stored Jon Turney
2017-05-31 10:53 ` [PATCH setup 02/14] Factor out reading installed.db Jon Turney
2017-05-31 10:53 ` [PATCH setup 04/14] Hoist pick() up to packagemeta Jon Turney
2017-05-31 10:53 ` [PATCH setup 05/14] Hoist uninstall up to Installer::uninstallOne() Jon Turney
2017-05-31 10:57 ` [PATCH setup 07/14] Store package stability in class packageversion Jon Turney
2017-05-31 10:57 ` [PATCH setup 08/14] Change to using a libsolv pool for storing package information Jon Turney
2017-05-31 10:57 ` [PATCH setup 10/14] Remove packageversion class Jon Turney
2017-05-31 10:57 ` [PATCH setup 09/14] Remove cygpackage class Jon Turney
2017-05-31 10:57 ` [PATCH setup 06/14] Hoist scan() up from packageversion to packagemeta Jon Turney
2017-05-31 11:05 ` [PATCH setup 11/14] Drop in SolvableVersion as a replacement for packageversion Jon Turney
2017-05-31 11:05   ` [PATCH setup 12/14] Use solver to check for problems and produce a list of package transactions Jon Turney
2017-05-31 11:05   ` [PATCH setup 13/14] Download/checksum/install/uninstall what transaction wants Jon Turney
2017-05-31 11:05   ` [PATCH setup 14/14] Add obsoletes: support Jon Turney
2017-08-29 13:37 ` [PATCH setup 00/14] Use libsolv, solve all our problems... (WIP) Ken Brown
2017-08-30 21:47   ` Ken Brown
2017-09-01 15:01 ` Ken Brown
2017-09-02 16:57   ` Ken Brown
2017-09-05 13:34     ` Jon Turney
2017-09-05 18:40       ` Achim Gratz
2017-09-06  2:52         ` Ken Brown
2017-11-23 18:10           ` Jon Turney
2017-11-23 20:32             ` Ken Brown
2017-11-23 20:54             ` Achim Gratz
2017-09-08 18:54 ` Ken Brown
2017-09-11 20:40   ` Ken Brown
2017-09-13 19:17     ` Achim Gratz
2017-09-13 21:16       ` Ken Brown
2017-09-14 17:26         ` Achim Gratz
2017-09-14 20:46           ` Ken Brown
2017-09-15 19:24             ` Jon Turney
2017-09-16 16:21               ` Ken Brown
2017-09-19 12:24                 ` Ken Brown
2017-09-19 16:46                   ` Jon Turney
2017-09-19 16:58                     ` Ken Brown
2017-12-05 14:32             ` Jon Turney
2017-12-05 17:36               ` Ken Brown
2017-12-13 17:31               ` Ken Brown
2017-12-13 18:06                 ` Achim Gratz
2017-12-13 22:31                   ` Ken Brown
2017-12-14 14:12                     ` Ken Brown
2017-12-24 15:00                     ` Ken Brown [this message]
2018-01-09 13:25                       ` Jon Turney
2018-01-09 15:37                         ` Ken Brown
2018-01-09 15:49                           ` Ken Brown
2018-01-13 14:14                             ` Jon Turney
2018-01-13 19:56                               ` Ken Brown
2018-01-13 21:29                                 ` Brian Inglis
2018-01-13 22:55                                   ` Ken Brown
2018-01-14  0:00                                     ` Ken Brown
2018-01-14  1:52                                       ` Brian Inglis
2018-01-14  2:37                                         ` Ken Brown
2018-01-15 19:02                                 ` Jon Turney
2018-01-15 21:50                                   ` Ken Brown
2018-01-18 19:14                                     ` Jon Turney
2017-09-15 15:15   ` Jon Turney
2017-09-15 16:53     ` Ken Brown
2017-09-15 20:56       ` cyg Simple
2017-09-17 16:02         ` Ken Brown
2017-09-26 14:50       ` Jon Turney
2017-09-26 16:07         ` Ken Brown
2017-09-27 19:14           ` Jon Turney
2017-09-27 20:33             ` Ken Brown
2017-09-29 17:38               ` Jon Turney
2017-09-29 20:34                 ` Ken Brown
2017-10-02 14:07                   ` Jon Turney
2017-10-02 15:17                     ` Marco Atzeri
2017-10-04 14:43                       ` Jon Turney
2017-10-10 11:18                   ` Ken Brown
2017-10-10 15:49                     ` Jon Turney
2017-10-17 12:45                     ` Ken Brown
2017-10-17 18:47                       ` Jon Turney
2017-10-18 15:28                         ` Ken Brown
2017-10-18 15:57                           ` Ken Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d206a798-722c-6093-43a3-4d1c798b0f5d@cornell.edu \
    --to=kbrown@cornell.edu \
    --cc=cygwin-apps@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).