summaryrefslogtreecommitdiff
path: root/cmdline/apt-mark.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2015-09-17 10:50:30 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2015-11-04 18:04:00 +0100
commitb2a893dda28aea05128394cd61c7ce38cfa0624b (patch)
tree709ab3969f14366364b47fedf34ad71dbdab8a4a /cmdline/apt-mark.cc
parent825db89094a8413dcc9c8ef3abe0a45b0bb7a2e2 (diff)
implement operator* for cacheset iterators
Technically an abi-break as we change a template parameter to std::iterator for this, but this class is empty in all instances and just causes the right typedefs to be set – which were incorrect as detected by std::stable_partition as its implementation uses ::pointer and needs also a operator* implementation. In practice CacheSets have no external users (yet) and the difference is visible only at compile time (which was an error before and now works), not while linking. The changes to apt-mark are functionally identical to the code before, just that we use a std:: algorithm now instead of trying hard on our own.
Diffstat (limited to 'cmdline/apt-mark.cc')
-rw-r--r--cmdline/apt-mark.cc77
1 files changed, 38 insertions, 39 deletions
diff --git a/cmdline/apt-mark.cc b/cmdline/apt-mark.cc
index 20166b312..9b51345a3 100644
--- a/cmdline/apt-mark.cc
+++ b/cmdline/apt-mark.cc
@@ -174,6 +174,41 @@ static bool DoHold(CommandLine &CmdL)
if (unlikely(Cache == NULL))
return false;
+ 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;
+ }
+
// Generate the base argument list for dpkg
std::vector<const char *> Args;
string Tmp = _config->Find("Dir::Bin::dpkg","dpkg");
@@ -201,42 +236,6 @@ static bool DoHold(CommandLine &CmdL)
Args.push_back(Opts->Value.c_str());
}
}
- size_t const BaseArgs = Args.size();
-
- 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;
-
- for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end();)
- {
- if ((Pkg->SelectedState == pkgCache::State::Hold) == MarkHold)
- {
- if (MarkHold == true)
- ioprintf(c1out,_("%s was already set on hold.\n"), Pkg.FullName(true).c_str());
- else
- ioprintf(c1out,_("%s was already not hold.\n"), Pkg.FullName(true).c_str());
- Pkg = pkgset.erase(Pkg);
- }
- else
- ++Pkg;
- }
-
- if (pkgset.empty() == true)
- return true;
-
- if (_config->FindB("APT::Mark::Simulate", false) == true)
- {
- for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
- {
- if (MarkHold == false)
- ioprintf(c1out,_("%s set on hold.\n"), Pkg.FullName(true).c_str());
- else
- ioprintf(c1out,_("Canceled hold on %s.\n"), Pkg.FullName(true).c_str());
- }
- return true;
- }
APT::PackageList keepoffset;
for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
@@ -248,7 +247,7 @@ static bool DoHold(CommandLine &CmdL)
if (keepoffset.empty() == false)
{
- Args.erase(Args.begin() + BaseArgs, Args.end());
+ size_t const BaseArgs = Args.size();
Args.push_back("--merge-avail");
// FIXME: supported only since 1.17.7 in dpkg
Args.push_back("-");
@@ -300,9 +299,9 @@ static bool DoHold(CommandLine &CmdL)
if (WIFEXITED(Status) == false || WEXITSTATUS(Status) != 0)
return _error->Error(_("Executing dpkg failed. Are you root?"));
}
+ Args.erase(Args.begin() + BaseArgs, Args.end());
}
- Args.erase(Args.begin() + BaseArgs, Args.end());
Args.push_back("--set-selections");
Args.push_back(NULL);
@@ -325,7 +324,7 @@ static bool DoHold(CommandLine &CmdL)
bool const dpkgMultiArch = _system->MultiArchSupported();
FILE* dpkg = fdopen(external[1], "w");
- for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+ for (auto Pkg = changeBegin; Pkg != changeEnd; ++Pkg)
{
if (dpkgMultiArch == false)
fprintf(dpkg, "%s", Pkg.FullName(true).c_str());