From e725fd6969b7dc9bc2a5e57f241243ff7a98b3fd Mon Sep 17 00:00:00 2001 From: Lorenzo Palinuro Faletra Date: Thu, 14 May 2020 19:11:03 +0200 Subject: [PATCH] Import Debian version 2.1.1+parrot1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit apt (2.1.1+parrot1) rolling; urgency=medium * Import new Debian release. apt (2.1.1) unstable; urgency=medium [ David Kalnischkies ] * Allow aptitude to MarkInstall broken packages via FromUser * Drop nowrap from po4a --porefs as it is no longer supported * Use "po4a --porefs file" instead of undocumented compat noline [ Artur Grącki ] * Fix typo in Polish translation of --help messages apt (2.1.0) unstable; urgency=medium [ Frans Spiesschaert ] * Dutch manpages translation update (Closes: #956313) [ David Kalnischkies ] * Refactor MarkInstall fixing various or-group handling issues - Discard impossible candidate versions also for non-installed - Explore or-groups for Recommends further than first - Refactor and reorder MarkInstall code - Discard candidate if its dependencies can't be satisfied - Split up MarkInstall into private helper methods - Fail earlier on impossible Conflicts in MarkInstall - Propagate Protected flag to single-option dependencies - Prefer upgrading installed orgroup members - Protect a package while resolving in MarkInstall [ Julian Andres Klode ] * Reinstate * wildcards (Closes: #953531) (LP: #1872200) * apt list: Fix behavior of regex vs fnmatch vs wildcards --- CMake/Documentation.cmake | 2 +- CMakeLists.txt | 2 +- apt-pkg/cacheset.cc | 7 +- apt-pkg/depcache.cc | 516 +++++---- apt-pkg/depcache.h | 12 + apt-pkg/pkgcache.h | 6 +- apt-pkg/policy.cc | 4 +- apt-private/private-list.cc | 9 +- debian/changelog | 41 + doc/apt-verbatim.ent | 2 +- doc/po/apt-doc.pot | 54 +- doc/po/nl.po | 981 ++++-------------- methods/basehttp-orig.cc | 908 ++++++++++++++++ methods/basehttp.cc | 2 +- po/apt-all.pot | 4 +- po/pl.po | 6 +- ...test-allow-scores-for-all-dependency-types | 34 +- .../test-apt-never-markauto-sections | 11 +- test/integration/test-apt-patterns | 34 + .../test-bug-604222-new-and-autoremove | 3 +- ...st-bug-618848-always-respect-user-requests | 2 - .../test-bug-735967-lib32-to-i386-unavailable | 4 +- .../test-explore-or-groups-in-markinstall | 130 +++ test/integration/test-multiarch-allowed | 11 +- 24 files changed, 1720 insertions(+), 1065 deletions(-) create mode 100644 methods/basehttp-orig.cc create mode 100755 test/integration/test-explore-or-groups-in-markinstall diff --git a/CMake/Documentation.cmake b/CMake/Documentation.cmake index d8a2d2c..1df0960 100644 --- a/CMake/Documentation.cmake +++ b/CMake/Documentation.cmake @@ -318,7 +318,7 @@ function(add_update_po4a target pot header) add_custom_target(${target} COMMAND po4a --previous --no-backups --force --no-translations --msgmerge-opt --add-location=file - --porefs noline,wrap + --porefs file --package-name=${PROJECT_NAME}-doc --package-version=${PACKAGE_VERSION} --msgid-bugs-address=${PACKAGE_MAIL} po4a.conf ${WRITE_HEADER} diff --git a/CMakeLists.txt b/CMakeLists.txt index 41a8877..e98a166 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,7 +204,7 @@ check_cxx_target(HAVE_FMV_SSE42_AND_CRC32DI "sse4.2" "__builtin_ia32_crc32di(0, # Configure some variables like package, version and architecture. set(PACKAGE ${PROJECT_NAME}) set(PACKAGE_MAIL "APT Development Team ") -set(PACKAGE_VERSION "2.0.2") +set(PACKAGE_VERSION "2.1.1") string(REGEX MATCH "^[0-9.]+" PROJECT_VERSION ${PACKAGE_VERSION}) if (NOT DEFINED DPKG_DATADIR) diff --git a/apt-pkg/cacheset.cc b/apt-pkg/cacheset.cc index 288180f..3967ba9 100644 --- a/apt-pkg/cacheset.cc +++ b/apt-pkg/cacheset.cc @@ -189,8 +189,11 @@ bool CacheSetHelper::PackageFromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) { static const char * const isfnmatch = ".?*[]!"; - if (_config->FindB("APT::Cmd::Pattern-Only", false)) - return false; + // Whitelist approach: Anything not in here is not a valid pattern + static const char *const isfnmatch_strict = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.:*"; + + if (_config->FindB("APT::Cmd::Pattern-Only", false) && pattern.find_first_not_of(isfnmatch_strict) != std::string::npos) + return false; if (pattern.find_first_of(isfnmatch) == std::string::npos) return false; diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 052e3de..f86ae7d 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -980,10 +981,8 @@ bool pkgDepCache::IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg, return true; } /*}}}*/ -// DepCache::MarkInstall - Put the package in the install state /*{{{*/ -// --------------------------------------------------------------------- -/* */ -struct CompareProviders { +struct CompareProviders /*{{{*/ +{ pkgCache::PkgIterator const Pkg; explicit CompareProviders(pkgCache::DepIterator const &Dep) : Pkg(Dep.TargetPkg()) {}; //bool operator() (APT::VersionList::iterator const &AV, APT::VersionList::iterator const &BV) @@ -1020,83 +1019,58 @@ struct CompareProviders { } } if (instA != instB) - return instA == false; + return instA; } if ((A->CurrentVer == 0 || B->CurrentVer == 0) && A->CurrentVer != B->CurrentVer) - return A->CurrentVer == 0; + return A->CurrentVer != 0; // Prefer packages in the same group as the target; e.g. foo:i386, foo:amd64 if (A->Group != B->Group) { if (A->Group == Pkg->Group && B->Group != Pkg->Group) - return false; - else if (B->Group == Pkg->Group && A->Group != Pkg->Group) return true; + else if (B->Group == Pkg->Group && A->Group != Pkg->Group) + return false; } // we like essentials if ((A->Flags & pkgCache::Flag::Essential) != (B->Flags & pkgCache::Flag::Essential)) { if ((A->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) - return false; - else if ((B->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) return true; + else if ((B->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) + return false; } if ((A->Flags & pkgCache::Flag::Important) != (B->Flags & pkgCache::Flag::Important)) { if ((A->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important) - return false; - else if ((B->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important) return true; + else if ((B->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important) + return false; } // prefer native architecture if (strcmp(A.Arch(), B.Arch()) != 0) { if (strcmp(A.Arch(), A.Cache()->NativeArch()) == 0) - return false; - else if (strcmp(B.Arch(), B.Cache()->NativeArch()) == 0) return true; + else if (strcmp(B.Arch(), B.Cache()->NativeArch()) == 0) + return false; std::vector archs = APT::Configuration::getArchitectures(); for (std::vector::const_iterator a = archs.begin(); a != archs.end(); ++a) if (*a == A.Arch()) - return false; - else if (*a == B.Arch()) return true; + else if (*a == B.Arch()) + return false; } // higher priority seems like a good idea if (AV->Priority != BV->Priority) - return AV->Priority > BV->Priority; + return AV->Priority < BV->Priority; // unable to decide… - return A->ID < B->ID; + return A->ID > B->ID; } }; -bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, - unsigned long Depth, bool FromUser, - bool ForceImportantDeps) + /*}}}*/ +bool pkgDepCache::MarkInstall_StateChange(PkgIterator const &Pkg, bool AutoInst, bool FromUser) /*{{{*/ { - if (IsModeChangeOk(ModeInstall, Pkg, Depth, FromUser) == false) - return false; - StateCache &P = PkgState[Pkg->ID]; - - // See if there is even any possible installation candidate - if (P.CandidateVer == 0) - return false; - - /* Check that it is not already marked for install and that it can be - installed */ - if ((P.InstPolicyBroken() == false && P.InstBroken() == false) && - (P.Mode == ModeInstall || - P.CandidateVer == (Version *)Pkg.CurrentVer())) - { - if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0) - return MarkKeep(Pkg, false, FromUser, Depth+1); - return true; - } - - // check if we are allowed to install the package - if (IsInstallOk(Pkg,AutoInst,Depth,FromUser) == false) - return false; - - ActionGroup group(*this); P.iFlags &= ~AutoKept; /* Target the candidate version and remove the autoflag. We reset the @@ -1104,7 +1078,7 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, should have the ability to de-auto a package by changing its state */ RemoveSizes(Pkg); RemoveStates(Pkg); - + P.Mode = ModeInstall; P.InstallVer = P.CandidateVer; @@ -1124,74 +1098,114 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, } if (P.CandidateVer == (Version *)Pkg.CurrentVer()) P.Mode = ModeKeep; - + AddStates(Pkg); Update(Pkg); AddSizes(Pkg); + return true; +} + /*}}}*/ +bool pkgDepCache::MarkInstall_CollectDependencies(pkgCache::VerIterator const &PV, std::vector &toInstall, std::vector &toRemove) /*{{{*/ +{ + for (auto Dep = PV.DependsList(); not Dep.end();) + { + auto const Start = Dep; + // check if an installed package satisfies the dependency (and get the extend of the or-group) + bool foundSolution = false; + for (bool LastOR = true; not Dep.end() && LastOR; ++Dep) + { + LastOR = (Dep->CompareOp & Dep::Or) == Dep::Or; + if ((DepState[Dep->ID] & DepInstall) == DepInstall) + foundSolution = true; + } + if (foundSolution) + continue; - if (AutoInst == false || _config->Find("APT::Solver", "internal") != "internal") - return true; - - if (DebugMarker == true) - std::clog << OutputInDepth(Depth) << "MarkInstall " << APT::PrettyPkg(this, Pkg) << " FU=" << FromUser << std::endl; + /* Check if this dep should be consider for install. + (Pre-)Depends, Conflicts and Breaks for sure. + Recommends & Suggests depending on configuration */ + if (not IsImportantDep(Start)) + continue; - bool MoveAutoBitToDependencies = false; - VerIterator const PV = P.InstVerIter(*this); - if (unlikely(PV.end() == true)) - return false; - else if (PV->Section != 0 && (P.Flags & Flag::Auto) != Flag::Auto) + if (Start.IsNegative()) + { + if (Start->Type != pkgCache::Dep::Obsoletes) + toRemove.push_back(Start); + } + else + toInstall.push_back(Start); + } + return true; +} + /*}}}*/ +bool pkgDepCache::MarkInstall_RemoveConflictsIfNotUpgradeable(pkgCache::VerIterator const &PV, unsigned long Depth, std::vector &toRemove, APT::PackageVector &toUpgrade) /*{{{*/ +{ + /* Negative dependencies have no or-group + If the dependency isn't versioned, we try if an upgrade might solve the problem. + Otherwise we remove the offender if needed */ + for (auto const &D : toRemove) { - VerIterator const CurVer = Pkg.CurrentVer(); - if (CurVer.end() == false && CurVer->Section != 0 && strcmp(CurVer.Section(), PV.Section()) != 0) + std::unique_ptr List(D.AllTargets()); + pkgCache::PkgIterator TrgPkg = D.TargetPkg(); + for (Version **I = List.get(); *I != 0; I++) { - bool const CurVerInMoveSection = ConfigValueInSubTree("APT::Move-Autobit-Sections", CurVer.Section()); - bool const InstVerInMoveSection = ConfigValueInSubTree("APT::Move-Autobit-Sections", PV.Section()); - MoveAutoBitToDependencies = (CurVerInMoveSection == false && InstVerInMoveSection == true); - if (MoveAutoBitToDependencies == true) + VerIterator Ver(*this, *I); + PkgIterator Pkg = Ver.ParentPkg(); + + /* The List includes all packages providing this dependency, + even providers which are not installed, so skip them. */ + if (PkgState[Pkg->ID].InstallVer == 0) + continue; + + // Ignore negative dependencies on versions that are not going to get installed + if (PkgState[Pkg->ID].InstallVer != *I) + continue; + + if ((D->Version != 0 || TrgPkg != Pkg) && + PkgState[Pkg->ID].CandidateVer != PkgState[Pkg->ID].InstallVer && + PkgState[Pkg->ID].CandidateVer != *I) + toUpgrade.push_back(Pkg); + else { if(DebugAutoInstall == true) - std::clog << OutputInDepth(Depth) << "Setting " << Pkg.FullName(false) << " as auto-installed, moving manual to its dependencies" << std::endl; - MarkAuto(Pkg, true); + std::clog << OutputInDepth(Depth) << " Removing: " << Pkg.Name() << " as upgrade is not an option for " << PV.ParentPkg().FullName() << "(" << PV.VerStr() << ")\n"; + if (not MarkDelete(Pkg, false, Depth + 1, false)) + return false; + if (PkgState[PV.ParentPkg()->ID].Protect()) + MarkProtected(Pkg); } } } - - DepIterator Dep = PV.DependsList(); - for (; Dep.end() != true;) - { - // Grok or groups - DepIterator Start = Dep; - bool Result = true; - unsigned Ors = 0; - for (bool LastOR = true; Dep.end() == false && LastOR == true; ++Dep, ++Ors) + toRemove.clear(); + return true; +} + /*}}}*/ +bool pkgDepCache::MarkInstall_UpgradeOrRemoveConflicts(bool const propagateProctected, unsigned long Depth, bool const ForceImportantDeps, APT::PackageVector &toUpgrade) /*{{{*/ +{ + for (auto const &InstPkg : toUpgrade) + if (not MarkInstall(InstPkg, true, Depth + 1, false, ForceImportantDeps)) { - LastOR = (Dep->CompareOp & Dep::Or) == Dep::Or; - - if ((DepState[Dep->ID] & DepInstall) == DepInstall) - Result = false; + if (DebugAutoInstall) + std::clog << OutputInDepth(Depth) << " Removing: " << InstPkg.FullName() << " as upgrade is not possible\n"; + if (not MarkDelete(InstPkg, false, Depth + 1, false)) + return false; + if (propagateProctected) + MarkProtected(InstPkg); } - - // Dep is satisfied okay. - if (Result == false) - continue; - - /* Check if this dep should be consider for install. If it is a user - defined important dep and we are installed a new package then - it will be installed. Otherwise we only check for important - deps that have changed from the installed version */ - if (IsImportantDep(Start) == false) - continue; - - /* If we are in an or group locate the first or that can - succeed. We have already cached this… */ - for (; Ors > 1 && (DepState[Start->ID] & DepCVer) != DepCVer; --Ors) - ++Start; - - /* unsatisfiable dependency: IsInstallOkDependenciesSatisfiableByCandidates - would have prevented us to get here if not overridden, so just skip - over the problem here as the front-end will know what it is doing */ - if (Ors == 1 && (DepState[Start->ID] &DepCVer) != DepCVer && Start.IsNegative() == false) + toUpgrade.clear(); + return true; +} + /*}}}*/ +bool pkgDepCache::MarkInstall_InstallDependencies(PkgIterator const &Pkg, unsigned long Depth, bool const ForceImportantDeps, std::vector &toInstall, APT::PackageVector *const toMoveAuto, bool const propagateProctected, bool const FromUser) /*{{{*/ +{ + auto const IsSatisfiedByInstalled = [&](auto const D) { return (DepState[D.ID] & DepInstall) == DepInstall; }; + for (auto &&Dep : toInstall) + { + pkgDepCache::DepIterator Start, End; + Dep.GlobOr(Start, End); + if (std::any_of(Start, Dep, IsSatisfiedByInstalled)) continue; + bool const IsCriticalDep = Start.IsCritical(); /* Check if any ImportantDep() (but not Critical) were added * since we installed the package. Also check for deps that @@ -1200,7 +1214,7 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, * package should follow that Recommends rather than causing the * dependency to be removed. (bug #470115) */ - if (Pkg->CurrentVer != 0 && ForceImportantDeps == false && Start.IsCritical() == false) + if (Pkg->CurrentVer != 0 && not ForceImportantDeps && not IsCriticalDep) { bool isNewImportantDep = true; bool isPreviouslySatisfiedImportantDep = false; @@ -1209,7 +1223,7 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, //FIXME: Should we handle or-group better here? // We do not check if the package we look for is part of the same or-group // we might find while searching, but could that really be a problem? - if (D.IsCritical() == true || IsImportantDep(D) == false || + if (D.IsCritical() || not IsImportantDep(D) || Start.TargetPkg() != D.TargetPkg()) continue; @@ -1219,113 +1233,212 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, ++D; isPreviouslySatisfiedImportantDep = (((*this)[D] & DepGNow) != 0); - if (isPreviouslySatisfiedImportantDep == true) + if (isPreviouslySatisfiedImportantDep) break; } - if(isNewImportantDep == true) + if (isNewImportantDep) { - if (DebugAutoInstall == true) + if (DebugAutoInstall) std::clog << OutputInDepth(Depth) << "new important dependency: " - << Start.TargetPkg().FullName() << std::endl; + << Start.TargetPkg().FullName() << '\n'; } - else if(isPreviouslySatisfiedImportantDep == true) + else if (isPreviouslySatisfiedImportantDep) { - if (DebugAutoInstall == true) + if (DebugAutoInstall) std::clog << OutputInDepth(Depth) << "previously satisfied important dependency on " - << Start.TargetPkg().FullName() << std::endl; + << Start.TargetPkg().FullName() << '\n'; } else { - if (DebugAutoInstall == true) + if (DebugAutoInstall) std::clog << OutputInDepth(Depth) << "ignore old unsatisfied important dependency on " - << Start.TargetPkg().FullName() << std::endl; + << Start.TargetPkg().FullName() << '\n'; continue; } } - /* This bit is for processing the possibility of an install/upgrade - fixing the problem for "positive" dependencies */ - if (Start.IsNegative() == false && (DepState[Start->ID] & DepCVer) == DepCVer) + pkgCacheFile CacheFile{this}; + APT::PackageVector toUpgrade, toNewInstall; + do { - pkgCacheFile CacheFile(this); - APT::VersionList verlist = APT::VersionList::FromDependency(CacheFile, Start, APT::CacheSetHelper::CANDIDATE); - CompareProviders comp(Start); - - do { - APT::VersionList::iterator InstVer = std::max_element(verlist.begin(), verlist.end(), comp); + if ((DepState[Start->ID] & DepCVer) != DepCVer) + continue; - if (InstVer == verlist.end()) - break; + APT::VersionVector verlist = APT::VersionVector::FromDependency(CacheFile, Start, APT::CacheSetHelper::CANDIDATE); + std::sort(verlist.begin(), verlist.end(), CompareProviders{Start}); + for (auto const &Ver : verlist) + { + auto P = Ver.ParentPkg(); + if (P->CurrentVer != 0) + toUpgrade.emplace_back(std::move(P)); + else + toNewInstall.emplace_back(std::move(P)); + } + } while (Start++ != End); - pkgCache::PkgIterator InstPkg = InstVer.ParentPkg(); - if(DebugAutoInstall == true) - std::clog << OutputInDepth(Depth) << "Installing " << InstPkg.Name() - << " as " << Start.DepType() << " of " << Pkg.Name() - << std::endl; - if (MarkInstall(InstPkg, true, Depth + 1, false, ForceImportantDeps) == false) - { - verlist.erase(InstVer); + std::move(toNewInstall.begin(), toNewInstall.end(), std::back_inserter(toUpgrade)); + bool foundSolution = false; + for (auto const &InstPkg : toUpgrade) + { + if (PkgState[InstPkg->ID].CandidateVer == nullptr || PkgState[InstPkg->ID].CandidateVer == InstPkg.CurrentVer()) + continue; + if (DebugAutoInstall) + std::clog << OutputInDepth(Depth) << "Installing " << InstPkg.FullName() + << " as " << End.DepType() << " of " << Pkg.FullName() << '\n'; + if (propagateProctected && IsCriticalDep && toUpgrade.size() == 1) + { + if (not MarkInstall(InstPkg, false, Depth + 1, false, ForceImportantDeps)) continue; - } - - // now check if we should consider it a automatic dependency or not - if(InstPkg->CurrentVer == 0 && MoveAutoBitToDependencies) - { - if(DebugAutoInstall == true) - std::clog << OutputInDepth(Depth) << "Setting " << InstPkg.FullName(false) << " NOT as auto-installed (direct " - << Start.DepType() << " of " << Pkg.FullName(false) << " which is manual and in APT::Move-Autobit-Sections)" << std::endl; - MarkAuto(InstPkg, false); - } + MarkProtected(InstPkg); + } + if (not MarkInstall(InstPkg, true, Depth + 1, false, ForceImportantDeps)) + continue; + if (toMoveAuto != nullptr && InstPkg->CurrentVer == 0) + toMoveAuto->push_back(InstPkg); - break; - } while(true); - continue; + foundSolution = true; + break; } - /* Negative dependencies have no or-group - If the dependency isn't versioned, we try if an upgrade might solve the problem. - Otherwise we remove the offender if needed */ - else if (Start.IsNegative() == true && Start->Type != pkgCache::Dep::Obsoletes) + if (not foundSolution && IsCriticalDep) { - std::unique_ptr List(Start.AllTargets()); - pkgCache::PkgIterator TrgPkg = Start.TargetPkg(); - for (Version **I = List.get(); *I != 0; I++) + if (not propagateProctected && not FromUser) { - VerIterator Ver(*this,*I); - PkgIterator Pkg = Ver.ParentPkg(); + StateCache &State = PkgState[Pkg->ID]; + RemoveSizes(Pkg); + RemoveStates(Pkg); + if (Pkg->CurrentVer != 0) + State.InstallVer = State.CandidateVer = Pkg.CurrentVer(); + else + State.InstallVer = State.CandidateVer = nullptr; + State.Mode = ModeKeep; + State.Update(Pkg, *this); + AddStates(Pkg); + Update(Pkg); + AddSizes(Pkg); + } + return false; + } + } + toInstall.clear(); + return true; +} + /*}}}*/ +// DepCache::MarkInstall - Put the package in the install state /*{{{*/ +bool pkgDepCache::MarkInstall(PkgIterator const &Pkg, bool AutoInst, + unsigned long Depth, bool FromUser, + bool ForceImportantDeps) +{ + if (IsModeChangeOk(ModeInstall, Pkg, Depth, FromUser) == false) + return false; - /* The List includes all packages providing this dependency, - even providers which are not installed, so skip them. */ - if (PkgState[Pkg->ID].InstallVer == 0) - continue; + StateCache &P = PkgState[Pkg->ID]; + + // See if there is even any possible installation candidate + if (P.CandidateVer == 0) + return false; - /* Ignore negative dependencies that we are not going to - get installed */ - if (PkgState[Pkg->ID].InstallVer != *I) - continue; + /* Check that it is not already marked for install and that it can be + installed */ + if ((not P.InstPolicyBroken() && not P.InstBroken()) && + (P.Mode == ModeInstall || + P.CandidateVer == (Version *)Pkg.CurrentVer())) + { + if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0) + return MarkKeep(Pkg, false, FromUser, Depth + 1); + return true; + } - if ((Start->Version != 0 || TrgPkg != Pkg) && - PkgState[Pkg->ID].CandidateVer != PkgState[Pkg->ID].InstallVer && - PkgState[Pkg->ID].CandidateVer != *I && - MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps) == true) - continue; - else if (Start->Type == pkgCache::Dep::Conflicts || - Start->Type == pkgCache::Dep::DpkgBreaks) - { - if(DebugAutoInstall == true) - std::clog << OutputInDepth(Depth) - << " Removing: " << Pkg.Name() - << std::endl; - if (MarkDelete(Pkg,false,Depth + 1, false) == false) - break; - } - } - continue; - } + // check if we are allowed to install the package + if (not IsInstallOk(Pkg, AutoInst, Depth, FromUser)) + return false; + + ActionGroup group(*this); + if (FromUser && not MarkInstall_StateChange(Pkg, AutoInst, FromUser)) + return false; + + bool const AutoSolve = AutoInst && _config->Find("APT::Solver", "internal") == "internal"; + + std::vector toInstall, toRemove; + APT::PackageVector toUpgrade; + if (AutoSolve) + { + VerIterator const PV = P.CandidateVerIter(*this); + if (unlikely(PV.end())) + return false; + if (not MarkInstall_CollectDependencies(PV, toInstall, toRemove)) + return false; + + if (not MarkInstall_RemoveConflictsIfNotUpgradeable(PV, Depth, toRemove, toUpgrade)) + return false; } - return Dep.end() == true; + if (not FromUser && not MarkInstall_StateChange(Pkg, AutoInst, FromUser)) + return false; + + if (not AutoSolve) + return true; + + if (DebugMarker) + std::clog << OutputInDepth(Depth) << "MarkInstall " << APT::PrettyPkg(this, Pkg) << " FU=" << FromUser << '\n'; + + class ScopedProtected + { + pkgDepCache::StateCache &P; + bool const already; + + public: + ScopedProtected(pkgDepCache::StateCache &p) : P{p}, already{P.Protect()} + { + if (not already) + P.iFlags |= Protected; + } + ~ScopedProtected() + { + if (not already) + P.iFlags &= (~Protected); + } + operator bool() noexcept { return already; } + } propagateProctected{PkgState[Pkg->ID]}; + + if (not MarkInstall_UpgradeOrRemoveConflicts(propagateProctected, Depth, ForceImportantDeps, toUpgrade)) + return false; + + bool const MoveAutoBitToDependencies = [&]() { + VerIterator const PV = P.InstVerIter(*this); + if (unlikely(PV.end())) + return false; + if (PV->Section == 0 || (P.Flags & Flag::Auto) == Flag::Auto) + return false; + VerIterator const CurVer = Pkg.CurrentVer(); + if (not CurVer.end() && CurVer->Section != 0 && strcmp(CurVer.Section(), PV.Section()) != 0) + { + bool const CurVerInMoveSection = ConfigValueInSubTree("APT::Move-Autobit-Sections", CurVer.Section()); + bool const InstVerInMoveSection = ConfigValueInSubTree("APT::Move-Autobit-Sections", PV.Section()); + return (not CurVerInMoveSection && InstVerInMoveSection); + } + return false; + }(); + + APT::PackageVector toMoveAuto; + if (not MarkInstall_InstallDependencies(Pkg, Depth, ForceImportantDeps, toInstall, MoveAutoBitToDependencies ? &toMoveAuto : nullptr, propagateProctected, FromUser)) + return false; + + if (MoveAutoBitToDependencies) + { + if (DebugAutoInstall) + std::clog << OutputInDepth(Depth) << "Setting " << Pkg.FullName(false) << " as auto-installed, moving manual to its dependencies" << std::endl; + MarkAuto(Pkg, true); + for (auto const &InstPkg : toMoveAuto) + { + if (DebugAutoInstall) + std::clog << OutputInDepth(Depth) << "Setting " << InstPkg.FullName(false) << " NOT as auto-installed (dependency" + << " of " << Pkg.FullName(false) << " which is manual and in APT::Move-Autobit-Sections)\n"; + MarkAuto(InstPkg, false); + } + } + return true; } /*}}}*/ // DepCache::IsInstallOk - check if it is ok to install this package /*{{{*/ @@ -1399,45 +1512,40 @@ bool pkgDepCache::IsInstallOkDependenciesSatisfiableByCandidates(PkgIterator con for (DepIterator Dep = CandVer.DependsList(); Dep.end() != true;) { - // Grok or groups DepIterator Start = Dep; - bool Result = true; + bool foundSolution = false; unsigned Ors = 0; - for (bool LastOR = true; Dep.end() == false && LastOR == true; ++Dep, ++Ors) + // Is it possible to statisfy this dependency? + for (bool LastOR = true; not Dep.end() && LastOR; ++Dep, ++Ors) { LastOR = (Dep->CompareOp & Dep::Or) == Dep::Or; - if ((DepState[Dep->ID] & DepInstall) == DepInstall) - Result = false; + if ((DepState[Dep->ID] & (DepInstall | DepCVer)) != 0) + foundSolution = true; } - if (Start.IsCritical() == false || Start.IsNegative() == true || Result == false) + if (foundSolution || not Start.IsCritical() || Start.IsNegative()) continue; - /* If we are in an or group locate the first or that can succeed. - We have already cached this… */ - for (; Ors > 1 && (DepState[Start->ID] & DepCVer) != DepCVer; --Ors) - ++Start; + if (DebugAutoInstall == true) + std::clog << OutputInDepth(Depth) << APT::PrettyDep(this, Start) << " can't be satisfied!" << std::endl; - if (Ors == 1 && (DepState[Start->ID] &DepCVer) != DepCVer) + // the dependency is critical, but can't be installed, so discard the candidate + // as the problemresolver will trip over it otherwise trying to install it (#735967) + StateCache &State = PkgState[Pkg->ID]; + if (not State.Protect()) { - if (DebugAutoInstall == true) - std::clog << OutputInDepth(Depth) << APT::PrettyDep(this, Start) << " can't be satisfied!" << std::endl; - - // the dependency is critical, but can't be installed, so discard the candidate - // as the problemresolver will trip over it otherwise trying to install it (#735967) - if (Pkg->CurrentVer != 0 && (PkgState[Pkg->ID].iFlags & Protected) != Protected) - { + if (Pkg->CurrentVer != 0) SetCandidateVersion(Pkg.CurrentVer()); - StateCache &State = PkgState[Pkg->ID]; - if (State.Mode != ModeDelete) - { - State.Mode = ModeKeep; - State.Update(Pkg, *this); - } - } - return false; + else + State.CandidateVer = nullptr; + if (not State.Delete()) + { + State.Mode = ModeKeep; + State.Update(Pkg, *this); + } } + return false; } return true; diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 17d9a9c..858de55 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -51,6 +51,12 @@ class OpProgress; class pkgVersioningSystem; +namespace APT +{ +template +class PackageContainer; +using PackageVector = PackageContainer>; +} // namespace APT class APT_PUBLIC pkgDepCache : protected pkgCache::Namespace { @@ -511,6 +517,12 @@ class APT_PUBLIC pkgDepCache : protected pkgCache::Namespace APT_HIDDEN bool IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg, unsigned long const Depth, bool const FromUser); + + APT_HIDDEN bool MarkInstall_StateChange(PkgIterator const &Pkg, bool AutoInst, bool FromUser); + APT_HIDDEN bool MarkInstall_CollectDependencies(pkgCache::VerIterator const &PV, std::vector &toInstall, std::vector &toRemove); + APT_HIDDEN bool MarkInstall_RemoveConflictsIfNotUpgradeable(pkgCache::VerIterator const &PV, unsigned long Depth, std::vector &toRemove, APT::PackageVector &toUpgrade); + APT_HIDDEN bool MarkInstall_UpgradeOrRemoveConflicts(bool const propagateProtected, unsigned long Depth, bool const ForceImportantDeps, APT::PackageVector &toUpgrade); + APT_HIDDEN bool MarkInstall_InstallDependencies(PkgIterator const &Pkg, unsigned long Depth, bool const ForceImportantDeps, std::vector &toInstall, APT::PackageVector *const toMoveAuto, bool const propagateProtected, bool const FromUser); }; #endif diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index d2e2f43..6c6a466 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -99,7 +99,7 @@ template class map_pointer { uint32_t val; public: map_pointer() noexcept : val(0) {} - map_pointer(nullptr_t) noexcept : val(0) {} + map_pointer(std::nullptr_t) noexcept : val(0) {} explicit map_pointer(uint32_t n) noexcept : val(n) {} explicit operator uint32_t() noexcept { return val; } explicit operator bool() noexcept { return val != 0; } @@ -111,8 +111,8 @@ template inline bool operator !=(map_pointer u, map_pointer m) template inline bool operator <(map_pointer u, map_pointer m) { return uint32_t(u) < uint32_t(m); } template inline bool operator >(map_pointer u, map_pointer m) { return uint32_t(u) > uint32_t(m); } template inline uint32_t operator -(map_pointer u, map_pointer m) { return uint32_t(u) - uint32_t(m); } -template bool operator ==(map_pointer m, nullptr_t) { return uint32_t(m) == 0; } -template bool operator !=(map_pointer m, nullptr_t) { return uint32_t(m) != 0; } +template bool operator ==(map_pointer m, std::nullptr_t) { return uint32_t(m) == 0; } +template bool operator !=(map_pointer m, std::nullptr_t) { return uint32_t(m) != 0; } // same as the previous, but documented to be to a string item typedef map_pointer map_stringitem_t; diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 034fce7..761a6ed 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -298,9 +298,9 @@ APT_PURE signed short pkgPolicy::GetPriority(pkgCache::VerIterator const &Ver, b out bogus entries that may be due to config-file states, or other. */ if (file.File().Flagged(pkgCache::Flag::NotSource) && Ver.ParentPkg().CurrentVer() != Ver) - priority = std::max(priority, static_cast(-1)); + priority = std::max(priority, -1); else - priority = std::max(priority, static_cast(GetPriority(file.File()))); + priority = std::max(priority, GetPriority(file.File())); } return priority == std::numeric_limits::min() ? 0 : priority; diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc index f5c31bb..eee657c 100644 --- a/apt-private/private-list.cc +++ b/apt-private/private-list.cc @@ -39,6 +39,7 @@ struct PackageSortAlphabetic /*{{{*/ class PackageNameMatcher : public Matcher { + static constexpr const char *const isfnmatch_strict = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.:*"; pkgCacheFile &cacheFile; public: explicit PackageNameMatcher(pkgCacheFile &cacheFile, const char **patterns) @@ -48,12 +49,12 @@ class PackageNameMatcher : public Matcher { std::string pattern = patterns[i]; APT::CacheFilter::Matcher *cachefilter = NULL; - if (pattern.size() > 0 && (pattern[0] == '?' || pattern[0] == '~')) - cachefilter = APT::CacheFilter::ParsePattern(pattern, &cacheFile).release(); - else if(_config->FindB("APT::Cmd::Use-Regexp", false) == true) + if(_config->FindB("APT::Cmd::Use-Regexp", false) == true) cachefilter = new APT::CacheFilter::PackageNameMatchesRegEx(pattern); - else + else if (pattern.find_first_not_of(isfnmatch_strict) == std::string::npos) cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern); + else + cachefilter = APT::CacheFilter::ParsePattern(pattern, &cacheFile).release(); if (cachefilter == nullptr) { return; diff --git a/debian/changelog b/debian/changelog index b801771..91f3892 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,44 @@ +apt (2.1.1+parrot1) rolling; urgency=medium + + * Import new Debian release. + + -- Lorenzo "Palinuro" Faletra Thu, 14 May 2020 19:11:03 +0200 + +apt (2.1.1) unstable; urgency=medium + + [ David Kalnischkies ] + * Allow aptitude to MarkInstall broken packages via FromUser + * Drop nowrap from po4a --porefs as it is no longer supported + * Use "po4a --porefs file" instead of undocumented compat noline + + [ Artur Grącki ] + * Fix typo in Polish translation of --help messages + + -- Julian Andres Klode Fri, 08 May 2020 18:02:53 +0200 + +apt (2.1.0) unstable; urgency=medium + + [ Frans Spiesschaert ] + * Dutch manpages translation update (Closes: #956313) + + [ David Kalnischkies ] + * Refactor MarkInstall fixing various or-group handling issues + - Discard impossible candidate versions also for non-installed + - Explore or-groups for Recommends further than first + - Refactor and reorder MarkInstall code + - Discard candidate if its dependencies can't be satisfied + - Split up MarkInstall into private helper methods + - Fail earlier on impossible Conflicts in MarkInstall + - Propagate Protected flag to single-option dependencies + - Prefer upgrading installed orgroup members + - Protect a package while resolving in MarkInstall + + [ Julian Andres Klode ] + * Reinstate * wildcards (Closes: #953531) (LP: #1872200) + * apt list: Fix behavior of regex vs fnmatch vs wildcards + + -- Julian Andres Klode Mon, 04 May 2020 15:58:24 +0200 + apt (2.0.2+parrot1) rolling-testing; urgency=medium * Import new Debian version. diff --git a/doc/apt-verbatim.ent b/doc/apt-verbatim.ent index f59f7cb..301178c 100644 --- a/doc/apt-verbatim.ent +++ b/doc/apt-verbatim.ent @@ -274,7 +274,7 @@ "> - + diff --git a/doc/po/apt-doc.pot b/doc/po/apt-doc.pot index 5c772af..a44998f 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.0.2\n" +"Project-Id-Version: apt-doc 2.1.1\n" "Report-Msgid-Bugs-To: APT Development Team \n" -"POT-Creation-Date: 2020-04-09 12:21+0200\n" +"POT-Creation-Date: 2020-05-08 18:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -496,18 +496,12 @@ msgid "" msgstr "" #. type: Content of: -#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml -#: apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml +#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml msgid "8" msgstr "" #. type: Content of: -#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml -#: apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml apt.conf.5.xml -#: apt_preferences.5.xml sources.list.5.xml apt-extracttemplates.1.xml -#: apt-sortpkgs.1.xml apt-ftparchive.1.xml apt_auth.conf.5.xml -#: apt-transport-http.1.xml apt-transport-https.1.xml -#: apt-transport-mirror.1.xml apt-patterns.7.xml +#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml apt.conf.5.xml apt_preferences.5.xml sources.list.5.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml apt_auth.conf.5.xml apt-transport-http.1.xml apt-transport-https.1.xml apt-transport-mirror.1.xml apt-patterns.7.xml msgid "APT" msgstr "" @@ -517,12 +511,7 @@ msgid "command-line interface" msgstr "" #. type: Content of: -#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml -#: apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml apt.conf.5.xml -#: apt_preferences.5.xml sources.list.5.xml apt-extracttemplates.1.xml -#: apt-sortpkgs.1.xml apt-ftparchive.1.xml apt_auth.conf.5.xml -#: apt-transport-http.1.xml apt-transport-https.1.xml -#: apt-transport-mirror.1.xml apt-patterns.7.xml +#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml apt.conf.5.xml apt_preferences.5.xml sources.list.5.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml apt_auth.conf.5.xml apt-transport-http.1.xml apt-transport-https.1.xml apt-transport-mirror.1.xml apt-patterns.7.xml msgid "Description" msgstr "" @@ -722,11 +711,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml -#: apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml apt.conf.5.xml -#: apt_preferences.5.xml sources.list.5.xml apt-extracttemplates.1.xml -#: apt-sortpkgs.1.xml apt-ftparchive.1.xml apt_auth.conf.5.xml -#: apt-transport-http.1.xml apt-transport-https.1.xml apt-patterns.7.xml +#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml apt-secure.8.xml apt-cdrom.8.xml apt-config.8.xml apt.conf.5.xml apt_preferences.5.xml sources.list.5.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml apt_auth.conf.5.xml apt-transport-http.1.xml apt-transport-https.1.xml apt-patterns.7.xml msgid "See Also" msgstr "" @@ -738,9 +723,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-mark.8.xml apt-cdrom.8.xml -#: apt-config.8.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml -#: apt-ftparchive.1.xml +#: apt.8.xml apt-get.8.xml apt-cache.8.xml apt-mark.8.xml apt-cdrom.8.xml apt-config.8.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml msgid "Diagnostics" msgstr "" @@ -766,8 +749,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml apt-cache.8.xml apt-cdrom.8.xml apt-config.8.xml -#: apt-ftparchive.1.xml +#: apt-get.8.xml apt-cache.8.xml apt-cdrom.8.xml apt-config.8.xml apt-ftparchive.1.xml msgid "" "Unless the <option>-h</option>, or <option>--help</option> option is given, " "one of the commands below must be present." @@ -1103,8 +1085,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml apt-cache.8.xml apt-config.8.xml apt-extracttemplates.1.xml -#: apt-sortpkgs.1.xml apt-ftparchive.1.xml +#: apt-get.8.xml apt-cache.8.xml apt-config.8.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml msgid "options" msgstr "" @@ -1526,8 +1507,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml apt.conf.5.xml -#: apt_preferences.5.xml apt_auth.conf.5.xml +#: apt-get.8.xml apt-cache.8.xml apt-key.8.xml apt-mark.8.xml apt.conf.5.xml apt_preferences.5.xml apt_auth.conf.5.xml msgid "Files" msgstr "" @@ -2158,8 +2138,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-key.8.xml apt-mark.8.xml apt-cdrom.8.xml apt-transport-http.1.xml -#: apt-transport-https.1.xml apt-transport-mirror.1.xml +#: apt-key.8.xml apt-mark.8.xml apt-cdrom.8.xml apt-transport-http.1.xml apt-transport-https.1.xml apt-transport-mirror.1.xml msgid "Options" msgstr "" @@ -2822,8 +2801,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt-config.8.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml -#: apt-ftparchive.1.xml +#: apt-config.8.xml apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml msgid "&apt-conf;" msgstr "" @@ -4266,9 +4244,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml apt_preferences.5.xml sources.list.5.xml apt-ftparchive.1.xml -#: apt-transport-http.1.xml apt-transport-https.1.xml -#: apt-transport-mirror.1.xml apt-patterns.7.xml +#: apt.conf.5.xml apt_preferences.5.xml sources.list.5.xml apt-ftparchive.1.xml apt-transport-http.1.xml apt-transport-https.1.xml apt-transport-mirror.1.xml apt-patterns.7.xml msgid "Examples" msgstr "" @@ -6188,9 +6164,7 @@ msgid "&apt-get;, &apt-conf;, &apt-acquire-additional-files;" msgstr "" #. type: Content of: <refentry><refmeta><manvolnum> -#: apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml -#: apt-transport-http.1.xml apt-transport-https.1.xml -#: apt-transport-mirror.1.xml +#: apt-extracttemplates.1.xml apt-sortpkgs.1.xml apt-ftparchive.1.xml apt-transport-http.1.xml apt-transport-https.1.xml apt-transport-mirror.1.xml msgid "1" msgstr "" diff --git a/doc/po/nl.po b/doc/po/nl.po index 7d41e5f..9609712 100644 --- a/doc/po/nl.po +++ b/doc/po/nl.po @@ -1,13 +1,13 @@ # Translation of apt-doc to Dutch # This file is distributed under the same license as the apt-doc package. -# Frans Spiesschaert <Frans.Spiesschaert@yucom.be>, 2015, 2016, 2017, 2018, 2019. +# Frans Spiesschaert <Frans.Spiesschaert@yucom.be>, 2015-2020. # msgid "" msgstr "" -"Project-Id-Version: apt-doc 1.8.0~rc3\n" +"Project-Id-Version: apt-doc 2.2.0\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2020-02-26 21:29+0100\n" -"PO-Revision-Date: 2019-02-16 20:46+0100\n" +"POT-Creation-Date: 2020-05-04 15:59+0200\n" +"PO-Revision-Date: 2020-03-16 21:20+0100\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" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 2.91.7\n" +"X-Generator: Poedit 2.2.1\n" #. type: Plain text #: apt.ent @@ -780,11 +780,17 @@ msgstr "," #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.8.xml +#, fuzzy +#| msgid "" +#| "Performs the requested action on one or more packages specified via " +#| "®ex;, &glob; or exact match. The requested action can be overridden " +#| "for specific packages by append a plus (+) to the package name to install " +#| "this package or a minus (-) to remove it." msgid "" "Performs the requested action on one or more packages specified via ®ex;, " "&glob; or exact match. The requested action can be overridden for specific " -"packages by appending a plus (+) to the package name to install this package or " -"a minus (-) to remove it." +"packages by appending a plus (+) to the package name to install this package " +"or a minus (-) to remove it." msgstr "" "Voert de gevraagde actie uit op een of meer pakketten die opgegeven werden " "aan de hand van een ®ex;, een &glob; (expansie) of een exacte pakketnaam. " @@ -871,6 +877,9 @@ msgid "" "Depends. It also handles conflicts, by prefixing an argument with <literal>" "\"Conflicts: \"</literal>." msgstr "" +"<option>satisfy</option> voldoet aan vereistentekenreeksen, zoals die in " +"Build-Depends gebruikt worden. Behandelt ook conflicten wanneer voor een " +"argument <literal>\"Conflicts: \"</literal> geplaatst wordt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.8.xml @@ -878,6 +887,8 @@ msgid "" "Example: <literal>apt satisfy \"foo, bar (>= 1.0)\" \"Conflicts: baz, fuzz" "\"</literal>" msgstr "" +"Voorbeeld: <literal>apt satisfy \"foo, bar (>= 1.0)\" \"Conflicts: baz, fuzz" +"\"</literal>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt.8.xml @@ -1261,6 +1272,10 @@ msgid "" "in &apt;, except for anchored expressions, and will be removed from &apt-" "get; in a future version. Use &apt-patterns; instead." msgstr "" +"Terugvallen op reguliere expressies wordt ontraden in APT 2.0; het werd " +"verwijderd uit &apt;, behalve voor verankerde reguliere expressies, en het " +"zal verwijderd worden uit &apt-get; in een volgende versie. Gebruik in de " +"plaats daarvan &apt-patterns;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -1419,6 +1434,12 @@ msgid "" "with <literal>\"Conflicts: \"</literal> to unsatisfy the dependency string. " "Multiple strings of the same type can be specified." msgstr "" +"<literal>satisfy</literal> doet apt-get voldoen aan de opgegeven " +"vereistentekenreeks. De vereistentekenreeksen kunnen bouwprofielen en een " +"lijst architectuurbeperkingen bevatten, zoals voor bouwvereisten. Zij kunnen " +"facultatief voorafgegaan worden door <literal>\"Conflicts: \"</literal> om " +"ervoor te zorgen dat niet voldaan wordt aan de vereistentekenreeks. Meerdere " +"tekenreeksen van hetzelfde type kunnen opgegeven worden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -1426,12 +1447,16 @@ msgid "" "Example: <literal>apt-get satisfy \"foo\" \"Conflicts: bar\" \"baz (>> " "1.0) | bar (= 2.0), moo\"</literal>" msgstr "" +"Voorbeeld: <literal>apt-get satisfy \"foo\" \"Conflicts: bar\" \"baz (>" +"> 1.0) | bar (= 2.0), moo\"</literal>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml msgid "" "The legacy operator '</>' is not supported, use '<=/>=' instead." msgstr "" +"De oudere operator '</>' wordt niet ondersteund; gebruik in de plaats " +"daarvan '<=/>='." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -3861,7 +3886,7 @@ msgid "" "stored file name" msgstr "" "Een debug-gereedschap dat rapporteert over de identiteit van de huidige " -"schijf en de naam van het opgeslagen bestand." +"schijf en de naam van het opgeslagen bestand" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-cdrom.8.xml @@ -5519,7 +5544,7 @@ msgstr "" "zal het opstarten vertragen, maar schijfruimte besparen. Het valt wellicht " "te verkiezen de pkgcache uit te zetten eerder dan de srcpkgcache. Net zoals " "dit het geval is bij <literal>Dir::State</literal> ligt de standaardmap " -"vervat in <literal>Dir::Cache</literal>." +"vervat in <literal>Dir::Cache</literal>" #. type: Content of: <refentry><refsect1><para> #: apt.conf.5.xml @@ -6234,7 +6259,7 @@ msgstr "" "Een lijst weergeven van alle geïnstalleerde pakketten met hun berekende " "scores zoals die door de pkgProblemResolver gebruikt worden. De " "pakketbeschrijving is identiek aan wat in <literal>Debug::pkgDepCache::" -"Marker</literal> beschreven werd." +"Marker</literal> beschreven werd" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.conf.5.xml @@ -6914,7 +6939,7 @@ msgstr "" #. type: Content of: <refentry><refsect1><refsect2><title> #: apt_preferences.5.xml msgid "Pinning by source package" -msgstr "" +msgstr "Vastzetten op bronpakket" #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6922,6 +6947,8 @@ msgid "" "APT supports pinning by source packages. To pin by a source package, prepend " "\"src:\" to the package name." msgstr "" +"APT ondersteunt het vastzetten op bronpakket. Om op een bronpakket vast te " +"zetten, laat u \"src:\" voorafgaan aan de pakketnaam." #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6929,22 +6956,21 @@ msgid "" "For example, to pin all binaries produced by the apt source package of this " "APT's version to 990, you can do:" msgstr "" +"Bijvoorbeeld, om alle binaire pakketten die met het apt-bronpakket van deze " +"APT-versie geproduceerd worden, vast te zetten op 990, kunt u als volgt te " +"werk gaan:" #. type: Content of: <refentry><refsect1><refsect2><programlisting> #: apt_preferences.5.xml -#, fuzzy, no-wrap -#| msgid "" -#| "Package: perl\n" -#| "Pin: version &good-perl;*\n" -#| "Pin-Priority: 1001\n" +#, no-wrap msgid "" "Package: src:apt\n" "Pin: version &apt-product-version;\n" "Pin-Priority: 990\n" msgstr "" -"Package: perl\n" -"Pin: version &good-perl;*\n" -"Pin-Priority: 1001\n" +"Package: src:apt\n" +"Pin: version &apt-product-version;\n" +"Pin-Priority: 990\n" #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6952,6 +6978,9 @@ msgid "" "Source package pinning can be combined with regular expressions and glob " "patterns, and can also take a binary architecture." msgstr "" +"Vastzetten van broncodepakketten kan gecombineerd worden met reguliere " +"expressies en glob-patronen en het kan ook een architectuur voor de binaire " +"pakketten als argument hebben." #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6959,22 +6988,21 @@ msgid "" "For example, let's pin all binaries for all architectures produced by any " "source package containing apt in its name to 990:" msgstr "" +"Laten we bijvoorbeeld alle binaire pakketten voor alle architecturen die " +"geproduceerd worden door gelijk welk broncodepakket met apt in zijn naam, " +"vastzetten op 990:" #. type: Content of: <refentry><refsect1><refsect2><programlisting> #: apt_preferences.5.xml -#, fuzzy, no-wrap -#| msgid "" -#| "Package: *\n" -#| "Pin: origin \"\"\n" -#| "Pin-Priority: 999\n" +#, no-wrap msgid "" "Package: src:*apt*:any\n" "Pin: version *\n" "Pin-Priority: 990\n" msgstr "" -"Package: *\n" -"Pin: origin \"\"\n" -"Pin-Priority: 999\n" +"Package: src:*apt*:any\n" +"Pin: version *\n" +"Pin-Priority: 990\n" #. type: Content of: <refentry><refsect1><refsect2><title> #: apt_preferences.5.xml @@ -7064,7 +7092,7 @@ msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term> #: apt_preferences.5.xml msgid "P < 0" -msgstr "P < 0 " +msgstr "P < 0" #. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara> #: apt_preferences.5.xml @@ -10193,17 +10221,14 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt_auth.conf.5.xml -#, fuzzy -#| msgid "" -#| "<literal>machine</literal> <replaceable>hostname</replaceable>[:" -#| "<replaceable>port</replaceable>][/<replaceable>path</replaceable>]" msgid "" "<literal>machine</literal> <replaceable>[protocol://]</" "replaceable><replaceable>hostname</replaceable>[:<replaceable>port</" "replaceable>][/<replaceable>path</replaceable>]" msgstr "" -"<literal>machine</literal> <replaceable>computernaam</replaceable>[:" -"<replaceable>poort</replaceable>][/<replaceable>pad</replaceable>]" +"<literal>machine</literal> <replaceable>[protocol://]</" +"replaceable><replaceable>computernaam</replaceable>[:<replaceable>poort</" +"replaceable>][/<replaceable>pad</replaceable>]" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt_auth.conf.5.xml @@ -10238,6 +10263,8 @@ msgstr "" msgid "" "If protocol is not specified, the entry only matches https and tor+https." msgstr "" +"Indien protocol niet opgegeven wordt, komt het element alleen overeen met " +"https en tor+https." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt_auth.conf.5.xml @@ -10266,17 +10293,15 @@ msgstr "Voorbeeld" #. type: Content of: <refentry><refsect1><para><literallayout> #: apt_auth.conf.5.xml -#, fuzzy, no-wrap -#| msgid "deb http://example.org/debian &debian-stable-codename; main" +#, no-wrap msgid "deb https://example.org/debian &debian-stable-codename; main" -msgstr "deb http://example.org/debian &debian-stable-codename; main" +msgstr "deb https://example.org/debian &debian-stable-codename; main" #. type: Content of: <refentry><refsect1><para><literallayout> #: apt_auth.conf.5.xml -#, fuzzy, no-wrap -#| msgid "deb http://apt:debian@example.org/debian &debian-stable-codename; main" +#, no-wrap msgid "deb https://apt:debian@example.org/debian &debian-stable-codename; main" -msgstr "deb http://apt:debian@example.org/debian &debian-stable-codename; main" +msgstr "deb https://apt:debian@example.org/debian &debian-stable-codename; main" #. type: Content of: <refentry><refsect1><para><literallayout> #: apt_auth.conf.5.xml @@ -10310,13 +10335,7 @@ msgstr "" #. type: Content of: <refentry><refsect1><para><literallayout> #: apt_auth.conf.5.xml -#, fuzzy, no-wrap -#| msgid "" -#| "machine example.org:80 login apt password debian\n" -#| "machine example.org/deb/ login apt password debian\n" -#| "machine example.org/ubuntu login apt password debian\n" -#| "machine example.orga login apt password debian\n" -#| "machine example.net login apt password debian\n" +#, no-wrap msgid "" "machine example.org:443 login apt password debian\n" "machine example.org/deb/ login apt password debian\n" @@ -10324,7 +10343,7 @@ msgid "" "machine example.orga login apt password debian\n" "machine example.net login apt password debian\n" msgstr "" -"machine example.org:80 login apt password debian\n" +"machine example.org:443 login apt password debian\n" "machine example.org/deb/ login apt password debian\n" "machine example.org/ubuntu login apt password debian\n" "machine example.orga login apt password debian\n" @@ -10387,6 +10406,11 @@ msgid "" "only, or if the sources.list entry redirects elsewhere, login information " "for the redirect destination can be supplied." msgstr "" +"Inloggegevens in auth.conf zijn flexibeler dan deze in sources.list. " +"Inloggegevens kunnen bijvoorbeeld opgegeven worden voor slechts een " +"onderdeel van een pakketbron, of, indien een element in sources.list een " +"omleiding is naar ergens anders, kunnen inloggegevens voor de " +"omleidingsbestemming opgegeven worden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt_auth.conf.5.xml @@ -11340,12 +11364,12 @@ msgstr "" #. type: Content of: <refentry><refmeta><manvolnum> #: apt-patterns.7.xml msgid "7" -msgstr "" +msgstr "7" #. type: Content of: <refentry><refnamediv><refpurpose> #: apt-patterns.7.xml msgid "Syntax and semantics of apt search patterns" -msgstr "" +msgstr "Syntaxis en semantiek van apt-zoekpatronen" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml @@ -11353,11 +11377,13 @@ msgid "" "Starting with version 2.0, <command>APT</command> provides support for " "patterns, which can be used to query the apt cache for packages." msgstr "" +"Vanaf versie 2.0 biedt <command>APT</command> ondersteuning voor patronen " +"waarmee men in de cache van apt naar pakketten kan zoeken." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Logic patterns" -msgstr "" +msgstr "Logische patronen" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml @@ -11366,86 +11392,91 @@ msgid "" "complex expressions, as well as <code>?true</code> and <code>?false</code> " "patterns." msgstr "" +"Deze patronen verschaffen de basismiddelen om andere patronen te combineren " +"tot complexere expressies, evenals <code>?true</code>- en <code>?false</" +"code>-patronen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?and(PATTERN, PATTERN, ...)</code>" -msgstr "" +msgstr "<code>?and(PATROON, PATROON, ...)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>PATTERN PATTERN ...</code>" -msgstr "" +msgstr "<code>PATROON PATROON ...</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects objects where all specified patterns match." -msgstr "" +msgstr "Selecteert objecten waarvoor alle opgegeven patronen overeenkomen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?false</code>" -msgstr "" +msgstr "<code>?false</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~F</code>" -msgstr "" +msgstr "<code>~F</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects nothing." -msgstr "" +msgstr "Selecteert niets." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?not(PATTERN)</code>" -msgstr "" +msgstr "<code>?not(PATROON)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>!PATTERN</code>" -msgstr "" +msgstr "<code>!PATROON</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects objects where PATTERN does not match." -msgstr "" +msgstr "Selecteert objecten waarvoor patroon niet overeenkomt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?or(PATTERN, PATTERN, ...)</code>" -msgstr "" +msgstr "<code>?or(PATROON, PATROON, ...)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>PATTERN | PATTERN | ...</code>" -msgstr "" +msgstr "<code>PATROON | PATROON | ...</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects objects where at least one of the specified patterns match." msgstr "" +"Selecteert objecten waarvoor minstens een van de opgegeven patronen " +"overeenkomt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?true</code>" -msgstr "" +msgstr "<code>?true</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~T</code>" -msgstr "" +msgstr "<code>~T</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects all objects." -msgstr "" +msgstr "Selecteert alle objecten." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>(PATTERN)</code>" -msgstr "" +msgstr "<code>(PATROON)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11453,16 +11484,18 @@ msgid "" "Selects the same as <code>PATTERN</code>, can be used to work around " "precedence, for example, <code>(~ramd64|~ri386)~nfoo</code>" msgstr "" +"Selecteert hetzelfde als <code>PATROON</code>; kan gebruikt worden om " +"voorrang te omzeilen, bijvoorbeeld <code>(~ramd64|~ri386)~nfoo</code>" #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Narrowing patterns" -msgstr "" +msgstr "Beperkende patronen" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?all-versions(PATTERN)</code>" -msgstr "" +msgstr "<code>?all-versions(PATROON)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11470,16 +11503,18 @@ msgid "" "Selects packages where all versions match PATTERN. When matching versions " "instead, same as PATTERN." msgstr "" +"Selecteert pakketten waarvan alle versies overeenkomen met PATROON. Bij het " +"zoeken van versieovereenkomsten daarentegen, hetzelfde als PATROON." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?any-version(PATTERN)</code>" -msgstr "" +msgstr "<code>?any-version(PATROON)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects any version where the pattern matches on the version." -msgstr "" +msgstr "Selecteert elke versie waarvoor het patroon overeenkomt met de versie." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11489,38 +11524,49 @@ msgid "" "<code>?any-version(?and(?version(1),?version(2)))</code> restricts the " "<code>?and</code> to act on the same version." msgstr "" +"Bijvoorbeeld, terwijl <code>?and(?version(1),?version(2))</code> een " +"overeenkomst oplevert met een pakket met één versie die een 1 bevat en één " +"versie die 2 bevat, heeft de <code>?and</code> in <code>?any-version(?and(?" +"version(1),?version(2)))</code> een inperkende werking door op dezelfde " +"versie van toepassing te zijn." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?narrow(PATTERN...)</code>" -msgstr "" +msgstr "<code>?narrow(PATROON...)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml +#, fuzzy +#| msgid "" +#| "Selects any version matching all PATTERNs, short for<code>?any-version(?" +#| "and(PATTERN...))</code>." msgid "" "Selects any version matching all PATTERNs, short for <code>?any-version(?" "and(PATTERN...))</code>." msgstr "" +"Selecteert elke versie die overeenkomt met alle PATRONEN; verkorte " +"schrijfwijze voor <code>?any-version(?and(PATROON...))</code>." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Package patterns" -msgstr "" +msgstr "Pakketpatronen" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml msgid "These patterns select specific packages." -msgstr "" +msgstr "Met deze patronen selecteert men specifieke pakketten." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?architecture(WILDCARD)</code>" -msgstr "" +msgstr "<code>?architecture(JOKERTEKEN)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~rWILDCARD</code>" -msgstr "" +msgstr "<code>~rJOKERTEKEN</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11528,46 +11574,48 @@ msgid "" "Selects packages matching the specified architecture, which may contain " "wildcards using any." msgstr "" +"Selecteert pakketten die overeenkomen met de opgegeven architectuur, welke " +"jokertekens mag bevatten met any." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?automatic</code>" -msgstr "" +msgstr "<code>?automatic</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~M</code>" -msgstr "" +msgstr "<code>~M</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that were installed automatically." -msgstr "" +msgstr "Selecteert pakketten die automatisch geïnstalleerd werden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?broken</code>" -msgstr "" +msgstr "<code>?broken</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~b</code>" -msgstr "" +msgstr "<code>~b</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that have broken dependencies." -msgstr "" +msgstr "Selecteert pakketten die defecte vereisten hebben." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?config-files</code>" -msgstr "" +msgstr "<code>?config-files</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~c</code>" -msgstr "" +msgstr "<code>~c</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11575,116 +11623,125 @@ msgid "" "Selects packages that are not fully installed, but have solely residual " "configuration files left." msgstr "" +"Selecteert pakketten welke niet volledig geïnstalleerd zijn, maar enkel " +"achtergebleven configuratiebestanden hebben." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?essential</code>" -msgstr "" +msgstr "<code>?essential</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~E</code>" -msgstr "" +msgstr "<code>~E</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that have Essential: yes set in their control file." msgstr "" +"Selecteert pakketten waarbij in het control-bestand Essential: yes ingesteld " +"staat." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?exact-name(NAME)</code>" -msgstr "" +msgstr "<code>?exact-name(NAAM)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages with the exact specified name." -msgstr "" +msgstr "Selecteert pakketten met exact de opgegeven naam." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?garbage</code>" -msgstr "" +msgstr "<code>?garbage</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~g</code>" -msgstr "" +msgstr "<code>~g</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that can be removed automatically." -msgstr "" +msgstr "Selecteert pakketten die automatisch verwijderd kunnen worden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?installed</code>" -msgstr "" +msgstr "<code>?installed</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~i</code>" -msgstr "" +msgstr "<code>~i</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that are currently installed." -msgstr "" +msgstr "Selecteert pakketten die momenteel geïnstalleerd zijn." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?name(REGEX)</code>" -msgstr "" +msgstr "<code>?name(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~nREGEX</code>" -msgstr "" +msgstr "<code>~nREGEX</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages where the name matches the given regular expression." msgstr "" +"Selecteert pakketten waarvan de naam overeenkomst met de opgegeven reguliere " +"expressie." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?obsolete</code>" -msgstr "" +msgstr "<code>?obsolete</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~o</code>" -msgstr "" +msgstr "<code>~o</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that no longer exist in repositories." msgstr "" +"Selecteert pakketten die niet langer aanwezig zijn in de pakketbronnen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?upgradable</code>" -msgstr "" +msgstr "<code>?upgradable</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~U</code>" -msgstr "" +msgstr "<code>~U</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages that can be upgraded (have a newer candidate)." msgstr "" +"Selecteert pakketten die opgewaardeerd kunnen worden (een nieuwere kandidaat " +"hebben)." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?virtual</code>" -msgstr "" +msgstr "<code>?virtual</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~v</code>" -msgstr "" +msgstr "<code>~v</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11693,28 +11750,29 @@ msgid "" "exist when they are referenced somewhere in the archive, for example because " "something depends on that name." msgstr "" +"Selecteert alle virtuele pakketten; dat zijn pakketten zonder versie. Deze " +"bestaan wanneer er ergens in het archief naar verwezen wordt, bijvoorbeeld " +"omdat iets afhangt van die naam." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml -#, fuzzy -#| msgid "Version &apt-product-version;" msgid "Version patterns" -msgstr "Versie &apt-product-version;" +msgstr "Versiepatronen" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml msgid "These patterns select specific versions of a package." -msgstr "" +msgstr "Deze patronen selecteren specifieke versies van een pakket." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?archive(REGEX)</code>" -msgstr "" +msgstr "<code>?archive(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~AREGEX</code>" -msgstr "" +msgstr "<code>~AREGEX</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11723,16 +11781,19 @@ msgid "" "regular expression. Archive, here, means the values after <code>a=</code> in " "<command>apt-cache policy</command>." msgstr "" +"Selecteert pakketten die afkomstig zijn van het archief dat overeenkomt met " +"de opgegeven reguliere expressie. Archief betekent hier de waarden na " +"<code>a=</code> in <command>apt-cache policy</command>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?origin(REGEX)</code>" -msgstr "" +msgstr "<code>?origin(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~OREGEX</code>" -msgstr "" +msgstr "<code>~OREGEX</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11741,32 +11802,37 @@ msgid "" "regular expression. Origin, here, means the values after <code>o=</code> in " "<command>apt-cache policy</command>." msgstr "" +"Selecteert versies die afkomstig zijn van de origine die overeenkomt met de " +"opgegeven reguliere expressie. Origine (origin) betekent hier de waarden na " +"<code>o=</code> in <command>apt-cache policy</command>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?section(REGEX)</code>" -msgstr "" +msgstr "<code>?section(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~sREGEX</code>" -msgstr "" +msgstr "<code>~sREGEX</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "" "Selects versions where the section matches the specified regular expression." msgstr "" +"Selecteert versies waarvan de sectie overeenkomt met de opgegeven reguliere " +"expressie." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?source-package(REGEX)</code>" -msgstr "" +msgstr "<code>?source-package(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~eREGEX</code>" -msgstr "" +msgstr "<code>~eREGEX</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11774,11 +11840,13 @@ msgid "" "Selects versions where the source package name matches the specified regular " "expression." msgstr "" +"Selecteert versies waarvan de naam van het broncodepakket overeenkomt met de " +"opgegeven reguliere expressie." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?source-version(REGEX)</code>" -msgstr "" +msgstr "<code>?source-version(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11786,28 +11854,36 @@ msgid "" "Selects versions where the source package version matches the specified " "regular expression." msgstr "" +"Selecteert versies waarvan de versie van het broncodepakket overeenkomt met " +"de opgegeven reguliere expressie." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?version(REGEX)</code>" -msgstr "" +msgstr "<code>?version(REGEX)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~VREGEX</code>" -msgstr "" +msgstr "<code>~VREGEX</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml +#, fuzzy +#| msgid "" +#| "Selects versions where the version string matching the specified regular " +#| "expression." msgid "" "Selects versions where the version string matches the specified regular " "expression." msgstr "" +"Selecteert versies waarvan de versietekenreeks overeenkomt met de opgegeven " +"reguliere expressie." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>apt remove ?garbage</code>" -msgstr "" +msgstr "<code>apt remove ?garbage</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11815,21 +11891,23 @@ msgid "" "Remove all packages that are automatically installed and no longer needed - " "same as apt autoremove" msgstr "" +"Alle pakketten verwijderen die automatisch geïnstalleerd werden en die niet " +"langer nodig zijn - hetzelfde als apt autoremove" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>apt purge ?config-files</code>" -msgstr "" +msgstr "<code>apt purge ?config-files</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Purge all packages that only have configuration files left" -msgstr "" +msgstr "Alle pakketten wissen waarvan enkel configuratiebestanden resten" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>apt list '~i !~M (~slibs|~sperl|~spython)'</code>" -msgstr "" +msgstr "<code>apt list '~i !~M (~slibs|~sperl|~spython)'</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11837,11 +11915,13 @@ msgid "" "List all manually-installed packages in sections matching libs, perl, or " "python." msgstr "" +"Alle handmatig geïnstalleerde pakketten vermelden in secties die " +"overeenkomen met libs, perl of python." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Migrating from aptitude" -msgstr "" +msgstr "Overschakelen van aptitude" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml @@ -11849,6 +11929,8 @@ msgid "" "Patterns in apt are heavily inspired by patterns in aptitude, but with some " "tweaks:" msgstr "" +"De patronen in apt zijn sterk geïnspireerd door de patronen in aptitude, " +"maar met wat aanpassingen:" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11856,6 +11938,9 @@ msgid "" "Syntax is uniform: If there is an opening parenthesis after a term, it is " "always assumed to be the beginning of an argument list." msgstr "" +"De syntaxis is gelijkvormig: als er na een term een ​​openend rond haakje " +"staat, wordt er altijd van uitgegaan dat dit het begin is van een lijst met " +"argumenten." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11864,11 +11949,14 @@ msgid "" "and(?foo,bar)\"</code> if foo does not take an argument. In APT, this will " "cause an error." msgstr "" +"In aptitude kon een syntactische vorm <code>\"?foo(bar)\"</code> de " +"betekenis hebben van <code>\"?and(?foo,bar)\"</code> indien foo geen " +"argument meekrijgt. In APT geeft dit een foutmelding." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "Not all patterns are supported." -msgstr "" +msgstr "Niet alle patronen worden ondersteund." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11876,21 +11964,24 @@ msgid "" "Some additional patterns are available, for example, for finding gstreamer " "codecs." msgstr "" +"Een aantal extra patronen kunnen gebruikt worden, bijvoorbeeld voor het " +"zoeken van gstreamer codecs." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "Escaping terms with <code>~</code> is not supported." msgstr "" +"Het maskeren (escaping) van termen met <code>~</code> wordt niet ondersteund" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "A trailing comma is allowed in argument lists" -msgstr "" +msgstr "In een lijst met argumenten is een achteraankomende komma toegestaan" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "?narrow accepts infinite arguments" -msgstr "" +msgstr "?narrow accepteert een oneindig aantal argumenten" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11901,6 +11992,12 @@ msgid "" "priority, but if you do not type the <code>~</code>, it would require the " "package name to contain <code>poptional</code>." msgstr "" +"<code>foo</code> kan niet gebruikt worden als een verkorte vorm van <code>?" +"name(foo)</code>, omdat dit ertoe kan leiden dat typefouten onopgemerkt " +"blijven: neem bijvoorbeeld <code>?and(...,~poptional)</code>: dit bepaalt " +"dat het pakket de prioriteit <code>required</code> moet hebben, maar indien " +"u de <code>~</code> niet typt, zou dit betekenen dat de pakketnaam " +"<code>poptional</code> moet bevatten." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11909,13 +12006,15 @@ msgid "" "as <code>A|B</code> are not supported. We do not believe that the use of " "<code>|</code> is that common, and the grouping is not necessary without it." msgstr "" +"Het groeperen van patronen met <code>(...)</code> of <code>?or(A,B)</code> " +"schrijven als <code>A|B</code> worden niet ondersteund. We zijn niet van " +"mening dat het gebruik van <code>|</code> erg verspreid is en dat zonder dit " +"de groepering niet noodzakelijk is." #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml -#, fuzzy -#| msgid "&apt-get;, &apt-conf;" msgid "&apt-get;, &apt;" -msgstr "&apt-get;, &apt-conf;" +msgstr "&apt-get;, &apt;" #. type: Attribute 'lang' of: <book> #: guide.dbk offline.dbk @@ -13569,631 +13668,3 @@ msgstr " # apt-get -o dir::cache::archives=\"/disc/\" dist-upgrade\n" msgid "Which will use the already fetched archives on the disc." msgstr "" "En dit zal gebruik maken van de reeds opgehaalde archieven op de schijf." - -#~ msgid "" -#~ "<literal>http::Proxy</literal> sets the default proxy to use for HTTP " -#~ "URIs. It is in the standard form of <literal>http://[[user][:pass]@]host[:" -#~ "port]/</literal>. Per host proxies can also be specified by using the " -#~ "form <literal>http::Proxy::<host></literal> with the special " -#~ "keyword <literal>DIRECT</literal> meaning to use no proxies. If no one of " -#~ "the above settings is specified, <envar>http_proxy</envar> environment " -#~ "variable will be used." -#~ msgstr "" -#~ "<literal>http::Proxy</literal> stelt de te gebruiken standaard-proxy in " -#~ "voor URI's van het type HTTP. De standaardvorm ervan is <literal>http://" -#~ "[[user][:pass]@]host[:port]/</literal>. Proxy's kunnen ook per computer " -#~ "ingesteld worden volgens het schema <literal>http::Proxy::<host></" -#~ "literal>, waarbij het bijzondere trefwoord <literal>DIRECT</literal> " -#~ "betekent dat geen proxy's gebruikt worden. Indien geen van de " -#~ "bovenstaande instellingen opgegeven werd, zal de omgevingsvariabele " -#~ "<envar>http_proxy</envar> gebruikt worden." - -#~ msgid "" -#~ "The <literal>Cache-control</literal>, <literal>Timeout</literal>, " -#~ "<literal>AllowRedirect</literal>, <literal>Dl-Limit</literal> and " -#~ "<literal>proxy</literal> options work for HTTPS URIs in the same way as " -#~ "for the <literal>http</literal> method, and default to the same values if " -#~ "they are not explicitly set. The <literal>Pipeline-Depth</literal> option " -#~ "is not yet supported." -#~ msgstr "" -#~ "De opties <literal>Cache-control</literal>, <literal>Timeout</literal>, " -#~ "<literal>AllowRedirect</literal>, <literal>Dl-Limit</literal> en " -#~ "<literal>proxy</literal> werken op dezelfde manier voor URI's van het " -#~ "type HTTPS als voor de <literal>http</literal>-methode en hebben dezelfde " -#~ "standaardwaarden als ze niet expliciet ingesteld werden. De optie " -#~ "<literal>Pipeline-Depth</literal> wordt momenteel nog niet ondersteund." - -#~ msgid "" -#~ "<literal>CaInfo</literal> suboption specifies place of file that holds " -#~ "info about trusted certificates. <literal><host>::CaInfo</literal> " -#~ "is the corresponding per-host option. <literal>Verify-Peer</literal> " -#~ "boolean suboption determines whether or not the server's host certificate " -#~ "should be verified against trusted certificates. <literal><host>::" -#~ "Verify-Peer</literal> is the corresponding per-host option. " -#~ "<literal>Verify-Host</literal> boolean suboption determines whether or " -#~ "not the server's hostname should be verified. <literal><host>::" -#~ "Verify-Host</literal> is the corresponding per-host option. " -#~ "<literal>SslCert</literal> determines what certificate to use for client " -#~ "authentication. <literal><host>::SslCert</literal> is the " -#~ "corresponding per-host option. <literal>SslKey</literal> determines what " -#~ "private key to use for client authentication. <literal><host>::" -#~ "SslKey</literal> is the corresponding per-host option. " -#~ "<literal>SslForceVersion</literal> overrides default SSL version to use. " -#~ "It can contain either of the strings '<literal>TLSv1</literal>' or " -#~ "'<literal>SSLv3</literal>'. <literal><host>::SslForceVersion</" -#~ "literal> is the corresponding per-host option." -#~ msgstr "" -#~ "De suboptie <literal>CaInfo</literal> specificeert de plaats waar het " -#~ "bestand zich bevindt dat informatie bevat over vertrouwde certificaten. " -#~ "<literal><host>::CaInfo</literal> is de overeenkomstige optie voor " -#~ "een specifieke computer. De booleaanse suboptie <literal>Verify-Peer</" -#~ "literal> bepaalt of het computercertificaat van de server al dan niet " -#~ "geverifieerd moet worden tegenover de vertrouwde certificaten. " -#~ "<literal><host>::Verify-Peer</literal> is de overeenkomstige optie " -#~ "voor een specifieke computer. De booleaanse suboptie <literal>Verify-" -#~ "Host</literal> bepaalt of de computernaam van de server wel of niet " -#~ "geverifieerd moet worden. <literal><host>::Verify-Host</literal> is " -#~ "de overeenkomstige optie voor een specifieke computer. <literal>SslCert</" -#~ "literal> bepaalt welk certificaat gebruikt moet worden voor de " -#~ "authenticatie van de cliënt. <literal><host>::SslCert</literal> is " -#~ "de overeenkomstige optie voor een specifieke computer. <literal>SslKey</" -#~ "literal> bepaalt welke privésleutel gebruikt moet worden voor de " -#~ "authenticatie van de cliënt. <literal><host>::SslKey</literal> is " -#~ "de overeenkomstige optie voor een specifieke computer. " -#~ "<literal>SslForceVersion</literal> overschrijft de standaardinstelling " -#~ "voor de te gebruiken versie van SSL. Het kan ofwel '<literal>TLSv1</" -#~ "literal>' of '<literal>SSLv3</literal>' als tekenreeks bevatten. " -#~ "<literal><host>::SslForceVersion</literal> is de overeenkomstige " -#~ "optie voor een specifieke computer." - -#~ msgid "" -#~ "The http scheme specifies an HTTP server for the archive. If an " -#~ "environment variable <envar>http_proxy</envar> is set with the format " -#~ "http://server:port/, the proxy server specified in <envar>http_proxy</" -#~ "envar> will be used. Users of authenticated HTTP/1.1 proxies may use a " -#~ "string of the format http://user:pass@server:port/. Note that this is an " -#~ "insecure method of authentication." -#~ msgstr "" -#~ "De methode http specificeert een HTTP-server voor het archief. Indien een " -#~ "omgevingsvariabele <envar>http_proxy</envar> bestaat in het formaat " -#~ "http://server:port/, dan zal de in <envar>http_proxy</envar> opgegeven " -#~ "proxy-server gebruikt worden. Gebruikers van een geauthenticeerde " -#~ "HTTP/1.1 proxy kunnen een tekenreeks gebruiken volgens het formaat http://" -#~ "user:pass@server:port/. Merk op dat dit geen veilige authenticatiemethode " -#~ "is." - -#~ msgid "" -#~ "As a temporary exception &apt-get; (not &apt;!) raises warnings only if " -#~ "it encounters unauthenticated archives to give a slightly longer grace " -#~ "period on this backward compatibility effecting change. This exception " -#~ "will be removed in future releases and you can opt-out of this grace " -#~ "period by setting the configuration option <option>Binary::apt-get::" -#~ "Acquire::AllowInsecureRepositories</option> to <literal>false</literal> " -#~ "or <option>--no-allow-insecure-repositories</option> on the command line." -#~ msgstr "" -#~ "Bij wijze van tijdelijke uitzondering geeft &apt-get; (niet &apt;!) enkel " -#~ "waarschuwingen als het niet-geauthenticeerde archieven tegenkomt om zo " -#~ "deze wijziging die de compatibiliteit aantast, enigszins langer uit te " -#~ "stellen. Deze uitzondering zal uit toekomstige uitgaven verwijderd worden " -#~ "en u kunt nu reeds kiezen om geen gebruik te maken van dit uitstel door " -#~ "de configuratie-optie <option>Binary::apt-get::Acquire::" -#~ "AllowInsecureRepositories</option> op <literal>false</literal> in te " -#~ "stellen of door aan de commandoregel de optie <option>--no-allow-insecure-" -#~ "repositories</option> te gebruiken." - -#~ msgid "Archive Configuration" -#~ msgstr "Configuratie op archiefniveau" - -#~ msgid "dpkg trigger usage (and related options)" -#~ msgstr "het gebruik van triggers door dpkg (en gerelateerde opties)" - -#~ msgid "" -#~ "APT can call &dpkg; in such a way as to let it make aggressive use of " -#~ "triggers over multiple calls of &dpkg;. Without further options &dpkg; " -#~ "will use triggers once each time it runs. Activating these options can " -#~ "therefore decrease the time needed to perform the install or upgrade. " -#~ "Note that it is intended to activate these options per default in the " -#~ "future, but as it drastically changes the way APT calls &dpkg; it needs a " -#~ "lot more testing. <emphasis>These options are therefore currently " -#~ "experimental and should not be used in production environments.</" -#~ "emphasis> It also breaks progress reporting such that all front-ends will " -#~ "currently stay around half (or more) of the time in the 100% state while " -#~ "it actually configures all packages." -#~ msgstr "" -#~ "APT kan &dpkg; zodanig aanroepen dat het op een agressieve manier gebruik " -#~ "maakt van triggers in de loop van de verschillende stappen waarin &dpkg; " -#~ "aangeroepen wordt. Zonder extra opties zal &dpkg; een keer gebruik maken " -#~ "van triggers tijdens iedere uitvoering. Het activeren van deze opties kan " -#~ "daarom de tijd beperken die nodig is voor het uitvoeren van een " -#~ "installatie of een opwaardering. Merk op dat het de bedoeling is om deze " -#~ "opties in de toekomst standaard te activeren, maar aangezien het op een " -#~ "drastische manier ingrijpt op de manier waarop APT &dpkg; aanroept, is " -#~ "grondiger testen noodzakelijk. <emphasis>Deze opties worden daarom " -#~ "momenteel als experimenteel beschouwd en worden best niet in " -#~ "productieomgevingen gebruikt.</emphasis> Ook de voortgangsindicatie wordt " -#~ "erdoor ontregeld, met als gevolg dat die bij alle front-ends momenteel " -#~ "ongeveer de helft van de tijd (of langer) op 100% voltooid blijft staan, " -#~ "terwijl ondertussen de configuratie van alle pakketten aan de gang is." - -#~ msgid "" -#~ "DPkg::NoTriggers \"true\";\n" -#~ "PackageManager::Configure \"smart\";\n" -#~ "DPkg::ConfigurePending \"true\";\n" -#~ "DPkg::TriggersPending \"true\";" -#~ msgstr "" -#~ "DPkg::NoTriggers \"true\";\n" -#~ "PackageManager::Configure \"smart\";\n" -#~ "DPkg::ConfigurePending \"true\";\n" -#~ "DPkg::TriggersPending \"true\";" - -#~ msgid "" -#~ "Note that it is not guaranteed that APT will support these options or " -#~ "that these options will not cause (big) trouble in the future. If you " -#~ "have understand the current risks and problems with these options, but " -#~ "are brave enough to help testing them, create a new configuration file " -#~ "and test a combination of options. Please report any bugs, problems and " -#~ "improvements you encounter and make sure to note which options you have " -#~ "used in your reports. Asking &dpkg; for help could also be useful for " -#~ "debugging proposes, see e.g. <command>dpkg --audit</command>. A defensive " -#~ "option combination would be <placeholder type=\"literallayout\" id=\"0\"/>" -#~ msgstr "" -#~ "Merk op dat er geen garantie bestaat dat APT deze opties zal blijven " -#~ "ondersteunen of dat ze in de toekomst geen (grote) problemen zullen " -#~ "veroorzaken. Indien u een goed begrip heeft van de actuele risico's en " -#~ "problemen met deze opties, maar moedig genoeg bent om ze te helpen " -#~ "testen, maakt u best een nieuw configuratiebestand aan om een combinatie " -#~ "van opties te testen. Gelieve bugs, problemen en verbeteringen die u bent " -#~ "tegengekomen te rapporteren en vergeet in uw rapport zeker niet te " -#~ "vermelden welke opties u gebruikte. Ook &dpkg; om hulp vragen kan nuttig " -#~ "zijn met het oog op het opsporen van problemen, zie bijvoorbeeld " -#~ "<command>dpkg --audit</command>. Een defensieve combinatie van opties zou " -#~ "<placeholder type=\"literallayout\" id=\"0\"/> zijn." - -#~ msgid "" -#~ "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " -#~ "call). See &dpkg; if you are interested in what this actually means. In " -#~ "short: &dpkg; will not run the triggers when this flag is present unless " -#~ "it is explicitly called to do so in an extra call. Note that this option " -#~ "exists (undocumented) also in older APT versions with a slightly " -#~ "different meaning: Previously these option only append --no-triggers to " -#~ "the configure calls to &dpkg; - now APT will also add this flag to the " -#~ "unpack and remove calls." -#~ msgstr "" -#~ "De vlag \"geen triggers\" toevoegen aan alle aanroepen van &dpkg; " -#~ "(behalve voor de aanroep ConfigurePending). Raadpleeg &dpkg; indien u " -#~ "geïnteresseerd bent in wat dit daadwerkelijk betekent. In het kort: als " -#~ "deze vlag aanwezig is, zal &dpkg; de triggers niet uitvoeren tenzij het " -#~ "in een extra aanroep expliciet opgedragen wordt dat wel te doen. Merk op " -#~ "dat deze optie in een lichtjes andere betekenis (ongedocumenteerd) ook in " -#~ "oudere versies van APT aanwezig is: vroeger voegde deze optie enkel --no-" -#~ "triggers toe aan de configure-aanroep van &dpkg; - nu voegt APT deze vlag " -#~ "ook toe aan de aanroepen unpack en remove." - -#~ msgid "" -#~ "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " -#~ "and \"<literal>no</literal>\". The default value is \"<literal>all</" -#~ "literal>\", which causes APT to configure all packages. The " -#~ "\"<literal>smart</literal>\" way is to configure only packages which need " -#~ "to be configured before another package can be unpacked (Pre-Depends), " -#~ "and let the rest be configured by &dpkg; with a call generated by the " -#~ "ConfigurePending option (see below). On the other hand, \"<literal>no</" -#~ "literal>\" will not configure anything, and totally relies on &dpkg; for " -#~ "configuration (which at the moment will fail if a Pre-Depends is " -#~ "encountered). Setting this option to any value other than <literal>all</" -#~ "literal> will implicitly also activate the next option by default, as " -#~ "otherwise the system could end in an unconfigured and potentially " -#~ "unbootable state." -#~ msgstr "" -#~ "Geldige waarden zijn \"<literal>all</literal>\", \"<literal>smart</" -#~ "literal>\" en \"<literal>no</literal>\". De standaardwaarde is " -#~ "\"<literal>all</literal>\", die APT ertoe aanzet om alle pakketten te " -#~ "configureren. De \"<literal>smart</literal>\"-manier bestaat erin om " -#~ "enkel die pakketten te configureren die geconfigureerd moeten zijn " -#~ "vooraleer een ander pakket uitgepakt kan worden (Pre-Depends " -#~ "(voorvereisten)) en de configuratie van de andere pakketten over te laten " -#~ "aan &dpkg; tijdens een door de optie ConfigurePending geïnitieerde " -#~ "aanroep (zie later). Anderzijds zal \"<literal>no</literal>\" helemaal " -#~ "niets configureren en volledig op &dpkg; vertrouwen voor de configuratie " -#~ "(hetgeen momenteel zal mislukken als er een Pre-Depends opduikt). Deze " -#~ "optie instellen op iets anders dan <literal>all</literal> zal standaard " -#~ "impliciet ook de volgende optie activeren. Anders bestaat het gevaar dat " -#~ "het systeem in een niet-geconfigureerde en niet op te starten toestand " -#~ "achterblijft." - -#~ msgid "" -#~ "Useful for the <literal>smart</literal> configuration as a package which " -#~ "has pending triggers is not considered as <literal>installed</literal>, " -#~ "and &dpkg; treats them as <literal>unpacked</literal> currently which is " -#~ "a showstopper for Pre-Dependencies (see debbugs #526774). Note that this " -#~ "will process all triggers, not only the triggers needed to configure this " -#~ "package." -#~ msgstr "" -#~ "Nuttig voor de configuratie-instelling <literal>smart</literal>, vermits " -#~ "een pakket met wachtende triggers niet als <literal>installed</literal> " -#~ "(geïnstalleerd) beschouwd wordt en &dpkg; een dergelijk pakket momenteel " -#~ "als <literal>unpacked</literal> (niet uitgepakt) behandelt, hetgeen een " -#~ "hinderpaal is bij voorvereisten (zie Debian bug #526774). Merk op dat dit " -#~ "alle triggers verwerkt, niet enkel de triggers die nodig zijn om dit " -#~ "pakket te configureren." - -#~ msgid "" -#~ "OrderList::Score {\n" -#~ "\tDelete 500;\n" -#~ "\tEssential 200;\n" -#~ "\tImmediate 10;\n" -#~ "\tPreDepends 50;\n" -#~ "};" -#~ msgstr "" -#~ "OrderList::Score {\n" -#~ "\tDelete 500;\n" -#~ "\tEssential 200;\n" -#~ "\tImmediate 10;\n" -#~ "\tPreDepends 50;\n" -#~ "};" - -#~ msgid "" -#~ "Essential packages (and their dependencies) should be configured " -#~ "immediately after unpacking. It is a good idea to do this quite early in " -#~ "the upgrade process as these configure calls also currently require " -#~ "<literal>DPkg::TriggersPending</literal> which will run quite a few " -#~ "triggers (which may not be needed). Essentials get per default a high " -#~ "score but the immediate flag is relatively low (a package which has a Pre-" -#~ "Depends is rated higher). These option and the others in the same group " -#~ "can be used to change the scoring. The following example shows the " -#~ "settings with their default values. <placeholder type=\"literallayout\" " -#~ "id=\"0\"/>" -#~ msgstr "" -#~ "Essentiële pakketten (en de pakketten waarvan zij afhankelijk zijn) " -#~ "zouden onmiddellijk geconfigureerd moeten worden nadat ze uitgepakt zijn. " -#~ "Het wordt aanbevolen om dit vrij vroeg in het opwaarderingsproces te doen " -#~ "aangezien deze configure-aanroepen momenteel ook <literal>DPkg::" -#~ "TriggersPending</literal> uitlokken, waardoor behoorlijk wat triggers " -#~ "afgehandeld kunnen worden (wat misschien niet nodig is). Essentiële " -#~ "pakketten krijgen per definitie een hoge score maar de vlag immediate " -#~ "heeft een relatief lage score (een pakket met een voorvereiste krijgt een " -#~ "hogere score). Deze optie en de andere uit dezelfde groep kunnen gebruikt " -#~ "worden om de score aan te passen. Het volgende voorbeeld toont de " -#~ "instellingen met hun standaardwaarden. <placeholder type=\"literallayout" -#~ "\" id=\"0\"/>" - -#~ msgid "List fingerprints of trusted keys." -#~ msgstr "De vingerafdrukken van de betrouwbare sleutels weergeven." - -#~ msgid "Local trust database of archive keys." -#~ msgstr "Lokale database van betrouwbare archiefsleutels." - -#~ msgid "&keyring-filename;" -#~ msgstr "&keyring-filename;" - -#~ msgid "Keyring of &keyring-distro; archive trusted keys." -#~ msgstr "" -#~ "Sleutelbos met betrouwbare sleutels van het archief &keyring-distro;." - -#~ msgid "&keyring-removed-filename;" -#~ msgstr "&keyring-removed-filename;" - -#~ msgid "Keyring of &keyring-distro; archive removed trusted keys." -#~ msgstr "" -#~ "Sleutelbos met uit het archief &keyring-distro; verwijderde betrouwbare " -#~ "sleutels." - -#~ msgid "" -#~ "In the future APT will refuse to work with unauthenticated repositories " -#~ "by default until support for them is removed entirely. Users have the " -#~ "option to opt-in to this behavior already by setting the configuration " -#~ "option <option>Acquire::AllowInsecureRepositories</option> to " -#~ "<literal>false</literal>." -#~ msgstr "" -#~ "In de toekomst zal APT standaard weigeren om met niet-geauthenticeerde " -#~ "pakketbronnen te werken totdat die helemaal niet meer ondersteund zullen " -#~ "worden. Gebruikers hebben de mogelijkheid om nu reeds voor dit gedrag te " -#~ "kiezen door de configuratieoptie <option>Acquire::" -#~ "AllowInsecureRepositories</option> in te stellen op <literal>false</" -#~ "literal>." - -#~ msgid "" -#~ "Allow the update operation to load data files from a repository without a " -#~ "trusted signature. If enabled this option no data files will be loaded " -#~ "and the update operation fails with a error for this source. The default " -#~ "is false for backward compatibility. This will be changed in the future." -#~ msgstr "" -#~ "De bewerking update toelaten om databestanden op te halen van een " -#~ "pakketbron zonder een betrouwbare ondertekening. Indien deze optie " -#~ "geactiveerd is, zullen geen databestanden opgehaald worden en zal de " -#~ "update-bewerking voor deze pakketbron mislukken met een foutmelding. " -#~ "Omwille van achterwaartse compatibiliteit is de standaard false " -#~ "(uitgezet). In de toekomst zal dit veranderen." - -#~ msgid "" -#~ "<command>apt</command> (Advanced Package Tool) is the command-line tool " -#~ "for handling packages. It provides a commandline interface for the " -#~ "package management of the system. See also &apt-get; and &apt-cache; for " -#~ "more low-level command options." -#~ msgstr "" -#~ "<command>apt</command> (Advanced Package Tool - geavanceerd " -#~ "pakketgereedschap) is gereedschap om aan de commandoregel pakketten te " -#~ "behandelen. Het biedt een commandoregelinterface voor het pakketbeheer " -#~ "van het systeem. Raadpleeg ook &apt-get; en &apt-cache; voor bijkomende " -#~ "basale commando-opties." - -#~ msgid "" -#~ "<literal>search</literal> searches for the given term(s) and display " -#~ "matching packages." -#~ msgstr "" -#~ "<literal>search</literal> zoekt naar de opgegeven term(en) en geeft de " -#~ "ermee overeenkomende pakketten weer." - -#~ msgid "" -#~ "<literal>show</literal> shows the package information for the given " -#~ "package(s)." -#~ msgstr "" -#~ "<literal>show</literal> geeft over het/de opgegeven pakket(ten) " -#~ "pakketinformatie weer." - -#~ msgid "" -#~ "<literal>install</literal> is followed by one or more package names " -#~ "desired for installation or upgrading." -#~ msgstr "" -#~ "<literal>install</literal> wordt gevolgd door een of meer pakketnamen die " -#~ "men wenst te installeren of op te waarderen." - -#~ msgid "" -#~ "<literal>update</literal> is used to resynchronize the package index " -#~ "files from their sources." -#~ msgstr "" -#~ "<literal>update</literal> wordt gebruikt om de indexbestanden met " -#~ "beschikbare pakketten terug te synchroniseren met hun pakketbronnen." - -#~ msgid "Script usage" -#~ msgstr "Gebruik van scripts" - -#~ msgid "Differences to &apt-get;" -#~ msgstr "Verschillen met &apt-get;" - -#~ msgid "" -#~ "The <command>apt</command> command is meant to be pleasant for end users " -#~ "and does not need to be backward compatible like &apt-get;. Therefore " -#~ "some options are different:" -#~ msgstr "" -#~ "Het commando <command>apt</command> is bedoeld om prettig aan te voelen " -#~ "voor eindgebruikers en moet niet neerwaarts compatibel zijn zoals &apt-" -#~ "get;. Daarom zijn sommige opties verschillend:" - -#~ msgid "The option <literal>DPkg::Progress-Fancy</literal> is enabled." -#~ msgstr "De optie <literal>DPkg::Progress-Fancy</literal> is geactiveerd." - -#~ msgid "The option <literal>APT::Color</literal> is enabled." -#~ msgstr "De optie <literal>APT::Color</literal> is geactiveerd." - -#~ msgid "" -#~ "The option <literal>upgrade</literal> has <literal>--with-new-pkgs</" -#~ "literal> enabled by default." -#~ msgstr "" -#~ "Bij de optie <literal>upgrade</literal> is <literal>--with-new-pkgs</" -#~ "literal> standaard geactiveerd." - -#~ msgid "" -#~ "No action; perform a simulation of events that would occur but do not " -#~ "actually change the system. Configuration Item: <literal>APT::Get::" -#~ "Simulate</literal>." -#~ msgstr "" -#~ "Niets doen; het uitvoeren van een simulatie van de operaties die zouden " -#~ "plaats vinden, maar zonder wijzigingen aan het systeem aan te brengen. " -#~ "Configuratie-item: <literal>APT::Get::Simulate</literal>." - -#~ msgid "" -#~ "Simulated runs performed as a user will automatically deactivate locking " -#~ "(<literal>Debug::NoLocking</literal>), and if the option <literal>APT::" -#~ "Get::Show-User-Simulation-Note</literal> is set (as it is by default) a " -#~ "notice will also be displayed indicating that this is only a simulation. " -#~ "Runs performed as root do not trigger either NoLocking or the notice - " -#~ "superusers should know what they are doing without further warnings from " -#~ "<literal>apt-get</literal>." -#~ msgstr "" -#~ "Als men als gewone gebruiker een simulatie uitvoert, wordt vergrendeling " -#~ "automatisch uitgeschakeld (<literal>Debug::NoLocking</literal>), en " -#~ "indien de optie <literal>APT::Get::Show-User-Simulation-Note</literal> " -#~ "ingesteld staat (wat standaard het geval is), zal er ook een mededeling " -#~ "getoond worden dat het hier slechts om een simulatie gaat. Door de " -#~ "systeembeheerder uitgevoerd, lokt deze operatie geen NoLocking " -#~ "(vergrendeling uitzetten) en geen mededeling uit - systeembeheerders " -#~ "zouden moeten weten wat ze doen zonder verdere waarschuwingen vanwege " -#~ "<literal>apt-get</literal>." - -#~ msgid "" -#~ "Ignore if packages can't be authenticated and don't prompt about it. " -#~ "This is useful for tools like pbuilder. Configuration Item: " -#~ "<literal>APT::Get::AllowUnauthenticated</literal>." -#~ msgstr "" -#~ "Het feit dat pakketten niet geauthenticeerd kunnen worden, negeren en er " -#~ "geen vragen bij stellen. Dit is nuttig voor gereedschap zoals pbuilder. " -#~ "Configuratie-item: <literal>APT::Get::AllowUnauthenticated</literal>." - -#~ msgid "" -#~ "Pass advanced options to gpg. With adv --recv-key you can download the " -#~ "public key." -#~ msgstr "" -#~ "Geavanceerde opties doorgeven aan gpg. Met de opdracht adv --recv-key " -#~ "kunt u de publieke sleutel downloaden." - -#~ msgid "mark/unmark a package as being automatically-installed" -#~ msgstr "Een pakket aan/uitvinken als automatisch geïnstalleerd" - -#~ msgid "" -#~ "<command>apt-mark</command> will change whether a package has been marked " -#~ "as being automatically installed." -#~ msgstr "" -#~ "Met <command>apt-mark</command> kunt u een pakket markeren als " -#~ "automatisch geïnstalleerd of niet." - -#~ msgid "" -#~ "<literal>hold</literal> is used to mark a package as held back, which " -#~ "will prevent the package from being automatically installed, upgraded or " -#~ "removed. The command is only a wrapper around <command>dpkg --set-" -#~ "selections</command> and the state is therefore maintained by &dpkg; and " -#~ "not affected by the <option>--file</option> option." -#~ msgstr "" -#~ "<literal>hold</literal> wordt gebruikt om een pakket als tegengehouden te " -#~ "markeren. Dit voorkomt dat het pakket automatisch geïnstalleerd, " -#~ "opgewaardeerd of verwijderd wordt. Het commando is slechts een wikkel " -#~ "rond <command>dpkg --set-selections</command> en om die reden wordt de " -#~ "status bijgehouden door &dpkg; en niet beïnvloed door de optie <option>--" -#~ "file</option>." - -#~ msgid "" -#~ "If a package comes from a archive without a signature, or with a " -#~ "signature that apt does not have a key for, that package is considered " -#~ "untrusted, and installing it will result in a big warning. <command>apt-" -#~ "get</command> will currently only warn for unsigned archives; future " -#~ "releases might force all sources to be verified before downloading " -#~ "packages from them." -#~ msgstr "" -#~ "Indien een pakket afkomstig is van een archief zonder ondertekening of " -#~ "met een ondertekening waarvoor apt geen sleutel heeft, dan wordt dat " -#~ "pakket als onbetrouwbaar beschouwd. De installatie ervan zal een forse " -#~ "waarschuwing uitlokken. Momenteel zal <command>apt-get</command> enkel " -#~ "waarschuwen bij niet-ondertekende archieven. Bij toekomstige uitgaven kan " -#~ "het zijn dat een verificatie van de pakketbronnen verplicht gesteld wordt " -#~ "vooraleer er pakketten van opgehaald worden." - -#~ msgid "" -#~ "Version 2 of this protocol dumps more information, including the protocol " -#~ "version, the APT configuration space and the packages, files and versions " -#~ "being changed. Version 3 adds the architecture and <literal>MultiArch</" -#~ "literal> flag to each version being dumped." -#~ msgstr "" -#~ "Versie 2 van dit protocol geeft meer informatie weer, onder meer de " -#~ "protocolversie, de configuratieruimte van APT en de pakketten, bestanden " -#~ "en versies die gewijzigd worden. Versie 3 voegt aan iedere weergegeven " -#~ "versie de architectuur toe en de <literal>MultiArch</literal>-vlag." - -#~ msgid "" -#~ "to the versions that are not installed and do not belong to the target " -#~ "release." -#~ msgstr "" -#~ "aan de versies die niet geïnstalleerd zijn en niet behoren tot de " -#~ "streefrelease." - -#~ msgid "" -#~ "Each line specifying a source starts with type (e.g. <literal>deb-src</" -#~ "literal>) followed by options and arguments for this type. Individual " -#~ "entries cannot be continued onto a following line. Empty lines are " -#~ "ignored, and a <literal>#</literal> character anywhere on a line marks " -#~ "the remainder of that line as a comment." -#~ msgstr "" -#~ "Elke regel waarin een pakketbron beschreven wordt, begint met het type " -#~ "bron (bijv. <literal>deb-src</literal>), gevolgd door opties en " -#~ "argumenten voor dat type. Een individueel item kan niet voortlopen op een " -#~ "volgende regel. Lege regels worden overgeslagen en het teken <literal>#</" -#~ "literal> ergens op de regel geeft aan dat het vervolg van die regel " -#~ "commentaar is." - -#~ msgid "deb [ options ] uri suite [component1] [component2] [...]" -#~ msgstr "deb [ opties ] URI suite [component1] [component2] [...]" - -#~ msgid "" -#~ " Types: deb deb-src\n" -#~ " URIs: http://example.com\n" -#~ " Suites: stable testing\n" -#~ " Sections: component1 component2\n" -#~ " Description: short\n" -#~ " long long long\n" -#~ " [option1]: [option1-value]\n" -#~ "\n" -#~ " Types: deb\n" -#~ " URIs: http://another.example.com\n" -#~ " Suites: experimental\n" -#~ " Sections: component1 component2\n" -#~ " Enabled: no\n" -#~ " Description: short\n" -#~ " long long long\n" -#~ " [option1]: [option1-value]\n" -#~ " " -#~ msgstr "" -#~ " Types: deb deb-src\n" -#~ " URIs: http://example.com\n" -#~ " Suites: stable testing\n" -#~ " Sections: component1 component2\n" -#~ " Description: kort\n" -#~ " lang lang lang\n" -#~ " [optie1]: [waarde-van-optie1]\n" -#~ "\n" -#~ " Types: deb\n" -#~ " URIs: http://another.example.com\n" -#~ " Suites: experimental\n" -#~ " Sections: component1 component2\n" -#~ " Enabled: no\n" -#~ " Description: kort\n" -#~ " lang lang lang\n" -#~ " [optie1]: [waarde-van-optie1]\n" -#~ " " - -#~ msgid "" -#~ "<literal>options</literal> is always optional and needs to be surrounded " -#~ "by square brackets. It can consist of multiple settings in the form " -#~ "<literal><replaceable>setting</replaceable>=<replaceable>value</" -#~ "replaceable></literal>. Multiple settings are separated by spaces. The " -#~ "following settings are supported by APT (note however that unsupported " -#~ "settings will be ignored silently):" -#~ msgstr "" -#~ "<literal>opties</literal> zijn steeds facultatief en moeten binnen " -#~ "vierkante haakjes staan. Ze kunnen bestaan uit verschillende instellingen " -#~ "in de vorm van <literal><replaceable>instelling</" -#~ "replaceable>=<replaceable>waarde</replaceable></literal>. De volgende " -#~ "instellingen worden ondersteund door APT (weet wel dat niet-ondersteunde " -#~ "instellingen stilzwijgend genegeerd zullen worden):" - -#~ msgid "" -#~ "<literal>arch+=<replaceable>arch1</replaceable>,<replaceable>arch2</" -#~ "replaceable>,…</literal> and <literal>arch-=<replaceable>arch1</" -#~ "replaceable>,<replaceable>arch2</replaceable>,…</literal> which can be " -#~ "used to add/remove architectures from the set which will be downloaded." -#~ msgstr "" -#~ "<literal>arch+=<replaceable>architectuur1</replaceable>," -#~ "<replaceable>architectuur2</replaceable>,…</literal> en <literal>arch-" -#~ "=<replaceable>architectuur1</replaceable>,<replaceable>architectuur2</" -#~ "replaceable>,…</literal> hetgeen gebruikt kan worden om architecturen toe " -#~ "te voegen aan/te verwijderen uit de set architecturen waarvoor gedownload " -#~ "moet worden." - -#~ msgid "" -#~ "<literal>trusted=yes</literal> can be set to indicate that packages from " -#~ "this source are always authenticated even if the <filename>Release</" -#~ "filename> file is not signed or the signature can't be checked. This " -#~ "disables parts of &apt-secure; and should therefore only be used in a " -#~ "local and trusted context. <literal>trusted=no</literal> is the opposite " -#~ "which handles even correctly authenticated sources as not authenticated." -#~ msgstr "" -#~ "<literal>trusted=yes</literal> kan opgegeven worden om aan te geven dat " -#~ "pakketten uit die pakketbron steeds geauthenticeerd zijn, zelfs al is het " -#~ "<filename>Release</filename>-bestand niet ondertekend of kan de " -#~ "handtekening niet gecontroleerd worden. Dit schakelt onderdelen van &apt-" -#~ "secure; uit en zou daarom enkel gebruikt mogen worden in een lokale en " -#~ "betrouwbare context. <literal>trusted=no</literal> is het tegengestelde " -#~ "en behandelt ook correct geauthenticeerde pakketbronnen als niet-" -#~ "geauthenticeerd." - -#~ msgid "Some examples:" -#~ msgstr "Enkele voorbeelden:" - -#~ msgid "" -#~ "deb http://ftp.debian.org/debian &debian-stable-codename; main contrib " -#~ "non-free\n" -#~ "deb http://security.debian.org/ &debian-stable-codename;/updates main " -#~ "contrib non-free\n" -#~ " " -#~ msgstr "" -#~ "deb http://ftp.debian.org/debian &debian-stable-codename; main contrib " -#~ "non-free\n" -#~ "deb http://security.debian.org/ &debian-stable-codename;/updates main " -#~ "contrib non-free\n" -#~ " " - -#~ msgid "" -#~ "This is a space separated list of all the architectures that appear under " -#~ "search section. The special architecture 'source' is used to indicate " -#~ "that this tree has a source archive." -#~ msgstr "" -#~ "Dit is een door spaties gescheiden lijst van alle architecturen die te " -#~ "vinden zijn onder elke sectie. De bijzondere architectuur 'source' wordt " -#~ "gebruikt om aan te geven dat zich in die boom een broncodearchief bevindt." diff --git a/methods/basehttp-orig.cc b/methods/basehttp-orig.cc new file mode 100644 index 0000000..e659da2 --- /dev/null +++ b/methods/basehttp-orig.cc @@ -0,0 +1,908 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +/* ###################################################################### + + HTTP and HTTPS share a lot of common code and these classes are + exactly the dumping ground for this common code + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include <config.h> + +#include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/strutl.h> + +#include <iostream> +#include <limits> +#include <map> +#include <string> +#include <vector> +#include <ctype.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <time.h> +#include <unistd.h> + +#include "basehttp.h" + +#include <apti18n.h> + /*}}}*/ +using namespace std; + +string BaseHttpMethod::FailFile; +int BaseHttpMethod::FailFd = -1; +time_t BaseHttpMethod::FailTime = 0; + +// Number of successful requests in a pipeline needed to continue +// pipelining after a connection reset. +constexpr int PIPELINE_MIN_SUCCESSFUL_ANSWERS_TO_CONTINUE = 3; + +// ServerState::RunHeaders - Get the headers before the data /*{{{*/ +// --------------------------------------------------------------------- +/* Returns 0 if things are OK, 1 if an IO error occurred and 2 if a header + parse error occurred */ +ServerState::RunHeadersResult ServerState::RunHeaders(RequestState &Req, + const std::string &Uri) +{ + Owner->Status(_("Waiting for headers")); + do + { + string Data; + if (ReadHeaderLines(Data) == false) + continue; + + if (Owner->Debug == true) + clog << "Answer for: " << Uri << endl << Data; + + for (string::const_iterator I = Data.begin(); I < Data.end(); ++I) + { + string::const_iterator J = I; + for (; J != Data.end() && *J != '\n' && *J != '\r'; ++J); + if (Req.HeaderLine(string(I,J)) == false) + return RUN_HEADERS_PARSE_ERROR; + I = J; + } + + // 100 Continue is a Nop... + if (Req.Result == 100) + continue; + + // Tidy up the connection persistence state. + if (Req.Encoding == RequestState::Closes && Req.HaveContent == true) + Persistent = false; + + return RUN_HEADERS_OK; + } while (LoadNextResponse(false, Req) == ResultState::SUCCESSFUL); + + return RUN_HEADERS_IO_ERROR; +} + /*}}}*/ +bool RequestState::HeaderLine(string const &Line) /*{{{*/ +{ + if (Line.empty() == true) + return true; + + if (Result == 0 && Line.size() > 4 && stringcasecmp(Line.data(), Line.data() + 4, "HTTP") == 0) + { + // Evil servers return no version + if (Line[4] == '/') + { + int const elements = sscanf(Line.c_str(),"HTTP/%3u.%3u %3u%359[^\n]",&Major,&Minor,&Result,Code); + if (elements == 3) + { + Code[0] = '\0'; + if (Owner != NULL && Owner->Debug == true) + clog << "HTTP server doesn't give Reason-Phrase for " << std::to_string(Result) << std::endl; + } + else if (elements != 4) + return _error->Error(_("The HTTP server sent an invalid reply header")); + } + else + { + Major = 0; + Minor = 9; + if (sscanf(Line.c_str(),"HTTP %3u%359[^\n]",&Result,Code) != 2) + return _error->Error(_("The HTTP server sent an invalid reply header")); + } + + /* Check the HTTP response header to get the default persistence + state. */ + if (Major < 1) + Server->Persistent = false; + else + { + if (Major == 1 && Minor == 0) + { + Server->Persistent = false; + } + else + { + Server->Persistent = true; + if (Server->PipelineAllowed) + Server->Pipeline = true; + } + } + + return true; + } + + // Blah, some servers use "connection:closes", evil. + // and some even send empty header fields… + string::size_type Pos = Line.find(':'); + if (Pos == string::npos) + return _error->Error(_("Bad header line")); + ++Pos; + + // Parse off any trailing spaces between the : and the next word. + string::size_type Pos2 = Pos; + while (Pos2 < Line.length() && isspace_ascii(Line[Pos2]) != 0) + Pos2++; + + string const Tag(Line,0,Pos); + string const Val(Line,Pos2); + + if (stringcasecmp(Tag,"Content-Length:") == 0) + { + auto ContentLength = strtoull(Val.c_str(), NULL, 10); + if (ContentLength == 0) + return true; + if (Encoding == Closes) + Encoding = Stream; + HaveContent = true; + + unsigned long long * DownloadSizePtr = &DownloadSize; + if (Result == 416 || (Result >= 300 && Result < 400)) + DownloadSizePtr = &JunkSize; + + *DownloadSizePtr = ContentLength; + if (*DownloadSizePtr >= std::numeric_limits<unsigned long long>::max()) + return _error->Errno("HeaderLine", _("The HTTP server sent an invalid Content-Length header")); + else if (*DownloadSizePtr == 0) + HaveContent = false; + + // On partial content (206) the Content-Length less than the real + // size, so do not set it here but leave that to the Content-Range + // header instead + if(Result != 206 && TotalFileSize == 0) + TotalFileSize = DownloadSize; + + return true; + } + + if (stringcasecmp(Tag,"Content-Type:") == 0) + { + HaveContent = true; + return true; + } + + // The Content-Range field only has a meaning in HTTP/1.1 for the + // 206 (Partial Content) and 416 (Range Not Satisfiable) responses + // according to RFC7233 "Range Requests", §4.2, so only consider it + // for such responses. + if ((Result == 416 || Result == 206) && stringcasecmp(Tag,"Content-Range:") == 0) + { + HaveContent = true; + + // §14.16 says 'byte-range-resp-spec' should be a '*' in case of 416 + if (Result == 416 && sscanf(Val.c_str(), "bytes */%llu",&TotalFileSize) == 1) + ; // we got the expected filesize which is all we wanted + else if (sscanf(Val.c_str(),"bytes %llu-%*u/%llu",&StartPos,&TotalFileSize) != 2) + return _error->Error(_("The HTTP server sent an invalid Content-Range header")); + if (StartPos > TotalFileSize) + return _error->Error(_("This HTTP server has broken range support")); + + // figure out what we will download + DownloadSize = TotalFileSize - StartPos; + return true; + } + + if (stringcasecmp(Tag,"Transfer-Encoding:") == 0) + { + HaveContent = true; + if (stringcasecmp(Val,"chunked") == 0) + Encoding = Chunked; + return true; + } + + if (stringcasecmp(Tag,"Connection:") == 0) + { + if (stringcasecmp(Val,"close") == 0) + { + Server->Persistent = false; + Server->Pipeline = false; + /* Some servers send error pages (as they are dynamically generated) + for simplicity via a connection close instead of e.g. chunked, + so assuming an always closing server only if we get a file + close */ + if (Result >= 200 && Result < 300 && Server->PipelineAnswersReceived < PIPELINE_MIN_SUCCESSFUL_ANSWERS_TO_CONTINUE) + { + Server->PipelineAllowed = false; + Server->PipelineAnswersReceived = 0; + } + } + else if (stringcasecmp(Val,"keep-alive") == 0) + Server->Persistent = true; + return true; + } + + if (stringcasecmp(Tag,"Last-Modified:") == 0) + { + if (RFC1123StrToTime(Val, Date) == false) + return _error->Error(_("Unknown date format")); + return true; + } + + if (stringcasecmp(Tag,"Location:") == 0) + { + Location = Val; + return true; + } + + if (stringcasecmp(Tag, "Accept-Ranges:") == 0) + { + std::string ranges = ',' + Val + ','; + ranges.erase(std::remove(ranges.begin(), ranges.end(), ' '), ranges.end()); + if (ranges.find(",bytes,") == std::string::npos) + Server->RangesAllowed = false; + return true; + } + + return true; +} + /*}}}*/ +// ServerState::ServerState - Constructor /*{{{*/ +ServerState::ServerState(URI Srv, BaseHttpMethod *Owner) : + ServerName(Srv), TimeOut(30), Owner(Owner) +{ + Reset(); +} + /*}}}*/ +bool RequestState::AddPartialFileToHashes(FileFd &File) /*{{{*/ +{ + File.Truncate(StartPos); + return Server->GetHashes()->AddFD(File, StartPos); +} + /*}}}*/ +void ServerState::Reset() /*{{{*/ +{ + Persistent = false; + Pipeline = false; + PipelineAllowed = true; + RangesAllowed = true; + PipelineAnswersReceived = 0; +} + /*}}}*/ + +// BaseHttpMethod::DealWithHeaders - Handle the retrieved header data /*{{{*/ +// --------------------------------------------------------------------- +/* We look at the header data we got back from the server and decide what + to do. Returns DealWithHeadersResult (see http.h for details). + */ +BaseHttpMethod::DealWithHeadersResult +BaseHttpMethod::DealWithHeaders(FetchResult &Res, RequestState &Req) +{ + // Not Modified + if (Req.Result == 304) + { + RemoveFile("server", Queue->DestFile); + Res.IMSHit = true; + Res.LastModified = Queue->LastModified; + Res.Size = 0; + return IMS_HIT; + } + + /* Note that it is only OK for us to treat all redirection the same + because we *always* use GET, not other HTTP methods. + Codes not mentioned are handled as errors later as required by the + HTTP spec to handle unknown codes the same as the x00 code. */ + constexpr unsigned int RedirectCodes[] = { + 301, // Moved Permanently + 302, // Found + 303, // See Other + 307, // Temporary Redirect + 308, // Permanent Redirect + }; + if (AllowRedirect && std::find(std::begin(RedirectCodes), std::end(RedirectCodes), Req.Result) != std::end(RedirectCodes)) + { + if (Req.Location.empty() == true) + ; + else if (Req.Location[0] == '/' && Queue->Uri.empty() == false) + { + URI Uri(Queue->Uri); + if (Uri.Host.empty() == false) + NextURI = URI::SiteOnly(Uri); + else + NextURI.clear(); + NextURI.append(DeQuoteString(Req.Location)); + if (Queue->Uri == NextURI) + { + SetFailReason("RedirectionLoop"); + _error->Error("Redirection loop encountered"); + if (Req.HaveContent == true) + return ERROR_WITH_CONTENT_PAGE; + return ERROR_UNRECOVERABLE; + } + return TRY_AGAIN_OR_REDIRECT; + } + else + { + NextURI = DeQuoteString(Req.Location); + URI tmpURI(NextURI); + if (tmpURI.Access.find('+') != std::string::npos) + { + _error->Error("Server tried to trick us into using a specific implementation: %s", tmpURI.Access.c_str()); + if (Req.HaveContent == true) + return ERROR_WITH_CONTENT_PAGE; + return ERROR_UNRECOVERABLE; + } + URI Uri(Queue->Uri); + if (Binary.find('+') != std::string::npos) + { + auto base = Binary.substr(0, Binary.find('+')); + if (base != tmpURI.Access) + { + tmpURI.Access = base + '+' + tmpURI.Access; + if (tmpURI.Access == Binary) + { + std::swap(tmpURI.Access, Uri.Access); + NextURI = tmpURI; + std::swap(tmpURI.Access, Uri.Access); + } + else + NextURI = tmpURI; + } + } + if (Queue->Uri == NextURI) + { + SetFailReason("RedirectionLoop"); + _error->Error("Redirection loop encountered"); + if (Req.HaveContent == true) + return ERROR_WITH_CONTENT_PAGE; + return ERROR_UNRECOVERABLE; + } + Uri.Access = Binary; + // same protocol redirects are okay + if (tmpURI.Access == Uri.Access) + return TRY_AGAIN_OR_REDIRECT; + // as well as http to https + else if ((Uri.Access == "http" || Uri.Access == "https+http") && tmpURI.Access == "https") + return TRY_AGAIN_OR_REDIRECT; + else + { + auto const tmpplus = tmpURI.Access.find('+'); + if (tmpplus != std::string::npos && tmpURI.Access.substr(tmpplus + 1) == "https") + { + auto const uriplus = Uri.Access.find('+'); + if (uriplus == std::string::npos) + { + if (Uri.Access == tmpURI.Access.substr(0, tmpplus)) // foo -> foo+https + return TRY_AGAIN_OR_REDIRECT; + } + else if (Uri.Access.substr(uriplus + 1) == "http" && + Uri.Access.substr(0, uriplus) == tmpURI.Access.substr(0, tmpplus)) // foo+http -> foo+https + return TRY_AGAIN_OR_REDIRECT; + } + } + _error->Error("Redirection from %s to '%s' is forbidden", Uri.Access.c_str(), NextURI.c_str()); + } + /* else pass through for error message */ + } + // retry after an invalid range response without partial data + else if (Req.Result == 416) + { + struct stat SBuf; + if (stat(Queue->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0) + { + bool partialHit = false; + if (Queue->ExpectedHashes.usable() == true) + { + Hashes resultHashes(Queue->ExpectedHashes); + FileFd file(Queue->DestFile, FileFd::ReadOnly); + Req.TotalFileSize = file.FileSize(); + Req.Date = file.ModificationTime(); + resultHashes.AddFD(file); + HashStringList const hashList = resultHashes.GetHashStringList(); + partialHit = (Queue->ExpectedHashes == hashList); + } + else if ((unsigned long long)SBuf.st_size == Req.TotalFileSize) + partialHit = true; + if (partialHit == true) + { + // the file is completely downloaded, but was not moved + if (Req.HaveContent == true) + { + // nuke the sent error page + Server->RunDataToDevNull(Req); + Req.HaveContent = false; + } + Req.StartPos = Req.TotalFileSize; + Req.Result = 200; + } + else if (RemoveFile("server", Queue->DestFile)) + { + NextURI = Queue->Uri; + return TRY_AGAIN_OR_REDIRECT; + } + } + } + + /* We have a reply we don't handle. This should indicate a perm server + failure */ + if (Req.Result < 200 || Req.Result >= 300) + { + if (_error->PendingError() == false) + { + std::string err; + strprintf(err, "HttpError%u", Req.Result); + SetFailReason(err); + _error->Error("%u %s", Req.Result, Req.Code); + } + if (Req.HaveContent == true) + return ERROR_WITH_CONTENT_PAGE; + return ERROR_UNRECOVERABLE; + } + + // This is some sort of 2xx 'data follows' reply + Res.LastModified = Req.Date; + Res.Size = Req.TotalFileSize; + return FILE_IS_OPEN; +} + /*}}}*/ +// BaseHttpMethod::SigTerm - Handle a fatal signal /*{{{*/ +// --------------------------------------------------------------------- +/* This closes and timestamps the open file. This is necessary to get + resume behavior on user abort */ +void BaseHttpMethod::SigTerm(int) +{ + if (FailFd == -1) + _exit(100); + + struct timeval times[2]; + times[0].tv_sec = FailTime; + times[1].tv_sec = FailTime; + times[0].tv_usec = times[1].tv_usec = 0; + utimes(FailFile.c_str(), times); + close(FailFd); + + _exit(100); +} + /*}}}*/ +// BaseHttpMethod::Fetch - Fetch an item /*{{{*/ +// --------------------------------------------------------------------- +/* This adds an item to the pipeline. We keep the pipeline at a fixed + depth. */ +bool BaseHttpMethod::Fetch(FetchItem *) +{ + if (Server == nullptr || QueueBack == nullptr) + return true; + + // If pipelining is disabled, we only queue 1 request + auto const AllowedDepth = Server->Pipeline ? PipelineDepth : 0; + // how deep is our pipeline currently? + decltype(PipelineDepth) CurrentDepth = 0; + for (FetchItem const *I = Queue; I != QueueBack; I = I->Next) + ++CurrentDepth; + if (CurrentDepth > AllowedDepth) + return true; + + do { + // Make sure we stick with the same server + if (Server->Comp(URI(QueueBack->Uri)) == false) + break; + + bool const UsableHashes = QueueBack->ExpectedHashes.usable(); + // if we have no hashes, do at most one such request + // as we can't fixup pipeling misbehaviors otherwise + if (CurrentDepth != 0 && UsableHashes == false) + break; + + if (UsableHashes && FileExists(QueueBack->DestFile)) + { + FileFd partial(QueueBack->DestFile, FileFd::ReadOnly); + Hashes wehave(QueueBack->ExpectedHashes); + if (QueueBack->ExpectedHashes.FileSize() == partial.FileSize()) + { + if (wehave.AddFD(partial) && + wehave.GetHashStringList() == QueueBack->ExpectedHashes) + { + FetchResult Res; + Res.Filename = QueueBack->DestFile; + Res.ResumePoint = QueueBack->ExpectedHashes.FileSize(); + URIStart(Res); + // move item to the start of the queue as URIDone will + // always dequeued the first item in the queue + if (Queue != QueueBack) + { + FetchItem *Prev = Queue; + for (; Prev->Next != QueueBack; Prev = Prev->Next) + /* look for the previous queue item */; + Prev->Next = QueueBack->Next; + QueueBack->Next = Queue; + Queue = QueueBack; + QueueBack = Prev->Next; + } + Res.TakeHashes(wehave); + URIDone(Res); + continue; + } + else + RemoveFile("Fetch-Partial", QueueBack->DestFile); + } + } + auto const Tmp = QueueBack; + QueueBack = QueueBack->Next; + SendReq(Tmp); + ++CurrentDepth; + } while (CurrentDepth <= AllowedDepth && QueueBack != nullptr); + + return true; +} + /*}}}*/ +// BaseHttpMethod::Loop - Main loop /*{{{*/ +int BaseHttpMethod::Loop() +{ + signal(SIGTERM,SigTerm); + signal(SIGINT,SigTerm); + + Server = 0; + + int FailCounter = 0; + while (1) + { + // We have no commands, wait for some to arrive + if (Queue == 0) + { + if (WaitFd(STDIN_FILENO) == false) + return 0; + } + + /* Run messages, we can accept 0 (no message) if we didn't + do a WaitFd above.. Otherwise the FD is closed. */ + int Result = Run(true); + if (Result != -1 && (Result != 0 || Queue == 0)) + { + if(FailReason.empty() == false || + ConfigFindB("DependOnSTDIN", true) == true) + return 100; + else + return 0; + } + + if (Queue == 0) + continue; + + // Connect to the server + if (Server == 0 || Server->Comp(URI(Queue->Uri)) == false) + { + if (!Queue->Proxy().empty()) + { + URI uri(Queue->Uri); + _config->Set("Acquire::" + uri.Access + "::proxy::" + uri.Host, Queue->Proxy()); + } + Server = CreateServerState(URI(Queue->Uri)); + setPostfixForMethodNames(::URI(Queue->Uri).Host.c_str()); + AllowRedirect = ConfigFindB("AllowRedirect", true); + PipelineDepth = ConfigFindI("Pipeline-Depth", 10); + Debug = DebugEnabled(); + } + + /* If the server has explicitly said this is the last connection + then we pre-emptively shut down the pipeline and tear down + the connection. This will speed up HTTP/1.0 servers a tad + since we don't have to wait for the close sequence to + complete */ + if (Server->Persistent == false) + Server->Close(); + + // Reset the pipeline + if (Server->IsOpen() == false) { + QueueBack = Queue; + Server->PipelineAnswersReceived = 0; + } + + // Connect to the host + switch (Server->Open()) + { + case ResultState::FATAL_ERROR: + Fail(false); + Server = nullptr; + continue; + case ResultState::TRANSIENT_ERROR: + Fail(true); + Server = nullptr; + continue; + case ResultState::SUCCESSFUL: + break; + } + + // Fill the pipeline. + Fetch(0); + + RequestState Req(this, Server.get()); + // Fetch the next URL header data from the server. + switch (Server->RunHeaders(Req, Queue->Uri)) + { + case ServerState::RUN_HEADERS_OK: + break; + + // The header data is bad + case ServerState::RUN_HEADERS_PARSE_ERROR: + { + _error->Error(_("Bad header data")); + Fail(true); + Server->Close(); + RotateDNS(); + continue; + } + + // The server closed a connection during the header get.. + default: + case ServerState::RUN_HEADERS_IO_ERROR: + { + FailCounter++; + _error->Discard(); + Server->Close(); + Server->Pipeline = false; + Server->PipelineAllowed = false; + + if (FailCounter >= 2) + { + Fail(_("Connection failed"),true); + FailCounter = 0; + } + + RotateDNS(); + continue; + } + }; + + // Decide what to do. + FetchResult Res; + Res.Filename = Queue->DestFile; + switch (DealWithHeaders(Res, Req)) + { + // Ok, the file is Open + case FILE_IS_OPEN: + { + URIStart(Res); + + // Run the data + ResultState Result = ResultState::SUCCESSFUL; + + // ensure we don't fetch too much + // we could do "Server->MaximumSize = Queue->MaximumSize" here + // but that would break the clever pipeline messup detection + // so instead we use the size of the biggest item in the queue + Req.MaximumSize = FindMaximumObjectSizeInQueue(); + + if (Req.HaveContent) + { + /* If the server provides Content-Length we can figure out with it if + this satisfies any request we have made so far (in the pipeline). + If not we can kill the connection as whatever file the server is trying + to send to us would be rejected with a hashsum mismatch later or triggers + a maximum size error. We don't run the data to /dev/null as this can be MBs + of junk data we would waste bandwidth on and instead just close the connection + to reopen a fresh one which should be more cost/time efficient */ + if (Req.DownloadSize > 0) + { + decltype(Queue->ExpectedHashes.FileSize()) const filesize = Req.StartPos + Req.DownloadSize; + bool found = false; + for (FetchItem const *I = Queue; I != 0 && I != QueueBack; I = I->Next) + { + auto const fs = I->ExpectedHashes.FileSize(); + if (fs == 0 || fs == filesize) + { + found = true; + break; + } + } + if (found == false) + { + SetFailReason("MaximumSizeExceeded"); + _error->Error(_("File has unexpected size (%llu != %llu). Mirror sync in progress?"), + filesize, Queue->ExpectedHashes.FileSize()); + Result = ResultState::FATAL_ERROR; + } + } + if (Result == ResultState::SUCCESSFUL) + Result = Server->RunData(Req); + } + + /* If the server is sending back sizeless responses then fill in + the size now */ + if (Res.Size == 0) + Res.Size = Req.File.Size(); + + // Close the file, destroy the FD object and timestamp it + FailFd = -1; + Req.File.Close(); + + // Timestamp + struct timeval times[2]; + times[0].tv_sec = times[1].tv_sec = Req.Date; + times[0].tv_usec = times[1].tv_usec = 0; + utimes(Queue->DestFile.c_str(), times); + + // Send status to APT + if (Result == ResultState::SUCCESSFUL) + { + Hashes * const resultHashes = Server->GetHashes(); + HashStringList const hashList = resultHashes->GetHashStringList(); + if (PipelineDepth != 0 && Queue->ExpectedHashes.usable() == true && Queue->ExpectedHashes != hashList) + { + // we did not get the expected hash… mhhh: + // could it be that server/proxy messed up pipelining? + FetchItem * BeforeI = Queue; + for (FetchItem *I = Queue->Next; I != 0 && I != QueueBack; I = I->Next) + { + if (I->ExpectedHashes.usable() == true && I->ExpectedHashes == hashList) + { + // yes, he did! Disable pipelining and rewrite queue + if (Server->Pipeline == true) + { + Warning(_("Automatically disabled %s due to incorrect response from server/proxy. (man 5 apt.conf)"), "Acquire::http::Pipeline-Depth"); + Server->Pipeline = false; + Server->PipelineAllowed = false; + // we keep the PipelineDepth value so that the rest of the queue can be fixed up as well + } + Rename(Res.Filename, I->DestFile); + Res.Filename = I->DestFile; + BeforeI->Next = I->Next; + I->Next = Queue; + Queue = I; + break; + } + BeforeI = I; + } + } + if (Server->Pipeline == true) + { + Server->PipelineAnswersReceived++; + } + Res.TakeHashes(*resultHashes); + URIDone(Res); + } + else + { + if (Server->IsOpen() == false) + { + FailCounter++; + _error->Discard(); + Server->Close(); + + if (FailCounter >= 2) + { + Fail(_("Connection failed"),true); + FailCounter = 0; + } + + QueueBack = Queue; + } + else + { + Server->Close(); + switch (Result) + { + case ResultState::TRANSIENT_ERROR: + Fail(true); + break; + case ResultState::FATAL_ERROR: + case ResultState::SUCCESSFUL: + Fail(false); + break; + } + } + } + break; + } + + // IMS hit + case IMS_HIT: + { + URIDone(Res); + break; + } + + // Hard server error, not found or something + case ERROR_UNRECOVERABLE: + { + Fail(); + break; + } + + // Hard internal error, kill the connection and fail + case ERROR_NOT_FROM_SERVER: + { + Fail(); + RotateDNS(); + Server->Close(); + break; + } + + // We need to flush the data, the header is like a 404 w/ error text + case ERROR_WITH_CONTENT_PAGE: + { + Server->RunDataToDevNull(Req); + constexpr unsigned int TransientCodes[] = { + 408, // Request Timeout + 429, // Too Many Requests + 500, // Internal Server Error + 502, // Bad Gateway + 503, // Service Unavailable + 504, // Gateway Timeout + 599, // Network Connect Timeout Error + }; + if (std::find(std::begin(TransientCodes), std::end(TransientCodes), Req.Result) != std::end(TransientCodes)) + Fail(true); + else + Fail(); + break; + } + + // Try again with a new URL + case TRY_AGAIN_OR_REDIRECT: + { + // Clear rest of response if there is content + if (Req.HaveContent) + Server->RunDataToDevNull(Req); + Redirect(NextURI); + break; + } + + default: + Fail(_("Internal error")); + break; + } + + FailCounter = 0; + } + + return 0; +} + /*}}}*/ +unsigned long long BaseHttpMethod::FindMaximumObjectSizeInQueue() const /*{{{*/ +{ + unsigned long long MaxSizeInQueue = 0; + for (FetchItem *I = Queue; I != 0 && I != QueueBack; I = I->Next) + MaxSizeInQueue = std::max(MaxSizeInQueue, I->MaximumSize); + return MaxSizeInQueue; +} + /*}}}*/ +BaseHttpMethod::BaseHttpMethod(std::string &&Binary, char const *const Ver, unsigned long const Flags) /*{{{*/ + : aptAuthConfMethod(std::move(Binary), Ver, Flags), Server(nullptr), + AllowRedirect(false), Debug(false), PipelineDepth(10) +{ +} + /*}}}*/ +bool BaseHttpMethod::Configuration(std::string Message) /*{{{*/ +{ + if (aptAuthConfMethod::Configuration(Message) == false) + return false; + + _config->CndSet("Acquire::tor::Proxy", + "socks5h://apt-transport-tor@127.0.0.1:9050"); + return true; +} + /*}}}*/ +bool BaseHttpMethod::AddProxyAuth(URI &Proxy, URI const &Server) /*{{{*/ +{ + MaybeAddAuthTo(Proxy); + if (std::find(methodNames.begin(), methodNames.end(), "tor") != methodNames.end() && + Proxy.User == "apt-transport-tor" && Proxy.Password.empty()) + { + std::string pass = Server.Host; + pass.erase(std::remove_if(pass.begin(), pass.end(), [](char const c) { return std::isalnum(c) == 0; }), pass.end()); + if (pass.length() > 255) + Proxy.Password = pass.substr(0, 255); + else + Proxy.Password = std::move(pass); + } + return true; +} + /*}}}*/ diff --git a/methods/basehttp.cc b/methods/basehttp.cc index 47639e9..6bc8b5a 100644 --- a/methods/basehttp.cc +++ b/methods/basehttp.cc @@ -372,7 +372,7 @@ BaseHttpMethod::DealWithHeaders(FetchResult &Res, RequestState &Req) // as well as http to https else if ((Uri.Access == "http" || Uri.Access == "https+http") && tmpURI.Access == "https") return TRY_AGAIN_OR_REDIRECT; - // allow https to http redirects (for https mirrordirectors with http mirrors) + // allow https to http redirects (for https mirrordirectors with http mirrors) else if ((Uri.Access == "https" || Uri.Access == "https+http") && tmpURI.Access == "http") return TRY_AGAIN_OR_REDIRECT; else diff --git a/po/apt-all.pot b/po/apt-all.pot index 2326a6d..8b1b209 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: apt 2.0.2\n" +"Project-Id-Version: apt 2.1.1\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2020-04-09 12:21+0200\n" +"POT-Creation-Date: 2020-05-08 18:03+0200\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/pl.po b/po/pl.po index 6ffc0ee..8bbbd1c 100644 --- a/po/pl.po +++ b/po/pl.po @@ -1779,12 +1779,12 @@ msgstr "Uwaga, wybieranie \"%s\" zamiast \"%s\"\n" #: apt-private/private-cmndline.cc msgid "Most used commands:" -msgstr "" +msgstr "Najczęściej używane polecenia" #: apt-private/private-cmndline.cc #, c-format msgid "See %s for more information about the available commands." -msgstr "" +msgstr "Po więcej informacji o dostępnych poleceniach zobacz %s" #: apt-private/private-cmndline.cc msgid "" @@ -2888,7 +2888,7 @@ msgstr "Pobiera pakiet binarny do bieżącego katalogu" #: cmdline/apt-get.cc msgid "Download and display the changelog for the given package" -msgstr "Pobiera i wyświetla dziennika zmian wybranych pakietów" +msgstr "Pobiera i wyświetla dziennik zmian wybranych pakietów" #: cmdline/apt-helper.cc msgid "Need one URL as argument" diff --git a/test/integration/test-allow-scores-for-all-dependency-types b/test/integration/test-allow-scores-for-all-dependency-types index 9b300b7..b8a9ed3 100755 --- a/test/integration/test-allow-scores-for-all-dependency-types +++ b/test/integration/test-allow-scores-for-all-dependency-types @@ -116,42 +116,18 @@ Conf baz (2 unversioned [amd64])' aptget install baz -st unversioned testsuccessequal 'Reading package lists... Building dependency tree... The following additional packages will be installed: - foo -The following packages will be REMOVED: bar -The following NEW packages will be installed: - baz -The following packages will be upgraded: - foo -1 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. -Remv bar [1] -Inst foo [1] (2 versioned [amd64]) -Inst baz (2 versioned [amd64]) -Conf foo (2 versioned [amd64]) -Conf baz (2 versioned [amd64])' aptget install baz -st versioned - -testsuccessequal 'Reading package lists... -Building dependency tree... -The following NEW packages will be installed: - baz -0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. -Inst baz (2 unversioned [amd64]) -Conf baz (2 unversioned [amd64])' aptget install baz -st unversioned -testsuccessequal 'Reading package lists... -Building dependency tree... -The following additional packages will be installed: - foo The following packages will be REMOVED: - bar + foo The following NEW packages will be installed: baz The following packages will be upgraded: - foo + bar 1 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. -Remv bar [1] -Inst foo [1] (2 versioned [amd64]) +Remv foo [1] +Inst bar [1] (2 versioned [amd64]) Inst baz (2 versioned [amd64]) -Conf foo (2 versioned [amd64]) +Conf bar (2 versioned [amd64]) Conf baz (2 versioned [amd64])' aptget install baz -st versioned # recreating the exact situation is hard, so we pull tricks to get the score diff --git a/test/integration/test-apt-never-markauto-sections b/test/integration/test-apt-never-markauto-sections index aa145d2..6ad89c5 100755 --- a/test/integration/test-apt-never-markauto-sections +++ b/test/integration/test-apt-never-markauto-sections @@ -27,7 +27,7 @@ testsuccess aptcache show nosection testfailure grep 'Section' rootdir/tmp/testsuccess.output testequal 'dpkg' aptmark showmanual -testsuccess aptget install mydesktop -y -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 +testsuccess aptget install mydesktop -y -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 -o Debug::pkgDepCache::AutoInstall=1 testmarkedmanual 'dpkg' 'mydesktop' testmarkedauto 'mydesktop-core' 'foreignpkg:i386' 'texteditor' 'browser' 'nosection' @@ -75,12 +75,7 @@ testsuccess aptmark auto nosection testmarkedauto 'browser' 'nosection' testmarkedmanual 'dpkg' 'foreignpkg:i386' -# nosection should be auto, not manual, but is marked as such by the resolver -# removing mydesktop-core temporally… the resolver should be figuring out here -# that there is no point of removing mydesktop-core as its an unavoidable -# dependency of the user-requested mydesktop - testsuccess aptget install mydesktop -y -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 -o Debug::pkgDepCache::AutoInstall=1 -testmarkedmanual 'dpkg' 'foreignpkg:i386' 'mydesktop' 'nosection' -testmarkedauto 'browser' 'mydesktop-core' 'texteditor' +testmarkedmanual 'dpkg' 'foreignpkg:i386' 'mydesktop' +testmarkedauto 'browser' 'mydesktop-core' 'texteditor' 'nosection' diff --git a/test/integration/test-apt-patterns b/test/integration/test-apt-patterns index b55caf3..33df21d 100755 --- a/test/integration/test-apt-patterns +++ b/test/integration/test-apt-patterns @@ -233,3 +233,37 @@ testsuccessequal "Listing..." apt list '?x-name-fnmatch(1)' testsuccessequal "Listing... automatic1/now 1.0 i386 [installed,local] manual1/now 1.0 i386 [installed,local]" apt list '?x-name-fnmatch(*1)' + + +# * wildcards should still work +testsuccessequal "Listing... +automatic1/now 1.0 i386 [installed,local] +automatic2/now 1.0 i386 [installed,local]" apt list 'automatic*' + +testfailureequal "Reading package lists... +Building dependency tree... +Reading state information... +Note, selecting 'automatic1' for glob 'automatic*' +Note, selecting 'automatic2' for glob 'automatic*' +automatic1 is already the newest version (1.0). +automatic1 set to manually installed. +automatic2 is already the newest version (1.0). +automatic2 set to manually installed. +You might want to run 'apt --fix-broken install' to correct these. +The following packages have unmet dependencies: + broken : Depends: does-not-exist but it is not installable +E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution)." apt install -s 'automatic*' + +# other wildcards should fail + +testfailureequal "Listing... +E: input:0-10: error: Expected pattern + automatic? + ^^^^^^^^^^" apt list 'automatic?' + + + +testfailureequal "Reading package lists... +Building dependency tree... +Reading state information... +E: Unable to locate package automatic?" apt install -s 'automatic?' diff --git a/test/integration/test-bug-604222-new-and-autoremove b/test/integration/test-bug-604222-new-and-autoremove index b8faf4f..6009ca0 100755 --- a/test/integration/test-bug-604222-new-and-autoremove +++ b/test/integration/test-bug-604222-new-and-autoremove @@ -88,12 +88,13 @@ rm -f rootdir/var/lib/apt/extended_states CONFLICTING='Reading package lists... Building dependency tree... MarkInstall dummy-archive:i386 < none -> 0.invalid.0 @un puN Ib > FU=1 - MarkInstall libavcodec52:i386 < none -> 4:0.5.2-6 @un uN > FU=0 MarkInstall libvtk5-dev:i386 < none -> 5.4.2-8 @un uN Ib > FU=0 MarkInstall libvtk5.4:i386 < none -> 5.4.2-8 @un uN > FU=0 MarkKeep libvtk5-dev:i386 < none -> 5.4.2-8 @un uN > FU=0 MarkKeep libvtk5-dev:i386 < none -> 5.4.2-8 @un uN > FU=0 + Ignore MarkGarbage of libavcodec52:i386 < none -> 4:0.5.2-6 @un puN > as its mode (Install) is protected MarkDelete libvtk5.4:i386 < none -> 5.4.2-8 @un ugN > FU=0 + Ignore MarkGarbage of libavcodec52:i386 < none -> 4:0.5.2-6 @un puN > as its mode (Install) is protected The following additional packages will be installed: libavcodec52 libopenal-dev The following NEW packages will be installed: diff --git a/test/integration/test-bug-618848-always-respect-user-requests b/test/integration/test-bug-618848-always-respect-user-requests index fa190a9..230683a 100755 --- a/test/integration/test-bug-618848-always-respect-user-requests +++ b/test/integration/test-bug-618848-always-respect-user-requests @@ -18,8 +18,6 @@ Building dependency tree... MarkDelete libdb4.8:i386 < 1.0 @ii pmK > FU=1 MarkDelete exim4-daemon-light:i386 < 1.0 @ii mK Ib > FU=0 MarkInstall exim4-daemon-heavy:i386 < none -> 1.0 @un uN Ib > FU=0 - Ignore MarkInstall of libdb4.8:i386 < 1.0 @ii pmR > as its mode (Delete) is protected - MarkDelete exim4-daemon-heavy:i386 < none -> 1.0 @un uN Ib > FU=0 MarkDelete exim4:i386 < 1.0 @ii mK Ib > FU=0 The following packages will be REMOVED: exim4 exim4-daemon-light libdb4.8 diff --git a/test/integration/test-bug-735967-lib32-to-i386-unavailable b/test/integration/test-bug-735967-lib32-to-i386-unavailable index 3b705d5..9dbd17b 100755 --- a/test/integration/test-bug-735967-lib32-to-i386-unavailable +++ b/test/integration/test-bug-735967-lib32-to-i386-unavailable @@ -52,8 +52,8 @@ or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: - foo : Depends: libfoo but it is not going to be installed -E: Unable to correct problems, you have held broken packages.' aptget install foo -s + libfoo : Depends: libfoo-bin but it is not installable +E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.' aptget install foo -s # activate multiarch configarchitecture 'amd64' 'i386' diff --git a/test/integration/test-explore-or-groups-in-markinstall b/test/integration/test-explore-or-groups-in-markinstall new file mode 100755 index 0000000..763852f --- /dev/null +++ b/test/integration/test-explore-or-groups-in-markinstall @@ -0,0 +1,130 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'okay' 'all' '1' +insertpackage 'unstable' 'upgrade' 'all' '2' +insertpackage 'unstable' 'unneeded' 'all' '1' +insertpackage 'unstable' 'later' 'all' '1' + +insertpackage 'unstable' 'bad-level0' 'all' '1' 'Depends: unneeded, unknown' +insertpackage 'unstable' 'bad-level1' 'all' '1' 'Depends: bad-level0' +insertpackage 'unstable' 'bad-upgrade-level0' 'all' '2' 'Depends: unneeded, unknown' +insertpackage 'unstable' 'bad-upgrade-level1' 'all' '2' 'Depends: bad-upgrade-level0 (>= 2)' +insertpackage 'unstable' 'bad-conflict-level0' 'all' '1' 'Depends: unneeded +Conflicts: bad-conflict-level2' +insertpackage 'unstable' 'bad-conflict-level1' 'all' '1' 'Depends: bad-conflict-level0' +insertpackage 'unstable' 'bad-conflict-level2' 'all' '1' 'Depends: bad-conflict-level1' + +insertinstalledpackage 'upgrade' 'all' '1' +insertinstalledpackage 'bad-upgrade' 'all' '1' +insertinstalledpackage 'bad-upgrade-level0' 'all' '1' +insertinstalledpackage 'bad-upgrade-level1' 'all' '1' + +insertfoos() { + insertpackage 'unstable' "foo-${1}-level0" 'all' '1' "${2}: unknown | unknown | okay | later" + insertpackage 'unstable' "foo-${1}-level1" 'all' '1' "${2}: bad-level0 | bad-level0 | okay | later" + insertpackage 'unstable' "foo-${1}-level2" 'all' '1' "${2}: bad-level1 | bad-level1 | okay | later" + + insertpackage 'unstable' "foo-${1}-upgrade-level0" 'all' '1' "${2}: bad-upgrade (>= 2) | okay | upgrade (>= 2) | later" + insertpackage 'unstable' "foo-${1}-upgrade-level1" 'all' '1' "${2}: bad-upgrade-level0 (>= 2) | bad-upgrade-level0 (>= 2) | bad-level0 | okay | upgrade (>= 2) | later" + insertpackage 'unstable' "foo-${1}-upgrade-level2" 'all' '1' "${2}: bad-upgrade-level1 (>= 2) | bad-upgrade-level1 (>= 2) | bad-level1 | okay | upgrade (>= 2) | later" + + insertpackage 'unstable' "foo-${1}-conflict" 'all' '1' "${2}: unknown | bad-conflict-level2 | okay | later" +} +insertfoos 'd' 'Depends' +insertfoos 'r' 'Recommends' + +setupaptarchive + +_testsuccessheadtailequal() { + local TYPE="$1" + shift + msggroup "testsuccess${TYPE}equal" + local HEADLINES="$1" + local CMP="$2" + shift 2 + testsuccesswithglobalerror 'testsuccess' 'EW' "$@" + cp "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess${TYPE}equal.output" + testsuccessequal "$CMP" "${TYPE}" -n "$HEADLINES" "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess${TYPE}equal.output" + msggroup +} +testsuccessheadequal() { + _testsuccessheadtailequal 'head' "$@" +} +testsuccesstailequal() { + _testsuccessheadtailequal 'tail' "$@" +} +checkfoos() { + msgmsg 'Install checks with foos dependency type' "$2" + for level in 0 1 2; do + testsuccessheadequal 7 "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + okay +The following NEW packages will be installed: + foo-${1}-level${level} okay +0 upgraded, 2 newly installed, 0 to remove and 3 not upgraded." apt install foo-${1}-level${level} -s + testsuccessheadequal 9 "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + upgrade +The following NEW packages will be installed: + foo-${1}-upgrade-level${level} +The following packages will be upgraded: + upgrade +1 upgraded, 1 newly installed, 0 to remove and $((2-${level})) not upgraded." apt install foo-${1}-upgrade-level${level} -s + done + + testsuccessheadequal 7 "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + okay +The following NEW packages will be installed: + foo-${1}-conflict okay +0 upgraded, 2 newly installed, 0 to remove and 3 not upgraded." apt install foo-${1}-conflict -s +} +checkfoos 'd' 'Depends' +checkfoos 'r' 'Recommends' + +TEST_WITH_APTITUDE=false +msgtest 'Check if aptitude is available for additional tests' +if dpkg-checkbuilddeps -d 'aptitude' /dev/null >/dev/null 2>&1; then + TEST_WITH_APTITUDE=true + # we don't document aptitude config options + sed -i -e '/^#x-apt-configure-index/ d' "$(getaptconfig)" + msgpass +else + msgskip 'not installed' +fi + +if $TEST_WITH_APTITUDE; then + OKAYAPTITUDE='0 packages upgraded, 2 newly installed, 0 to remove and 3 not upgraded. +Need to get 0 B of archives. After unpacking 86.0 kB will be used. +Would download/install/remove packages.' + testsuccesstailequal 3 "$OKAYAPTITUDE" aptitude install foo-d-level2 -sy + testsuccesstailequal 3 "$OKAYAPTITUDE" aptitude install foo-r-level2 -sy + testsuccesstailequal 3 "$OKAYAPTITUDE" aptitude install foo-d-conflict -sy + testsuccesstailequal 3 "$OKAYAPTITUDE" aptitude install foo-r-conflict -sy +fi + +testfailure apt install bad-upgrade-level1 -s +testfailure apt install bad-conflict-level2 -s + +if $TEST_WITH_APTITUDE; then + testsuccesstailequal 6 'The following packages have been kept back: + bad-upgrade-level1 +No packages will be installed, upgraded, or removed. +0 packages upgraded, 0 newly installed, 0 to remove and 2 not upgraded. +Need to get 0 B of archives. After unpacking 0 B will be used. +Would download/install/remove packages.' aptitude install bad-upgrade-level1 -sy + # aptitude does not show the kept back message in this case… + testsuccesstailequal 4 'No packages will be installed, upgraded, or removed. +0 packages upgraded, 0 newly installed, 0 to remove and 3 not upgraded. +Need to get 0 B of archives. After unpacking 0 B will be used. +Would download/install/remove packages.' aptitude install bad-conflict-level2 -sy +fi diff --git a/test/integration/test-multiarch-allowed b/test/integration/test-multiarch-allowed index 98555bc..b748539 100755 --- a/test/integration/test-multiarch-allowed +++ b/test/integration/test-multiarch-allowed @@ -64,12 +64,15 @@ Conf foo:i386 (1 unstable [i386]) Conf needsfoo:i386 (1 unstable [i386])' aptget install needsfoo:i386 -s testfailureequal "$BADPREFIX The following packages have unmet dependencies: - needsfoo:i386 : Depends: foo:i386 but it is not going to be installed -E: Unable to correct problems, you have held broken packages." aptget install needsfoo:i386 foo:amd64 -s + foo : Conflicts: foo:i386 but 1 is to be installed + foo:i386 : Conflicts: foo but 1 is to be installed +E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages." aptget install needsfoo:i386 foo:amd64 -s testfailureequal "$BADPREFIX The following packages have unmet dependencies: - needsfoo : Depends: foo but it is not going to be installed -E: Unable to correct problems, you have held broken packages." aptget install needsfoo foo:i386 -s + foo : Conflicts: foo:i386 but 1 is to be installed + foo:i386 : Conflicts: foo but 1 is to be installed +E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages." aptget install needsfoo foo:i386 -s +exit solveableinsinglearch1() { testsuccessequal "Reading package lists... -- GitLab