setup: problems with local install
Ken Brown
kbrown@cornell.edu
Mon Mar 12 13:22:00 GMT 2018
On 3/8/2018 4:59 PM, Ken Brown wrote:
> On 3/8/2018 10:59 AM, Ken Brown wrote:
>> On 3/7/2018 4:52 PM, Ken Brown wrote:
>>> On 3/6/2018 1:47 PM, Jon Turney wrote:
>>>> On 06/03/2018 15:18, Jon Turney wrote:
>>>>> So yeah, I guess putting some complexity back in accessible() would
>>>>> work, or perhaps the attached? (This doesn't do the right thing
>>>>> for a few packages, for reasons I'm still looking into...)
>>>>
>>>> To be specific it was doing the wrong thing for those few packages
>>>> with no source
>>>>
>>>>> Â /* scan for local copies of package */
>>>>> -void
>>>>> +bool
>>>>> Â packagemeta::scan (const packageversion &pkg, bool mirror_mode)
>>>>> Â {
>>>>> -Â /* Already have something */
>>>>> +Â /* empty version */
>>>>> Â Â Â if (!pkg)
>>>>> -Â Â Â return;
>>>>> +Â Â Â return true;
>>>>
>>>> So, this needs to be 'return false', as the empty version is always
>>>> inaccessible, to get the same behaviour as before.
>>>
>>> I've found another problem with local installs: If a package needs
>>> upgrading, then the chooser will offer the upgraded version for
>>> install, even if there's no archive available. As a result, the
>>> current version will get uninstalled, and then setup will discover
>>> that it doesn't have the archive to install the new version.
>>>
>>> The problem occurs because packagedb::defaultTrust() is called after
>>> ScanDownloadedFiles() has already done its work. solution.update()
>>> and solution.trans2db() are called, and pkg->desired is set equal to
>>> an inaccessible version pv (which has been previously removed from
>>> pkg->versions).
>>>
>>> I guess trans2db() should check that pv is in pkg->versions before
>>> acting on an install transaction for pv. And then we also have to
>>> make sure to ignore the erase transaction for the current version of
>>> pkg.
>>>
>>> Alternatively, can we just remove an inaccessible packageversion from
>>> the libsolv pool, or at at least just tell libsolv that we don't want
>>> to install it?
>>
>> Still another alternative, and maybe the simplest, is to make sure
>> that the chooser never shows a version that is not in pkg->versions.
>> packagemeta::set_action (trusts const trust) almost does this, except
>> for one useless desired.accessible() call. So that should be fixed,
>> as well as the setting of the initial action.
>
> Sorry for this stream of consciousness series of posts, but I'll stop
> after this one. I think it's possible that restoring the previous
> meaning of 'accessible()', at least for local installs, might solve this
> problem.
Patches attached (for the topic/fix-local-install branch).
-------------- next part --------------
From 1645f2b13616ec71054a5ad35bce864f1f3e0dca Mon Sep 17 00:00:00 2001
From: Ken Brown <kbrown@cornell.edu>
Date: Sun, 11 Mar 2018 10:43:06 -0400
Subject: [PATCH 1/2] Make SolvableVersion::accessible() useful for local
installs
For a local install, make SolvableVersion::accessible() indicate
whether or not there is an archive available in the local cache. This
is used in packagemeta::set_action() to prevent the chooser from
offering unavailable versions.
---
libsolv.cc | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/libsolv.cc b/libsolv.cc
index 0dc7557..604ff7e 100644
--- a/libsolv.cc
+++ b/libsolv.cc
@@ -14,6 +14,7 @@
#include "libsolv.h"
#include "package_db.h"
#include "package_meta.h"
+#include "resource.h"
#include "solv/solver.h"
#include "solv/solverdebug.h"
@@ -239,21 +240,16 @@ SolvableVersion::source() const
return (packagesource *)repo_lookup_num(solvable->repo, id, psrc_attr, (unsigned long long)&empty_source);
}
+// If we're doing a locall install, is there an archive available?
+// This assumes that ScanDownloadedFiles() has already been called.
bool
SolvableVersion::accessible () const
{
- // The 'accessible' check used to test if an archive was available locally or
- // from a mirror.
- //
- // This seems utterly pointless. as binary packages which aren't 'accessible'
- // never get to appear in the package list.
- //
- // For source packages, it's equivalent to the bool conversion operator.)
- //
- if (id != 0)
- return TRUE;
- else
- return FALSE;
+ if (id == 0)
+ return false;
+ if (::source == IDC_SOURCE_LOCALDIR)
+ return source ()->Cached ();
+ return true;
}
package_stability_t
--
2.16.2
-------------- next part --------------
From 365fa9afb8a49c2360bf7cfd2a2c2557522f85e5 Mon Sep 17 00:00:00 2001
From: Ken Brown <kbrown@cornell.edu>
Date: Mon, 12 Mar 2018 09:13:41 -0400
Subject: [PATCH 2/2] Don't put inaccessible packageversions in the package
database
In a local install, libsolv might choose an inaccessible version for
install. Change SolverSolution::trans2db() so that such a version is
never used.
---
libsolv.cc | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/libsolv.cc b/libsolv.cc
index 604ff7e..1342f3b 100644
--- a/libsolv.cc
+++ b/libsolv.cc
@@ -637,6 +637,8 @@ void
SolverSolution::trans2db() const
{
packagedb db;
+ std::vector<packagemeta *> inaccessible;
+
// First reset all packages to the "no change" state
for (packagedb::packagecollection::iterator i = db.packages.begin();
i != db.packages.end(); i++)
@@ -667,6 +669,8 @@ SolverSolution::trans2db() const
{
pkg->desired = pkg->default_version = pv;
pkg->pick(true);
+ if (!pv.accessible())
+ inaccessible.push_back (pkg);
}
else // source package
pkg->srcpick(true);
@@ -680,6 +684,14 @@ SolverSolution::trans2db() const
break;
}
}
+ for (std::vector<packagemeta *>::iterator i = inaccessible.begin();
+ i != inaccessible.end(); i++)
+ {
+ packagemeta *pkg = *i;
+ // Reset pkg to its "no change" state.
+ pkg->desired = pkg->default_version = pkg->installed;
+ pkg->pick(false);
+ }
}
void
--
2.16.2
More information about the Cygwin-apps
mailing list