diff options
45 files changed, 900 insertions, 438 deletions
diff --git a/CMake/Misc.cmake b/CMake/Misc.cmake index 6ad0b9479..8cb18b6ac 100644 --- a/CMake/Misc.cmake +++ b/CMake/Misc.cmake @@ -51,17 +51,17 @@ function(add_vendor_file) endfunction() # Add symbolic links to a file -function(add_slaves destination master) - set(slaves "") - foreach(slave ${ARGN}) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${slave} - COMMAND ${CMAKE_COMMAND} -E create_symlink ${master} ${CMAKE_CURRENT_BINARY_DIR}/${slave}) - list(APPEND slaves ${CMAKE_CURRENT_BINARY_DIR}/${slave}) +function(add_links directory target) + set(link_names "") + foreach(link_name ${ARGN}) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${link_name} + COMMAND ${CMAKE_COMMAND} -E create_symlink ${target} ${CMAKE_CURRENT_BINARY_DIR}/${link_name}) + list(APPEND link_names ${CMAKE_CURRENT_BINARY_DIR}/${link_name}) endforeach() - STRING(REPLACE "/" "-" master "${master}") - add_custom_target(${master}-slaves ALL DEPENDS ${slaves}) - install(FILES ${slaves} DESTINATION ${destination}) + STRING(REPLACE "/" "-" target "${target}") + add_custom_target(${target}-link_names ALL DEPENDS ${link_names}) + install(FILES ${link_names} DESTINATION ${directory}) endfunction() # Generates a simple version script versioning everything with current SOVERSION diff --git a/CMake/Translations.cmake b/CMake/Translations.cmake index 54a635ab6..24925105c 100644 --- a/CMake/Translations.cmake +++ b/CMake/Translations.cmake @@ -136,8 +136,8 @@ function(apt_add_update_po) list(APPEND potfiles ${CMAKE_CURRENT_BINARY_DIR}/${domain}.pot) endforeach() - get_filename_component(master_name ${output} NAME_WE) - add_custom_target(nls-${master_name} + get_filename_component(primary_name ${output} NAME_WE) + add_custom_target(nls-${primary_name} COMMAND msgcomm --sort-by-file --add-location=file --more-than=0 --output=${output} ${potfiles} @@ -154,11 +154,11 @@ function(apt_add_update_po) endif() add_custom_target(update-po-${langcode} COMMAND msgmerge -q --previous --update --backup=none ${translation} ${output} - DEPENDS nls-${master_name} + DEPENDS nls-${primary_name} ) add_dependencies(update-po update-po-${langcode}) endforeach() - add_dependencies(update-po nls-${master_name}) + add_dependencies(update-po nls-${primary_name}) endfunction() function(apt_add_po_statistics excluded) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dbf8abc3..afd74adb5 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,i # Configure some variables like package, version and architecture. set(PACKAGE ${PROJECT_NAME}) set(PACKAGE_MAIL "APT Development Team <deity@lists.debian.org>") -set(PACKAGE_VERSION "2.1.6") +set(PACKAGE_VERSION "2.1.7") string(REGEX MATCH "^[0-9.]+" PROJECT_VERSION ${PACKAGE_VERSION}) if (NOT DEFINED DPKG_DATADIR) diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index cba772d41..cd09a6944 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -517,18 +517,37 @@ void pkgProblemResolver::MakeScores() Score += PrioInstalledAndNotObsolete; // propagate score points along dependencies - for (pkgCache::DepIterator D = InstVer.DependsList(); D.end() == false; ++D) + for (pkgCache::DepIterator D = InstVer.DependsList(); not D.end(); ++D) { if (DepMap[D->Type] == 0) continue; pkgCache::PkgIterator const T = D.TargetPkg(); - if (D->Version != 0) + if (not D.IsIgnorable(T)) { - pkgCache::VerIterator const IV = Cache[T].InstVerIter(Cache); - if (IV.end() == true || D.IsSatisfied(IV) == false) + if (D->Version != 0) + { + pkgCache::VerIterator const IV = Cache[T].InstVerIter(Cache); + if (IV.end() || not D.IsSatisfied(IV)) + continue; + } + Scores[T->ID] += DepMap[D->Type]; + } + + std::vector<map_id_t> providers; + for (auto Prv = T.ProvidesList(); not Prv.end(); ++Prv) + { + if (D.IsIgnorable(Prv)) + continue; + auto const PV = Prv.OwnerVer(); + auto const PP = PV.ParentPkg(); + if (PV != Cache[PP].InstVerIter(Cache) || not D.IsSatisfied(Prv)) continue; + providers.push_back(PP->ID); } - Scores[T->ID] += DepMap[D->Type]; + std::sort(providers.begin(), providers.end()); + providers.erase(std::unique(providers.begin(), providers.end()), providers.end()); + for (auto const prv : providers) + Scores[prv] += DepMap[D->Type]; } } @@ -564,13 +583,25 @@ void pkgProblemResolver::MakeScores() provide important packages extremely important */ for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I) { - for (pkgCache::PrvIterator P = I.ProvidesList(); P.end() == false; ++P) + auto const transfer = abs(Scores[I->ID] - OldScores[I->ID]); + if (transfer == 0) + continue; + + std::vector<map_id_t> providers; + for (auto Prv = I.ProvidesList(); not Prv.end(); ++Prv) { - // Only do it once per package - if ((pkgCache::Version *)P.OwnerVer() != Cache[P.OwnerPkg()].InstallVer) + if (Prv.IsMultiArchImplicit()) + continue; + auto const PV = Prv.OwnerVer(); + auto const PP = PV.ParentPkg(); + if (PV != Cache[PP].InstVerIter(Cache)) continue; - Scores[P.OwnerPkg()->ID] += abs(Scores[I->ID] - OldScores[I->ID]); + providers.push_back(PP->ID); } + std::sort(providers.begin(), providers.end()); + providers.erase(std::unique(providers.begin(), providers.end()), providers.end()); + for (auto const prv : providers) + Scores[prv] += transfer; } /* Protected things are pushed really high up. This number should put them diff --git a/apt-pkg/contrib/gpgv.cc b/apt-pkg/contrib/gpgv.cc index d956eaf00..28f3150c3 100644 --- a/apt-pkg/contrib/gpgv.cc +++ b/apt-pkg/contrib/gpgv.cc @@ -251,6 +251,9 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, setenv("APT_CONFIG", conf.get(), 1); } + // Tell apt-key not to emit warnings + setenv("APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE", "1", 1); + if (releaseSignature == DETACHED) { auto detached = make_unique_FILE(FileGPG, "r"); diff --git a/apt-pkg/contrib/srvrec.cc b/apt-pkg/contrib/srvrec.cc index 7d9bf116e..4ca208273 100644 --- a/apt-pkg/contrib/srvrec.cc +++ b/apt-pkg/contrib/srvrec.cc @@ -137,17 +137,12 @@ bool GetSrvRecords(std::string name, std::vector<SrvRec> &Result) // sort them by priority std::stable_sort(Result.begin(), Result.end()); - for(std::vector<SrvRec>::iterator I = Result.begin(); - I != Result.end(); ++I) - { - if (_config->FindB("Debug::Acquire::SrvRecs", false) == true) - { - std::cerr << "SrvRecs: got " << I->target - << " prio: " << I->priority - << " weight: " << I->weight - << std::endl; - } - } + if (_config->FindB("Debug::Acquire::SrvRecs", false)) + for(auto const &R : Result) + std::cerr << "SrvRecs: got " << R.target + << " prio: " << R.priority + << " weight: " << R.weight + << '\n'; return true; } diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 972472986..bd4856526 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -1771,7 +1771,7 @@ URI::operator string() { // FIXME: Technically userinfo is permitted even less // characters than these, but this is not conveniently - // expressed with a blacklist. + // expressed with a denylist. Res << QuoteString(User, ":/?#[]@"); if (Password.empty() == false) Res << ":" << QuoteString(Password, ":/?#[]@"); diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index ab957a01a..240946529 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -318,6 +318,8 @@ bool debListParser::UsePackage(pkgCache::PkgIterator &Pkg, return false; if (Section.FindFlag(pkgTagSection::Key::Important,Pkg->Flags,pkgCache::Flag::Important) == false) return false; + if (Section.FindFlag(pkgTagSection::Key::Protected, Pkg->Flags, pkgCache::Flag::Important) == false) + return false; if (std::find(forceEssential.begin(), forceEssential.end(), Pkg.Name()) != forceEssential.end()) { @@ -1018,12 +1020,11 @@ debDebFileParser::debDebFileParser(FileFd *File, std::string const &DebFile) bool debDebFileParser::UsePackage(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver) { - bool res = debListParser::UsePackage(Pkg, Ver); - // we use the full file path as a provides so that the file is found - // by its name - if(NewProvides(Ver, DebFile, Pkg.Cache()->NativeArch(), Ver.VerStr(), 0) == false) + if (not debListParser::UsePackage(Pkg, Ver)) return false; - return res; + // we use the full file path as a provides so that the file is found by its name + // using the MultiArchImplicit flag for this is a bit of a stretch + return NewProvides(Ver, DebFile, Pkg.Cache()->NativeArch(), Ver.VerStr(), pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific); } debListParser::~debListParser() {} diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index 7d4bf7213..eac43c3b7 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -466,8 +466,13 @@ pid_t debSystem::ExecDpkg(std::vector<std::string> const &sArgs, int * const inp /*}}}*/ bool debSystem::MultiArchSupported() const /*{{{*/ { + return AssertFeature("multi-arch"); +} + /*}}}*/ +bool debSystem::AssertFeature(std::string const &feature) /*{{{*/ +{ std::vector<std::string> Args = GetDpkgBaseCommand(); - Args.push_back("--assert-multi-arch"); + Args.push_back("--assert-" + feature); pid_t const dpkgAssertMultiArch = ExecDpkg(Args, nullptr, nullptr, true); if (dpkgAssertMultiArch > 0) { diff --git a/apt-pkg/deb/debsystem.h b/apt-pkg/deb/debsystem.h index 2e5a8550c..b3d241512 100644 --- a/apt-pkg/deb/debsystem.h +++ b/apt-pkg/deb/debsystem.h @@ -45,6 +45,7 @@ class debSystem : public pkgSystem APT_HIDDEN static void DpkgChrootDirectory(); APT_HIDDEN static pid_t ExecDpkg(std::vector<std::string> const &sArgs, int * const inputFd, int * const outputFd, bool const DiscardOutput); bool MultiArchSupported() const override; + static bool AssertFeature(std::string const &Feature); std::vector<std::string> ArchitecturesSupported() const override; bool LockInner(OpProgress *const Progress, int timeoutSec) override; diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index ef73881c8..c496538cc 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -1416,6 +1416,15 @@ static bool ItemIsEssential(pkgDPkgPM::Item const &I) return true; return (I.Pkg->Flags & pkgCache::Flag::Essential) != 0; } +static bool ItemIsProtected(pkgDPkgPM::Item const &I) +{ + static auto const cachegen = _config->Find("pkgCacheGen::Protected"); + if (cachegen == "none" || cachegen == "native") + return true; + if (unlikely(I.Pkg.end())) + return true; + return (I.Pkg->Flags & pkgCache::Flag::Important) != 0; +} bool pkgDPkgPM::ExpandPendingCalls(std::vector<Item> &List, pkgDepCache &Cache) { { @@ -1712,6 +1721,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) OpenLog(); bool dpkgMultiArch = _system->MultiArchSupported(); + bool dpkgProtectedField = debSystem::AssertFeature("protected-field"); // start pty magic before the loop StartPtyMagic(); @@ -1780,6 +1790,10 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) { ADDARGC("--force-remove-essential"); } + if (dpkgProtectedField && std::any_of(I, J, ItemIsProtected)) + { + ADDARGC("--force-remove-protected"); + } ADDARGC("--remove"); break; diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index f90a41e22..c7ef7a400 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -839,13 +839,73 @@ void pkgDepCache::Update(PkgIterator const &Pkg) Update(P.ParentPkg().RevDependsList()); } /*}}}*/ +// DepCache::IsModeChangeOk - check if it is ok to change the mode /*{{{*/ +// --------------------------------------------------------------------- +/* this is used by all Mark methods on the very first line to check sanity + and prevents mode changes for packages on hold for example. + If you want to check Mode specific stuff you can use the virtual public + Is<Mode>Ok methods instead */ +static char const* PrintMode(char const mode) +{ + switch (mode) + { + case pkgDepCache::ModeInstall: return "Install"; + case pkgDepCache::ModeKeep: return "Keep"; + case pkgDepCache::ModeDelete: return "Delete"; + case pkgDepCache::ModeGarbage: return "Garbage"; + default: return "UNKNOWN"; + } +} +static bool IsModeChangeOk(pkgDepCache &Cache, pkgDepCache::ModeList const mode, pkgCache::PkgIterator const &Pkg, + unsigned long const Depth, bool const FromUser, bool const DebugMarker) +{ + // we are not trying to hard… + if (unlikely(Depth > 100)) + return false; + + // general sanity + if (unlikely(Pkg.end() == true || Pkg->VersionList == 0)) + return false; + + // the user is always right + if (FromUser == true) + return true; + + auto &P = Cache[Pkg]; + // not changing the mode is obviously also fine as we might want to call + // e.g. MarkInstall multiple times with different arguments for the same package + if (P.Mode == mode) + return true; + + // if previous state was set by user only user can reset it + if ((P.iFlags & pkgDepCache::Protected) == pkgDepCache::Protected) + { + if (unlikely(DebugMarker == true)) + std::clog << OutputInDepth(Depth) << "Ignore Mark" << PrintMode(mode) + << " of " << APT::PrettyPkg(&Cache, Pkg) << " as its mode (" << PrintMode(P.Mode) + << ") is protected" << std::endl; + return false; + } + // enforce dpkg holds + else if (mode != pkgDepCache::ModeKeep && Pkg->SelectedState == pkgCache::State::Hold && + _config->FindB("APT::Ignore-Hold",false) == false) + { + if (unlikely(DebugMarker == true)) + std::clog << OutputInDepth(Depth) << "Hold prevents Mark" << PrintMode(mode) + << " of " << APT::PrettyPkg(&Cache, Pkg) << std::endl; + return false; + } + + return true; +} + /*}}}*/ // DepCache::MarkKeep - Put the package in the keep state /*{{{*/ // --------------------------------------------------------------------- /* */ bool pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser, unsigned long Depth) { - if (IsModeChangeOk(ModeKeep, Pkg, Depth, FromUser) == false) + if (not IsModeChangeOk(*this, ModeKeep, Pkg, Depth, FromUser, DebugMarker)) return false; /* Reject an attempt to keep a non-source broken installed package, those @@ -905,7 +965,7 @@ bool pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser, bool pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge, unsigned long Depth, bool FromUser) { - if (IsModeChangeOk(ModeDelete, Pkg, Depth, FromUser) == false) + if (not IsModeChangeOk(*this, ModeDelete, Pkg, Depth, FromUser, DebugMarker)) return false; StateCache &P = PkgState[Pkg->ID]; @@ -1004,66 +1064,6 @@ bool pkgDepCache::IsDeleteOkProtectInstallRequests(PkgIterator const &Pkg, return true; } /*}}}*/ -// DepCache::IsModeChangeOk - check if it is ok to change the mode /*{{{*/ -// --------------------------------------------------------------------- -/* this is used by all Mark methods on the very first line to check sanity - and prevents mode changes for packages on hold for example. - If you want to check Mode specific stuff you can use the virtual public - Is<Mode>Ok methods instead */ -static char const* PrintMode(char const mode) -{ - switch (mode) - { - case pkgDepCache::ModeInstall: return "Install"; - case pkgDepCache::ModeKeep: return "Keep"; - case pkgDepCache::ModeDelete: return "Delete"; - case pkgDepCache::ModeGarbage: return "Garbage"; - default: return "UNKNOWN"; - } -} -bool pkgDepCache::IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg, - unsigned long const Depth, bool const FromUser) -{ - // we are not trying to hard… - if (unlikely(Depth > 100)) - return false; - - // general sanity - if (unlikely(Pkg.end() == true || Pkg->VersionList == 0)) - return false; - - // the user is always right - if (FromUser == true) - return true; - - StateCache &P = PkgState[Pkg->ID]; - // not changing the mode is obviously also fine as we might want to call - // e.g. MarkInstall multiple times with different arguments for the same package - if (P.Mode == mode) - return true; - - // if previous state was set by user only user can reset it - if ((P.iFlags & Protected) == Protected) - { - if (unlikely(DebugMarker == true)) - std::clog << OutputInDepth(Depth) << "Ignore Mark" << PrintMode(mode) - << " of " << APT::PrettyPkg(this, Pkg) << " as its mode (" << PrintMode(P.Mode) - << ") is protected" << std::endl; - return false; - } - // enforce dpkg holds - else if (mode != ModeKeep && Pkg->SelectedState == pkgCache::State::Hold && - _config->FindB("APT::Ignore-Hold",false) == false) - { - if (unlikely(DebugMarker == true)) - std::clog << OutputInDepth(Depth) << "Hold prevents Mark" << PrintMode(mode) - << " of " << APT::PrettyPkg(this, Pkg) << std::endl; - return false; - } - - return true; -} - /*}}}*/ struct CompareProviders /*{{{*/ { pkgDepCache const &Cache; @@ -1279,32 +1279,55 @@ static APT::VersionVector getAllPossibleSolutions(pkgDepCache &Cache, pkgCache:: toNewInstall.emplace_back(std::move(Ver)); } } while (Start++ != End); - std::move(toNewInstall.begin(), toNewInstall.end(), std::back_inserter(toUpgrade)); + if (toUpgrade.empty()) + toUpgrade = std::move(toNewInstall); + else + std::move(toNewInstall.begin(), toNewInstall.end(), std::back_inserter(toUpgrade)); + if (not sorted) std::sort(toUpgrade.begin(), toUpgrade.end(), [](pkgCache::VerIterator const &A, pkgCache::VerIterator const &B) { return A->ID < B->ID; }); toUpgrade.erase(std::unique(toUpgrade.begin(), toUpgrade.end()), toUpgrade.end()); + + if (not End.IsNegative()) + toUpgrade.erase(std::remove_if(toUpgrade.begin(), toUpgrade.end(), [&Cache](pkgCache::VerIterator const &V) { + auto const P = V.ParentPkg(); + auto const &State = Cache[P]; + return State.Protect() && (State.Delete() || (State.Keep() && P->CurrentVer == 0)); + }), + toUpgrade.end()); + return toUpgrade; } /*}}}*/ -static bool MarkInstall_MarkDeleteForNotUpgradeable(pkgDepCache &Cache, bool const DebugAutoInstall, pkgCache::VerIterator const &PV, unsigned long const Depth, pkgCache::PkgIterator const &Pkg, bool const propagateProctected)/*{{{*/ +static bool MarkInstall_MarkDeleteForNotUpgradeable(pkgDepCache &Cache, bool const DebugAutoInstall, pkgCache::VerIterator const &PV, unsigned long const Depth, pkgCache::PkgIterator const &Pkg, bool const propagateProctected, APT::PackageVector &delayedRemove)/*{{{*/ { auto &State = Cache[Pkg]; - if (not State.Delete()) + if (not propagateProctected) { + if (State.Delete()) + return true; if(DebugAutoInstall) - std::clog << OutputInDepth(Depth) << " Removing: " << Pkg.Name() << " as upgrade is not an option for " << PV.ParentPkg().FullName() << " (" << PV.VerStr() << ")\n"; - if (not Cache.MarkDelete(Pkg, false, Depth + 1, false)) + std::clog << OutputInDepth(Depth) << " Delayed Removing: " << Pkg.FullName() << " as upgrade is not an option for " << PV.ParentPkg().FullName() << " (" << PV.VerStr() << ")\n"; + if (not IsModeChangeOk(Cache, pkgDepCache::ModeDelete, Pkg, Depth, false, DebugAutoInstall) || + not Cache.IsDeleteOk(Pkg, false, Depth, false)) return false; + delayedRemove.push_back(Pkg); + return true; } - if (propagateProctected) + + if (not State.Delete()) { - MarkInstall_DiscardCandidate(Cache, Pkg); - Cache.MarkProtected(Pkg); + if(DebugAutoInstall) + std::clog << OutputInDepth(Depth) << " Removing: " << Pkg.FullName() << " as upgrade is not an option for " << PV.ParentPkg().FullName() << " (" << PV.VerStr() << ")\n"; + if (not Cache.MarkDelete(Pkg, false, Depth + 1, false)) + return false; } + MarkInstall_DiscardCandidate(Cache, Pkg); + Cache.MarkProtected(Pkg); return true; } /*}}}*/ -static bool MarkInstall_RemoveConflictsIfNotUpgradeable(pkgDepCache &Cache, bool const DebugAutoInstall, pkgCache::VerIterator const &PV, unsigned long Depth, std::vector<pkgCache::DepIterator> &toRemove, APT::PackageVector &toUpgrade, bool const propagateProctected, bool const FromUser) /*{{{*/ +static bool MarkInstall_RemoveConflictsIfNotUpgradeable(pkgDepCache &Cache, bool const DebugAutoInstall, pkgCache::VerIterator const &PV, unsigned long Depth, std::vector<pkgCache::DepIterator> &toRemove, APT::PackageVector &toUpgrade, APT::PackageVector &delayedRemove, bool const propagateProctected, bool const FromUser) /*{{{*/ { /* Negative dependencies have no or-group If the candidate is effected try to keep current and discard candidate @@ -1336,7 +1359,7 @@ static bool MarkInstall_RemoveConflictsIfNotUpgradeable(pkgDepCache &Cache, bool else badCandidate.push_back(Pkg); } - else if (not MarkInstall_MarkDeleteForNotUpgradeable(Cache, DebugAutoInstall, PV, Depth, Pkg, propagateProctected)) + else if (not MarkInstall_MarkDeleteForNotUpgradeable(Cache, DebugAutoInstall, PV, Depth, Pkg, propagateProctected, delayedRemove)) { failedToRemoveSomething = true; if (not propagateProctected && not FromUser) @@ -1352,7 +1375,9 @@ static bool MarkInstall_RemoveConflictsIfNotUpgradeable(pkgDepCache &Cache, bool if (State.CandidateVer != Ver && State.CandidateVer != nullptr && std::find(badCandidate.cbegin(), badCandidate.cend(), Pkg) == badCandidate.end()) toUpgrade.push_back(Pkg); - else if (not MarkInstall_MarkDeleteForNotUpgradeable(Cache, DebugAutoInstall, PV, Depth, Pkg, propagateProctected)) + else if (State.CandidateVer == Pkg.CurrentVer()) + ; // already done in the first loop above + else if (not MarkInstall_MarkDeleteForNotUpgradeable(Cache, DebugAutoInstall, PV, Depth, Pkg, propagateProctected, delayedRemove)) { failedToRemoveSomething = true; if (not propagateProctected && not FromUser) @@ -1510,10 +1535,12 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg, bool AutoInst, unsigned long Depth, bool FromUser, bool ForceImportantDeps) { - if (IsModeChangeOk(ModeInstall, Pkg, Depth, FromUser) == false) + StateCache &P = PkgState[Pkg->ID]; + if (P.Protect() && P.Keep() && P.CandidateVer != nullptr && P.CandidateVer == Pkg.CurrentVer()) + ; // we are here to mark our dependencies as protected, no state is changed + else if (not IsModeChangeOk(*this, ModeInstall, Pkg, Depth, FromUser, DebugMarker)) return false; - StateCache &P = PkgState[Pkg->ID]; // See if there is even any possible installation candidate if (P.CandidateVer == 0) @@ -1545,7 +1572,7 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg, bool AutoInst, bool hasFailed = false; std::vector<pkgCache::DepIterator> toInstall, toRemove; - APT::PackageVector toUpgrade; + APT::PackageVector toUpgrade, delayedRemove; if (AutoSolve) { VerIterator const PV = P.CandidateVerIter(*this); @@ -1554,7 +1581,7 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg, bool AutoInst, if (not MarkInstall_CollectDependencies(*this, PV, toInstall, toRemove)) return false; - if (not MarkInstall_RemoveConflictsIfNotUpgradeable(*this, DebugAutoInstall, PV, Depth, toRemove, toUpgrade, P.Protect(), FromUser)) + if (not MarkInstall_RemoveConflictsIfNotUpgradeable(*this, DebugAutoInstall, PV, Depth, toRemove, toUpgrade, delayedRemove, P.Protect(), FromUser)) { if (failEarly) return false; @@ -1628,6 +1655,19 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg, bool AutoInst, hasFailed = true; } + for (auto const &R : delayedRemove) + { + if (not MarkDelete(R, false, Depth, false)) + { + if (failEarly) + { + MarkInstall_DiscardInstall(Pkg); + return false; + } + hasFailed = true; + } + } + if (MoveAutoBitToDependencies) { if (DebugAutoInstall) @@ -2183,7 +2223,7 @@ bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc) reason = "Required"; else if (userFunc.InRootSet(P)) reason = "Blacklisted [APT::NeverAutoRemove]"; - else if (IsModeChangeOk(ModeGarbage, P, 0, false) == false) + else if (not IsModeChangeOk(*this, ModeGarbage, P, 0, false, DebugMarker)) reason = "Hold"; else continue; diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index d9bb69a18..78f88ba2f 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -518,9 +518,6 @@ class APT_PUBLIC pkgDepCache : protected pkgCache::Namespace private: void * const d; - 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_DiscardInstall(PkgIterator const &Pkg); diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index 3f8534234..7e3993be4 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -29,8 +29,10 @@ #include <sys/stat.h> #include <unistd.h> +#include <algorithm> #include <array> #include <limits> +#include <sstream> #include <string> #include <apti18n.h> @@ -119,19 +121,25 @@ static bool WriteScenarioDependency(FileFd &output, pkgCache::VerIterator const for (size_t i = 1; i < dependencies.size(); ++i) if (dependencies[i].empty() == false) WriteOkay(Okay, output, "\n", DepMap[i], ": ", dependencies[i]); - string provides; - for (pkgCache::PrvIterator Prv = Ver.ProvidesList(); Prv.end() == false; ++Prv) + std::vector<std::string> provides; + for (auto Prv = Ver.ProvidesList(); not Prv.end(); ++Prv) { - if (Prv.IsMultiArchImplicit() == true) + if (Prv.IsMultiArchImplicit()) continue; - if (provides.empty() == false) - provides.append(", "); - provides.append(Prv.Name()); + std::string provide = Prv.Name(); if (Prv->ProvideVersion != 0) - provides.append(" (= ").append(Prv.ProvideVersion()).append(")"); + provide.append(" (= ").append(Prv.ProvideVersion()).append(")"); + if ((Ver->MultiArch & pkgCache::Version::Foreign) != 0 && std::find(provides.cbegin(), provides.cend(), provide) != provides.cend()) + continue; + provides.emplace_back(std::move(provide)); + } + if (not provides.empty()) + { + std::ostringstream out; + std::copy(provides.begin(), provides.end() - 1, std::ostream_iterator<std::string>(out, ", ")); + out << provides.back(); + WriteOkay(Okay, output, "\nProvides: ", out.str()); } - if (provides.empty() == false) - WriteOkay(Okay, output, "\nProvides: ", provides); return WriteOkay(Okay, output, "\n"); } /*}}}*/ @@ -262,7 +270,7 @@ bool EDSP::WriteScenario(pkgDepCache &Cache, FileFd &output, OpProgress *Progres for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false && likely(Okay); ++Pkg) { std::string const arch = Pkg.Arch(); - if (std::find(archs.begin(), archs.end(), arch) == archs.end()) + if (Pkg->CurrentVer == 0 && std::find(archs.begin(), archs.end(), arch) == archs.end()) continue; for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false && likely(Okay); ++Ver, ++p) { diff --git a/apt-pkg/tagfile-keys.list b/apt-pkg/tagfile-keys.list index a979a404b..a16bc686a 100644 --- a/apt-pkg/tagfile-keys.list +++ b/apt-pkg/tagfile-keys.list @@ -48,6 +48,7 @@ Package-Revision Package-Type Pre-Depends Priority +Protected Provides Recommended Recommends diff --git a/apt-pkg/tagfile-order.c b/apt-pkg/tagfile-order.c index 4c2068c00..bb199b32e 100644 --- a/apt-pkg/tagfile-order.c +++ b/apt-pkg/tagfile-order.c @@ -11,7 +11,7 @@ static const char *iTFRewritePackageOrder[] = { "Architecture", "Subarchitecture", // Used only by d-i "Version", - "Revision", // Obsolete (warning in dpkg) + "Revision", // Obsolete (warning in dpkg) "Package-Revision", // Obsolete (warning in dpkg) "Package_Revision", // Obsolete (warning in dpkg) "Kernel-Version", // Used only by d-i @@ -23,6 +23,7 @@ static const char *iTFRewritePackageOrder[] = { "Priority", "Class", // dpkg nickname for Priority "Build-Essential", + "Protected", "Essential", "Installer-Menu-Item", // Used only by d-i "Section", diff --git a/apt-private/private-update.cc b/apt-private/private-update.cc index 248f1f36e..affae655d 100644 --- a/apt-private/private-update.cc +++ b/apt-private/private-update.cc @@ -110,7 +110,7 @@ bool DoUpdate(CommandLine &CmdL) if (uri.User.empty() && uri.Password.empty()) continue; // we can't really predict if a +http method supports everything http does, - // so we play it safe and use a whitelist here. + // so we play it safe and use an allowlist here. char const *const affected[] = {"http", "https", "tor+http", "tor+https", "ftp"}; if (std::find(std::begin(affected), std::end(affected), uri.Access) != std::end(affected)) // TRANSLATOR: the first two are manpage references, the last the URI from a sources.list diff --git a/cmdline/CMakeLists.txt b/cmdline/CMakeLists.txt index d82239bee..91bf9bb0c 100644 --- a/cmdline/CMakeLists.txt +++ b/cmdline/CMakeLists.txt @@ -53,7 +53,7 @@ install(TARGETS apt-helper RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/) install(TARGETS apt-dump-solver apt-internal-solver RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/solvers) install(TARGETS apt-internal-planner RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/planners) -add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/planners ../solvers/dump planners/dump) +add_links(${CMAKE_INSTALL_LIBEXECDIR}/apt/planners ../solvers/dump planners/dump) # Install the not-to-be-compiled programs INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/apt-key DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/cmdline/apt-dump-solver.cc b/cmdline/apt-dump-solver.cc index 24a9f23eb..ab44b9fd1 100644 --- a/cmdline/apt-dump-solver.cc +++ b/cmdline/apt-dump-solver.cc @@ -134,11 +134,10 @@ int main(int argc,const char *argv[]) /*{{{*/ return WriteError("ERR_READ_ERROR", out, stdoutfd, Solver); } - constexpr size_t BufSize = 64 * 1024; - std::unique_ptr<char[]> Buf(new char[BufSize]); + std::unique_ptr<char[]> Buf(new char[APT_BUFFER_SIZE]); unsigned long long ToRead = 0; do { - if (input.Read(Buf.get(),BufSize, &ToRead) == false) + if (input.Read(Buf.get(), APT_BUFFER_SIZE, &ToRead) == false) { std::ostringstream out; out << "Writing EDSP solver input to file '" << filename << "' failed as reading from stdin failed!\n"; diff --git a/cmdline/apt-key.in b/cmdline/apt-key.in index e9187b423..baf3df5c3 100644 --- a/cmdline/apt-key.in +++ b/cmdline/apt-key.in @@ -671,10 +671,10 @@ prepare_gpg_home() { # well as the script hopefully uses apt-key optionally then like e.g. # debian-archive-keyring for (upgrade) cleanup did if [ -n "$DPKG_MAINTSCRIPT_PACKAGE" ] && [ -z "$APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE" ]; then - if ! dpkg-query --show --showformat '${Pre-Depends}${Depends}${Recommends}\n' "$DPKG_MAINTSCRIPT_PACKAGE" 2>/dev/null | grep -q gnupg; then + if ! dpkg-query --show --showformat '${Pre-Depends}${Depends}${Recommends}\n' "$DPKG_MAINTSCRIPT_PACKAGE" 2>/dev/null | grep -E -q 'gpg|gnupg'; then cat >&2 <<EOF Warning: The $DPKG_MAINTSCRIPT_NAME maintainerscript of the package $DPKG_MAINTSCRIPT_PACKAGE -Warning: seems to use apt-key (provided by apt) without depending on gnupg or gnupg2. +Warning: seems to use apt-key (provided by apt) without depending on gpg, gnupg, or gnupg2. Warning: This will BREAK in the future and should be fixed by the package maintainer(s). Note: Check first if apt-key functionality is needed at all - it probably isn't! EOF @@ -740,8 +740,18 @@ warn_on_script_usage() { # (Maintainer) scripts should not be using apt-key if [ -n "$DPKG_MAINTSCRIPT_PACKAGE" ]; then echo >&2 "Warning: apt-key should not be used in scripts (called from $DPKG_MAINTSCRIPT_NAME maintainerscript of the package ${DPKG_MAINTSCRIPT_PACKAGE})" - elif [ ! -t 1 ]; then - echo >&2 "Warning: apt-key output should not be parsed (stdout is not a terminal)" + fi + + echo >&2 "Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8))." +} + +warn_outside_maintscript() { + # In del, we want to warn in interactive use, but not inside maintainer + # scripts, so as to give people a chance to migrate keyrings. + # + # FIXME: We should always warn starting in 2022. + if [ -z "$DPKG_MAINTSCRIPT_PACKAGE" ]; then + echo >&2 "Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8))." fi } @@ -760,6 +770,7 @@ case "$command" in ;; del|rm|remove) # no script warning here as removing 'add' usage needs 'del' for cleanup + warn_outside_maintscript requires_root foreach_keyring_do 'remove_key_from_keyring' "$@" aptkey_echo "OK" @@ -772,6 +783,7 @@ case "$command" in merge_back_changes ;; net-update) + warn_on_script_usage requires_root setup_merged_keyring net_update diff --git a/debian/apt.postinst b/debian/apt.postinst index 8d1cdb1b3..0c6b5db9c 100755 --- a/debian/apt.postinst +++ b/debian/apt.postinst @@ -60,7 +60,7 @@ case "$1" in chmod -f 0640 /var/log/apt/term.log* || true fi - # create kernel autoremoval blacklist on update + # create kernel autoremoval denylist on update if dpkg --compare-versions "$2" lt 0.9.9.3; then /etc/kernel/postinst.d/apt-auto-removal fi diff --git a/debian/changelog b/debian/changelog index 4f4e835d6..bf2335543 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,33 @@ +apt (2.1.7) unstable; urgency=medium + + [ David Kalnischkies ] + * Do not hardcode (wrong) group and mode in setup warning (Closes: #962310) + * Do not sent our filename-provides trick to EDSP solvers (Closes: #962741) + * Tell EDSP solvers about all installed pkgs ignoring arch + * Deduplicate EDSP Provides line of M-A:foreign packages + * Delay removals due to Conflicts until Depends are resolved + * Filter out impossible solutions for protected propagation + * Add dependency points in the resolver also to providers + * Reorder config check before checking systemd for non-interactive http + * Reorder config check before result looping for SRV parsing debug + * Fix test due to display change in ls (coreutils 8.32) + * Detect pkg-config-dpkghook failure in tests to avoid fallback (Closes: #964475) + + [ Américo Monteiro ] + * Portuguese manpages translation update (Closes: #962483) + + [ Julian Andres Klode ] + * Replace some magic 64*1024 with APT_BUFFER_SIZE + * Add basic support for the Protected field + + [ Sergio Oller Moreno ] + * Minor Catalan grammar typo + + [ Frans Spiesschaert ] + * Dutch program translation update (Closes: #963008) + + -- Julian Andres Klode <jak@debian.org> Wed, 08 Jul 2020 09:38:35 +0200 + apt (2.1.6) unstable; urgency=medium [ David Kalnischkies ] @@ -964,7 +994,7 @@ apt (1.6~alpha3) unstable; urgency=medium apt (1.6~alpha2) unstable; urgency=medium - * seccomp: Conditionalize statx() whitelisting + * seccomp: Conditionalize statx() allowlisting * CMake: methods: Cleanup link libraries, use OBJECT libraries * methods: Enable additional syscalls (SYSV IPC) in fakeroot (Closes: #879662) * Don't segfault if receiving a method warning on empty queue @@ -1333,7 +1363,7 @@ apt (1.4~rc1) unstable; urgency=medium * make the moo reproducible. Thanks to Chris Lamb for initial patch and guru meditation (Closes: #848721) * update release mappings in documentation - * avoid malloc if option whitelist is disabled (default) + * avoid malloc if option allowlist is disabled (default) [ Julian Andres Klode ] * basehttp: Only read Content-Range on 416 and 206 responses (LP: #1657567) @@ -1383,7 +1413,7 @@ apt (1.4~beta3) unstable; urgency=medium Thanks to Kristian Glass for initial patch! (Closes: #709092) * separating state variables regarding server/request (Closes: #440057) * fix minimum pkgs option for dpkg --recursive usage - * allow warning generation for non-whitelisted options + * allow warning generation for non-allowlisted options [ Oriol Debian ] * Catalan program translation update (Closes: #846514) @@ -4280,7 +4310,7 @@ apt (0.9.9.3) unstable; urgency=low [ Ben Hutchings ] * debian/apt.auto-removal.sh: - do not include debug symbol packages for the kernel in the - blacklist (closes: #717616) + denylist (closes: #717616) [ Michael Vogt ] * debian/apt.postinst: @@ -6597,7 +6627,7 @@ apt (0.8.11) unstable; urgency=low * methods/{gzip,bzip}.cc: - print a good error message if FileSize() is zero * apt-pkg/aptconfiguration.cc: - - remove the inbuilt Translation files whitelist + - remove the inbuilt Translation files allowlist * cmdline/apt-cache.cc: - remove not implemented 'apt-cache add' command * doc/apt-cache.8.xml: diff --git a/doc/apt-key.8.xml b/doc/apt-key.8.xml index 1ab4d784e..2c8c3f655 100644 --- a/doc/apt-key.8.xml +++ b/doc/apt-key.8.xml @@ -25,7 +25,7 @@ <!-- Man page title --> <refnamediv> <refname>apt-key</refname> - <refpurpose>APT key management utility</refpurpose> + <refpurpose>Deprecated APT key management utility</refpurpose> </refnamediv> &synopsis-command-apt-key; @@ -37,13 +37,15 @@ authenticated using these keys will be considered trusted. </para> <para> - Note that if usage of <command>apt-key</command> is desired the additional + Use of <command>apt-key</command> is deprecated, except for the use of + <command>apt-key del</command> in maintainer scripts to remove existing + keys from the main keyring. + If such usage of <command>apt-key</command> is desired the additional installation of the GNU Privacy Guard suite (packaged in - <package>gnupg</package>) is required. For this reason alone the programmatic - usage (especially in package maintainer scripts!) is strongly discouraged. - Further more the output format of all commands is undefined and can and does - change whenever the underlying commands change. <command>apt-key</command> will - try to detect such usage and generates warnings on stderr in these cases. + <package>gnupg</package>) is required. + </para> + <para> + apt-key(8) will last be available in Debian 11 and Ubuntu 22.04. </para> </refsect1> @@ -63,7 +65,7 @@ <refsect1><title>Commands</title> <variablelist> - <varlistentry><term><option>add</option> <option>&synopsis-param-filename;</option></term> + <varlistentry><term><option>add</option> <option>&synopsis-param-filename;</option> (deprecated)</term> <listitem> <para> Add a new key to the list of trusted keys. @@ -85,7 +87,7 @@ </listitem> </varlistentry> - <varlistentry><term><option>del</option> <option>&synopsis-param-keyid;</option></term> + <varlistentry><term><option>del</option> <option>&synopsis-param-keyid;</option> (mostly deprecated)</term> <listitem> <para> @@ -96,7 +98,7 @@ </listitem> </varlistentry> - <varlistentry><term><option>export</option> <option>&synopsis-param-keyid;</option></term> + <varlistentry><term><option>export</option> <option>&synopsis-param-keyid;</option> (deprecated)</term> <listitem> <para> @@ -107,7 +109,7 @@ </listitem> </varlistentry> - <varlistentry><term><option>exportall</option></term> + <varlistentry><term><option>exportall</option> (deprecated)</term> <listitem> <para> @@ -118,7 +120,7 @@ </listitem> </varlistentry> - <varlistentry><term><option>list</option>, <option>finger</option></term> + <varlistentry><term><option>list</option>, <option>finger</option> (deprecated)</term> <listitem> <para> @@ -129,7 +131,7 @@ </listitem> </varlistentry> - <varlistentry><term><option>adv</option></term> + <varlistentry><term><option>adv</option> (deprecated)</term> <listitem> <para> Pass advanced options to gpg. With <command>adv --recv-key</command> you @@ -160,7 +162,7 @@ </listitem> </varlistentry> - <varlistentry><term><option>net-update</option></term> + <varlistentry><term><option>net-update</option> (deprecated)</term> <listitem> <para> @@ -183,7 +185,7 @@ <refsect1><title>Options</title> <para>Note that options need to be defined before the commands described in the previous section.</para> <variablelist> - <varlistentry><term><option>--keyring</option> <option>&synopsis-param-filename;</option></term> + <varlistentry><term><option>--keyring</option> <option>&synopsis-param-filename;</option> (deprecated)</term> <listitem><para>With this option it is possible to specify a particular keyring file the command should operate on. The default is that a command is executed on the <filename>trusted.gpg</filename> file as well as on all parts in the diff --git a/doc/apt-verbatim.ent b/doc/apt-verbatim.ent index 6a72016e6..c691d1de8 100644 --- a/doc/apt-verbatim.ent +++ b/doc/apt-verbatim.ent @@ -274,7 +274,7 @@ "> <!-- this will be updated by 'prepare-release' --> -<!ENTITY apt-product-version "2.1.6"> +<!ENTITY apt-product-version "2.1.7"> <!-- (Code)names for various things used all over the place --> <!ENTITY debian-oldstable-codename "stretch"> diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 9e02f0b13..d9f269344 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -559,6 +559,7 @@ Debug pkgCacheGen { Essential "<STRING>"; // native,all, none, installed + Protected "<STRING>"; // native,all, none, installed ForceEssential "<STRING_OR_LIST>"; // package names ForceImportant "<LIST>"; // package names }; diff --git a/doc/po/apt-doc.pot b/doc/po/apt-doc.pot index e69b006fe..f0bf7bdf1 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.1.6\n" +"Project-Id-Version: apt-doc 2.1.7\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2020-06-03 18:25+0200\n" +"POT-Creation-Date: 2020-07-08 09:40+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/doc/po/pt.po b/doc/po/pt.po index 8bf531370..1d30c9b31 100644 --- a/doc/po/pt.po +++ b/doc/po/pt.po @@ -2,13 +2,13 @@ # Copyright (C) 2009 Free Software Foundation, Inc. # This file is distributed under the same license as the apt package. # -# Américo Monteiro <a_monteiro@gmx.com>, 2014 - 2017, 2019. +# Américo Monteiro <a_monteiro@gmx.com>, 2014 - 2020. msgid "" msgstr "" -"Project-Id-Version: apt 1.8.0\n" +"Project-Id-Version: apt 2.1.6\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-04-07 22:02+0000\n" +"POT-Creation-Date: 2020-06-14 10:17+0200\n" +"PO-Revision-Date: 2020-06-08 17:06+0000\n" "Last-Translator: Américo Monteiro <a_monteiro@gmx.com>\n" "Language-Team: Portuguese <>\n" "Language: pt\n" @@ -460,7 +460,7 @@ msgid "" msgstr "" "<!-- TRANSLATOR: This is the section header for the following paragraphs - comparable\n" " to the other headers like NAME and DESCRIPTION and should therefore be uppercase. -->\n" -"<!ENTITY translation-title \"TRADUÇÂO\">\n" +"<!ENTITY translation-title \"TRADUÇÃO\">\n" #. type: Plain text #: apt.ent @@ -774,8 +774,8 @@ msgstr "," 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 "" "Executa a acção requisitada em um ou mais pacotes especificados via ®ex;, " "&glob; ou por correspondência exacta. A acção requisitada pode ser " @@ -793,12 +793,12 @@ msgid "" "testing, unstable). This will also select versions from this release for " "dependencies of this package if needed to satisfy the request." msgstr "" -"Pode ser seleccionada para instalação uma versão específica de um pacote ao " +"Pode ser selecionada para instalação uma versão específica de um pacote ao " "adicionar ao nome do pacote o símbolo igual (=) e a versão do pacote a " -"seleccionar. Alternativamente a versão de um lançamento específico pode ser " -"seleccionada ao adicionar ao nome do pacote uma barra de divisão (/) e o " -"nome de código (&debian-stable-codename;, &debian-testing-codename;, sid …) " -"ou o nome de suite (stable, testing, unstable). Isto irá também seleccionar " +"selecionar. Alternativamente a versão de um lançamento específico pode ser " +"selecionada ao adicionar ao nome do pacote uma barra de divisão (/) e o nome " +"de código (&debian-stable-codename;, &debian-testing-codename;, sid …) ou o " +"nome de suite (stable, testing, unstable). Isto irá também selecionar " "versões a partir deste lançamento para as dependências deste pacote se " "necessário para satisfazer o pedido." @@ -857,6 +857,9 @@ msgid "" "Depends. It also handles conflicts, by prefixing an argument with <literal>" "\"Conflicts: \"</literal>." msgstr "" +"<option>satisfy</option> satisfaz strings de dependências, como usado em " +"Build-Depends. Também lida com conflitos, ao prefixar um argumento com " +"<literal>\"Conflicts: \"</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.8.xml @@ -864,6 +867,8 @@ msgid "" "Example: <literal>apt satisfy \"foo, bar (>= 1.0)\" \"Conflicts: baz, fuzz" "\"</literal>" msgstr "" +"Exemplo: <literal>apt satisfy \"foo, bar (>= 1.0)\" \"Conflicts: baz, fuzz" +"\"</literal>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt.8.xml @@ -1160,12 +1165,12 @@ msgid "" "package name with a slash and the version of the distribution or the Archive " "name (stable, testing, unstable)." msgstr "" -"Pode ser seleccionada para instalação uma versão específica de um pacote ao " +"Pode ser selecionada para instalação uma versão específica de um pacote ao " "continuar o nome do pacote com um igual (=) e a versão do pacote a " -"seleccionar. Isto irá fazer com que essa versão seja localizada e " -"seleccionada para instalação. Alternativamente pode ser seleccionada uma " -"distribuição específica ao continuar o nome do pacote com uma slash (/) e a " -"versão da distribuição ou o nome de Arquivo (stable, testing, unstable)." +"selecionar. Isto irá fazer com que essa versão seja localizada e selecionada " +"para instalação. Alternativamente pode ser selecionada uma distribuição " +"específica ao continuar o nome do pacote com uma slash (/) e a versão da " +"distribuição ou o nome de Arquivo (stable, testing, unstable)." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -1231,6 +1236,9 @@ msgid "" "in &apt;, except for anchored expressions, and will be removed from &apt-" "get; in a future version. Use &apt-patterns; instead." msgstr "" +"O cair (fallback) para expressões regulares está descontinuado no APT 2.0, " +"foi removido no &apt;, excepto para expressões ancoradas, irá ser removido " +"do &apt-get; numa versão futura. Use &apt-patterns; em vez disto." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -1384,6 +1392,12 @@ msgid "" "with <literal>\"Conflicts: \"</literal> to unsatisfy the dependency string. " "Multiple strings of the same type can be specified." msgstr "" +"<literal>satisfy</literal> faz o apt-get satisfazer as strings de " +"dependências fornecidas. As strings de dependências podem ter perfiles de " +"compilação e listas de restrição de arquitecturas como dependem de " +"compilação. Podem opcionalmente ser prefixadas com <literal>\"Conflicts: \"</" +"literal> para satisfazer a string de dependência. Podem ser especificadas " +"várias strings do mesmo tipo." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -1391,12 +1405,16 @@ msgid "" "Example: <literal>apt-get satisfy \"foo\" \"Conflicts: bar\" \"baz (>> " "1.0) | bar (= 2.0), moo\"</literal>" msgstr "" +"Exemplo: <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 "" +"O operador antigo '</>' não é suportado, use '<=/>=' em vez " +"disto." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml @@ -1584,7 +1602,7 @@ msgstr "" "verificação de integridade após obtenção (ficheiros de pacotes corrompidos), " "retêm esses pacotes e manuseia o resultado. Usar esta opção em conjunto com " "<option>-f</option> pode produzir erros em algumas situações. Se um pacote " -"for seleccionado para instalação (particularmente se for mencionado na linha " +"for selecionado para instalação (particularmente se for mencionado na linha " "de comandos) e não pode ser descarregado estão será segurado em silêncio. " "Item de Configuração: <literal>APT::Get::Fix-Missing</literal>." @@ -1732,7 +1750,7 @@ msgstr "" "fonte é compilado por <command>apt-get source --compile</command> e como as " "dependências de compilação são satisfeitas. Por predefinição, nenhum perfil " "de compilação está activo. Podem ser activados ao mesmo tempo mais do que um " -"perfil de compilação ao concatená-los com uma vírgula. Item de configuração: " +"perfil de compilação ao concatena-los com uma vírgula. Item de configuração: " "<literal>APT::Build-Profiles</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -1812,7 +1830,7 @@ msgid "" msgstr "" "Esta é uma opção perigosa que irá fazer com que o apt continue sem avisar " "quando está a instalar versões anteriores (downgrades) Não deve ser usado " -"excepto em situações muito especiais. Usá-lo pode potencialmente destruir o " +"excepto em situações muito especiais. Usa-lo pode potencialmente destruir o " "seu sistema! Item de Configuração: <literal>APT::Get::allow-downgrades</" "literal>. introduzido no APT 1.1." @@ -1827,7 +1845,7 @@ msgid "" msgstr "" "Força o sim; Esta é uma opção perigosa que irá fazer com que o apt continue " "sem avisar quando está a remover coisas essenciais. Não deve ser usado " -"excepto em situações muito especiais. Usá-lo pode potencialmente destruir o " +"excepto em situações muito especiais. Usa-lo pode potencialmente destruir o " "seu sistema! Item de Configuração: <literal>APT::Get::allow-remove-" "essential</literal>. Introduzido no APT 1.1." @@ -1842,7 +1860,7 @@ msgid "" msgstr "" "Força o sim; Esta é uma opção perigosa que irá fazer com que o apt continue " "sem avisar se estiver a alterar pacotes segurados. Não deve ser usado " -"excepto em situações muito especiais. Usá-lo pode destruir potencialmente o " +"excepto em situações muito especiais. Usa-lo pode destruir potencialmente o " "seu sistema! Item de Configuração: <literal>APT::Get::allow-change-held-" "packages</literal>. Introduzido em APT 1.1." @@ -2611,8 +2629,8 @@ msgid "" "cache used by all operations. Configuration Item: <literal>Dir::Cache::" "pkgcache</literal>." msgstr "" -"Selecciona o ficheiro para armazenar a cache do pacote. A cache do pacote é " -"a cache principal usada por todas as operações. Item de Configuração: " +"Seleciona o ficheiro para armazenar a cache do pacote. A cache do pacote é a " +"cache principal usada por todas as operações. Item de Configuração: " "<literal>Dir::Cache::pkgcache</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -2624,8 +2642,8 @@ msgid "" "cache is used to avoid reparsing all of the package files. Configuration " "Item: <literal>Dir::Cache::srcpkgcache</literal>." msgstr "" -"Selecciona o ficheiro para armazenar a cache de fonte. A fonte é usada " -"apenas pelo <literal>gencaches</literal> e armazena uma versão analisada da " +"Seleciona o ficheiro para armazenar a cache de fonte. A fonte é usada apenas " +"pelo <literal>gencaches</literal> e armazena uma versão analisada da " "informação do pacote a partir de fontes remotas. Ao construir a cache de " "pacote é usada a cache fonte para evitar reanalisar todos os ficheiros do " "pacote. Item de Configuração: <literal>Dir::Cache::srcpkgcache</literal>." @@ -2711,8 +2729,8 @@ msgstr "" "Escreve registos completos para todas as versões disponíveis. Isto é a " "predefinição; para a desligar, use <option>--no-all-versions</option>. Se " "<option>--no-all-versions</option> for especificada, apenas a versão " -"candidata será mostrada (aquela que seria seleccionada para instalação). " -"Esta opção é aplicável apenas ao comando <literal>show</literal>. Item de " +"candidata será mostrada (aquela que seria selecionada para instalação). Esta " +"opção é aplicável apenas ao comando <literal>show</literal>. Item de " "Configuração: <literal>APT::Cache::AllVersions</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -3466,7 +3484,7 @@ msgstr "" "<literal>Ataques de rede \"man in the middle\"</literal>. Sem verificação de " "assinatura, um agente malicioso pode introduzir-se ele próprio no processo " "de descarga de pacotes e disponibilizar software malicioso seja ao controlar " -"um elemento de rede (router, switch, etc.) ou ao redireccionar tráfego para " +"um elemento de rede (router, switch, etc.) ou ao redirecionar tráfego para " "um servidor impostor (através de ataques de fraude de ARP ou DNS)." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> @@ -5169,7 +5187,7 @@ msgid "" "\"true\"." msgstr "" "Esta opção controla se o apt irá usar o registo do servidor DNS SRV como " -"especificado em RFC 2782 para seleccionar um servidor alternativo a onde " +"especificado em RFC 2782 para selecionar um servidor alternativo a onde " "ligar: A predefinição é \"true\"." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -6111,7 +6129,7 @@ msgstr "" "O ficheiro de preferências do APT <filename>/etc/apt/preferences</filename> " "e os ficheiros fragmentados no directório <filename>/etc/apt/preferences.d/</" "filename> podem ser usados para controlar quais as versões de pacotes irão " -"ser seleccionadas para instalação." +"ser selecionadas para instalação." #. type: Content of: <refentry><refsect1><para> #: apt_preferences.5.xml @@ -6129,10 +6147,10 @@ msgstr "" "ficheiro &sources-list; contém referências a mais do que uma distribuição " "(por exemplo, <literal>stable</literal> e <literal>testing</literal>). O APT " "atribui uma prioridade a cada versão que está disponível. Sujeito a " -"constrangimentos de dependências, o <command>apt-get</command> selecciona a " +"constrangimentos de dependências, o <command>apt-get</command> seleciona a " "versão com a prioridade mais alta para instalação. As preferências do APT " "sobrepõem as prioridades que o APT atribui às versões de pacotes por " -"predefinição, assim dando controle ao utilizador sobre qual é seleccionado " +"predefinição, assim dando controle ao utilizador sobre qual é selecionado " "para instalação." #. type: Content of: <refentry><refsect1><para> @@ -6717,7 +6735,7 @@ msgstr "" #. type: Content of: <refentry><refsect1><refsect2><title> #: apt_preferences.5.xml msgid "Pinning by source package" -msgstr "" +msgstr "Fixação pelo pacote de origem" #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6725,6 +6743,8 @@ msgid "" "APT supports pinning by source packages. To pin by a source package, prepend " "\"src:\" to the package name." msgstr "" +"O APT suporta fixar pelo pacote fonte. Para fixar um pacote fonte, preceda " +"\"src:\" ao nome do pacote." #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6732,22 +6752,20 @@ msgid "" "For example, to pin all binaries produced by the apt source package of this " "APT's version to 990, you can do:" msgstr "" +"Por exemplo, para fixar todos os binários produzidos pelo pacote fonte do " +"apt desta versão do APT para 990, você pode fazer:" #. 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 @@ -6755,6 +6773,8 @@ msgid "" "Source package pinning can be combined with regular expressions and glob " "patterns, and can also take a binary architecture." msgstr "" +"A fixação de pacote fonte pode ser combinada com expressões regulares e " +"padrões glob, e também podem tomar uma arquitectura binária." #. type: Content of: <refentry><refsect1><refsect2><para> #: apt_preferences.5.xml @@ -6762,22 +6782,20 @@ msgid "" "For example, let's pin all binaries for all architectures produced by any " "source package containing apt in its name to 990:" msgstr "" +"Por exemplo, vamos fixar todos os binários para todas as arquitecturas " +"produzidas por qualquer pacote fonte que contenha apt no seu nome para 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 @@ -6980,7 +6998,7 @@ msgid "" msgstr "" "Uma versão de um pacote cuja origem não é o sistema local mas qualquer outro " "site listado em &sources-list; e o qual pertence a uma distribuição " -"<literal>unstable</literal> apenas é instalado se for seleccionado para " +"<literal>unstable</literal> apenas é instalado se for selecionado para " "instalação e se nenhuma versão do pacote já estiver instalada." #. type: Content of: <refentry><refsect1><refsect2><title> @@ -8131,14 +8149,14 @@ msgstr "" "ficheiros de chaveiro (têm de estar acessíveis e legíveis para o utilizador " "do sistema <literal>_apt</literal>, portanto assegure que todos têm " "permissões de leitura ao ficheiro) e impressões digitais de chaves para " -"seleccionar a partir destes chaveiros. Se não forem especificados nenhuns " +"selecionar a partir destes chaveiros. Se não forem especificados nenhuns " "ficheiros chaveiro, o predefinido é o chaveiro <filename>trusted.gpg</" "filename> e todos os chaveiros no directório <filename>trusted.gpg.d/</" "filename> (veja <command>apt-key fingerprint</command>). Se não for " -"especificada nenhuma impressão digital, são seleccionadas todas as chaves " -"nos chaveiros. Uma impressão digital irá também aceitar todas as assinaturas " -"por uma sub-chave dessa chave. Se isto não for desejado pode ser adicionado " -"um ponto de exclamação (<literal>!</literal>) à impressão digital para " +"especificada nenhuma impressão digital, são selecionadas todas as chaves nos " +"chaveiros. Uma impressão digital irá também aceitar todas as assinaturas por " +"uma sub-chave dessa chave. Se isto não for desejado pode ser adicionado um " +"ponto de exclamação (<literal>!</literal>) à impressão digital para " "desactivar este comportamento. A opção usa por predefinição o valor da opção " "com o mesmo nome se for definida no ficheiro <filename>Release</filename> " "previamente adquirido deste repositório (apenas impressões digitais podem " @@ -9775,7 +9793,7 @@ msgid "" "command. Configuration Item: <literal>APT::FTPArchive::SourceOverride</" "literal>." msgstr "" -"Selecciona o ficheiro de sobreposição de fonte a usar com o comando " +"Seleciona o ficheiro de sobreposição de fonte a usar com o comando " "<literal>sources</literal>. Item de Configuração: <literal>APT::FTPArchive::" "SourceOverride</literal>." @@ -9925,17 +9943,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>nome-de-máquina</replaceable>[:" -"<replaceable>porto</replaceable>][/<replaceable>caminho</replaceable>]" +"<literal>machine</literal> <replaceable>[protocolo://]</" +"replaceable><replaceable>nome-de-máquina</replaceable>[:<replaceable>porto</" +"replaceable>][/<replaceable>caminho</replaceable>]" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt_auth.conf.5.xml @@ -9968,6 +9983,8 @@ msgstr "" msgid "" "If protocol is not specified, the entry only matches https and tor+https." msgstr "" +"Se o protocolo não for especificado, a entrada apenas coincide com https e " +"tor+https." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt_auth.conf.5.xml @@ -9996,17 +10013,15 @@ msgstr "Exemplo" #. 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 @@ -10040,13 +10055,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" @@ -10054,7 +10063,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" @@ -10117,6 +10126,11 @@ msgid "" "only, or if the sources.list entry redirects elsewhere, login information " "for the redirect destination can be supplied." msgstr "" +"As informações de Login em auth.conf são mais flexíveis que aquelas em " +"sources.list. Por exemplo, a informação de login pode ser especificada para " +"apenas partes de um repositório, ou se a entrada de sources.list " +"redirecionar para outro lado, pode ser fornecida informação de login para o " +"destino do redirecionamento." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt_auth.conf.5.xml @@ -10389,7 +10403,7 @@ msgid "" "follow redirects, which is enabled by default." msgstr "" "<literal>Acquire::http::AllowRedirect</literal> controla se o APT irá seguir " -"os redireccionamentos, o que está activo por predefinição." +"os redirecionamentos, o que está activo por predefinição." #. type: Content of: <refentry><refsect1><refsect2><para> #: apt-transport-http.1.xml @@ -10709,7 +10723,7 @@ msgid "" msgstr "" "Este transporte do APT não está por si só a implementar um protocolo para " "aceder a repositórios locais ou remotos, mas obtêm uma mirrorlist e " -"redirecciona todos os pedidos para os mirro(s) retirados dessa lista, " +"redireciona todos os pedidos para os mirro(s) retirados dessa lista, " "acedendo a eles via outros transportes como &apt-transport-http;. A " "funcionalidade básica esteve disponível desde o apt 0.7.24, mas não esteve " "documentada até ao apt 1.6 o qual continha uma reconstrução do transporte e " @@ -10823,7 +10837,7 @@ msgid "" "literal>) and type of the file (<literal>type</literal>)." msgstr "" "Como especificado no formato, um mirror pode ter meta-dados adicionais " -"acrescentados para impedir que um mirror seja seleccionado para obter um " +"acrescentados para impedir que um mirror seja selecionado para obter um " "ficheiro que não corresponda a esses meta-dados. Deste modo a mirrorlist " "pode por exemplo conter mirrors parciais que servem apenas certas " "arquitecturas e o APT irá automaticamente escolher um mirror diferente para " @@ -11036,12 +11050,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 "Sintaxe e semânticas dos padrões do apt search" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml @@ -11049,11 +11063,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 "" +"A partir da versão 2.0, o <command>APT</command> disponibiliza suporte para " +"padrões, o que pode ser usado para pesquisar a cache do apt por pacotes." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Logic patterns" -msgstr "" +msgstr "Padrões de lógica" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml @@ -11062,86 +11078,90 @@ msgid "" "complex expressions, as well as <code>?true</code> and <code>?false</code> " "patterns." msgstr "" +"Estes padrões fornecem os meios básicos para combinar outros padrões em " +"expressões mais complexas, assim como padrões <code>?true</code> e <code>?" +"false</code>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?and(PATTERN, PATTERN, ...)</code>" -msgstr "" +msgstr "<code>?and(PATTERN, PATTERN, ...)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>PATTERN PATTERN ...</code>" -msgstr "" +msgstr "<code>PATTERN PATTERN ...</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects objects where all specified patterns match." -msgstr "" +msgstr "Seleciona objectos onde coincidem todos os padrões especificados." #. 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 "Não seleciona nada." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?not(PATTERN)</code>" -msgstr "" +msgstr "<code>?not(PATTERN)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>!PATTERN</code>" -msgstr "" +msgstr "<code>!PATTERN</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects objects where PATTERN does not match." -msgstr "" +msgstr "Seleciona objectos onde PATTERN não coincide." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?or(PATTERN, PATTERN, ...)</code>" -msgstr "" +msgstr "<code>?or(PATTERN, PATTERN, ...)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>PATTERN | PATTERN | ...</code>" -msgstr "" +msgstr "<code>PATTERN | PATTERN | ...</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 "" +"Seleciona objectos onde pelo menos um dos padrões especificados coincide." #. 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 "Seleciona todos os objectos." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>(PATTERN)</code>" -msgstr "" +msgstr "<code>(PATTERN)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11149,16 +11169,18 @@ msgid "" "Selects the same as <code>PATTERN</code>, can be used to work around " "precedence, for example, <code>(~ramd64|~ri386)~nfoo</code>" msgstr "" +"Seleciona o mesmo que <code>PATTERN</code>, pode ser usado para contornar " +"precedência, por exemplo, <code>(~ramd64|~ri386)~nfoo</code>" #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Narrowing patterns" -msgstr "" +msgstr "Estreitar padrões" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?all-versions(PATTERN)</code>" -msgstr "" +msgstr "<code>?all-versions(PATTERN)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11166,16 +11188,18 @@ msgid "" "Selects packages where all versions match PATTERN. When matching versions " "instead, same as PATTERN." msgstr "" +"Seleciona pacotes onde todas as versões coincidem com PATTERN. Quando em vez " +"disso coincide versões, o mesmo que PATTERN." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?any-version(PATTERN)</code>" -msgstr "" +msgstr "<code>?any-version(PATTERN)</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 "Seleciona qualquer versão onde o padrão coincide com a versão." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11185,11 +11209,15 @@ msgid "" "<code>?any-version(?and(?version(1),?version(2)))</code> restricts the " "<code>?and</code> to act on the same version." msgstr "" +"por exemplo, enquanto <code>?and(?version(1),?version(2))</code> corresponde " +"a pacote que tem uma versão contendo 1 e uma versão contendo 2, <code>?any-" +"version(?and(?version(1),?version(2)))</code> restringe o <code>?and</code> " +"a actuar na mesma versão." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?narrow(PATTERN...)</code>" -msgstr "" +msgstr "<code>?narrow(PATTERN...)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11197,26 +11225,28 @@ msgid "" "Selects any version matching all PATTERNs, short for <code>?any-version(?" "and(PATTERN...))</code>." msgstr "" +"Seleciona qualquer versão que corresponda a todos os PATTERNs, abreviatura " +"de <code>?any-version(?and(PATTERN...))</code>." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Package patterns" -msgstr "" +msgstr "Padrões de pacotes" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml msgid "These patterns select specific packages." -msgstr "" +msgstr "Estes padrões selecionam pacotes específicos." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?architecture(WILDCARD)</code>" -msgstr "" +msgstr "<code>?architecture(WILDCARD)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>~rWILDCARD</code>" -msgstr "" +msgstr "<code>~rWILDCARD</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml @@ -11224,46 +11254,48 @@ msgid "" "Selects packages matching the specified architecture, which may contain " "wildcards using any." msgstr "" +"Seleciona pacotes que coincidam com a arquitectura especificada, a qual pode " +"conter wildcards usando qualquer uma delas." #. 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 "Seleciona pacotes que foram instalados automaticamente." #. 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 "Seleciona pacotes que têm dependências quebradas." #. 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 @@ -11271,116 +11303,122 @@ msgid "" "Selects packages that are not fully installed, but have solely residual " "configuration files left." msgstr "" +"Seleciona pacotes que não estão totalmente instalados, mas têm somente " +"deixados ficheiros residuais de configuração." #. 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 "" +"Seleciona pacotes que têm Essential: yes definido no seu ficheiro de " +"controle." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><term> #: apt-patterns.7.xml msgid "<code>?exact-name(NAME)</code>" -msgstr "" +msgstr "<code>?exact-name(NAME)</code>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-patterns.7.xml msgid "Selects packages with the exact specified name." -msgstr "" +msgstr "Seleciona pacotes com o nome exacto especificado." #. 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 "Seleciona pacotes que podem ser removidos automaticamente." #. 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 "Seleciona pacotes que estão presentemente instalados." #. 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 "" +"Seleciona pacotes onde o nome coincide com a expressão regular fornecida." #. 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 "" +msgstr "Seleciona todos os pacotes que já não existem nos repositórios." #. 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 "" +"Seleciona pacotes que podem ser actualizados (têm um candidato mais recente)." #. 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 @@ -11389,28 +11427,29 @@ msgid "" "exist when they are referenced somewhere in the archive, for example because " "something depends on that name." msgstr "" +"Seleciona todos os pacotes virtuais; que são pacotes sem versão. Estes " +"existem quando são referenciados algures no arquivo, por exemplo porque algo " +"depende desse nome." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml -#, fuzzy -#| msgid "Version &apt-product-version;" msgid "Version patterns" -msgstr "Versão &apt-product-version;" +msgstr "Padrões de versão" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml msgid "These patterns select specific versions of a package." -msgstr "" +msgstr "Estes padrões selecionam versões específicas de um pacote." #. 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 @@ -11419,16 +11458,19 @@ msgid "" "regular expression. Archive, here, means the values after <code>a=</code> in " "<command>apt-cache policy</command>." msgstr "" +"Seleciona versões que vêm do arquivo que correspondem à expressão regular " +"fornecida. Archive, aqui, significa os valores após <code>a=</code> em " +"<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 @@ -11437,32 +11479,36 @@ msgid "" "regular expression. Origin, here, means the values after <code>o=</code> in " "<command>apt-cache policy</command>." msgstr "" +"Seleciona versões que vêm do arquivo que correspondem à expressão regular " +"fornecida. Origin, aqui, significa os valores após <code>a=</code> em " +"<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 "" +"Seleciona versões onde a secção coincide com a expressão regular fornecida." #. 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 @@ -11470,11 +11516,13 @@ msgid "" "Selects versions where the source package name matches the specified regular " "expression." msgstr "" +"Seleciona versões onde o nome do pacote fonte coincide com a expressão " +"regular fornecida." #. 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 @@ -11482,16 +11530,18 @@ msgid "" "Selects versions where the source package version matches the specified " "regular expression." msgstr "" +"Seleciona versões onde a versão do pacote fonte coincide com a expressão " +"regular fornecida." #. 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 @@ -11499,11 +11549,13 @@ msgid "" "Selects versions where the version string matches the specified regular " "expression." msgstr "" +"Seleciona versões onde a string de versão coincide com a expressão regular " +"fornecida." #. 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 @@ -11511,21 +11563,24 @@ msgid "" "Remove all packages that are automatically installed and no longer needed - " "same as apt autoremove" msgstr "" +"Remove todos os pacotes que foram instalados automaticamente e já não fazem " +"falta - o mesmo que 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 "" +"Purga todos os pacotes que apenas têm ficheiros de configuração deixados" #. 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 @@ -11533,11 +11588,13 @@ msgid "" "List all manually-installed packages in sections matching libs, perl, or " "python." msgstr "" +"Lista todos os pacotes instalados manualmente em secções que correspondam a " +"libs, perl, ou python." #. type: Content of: <refentry><refsect1><title> #: apt-patterns.7.xml msgid "Migrating from aptitude" -msgstr "" +msgstr "Migrar do aptitude" #. type: Content of: <refentry><refsect1><para> #: apt-patterns.7.xml @@ -11545,6 +11602,8 @@ msgid "" "Patterns in apt are heavily inspired by patterns in aptitude, but with some " "tweaks:" msgstr "" +"Os padrões no apt são fortemente inspirados pelos padrões no aptitude, mas " +"com alguns ajustes:" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11552,6 +11611,8 @@ 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 "" +"A sintaxe é uniforme: Se existir um abre-parênteses após um termo, será " +"sempre assumido ao inicio de uma lista de argumentos. " #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11560,11 +11621,14 @@ msgid "" "and(?foo,bar)\"</code> if foo does not take an argument. In APT, this will " "cause an error." msgstr "" +"No aptitude, a forma de sintaxe <code>\"?foo(bar)\"</code> pode significar " +"<code>\"?and(?foo,bar)\"</code> se foo não tiver um argumento. No APT, isto " +"irá causar um erro." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "Not all patterns are supported." -msgstr "" +msgstr "Nem todos os padrões são suportados." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11572,21 +11636,23 @@ msgid "" "Some additional patterns are available, for example, for finding gstreamer " "codecs." msgstr "" +"Estão disponíveis alguns padrões adicionais, por exemplo, para encontrar " +"codecs do gstreamer." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "Escaping terms with <code>~</code> is not supported." -msgstr "" +msgstr "Escapar termos com <code>~</code> não é suportado." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "A trailing comma is allowed in argument lists" -msgstr "" +msgstr "Uma vírgula final é permitida em listas de argumentos" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml msgid "?narrow accepts infinite arguments" -msgstr "" +msgstr "?narrow aceita argumentos infinitos" #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11597,6 +11663,11 @@ 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> não pode ser usado como abreviatura para <code>?name(foo)</" +"code>, pois isto pode fazer com que erros de escrita passem despercebidos: " +"Considere <code>?and(...,~poptional)</code>: isto requer que um pacote tenha " +"prioridade <code>required</code>, mas se você não escrever o <code>~</code>, " +"irá requerer que o nome do pacote contenha <code>poptional</code>." #. type: Content of: <refentry><refsect1><itemizedlist><listitem><para> #: apt-patterns.7.xml @@ -11605,13 +11676,14 @@ 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 "" +"Agrupar padrões com <code>(...)</code> ou escrever <code>?or(A,B)</code> " +"como <code>A|B</code> não é suportado. Não acreditamos que o uso de <code>|</" +"code> seja tão comum, e o agrupar não seja necessário sem ele." #. 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 @@ -11811,7 +11883,7 @@ msgstr "" "Em qualquer altura uma única dependência pode ser satisfeita por pacotes que " "já estão instalados ou podem não estar. O APT tenta ajudar a resolver " "problemas com dependências ao disponibilizar um número de algoritmos " -"automáticos que ajudam a seleccionar os pacotes para instalação." +"automáticos que ajudam a selecionar os pacotes para instalação." #. type: Content of: <book><chapter><title> #: guide.dbk @@ -11920,11 +11992,11 @@ msgid "" msgstr "" "Install é usado para instalar pacotes pelo nome. O pacote é obtido " "automaticamente e instalado. Isto pode ser útil se você já conhecer o nome " -"do pacote a instalar e não quer ir para uma GUI para o seleccionar. Podem " -"ser passados qualquer número de pacotes para instalar, todos eles serão " -"obtidos. Install tenta automaticamente resolver problemas de dependências " -"com os pacotes listados e irá escrever um sumário e pedir confirmação se " -"algo mais que os seus argumentos serão alterados." +"do pacote a instalar e não quer ir para uma GUI para o selecionar. Podem ser " +"passados qualquer número de pacotes para instalar, todos eles serão obtidos. " +"Install tenta automaticamente resolver problemas de dependências com os " +"pacotes listados e irá escrever um sumário e pedir confirmação se algo mais " +"que os seus argumentos serão alterados." #. type: Content of: <book><chapter><variablelist><varlistentry><term> #: guide.dbk @@ -11998,7 +12070,7 @@ msgid "" msgstr "" "O método <command>dselect</command> do APT disponibiliza o sistema APT " "completo com a GUI de selecção de pacotes <command>dselect</command>. O " -"<command>dselect</command> é usado para seleccionar os pacotes a serem " +"<command>dselect</command> é usado para selecionar os pacotes a serem " "instalados ou removidos e o APT instala-os." #. type: Content of: <book><chapter><para> @@ -12014,7 +12086,7 @@ msgid "" "have access to the latest bug fixes. APT will automatically use packages on " "your CD-ROM before downloading from the Internet." msgstr "" -"Para activar o método APT você precisa de seleccionar [A]ccess no " +"Para activar o método APT você precisa de selecionar [A]ccess no " "<command>dselect</command> e depois escolher o método APT. Ser-lhe-à " "perguntado por um conjunto de <emphasis>Sources</emphasis> que são os " "lugares de onde obter os arquivos. Estes podem ser sites remotos da " @@ -12146,7 +12218,7 @@ msgid "" "<literal>apt-get update</literal> has been run before." msgstr "" "Antes de começar a usar o <command>dselect</command> é necessário actualizar " -"a lista disponível ao seleccionar [U]pdate no menu. Isto é um super-conjunto " +"a lista disponível ao selecionar [U]pdate no menu. Isto é um super-conjunto " "do <literal>apt-get update</literal> que torna a informação obtida " "disponível ao <command>dselect</command>. Deve ser executado o [U]pdate " "mesmo que tenha sido feito <literal>apt-get update</literal> antes." @@ -12964,7 +13036,7 @@ msgstr "" "\n" " Dir\n" " {\n" -" /* Usa o disco para informação de estado e redirecciona o ficheiro de estado a partir de\n" +" /* Usa o disco para informação de estado e redireciona o ficheiro de estado a partir de\n" " the /var/lib/dpkg default */\n" " State \"/disc/\";\n" " State::status \"status\";\n" diff --git a/methods/CMakeLists.txt b/methods/CMakeLists.txt index 8589484cf..d575382f7 100644 --- a/methods/CMakeLists.txt +++ b/methods/CMakeLists.txt @@ -27,8 +27,8 @@ target_link_libraries(ftp ${GNUTLS_LIBRARIES}) install(TARGETS file copy store gpgv cdrom http ftp rred rsh mirror RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/methods) -add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods mirror mirror+ftp mirror+http mirror+https mirror+file mirror+copy) -add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods rsh ssh) +add_links(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods mirror mirror+ftp mirror+http mirror+https mirror+file mirror+copy) +add_links(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods rsh ssh) -add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods http https) +add_links(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods http https) diff --git a/methods/gpgv.cc b/methods/gpgv.cc index 1ca62557c..5597e7cff 100644 --- a/methods/gpgv.cc +++ b/methods/gpgv.cc @@ -307,13 +307,13 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, } else if (exactKey == false) { - auto const master = SubKeyMapping.find(l); - if (master == SubKeyMapping.end()) + auto const primary = SubKeyMapping.find(l); + if (primary == SubKeyMapping.end()) continue; - auto const validsubkeysig = std::find_if(master->second.cbegin(), master->second.cend(), [&](auto const subkey) { + auto const validsubkeysig = std::find_if(primary->second.cbegin(), primary->second.cend(), [&](auto const subkey) { return IsTheSameKey(subkey, good) && std::find(Signers.Valid.cbegin(), Signers.Valid.cend(), subkey) != Signers.Valid.cend(); }); - if (validsubkeysig != master->second.cend()) + if (validsubkeysig != primary->second.cend()) { found = true; Signers.SignedBy.push_back(l); diff --git a/methods/http.cc b/methods/http.cc index 71aa56751..9cfc91330 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -23,6 +23,7 @@ #include <apt-pkg/fileutl.h> #include <apt-pkg/hashes.h> #include <apt-pkg/proxy.h> +#include <apt-pkg/string_view.h> #include <apt-pkg/strutl.h> #include <chrono> @@ -93,6 +94,7 @@ void CircleBuf::Reset() is non-blocking.. */ bool CircleBuf::Read(std::unique_ptr<MethodFd> const &Fd) { + size_t ReadThisCycle = 0; while (1) { // Woops, buffer is full @@ -130,7 +132,7 @@ bool CircleBuf::Read(std::unique_ptr<MethodFd> const &Fd) CircleBuf::BwTickReadData += Res; if (Res == 0) - return false; + return ReadThisCycle != 0; if (Res < 0) { if (errno == EAGAIN) @@ -139,6 +141,7 @@ bool CircleBuf::Read(std::unique_ptr<MethodFd> const &Fd) } InP += Res; + ReadThisCycle += Res; } } /*}}}*/ @@ -203,8 +206,6 @@ bool CircleBuf::Write(std::unique_ptr<MethodFd> const &Fd) ssize_t Res; Res = Fd->Write(Buf + (OutP % Size), LeftWrite()); - if (Res == 0) - return false; if (Res < 0) { if (errno == EAGAIN) @@ -214,7 +215,7 @@ bool CircleBuf::Write(std::unique_ptr<MethodFd> const &Fd) } TotalWriten += Res; - + if (Hash != NULL) Hash->Add(Buf + (OutP%Size),Res); @@ -407,7 +408,7 @@ static ResultState UnwrapHTTPConnect(std::string Host, int Port, URI Proxy, std: /*}}}*/ // HttpServerState::HttpServerState - Constructor /*{{{*/ -HttpServerState::HttpServerState(URI Srv,HttpMethod *Owner) : ServerState(Srv, Owner), In(Owner, 64*1024), Out(Owner, 4*1024) +HttpServerState::HttpServerState(URI Srv, HttpMethod *Owner) : ServerState(Srv, Owner), In(Owner, APT_BUFFER_SIZE), Out(Owner, 4 * 1024) { TimeOut = Owner->ConfigFindI("Timeout", TimeOut); ServerFd = MethodFd::FromFd(-1); @@ -699,26 +700,18 @@ ResultState HttpServerState::Die(RequestState &Req) { unsigned int LErrno = errno; + Close(); + // Dump the buffer to the file if (Req.State == RequestState::Data) { - if (Req.File.IsOpen() == false) - return ResultState::SUCCESSFUL; // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking // can't be set if (Req.File.Name() != "/dev/null") SetNonBlock(Req.File.Fd(),false); - while (In.WriteSpace() == true) - { - if (In.Write(MethodFd::FromFd(Req.File.Fd())) == false) - { - _error->Errno("write", _("Error writing to the file")); - return ResultState::TRANSIENT_ERROR; - } - - // Done - if (In.IsLimit() == true) - return ResultState::SUCCESSFUL; + if (In.WriteSpace()) { + _error->Error(_("Data left in buffer")); + return ResultState::TRANSIENT_ERROR; } } @@ -726,7 +719,6 @@ ResultState HttpServerState::Die(RequestState &Req) if (In.IsLimit() == false && Req.State != RequestState::Header && Persistent == true) { - Close(); if (LErrno == 0) { _error->Error(_("Error reading from server. Remote end closed connection")); @@ -745,7 +737,6 @@ ResultState HttpServerState::Die(RequestState &Req) return ResultState::TRANSIENT_ERROR; // We may have got multiple responses back in one packet.. - Close(); return ResultState::SUCCESSFUL; } @@ -792,13 +783,11 @@ ResultState HttpServerState::Go(bool ToFile, RequestState &Req) ToFile == false)) return ResultState::TRANSIENT_ERROR; - // Handle server IO - if (ServerFd->HasPending() && In.ReadSpace() == true) - { - errno = 0; - if (In.Read(ServerFd) == false) - return Die(Req); - } + // Record if we have data pending to read in the server, so that we can + // skip the wait in select(). This can happen if data has already been + // read into a methodfd's buffer - the TCP queue might be empty at that + // point. + bool ServerPending = ServerFd->HasPending(); fd_set rfds,wfds; FD_ZERO(&rfds); @@ -830,7 +819,7 @@ ResultState HttpServerState::Go(bool ToFile, RequestState &Req) // Select struct timeval tv; - tv.tv_sec = TimeOut; + tv.tv_sec = ServerPending ? 0 : TimeOut; tv.tv_usec = 0; int Res = 0; if ((Res = select(MaxFd+1,&rfds,&wfds,0,&tv)) < 0) @@ -841,27 +830,20 @@ ResultState HttpServerState::Go(bool ToFile, RequestState &Req) return ResultState::TRANSIENT_ERROR; } - if (Res == 0) + if (Res == 0 && not ServerPending) { _error->Error(_("Connection timed out")); - return Die(Req); + return ResultState::TRANSIENT_ERROR; } // Handle server IO - if (ServerFd->Fd() != -1 && FD_ISSET(ServerFd->Fd(), &rfds)) + if (ServerPending || (ServerFd->Fd() != -1 && FD_ISSET(ServerFd->Fd(), &rfds))) { errno = 0; if (In.Read(ServerFd) == false) return Die(Req); } - if (ServerFd->Fd() != -1 && FD_ISSET(ServerFd->Fd(), &wfds)) - { - errno = 0; - if (Out.Write(ServerFd) == false) - return Die(Req); - } - // Send data to the file if (FileFD->Fd() != -1 && FD_ISSET(FileFD->Fd(), &wfds)) { @@ -872,6 +854,13 @@ ResultState HttpServerState::Go(bool ToFile, RequestState &Req) } } + if (ServerFd->Fd() != -1 && FD_ISSET(ServerFd->Fd(), &wfds)) + { + errno = 0; + if (Out.Write(ServerFd) == false) + return Die(Req); + } + if (Req.MaximumSize > 0 && Req.File.IsOpen() && Req.File.Failed() == false && Req.File.Tell() > Req.MaximumSize) { Owner->SetFailReason("MaximumSizeExceeded"); @@ -979,15 +968,18 @@ void HttpMethod::SendReq(FetchItem *Itm) "Debian APT-HTTP/1.3 (" PACKAGE_VERSION ")"); #ifdef HAVE_SYSTEMD - char *unit = nullptr; - sd_pid_get_unit(getpid(), &unit); - if (unit != nullptr && *unit != '\0' && not APT::String::Startswith(unit, "user@") // user@ _is_ interactive - && unit != "packagekit.service"s // packagekit likely is interactive - && unit != "dbus.service"s // aptdaemon and qapt don't have systemd services - && ConfigFindB("User-Agent-Non-Interactive", false)) - Req << " non-interactive"; - - free(unit); + if (ConfigFindB("User-Agent-Non-Interactive", false)) + { + using APT::operator""_sv; + char *unit = nullptr; + sd_pid_get_unit(getpid(), &unit); + if (unit != nullptr && *unit != '\0' && not APT::String::Startswith(unit, "user@") // user@ _is_ interactive + && "packagekit.service"_sv != unit // packagekit likely is interactive + && "dbus.service"_sv != unit) // aptdaemon and qapt don't have systemd services + Req << " non-interactive"; + + free(unit); + } #endif Req << "\r\n"; diff --git a/po/apt-all.pot b/po/apt-all.pot index 80273ad11..395e52cee 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: apt 2.1.6\n" +"Project-Id-Version: apt 2.1.7\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2020-06-03 18:25+0200\n" +"POT-Creation-Date: 2020-07-08 09:40+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" @@ -2094,7 +2094,7 @@ msgid_plural "" msgstr[0] "" "El paquet següent s'ha instal·lat automàticament i ja no serà necessari:" msgstr[1] "" -"El paquets següents s'han instal·lat automàticament i ja no serà necessaris:" +"El paquets següents s'han instal·lat automàticament i ja no seran necessaris:" #: apt-private/private-install.cc #, c-format @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: apt 2.0.0\n" +"Project-Id-Version: apt 2.1.4\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" "POT-Creation-Date: 2020-05-12 22:50+0200\n" -"PO-Revision-Date: 2020-04-14 11:09+0200\n" +"PO-Revision-Date: 2020-05-24 14:43+0200\n" "Last-Translator: Frans Spiesschaert <Frans.Spiesschaert@yucom.be>\n" "Language-Team: Debian Dutch l10n Team <debian-l10n-dutch@lists.debian.org>\n" "Language: nl\n" @@ -566,11 +566,11 @@ msgstr "Ongeldige archiefondertekening" #: apt-pkg/contrib/arfile.cc msgid "Error reading archive member header" -msgstr "Fout bij het lezen van de koptekst van het archiefonderdeel" +msgstr "Fout bij het lezen van de header van het archiefonderdeel" #: apt-pkg/contrib/arfile.cc msgid "Invalid archive member header" -msgstr "Ongeldige koptekst in archiefonderdeel" +msgstr "Ongeldige header in archiefonderdeel" #: apt-pkg/contrib/arfile.cc msgid "Archive is too short" @@ -578,7 +578,7 @@ msgstr "Archief is te kort" #: apt-pkg/contrib/arfile.cc msgid "Failed to read the archive headers" -msgstr "Lezen van de archiefkopteksten is mislukt" +msgstr "Lezen van de archiefheaders is mislukt" #: apt-pkg/contrib/cdromutl.cc #, c-format @@ -711,10 +711,9 @@ msgid "Tar checksum failed, archive corrupted" msgstr "Tar-controlesom klopt niet, het archief is beschadigd" #: apt-pkg/contrib/extracttar.cc -#, fuzzy, c-format -#| msgid "Unknown TAR header type %u, member %s" +#, c-format msgid "Unknown TAR header type %u" -msgstr "Onbekend TAR-kopteksttype %u, onderdeel %s" +msgstr "Onbekend TAR-headertype %u" #: apt-pkg/contrib/fileutl.cc #, c-format @@ -1573,8 +1572,7 @@ msgstr "" #: apt-pkg/policy.cc #, c-format msgid "Invalid record in the preferences file %s, no Package header" -msgstr "" -"Ongeldig record in het voorkeurenbestand %s, 'Package'-koptekst ontbreekt" +msgstr "Ongeldig record in het voorkeurenbestand %s, geen 'Package'-header" #: apt-pkg/policy.cc #, c-format @@ -3301,7 +3299,7 @@ msgstr "Bron-extensielijst is te lang" #: ftparchive/apt-ftparchive.cc msgid "Error writing header to contents file" -msgstr "Fout bij het wegschrijven van de koptekst naar het inhoudsbestand" +msgstr "Fout bij het wegschrijven van de header naar het inhoudsbestand" #: ftparchive/apt-ftparchive.cc #, c-format @@ -3589,23 +3587,23 @@ msgstr " %s heeft ook geen voorrangsvermelding voor binaire pakketten\n" #: methods/basehttp.cc msgid "Waiting for headers" -msgstr "Wachten op de kopteksten" +msgstr "Wachten op de headers" #: methods/basehttp.cc msgid "The HTTP server sent an invalid reply header" -msgstr "De HTTP-server verstuurde een ongeldige 'reply'-koptekst" +msgstr "De HTTP-server verstuurde een ongeldige 'reply'-header" #: methods/basehttp.cc msgid "Bad header line" -msgstr "Foute koptekstregel" +msgstr "Foute header-regel" #: methods/basehttp.cc msgid "The HTTP server sent an invalid Content-Length header" -msgstr "De HTTP-server verstuurde een ongeldige 'Content-Length'-koptekst" +msgstr "De HTTP-server verstuurde een ongeldige header 'Content-Length'" #: methods/basehttp.cc msgid "The HTTP server sent an invalid Content-Range header" -msgstr "De HTTP-server verstuurde een ongeldige 'Content-Range'-koptekst" +msgstr "De HTTP-server verstuurde een ongeldige header 'Content-Range'" #: methods/basehttp.cc msgid "This HTTP server has broken range support" @@ -3617,7 +3615,7 @@ msgstr "Onbekend datumformaat" #: methods/basehttp.cc msgid "Bad header data" -msgstr "Foute koptekstdata" +msgstr "Foute headerdata" #: methods/basehttp.cc msgid "Connection failed" @@ -3989,6 +3987,3 @@ msgstr "Verbinding werd voortijdig afgebroken" #: methods/store.cc msgid "Empty files can't be valid archives" msgstr "Lege bestanden kunnen geen geldige archieven zijn" - -#~ msgid "Invalid archive member header %s" -#~ msgstr "Ongeldige koptekst voor archiefonderdeel %s" diff --git a/test/integration/framework b/test/integration/framework index 44dedb10b..e30fa066c 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -585,10 +585,14 @@ configdpkg() { # the arch apt treats as native might be foreign for dpkg for ARCH in ${ARCHS}; do if [ "${ARCH}" != "${DPKGARCH}" ]; then - if ! dpkg --add-architecture ${ARCH} >/dev/null 2>&1; then - # old-style used e.g. in Ubuntu-P – and as it seems travis - echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg - echo "DPKG::options:: \"${ARCH}\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg + if ! dpkg --add-architecture ${ARCH} >rootdir/tmp/dpkgaddarch.output 2>&1; then + if grep -q 'pkg-config-dpkghook' rootdir/tmp/dpkgaddarch.output; then + msgwarn 'Ignoring failure of dpkg --add-architecture as it is likely due to pkg-config-dpkghook (see #824774)' + else + # old-style used e.g. in Ubuntu-P – and as it seems travis + echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg + echo "DPKG::options:: \"${ARCH}\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg + fi fi fi done diff --git a/test/integration/status-bug-lp1347721-dpkg-ordering b/test/integration/status-bug-lp1347721-dpkg-ordering index 62e545c55..eaea10b2d 100644 --- a/test/integration/status-bug-lp1347721-dpkg-ordering +++ b/test/integration/status-bug-lp1347721-dpkg-ordering @@ -684,14 +684,14 @@ Depends: libc6 (>= 2.17), libkmod2, sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16 Breaks: module-init-tools (<< 4) Conffiles: /etc/init/kmod.conf 2686532745c8b71d6d3df91c3a53aef3 - /etc/modprobe.d/blacklist-framebuffer.conf 097e2142ae3e4dd2911eda7844ce0c18 - /etc/modprobe.d/blacklist-rare-network.conf 8fb4b96124e461f53adceba9ca91f09a - /etc/modprobe.d/blacklist.conf bc6754fa320733c6d239a4bb0148ffd7 + /etc/modprobe.d/denylist-framebuffer.conf 097e2142ae3e4dd2911eda7844ce0c18 + /etc/modprobe.d/denylist-rare-network.conf 8fb4b96124e461f53adceba9ca91f09a + /etc/modprobe.d/denylist.conf bc6754fa320733c6d239a4bb0148ffd7 /etc/modprobe.d/iwlwifi.conf f27bc645e93e20c8e532325d190ac8ee - /etc/modprobe.d/blacklist-ath_pci.conf d1da9bb08c2b0f56f3be93fd0e37946b + /etc/modprobe.d/denylist-ath_pci.conf d1da9bb08c2b0f56f3be93fd0e37946b /etc/modprobe.d/mlx4.conf b2a0bedb7461daeb0138270639581bbf - /etc/modprobe.d/blacklist-firewire.conf 9cc07a17e8e64f9cd35ff59c29debe69 - /etc/modprobe.d/blacklist-watchdog.conf 55327f9270c8a6257a833c4d127a39e1 + /etc/modprobe.d/denylist-firewire.conf 9cc07a17e8e64f9cd35ff59c29debe69 + /etc/modprobe.d/denylist-watchdog.conf 55327f9270c8a6257a833c4d127a39e1 /etc/init.d/kmod e6d43abead3714ceb8aca68dd77e1dad /etc/depmod.d/ubuntu.conf 7c8439ef36b12e5f226b5dbfa20b8c2d Description: tools for managing Linux kernel modules @@ -1884,7 +1884,7 @@ Conffiles: /etc/init/udev-finish.conf 5c953c5b98ccfbb2a02985bfa2f80aed /etc/init/udev.conf 41c0081f3a830e0902aaff76a53edf98 /etc/init/udevmonitor.conf b541dfb5aa4958e9a5336ecaec00ca15 - /etc/modprobe.d/fbdev-blacklist.conf 01cd03c88ce6821c03baf904f7dfcbd0 + /etc/modprobe.d/fbdev-denylist.conf 01cd03c88ce6821c03baf904f7dfcbd0 /etc/udev/rules.d/README 3b6de9f3f911176734c66903b4f8735c obsolete Description: /dev/ and hotplug management daemon udev is a daemon which dynamically creates and removes device nodes from diff --git a/test/integration/status-ubuntu-bug-614993 b/test/integration/status-ubuntu-bug-614993 index 99de51d12..1e95b51e6 100644 --- a/test/integration/status-ubuntu-bug-614993 +++ b/test/integration/status-ubuntu-bug-614993 @@ -488,11 +488,11 @@ Depends: libc6 (>= 2.8), upstart-job Breaks: initramfs-tools (<< 0.92bubuntu23) Conffiles: /etc/depmod.d/ubuntu.conf 7c8439ef36b12e5f226b5dbfa20b8c2d - /etc/modprobe.d/blacklist-ath_pci.conf d1da9bb08c2b0f56f3be93fd0e37946b - /etc/modprobe.d/blacklist-firewire.conf cb8a4c10a5dddd1d67092198b1ae415f - /etc/modprobe.d/blacklist-framebuffer.conf b46c9509180b5a76145f08be46b1aff5 - /etc/modprobe.d/blacklist-watchdog.conf 55327f9270c8a6257a833c4d127a39e1 - /etc/modprobe.d/blacklist.conf bc6754fa320733c6d239a4bb0148ffd7 + /etc/modprobe.d/denylist-ath_pci.conf d1da9bb08c2b0f56f3be93fd0e37946b + /etc/modprobe.d/denylist-firewire.conf cb8a4c10a5dddd1d67092198b1ae415f + /etc/modprobe.d/denylist-framebuffer.conf b46c9509180b5a76145f08be46b1aff5 + /etc/modprobe.d/denylist-watchdog.conf 55327f9270c8a6257a833c4d127a39e1 + /etc/modprobe.d/denylist.conf bc6754fa320733c6d239a4bb0148ffd7 /etc/init/module-init-tools.conf 48db1b767c3148fd83eba59d12fc9a5e Description: tools for managing Linux kernel modules This package contains a set of programs for loading, inserting, and @@ -4886,7 +4886,7 @@ Version: 2.11.1-0ubuntu7 Replaces: libc0.1, libc0.3, libc6, libc6.1 Breaks: libc0.1 (<< 2.10), libc0.3 (<< 2.10), libc6 (<< 2.10), libc6.1 (<< 2.10) Conffiles: - /etc/bindresvport.blacklist 154db0e55fa99051ff1bd99e5b2c0584 + /etc/bindresvport.denylist 154db0e55fa99051ff1bd99e5b2c0584 /etc/ld.so.conf.d/libc.conf d4d833fd095fb7b90e1bb4a547f16de6 /etc/gai.conf 4b3389be7132a6a8805f3df8d0ff00f6 Description: Embedded GNU C Library: Binaries diff --git a/test/integration/test-bug-549968-install-depends-of-not-installed b/test/integration/test-bug-549968-install-depends-of-not-installed index 75e7474ff..90ce58a33 100755 --- a/test/integration/test-bug-549968-install-depends-of-not-installed +++ b/test/integration/test-bug-549968-install-depends-of-not-installed @@ -17,7 +17,6 @@ setupaptarchive testsuccessequal "Reading package lists... Building dependency tree... MarkInstall coolstuff:i386 < none -> 1.0 @un puN IPb > FU=1 - Ignore MarkInstall of extracoolstuff:i386 < none | 1.0 @hn puH > as its mode (Keep) is protected coolstuff:i386 Recommends on extracoolstuff:i386 < none | 1.0 @hn puH > can't be satisfied! (dep) Package 'extracoolstuff' is not installed, so not removed Recommended packages: diff --git a/test/integration/test-bug-618848-always-respect-user-requests b/test/integration/test-bug-618848-always-respect-user-requests index c9a7b714e..1e144f1ee 100755 --- a/test/integration/test-bug-618848-always-respect-user-requests +++ b/test/integration/test-bug-618848-always-respect-user-requests @@ -18,7 +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 exim4-daemon-heavy:i386 Depends on libdb4.8:i386 < 1.0 @ii pmR > can't be satisfied! (dep) MarkDelete exim4:i386 < 1.0 @ii mK Ib > FU=0 The following packages will be REMOVED: diff --git a/test/integration/test-bug-960705-propagate-protected-to-satisfied-conflict b/test/integration/test-bug-960705-propagate-protected-to-satisfied-conflict index e793193c3..ad1501b66 100755 --- a/test/integration/test-bug-960705-propagate-protected-to-satisfied-conflict +++ b/test/integration/test-bug-960705-propagate-protected-to-satisfied-conflict @@ -17,7 +17,7 @@ setupaptarchive testsuccessequal "Reading package lists... Building dependency tree... - Removing: systemd-sysv as upgrade is not an option for runit-init:amd64 (1) + Removing: systemd-sysv:amd64 as upgrade is not an option for runit-init:amd64 (1) MarkDelete systemd-sysv:amd64 < 1 @ii mK > FU=0 MarkInstall runit-init:amd64 < none -> 1 @un puN > FU=1 Starting pkgProblemResolver with broken count: 1 diff --git a/test/integration/test-dpkg-protected b/test/integration/test-dpkg-protected new file mode 100755 index 000000000..3d0994d89 --- /dev/null +++ b/test/integration/test-dpkg-protected @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'protected-package' 'native' '1' 'Protected: yes' + +setupaptarchive + + +if dpkg --assert-protected-field 2>/dev/null; then + testsuccess aptget remove protected-package "$@" -o Debug::pkgDpkgPm=1 -y --allow-remove-essential + cp rootdir/tmp/testsuccess.output rootdir/tmp/output + testsuccess grep -- '--force-remove-protected' rootdir/tmp/output +else + msgskip "dpkg does not support protected field" +fi diff --git a/test/integration/test-external-dependency-solver-protocol b/test/integration/test-external-dependency-solver-protocol index 2c451d5f9..0091263b7 100755 --- a/test/integration/test-external-dependency-solver-protocol +++ b/test/integration/test-external-dependency-solver-protocol @@ -292,3 +292,28 @@ echo 'Error: instant-exit Message: This solver exits instantly' exit 1" 'E: External solver failed with: This solver exits instantly E: Sub-process exit1withmsg returned an error code (1)' + +configarchitecture 'amd64' 'i386' +for arch in 'amd64' 'i386' 'armel' 'armhf'; do + insertinstalledpackage "dummy-httpd-$arch" "$arch" '1' 'Provides: httpd' +done +buildsimplenativepackage 'dummy-webserver' 'all' '1' 'unstable' 'Provides: httpd +Multi-Arch: foreign' +testfailure apt install -s dummy-webserver +testsuccess apt install -s ./incoming/dummy-webserver_1_all.deb +testsuccess apt install -s ./incoming/dummy-webserver_1_all.deb --solver apt +testfailure apt install -s ./incoming/dummy-webserver_1_all.deb --solver dump + +testsuccess aptcache showpkg dummy-webserver --with-source ./incoming/dummy-webserver_1_all.deb +cp -a rootdir/tmp/testsuccess.output showpkg.output +testequal 'Reverse Depends: +Dependencies: +1 - +Provides: +1 - ./incoming/dummy-webserver_1_all.deb (= 1) httpd:armhf (= ) httpd:armel (= ) httpd:i386 (= ) httpd (= ) +Reverse Provides: ' tail -n 6 showpkg.output +testsuccessequal 'Provides: httpd +Provides: httpd +Provides: httpd +Provides: httpd +Provides: httpd' grep 'Provides:' "$APT_EDSP_DUMP_FILENAME" diff --git a/test/integration/test-no-fds-leaked-to-maintainer-scripts b/test/integration/test-no-fds-leaked-to-maintainer-scripts index 85b3d0ee1..4606408fc 100755 --- a/test/integration/test-no-fds-leaked-to-maintainer-scripts +++ b/test/integration/test-no-fds-leaked-to-maintainer-scripts @@ -40,7 +40,7 @@ testsuccess aptget install -y fdleaks -qq < /dev/null checkfdleak() { msgtest 'Check if fds were not' "leaked: expect $1" - if [ "$(grep 'root root' rootdir/tmp/testsuccess.output | wc -l)" = "$1" ]; then + if [ "$(grep -e 'root root' -e "$(id -un) $(id -gn)" rootdir/tmp/testsuccess.output | wc -l)" = "$1" ]; then msgpass else echo diff --git a/test/integration/test-resolver-delays-remove-decisions b/test/integration/test-resolver-delays-remove-decisions new file mode 100755 index 000000000..d8dfd7c9a --- /dev/null +++ b/test/integration/test-resolver-delays-remove-decisions @@ -0,0 +1,107 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'stuff' 'all' '1' + +insertpackage 'unstable' 'foobar' 'all' '1' 'Depends: foo | bar' +insertpackage 'unstable' 'foo' 'all' '1' 'Conflicts: stuff +Depends: foo-dep' +insertpackage 'unstable' 'foo-dep' 'all' '1' 'Depends: uninstallable' + +insertpackage 'unstable' 'bar' 'all' '1' + +setupaptarchive + +# We are needlessly removing "stuff" if we don't delay its marking here +# as we do not question the remove later on +testsuccessequal "Reading package lists... +Building dependency tree... + MarkInstall foobar:amd64 < none -> 1 @un puN Ib > FU=1 + Installing foo:amd64 as Depends of foobar:amd64 + Delayed Removing: stuff:amd64 as upgrade is not an option for foo:amd64 (1) + MarkInstall foo:amd64 < none -> 1 @un uN Ib > FU=0 + Installing foo-dep:amd64 as Depends of foo:amd64 + foo-dep:amd64 Depends on uninstallable:amd64 < none @un H > can't be satisfied! + foo:amd64 Depends on foo-dep:amd64 < none @un H > can't be satisfied! (dep) + Installing bar:amd64 as Depends of foobar:amd64 + MarkInstall bar:amd64 < none -> 1 @un uN > FU=0 +Starting pkgProblemResolver with broken count: 0 +Starting 2 pkgProblemResolver with broken count: 0 +Done +The following additional packages will be installed: + bar +The following NEW packages will be installed: + bar foobar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1 unstable [all]) +Inst foobar (1 unstable [all]) +Conf bar (1 unstable [all]) +Conf foobar (1 unstable [all])" apt install foobar -s -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 -o Debug::pkgDepCache::AutoInstall=1 + +insertinstalledpackage 'uninstallable' 'all' '1' + +testsuccessequal "Reading package lists... +Building dependency tree... + MarkInstall foobar:amd64 < none -> 1 @un puN Ib > FU=1 + Installing foo:amd64 as Depends of foobar:amd64 + Delayed Removing: stuff:amd64 as upgrade is not an option for foo:amd64 (1) + MarkInstall foo:amd64 < none -> 1 @un uN Ib > FU=0 + Installing foo-dep:amd64 as Depends of foo:amd64 + MarkInstall foo-dep:amd64 < none -> 1 @un uN > FU=0 + MarkDelete stuff:amd64 < 1 @ii mK > FU=0 +Starting pkgProblemResolver with broken count: 0 +Starting 2 pkgProblemResolver with broken count: 0 +Done +The following additional packages will be installed: + foo foo-dep +The following packages will be REMOVED: + stuff +The following NEW packages will be installed: + foo foo-dep foobar + MarkDelete stuff:amd64 < 1 @ii K > FU=1 +0 upgraded, 3 newly installed, 1 to remove and 0 not upgraded. +Remv stuff [1] +Inst foo-dep (1 unstable [all]) +Inst foo (1 unstable [all]) +Inst foobar (1 unstable [all]) +Conf foo-dep (1 unstable [all]) +Conf foo (1 unstable [all]) +Conf foobar (1 unstable [all])" apt install foobar -s -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 -o Debug::pkgDepCache::AutoInstall=1 + +# Same solution but the installs are considered protected now as there is no other solution +testsuccessequal "Reading package lists... +Building dependency tree... + MarkInstall foobar:amd64 < none -> 1 @un puN Ib > FU=1 + Installing foo:amd64 as Depends of foobar:amd64 + Removing: stuff:amd64 as upgrade is not an option for foo:amd64 (1) + MarkDelete stuff:amd64 < 1 @ii mK > FU=0 + MarkInstall foo:amd64 < none -> 1 @un puN Ib > FU=0 + Installing foo-dep:amd64 as Depends of foo:amd64 + MarkInstall foo-dep:amd64 < none -> 1 @un puN > FU=0 + MarkInstall uninstallable:amd64 < 1 @ii pmK > FU=0 +Starting pkgProblemResolver with broken count: 0 +Starting 2 pkgProblemResolver with broken count: 0 +Done + Ignore MarkGarbage of foo:amd64 < none -> 1 @un puN > as its mode (Install) is protected + Ignore MarkGarbage of foo:amd64 < none -> 1 @un puN > as its mode (Install) is protected +Package 'bar' is not installed, so not removed +The following additional packages will be installed: + foo foo-dep +The following packages will be REMOVED: + stuff +The following NEW packages will be installed: + foo foo-dep foobar + MarkDelete stuff:amd64 < 1 | none @ii H > FU=1 +0 upgraded, 3 newly installed, 1 to remove and 0 not upgraded. +Remv stuff [1] +Inst foo-dep (1 unstable [all]) +Inst foo (1 unstable [all]) +Inst foobar (1 unstable [all]) +Conf foo-dep (1 unstable [all]) +Conf foo (1 unstable [all]) +Conf foobar (1 unstable [all])" apt install foobar bar- -q=0 -s -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 -o Debug::pkgDepCache::AutoInstall=1 diff --git a/test/integration/test-resolver-provider-exchange b/test/integration/test-resolver-provider-exchange new file mode 100755 index 000000000..3f5310fa6 --- /dev/null +++ b/test/integration/test-resolver-provider-exchange @@ -0,0 +1,107 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'fuse' 'all' '2' +insertpackage 'unstable' 'fuse3' 'all' '3' 'Conflicts: fuse +Provides: fuse' + +insertpackage 'unstable' 'foobar-d' 'all' '1' 'Depends: fuse' +insertpackage 'unstable' 'foobar-d2' 'all' '1' 'Depends: fuse +Conflicts: fuse3' +insertpackage 'unstable' 'foobar-d3' 'all' '1' 'Depends: fuse3' +insertpackage 'unstable' 'foobar-r' 'all' '1' 'Recommends: fuse' +insertpackage 'unstable' 'foobar-r2' 'all' '1' 'Recommends: fuse +Conflicts: fuse3' +insertpackage 'unstable' 'foobar-r3' 'all' '1' 'Recommends: fuse3' + +setupaptarchive + +installfoobars() { + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foobar-d +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar-d (1 unstable [all]) +Conf foobar-d (1 unstable [all])' apt install -s foobar-d + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foobar-d2 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar-d2 (1 unstable [all]) +Conf foobar-d2 (1 unstable [all])' apt install -s foobar-d2 + testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + fuse3 +The following packages will be REMOVED: + fuse +The following NEW packages will be installed: + foobar-d3 fuse3 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv fuse [2]$1 +Inst fuse3 (3 unstable [all]) +Inst foobar-d3 (1 unstable [all]) +Conf fuse3 (3 unstable [all]) +Conf foobar-d3 (1 unstable [all])" apt install -s foobar-d3 + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foobar-r +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar-r (1 unstable [all]) +Conf foobar-r (1 unstable [all])' apt install -s foobar-r + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foobar-r2 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar-r2 (1 unstable [all]) +Conf foobar-r2 (1 unstable [all])' apt install -s foobar-r2 + if [ -z "$1" ]; then + testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + fuse3 +The following packages will be REMOVED: + fuse +The following NEW packages will be installed: + foobar-r3 fuse3 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv fuse [2]$1 +Inst foobar-r3 (1 unstable [all]) +Inst fuse3 (3 unstable [all]) +Conf foobar-r3 (1 unstable [all]) +Conf fuse3 (3 unstable [all])" apt install -s foobar-r3 + else + testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + fuse3 +The following packages will be REMOVED: + fuse +The following NEW packages will be installed: + foobar-r3 fuse3 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv fuse [2]$1 +Inst fuse3 (3 unstable [all]) +Inst foobar-r3 (1 unstable [all]) +Conf fuse3 (3 unstable [all]) +Conf foobar-r3 (1 unstable [all])" apt install -s foobar-r3 + fi +} +msgmsg 'fuse has no installed dependers' +installfoobars + +for i in $(seq 0 10); do + insertinstalledpackage "stuff$i" 'all' '1' 'Depends: fuse' +done +msgmsg 'fuse has many dependers installed' +installfoobars ' [stuff10:amd64 stuff0:amd64 stuff1:amd64 stuff2:amd64 stuff3:amd64 stuff4:amd64 stuff5:amd64 stuff6:amd64 stuff7:amd64 stuff8:amd64 stuff9:amd64 ]' diff --git a/test/interactive-helper/aptwebserver.cc b/test/interactive-helper/aptwebserver.cc index 0398a12b6..f074cd148 100644 --- a/test/interactive-helper/aptwebserver.cc +++ b/test/interactive-helper/aptwebserver.cc @@ -960,7 +960,8 @@ int main(int const argc, const char * argv[]) // create socket, bind and listen to it {{{ // ignore SIGPIPE, this can happen on write() if the socket closes connection signal(SIGPIPE, SIG_IGN); - // we don't care for our slaves, so ignore their death + // ignore worker processes exiting, as we don't want to cause them to stay + // around as zombies because we're busy. signal(SIGCHLD, SIG_IGN); int sock = socket(AF_INET6, SOCK_STREAM, 0); @@ -1051,9 +1052,9 @@ int main(int const argc, const char * argv[]) std::clog << "Serving ANY file on port: " << port << std::endl; - int const slaves = _config->FindI("aptwebserver::slaves", SOMAXCONN); - std::cerr << "SLAVES: " << slaves << std::endl; - listen(sock, slaves); + int const workers = _config->FindI("aptwebserver::workers", SOMAXCONN); + std::cerr << "WORKERS: " << workers << std::endl; + listen(sock, workers); /*}}}*/ _config->CndSet("aptwebserver::response-header::Server", "APT webserver"); |