+ APT::PackageList pkgset = APT::PackageList::FromCommandLine(CacheFile, CmdL.FileList + 1);
+ if (pkgset.empty() == true)
+ return _error->Error(_("No packages found"));
+
+ bool const MarkHold = strcasecmp(CmdL.FileList[0],"hold") == 0;
+
+ auto part = std::stable_partition(pkgset.begin(), pkgset.end(),
+ [](pkgCache::PkgIterator const &P) { return P->SelectedState == pkgCache::State::Hold; });
+
+ auto doneBegin = MarkHold ? pkgset.begin() : part;
+ auto doneEnd = MarkHold ? part : pkgset.end();
+ auto changeBegin = MarkHold ? part : pkgset.begin();
+ auto changeEnd = MarkHold ? pkgset.end() : part;
+
+ std::for_each(doneBegin, doneEnd, [&MarkHold](pkgCache::PkgIterator const &P) {
+ if (MarkHold == true)
+ ioprintf(c1out, _("%s was already set on hold.\n"), P.FullName(true).c_str());
+ else
+ ioprintf(c1out, _("%s was already not hold.\n"), P.FullName(true).c_str());
+ });
+
+ if (doneBegin == pkgset.begin() && doneEnd == pkgset.end())
+ return true;
+
+ if (_config->FindB("APT::Mark::Simulate", false) == true)
+ {
+ std::for_each(changeBegin, changeEnd, [&MarkHold](pkgCache::PkgIterator const &P) {
+ if (MarkHold == false)
+ ioprintf(c1out, _("%s set on hold.\n"), P.FullName(true).c_str());
+ else
+ ioprintf(c1out, _("Canceled hold on %s.\n"), P.FullName(true).c_str());
+ });
+ return true;
+ }
+