summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/deb/debsystem.cc28
-rw-r--r--test/integration/framework1
2 files changed, 25 insertions, 4 deletions
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc
index e2b1df950..fd702b3c6 100644
--- a/apt-pkg/deb/debsystem.cc
+++ b/apt-pkg/deb/debsystem.cc
@@ -86,7 +86,7 @@ bool debSystem::Lock()
}
// Create the lockfile
- string AdminDir = flNotFile(_config->Find("Dir::State::status"));
+ string AdminDir = flNotFile(_config->FindFile("Dir::State::status"));
d->LockFD = GetLock(AdminDir + "lock");
if (d->LockFD == -1)
{
@@ -145,7 +145,7 @@ bool debSystem::UnLock(bool NoErrors)
bool debSystem::CheckUpdates()
{
// Check for updates.. (dirty)
- string File = flNotFile(_config->Find("Dir::State::status")) + "updates/";
+ string File = flNotFile(_config->FindFile("Dir::State::status")) + "updates/";
DIR *DirP = opendir(File.c_str());
if (DirP == 0)
return false;
@@ -184,13 +184,35 @@ pkgPackageManager *debSystem::CreatePM(pkgDepCache *Cache) const
// System::Initialize - Setup the configuration space.. /*{{{*/
// ---------------------------------------------------------------------
/* These are the Debian specific configuration variables.. */
+static std::string getDpkgStatusLocation(Configuration &Cnf) {
+ auto const cnfstatedir = Cnf.Find("Dir::State", "var/lib/apt/");
+ std::string statedir;
+ if (APT::String::Endswith(cnfstatedir, "/apt/"))
+ statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 5);
+ else if (APT::String::Endswith(cnfstatedir, "/apt"))
+ statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 4);
+ if (statedir.empty())
+ Cnf.Set("Dir::State", "var/lib/dpkg");
+ else
+ Cnf.Set("Dir::State", flCombine(statedir, "dpkg"));
+ auto const cnfrootdir = Cnf.Find("RootDir");
+ if (Cnf.Exists("RootDir") == true)
+ Cnf.Set("RootDir", "");
+ Cnf.Set("Dir::State::status", "status");
+ auto const statusfile = Cnf.FindFile("Dir::State::status");
+ if (cnfrootdir.empty() == false)
+ Cnf.Set("RootDir", cnfrootdir);
+ Cnf.Set("Dir::State", cnfstatedir);
+ return statusfile;
+}
bool debSystem::Initialize(Configuration &Cnf)
{
/* These really should be jammed into a generic 'Local Database' engine
which is yet to be determined. The functions in pkgcachegen should
be the only users of these */
Cnf.CndSet("Dir::State::extended_states", "extended_states");
- Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status");
+ if (Cnf.Exists("Dir::State::status") == false)
+ Cnf.Set("Dir::State::status", getDpkgStatusLocation(Cnf));
Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg");
if (d->StatusFile) {
diff --git a/test/integration/framework b/test/integration/framework
index 27239cce4..54adcf92d 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -331,7 +331,6 @@ setupenvironment() {
ln -s "${TMPWORKINGDIRECTORY}/keys/joesixpack.pub" rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf
- echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf
echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf
echo "Dir::Bin::Methods \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/methods\";" >> aptconfig.conf
# either store apt-key were we can access it, even if we run it as a different user