summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2022-10-28 18:33:06 +0000
committerJulian Andres Klode <jak@debian.org>2022-10-28 18:33:06 +0000
commit331b592e70ddf352db694a987c5651703b0d2a94 (patch)
tree2cccecdcaac4a0b934db39604faae0e2044d293b /apt-pkg
parentdccfe14ffb9713fbf320691c0f6cd679f2acf4fc (diff)
parentf52c1ce9b31befb71016a20759b96b4946034fcb (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.cc23
-rw-r--r--apt-pkg/policy.cc14
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);