]> git.saurik.com Git - apt.git/commitdiff
don't hardcode /var/lib/dpkg/status as dir::state::status
authorDavid Kalnischkies <david@kalnischkies.de>
Tue, 19 Jul 2016 16:20:38 +0000 (18:20 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Tue, 19 Jul 2016 16:20:38 +0000 (18:20 +0200)
Theoretically it should be enough to change the Dir setting and have apt
pick the dpkg/status file from that. Also, it should be consistently
effected by RootDir. Both wasn't really the case through, so a user had
to explicitly set it too (or ignore it and have or not have expected
sideeffects caused by it).

This commit tries to guess better the location of the dpkg/status file
by setting dir::state::status to a naive "../dpkg/status", just that
this setting would be interpreted as relative to the CWD and not
relative to the dir::state directory. Also, the status file isn't really
relative to the state files apt has in /var/lib/apt/ as evident if we
consider that apt/ could be a symlink to someplace else and "../dpkg"
not effected by it, so what we do here is an explicit replace on apt/
– similar to how we create directories if it ends in apt/ – with dpkg/.

As this is a change it has the potential to cause regressions in so far
as the dpkg/status file of the "host" system is no longer used if you
set a "chroot" system via the Dir setting – but that tends to be
intended and causes people to painfully figure out that they had to set
this explicitly before, so that it now works more in terms of how the
other Dir settings work (aka "as expected"). If using the host status
file is really intended it is in fact easier to set this explicitely
compared to setting the new "magic" location explicitely.

apt-pkg/deb/debsystem.cc
test/integration/framework

index e2b1df950e3c16ce6bd86c8b8711804e0534d2fa..fd702b3c6b340b05f1feed02abe2c3742474ae1d 100644 (file)
@@ -86,7 +86,7 @@ bool debSystem::Lock()
    }
 
    // Create the lockfile
    }
 
    // 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)
    {
    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)
 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;
    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.. */
 // 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");
 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) {
    Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg");
 
    if (d->StatusFile) {
index 27239cce4c888b6b62cf7d3ed111498ce8f3e77c..54adcf92d0f24c7ebce25becffadf2d51aa54279 100644 (file)
@@ -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
        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
        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