summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml2
-rw-r--r--CMakeLists.txt2
-rw-r--r--apt-pkg/edsp/edsplistparser.cc15
-rw-r--r--apt-pkg/solver3.cc127
-rw-r--r--apt-pkg/solver3.h52
-rw-r--r--apt-pkg/tagfile-keys.list1
-rw-r--r--cmdline/apt-key.in14
-rw-r--r--doc/apt-verbatim.ent2
-rw-r--r--doc/apt.conf.5.xml4
-rw-r--r--doc/po/apt-doc.pot6
-rw-r--r--doc/po/de.po10
-rw-r--r--doc/po/es.po10
-rw-r--r--doc/po/fr.po10
-rw-r--r--doc/po/it.po10
-rw-r--r--doc/po/ja.po10
-rw-r--r--doc/po/nl.po109
-rw-r--r--doc/po/pl.po10
-rw-r--r--doc/po/pt.po27
-rw-r--r--doc/po/pt_BR.po10
-rw-r--r--po/apt-all.pot4
-rw-r--r--po/nl.po18
-rwxr-xr-xtest/integration/run-tests2
-rwxr-xr-xtest/integration/test-bug-64141-install-dependencies-for-on-hold3
-rwxr-xr-xtest/integration/test-prefer-higher-priority-providers9
-rwxr-xr-xtest/integration/test-resolver-provider-exchange1
25 files changed, 281 insertions, 187 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 528edf7..dc8cfc9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,7 +12,7 @@ before_script:
- rm -f /etc/dpkg/dpkg.cfg.d/excludes
- apt-get update
- apt-get install --no-install-recommends -qq build-essential expect sudo ccache moreutils adduser
- - adduser --home /home/travis travis --quiet --disabled-login --gecos ""
+ - adduser --home /home/travis travis --quiet --disabled-login --gecos "" --shell /bin/sh
- chmod 755 /root
- chmod -R o+rwX $PWD
- ./prepare-release travis-ci
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 50d7884..a457110 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -206,7 +206,7 @@ endif()
# Configure some variables like package, version and architecture.
set(PACKAGE ${PROJECT_NAME})
set(PACKAGE_MAIL "APT Development Team <deity@lists.debian.org>")
-set(PACKAGE_VERSION "2.9.4")
+set(PACKAGE_VERSION "2.9.5")
string(REGEX MATCH "^[0-9.]+" PROJECT_VERSION ${PACKAGE_VERSION})
if (NOT DEFINED DPKG_DATADIR)
diff --git a/apt-pkg/edsp/edsplistparser.cc b/apt-pkg/edsp/edsplistparser.cc
index 5419069..183ace6 100644
--- a/apt-pkg/edsp/edsplistparser.cc
+++ b/apt-pkg/edsp/edsplistparser.cc
@@ -44,7 +44,20 @@ edspListParser::edspListParser(FileFd * const File) : edspLikeListParser(File)
bool edspLikeListParser::NewVersion(pkgCache::VerIterator &Ver)
{
_system->SetVersionMapping(Ver->ID, Section.FindI("APT-ID", Ver->ID));
- return debListParser::NewVersion(Ver);
+ if (not debListParser::NewVersion(Ver))
+ return false;
+
+ // Patch up the source version, it is stored in the Source-Version field in EDSP.
+ if (APT::StringView version = Section.Find(pkgTagSection::Key::Source_Version); not version.empty())
+ {
+ if (version != Ver.VerStr())
+ {
+ map_stringitem_t const idx = StoreString(pkgCacheGenerator::VERSIONNUMBER, version);
+ Ver->SourceVerStr = idx;
+ }
+ }
+
+ return true;
}
/*}}}*/
// ListParser::Description - Return the description string /*{{{*/
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc
index 9831f7e..dc70adb 100644
--- a/apt-pkg/solver3.cc
+++ b/apt-pkg/solver3.cc
@@ -26,11 +26,12 @@
#include <sstream>
// FIXME: Helpers stolen from DepCache, please give them back.
-struct CompareProviders3 /*{{{*/
+struct APT::Solver::CompareProviders3 /*{{{*/
{
pkgCache &Cache;
pkgDepCache::Policy &Policy;
pkgCache::PkgIterator const Pkg;
+ APT::Solver &Solver;
bool upgrade{_config->FindB("APT::Solver::Upgrade", false)};
bool operator()(pkgCache::Version *AV, pkgCache::Version *BV)
@@ -60,6 +61,11 @@ struct CompareProviders3 /*{{{*/
return _system->VS->CmpVersion(AV.VerStr(), BV.VerStr()) > 0;
}
+ // Try obsolete choices only after exhausting non-obsolete choices such that we install
+ // packages replacing them and don't keep back upgrades depending on the replacement to
+ // keep the obsolete package installed.
+ if (auto obsoleteAV = Solver.Obsolete(AV), obsoleteBV = Solver.Obsolete(BV); obsoleteAV != obsoleteBV)
+ return obsoleteBV;
// Prefer MA:same packages if other architectures for it are installed
if ((AV->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same ||
(BV->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
@@ -158,8 +164,9 @@ class DefaultRootSetFunc2 : public pkgDepCache::DefaultRootSetFunc
APT::Solver::Solver(pkgCache &cache, pkgDepCache::Policy &policy)
: cache(cache),
policy(policy),
- pkgStates{cache.Head().PackageCount},
- verStates{cache.Head().VersionCount}
+ pkgStates(cache.Head().PackageCount),
+ verStates(cache.Head().VersionCount),
+ verObsolete(cache.Head().VersionCount)
{
static_assert(sizeof(APT::Solver::State<pkgCache::PkgIterator>) == 3 * sizeof(int));
static_assert(sizeof(APT::Solver::State<pkgCache::VerIterator>) == 3 * sizeof(int));
@@ -170,33 +177,15 @@ APT::Solver::Solver(pkgCache &cache, pkgDepCache::Policy &policy)
// This function determines if a work item is less important than another.
bool APT::Solver::Work::operator<(APT::Solver::Work const &b) const
{
- if (optional && b.optional && reason.empty() && b.reason.empty() && upgrade != b.upgrade)
- {
- // Assuming we have libfoo-dev=5.1 Depends libfoo5.1-dev upgrade to libfoo-dev=5.3 Depends libfoo5.3-dev,
- // We schedule libfoo-dev=5.3|libfoo-dev=5.1, libfoo5.1-dev. The latter would be resolved first, resulting
- // in libfoo-dev being kept back.
- //
- // However, if we schedule not libfoo5.1-dev but bar Recommends libfoo5.1-dev, we should not be breaking that
- // Recommends, hence we need to ensure that if we order an upgrade before an optional package that this optional
- // package was a top level package, i.e. b.reason is empty (or our reason in the reverse case).
- //
- // So if we are the upgrade, and b also Depends on one of our versions, we need to satisfy b after we
- // have scheduled the upgrade.
- if (upgrade)
- return std::any_of(b.solutions.begin(), b.solutions.end(), [this](auto bsol) -> bool
- { return std::find(solutions.begin(), solutions.end(), bsol) != solutions.end(); });
- else
- return std::any_of(solutions.begin(), solutions.end(), [b](auto sol) -> bool
- { return std::find(b.solutions.begin(), b.solutions.end(), sol) != b.solutions.end(); });
- }
+ if ((not optional && size < 2) != (not b.optional && b.size < 2))
+ return not b.optional && b.size < 2;
+ if (group != b.group)
+ return group > b.group;
if (optional && b.optional && reason.empty() != b.reason.empty())
return reason.empty();
// An optional item is less important than a required one.
if (optional != b.optional)
return optional;
- // More solutions to explore are more expensive.
- if (size != b.size)
- return size > b.size;
// We enqueue common dependencies at the package level to avoid choosing versions, so let's solve package items first,
// this improves the implication graph as it now tells you that common dependencies were installed by the package.
if (reason.Pkg() != b.reason.Pkg())
@@ -211,7 +200,7 @@ void APT::Solver::Work::Dump(pkgCache &cache)
std::cerr << "Dirty ";
if (optional)
std::cerr << "Optional ";
- std::cerr << "Item (" << size << "@" << depth << (upgrade ? "u" : "") << ") ";
+ std::cerr << "Item (" << ssize_t(size <= solutions.size() ? size : -1) << "@" << depth << (upgrade ? "u" : "") << ") ";
if (auto Pkg = reason.Pkg(); Pkg != 0)
std::cerr << pkgCache::PkgIterator(cache, cache.PkgP + Pkg).FullName();
if (auto Ver = reason.Ver(); Ver != 0)
@@ -257,7 +246,27 @@ std::string APT::Solver::WhyStr(Reason reason)
return outstr;
}
-bool APT::Solver::Install(pkgCache::PkgIterator Pkg, Reason reason)
+bool APT::Solver::Obsolete(pkgCache::VerIterator ver)
+{
+ if (verObsolete[ver->ID] != 0)
+ return verObsolete[ver->ID] == 2;
+ for (auto bin = ver.Cache()->FindGrp(ver.SourcePkgName()).VersionsInSource(); not bin.end(); bin = bin.NextInSource())
+ if (bin != ver && bin.ParentPkg()->Arch == ver.ParentPkg()->Arch && bin->ParentPkg != ver->ParentPkg && policy.GetCandidateVer(bin.ParentPkg()) == bin && _system->VS->CmpVersion(bin.SourceVerStr(), ver.SourceVerStr()) > 0)
+ {
+ verObsolete[ver->ID] = 2;
+ return true;
+ }
+ for (auto file = ver.FileList(); !file.end(); file++)
+ if ((file.File()->Flags & pkgCache::Flag::NotSource) == 0)
+ {
+ verObsolete[ver->ID] = 1;
+ return false;
+ }
+ verObsolete[ver->ID] = 2;
+ return true;
+}
+
+bool APT::Solver::Install(pkgCache::PkgIterator Pkg, Reason reason, Group group)
{
if ((*this)[Pkg].decision == Decision::MUST)
return true;
@@ -286,16 +295,16 @@ bool APT::Solver::Install(pkgCache::PkgIterator Pkg, Reason reason)
(*this)[Pkg] = {reason, depth(), Decision::MUST,};
// Insert the work item.
- Work workItem{Reason(Pkg), depth()};
+ Work workItem{Reason(Pkg), depth(), group};
for (auto ver = Pkg.VersionList(); not ver.end(); ver++)
if (IsAllowedVersion(ver))
workItem.solutions.push_back(ver);
- std::stable_sort(workItem.solutions.begin(), workItem.solutions.end(), CompareProviders3{cache, policy, Pkg});
+ std::stable_sort(workItem.solutions.begin(), workItem.solutions.end(), CompareProviders3{cache, policy, Pkg, *this});
assert(workItem.solutions.size() > 0);
if (workItem.solutions.size() > 1 || workItem.optional)
AddWork(std::move(workItem));
- else if (not Install(pkgCache::VerIterator(cache, workItem.solutions[0]), workItem.reason))
+ else if (not Install(pkgCache::VerIterator(cache, workItem.solutions[0]), workItem.reason, group))
return false;
if (not EnqueueCommonDependencies(Pkg))
@@ -304,7 +313,7 @@ bool APT::Solver::Install(pkgCache::PkgIterator Pkg, Reason reason)
return true;
}
-bool APT::Solver::Install(pkgCache::VerIterator Ver, Reason reason)
+bool APT::Solver::Install(pkgCache::VerIterator Ver, Reason reason, Group group)
{
if ((*this)[Ver].decision == Decision::MUST)
return true;
@@ -339,7 +348,7 @@ bool APT::Solver::Install(pkgCache::VerIterator Ver, Reason reason)
for (auto OV = Ver.ParentPkg().VersionList(); not OV.end(); ++OV)
{
- if (OV != Ver && not Reject(OV, Reason(Ver)))
+ if (OV != Ver && not Reject(OV, Reason(Ver), group))
return false;
}
@@ -357,7 +366,7 @@ bool APT::Solver::Install(pkgCache::VerIterator Ver, Reason reason)
return true;
}
-bool APT::Solver::Reject(pkgCache::PkgIterator Pkg, Reason reason)
+bool APT::Solver::Reject(pkgCache::PkgIterator Pkg, Reason reason, Group group)
{
if ((*this)[Pkg].decision == Decision::MUSTNOT)
return true;
@@ -374,7 +383,7 @@ bool APT::Solver::Reject(pkgCache::PkgIterator Pkg, Reason reason)
std::cerr << "[" << depth() << "] Reject:" << Pkg.FullName() << " (" << WhyStr(reason) << ")\n";
(*this)[Pkg] = {reason, depth(), Decision::MUSTNOT,};
for (auto ver = Pkg.VersionList(); not ver.end(); ver++)
- if (not Reject(ver, Reason(Pkg)))
+ if (not Reject(ver, Reason(Pkg), group))
return false;
needsRescore = true;
@@ -383,8 +392,10 @@ bool APT::Solver::Reject(pkgCache::PkgIterator Pkg, Reason reason)
}
// \brief Do not install this version
-bool APT::Solver::Reject(pkgCache::VerIterator Ver, Reason reason)
+bool APT::Solver::Reject(pkgCache::VerIterator Ver, Reason reason, Group group)
{
+ (void) group;
+
if ((*this)[Ver].decision == Decision::MUSTNOT)
return true;
@@ -473,7 +484,7 @@ bool APT::Solver::EnqueueOrGroup(pkgCache::DepIterator start, pkgCache::DepItera
if (unlikely(debug >= 3))
std::cerr << "Found dependency critical " << Ver.ParentPkg().FullName() << "=" << Ver.VerStr() << " -> " << start.TargetPkg().FullName() << "\n";
- Work workItem{reason, depth(), not start.IsCritical() /* optional */};
+ Work workItem{reason, depth(), Group::Satisfy, not start.IsCritical() /* optional */};
do
{
@@ -489,7 +500,7 @@ bool APT::Solver::EnqueueOrGroup(pkgCache::DepIterator start, pkgCache::DepItera
if (unlikely(debug >= 3))
std::cerr << "Reject: " << Ver.ParentPkg().FullName() << "=" << Ver.VerStr() << " -> " << tgti.ParentPkg().FullName() << "=" << tgti.VerStr() << "\n";
// FIXME: We should be collecting these and marking the heap only once.
- if (not Reject(pkgCache::VerIterator(cache, *tgt), Reason(Ver)))
+ if (not Reject(pkgCache::VerIterator(cache, *tgt), Reason(Ver), Group::HoldOrDelete))
return false;
}
else
@@ -506,7 +517,7 @@ bool APT::Solver::EnqueueOrGroup(pkgCache::DepIterator start, pkgCache::DepItera
// FIXME: This is not really true, though, we should fix the CompareProviders to ignore the
// installed state
if (fixPolicy)
- std::stable_sort(workItem.solutions.begin() + begin, workItem.solutions.end(), CompareProviders3{cache, policy, TgtPkg});
+ std::stable_sort(workItem.solutions.begin() + begin, workItem.solutions.end(), CompareProviders3{cache, policy, TgtPkg, *this});
if (start == end)
break;
@@ -514,8 +525,14 @@ bool APT::Solver::EnqueueOrGroup(pkgCache::DepIterator start, pkgCache::DepItera
} while (1);
if (not fixPolicy)
- std::stable_sort(workItem.solutions.begin(), workItem.solutions.end(), CompareProviders3{cache, policy, TgtPkg});
-
+ std::stable_sort(workItem.solutions.begin(), workItem.solutions.end(), CompareProviders3{cache, policy, TgtPkg, *this});
+
+ if (std::all_of(workItem.solutions.begin(), workItem.solutions.end(), [this](auto V) -> auto
+ { return pkgCache::VerIterator(cache, V).ParentPkg()->CurrentVer == 0; }))
+ workItem.group = Group::SatisfyNew;
+ if (std::any_of(workItem.solutions.begin(), workItem.solutions.end(), [this](auto V) -> auto
+ { return Obsolete(pkgCache::VerIterator(cache, V)); }))
+ workItem.group = Group::SatisfyObsolete;
// Try to perserve satisfied Recommends. FIXME: We should check if the Recommends was there in the installed version?
if (workItem.optional && start.ParentPkg()->CurrentVer)
{
@@ -560,6 +577,8 @@ bool APT::Solver::EnqueueOrGroup(pkgCache::DepIterator start, pkgCache::DepItera
return true;
}
}
+ else if (workItem.optional && start.ParentPkg()->CurrentVer == 0)
+ workItem.group = Group::NewUnsatRecommends;
if (not workItem.solutions.empty())
{
@@ -572,7 +591,7 @@ bool APT::Solver::EnqueueOrGroup(pkgCache::DepIterator start, pkgCache::DepItera
}
if (workItem.optional || workItem.solutions.size() > 1)
AddWork(std::move(workItem));
- else if (not Install(pkgCache::VerIterator(cache, workItem.solutions[0]), reason))
+ else if (not Install(pkgCache::VerIterator(cache, workItem.solutions[0]), reason, workItem.group))
return false;
}
else if (start.IsCritical() && not start.IsNegative())
@@ -643,7 +662,7 @@ bool APT::Solver::RejectReverseDependencies(pkgCache::VerIterator Ver)
if (unlikely(debug >= 3))
std::cerr << "Propagate NOT " << Ver.ParentPkg().FullName() << "=" << Ver.VerStr() << " to " << RDV.ParentPkg().FullName() << "=" << RDV.VerStr() << " for dependency group starting with" << start.TargetPkg().FullName() << std::endl;
- if (not Reject(RDV, Reason(Ver)))
+ if (not Reject(RDV, Reason(Ver), Group::HoldOrDelete))
return false;
}
return true;
@@ -738,7 +757,7 @@ bool APT::Solver::Pop()
assert(w.choice != nullptr);
// FIXME: There should be a reason!
- if (not Reject(pkgCache::VerIterator(cache, w.choice), {}))
+ if (not Reject(pkgCache::VerIterator(cache, w.choice), {}, Group::HoldOrDelete))
return false;
w.choice = nullptr;
@@ -857,7 +876,7 @@ bool APT::Solver::Solve()
}
if (unlikely(debug >= 3))
std::cerr << "(try it: " << ver.ParentPkg().FullName() << "=" << ver.VerStr() << ")\n";
- if (not Install(pkgCache::VerIterator(cache, ver), item.reason) && not Pop())
+ if (not Install(pkgCache::VerIterator(cache, ver), item.reason, Group::Satisfy) && not Pop())
return false;
foundSolution = true;
break;
@@ -905,48 +924,52 @@ bool APT::Solver::FromDepCache(pkgDepCache &depcache)
{
if (unlikely(debug >= 1))
std::cerr << "Hold " << P.FullName() << "\n";
- if (P->CurrentVer ? not Install(P.CurrentVer(), {}) : not Reject(P, {}))
+ if (P->CurrentVer ? not Install(P.CurrentVer(), {}, Group::HoldOrDelete) : not Reject(P, {}, Group::HoldOrDelete))
return false;
}
else if (reject)
{
if (unlikely(debug >= 1))
std::cerr << "Delete " << P.FullName() << "\n";
- if (!Reject(P, {}))
+ if (!Reject(P, {}, Group::HoldOrDelete))
return false;
}
else if (maybeInstall && P->Flags & (pkgCache::Flag::Essential | pkgCache::Flag::Important))
{
if (unlikely(debug >= 1))
std::cerr << "ESSENTIAL " << P.FullName() << "\n";
- if (depcache[P].Keep() ? not Install(P, {}) : not Install(depcache.GetCandidateVersion(P), {}))
+ if (depcache[P].Keep() ? not Install(P, {}, Group::InstallManual) : not Install(depcache.GetCandidateVersion(P), {}, Group::InstallManual))
return false;
}
else if (maybeInstall && not isOptional)
{
+ auto Upgrade = depcache.GetCandidateVersion(P) != P.CurrentVer();
+ auto Group = (Upgrade ? Group::UpgradeManual : Group::InstallManual);
if (unlikely(debug >= 1))
std::cerr << "MANUAL " << P.FullName() << "\n";
- if (depcache[P].Keep() ? not Install(P, {}) : not Install(depcache.GetCandidateVersion(P), {}))
+ if (depcache[P].Keep() ? not Install(P, {}, Group) : not Install(depcache.GetCandidateVersion(P), {}, Group))
return false;
}
else if (maybeInstall && isOptional && (KeepAuto || rootSet.InRootSet(P) || not isAuto))
{
auto Upgrade = depcache.GetCandidateVersion(P) != P.CurrentVer();
+ auto Group = isAuto ? (Upgrade ? Group::UpgradeAuto : Group::KeepAuto)
+ : (Upgrade ? Group::UpgradeManual : Group::InstallManual);
if (unlikely(debug >= 1))
std::cerr << "AUTOMATIC " << P.FullName() << (Upgrade ? " - upgrade" : "") << "\n";
if (not AllowRemove)
{
- if (depcache[P].Keep() ? not Install(P, {}) : not Install(depcache.GetCandidateVersion(P), {}))
+ if (depcache[P].Keep() ? not Install(P, {}, Group) : not Install(depcache.GetCandidateVersion(P), {}, Group))
return false;
}
else
{
- Work w{Reason(), depth(), true, Upgrade};
+ Work w{Reason(), depth(), Group, true, Upgrade};
for (auto V = P.VersionList(); not V.end(); ++V)
if (IsAllowedVersion(V))
w.solutions.push_back(V);
- std::stable_sort(w.solutions.begin(), w.solutions.end(), CompareProviders3{cache, policy, P});
+ std::stable_sort(w.solutions.begin(), w.solutions.end(), CompareProviders3{cache, policy, P, *this});
AddWork(std::move(w));
}
}
@@ -954,7 +977,7 @@ bool APT::Solver::FromDepCache(pkgDepCache &depcache)
{
if (unlikely(debug >= 1))
std::cerr << "NOT ALLOWING INSTALL OF " << P.FullName() << "\n";
- if (not Reject(P, {}))
+ if (not Reject(P, {}, Group::HoldOrDelete))
return false;
}
}
diff --git a/apt-pkg/solver3.h b/apt-pkg/solver3.h
index cf2fb2e..9a9d67a 100644
--- a/apt-pkg/solver3.h
+++ b/apt-pkg/solver3.h
@@ -32,10 +32,46 @@ class Solver
enum class Decision : uint16_t;
enum class Hint : uint16_t;
struct Reason;
+ struct CompareProviders3;
template <typename T>
struct State;
struct Work;
+ // \brief Groups of works, these are ordered.
+ //
+ // Later items will be skipped if they are optional, or we will when backtracking,
+ // try a different choice for them.
+ enum class Group : uint8_t
+ {
+ HoldOrDelete,
+ NewUnsatRecommends,
+
+ // Satisfying dependencies on entirely new packages first is a good idea because
+ // it may contain replacement packages like libfoo1t64 whereas we later will see
+ // Depends: libfoo1 where libfoo1t64 Provides libfoo1 and we'd have to choose.
+ SatisfyNew,
+ Satisfy,
+ // On a similar note as for SatisfyNew, if the dependency contains obsolete packages
+ // try it last.
+ SatisfyObsolete,
+
+ // My intuition tells me that we should try to schedule upgrades first, then
+ // any non-obsolete installed packages, and only finally obsolete ones, such
+ // that newer packages guide resolution of dependencies for older ones, they
+ // may have more stringent dependencies, like a (>> 2) whereas an obsolete
+ // package may have a (>> 1), for example.
+ UpgradeManual,
+ InstallManual,
+ ObsoleteManual,
+
+ // Automatically installed packages must come last in the group, this allows
+ // us to see if they were installed as a dependency of a manually installed package,
+ // allowing a simple implementation of an autoremoval code.
+ UpgradeAuto,
+ KeepAuto,
+ ObsoleteAuto
+ };
+
// \brief Type to record depth at. This may very well be a 16-bit
// unsigned integer, then change Solver::State::Decision to be a
// uint16_t class enum as well to get a more compact space.
@@ -68,6 +104,9 @@ class Solver
return verStates[V->ID];
}
+ std::vector<char> verObsolete;
+ bool Obsolete(pkgCache::VerIterator ver);
+
// \brief Heap of the remaining work.
//
// We are using an std::vector with std::make_heap(), std::push_heap(),
@@ -131,13 +170,13 @@ class Solver
Solver(pkgCache &Cache, pkgDepCache::Policy &Policy);
// \brief Mark the package for install. This is annoying as it incurs a decision
- bool Install(pkgCache::PkgIterator Pkg, Reason reason);
+ bool Install(pkgCache::PkgIterator Pkg, Reason reason, Group group);
// \brief Install a version.
- bool Install(pkgCache::VerIterator Ver, Reason reason);
+ bool Install(pkgCache::VerIterator Ver, Reason reason, Group group);
// \brief Do not install this package
- bool Reject(pkgCache::PkgIterator Pkg, Reason reason);
+ bool Reject(pkgCache::PkgIterator Pkg, Reason reason, Group group);
// \brief Do not install this version.
- bool Reject(pkgCache::VerIterator Ver, Reason reason);
+ bool Reject(pkgCache::VerIterator Ver, Reason reason, Group group);
// \brief Apply the selections from the dep cache to the solver
bool FromDepCache(pkgDepCache &depcache);
@@ -203,7 +242,8 @@ struct APT::Solver::Work
Reason reason;
// \brief The depth at which the item has been added
depth_type depth;
-
+ // \brief The group we are in
+ Group group;
// \brief Possible solutions to this task, ordered in order of preference.
std::vector<pkgCache::Version *> solutions{};
@@ -228,7 +268,7 @@ struct APT::Solver::Work
// \brief Dump the work item to std::cerr
void Dump(pkgCache &cache);
- inline Work(Reason reason, depth_type depth, bool optional = false, bool upgrade = false) : reason(reason), depth(depth), size(0), optional(optional), upgrade(upgrade), dirty(false) {}
+ inline Work(Reason reason, depth_type depth, Group group, bool optional = false, bool upgrade = false) : reason(reason), depth(depth), group(group), size(0), optional(optional), upgrade(upgrade), dirty(false) {}
};
// \brief This essentially describes the install state in RFC2119 terms.
diff --git a/apt-pkg/tagfile-keys.list b/apt-pkg/tagfile-keys.list
index 4b57e46..d198ea0 100644
--- a/apt-pkg/tagfile-keys.list
+++ b/apt-pkg/tagfile-keys.list
@@ -80,3 +80,4 @@ Vcs-Mtn
Vcs-Svn
Version
### APPEND BELOW, sort in with next ABI break ###
+Source-Version
diff --git a/cmdline/apt-key.in b/cmdline/apt-key.in
index 0752272..8738094 100644
--- a/cmdline/apt-key.in
+++ b/cmdline/apt-key.in
@@ -811,18 +811,8 @@ case "$command" in
exit 29
fi
GPGV_ARGS=""
- if [ "$ASSERT_PUBKEY_ALGO" ]; then
- test="$(LC_ALL=C.UTF-8 "$GPGV" --assert-pubkey-algo 2>&1 || :)"
- case "$test" in
- *"missing argument"*)
- GPGV_ARGS="--assert-pubkey-algo=$ASSERT_PUBKEY_ALGO"
- ;;
- *[Ii]"nvalid option"*"assert-pubkey-algo"*)
- ;;
- *)
- apt_warn "Unknown response from gpgv to --assert-pubkey-algo check: $test"
- ;;
- esac
+ if [ "$ASSERT_PUBKEY_ALGO" ] && $GPGV --dump-options | grep -q -- --assert-pubkey-algo; then
+ GPGV_ARGS="--assert-pubkey-algo=$ASSERT_PUBKEY_ALGO"
fi
# for a forced keyid we need gpg --export, so full wrapping required
if [ -n "$FORCED_KEYID" ]; then
diff --git a/doc/apt-verbatim.ent b/doc/apt-verbatim.ent
index c462ecd..f849c0c 100644
--- a/doc/apt-verbatim.ent
+++ b/doc/apt-verbatim.ent
@@ -274,7 +274,7 @@
">
<!-- this will be updated by 'prepare-release' -->
-<!ENTITY apt-product-version "2.9.4">
+<!ENTITY apt-product-version "2.9.5">
<!-- (Code)names for various things used all over the place -->
<!ENTITY debian-oldstable-codename "bullseye">
diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml
index e873cf5..702a71c 100644
--- a/doc/apt.conf.5.xml
+++ b/doc/apt.conf.5.xml
@@ -19,7 +19,7 @@
&apt-email;
&apt-product;
<!-- The last update date -->
- <date>2024-04-19T00:00:00Z</date>
+ <date>2024-05-30T00:00:00Z</date>
</refentryinfo>
<refmeta>
@@ -759,7 +759,7 @@ APT::Compressor::rev {
or <literal>Acquire::Snapshots::URI::Override::Origin::<replaceable>ORIGIN</replaceable></literal>.
The value should be a normal URI to a directory, except that the snapshot ID replaced with the
- placeholder <literal>@SNAPSHOTID</literal>.
+ placeholder <literal>@SNAPSHOTID@</literal>.
The special value '<literal>no</literal>' is available for this option indicating that
this source cannot be used to acquire snapshots from. Another source will be tried
diff --git a/doc/po/apt-doc.pot b/doc/po/apt-doc.pot
index aab31f7..979992b 100644
--- a/doc/po/apt-doc.pot
+++ b/doc/po/apt-doc.pot
@@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: apt-doc 2.9.4\n"
+"Project-Id-Version: apt-doc 2.9.5\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-05-25 09:01+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -4016,7 +4016,7 @@ msgid ""
"or "
"<literal>Acquire::Snapshots::URI::Override::Origin::<replaceable>ORIGIN</replaceable></literal>. "
"The value should be a normal URI to a directory, except that the snapshot ID "
-"replaced with the placeholder <literal>@SNAPSHOTID</literal>. The special "
+"replaced with the placeholder <literal>@SNAPSHOTID@</literal>. The special "
"value '<literal>no</literal>' is available for this option indicating that "
"this source cannot be used to acquire snapshots from. Another source will be "
"tried if available in this case."
diff --git a/doc/po/de.po b/doc/po/de.po
index 4675d12..ab02835 100644
--- a/doc/po/de.po
+++ b/doc/po/de.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt 2.0.1\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2020-04-04 08:45+0200\n"
"Last-Translator: Chris Leick <c.leick@vollbio.de>\n"
"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
@@ -5773,10 +5773,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
"Changelogs können nur beschafft werden, falls ein URI bekannt ist, von dem "
"sie geholt werden können. Vorzugsweise gibt die Release-Datei ihn in einem "
diff --git a/doc/po/es.po b/doc/po/es.po
index c3c6067..5e2dc92 100644
--- a/doc/po/es.po
+++ b/doc/po/es.po
@@ -38,7 +38,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 1.0.5\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2014-07-04 01:31+0200\n"
"Last-Translator: Omar Campagne <ocampagne@gmail.com>\n"
"Language-Team: Debian l10n Spanish <debian-l10n-spanish@lists.debian.org>\n"
@@ -5674,10 +5674,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
#. type: Content of: <refentry><refsect1><title>
diff --git a/doc/po/fr.po b/doc/po/fr.po
index d0419ec..d2166e3 100644
--- a/doc/po/fr.po
+++ b/doc/po/fr.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 1.8.0\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2019-05-01 17:00+0100\n"
"Last-Translator: Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>\n"
"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
@@ -5752,10 +5752,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
"La récupération des journaux des modifications n'est possible que si l'URI "
"où les télécharger est connu. De préférence, le fichier Release l'indique "
diff --git a/doc/po/it.po b/doc/po/it.po
index 120fd9f..20af323 100644
--- a/doc/po/it.po
+++ b/doc/po/it.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 1.0.5\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2017-03-27 19:05+0200\n"
"Last-Translator: Beatrice Torracca <beatricet@libero.it>\n"
"Language-Team: Italian <debian-l10n-italian@lists.debian.org>\n"
@@ -5743,10 +5743,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
"L'acquisizione di changelog è possibile solamente se è noto un URI da cui "
"ottenerli. Il file Release indica questa informazione preferibilmente in un "
diff --git a/doc/po/ja.po b/doc/po/ja.po
index ad96ef5..822c41c 100644
--- a/doc/po/ja.po
+++ b/doc/po/ja.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 1.4\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2017-01-06 04:50+0900\n"
"Last-Translator: Takuma Yamada <tyamada@takumayamada.com>\n"
"Language-Team: Japanese <debian-japanese@lists.debian.org>\n"
@@ -5535,10 +5535,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
"URI は、それらを取得する場所から知られている場合は、変更履歴の取得のみ行うこ"
"とができます。好ましいリリースファイルは、「変更履歴」フィールドでこのことを"
diff --git a/doc/po/nl.po b/doc/po/nl.po
index 0d45a86..f31bbcc 100644
--- a/doc/po/nl.po
+++ b/doc/po/nl.po
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: apt-doc 2.9.1\n"
+"Project-Id-Version: apt-doc 2.9.3\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-05-06 11:01+0000\n"
-"PO-Revision-Date: 2024-04-20 21:59+0200\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
+"PO-Revision-Date: 2024-05-21 23:41+0200\n"
"Last-Translator: Frans Spiesschaert <Frans.Spiesschaert@yucom.be>\n"
"Language-Team: Debian Dutch l10n Team <debian-l10n-dutch@lists.debian.org>\n"
"Language: nl\n"
@@ -143,15 +143,7 @@ msgstr ""
#. type: Plain text
#: apt.ent
-#, fuzzy, no-wrap
-#| msgid ""
-#| " <varlistentry>\n"
-#| " <term><option>-v</option></term>\n"
-#| " <term><option>--version</option></term>\n"
-#| " <listitem><para>Show the program version.\n"
-#| " </para>\n"
-#| " </listitem>\n"
-#| " </varlistentry>\n"
+#, no-wrap
msgid ""
" <varlistentry>\n"
" <term><option>--audit</option></term>\n"
@@ -161,9 +153,8 @@ msgid ""
" </varlistentry>\n"
msgstr ""
" <varlistentry>\n"
-" <term><option>-v</option></term>\n"
-" <term><option>--version</option></term>\n"
-" <listitem><para>Het versienummer van het programma weergeven.\n"
+" <term><option>--audit</option></term>\n"
+" <listitem><para>Controle- (en kennisgevings)berichten tonen. Dit heeft voorrang op de optie quiet, maar alleen voor waarschuwingsberichten, niet voor voortgangsberichten.\n"
" </para>\n"
" </listitem>\n"
" </varlistentry>\n"
@@ -199,19 +190,7 @@ msgstr ""
#. type: Plain text
#: apt.ent
-#, fuzzy, no-wrap
-#| msgid ""
-#| " <varlistentry>\n"
-#| " <term><option>-o</option></term>\n"
-#| " <term><option>--option</option></term>\n"
-#| " <listitem><para>Set a Configuration Option; This will set an arbitrary\n"
-#| " configuration option. The syntax is <option>-o Foo::Bar=bar</option>.\n"
-#| " <option>-o</option> and <option>--option</option> can be used multiple\n"
-#| " times to set different options.\n"
-#| " </para>\n"
-#| " </listitem>\n"
-#| " </varlistentry>\n"
-#| "\">\n"
+#, no-wrap
msgid ""
" <varlistentry>\n"
" <term><option>-o</option></term>\n"
@@ -234,23 +213,10 @@ msgstr ""
" </para>\n"
" </listitem>\n"
" </varlistentry>\n"
-"\">\n"
#. type: Plain text
#: apt.ent
-#, fuzzy, no-wrap
-#| msgid ""
-#| " <varlistentry>\n"
-#| " <term><option>-o</option></term>\n"
-#| " <term><option>--option</option></term>\n"
-#| " <listitem><para>Set a Configuration Option; This will set an arbitrary\n"
-#| " configuration option. The syntax is <option>-o Foo::Bar=bar</option>.\n"
-#| " <option>-o</option> and <option>--option</option> can be used multiple\n"
-#| " times to set different options.\n"
-#| " </para>\n"
-#| " </listitem>\n"
-#| " </varlistentry>\n"
-#| "\">\n"
+#, no-wrap
msgid ""
" <varlistentry>\n"
" <term><option>--no-color</option></term>\n"
@@ -264,12 +230,11 @@ msgid ""
"\">\n"
msgstr ""
" <varlistentry>\n"
-" <term><option>-o</option></term>\n"
-" <term><option>--option</option></term>\n"
-" <listitem><para>Een configuratieoptie instellen; Dit stelt een\n"
-" willekeurige configuratieoptie in. De syntaxis is <option>-o Foo::Bar=bar</option>.\n"
-" <option>-o</option> en <option>--option</option> kunnen meermaals\n"
-" gebruikt worden om verschillende opties in te stellen.\n"
+" <term><option>--no-color</option></term>\n"
+" <term><option>--color</option></term>\n"
+"<listitem><para>Kleur aan- of uitzetten. Kleur staat standaard aan voor &apt; op ondersteunde terminals en\n"
+"kan ook uitgezet worden met de omgevingsvariabelen <envar>NO_COLOR</envar> en <envar>APT_NO_COLOR</envar>,\n"
+"of verder geconfigureerd worden met de configuratieoptie en -scope <option>APT::Color</option>; zie &apt-conf; voor informatie hierover.\n"
" </para>\n"
" </listitem>\n"
" </varlistentry>\n"
@@ -4784,6 +4749,10 @@ msgid ""
"<option>blue</option>, <option>magenta</option>, <option>cyan</option>, and "
"<option>white</option>."
msgstr ""
+"Deze scoop definieert kleuren en stijlen. De ondersteunde basiskleuren zijn "
+"<option>rood</option>, <option>groen</option>, <option>geel</option>, "
+"<option>blauw</option>, <option>magenta</option>, <option>cyaan</option> en "
+"<option>wit</option>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt.conf.5.xml
@@ -4795,6 +4764,13 @@ msgid ""
"option>, <option>APT::Color::Action::Downgrade</option>, <option>APT::Color::"
"Action::Remove</option>; corresponding to their lists in the &apt; output."
msgstr ""
+"De subscoop <option>action</option> definieert de kleuren voor pakketlijsten "
+"in <option>install</option> en gelijkaardige commando's. De volgende opties "
+"kunnen ingesteld worden: <option>APT::Color::Action::Upgrade</option>, "
+"<option>APT::Color::Action::Install</option>, <option>APT::Color::Action::"
+"Install-Dependencies</option>, <option>APT::Color::Action::Downgrade</"
+"option>, <option>APT::Color::Action::Remove</option>; die overeenkomen met "
+"hun lijsten in de uitvoer van &apt;."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt.conf.5.xml
@@ -4802,6 +4778,9 @@ msgid ""
"Each color may reference one or more other color options by name, relative "
"to <option>APT::Color</option>. Their escape sequences will be combined."
msgstr ""
+"Elke kleur kan bij naam verwijzen naar een of meer andere kleuropties, "
+"relatief ten opzichte van <option>APT::Color</option>. Hun escape-sequenties "
+"worden gecombineerd."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><informalexample><programlisting>
#: apt.conf.5.xml
@@ -4812,6 +4791,10 @@ msgid ""
"APT::Color::Action::Upgrade \"bold action::install\";\n"
" "
msgstr ""
+"APT::Color::Bold \"\\x1B[1m\";\n"
+"APT::Color::Action::Install \"cyan\";\n"
+"APT::Color::Action::Upgrade \"bold action::install\";\n"
+" "
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt.conf.5.xml
@@ -4822,6 +4805,11 @@ msgid ""
"variables, or using the <option>--color</option>, <option>--no-color</"
"option> command-line options."
msgstr ""
+"Kleuren kunnen volledig worden in- of uitgeschakeld door <option>APT::Color</"
+"option> in te stellen op <option>yes</option> of <option>no</option>, door "
+"gebruik te maken van de omgevingsvariabelen <envar>NO_COLOR</envar> of "
+"<envar>APT_NO_COLOR</envar>, of met behulp van de commandoregelopties "
+"<option>--color</option>, <option>--no-color</option>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt.conf.5.xml
@@ -5876,6 +5864,23 @@ msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt.conf.5.xml
+#, fuzzy
+#| msgid ""
+#| "Like changelogs, snapshots can only be acquired if an URI is known from "
+#| "where to get them. Preferable the Release file indicates this in a "
+#| "'Snapshots' field. If this isn't available the Label/Origin field of the "
+#| "Release file is used to check if a <literal>Acquire::Snapshots::URI::"
+#| "Label::<replaceable>LABEL</replaceable></literal> or <literal>Acquire::"
+#| "Snapshots::URI::Origin::<replaceable>ORIGIN</replaceable></literal> "
+#| "option exists and if so this value is taken. The value in the Release "
+#| "file can be overridden with <literal>Acquire::Snapshots::URI::Override::"
+#| "Label::<replaceable>LABEL</replaceable></literal> or <literal>Acquire::"
+#| "Snapshots::URI::Override::Origin::<replaceable>ORIGIN</replaceable></"
+#| "literal>. The value should be a normal URI to a directory, except that "
+#| "the snapshot ID replaced with the placeholder <literal>@SNAPSHOTID</"
+#| "literal>. The special value '<literal>no</literal>' is available for "
+#| "this option indicating that this source cannot be used to acquire "
+#| "snapshots from. Another source will be tried if available in this case."
msgid ""
"Like changelogs, snapshots can only be acquired if an URI is known from "
"where to get them. Preferable the Release file indicates this in a "
@@ -5888,10 +5893,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
"Zoals changelogs (bestanden met de registratie van aangebrachte wijzigingen) "
"kunnen momentopnames enkel verkregen worden als er een URI gekend is waar ze "
diff --git a/doc/po/pl.po b/doc/po/pl.po
index c3ef57e..92574fd 100644
--- a/doc/po/pl.po
+++ b/doc/po/pl.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 1.0.5\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2014-07-04 02:13+0200\n"
"Last-Translator: Robert Luberda <robert@debian.org>\n"
"Language-Team: Polish <manpages-pl-list@lists.sourceforge.net>\n"
@@ -5328,10 +5328,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
#. type: Content of: <refentry><refsect1><title>
diff --git a/doc/po/pt.po b/doc/po/pt.po
index 67a70d9..715f80c 100644
--- a/doc/po/pt.po
+++ b/doc/po/pt.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt 2.7.3\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2023-09-11 20:47+0100\n"
"Last-Translator: Américo Monteiro <a_monteiro@gmx.com>\n"
"Language-Team: Portuguese <>\n"
@@ -5708,6 +5708,23 @@ msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt.conf.5.xml
+#, fuzzy
+#| msgid ""
+#| "Like changelogs, snapshots can only be acquired if an URI is known from "
+#| "where to get them. Preferable the Release file indicates this in a "
+#| "'Snapshots' field. If this isn't available the Label/Origin field of the "
+#| "Release file is used to check if a <literal>Acquire::Snapshots::URI::"
+#| "Label::<replaceable>LABEL</replaceable></literal> or <literal>Acquire::"
+#| "Snapshots::URI::Origin::<replaceable>ORIGIN</replaceable></literal> "
+#| "option exists and if so this value is taken. The value in the Release "
+#| "file can be overridden with <literal>Acquire::Snapshots::URI::Override::"
+#| "Label::<replaceable>LABEL</replaceable></literal> or <literal>Acquire::"
+#| "Snapshots::URI::Override::Origin::<replaceable>ORIGIN</replaceable></"
+#| "literal>. The value should be a normal URI to a directory, except that "
+#| "the snapshot ID replaced with the placeholder <literal>@SNAPSHOTID</"
+#| "literal>. The special value '<literal>no</literal>' is available for "
+#| "this option indicating that this source cannot be used to acquire "
+#| "snapshots from. Another source will be tried if available in this case."
msgid ""
"Like changelogs, snapshots can only be acquired if an URI is known from "
"where to get them. Preferable the Release file indicates this in a "
@@ -5720,10 +5737,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
"Tal como changelogs, os instantâneos só podem ser adquiridos se for "
"conhecido um URI de onde os obter. Preferencialmente o ficheiro Release "
diff --git a/doc/po/pt_BR.po b/doc/po/pt_BR.po
index 313bfaf..86fb117 100644
--- a/doc/po/pt_BR.po
+++ b/doc/po/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 1.0.5\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-04-22 17:38+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: 2004-09-20 17:02+0000\n"
"Last-Translator: André Luís Lopes <andrelop@debian.org>\n"
"Language-Team: <debian-l10n-portuguese@lists.debian.org>\n"
@@ -3960,10 +3960,10 @@ msgid ""
"replaceable></literal> or <literal>Acquire::Snapshots::URI::Override::"
"Origin::<replaceable>ORIGIN</replaceable></literal>. The value should be a "
"normal URI to a directory, except that the snapshot ID replaced with the "
-"placeholder <literal>@SNAPSHOTID</literal>. The special value '<literal>no</"
-"literal>' is available for this option indicating that this source cannot be "
-"used to acquire snapshots from. Another source will be tried if available in "
-"this case."
+"placeholder <literal>@SNAPSHOTID@</literal>. The special value "
+"'<literal>no</literal>' is available for this option indicating that this "
+"source cannot be used to acquire snapshots from. Another source will be "
+"tried if available in this case."
msgstr ""
#. type: Content of: <refentry><refsect1><title>
diff --git a/po/apt-all.pot b/po/apt-all.pot
index bafe73e..51f7bf3 100644
--- a/po/apt-all.pot
+++ b/po/apt-all.pot
@@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: apt 2.9.4\n"
+"Project-Id-Version: apt 2.9.5\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-05-25 09:01+0000\n"
+"POT-Creation-Date: 2024-06-13 19:06+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/po/nl.po b/po/nl.po
index 488cbfa..780f869 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -13,10 +13,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: apt 2.9.1\n"
+"Project-Id-Version: apt 2.9.3\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2024-05-25 09:01+0000\n"
-"PO-Revision-Date: 2024-04-20 20:28+0200\n"
+"POT-Creation-Date: 2024-06-11 12:57+0000\n"
+"PO-Revision-Date: 2024-05-21 22:12+0200\n"
"Last-Translator: Frans Spiesschaert <Frans.Spiesschaert@yucom.be>\n"
"Language-Team: Debian Dutch l10n Team <debian-l10n-dutch@lists.debian.org>\n"
"Language: nl\n"
@@ -258,6 +258,8 @@ msgid ""
"Repositories should provide a clear-signed InRelease file, but none found at "
"%s."
msgstr ""
+"Pakketbronnen zouden een duidelijk ondertekend InRelease-bestand moeten "
+"leveren, maar er is er geen gevonden op %s."
#: apt-pkg/acquire-item.cc
#, c-format
@@ -706,26 +708,26 @@ msgstr "Syntactische fout %s:%u: extra rommel aan het einde van het bestand"
#. TRANSLATOR: This is a warning level displayed before the message
#: apt-pkg/contrib/error.cc
msgid "Error:"
-msgstr ""
+msgstr "Fout:"
#. TRANSLATOR: This is a warning level displayed before the message
#: apt-pkg/contrib/error.cc
msgid "Warning:"
-msgstr ""
+msgstr "Waarschuwing:"
#. TRANSLATOR: This is a warning level displayed before the message
#: apt-pkg/contrib/error.cc
msgid "Notice:"
-msgstr ""
+msgstr "Kennisgeving:"
#: apt-pkg/contrib/error.cc
msgid "Audit:"
-msgstr ""
+msgstr "Controle:"
#. TRANSLATOR: This is a warning level displayed before the message
#: apt-pkg/contrib/error.cc
msgid "Debug:"
-msgstr ""
+msgstr "Debug:"
#: apt-pkg/contrib/extracttar.cc
#, c-format
diff --git a/test/integration/run-tests b/test/integration/run-tests
index 3100e8e..331adfc 100755
--- a/test/integration/run-tests
+++ b/test/integration/run-tests
@@ -31,7 +31,7 @@ while [ -n "$1" ]; do
elif [ "$1" = '--only' ]; then
TESTLIST="$2"
shift
- elif [ -x "$1" ]; then
+ elif [ -e "$1" ]; then
TESTTORUN="$1"
else
echo >&2 "WARNING: Unknown parameter »$1« will be ignored"
diff --git a/test/integration/test-bug-64141-install-dependencies-for-on-hold b/test/integration/test-bug-64141-install-dependencies-for-on-hold
index 2565c94..1ad1952 100755
--- a/test/integration/test-bug-64141-install-dependencies-for-on-hold
+++ b/test/integration/test-bug-64141-install-dependencies-for-on-hold
@@ -5,6 +5,7 @@ TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
setupenvironment
configarchitecture 'native' 'strange-arch'
+native=$(getarchitecture 'native')
insertpackage 'unstable' 'unrelated' 'strange-arch' '1'
@@ -33,7 +34,7 @@ After this operation, 0 B of additional disk space will be used.
E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only --solver 3.0
testfailure aptget dist-upgrade --trivial-only --solver 3.0 -o debug::apt::solver=2
-testsuccess grep -Fx 'Branch failed: Conflict: apt:amd64 -> apt:amd64=0.8.10 -> not oldcrap:amd64=1-1 but oldcrap:amd64 -> oldcrap:amd64=1-1' rootdir/tmp/testfailure.output
+testsuccess grep -Fx "Branch failed: Conflict: apt:$native -> apt:$native=0.8.10 -> not oldcrap:$native=1-1 but oldcrap:$native -> oldcrap:$native=1-1" rootdir/tmp/testfailure.output
allowremovemanual
diff --git a/test/integration/test-prefer-higher-priority-providers b/test/integration/test-prefer-higher-priority-providers
index 6f07db5..5fed20a 100755
--- a/test/integration/test-prefer-higher-priority-providers
+++ b/test/integration/test-prefer-higher-priority-providers
@@ -5,6 +5,7 @@ TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
setupenvironment
configarchitecture 'native'
+native=$(getarchitecture 'native')
insertpackage 'unstable' 'foo' 'all' '1' 'Provides: stuff' 'important'
insertpackage 'unstable' 'bar' 'all' '1' 'Provides: stuff' 'optional'
@@ -90,10 +91,10 @@ Inst awesome (1 unstable [all])
Conf baz (1 unstable [all])
Conf awesome (1 unstable [all])" aptget install awesome foo- bar- -s
-testfailuremsg "E: Unsatisfiable dependency: awesome:amd64=1 -> foo:amd64=1 | bar:amd64=1 | baz:amd64=1
-E: Not considered: foo:amd64=1: not foo:amd64 -> not foo:amd64=1
-E: Not considered: bar:amd64=1: not bar:amd64 -> not bar:amd64=1
-E: Not considered: baz:amd64=1: not baz:amd64 -> not baz:amd64=1" aptget install awesome foo- bar- baz- -s --solver 3.0
+testfailuremsg "E: Unsatisfiable dependency: awesome:$native=1 -> foo:$native=1 | bar:$native=1 | baz:$native=1
+E: Not considered: foo:$native=1: not foo:$native -> not foo:$native=1
+E: Not considered: bar:$native=1: not bar:$native -> not bar:$native=1
+E: Not considered: baz:$native=1: not baz:$native -> not baz:$native=1" aptget install awesome foo- bar- baz- -s --solver 3.0
testfailureequal "Reading package lists...
Building dependency tree...
Package 'foo' is not installed, so not removed
diff --git a/test/integration/test-resolver-provider-exchange b/test/integration/test-resolver-provider-exchange
index 45d9369..2874b88 100755
--- a/test/integration/test-resolver-provider-exchange
+++ b/test/integration/test-resolver-provider-exchange
@@ -8,6 +8,7 @@ allowremovemanual
configarchitecture 'amd64'
insertinstalledpackage 'fuse' 'all' '2'
+insertpackage 'unstable' 'fuse' 'all' '2'
insertpackage 'unstable' 'fuse3' 'all' '3' 'Conflicts: fuse
Provides: fuse'