summaryrefslogtreecommitdiffstats
path: root/apt-private
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--apt-private/private-cmndline.cc8
-rw-r--r--apt-private/private-install.cc40
-rw-r--r--apt-private/private-output.cc4
-rw-r--r--apt-private/private-show.cc14
-rw-r--r--apt-private/private-source.cc8
5 files changed, 52 insertions, 22 deletions
diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc
index b05ec89..592ebd9 100644
--- a/apt-private/private-cmndline.cc
+++ b/apt-private/private-cmndline.cc
@@ -190,6 +190,7 @@ static bool addArgumentsAPTGet(std::vector<CommandLine::Args> &Args, char const
addArg(0, "auto-remove", "APT::Get::AutomaticRemove", 0);
addArg(0, "reinstall", "APT::Get::ReInstall", 0);
addArg(0, "solver", "APT::Solver", CommandLine::HasArg);
+ addArg(0, "strict-pinning", "APT::Solver::Strict-Pinning", 0);
addArg(0, "planner", "APT::Planner", CommandLine::HasArg);
addArg('U', "update", "APT::Update", 0);
if (CmdMatches("upgrade"))
@@ -230,6 +231,7 @@ static bool addArgumentsAPTGet(std::vector<CommandLine::Args> &Args, char const
addArg('P', "build-profiles", "APT::Build-Profiles", CommandLine::HasArg);
addArg(0, "purge", "APT::Get::Purge", 0);
addArg(0, "solver", "APT::Solver", CommandLine::HasArg);
+ addArg(0, "strict-pinning", "APT::Solver::Strict-Pinning", 0);
if (CmdMatches("build-dep"))
{
addArg(0,"arch-only","APT::Get::Arch-Only",0);
@@ -580,6 +582,12 @@ std::vector<CommandLine::Dispatch> ParseCommandLine(CommandLine &CmdL, APT_CMD c
_error->Warning(_("--force-yes is deprecated, use one of the options starting with --allow instead."));
}
+ if (not _config->FindB("APT::Solver::Strict-Pinning", true) && _config->Find("APT::Solver", "internal") == "internal")
+ {
+ _config->Set("APT::Solver", "3.0");
+ _error->Notice("Automatically enabled --solver 3.0 for --no-strict-pinning");
+ }
+
// See if the help should be shown
if (_config->FindB("help") == true || _config->FindB("version") == true ||
(CmdL.FileSize() > 0 && strcmp(CmdL.FileList[0], "help") == 0))
diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc
index 9a2ed0b..4f71f18 100644
--- a/apt-private/private-install.cc
+++ b/apt-private/private-install.cc
@@ -20,6 +20,7 @@
#include <apt-pkg/prettyprinters.h>
#include <apt-pkg/strutl.h>
#include <apt-pkg/upgrade.h>
+#include <apt-pkg/version.h>
#include <algorithm>
#include <cstdlib>
@@ -214,16 +215,6 @@ bool InstallPackages(CacheFile &Cache, APT::PackageVector &HeldBackPackages, boo
return false;
}
- APT::PackageVector PhasingPackages;
- APT::PackageVector NotPhasingHeldBackPackages;
- for (auto const &Pkg : HeldBackPackages)
- {
- if (Cache->PhasingApplied(Pkg))
- PhasingPackages.push_back(Pkg);
- else
- NotPhasingHeldBackPackages.push_back(Pkg);
- }
-
// Show all the various warning indicators
if (_config->FindI("APT::Output-Version") < 30)
ShowDel(c1out,Cache);
@@ -234,6 +225,16 @@ bool InstallPackages(CacheFile &Cache, APT::PackageVector &HeldBackPackages, boo
ShowWeakDependencies(Cache);
if (ShwKept == true)
{
+ APT::PackageVector PhasingPackages;
+ APT::PackageVector NotPhasingHeldBackPackages;
+ for (auto const &Pkg : HeldBackPackages)
+ {
+ if (Cache->PhasingApplied(Pkg))
+ PhasingPackages.push_back(Pkg);
+ else
+ NotPhasingHeldBackPackages.push_back(Pkg);
+ }
+
ShowPhasing(c1out, Cache, PhasingPackages);
ShowKept(c1out, Cache, NotPhasingHeldBackPackages);
if (not PhasingPackages.empty() && not NotPhasingHeldBackPackages.empty())
@@ -620,12 +621,14 @@ bool DoAutomaticRemove(CacheFile &Cache)
for (APT::PackageSet::iterator Pkg = tooMuch.begin();
Pkg != tooMuch.end(); ++Pkg)
{
- APT::PackageSet too;
- too.insert(*Pkg);
- for (pkgCache::PrvIterator Prv = Cache[Pkg].CandidateVerIter(Cache).ProvidesList();
- Prv.end() == false; ++Prv)
- too.insert(Prv.ParentPkg());
- for (APT::PackageSet::const_iterator P = too.begin(); P != too.end(); ++P)
+ auto const PkgCand = Cache[Pkg].CandidateVerIter(Cache);
+ if (unlikely(PkgCand.end()))
+ continue;
+ std::vector<std::pair<pkgCache::PkgIterator, char const *>> too;
+ too.emplace_back(*Pkg, PkgCand.VerStr());
+ for (pkgCache::PrvIterator Prv = PkgCand.ProvidesList(); not Prv.end(); ++Prv)
+ too.emplace_back(Prv.ParentPkg(), Prv.ProvideVersion());
+ for (auto const &[P, PVerStr] : too)
{
for (pkgCache::DepIterator R = P.RevDependsList();
R.end() == false; ++R)
@@ -650,6 +653,11 @@ bool DoAutomaticRemove(CacheFile &Cache)
}
else // ignore dependency from a non-candidate version
continue;
+ if (R->Version != 0)
+ {
+ if (not Cache->VS().CheckDep(PVerStr, R->CompareOp, R.TargetVer()))
+ 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);
diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc
index 09d03d3..2e81095 100644
--- a/apt-private/private-output.cc
+++ b/apt-private/private-output.cc
@@ -350,7 +350,7 @@ struct columnInfo
void ShowWithColumns(ostream &out, vector<string> const &List, size_t Indent, size_t ScreenWidth)
{
constexpr size_t MinColumnWidth = 2;
- constexpr size_t ColumnSpace = 1;
+ constexpr size_t ColumnSpace = 2;
size_t const ListSize = List.size();
size_t const MaxScreenCols = (ScreenWidth - Indent) /
@@ -740,7 +740,7 @@ bool ShowEssential(ostream &out,CacheFile &Cache)
}
return ShowList(out,_("WARNING: The following essential packages will be removed.\n"
"This should NOT be done unless you know exactly what you are doing!"),
- pkglist, &AlwaysTrue, withdue, &EmptyString);
+ pkglist, &AlwaysTrue, withdue, &EmptyString, "action::remove");
}
/*}}}*/
// Stats - Show some statistics /*{{{*/
diff --git a/apt-private/private-show.cc b/apt-private/private-show.cc
index 4ae0430..ceef670 100644
--- a/apt-private/private-show.cc
+++ b/apt-private/private-show.cc
@@ -446,14 +446,22 @@ bool ShowSrcPackage(CommandLine &CmdL) /*{{{*/
std::set<std::string> seen;
for (const char **I = CmdL.FileList + 1; *I != 0; I++)
{
+ const char *pkgname = *I;
SrcRecs.Restart();
pkgSrcRecords::Parser *Parse;
bool found_this = false;
- while ((Parse = SrcRecs.Find(*I,false)) != 0) {
+ bool only_source = _config->FindB("APT::Cache::Only-Source", false);
+ if (APT::String::Startswith(pkgname, "src:"))
+ {
+ only_source = true;
+ pkgname += 4;
+ }
+ while ((Parse = SrcRecs.Find(pkgname, false)) != 0)
+ {
// SrcRecs.Find() will find both binary and source names
- if (_config->FindB("APT::Cache::Only-Source", false) == true)
- if (Parse->Package() != *I)
+ if (only_source)
+ if (Parse->Package() != pkgname)
continue;
std::string sha1str = Sha1FromString(Parse->AsStr());
if (std::find(seen.begin(), seen.end(), sha1str) == seen.end())
diff --git a/apt-private/private-source.cc b/apt-private/private-source.cc
index 9b9409c..6280b9f 100644
--- a/apt-private/private-source.cc
+++ b/apt-private/private-source.cc
@@ -77,7 +77,14 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,
std::string ArchTag = "";
std::string RelTag = _config->Find("APT::Default-Release");
std::string TmpSrc = Name;
+ bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source");
+ // Check if we should look by source package
+ if (APT::String::Startswith(TmpSrc, "src:"))
+ {
+ MatchSrcOnly = true;
+ TmpSrc = TmpSrc.substr(4);
+ }
// extract release
size_t found = TmpSrc.find_last_of("/");
if (found != std::string::npos)
@@ -103,7 +110,6 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,
/* Lookup the version of the package we would install if we were to
install a version and determine the source package name, then look
in the archive for a source package of the same name. */
- bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source");
pkgCache::PkgIterator Pkg;
if (ArchTag != "")
Pkg = Cache.GetPkgCache()->FindPkg(TmpSrc, ArchTag);