]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/dpkgpm.cc
write auto-bits before calling dpkg & again after if needed
[apt.git] / apt-pkg / deb / dpkgpm.cc
index b0237aa9adad648c96cfca875491c050ea51534b..9854fced89c3b0fca78317df5688f4cfe383d1fd 100644 (file)
@@ -1216,6 +1216,11 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
    if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false)
       return false;
 
+   auto const noopDPkgInvocation = _config->FindB("Debug::pkgDPkgPM",false);
+   // store auto-bits as they are supposed to be after dpkg is run
+   if (noopDPkgInvocation == false)
+      Cache.writeStateFile(NULL);
+
    decltype(List)::const_iterator::difference_type const notconfidx =
       _config->FindB("Dpkg::ExplicitLastConfigure", false) ? std::numeric_limits<decltype(notconfidx)>::max() :
       std::distance(List.cbegin(), std::find_if_not(List.crbegin(), List.crend(), [](Item const &i) { return i.Op == Item::Configure; }).base());
@@ -1233,9 +1238,9 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
    if (notconfidx != std::numeric_limits<decltype(notconfidx)>::max())
    {
       if (ConfigurePending)
-        List.erase(std::next(List.cbegin(), notconfidx), std::prev(List.cend()));
+        List.erase(std::next(List.begin(), notconfidx), std::prev(List.end()));
       else
-        List.erase(std::next(List.cbegin(), notconfidx), List.cend());
+        List.erase(std::next(List.begin(), notconfidx), List.end());
    }
 
    d->stdin_is_dev_null = false;
@@ -1396,7 +1401,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
 
       J = I;
 
-      if (_config->FindB("Debug::pkgDPkgPM",false) == true)
+      if (noopDPkgInvocation == true)
       {
         for (std::vector<const char *>::const_iterator a = Args.begin();
              a != Args.end(); ++a)
@@ -1406,6 +1411,8 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
               p != Packages.end(); ++p)
            free(*p);
         Packages.clear();
+        close(fd[0]);
+        close(fd[1]);
         continue;
       }
       Args.push_back(NULL);
@@ -1575,7 +1582,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
    if (pkgPackageManager::SigINTStop)
        _error->Warning(_("Operation was interrupted before it could finish"));
 
-   if (_config->FindB("Debug::pkgDPkgPM",false) == false)
+   if (noopDPkgInvocation == false)
    {
       std::string const oldpkgcache = _config->FindFile("Dir::cache::pkgcache");
       if (oldpkgcache.empty() == false && RealFileExists(oldpkgcache) == true &&
@@ -1592,7 +1599,9 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
       }
    }
 
-   Cache.writeStateFile(NULL);
+   // disappearing packages can forward their auto-bit
+   if (disappearedPkgs.empty() == false)
+      Cache.writeStateFile(NULL);
 
    d->progress->Stop();