diff options
Diffstat (limited to 'apt-private')
-rw-r--r-- | apt-private/private-cmndline.cc | 2 | ||||
-rw-r--r-- | apt-private/private-install.cc | 20 | ||||
-rw-r--r-- | apt-private/private-main.cc | 2 | ||||
-rw-r--r-- | apt-private/private-output.cc | 10 | ||||
-rw-r--r-- | apt-private/private-output.h | 2 |
5 files changed, 34 insertions, 2 deletions
diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index 592ebd9..ac792cb 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -353,11 +353,13 @@ static bool addArgumentsAPT(std::vector<CommandLine::Args> &Args, char const * c addArg(0,"manual-installed","APT::Cmd::Manual-Installed",0); addArg('v', "verbose", "APT::Cmd::List-Include-Summary", 0); addArg('a', "all-versions", "APT::Cmd::All-Versions", 0); + addArg('S', "snapshot", "APT::Snapshot", CommandLine::HasArg); } else if (CmdMatches("show") || CmdMatches("info")) { addArg('a', "all-versions", "APT::Cache::AllVersions", 0); addArg('f', "full", "APT::Cache::ShowFull", 0); + addArg('S', "snapshot", "APT::Snapshot", CommandLine::HasArg); } else if (addArgumentsAPTGet(Args, Cmd) || addArgumentsAPTCache(Args, Cmd)) { diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc index 4f71f18..57b5c0d 100644 --- a/apt-private/private-install.cc +++ b/apt-private/private-install.cc @@ -658,6 +658,24 @@ bool DoAutomaticRemove(CacheFile &Cache) if (not Cache->VS().CheckDep(PVerStr, R->CompareOp, R.TargetVer())) continue; } + // ignore new providers if we have installed providers + if (Pkg->CurrentVer == 0) + { + std::unique_ptr<pkgCache::Version *[]> VList(R.AllTargets()); + bool has_installed_alt_prov = false; + for (pkgCache::Version **V = VList.get(); *V != 0; ++V) + { + pkgCache::VerIterator Ver(Cache, *V); + auto const P = Ver.ParentPkg(); + if (not P.end() && P->CurrentVer != 0 && Cache[P].InstallVer == *V) + { + has_installed_alt_prov = true; + break; + } + } + if (has_installed_alt_prov) + continue; + } if (Debug == true) std::clog << "Save " << APT::PrettyPkg(Cache, Pkg) << " as another installed package depends on it: " << APT::PrettyPkg(Cache, RP) << std::endl; Cache->MarkInstall(Pkg, false, 0, false); @@ -711,7 +729,7 @@ bool DoAutomaticRemove(CacheFile &Cache) "The following packages were automatically installed and are no longer required:", autoRemoveCount), Universe, [&Cache](pkgCache::PkgIterator const &Pkg) { return (*Cache)[Pkg].Garbage == true && (*Cache)[Pkg].Delete() == false; }, - &PrettyFullName, CandidateVersion(&Cache), "", note); + &PrettyFullName, CurrentVersion(&Cache), "", note); } else { diff --git a/apt-private/private-main.cc b/apt-private/private-main.cc index f28f5cb..39ad07b 100644 --- a/apt-private/private-main.cc +++ b/apt-private/private-main.cc @@ -81,6 +81,8 @@ void CheckIfCalledByScript(int argc, const char *argv[]) /*{{{*/ if(!isatty(STDOUT_FILENO) && _config->FindB("Apt::Cmd::Disable-Script-Warning", false) == false) { + // NOTE: CLI interface is redundant on the I/interface, this is + // intentional to make it easier to read. std::cerr << std::endl << "WARNING: " << flNotDir(argv[0]) << " " << "does not have a stable CLI interface. " diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc index 2e81095..4a946f2 100644 --- a/apt-private/private-output.cc +++ b/apt-private/private-output.cc @@ -596,7 +596,7 @@ void ShowDel(ostream &out,CacheFile &Cache) str.append("*"); return str; }, - CandidateVersion(&Cache), + CurrentVersion(&Cache), "action::remove"); } /*}}}*/ @@ -888,6 +888,14 @@ std::string PrettyFullName(pkgCache::PkgIterator const &Pkg) { return Pkg.FullName(true); } +std::string CurrentVersion(pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg) +{ + return (*Cache)[Pkg].CurVersion; +} +std::function<std::string(pkgCache::PkgIterator const &)> CurrentVersion(pkgCacheFile * const Cache) +{ + return std::bind(static_cast<std::string(*)(pkgCacheFile * const, pkgCache::PkgIterator const&)>(&CurrentVersion), Cache, std::placeholders::_1); +} std::string CandidateVersion(pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg) { return (*Cache)[Pkg].CandVersion; diff --git a/apt-private/private-output.h b/apt-private/private-output.h index 0eba6f4..8e1d472 100644 --- a/apt-private/private-output.h +++ b/apt-private/private-output.h @@ -132,6 +132,8 @@ APT_PUBLIC bool YnPrompt(char const *const Question, bool Default = true); bool YnPrompt(char const * const Question, bool const Default, bool const ShowGlobalErrors, std::ostream &c1o, std::ostream &c2o); APT_PUBLIC std::string PrettyFullName(pkgCache::PkgIterator const &Pkg); +std::string CurrentVersion(pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg); +std::function<std::string(pkgCache::PkgIterator const &)> CurrentVersion(pkgCacheFile * const Cache); std::string CandidateVersion(pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg); std::function<std::string(pkgCache::PkgIterator const &)> CandidateVersion(pkgCacheFile * const Cache); std::string CurrentToCandidateVersion(pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg); |