- {
- std::vector<bool> toBeRemoved(Cache.Head().PackageCount, false);
- std::vector<bool> toBePurged(Cache.Head().PackageCount, false);
- for (auto Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
- if (Cache[Pkg].Purge())
- toBePurged[Pkg->ID] = true;
- else if (Cache[Pkg].Delete())
- toBeRemoved[Pkg->ID] = true;
- for (auto && I: approvedStates.Remove())
- toBeRemoved[I.ParentPkg()->ID] = false;
- for (auto && I: approvedStates.Purge())
- toBePurged[I.ParentPkg()->ID] = false;
- if (std::find(toBeRemoved.begin(), toBeRemoved.end(), true) != toBeRemoved.end())
- {
- if (ConfigurePending)
- List.emplace(std::prev(List.end()), Item::RemovePending, pkgCache::PkgIterator());
- else
- List.emplace_back(Item::RemovePending, pkgCache::PkgIterator());
- }
- if (std::find(toBePurged.begin(), toBePurged.end(), true) != toBePurged.end())
- {
- if (ConfigurePending)
- List.emplace(std::prev(List.end()), Item::PurgePending, pkgCache::PkgIterator());
- else
- List.emplace_back(Item::PurgePending, pkgCache::PkgIterator());
- }
- }
+ List.erase(std::next(List.begin(), explicitIdx), List.end());
+
+ std::vector<bool> toBeRemoved(Cache.Head().PackageCount, false);
+ for (auto && I: approvedStates.Remove())
+ toBeRemoved[I.ParentPkg()->ID] = true;
+ for (auto && I: approvedStates.Purge())
+ toBeRemoved[I.ParentPkg()->ID] = true;
+
+ for (auto && I: List)
+ if (I.Op == Item::Remove || I.Op == Item::Purge)
+ toBeRemoved[I.Pkg->ID] = false;
+
+ if (std::find(toBeRemoved.begin(), toBeRemoved.end(), true) != toBeRemoved.end())
+ List.emplace_back(Item::RemovePending, pkgCache::PkgIterator());
+ if (approvedStates.Purge().empty() == false)
+ List.emplace_back(Item::PurgePending, pkgCache::PkgIterator());
+
+ // support subpressing of triggers processing for special
+ // cases like d-i that runs the triggers handling manually
+ if (_config->FindB("DPkg::ConfigurePending", true))
+ List.emplace_back(Item::ConfigurePending, pkgCache::PkgIterator());