From: David Kalnischkies Date: Sun, 24 Jul 2016 09:52:04 +0000 (+0200) Subject: ensure all configures are reported to hook scripts X-Git-Tag: 1.3_rc1~3^2~4 X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/9ffbac99e52c91182ed8ff8678a994626b194e69?ds=sidebyside ensure all configures are reported to hook scripts A planner might not explicitly configure all packages, but we need to know all packages which will be configured for progress reporting and to tell the hook scripts about them as they rely on this for their own functionality. --- diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index b47988d6c..9d48401dc 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -1283,6 +1284,22 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) std::find_if_not(List.crbegin(), List.crend(), [](Item const &i) { return i.Op == Item::Configure; }), List.crend(), [](Item const &i) { return i.Op == Item::Remove || i.Op == Item::Purge; }).base()); + // explicitely configure everything for hookscripts and progress building + { + std::unordered_set alreadyConfigured; + for (auto && I : List) + if (I.Op == Item::Configure) + alreadyConfigured.insert(I.Pkg->ID); + decltype(List) AppendList; + for (auto && I : List) + if (I.Op == Item::Install && alreadyConfigured.insert(I.Pkg->ID).second == true) + AppendList.emplace_back(Item::Configure, I.Pkg); + for (auto Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg) + if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure && alreadyConfigured.insert(Pkg->ID).second == true) + AppendList.emplace_back(Item::Configure, Pkg); + std::move(AppendList.begin(), AppendList.end(), std::back_inserter(List)); + } + auto const ItemIsEssential = [](pkgDPkgPM::Item const &I) { static auto const cachegen = _config->Find("pkgCacheGen::Essential"); if (cachegen == "none" || cachegen == "native")