summaryrefslogtreecommitdiff
path: root/apt-pkg/deb/dpkgpm.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-06-08 17:31:45 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2016-06-08 17:31:45 +0200
commitb4450f1dd6bca537e60406b2383ab154a3e1485f (patch)
tree67ff0903b0dac59c1d307852e4768e63427e92ee /apt-pkg/deb/dpkgpm.cc
parent007d8b488787f4c33ced5937f22f99f1b759088a (diff)
don't explicitly configure the last round of packages
We end our operation by calling "dpkg --configure -a", so instead of running a (big) configure run with all packages mentioned explicitly before this, we simply skip them and let them be handled by this call implicitly. There isn't really an observeable gain to be had here from a speed point, but it helps in avoiding an (uncommon) problem of having a too long commandline passed to dpkg, which we would split up (probably incorrectly).
Diffstat (limited to 'apt-pkg/deb/dpkgpm.cc')
-rw-r--r--apt-pkg/deb/dpkgpm.cc15
1 files changed, 14 insertions, 1 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 4a77942f1..4591049a9 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -1248,15 +1248,28 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false)
return false;
+ 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());
+
// support subpressing of triggers processing for special
// cases like d-i that runs the triggers handling manually
bool const TriggersPending = _config->FindB("DPkg::TriggersPending", false);
- if (_config->FindB("DPkg::ConfigurePending", true) == true)
+ bool const ConfigurePending = _config->FindB("DPkg::ConfigurePending", true);
+ if (ConfigurePending)
List.push_back(Item(Item::ConfigurePending, PkgIterator()));
// for the progress
BuildPackagesProgressMap();
+ if (notconfidx != std::numeric_limits<decltype(notconfidx)>::max())
+ {
+ if (ConfigurePending)
+ List.erase(std::next(List.cbegin(), notconfidx), std::prev(List.cend()));
+ else
+ List.erase(std::next(List.cbegin(), notconfidx), List.cend());
+ }
+
d->stdin_is_dev_null = false;
// create log