diff options
| author | David Kalnischkies <david@kalnischkies.de> | 2022-09-01 15:14:52 +0200 |
|---|---|---|
| committer | David Kalnischkies <david@kalnischkies.de> | 2022-09-02 16:55:45 +0200 |
| commit | f52c1ce9b31befb71016a20759b96b4946034fcb (patch) | |
| tree | 62d556e84db4489a4276ee7c6b41a8aa26f1c048 /apt-pkg/policy.cc | |
| parent | 3498fbedafbf30e5c91deeaefa6a60d1e387593a (diff) | |
Allow apt to run if no dpkg/status file exists
Not having a dpkg/status file used to be a hard error which from a
boostrap perspective is suspect as in the beginning, there is no
status so you would need to touch it into existence.
We make a difference between factual non-existence and inaccessibility
to catch mistakes in which the file is not readable for some reason,
the testcase test-bug-254770-segfault-if-cache-not-buildable is an
example of this.
Note that apt has already figured out at this point that this is a
Debian-like system which should have a dpkg/status file. This change
does not effect the auto-detection and is not supposed to.
Diffstat (limited to 'apt-pkg/policy.cc')
| -rw-r--r-- | apt-pkg/policy.cc | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 5fcc11b66..68b3f5e5f 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -70,17 +70,19 @@ pkgPolicy::pkgPolicy(pkgCache *Owner) : VerPins(nullptr), if (DefRel.empty() == false) { bool found = false; - // FIXME: make ExpressionMatches static to use it here easily - pkgVersionMatch vm("", pkgVersionMatch::None); for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F != Cache->FileEnd(); ++F) { - if (vm.ExpressionMatches(DefRel, F.Archive()) || - vm.ExpressionMatches(DefRel, F.Codename()) || - vm.ExpressionMatches(DefRel, F.Version()) || + if (pkgVersionMatch::ExpressionMatches(DefRel, F.Archive()) || + pkgVersionMatch::ExpressionMatches(DefRel, F.Codename()) || + pkgVersionMatch::ExpressionMatches(DefRel, F.Version()) || (DefRel.length() > 2 && DefRel[1] == '=')) found = true; } - if (found == false) + // "now" is our internal archive name for the status file, + // which we should accept even if we have no status file at the moment + if (not found && pkgVersionMatch::ExpressionMatches(DefRel, "now")) + found = true; + if (not found) _error->Error(_("The value '%s' is invalid for APT::Default-Release as such a release is not available in the sources"), DefRel.c_str()); else CreatePin(pkgVersionMatch::Release,"",DefRel,990); |
