diff options
author | Julian Andres Klode <jak@debian.org> | 2022-10-28 18:33:06 +0000 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2022-10-28 18:33:06 +0000 |
commit | 331b592e70ddf352db694a987c5651703b0d2a94 (patch) | |
tree | 2cccecdcaac4a0b934db39604faae0e2044d293b /apt-pkg | |
parent | dccfe14ffb9713fbf320691c0f6cd679f2acf4fc (diff) | |
parent | f52c1ce9b31befb71016a20759b96b4946034fcb (diff) |
Merge branch 'feature/optional-dpkg-status' into 'main'
Allow apt to run if no dpkg/status file exists
See merge request apt-team/apt!257
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/deb/debsystem.cc | 23 | ||||
-rw-r--r-- | apt-pkg/policy.cc | 14 |
2 files changed, 29 insertions, 8 deletions
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index c9c6a7e85..9c55e0a6e 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -335,8 +335,27 @@ signed debSystem::Score(Configuration const &Cnf) /* */ bool debSystem::AddStatusFiles(std::vector<pkgIndexFile *> &List) { - if (d->StatusFile == 0) - d->StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status")); + if (d->StatusFile == nullptr) + { + auto dpkgstatus = _config->FindFile("Dir::State::status"); + if (dpkgstatus.empty()) + return true; + // we ignore only if the file doesn't exist, not if it is inaccessible + // e.g. due to permissions on parent directories as FileExists would do + errno = 0; + if (access(dpkgstatus.c_str(), R_OK) != 0 && errno == ENOENT) + return true; + _error->PushToStack(); + d->StatusFile = new debStatusIndex(std::move(dpkgstatus)); + bool const errored = _error->PendingError(); + _error->MergeWithStack(); + if (errored) + { + delete d->StatusFile; + d->StatusFile = nullptr; + return false; + } + } List.push_back(d->StatusFile); return true; } 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); |