diff options
-rw-r--r-- | .gitignore | 8 | ||||
-rw-r--r-- | .gitlab-ci.yml | 33 | ||||
-rw-r--r-- | apt-pkg/acquire-item.cc | 263 | ||||
-rw-r--r-- | apt-pkg/acquire-item.h | 39 | ||||
-rw-r--r-- | apt-pkg/acquire-worker.cc | 84 | ||||
-rw-r--r-- | apt-pkg/depcache.cc | 33 | ||||
-rw-r--r-- | apt-pkg/depcache.h | 6 | ||||
-rw-r--r-- | debian/NEWS | 2 | ||||
-rw-r--r-- | methods/connect.cc | 7 | ||||
-rw-r--r-- | po/ru.po | 836 | ||||
-rwxr-xr-x | test/integration/test-apt-get-autoremove | 25 | ||||
-rwxr-xr-x | test/integration/test-bug-611729-mark-as-manual | 2 | ||||
-rwxr-xr-x | test/integration/test-disappearing-packages | 2 | ||||
-rwxr-xr-x | test/integration/test-partial-file-support | 2 | ||||
-rwxr-xr-x | test/integration/test-pdiff-usage | 5 |
15 files changed, 716 insertions, 631 deletions
diff --git a/.gitignore b/.gitignore index b27957646..7ca0cb136 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ cmake_install.cmake install_manifest.txt CTestTestfile.cmake Testing/ +CMakeDoxyfile.in +CMakeDoxygenDefaults.cmake gtest-* @@ -60,6 +62,11 @@ docbook-text-style.xsl **/methods/http **/methods/https **/methods/mirror +**/methods/mirror+copy +**/methods/mirror+file +**/methods/mirror+ftp +**/methods/mirror+http +**/methods/mirror+https **/methods/ftp **/methods/rred **/methods/rsh @@ -89,6 +96,7 @@ doxygen/ *.[1-9] **/doc/*/*.xml **/doc/*/*.dbk +**/doc/*/apt.ent !/doc/examples/ # Backend files diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..0ebff095c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,33 @@ +image: debian:testing + +test as root: + stage: test + script: + - adduser --home /home/travis travis --quiet --disabled-login --gecos "" --uid 1000 + - rm -f /etc/dpkg/dpkg.cfg.d/excludes + - apt-get update + - apt-get install -qq build-essential expect gcovr sudo + - chmod -R o+rwX $PWD + - ./prepare-release travis-ci + - sudo -u travis mkdir build + - sudo -u travis env -C build cmake -DCMAKE_BUILD_TYPE=Coverage -G Ninja .. + - sudo -u travis ninja -C build + - CTEST_OUTPUT_ON_FAILURE=1 ninja -C build test + - unbuffer ./test/integration/run-tests -q -j 4 + - gcovr + +test as user: + stage: test + script: + - adduser --home /home/travis travis --quiet --disabled-login --gecos "" --uid 1000 + - rm -f /etc/dpkg/dpkg.cfg.d/excludes + - apt-get update + - apt-get install -qq build-essential expect gcovr sudo + - chmod -R o+rwX $PWD + - ./prepare-release travis-ci + - sudo -u travis mkdir build + - sudo -u travis env -C build cmake -DCMAKE_BUILD_TYPE=Coverage -G Ninja .. + - sudo -u travis ninja -C build + - sudo -u travis CTEST_OUTPUT_ON_FAILURE=1 ninja -C build test + - sudo -u travis unbuffer ./test/integration/run-tests -q -j 4 + - sudo -u travis gcovr diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index f5986a260..a366b8981 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -398,21 +398,66 @@ bool pkgAcqTransactionItem::QueueURI(pkgAcquire::ItemDesc &Item) Status = StatDone; return false; } + // this ensures we rewrite only once and only the first step + auto const OldBaseURI = Target.Option(IndexTarget::BASE_URI); + if (OldBaseURI.empty() || APT::String::Startswith(Item.URI, OldBaseURI) == false) + return pkgAcquire::Item::QueueURI(Item); + // the given URI is our last resort + PushAlternativeURI(std::string(Item.URI), {}, false); // If we got the InRelease file via a mirror, pick all indexes directly from this mirror, too - if (TransactionManager->BaseURI.empty() == false && UsedMirror.empty() && - URI::SiteOnly(Item.URI) != URI::SiteOnly(TransactionManager->BaseURI)) + std::string SameMirrorURI; + if (TransactionManager->BaseURI.empty() == false && TransactionManager->UsedMirror.empty() == false && + URI::SiteOnly(Item.URI) != URI::SiteOnly(TransactionManager->BaseURI)) { - // this ensures we rewrite only once and only the first step - auto const OldBaseURI = Target.Option(IndexTarget::BASE_URI); - if (OldBaseURI.empty() == false && APT::String::Startswith(Item.URI, OldBaseURI)) + auto ExtraPath = Item.URI.substr(OldBaseURI.length()); + auto newURI = flCombine(TransactionManager->BaseURI, std::move(ExtraPath)); + if (IsGoodAlternativeURI(newURI)) { - auto const ExtraPath = Item.URI.substr(OldBaseURI.length()); - Item.URI = flCombine(TransactionManager->BaseURI, ExtraPath); - UsedMirror = TransactionManager->UsedMirror; - if (Item.Description.find(" ") != string::npos) - Item.Description.replace(0, Item.Description.find(" "), UsedMirror); + SameMirrorURI = std::move(newURI); + PushAlternativeURI(std::string(SameMirrorURI), {}, false); } } + // add URI and by-hash based on it + if (AcquireByHash()) + { + // if we use the mirror transport, ask it for by-hash uris + // we need to stick to the same mirror only for non-unique filenames + auto const sameMirrorException = [&]() { + if (Item.URI.find("mirror") == std::string::npos) + return false; + ::URI uri(Item.URI); + return uri.Access == "mirror" || APT::String::Startswith(uri.Access, "mirror+") || + APT::String::Endswith(uri.Access, "+mirror") || uri.Access.find("+mirror+") != std::string::npos; + }(); + if (sameMirrorException) + SameMirrorURI.clear(); + // now add the actual by-hash uris + auto const Expected = GetExpectedHashes(); + auto const TargetHash = Expected.find(nullptr); + auto const PushByHashURI = [&](std::string U) { + if (unlikely(TargetHash == nullptr)) + return false; + auto const trailing_slash = U.find_last_of("/"); + if (unlikely(trailing_slash == std::string::npos)) + return false; + auto byhashSuffix = "/by-hash/" + TargetHash->HashType() + "/" + TargetHash->HashValue(); + U.replace(trailing_slash, U.length() - trailing_slash, std::move(byhashSuffix)); + PushAlternativeURI(std::move(U), {}, false); + return true; + }; + PushByHashURI(Item.URI); + if (SameMirrorURI.empty() == false && PushByHashURI(SameMirrorURI) == false) + SameMirrorURI.clear(); + } + // the last URI added is the first one tried + if (unlikely(PopAlternativeURI(Item.URI) == false)) + return false; + if (SameMirrorURI.empty() == false) + { + UsedMirror = TransactionManager->UsedMirror; + if (Item.Description.find(" ") != string::npos) + Item.Description.replace(0, Item.Description.find(" "), UsedMirror); + } return pkgAcquire::Item::QueueURI(Item); } /* The transition manager InRelease itself (or its older sisters-in-law @@ -619,6 +664,26 @@ bool pkgAcqDiffIndex::TransactionState(TransactionStates const state) return true; } /*}}}*/ +// pkgAcqTransactionItem::AcquireByHash and specialisations for child classes /*{{{*/ +bool pkgAcqTransactionItem::AcquireByHash() const +{ + if (TransactionManager->MetaIndexParser == nullptr) + return false; + auto const useByHashConf = Target.Option(IndexTarget::BY_HASH); + if (useByHashConf == "force") + return true; + return StringToBool(useByHashConf) == true && TransactionManager->MetaIndexParser->GetSupportsAcquireByHash(); +} +// pdiff patches have a unique name already, no need for by-hash +bool pkgAcqIndexMergeDiffs::AcquireByHash() const +{ + return false; +} +bool pkgAcqIndexDiffs::AcquireByHash() const +{ + return false; +} + /*}}}*/ class APT_HIDDEN NoActionItem : public pkgAcquire::Item /*{{{*/ /* The sole purpose of this class is having an item which does nothing to @@ -686,11 +751,12 @@ class pkgAcquire::Item::Private public: struct AlternateURI { - std::string const URI; + std::string URI; std::unordered_map<std::string, std::string> changefields; AlternateURI(std::string &&u, decltype(changefields) &&cf) : URI(u), changefields(cf) {} }; std::list<AlternateURI> AlternativeURIs; + std::vector<std::string> BadAlternativeSites; std::vector<std::string> PastRedirections; std::unordered_map<std::string, std::string> CustomFields; unsigned int Retries; @@ -749,14 +815,32 @@ bool pkgAcquire::Item::PopAlternativeURI(std::string &NewURI) /*{{{*/ return true; } /*}}}*/ +bool pkgAcquire::Item::IsGoodAlternativeURI(std::string const &AltUri) const/*{{{*/ +{ + return std::find(d->PastRedirections.cbegin(), d->PastRedirections.cend(), AltUri) == d->PastRedirections.cend() && + std::find(d->BadAlternativeSites.cbegin(), d->BadAlternativeSites.cend(), URI::SiteOnly(AltUri)) == d->BadAlternativeSites.cend(); +} + /*}}}*/ void pkgAcquire::Item::PushAlternativeURI(std::string &&NewURI, std::unordered_map<std::string, std::string> &&fields, bool const at_the_back) /*{{{*/ { + if (IsGoodAlternativeURI(NewURI) == false) + return; if (at_the_back) d->AlternativeURIs.emplace_back(std::move(NewURI), std::move(fields)); else d->AlternativeURIs.emplace_front(std::move(NewURI), std::move(fields)); } /*}}}*/ +void pkgAcquire::Item::RemoveAlternativeSite(std::string &&OldSite) /*{{{*/ +{ + d->AlternativeURIs.erase(std::remove_if(d->AlternativeURIs.begin(), d->AlternativeURIs.end(), + [&](decltype(*d->AlternativeURIs.cbegin()) AltUri) { + return URI::SiteOnly(AltUri.URI) == OldSite; + }), + d->AlternativeURIs.end()); + d->BadAlternativeSites.push_back(std::move(OldSite)); +} + /*}}}*/ unsigned int &pkgAcquire::Item::ModifyRetries() /*{{{*/ { return d->Retries; @@ -1429,7 +1513,6 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify) /*{{{*/ std::set<std::string> targetsSeen; bool const hasReleaseFile = TransactionManager->MetaIndexParser != NULL; - bool const metaBaseSupportsByHash = hasReleaseFile && TransactionManager->MetaIndexParser->GetSupportsAcquireByHash(); bool hasHashes = true; auto IndexTargets = TransactionManager->MetaIndexParser->GetIndexTargets(); if (hasReleaseFile && verify == false) @@ -1565,15 +1648,6 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify) /*{{{*/ if (types.empty() == false) { std::ostringstream os; - // add the special compressiontype byhash first if supported - std::string const useByHashConf = Target.Option(IndexTarget::BY_HASH); - bool useByHash = false; - if(useByHashConf == "force") - useByHash = true; - else - useByHash = StringToBool(useByHashConf) == true && metaBaseSupportsByHash; - if (useByHash == true) - os << "by-hash "; std::copy(types.begin(), types.end()-1, std::ostream_iterator<std::string>(os, " ")); os << *types.rbegin(); Target.Options["COMPRESSIONTYPES"] = os.str(); @@ -2219,8 +2293,6 @@ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire * const Owner, CompressionExtensions = os.str(); } } - if (Target.Option(IndexTarget::COMPRESSIONTYPES).find("by-hash") != std::string::npos) - CompressionExtensions = "by-hash " + CompressionExtensions; Init(GetDiffIndexURI(Target), GetDiffIndexFileName(Target.Description), Target.ShortDesc); if(Debug) @@ -2231,7 +2303,7 @@ void pkgAcqDiffIndex::QueueOnIMSHit() const /*{{{*/ { // list cleanup needs to know that this file as well as the already // present index is ours, so we create an empty diff to save it for us - new pkgAcqIndexDiffs(Owner, TransactionManager, Target, UsedMirror, Target.URI); + new pkgAcqIndexDiffs(Owner, TransactionManager, Target); } /*}}}*/ static bool RemoveFileForBootstrapLinking(std::string &ErrorText, std::string const &For, std::string const &Boot)/*{{{*/ @@ -2585,7 +2657,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string const &IndexDiffFile) /*{{{*/ /*}}}*/ void pkgAcqDiffIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/ { - if (CommonFailed(GetDiffIndexURI(Target), GetDiffIndexFileName(Target.Description), Message, Cnf)) + if (CommonFailed(GetDiffIndexURI(Target), Message, Cnf)) return; RenameOnError(PDiffError); @@ -2631,33 +2703,16 @@ void pkgAcqDiffIndex::Done(string const &Message,HashStringList const &Hashes, / } else { - // we have something, queue the diffs - string::size_type const last_space = Description.rfind(" "); - if(last_space != string::npos) - Description.erase(last_space, Description.size()-last_space); - - std::string indexURI = Desc.URI; - auto const byhashidx = indexURI.find("/by-hash/"); - if (byhashidx != std::string::npos) - indexURI = indexURI.substr(0, byhashidx - strlen(".diff")); - else - { - auto end = indexURI.length() - strlen(".diff/Index"); - if (CurrentCompressionExtension != "uncompressed") - end -= (1 + CurrentCompressionExtension.length()); - indexURI = indexURI.substr(0, end); - } - if (pdiff_merge == false) - new pkgAcqIndexDiffs(Owner, TransactionManager, Target, UsedMirror, indexURI, available_patches); + new pkgAcqIndexDiffs(Owner, TransactionManager, Target, available_patches); else { diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size()); for(size_t i = 0; i < available_patches.size(); ++i) (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner, TransactionManager, - Target, UsedMirror, indexURI, - available_patches[i], - diffs); + Target, + available_patches[i], + diffs); } } @@ -2681,28 +2736,20 @@ pkgAcqDiffIndex::~pkgAcqDiffIndex() /* The package diff is added to the queue. one object is constructed * for each diff and the index */ -pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire * const Owner, - pkgAcqMetaClearSig * const TransactionManager, - IndexTarget const &Target, - std::string const &indexUsedMirror, std::string const &indexURI, +pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *const Owner, + pkgAcqMetaClearSig *const TransactionManager, + IndexTarget const &Target, vector<DiffInfo> const &diffs) - : pkgAcqBaseIndex(Owner, TransactionManager, Target), indexURI(indexURI), - available_patches(diffs) + : pkgAcqBaseIndex(Owner, TransactionManager, Target), + available_patches(diffs) { DestFile = GetKeepCompressedFileName(GetPartialFileNameFromURI(Target.URI), Target); Debug = _config->FindB("Debug::pkgAcquire::Diffs",false); Desc.Owner = this; - Description = Target.Description; Desc.ShortDesc = Target.ShortDesc; - UsedMirror = indexUsedMirror; - if (UsedMirror == "DIRECT") - UsedMirror.clear(); - else if (UsedMirror.empty() == false && Description.find(" ") != string::npos) - Description.replace(0, Description.find(" "), UsedMirror); - if(available_patches.empty() == true) { // we are done (yeah!), check hashes against the final file @@ -2817,8 +2864,8 @@ bool pkgAcqIndexDiffs::QueueNextDiff() /*{{{*/ } // queue the right diff - Desc.URI = indexURI + ".diff/" + available_patches[0].file + ".gz"; - Desc.Description = Description + " " + available_patches[0].file + string(".pdiff"); + Desc.URI = Target.URI + ".diff/" + available_patches[0].file + ".gz"; + Desc.Description = Target.Description + " " + available_patches[0].file + string(".pdiff"); DestFile = GetKeepCompressedFileName(GetPartialFileNameFromURI(Target.URI + ".diff/" + available_patches[0].file), Target); if(Debug) @@ -2870,7 +2917,7 @@ void pkgAcqIndexDiffs::Done(string const &Message, HashStringList const &Hashes, // see if there is more to download if(available_patches.empty() == false) { - new pkgAcqIndexDiffs(Owner, TransactionManager, Target, UsedMirror, indexURI, available_patches); + new pkgAcqIndexDiffs(Owner, TransactionManager, Target, available_patches); Finish(); } else { DestFile = PatchedFile; @@ -2896,28 +2943,20 @@ std::string pkgAcqIndexDiffs::Custom600Headers() const /*{{{*/ pkgAcqIndexDiffs::~pkgAcqIndexDiffs() {} // AcqIndexMergeDiffs::AcqIndexMergeDiffs - Constructor /*{{{*/ -pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire * const Owner, - pkgAcqMetaClearSig * const TransactionManager, - IndexTarget const &Target, - std::string const &indexUsedMirror, std::string const &indexURI, - DiffInfo const &patch, - std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches) - : pkgAcqBaseIndex(Owner, TransactionManager, Target), indexURI(indexURI), - patch(patch), allPatches(allPatches), State(StateFetchDiff) +pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *const Owner, + pkgAcqMetaClearSig *const TransactionManager, + IndexTarget const &Target, + DiffInfo const &patch, + std::vector<pkgAcqIndexMergeDiffs *> const *const allPatches) + : pkgAcqBaseIndex(Owner, TransactionManager, Target), + patch(patch), allPatches(allPatches), State(StateFetchDiff) { Debug = _config->FindB("Debug::pkgAcquire::Diffs",false); - Description = Target.Description; - UsedMirror = indexUsedMirror; - if (UsedMirror == "DIRECT") - UsedMirror.clear(); - else if (UsedMirror.empty() == false && Description.find(" ") != string::npos) - Description.replace(0, Description.find(" "), UsedMirror); - Desc.Owner = this; Desc.ShortDesc = Target.ShortDesc; - Desc.URI = indexURI + ".diff/" + patch.file + ".gz"; - Desc.Description = Description + " " + patch.file + ".pdiff"; + Desc.URI = Target.URI + ".diff/" + patch.file + ".gz"; + Desc.Description = Target.Description + " " + patch.file + ".pdiff"; DestFile = GetPartialFileNameFromURI(Target.URI + ".diff/" + patch.file + ".gz"); if(Debug) @@ -3073,60 +3112,28 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire * const Owner, } /*}}}*/ // AcqIndex::Init - deferred Constructor /*{{{*/ -static void NextCompressionExtension(std::string &CurrentCompressionExtension, std::string &CompressionExtensions, bool const preview) +void pkgAcqIndex::Init(string const &URI, string const &URIDesc, + string const &ShortDesc) { + Stage = STAGE_DOWNLOAD; + + DestFile = GetPartialFileNameFromURI(URI); size_t const nextExt = CompressionExtensions.find(' '); if (nextExt == std::string::npos) { CurrentCompressionExtension = CompressionExtensions; - if (preview == false) - CompressionExtensions.clear(); + CompressionExtensions.clear(); } else { CurrentCompressionExtension = CompressionExtensions.substr(0, nextExt); - if (preview == false) - CompressionExtensions = CompressionExtensions.substr(nextExt+1); + CompressionExtensions = CompressionExtensions.substr(nextExt+1); } -} -void pkgAcqIndex::Init(string const &URI, string const &URIDesc, - string const &ShortDesc) -{ - Stage = STAGE_DOWNLOAD; - - DestFile = GetPartialFileNameFromURI(URI); - NextCompressionExtension(CurrentCompressionExtension, CompressionExtensions, false); if (CurrentCompressionExtension == "uncompressed") { Desc.URI = URI; } - else if (CurrentCompressionExtension == "by-hash") - { - NextCompressionExtension(CurrentCompressionExtension, CompressionExtensions, true); - if(unlikely(CurrentCompressionExtension.empty())) - return; - if (CurrentCompressionExtension != "uncompressed") - { - Desc.URI = URI + '.' + CurrentCompressionExtension; - DestFile = DestFile + '.' + CurrentCompressionExtension; - } - else - Desc.URI = URI; - - HashStringList const Hashes = GetExpectedHashes(); - HashString const * const TargetHash = Hashes.find(NULL); - if (unlikely(TargetHash == nullptr)) - return; - std::string const ByHash = "/by-hash/" + TargetHash->HashType() + "/" + TargetHash->HashValue(); - size_t const trailing_slash = Desc.URI.find_last_of("/"); - if (unlikely(trailing_slash == std::string::npos)) - return; - Desc.URI = Desc.URI.replace( - trailing_slash, - Desc.URI.substr(trailing_slash+1).size()+1, - ByHash); - } else if (unlikely(CurrentCompressionExtension.empty())) return; else @@ -3170,24 +3177,10 @@ string pkgAcqIndex::Custom600Headers() const } /*}}}*/ // AcqIndex::Failed - getting the indexfile failed /*{{{*/ -bool pkgAcqIndex::CommonFailed(std::string const &TargetURI, std::string const TargetDesc, - std::string const &Message, pkgAcquire::MethodConfig const * const Cnf) +bool pkgAcqIndex::CommonFailed(std::string const &TargetURI, + std::string const &Message, pkgAcquire::MethodConfig const *const Cnf) { pkgAcqBaseIndex::Failed(Message,Cnf); - - if (UsedMirror.empty() == false && UsedMirror != "DIRECT" && - LookupTag(Message, "FailReason") == "HttpError404") - { - UsedMirror = "DIRECT"; - if (Desc.URI.find("/by-hash/") != std::string::npos) - CompressionExtensions = "by-hash " + CompressionExtensions; - else - CompressionExtensions = CurrentCompressionExtension + ' ' + CompressionExtensions; - Init(TargetURI, TargetDesc, Desc.ShortDesc); - Status = StatIdle; - return true; - } - // authorisation matches will not be fixed by other compression types if (Status != StatAuthError) { @@ -3202,7 +3195,7 @@ bool pkgAcqIndex::CommonFailed(std::string const &TargetURI, std::string const T } void pkgAcqIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf) { - if (CommonFailed(Target.URI, Target.Description, Message, Cnf)) + if (CommonFailed(Target.URI, Message, Cnf)) return; if(Target.IsOptional && GetExpectedHashes().empty() && Stage == STAGE_DOWNLOAD) diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index 46d79df92..3a5a518c2 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -246,7 +246,9 @@ class pkgAcquire::Item : public WeakPointable /*{{{*/ APT_HIDDEN std::unordered_map<std::string, std::string> &ModifyCustomFields(); // this isn't the super nicest interface either… APT_HIDDEN bool PopAlternativeURI(std::string &NewURI); + APT_HIDDEN bool IsGoodAlternativeURI(std::string const &AltUri) const; APT_HIDDEN void PushAlternativeURI(std::string &&NewURI, std::unordered_map<std::string, std::string> &&fields, bool const at_the_back); + APT_HIDDEN void RemoveAlternativeSite(std::string &&OldSite); /** \brief A "descriptive" URI-like string. * @@ -405,7 +407,7 @@ class APT_HIDDEN pkgAcqTransactionItem: public pkgAcquire::Item /*{{{*/ virtual HashStringList GetExpectedHashes() const APT_OVERRIDE; virtual std::string GetMetaKey() const; virtual bool HashesRequired() const APT_OVERRIDE; - + virtual bool AcquireByHash() const; pkgAcqTransactionItem(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager, IndexTarget const &Target) APT_NONNULL(2, 3); virtual ~pkgAcqTransactionItem(); @@ -690,8 +692,8 @@ class APT_HIDDEN pkgAcqIndex : public pkgAcqBaseIndex protected: APT_HIDDEN void Init(std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc); - APT_HIDDEN bool CommonFailed(std::string const &TargetURI, std::string const TargetDesc, - std::string const &Message, pkgAcquire::MethodConfig const * const Cnf); + APT_HIDDEN bool CommonFailed(std::string const &TargetURI, + std::string const &Message, pkgAcquire::MethodConfig const *const Cnf); }; /*}}}*/ struct APT_HIDDEN DiffInfo { /*{{{*/ @@ -728,11 +730,6 @@ class APT_HIDDEN pkgAcqDiffIndex : public pkgAcqIndex /** \brief If \b true, debugging information will be written to std::clog. */ bool Debug; - /** \brief A description of the Packages file (stored in - * pkgAcquire::ItemDesc::Description). - */ - std::string Description; - /** \brief Get the full pathname of the final file for the current URI */ virtual std::string GetFinalFilename() const APT_OVERRIDE; @@ -790,8 +787,6 @@ class APT_HIDDEN pkgAcqDiffIndex : public pkgAcqIndex */ class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex { - std::string const indexURI; - protected: /** \brief If \b true, debugging output will be written to @@ -799,9 +794,6 @@ class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex */ bool Debug; - /** \brief description of the file being downloaded. */ - std::string Description; - /** \brief information about the current patch */ struct DiffInfo const patch; @@ -837,6 +829,7 @@ class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex virtual std::string DescURI() const APT_OVERRIDE {return Target.URI + "Index";}; virtual HashStringList GetExpectedHashes() const APT_OVERRIDE; virtual bool HashesRequired() const APT_OVERRIDE; + virtual bool AcquireByHash() const APT_OVERRIDE; /** \brief Create an index merge-diff item. * @@ -850,10 +843,9 @@ class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex * \param allPatches contains all related items so that each item can * check if it was the last one to complete the download step */ - pkgAcqIndexMergeDiffs(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager, - IndexTarget const &Target, std::string const &indexUsedMirror, - std::string const &indexURI, DiffInfo const &patch, - std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches) APT_NONNULL(2, 3, 8); + pkgAcqIndexMergeDiffs(pkgAcquire *const Owner, pkgAcqMetaClearSig *const TransactionManager, + IndexTarget const &Target, DiffInfo const &patch, + std::vector<pkgAcqIndexMergeDiffs *> const *const allPatches) APT_NONNULL(2, 3, 6); virtual ~pkgAcqIndexMergeDiffs(); }; /*}}}*/ @@ -870,8 +862,6 @@ class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex */ class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex { - std::string const indexURI; - private: /** \brief Queue up the next diff download. @@ -905,9 +895,6 @@ class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex */ bool Debug; - /** A description of the file being downloaded. */ - std::string Description; - /** The patches that remain to be downloaded, including the patch * being downloaded right now. This list should be ordered so * that each diff appears before any diff that depends on it. @@ -943,6 +930,7 @@ class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex virtual std::string DescURI() const APT_OVERRIDE {return Target.URI + "IndexDiffs";}; virtual HashStringList GetExpectedHashes() const APT_OVERRIDE; virtual bool HashesRequired() const APT_OVERRIDE; + virtual bool AcquireByHash() const APT_OVERRIDE; /** \brief Create an index diff item. * @@ -957,10 +945,9 @@ class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex * should be ordered so that each diff appears before any diff * that depends on it. */ - pkgAcqIndexDiffs(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager, - IndexTarget const &Target, - std::string const &indexUsedMirror, std::string const &indexURI, - std::vector<DiffInfo> const &diffs=std::vector<DiffInfo>()) APT_NONNULL(2, 3); + pkgAcqIndexDiffs(pkgAcquire *const Owner, pkgAcqMetaClearSig *const TransactionManager, + IndexTarget const &Target, + std::vector<DiffInfo> const &diffs = std::vector<DiffInfo>()) APT_NONNULL(2, 3); virtual ~pkgAcqIndexDiffs(); }; /*}}}*/ diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index d159ef84f..c2bbf8bed 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -321,28 +321,35 @@ bool pkgAcquire::Worker::RunMessages() Itm = nullptr; for (auto const &Owner: ItmOwners) { + for (auto alt = AltUris.crbegin(); alt != AltUris.crend(); ++alt) + Owner->PushAlternativeURI(std::string(*alt), {}, false); + pkgAcquire::ItemDesc &desc = Owner->GetItemDesc(); - if (Owner->IsRedirectionLoop(NewURI)) + // for a simplified retry a method might redirect without URI change + // see also IsRedirectionLoop implementation + if (desc.URI != NewURI) { - std::string msg = Message; - msg.append("\nFailReason: RedirectionLoop"); - Owner->Failed(msg, Config); - if (Log != nullptr) - Log->Fail(Owner->GetItemDesc()); - continue; - } + auto newuri = NewURI; + if (Owner->IsGoodAlternativeURI(newuri) == false && Owner->PopAlternativeURI(newuri) == false) + newuri.clear(); + if (newuri.empty() || Owner->IsRedirectionLoop(newuri)) + { + std::string msg = Message; + msg.append("\nFailReason: RedirectionLoop"); + Owner->Failed(msg, Config); + if (Log != nullptr) + Log->Fail(Owner->GetItemDesc()); + continue; + } - if (Log != nullptr) - Log->Done(desc); + if (Log != nullptr) + Log->Done(desc); - ChangeSiteIsMirrorChange(NewURI, desc, Owner); - desc.URI = NewURI; + ChangeSiteIsMirrorChange(NewURI, desc, Owner); + desc.URI = NewURI; + } if (isDoomedItem(Owner) == false) - { - for (auto alt = AltUris.crbegin(); alt != AltUris.crend(); ++alt) - Owner->PushAlternativeURI(std::string(*alt), {}, false); OwnerQ->Owner->Enqueue(desc); - } } break; } @@ -608,28 +615,33 @@ void pkgAcquire::Worker::HandleFailure(std::vector<pkgAcquire::Item *> const &It if (isDoomedItem(Owner) == false) OwnerQ->Owner->Enqueue(SavedDesc); } - else if (Owner->PopAlternativeURI(NewURI)) - { - Owner->FailMessage(Message); - auto &desc = Owner->GetItemDesc(); - if (Log != nullptr) - Log->Fail(desc); - ChangeSiteIsMirrorChange(NewURI, desc, Owner); - desc.URI = NewURI; - if (isDoomedItem(Owner) == false) - OwnerQ->Owner->Enqueue(desc); - } else { - if (errAuthErr && Owner->GetExpectedHashes().empty() == false) - Owner->Status = pkgAcquire::Item::StatAuthError; - else if (errTransient) - Owner->Status = pkgAcquire::Item::StatTransientNetworkError; - auto SavedDesc = Owner->GetItemDesc(); - if (isDoomedItem(Owner) == false) - Owner->Failed(Message, Config); - if (Log != nullptr) - Log->Fail(SavedDesc); + if (errAuthErr) + Owner->RemoveAlternativeSite(URI::SiteOnly(Owner->GetItemDesc().URI)); + if (Owner->PopAlternativeURI(NewURI)) + { + Owner->FailMessage(Message); + auto &desc = Owner->GetItemDesc(); + if (Log != nullptr) + Log->Fail(desc); + ChangeSiteIsMirrorChange(NewURI, desc, Owner); + desc.URI = NewURI; + if (isDoomedItem(Owner) == false) + OwnerQ->Owner->Enqueue(desc); + } + else + { + if (errAuthErr && Owner->GetExpectedHashes().empty() == false) + Owner->Status = pkgAcquire::Item::StatAuthError; + else if (errTransient) + Owner->Status = pkgAcquire::Item::StatTransientNetworkError; + auto SavedDesc = Owner->GetItemDesc(); + if (isDoomedItem(Owner) == false) + Owner->Failed(Message, Config); + if (Log != nullptr) + Log->Fail(SavedDesc); + } } } } diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 0f45fec90..7c016a5e7 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -1873,28 +1873,29 @@ bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc) if (PkgState[P->ID].Marked || IsPkgInBoringState(P, PkgState)) continue; + const char *reason = nullptr; + if ((PkgState[P->ID].Flags & Flag::Auto) == 0) - ; - else if ((P->Flags & Flag::Essential) || (P->Flags & Flag::Important)) - ; - // be nice even then a required package violates the policy (#583517) - // and do the full mark process also for required packages + reason = "Manual-Installed"; + else if (P->Flags & Flag::Essential) + reason = "Essential"; + else if (P->Flags & Flag::Important) + reason = "Important"; else if (P->CurrentVer != 0 && P.CurrentVer()->Priority == pkgCache::State::Required) - ; + reason = "Required"; else if (userFunc.InRootSet(P)) - ; - // packages which can't be changed (like holds) can't be garbage + reason = "Blacklisted [APT::NeverAutoRemove]"; else if (IsModeChangeOk(ModeGarbage, P, 0, false) == false) - ; + reason = "Hold"; else continue; if (PkgState[P->ID].Install()) MarkPackage(P, PkgState[P->ID].InstVerIter(*this), - follow_recommends, follow_suggests); + follow_recommends, follow_suggests, reason); else MarkPackage(P, P.CurrentVer(), - follow_recommends, follow_suggests); + follow_recommends, follow_suggests, reason); } return true; @@ -1904,7 +1905,8 @@ bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc) void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &Pkg, const pkgCache::VerIterator &Ver, bool const &follow_recommends, - bool const &follow_suggests) + bool const &follow_suggests, + const char *reason) { { pkgDepCache::StateCache &state = PkgState[Pkg->ID]; @@ -1919,7 +1921,8 @@ void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &Pkg, bool const debug_autoremove = _config->FindB("Debug::pkgAutoRemove", false); if(debug_autoremove) - std::clog << "Marking: " << Pkg.FullName() << " " << Ver.VerStr() << std::endl; + std::clog << "Marking: " << Pkg.FullName() << " " << Ver.VerStr() + << " (" << reason << ")" << std::endl; for (auto D = Ver.DependsList(); D.end() == false; ++D) { @@ -1976,7 +1979,7 @@ void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &Pkg, std::clog << "Following dep: " << APT::PrettyDep(this, D) << ", provided by " << PP.FullName() << " " << PV.VerStr() << " (" << providers.size() << "/" << prvsize << ")"<< std::endl; - MarkPackage(PP, PV, follow_recommends, follow_suggests); + MarkPackage(PP, PV, follow_recommends, follow_suggests, "Provider"); } } @@ -1991,7 +1994,7 @@ void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &Pkg, if (debug_autoremove) std::clog << "Following dep: " << APT::PrettyDep(this, D) << std::endl; - MarkPackage(T, TV, follow_recommends, follow_suggests); + MarkPackage(T, TV, follow_recommends, follow_suggests, "Dependency"); } } /*}}}*/ diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 4536f3b52..724bf566e 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -88,11 +88,15 @@ class pkgDepCache : protected pkgCache::Namespace * * \param follow_suggests If \b true, suggestions of the package * will be recursively marked. + * + * \param reason The reason why the package is being marked. + * (Used in logging when Debug::pkgAutoRemove is set.) */ APT_HIDDEN void MarkPackage(const pkgCache::PkgIterator &pkg, const pkgCache::VerIterator &ver, bool const &follow_recommends, - bool const &follow_suggests); + bool const &follow_suggests, + const char *reason); /** \brief Update the Marked field of all packages. * diff --git a/debian/NEWS b/debian/NEWS index 9e77685a7..95c2d27fd 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -47,7 +47,7 @@ apt (1.5~beta1) unstable; urgency=medium setting the option Acquire::AllowTLS to "false". As for backwards compatibility, the options IssuerCert and SslForceVersion - are not supported anymore, and any specified certificate files must in the + are not supported anymore, and any specified certificate files must be in the PEM format (curl might have allowed DER files as well). [ Changes to unauthenticated repositories ] diff --git a/methods/connect.cc b/methods/connect.cc index 35f2da397..d4e4303b3 100644 --- a/methods/connect.cc +++ b/methods/connect.cc @@ -546,7 +546,12 @@ static bool TalkToSocksProxy(int const ServerFd, std::string const &Proxy, unsigned int const Size, unsigned int const Timeout) { if (WaitFd(ServerFd, ReadWrite, Timeout) == false) - return _error->Error("Waiting for the SOCKS proxy %s to %s timed out", URI::SiteOnly(Proxy).c_str(), type); + { + if (ReadWrite) + return _error->Error("Timed out while waiting to write '%s' to proxy %s", type, URI::SiteOnly(Proxy).c_str()); + else + return _error->Error("Timed out while waiting to read '%s' from proxy %s", type, URI::SiteOnly(Proxy).c_str()); + } if (ReadWrite == false) { if (FileFd::Read(ServerFd, ToFrom, Size) == false) @@ -8,21 +8,22 @@ # Dmitry Astapov <adept@despammed.com>, 2004. # Yuri Kozlov <kozlov.y@gmail.com>, 2004, 2005, 2006, 2007, 2008. # Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2012, 2015, 2016. -# Aleksej Shilin <rootlexx@mail.ru>, 2017. +# Aleksej Shilin <rootlexx@mail.ru>, 2017, 2018. +# Lev Lamberov <dogsleg@debian.org>, 2018. msgid "" msgstr "" -"Project-Id-Version: apt 1.2.12\n" +"Project-Id-Version: apt 1.6\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2018-02-26 13:14+0100\n" -"PO-Revision-Date: 2017-07-01 16:05+0300\n" +"POT-Creation-Date: 2018-05-14 20:21+0300\n" +"PO-Revision-Date: 2018-05-14 20:24+0300\n" "Last-Translator: Aleksej Shilin <rootlexx@mail.ru>\n" "Language-Team: Russian <debian-l10n-russian@lists.debian.org>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Lokalize 2.0\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: apt-inst/contrib/arfile.cc @@ -61,7 +62,7 @@ msgstr "Повреждённый архив" #: apt-inst/contrib/extracttar.cc msgid "Tar checksum failed, archive corrupted" -msgstr "Неправильная контрольная сумма Tar, архив повреждён" +msgstr "Неправильная контрольная сумма Tar — архив повреждён" #: apt-inst/contrib/extracttar.cc #, c-format @@ -71,16 +72,16 @@ msgstr "Неизвестный заголовок в архиве TAR. Тип %u #: apt-inst/deb/debfile.cc #, c-format msgid "This is not a valid DEB archive, missing '%s' member" -msgstr "Это неправильный DEB-архив — отсутствует составная часть «%s»" +msgstr "Это неправильный DEB-архив: отсутствует составная часть «%s»" #: apt-inst/deb/debfile.cc #, c-format msgid "Internal error, could not locate member %s" -msgstr "Внутренняя ошибка, не удалось найти составную часть %s" +msgstr "Внутренняя ошибка: не удалось найти составную часть %s" #: apt-inst/deb/debfile.cc msgid "Unparsable control file" -msgstr "Не удалось прочесть содержимое control-файла" +msgstr "Не удалось разобрать содержимое файла control" #: apt-inst/dirstream.cc #, c-format @@ -105,16 +106,16 @@ msgstr "Повторная распаковка %s" #: apt-inst/extract.cc #, c-format msgid "The directory %s is diverted" -msgstr "Каталог %s входит в список diverted" +msgstr "Каталог %s входит в список отклоняемых" #: apt-inst/extract.cc #, c-format msgid "The package is trying to write to the diversion target %s/%s" -msgstr "Пакет пытается писать в diversion %s/%s" +msgstr "Пакет пытается писать в отклонённый файл %s/%s" #: apt-inst/extract.cc msgid "The diversion path is too long" -msgstr "Путь diversion слишком длинен" +msgstr "Путь отклонения слишком длинный" #: apt-inst/extract.cc apt-pkg/acquire-item.cc ftparchive/cachedb.cc #: methods/rred.cc @@ -134,11 +135,11 @@ msgstr "Каталог %s был заменён не-каталогом" #: apt-inst/extract.cc msgid "Failed to locate node in its hash bucket" -msgstr "Не удалось разместить узел в хеше" +msgstr "Не удалось найти узел в его хеш-цепочке" #: apt-inst/extract.cc msgid "The path is too long" -msgstr "Путь слишком длинен" +msgstr "Путь слишком длинный" #: apt-inst/extract.cc #, c-format @@ -174,7 +175,7 @@ msgstr "Не удалось найти элемент хеша!" #: apt-inst/filelist.cc msgid "Failed to allocate diversion" -msgstr "Не удалось создать diversion" +msgstr "Не удалось создать отклонение" #: apt-inst/filelist.cc msgid "Internal error in AddDiversion" @@ -183,24 +184,24 @@ msgstr "Внутренняя ошибка в AddDiversion" #: apt-inst/filelist.cc #, c-format msgid "Trying to overwrite a diversion, %s -> %s and %s/%s" -msgstr "Попытка изменения diversion, %s -> %s и %s/%s" +msgstr "Попытка перезаписи отклонения, %s -> %s и %s/%s" #: apt-inst/filelist.cc #, c-format msgid "Double add of diversion %s -> %s" -msgstr "Двойное добавление diversion %s -> %s" +msgstr "Повторное добавление отклонения %s -> %s" #: apt-inst/filelist.cc #, c-format msgid "Duplicate conf file %s/%s" -msgstr "Повторно указан файл настройки %s/%s" +msgstr "Дубликат файла настройки %s/%s" #: apt-pkg/acquire-item.cc msgid "" "Updating from such a repository can't be done securely, and is therefore " "disabled by default." msgstr "" -"Обновление из этого репозитория нельзя выполнить безопасным способом, и " +"Обновление из этого репозитория нельзя выполнить безопасным способом, " "поэтому по умолчанию он отключён." #: apt-pkg/acquire-item.cc @@ -208,16 +209,16 @@ msgid "" "Data from such a repository can't be authenticated and is therefore " "potentially dangerous to use." msgstr "" -"Данные из этого репозитория нельзя аутентифицировать, и поэтому потенциально " -"из небезопасно использовать." +"Данные из этого репозитория не могут быть аутентифицированы, поэтому их " +"использование потенциально небезопасно." #: apt-pkg/acquire-item.cc msgid "" "See apt-secure(8) manpage for repository creation and user configuration " "details." msgstr "" -"Смотрите справочную страницу apt-secure(8) о создании репозитория и " -"настройке пользователя." +"Информацию о создании репозитория и настройке пользователя смотрите в " +"справочной странице apt-secure(8)." #: apt-pkg/acquire-item.cc #, c-format @@ -225,17 +226,17 @@ msgid "The repository '%s' is no longer signed." msgstr "Репозиторий «%s» больше не подписан." #: apt-pkg/acquire-item.cc -#, fuzzy, c-format +#, c-format msgid "The repository '%s' no longer has a Release file." -msgstr "Репозиторий «%s» не содержит файла Release." +msgstr "Репозиторий «%s» больше не содержит файла Release." #: apt-pkg/acquire-item.cc msgid "" "This is normally not allowed, but the option Acquire::" "AllowDowngradeToInsecureRepositories was given to override it." msgstr "" -"Обычно это не разрешается, но указан параметр Acquire::" -"AllowDowngradeToInsecureRepositories для игнорирования." +"Обычно это не разрешается, однако указан параметр Acquire::" +"AllowDowngradeToInsecureRepositories для продолжения." #: apt-pkg/acquire-item.cc #, c-format @@ -248,29 +249,27 @@ msgid "The repository '%s' does not have a Release file." msgstr "Репозиторий «%s» не содержит файла Release." #: apt-pkg/acquire-item.cc -#, fuzzy, c-format +#, c-format msgid "The repository '%s' provides only weak security information." -msgstr "" -"Пропускается получение настроенного файла «s», так как репозиторий «%s» " -"предоставляет только нестойкое шифрование информации" +msgstr "Репозиторий «%s» обеспечивает только слабую защиту информации." #: apt-pkg/acquire-item.cc ftparchive/writer.cc #, c-format msgid "Failed to readlink %s" -msgstr "Не удалось прочесть ссылку %s" +msgstr "Не удалось прочесть значение символьной ссылки %s" #: apt-pkg/acquire-item.cc msgid "Hash Sum mismatch" -msgstr "Хеш сумма не совпадает" +msgstr "Хеш-сумма не совпадает" #: apt-pkg/acquire-item.cc msgid "Insufficient information available to perform this download securely" -msgstr "" +msgstr "Недостаточно информации для безопасной загрузки" #: apt-pkg/acquire-item.cc apt-pkg/contrib/fileutl.cc #, c-format msgid "rename failed, %s (%s -> %s)." -msgstr "переименовать не удалось, %s (%s -> %s)." +msgstr "Ошибка в rename: %s (%s -> %s)." #: apt-pkg/acquire-item.cc msgid "Size mismatch" @@ -291,7 +290,7 @@ msgid "" "Clearsigned file isn't valid, got '%s' (does the network require " "authentication?)" msgstr "" -"Некорректный подписанный файл, получено «%s» (возможно в сети требуется " +"Некорректный подписанный файл: получено «%s» (возможно, в сети требуется " "аутентификация?)" #: apt-pkg/acquire-item.cc @@ -300,7 +299,7 @@ msgid "" "An error occurred during the signature verification. The repository is not " "updated and the previous index files will be used. GPG error: %s: %s" msgstr "" -"Произошла ошибка при проверке подписи. Репозиторий не обновлён и будут " +"Произошла ошибка при проверке подписи. Репозиторий не обновлён, и будут " "использованы предыдущие индексные файлы. Ошибка GPG: %s: %s" #. Invalid signature file, reject (LP: #346386) (Closes: #627642) @@ -310,16 +309,14 @@ msgid "GPG error: %s: %s" msgstr "Ошибка GPG: %s: %s" #: apt-pkg/acquire-item.cc -#, fuzzy, c-format -#| msgid "" -#| "Skipping acquire of configured file '%s' as repository '%s' doesn't " -#| "support architecture '%s'" +#, c-format msgid "" "Skipping acquire of configured file '%s' as repository '%s' doesn't have the " "component '%s' (component misspelt in sources.list?)" msgstr "" -"Пропускается получение настроенного файла «%s», так как репозиторий «%s» не " -"поддерживает архитектуру «%s»" +"Пропускается получение настроенного файла «%s», так как в репозитории «%s» " +"отсутствует компонент «%s» (возможно, компонент указан с ошибкой в sources." +"list?)" #: apt-pkg/acquire-item.cc #, c-format @@ -331,16 +328,13 @@ msgstr "" "поддерживает архитектуру «%s»" #: apt-pkg/acquire-item.cc -#, fuzzy, c-format -#| msgid "" -#| "Skipping acquire of configured file '%s' as repository '%s' doesn't " -#| "support architecture '%s'" +#, c-format msgid "" "Skipping acquire of configured file '%s' as repository '%s' does not seem to " "provide it (sources.list entry misspelt?)" msgstr "" -"Пропускается получение настроенного файла «%s», так как репозиторий «%s» не " -"поддерживает архитектуру «%s»" +"Пропускается получение настроенного файла «%s», так как репозиторий «%s» его " +"не предоставляет (возможно, репозиторий указан с ошибкой в sources.list?)" #: apt-pkg/acquire-item.cc #, c-format @@ -348,8 +342,8 @@ msgid "" "Skipping acquire of configured file '%s' as repository '%s' provides only " "weak security information for it" msgstr "" -"Пропускается получение настроенного файла «%s», так как репозиторий «%s» " -"предоставляет только нестойкое шифрование информации" +"Пропускается получение настроенного файла «%s», так как репозиторий «%s» " +"обеспечивает только слабую защиту информации" #. TRANSLATOR: The first %s is the URL of the bad Release file, the second is #. the time since then the file is invalid - formatted in the same way as in @@ -360,38 +354,36 @@ msgid "" "Release file for %s is expired (invalid since %s). Updates for this " "repository will not be applied." msgstr "" -"Файл Release для %s просрочен (недостоверный начиная с %s). Обновление этого " +"Файл Release для %s просрочен (недостоверный уже %s). Обновление этого " "репозитория производиться не будет." #. TRANSLATOR: The first %s is the URL of the bad Release file, the second is #. the time until the file will be valid - formatted in the same way as in #. the download progress display (e.g. 7d 3h 42min 1s) #: apt-pkg/acquire-item.cc -#, fuzzy, c-format -#| msgid "" -#| "Release file for %s is expired (invalid since %s). Updates for this " -#| "repository will not be applied." +#, c-format msgid "" "Release file for %s is not valid yet (invalid for another %s). Updates for " "this repository will not be applied." msgstr "" -"Файл Release для %s просрочен (недостоверный начиная с %s). Обновление этого " -"репозитория производиться не будет." +"Файл Release для %s пока не действителен (недостоверный ещё %s). Обновление " +"этого репозитория производиться не будет." #: apt-pkg/acquire-item.cc #, c-format msgid "Conflicting distribution: %s (expected %s but got %s)" -msgstr "Конфликт распространения: %s (ожидался %s, но получен %s)" +msgstr "Противоречивый выпуск: %s (ожидался %s, но получен %s)" #: apt-pkg/acquire-item.cc #, c-format msgid "Repository '%s' changed its '%s' value from '%s' to '%s'" -msgstr "" +msgstr "Репозиторий «%s» изменил значение поля «%s» с «%s» на «%s»" #: apt-pkg/acquire-item.cc #, c-format msgid "Repository '%s' changed its default priority for %s from %hi to %hi." msgstr "" +"Репозиторий «%s» изменил свой приоритет по умолчанию для %s с %hi на %hi." #. TRANSLATOR: the "this" refers to changes in the repository like a new release or owner change #: apt-pkg/acquire-item.cc @@ -399,6 +391,8 @@ msgstr "" msgid "" "More information about this can be found online in the Release notes at: %s" msgstr "" +"Дополнительные сведения об этом можно найти в «Информации о выпуске» по " +"адресу: %s" #. TRANSLATOR: %s is the name of the manpage in question, e.g. apt-secure(8) #: apt-pkg/acquire-item.cc @@ -407,6 +401,8 @@ msgid "" "This must be accepted explicitly before updates for this repository can be " "applied. See %s manpage for details." msgstr "" +"Требуется явное подтверждение, прежде чем можно будет обновить данный " +"репозиторий. Дополнительную информацию смотрите в справочной странице %s." #: apt-pkg/acquire-item.cc apt-pkg/update.cc apt-private/private-download.cc #, c-format @@ -420,7 +416,7 @@ msgid "" "to manually fix this package. (due to missing arch)" msgstr "" "Не удалось обнаружить файл пакета %s. Это может означать, что вам придётся " -"вручную исправить этот пакет (возможно, пропущен arch)" +"вручную исправить этот пакет (отсутствует архитектура)." #: apt-pkg/acquire-item.cc #, c-format @@ -431,17 +427,19 @@ msgstr "Невозможно найти источник для загрузки #: apt-pkg/acquire-item.cc #, c-format msgid "Changelog unavailable for %s=%s" -msgstr "Changelog для %s=%s недоступен" +msgstr "Журнал изменений для %s=%s недоступен" #: apt-pkg/acquire-worker.cc #, c-format msgid "The method '%s' is explicitly disabled via configuration." -msgstr "" +msgstr "Метод «%s» явным образом отключён в настройках." #: apt-pkg/acquire-worker.cc methods/connect.cc #, c-format msgid "If you meant to use Tor remember to use %s instead of %s." msgstr "" +"Если вы намеревались использовать Tor, помните, что нужно использовать %s " +"вместо %s." #: apt-pkg/acquire-worker.cc #, c-format @@ -451,12 +449,12 @@ msgstr "Драйвер для метода %s не найден." #: apt-pkg/acquire-worker.cc #, c-format msgid "Is the package %s installed?" -msgstr "Проверьте, установлен ли пакет %s?" +msgstr "Проверьте, установлен ли пакет %s." #: apt-pkg/acquire-worker.cc #, c-format msgid "Method %s did not start correctly" -msgstr "Метод %s запустился не корректно" +msgstr "Метод %s запустился некорректно" #: apt-pkg/acquire-worker.cc #, c-format @@ -467,12 +465,12 @@ msgstr "Вставьте диск с меткой «%s» в устройство #: apt-pkg/acquire.cc apt-pkg/cdrom.cc #, c-format msgid "List directory %s is missing." -msgstr "Каталог списка %s отсутствует." +msgstr "Каталог списков %s отсутствует." #: apt-pkg/acquire.cc #, c-format msgid "Archives directory %s is missing." -msgstr "Архивный каталог %s отсутствует." +msgstr "Каталог архивов %s отсутствует." #: apt-pkg/acquire.cc #, c-format @@ -483,19 +481,16 @@ msgstr "Невозможно заблокировать каталог %s" #, c-format msgid "No sandbox user '%s' on the system, can not drop privileges" msgstr "" -"В системе не пользователя «%s» для песочницы, невозможно сбросить права" +"В системе нет пользователя «%s» для песочницы, невозможно сбросить права" #: apt-pkg/acquire.cc -#, fuzzy, c-format -#| msgid "" -#| "Can't drop privileges for downloading as file '%s' couldn't be accessed " -#| "by user '%s'." +#, c-format msgid "" "Download is performed unsandboxed as root as file '%s' couldn't be accessed " "by user '%s'." msgstr "" -"Невозможно сбросить права для скачивания, так как файл «%s» недоступен для " -"пользователя «%s»." +"Загрузка выполняется от лица суперпользователя без ограничений песочницы, " +"так как файл «%s» недоступен для пользователя «%s»." #: apt-pkg/acquire.cc apt-pkg/clean.cc #, c-format @@ -526,16 +521,18 @@ msgid "" "Error, pkgProblemResolver::Resolve generated breaks, this may be caused by " "held packages." msgstr "" -"Ошибка, pkgProblemResolver::Resolve сгенерировал повреждённые пакеты. Это " -"может быть вызвано отложенными (held) пакетами." +"Ошибка: pkgProblemResolver::Resolve привёл к появлению сломанных пакетов. " +"Это может быть вызвано зафиксированными пакетами." #: apt-pkg/algorithms.cc msgid "Unable to correct problems, you have held broken packages." -msgstr "Невозможно исправить ошибки, у вас отложены (held) битые пакеты." +msgstr "Невозможно исправить ошибки: у вас зафиксированы сломанные пакеты." #: apt-pkg/cachefile.cc msgid "The package lists or status file could not be parsed or opened." -msgstr "Списки пакетов или файл состояния не могут быть открыты или прочитаны." +msgstr "" +"Не удалось открыть либо разобрать содержимое списков пакетов или файла " +"состояния." #: apt-pkg/cachefile.cc msgid "You may want to run apt-get update to correct these problems" @@ -543,12 +540,12 @@ msgstr "Вы можете запустить «apt-get update» для испр #: apt-pkg/cachefile.cc methods/mirror.cc msgid "The list of sources could not be read." -msgstr "Не читается перечень источников." +msgstr "Не удалось прочитать перечень источников." #: apt-pkg/cachefilter.cc apt-private/private-output.cc #, c-format msgid "Regex compilation error - %s" -msgstr "Ошибка компиляции регулярного выражения — %s" +msgstr "Ошибка компиляции регулярного выражения: %s" #: apt-pkg/cacheset.cc #, c-format @@ -568,17 +565,17 @@ msgstr "Не удалось найти задачу «%s»" #: apt-pkg/cacheset.cc #, c-format msgid "Couldn't find any package by regex '%s'" -msgstr "Не удалось найти пакет с помощью regex «%s»" +msgstr "Не удалось найти ни один пакет с помощью регулярного выражения «%s»" #: apt-pkg/cacheset.cc #, c-format msgid "Couldn't find any package by glob '%s'" -msgstr "Не удалось найти пакет с помощью glob «%s»" +msgstr "Не удалось найти ни один пакет с помощью шаблона «%s»" #: apt-pkg/cacheset.cc apt-private/private-show.cc #, c-format msgid "Unable to locate package %s" -msgstr "Не удалось найти пакет %s" +msgstr "Невозможно найти пакет %s" #: apt-pkg/cacheset.cc #, c-format @@ -597,7 +594,7 @@ msgstr "" #, c-format msgid "Can't select candidate version from package %s as it has no candidate" msgstr "" -"Не удалось выбрать самую версию кандидата из пакета %s, так как у него нет " +"Не удалось выбрать версию-кандидата из пакета %s, так как у него нет " "кандидатов" #: apt-pkg/cacheset.cc @@ -613,13 +610,13 @@ msgid "" "Can't select installed nor candidate version from package '%s' as it has " "neither of them" msgstr "" -"Не удалось выбрать ни установленную, ни версию кандидата из пакета «%s», так " +"Не удалось выбрать ни установленную, ни версию-кандидата из пакета «%s», так " "как в нём нет ни той, ни другой" #: apt-pkg/cdrom.cc #, c-format msgid "Line %u too long in source list %s." -msgstr "Строка %u в списке источников %s слишком длинна." +msgstr "Строка %u в списке источников %s слишком длинная." #: apt-pkg/cdrom.cc msgid "Unmounting CD-ROM...\n" @@ -632,7 +629,7 @@ msgstr "Использование %s в качестве точки монти #: apt-pkg/cdrom.cc msgid "Waiting for disc...\n" -msgstr "Ожидание операции работы с диском…\n" +msgstr "Ожидание диска…\n" #: apt-pkg/cdrom.cc msgid "Mounting CD-ROM...\n" @@ -640,16 +637,16 @@ msgstr "Монтирование CD-ROM…\n" #: apt-pkg/cdrom.cc msgid "Identifying... " -msgstr "Идентификация... " +msgstr "Идентификация… " #: apt-pkg/cdrom.cc #, c-format msgid "Stored label: %s\n" -msgstr "Найдена метка: %s \n" +msgstr "Найдена метка: %s\n" #: apt-pkg/cdrom.cc msgid "Scanning disc for index files...\n" -msgstr "Поиск на диске индексных файлов...\n" +msgstr "Поиск индексных файлов на диске…\n" #: apt-pkg/cdrom.cc #, c-format @@ -657,21 +654,21 @@ msgid "" "Found %zu package indexes, %zu source indexes, %zu translation indexes and " "%zu signatures\n" msgstr "" -"Найдено индексов: %zu для пакетов, %zu для источников, %zu для переводов и " -"%zu для сигнатур\n" +"Найдено %zu индексов двоичных пакетов, %zu индексов пакетов с исходным " +"кодом, %zu индексов переводов и %zu подписей\n" #: apt-pkg/cdrom.cc msgid "" "Unable to locate any package files, perhaps this is not a Debian Disc or the " "wrong architecture?" msgstr "" -"Не удалось найти ни одного файла пакетов; возможно это не диск Debian или с " +"Не удалось найти ни одного файла пакетов; возможно, это не диск Debian или с " "не той архитектурой?" #: apt-pkg/cdrom.cc #, c-format msgid "Found label '%s'\n" -msgstr "Найден ярлык «%s»\n" +msgstr "Найдена метка «%s»\n" #: apt-pkg/cdrom.cc msgid "That is not a valid name, try again.\n" @@ -715,7 +712,7 @@ msgstr "Невозможно прочитать атрибуты точки мо #: apt-pkg/contrib/cdromutl.cc msgid "Failed to stat the cdrom" -msgstr "Невозможно получить атрибуты cdrom" +msgstr "Невозможно получить атрибуты CD-ROM" #: apt-pkg/contrib/cmndline.cc #, c-format @@ -737,7 +734,7 @@ msgstr "" #: apt-pkg/contrib/cmndline.cc #, c-format msgid "Command line option %s is not boolean" -msgstr "Параметр командной строки %s — не логический переключатель «да/нет»" +msgstr "Параметр командной строки %s не логического типа" #: apt-pkg/contrib/cmndline.cc #, c-format @@ -782,7 +779,7 @@ msgstr "Синтаксическая ошибка %s:%u: в начале бло #: apt-pkg/contrib/configuration.cc #, c-format msgid "Syntax error %s:%u: Malformed tag" -msgstr "Синтаксическая ошибка %s:%u: искажённый тег" +msgstr "Синтаксическая ошибка %s:%u: неправильный тег" #: apt-pkg/contrib/configuration.cc #, c-format @@ -809,14 +806,14 @@ msgstr "Синтаксическая ошибка %s:%u вызвана include #: apt-pkg/contrib/configuration.cc #, c-format msgid "Syntax error %s:%u: Unsupported directive '%s'" -msgstr "Синтаксическая ошибка %s:%u: не поддерживаемая директива «%s»" +msgstr "Синтаксическая ошибка %s:%u: неподдерживаемая директива «%s»" #: apt-pkg/contrib/configuration.cc #, c-format msgid "Syntax error %s:%u: clear directive requires an option tree as argument" msgstr "" -"Синтаксическая ошибка %s:%u: для директивы clear требуется третий параметр в " -"качестве аргумента" +"Синтаксическая ошибка %s:%u: для директивы clear требуется дерево параметров " +"в качестве аргумента" #: apt-pkg/contrib/configuration.cc #, c-format @@ -850,29 +847,29 @@ msgstr "" #: apt-pkg/contrib/fileutl.cc #, c-format msgid "Could not get lock %s" -msgstr "Не удалось получить доступ к файлу блокировки %s" +msgstr "Не удалось получить файл блокировки %s" #: apt-pkg/contrib/fileutl.cc #, c-format msgid "List of files can't be created as '%s' is not a directory" -msgstr "Список файлов не может быть создан, так как «%s» не является каталогом" +msgstr "Невозможно создать список файлов, так как «%s» не является каталогом" #: apt-pkg/contrib/fileutl.cc #, c-format msgid "Ignoring '%s' in directory '%s' as it is not a regular file" -msgstr "Файл «%s» в каталоге «%s» игнорируется, так как это необычный файл" +msgstr "Игнорируется файл «%s» в каталоге «%s», так как это не обычный файл" #: apt-pkg/contrib/fileutl.cc #, c-format msgid "Ignoring file '%s' in directory '%s' as it has no filename extension" -msgstr "Файл «%s» в каталоге «%s» игнорируется, так как он не имеет расширения" +msgstr "Игнорируется файл «%s» в каталоге «%s», так как он не имеет расширения" #: apt-pkg/contrib/fileutl.cc #, c-format msgid "" "Ignoring file '%s' in directory '%s' as it has an invalid filename extension" msgstr "" -"Файл «%s» в каталоге «%s» игнорируется, так как он не имеет неправильное " +"Игнорируется файл «%s» в каталоге «%s», так как он имеет неправильное " "расширение" #: apt-pkg/contrib/fileutl.cc apt-pkg/contrib/gpgv.cc apt-pkg/deb/debsystem.cc @@ -884,8 +881,7 @@ msgstr "Ожидалось завершение процесса %s, но он #: apt-pkg/contrib/fileutl.cc #, c-format msgid "Sub-process %s received a segmentation fault." -msgstr "" -"Нарушение защиты памяти (segmentation fault) в порождённом процессе %s." +msgstr "В порождённом процессе %s произошла ошибка сегментирования." #: apt-pkg/contrib/fileutl.cc #, c-format @@ -926,7 +922,7 @@ msgstr "Не удалось создать IPC с порождённым про #: apt-pkg/contrib/fileutl.cc msgid "Failed to exec compressor " -msgstr "Не удалось выполнить компрессор " +msgstr "Не удалось выполнить программу сжатия " #: apt-pkg/contrib/fileutl.cc #, c-format @@ -942,12 +938,12 @@ msgstr "Не удалось открыть файловый дескриптор #, c-format msgid "read, still have %llu to read but none left" msgstr "" -"ошибка при чтении; собирались прочесть ещё %llu байт, но ничего больше нет" +"Ошибка чтения: планировалось прочесть ещё %llu байтов, но ничего больше нет" #: apt-pkg/contrib/fileutl.cc #, c-format msgid "write, still have %llu to write but couldn't" -msgstr "ошибка при записи; собирались записать ещё %llu байт, но не смогли" +msgstr "Ошибка записи: планировалось записать ещё %llu байтов, но не удалось" #: apt-pkg/contrib/fileutl.cc #, c-format @@ -980,7 +976,7 @@ msgstr "Невозможно отобразить в память пустой #: apt-pkg/contrib/mmap.cc #, c-format msgid "Couldn't make mmap of %llu bytes" -msgstr "Невозможно отобразить в память %llu байт" +msgstr "Не удалось отобразить в память %llu байтов" #: apt-pkg/contrib/mmap.cc #, c-format @@ -989,16 +985,16 @@ msgstr "Не удалось сделать копию файлового дес #: apt-pkg/contrib/mmap.cc msgid "Unable to close mmap" -msgstr "Не удалось закрыть mmap" +msgstr "Невозможно закрыть отображение в память" #: apt-pkg/contrib/mmap.cc msgid "Unable to synchronize mmap" -msgstr "Не удалось синхронизировать mmap" +msgstr "Невозможно синхронизировать отображение в память" #: apt-pkg/contrib/mmap.cc #, c-format msgid "Couldn't make mmap of %lu bytes" -msgstr "Невозможно отобразить в память %lu байт" +msgstr "Не удалось отобразить в память %lu байтов" #: apt-pkg/contrib/mmap.cc msgid "Failed to truncate file" @@ -1010,8 +1006,8 @@ msgid "" "Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. " "Current value: %lu. (man 5 apt.conf)" msgstr "" -"Не хватает места для Dynamic MMap. Увеличьте значение APT::Cache-Start. " -"Текущее значение: %lu. (man 5 apt.conf)" +"Не хватает места для динамического отображения в память. Увеличьте значение " +"APT::Cache-Start. Текущее значение: %lu. (man 5 apt.conf)" #: apt-pkg/contrib/mmap.cc #, c-format @@ -1019,14 +1015,15 @@ msgid "" "Unable to increase the size of the MMap as the limit of %lu bytes is already " "reached." msgstr "" -"Не удалось увеличить размер MMap, так как уже достигнут предел в %lu байт." +"Невозможно увеличить размер отображения в память, так как уже достигнут " +"предел в %lu байтов." #: apt-pkg/contrib/mmap.cc msgid "" "Unable to increase size of the MMap as automatic growing is disabled by user." msgstr "" -"Не удалось увеличить размер MMap, так как автоматическое увеличение " -"отключено пользователем." +"Невозможно увеличить размер отображения в память, так как автоматическое " +"увеличение отключено пользователем." #: apt-pkg/contrib/progress.cc #, c-format @@ -1083,7 +1080,7 @@ msgstr "Не найдено: %s" #: apt-pkg/deb/debmetaindex.cc #, c-format msgid "Target %s wants to acquire the same file (%s) as %s from source %s" -msgstr "Для цели %s нужно получить такой же файл (%s) как %s из источника %s" +msgstr "Для цели %s нужно получить такой же файл (%s), как %s из источника %s" #. TRANSLATOR: an identifier like Packages; Releasefile key indicating #. a file like main/binary-amd64/Packages; filename and linenumber of @@ -1091,7 +1088,7 @@ msgstr "Для цели %s нужно получить такой же файл #: apt-pkg/deb/debmetaindex.cc #, c-format msgid "Target %s (%s) is configured multiple times in %s and %s" -msgstr "Цель %s (%s) настроена несколько раз в %s и %s" +msgstr "Цель %s (%s) настроена несколько раз: в %s и в %s" #: apt-pkg/deb/debmetaindex.cc #, c-format @@ -1106,7 +1103,7 @@ msgstr "Отсутствуют разделы в файле Release (%s)" #: apt-pkg/deb/debmetaindex.cc #, c-format msgid "No Hash entry in Release file %s" -msgstr "Отсутствуют элементы Hash в файле Release (%s)" +msgstr "Отсутствуют хеш-суммы в файле Release (%s)" #: apt-pkg/deb/debmetaindex.cc #, c-format @@ -1114,13 +1111,13 @@ msgid "" "No Hash entry in Release file %s which is considered strong enough for " "security purposes" msgstr "" -"Отсутствуют элементы Hash в файле Release %s, который считается достаточно " -"стойким, с точки зрения безопасности" +"Отсутствуют хеш-суммы в файле Release (%s), которые считались бы достаточно " +"стойкими с точки зрения безопасности" #: apt-pkg/deb/debmetaindex.cc #, c-format msgid "Invalid '%s' entry in Release file %s" -msgstr "Неправильный элемент «%s» в файле Release %s" +msgstr "Неправильный элемент «%s» в файле Release (%s)" #. TRANSLATOR: The first is an option name from sources.list manpage, the other two URI and Suite #: apt-pkg/deb/debmetaindex.cc @@ -1131,12 +1128,13 @@ msgstr "Указаны конфликтующие значения параме #: apt-pkg/deb/debmetaindex.cc #, c-format msgid "Invalid value set for option %s regarding source %s %s (%s)" -msgstr "Указано некорректное значения параметра %s из источника %s %s (%s)" +msgstr "Указано некорректное значение параметра %s из источника %s %s (%s)" #: apt-pkg/deb/debmetaindex.cc -#, fuzzy, c-format +#, c-format msgid "Conflicting values set for option %s regarding source %s %s: %s != %s" -msgstr "Указаны конфликтующие значения параметра %s из источника %s %s" +msgstr "" +"Указаны конфликтующие значения параметра %s из источника %s %s: %s != %s" #: apt-pkg/deb/debrecords.cc apt-pkg/tagfile.cc #, c-format @@ -1149,14 +1147,14 @@ msgid "" "Unable to lock the administration directory (%s), is another process using " "it?" msgstr "" -"Не удалось выполнить блокировку управляющего каталога (%s); он уже " +"Невозможно выполнить блокировку управляющего каталога (%s); он уже " "используется другим процессом?" #: apt-pkg/deb/debsystem.cc #, c-format msgid "Unable to lock the administration directory (%s), are you root?" msgstr "" -"Не удалось выполнить блокировку управляющего каталога (%s); у вас есть права " +"Невозможно выполнить блокировку управляющего каталога (%s); у вас есть права " "суперпользователя?" #. TRANSLATORS: the %s contains the recovery command, usually @@ -1166,7 +1164,7 @@ msgstr "" msgid "" "dpkg was interrupted, you must manually run '%s' to correct the problem. " msgstr "" -"Работа dpkg прервана, вы должны вручную запустить «%s» для устранения " +"Работа dpkg была прервана, вы должны вручную запустить «%s» для устранения " "проблемы. " #: apt-pkg/deb/debsystem.cc @@ -1270,7 +1268,7 @@ msgstr "Действие прервано до его завершения" #: apt-pkg/deb/dpkgpm.cc msgid "No apport report written because MaxReports is reached already" -msgstr "Отчёты apport не записаны, так достигнут MaxReports" +msgstr "Отчёт apport не записан, так как достигнуто значение MaxReports" #. check if its not a follow up error #: apt-pkg/deb/dpkgpm.cc @@ -1282,15 +1280,15 @@ msgid "" "No apport report written because the error message indicates its a followup " "error from a previous failure." msgstr "" -"Отчёты apport не записаны, так как сообщение об ошибке указывает на " -"повторную ошибку от предыдущего отказа." +"Отчёт apport не записан, так как сообщение об ошибке указывает на повторную " +"ошибку от предыдущего отказа." #: apt-pkg/deb/dpkgpm.cc msgid "" "No apport report written because the error message indicates a disk full " "error" msgstr "" -"Отчёты apport не записаны, так как получено сообщение об ошибке о нехватке " +"Отчёт apport не записан, так как получено сообщение об ошибке о нехватке " "места на диске" #: apt-pkg/deb/dpkgpm.cc @@ -1298,7 +1296,7 @@ msgid "" "No apport report written because the error message indicates a out of memory " "error" msgstr "" -"Отчёты apport не записаны, так как получено сообщение об ошибке о нехватке " +"Отчёт apport не записан, так как получено сообщение об ошибке о нехватке " "памяти" #: apt-pkg/deb/dpkgpm.cc @@ -1306,15 +1304,15 @@ msgid "" "No apport report written because the error message indicates an issue on the " "local system" msgstr "" -"Отчёты apport не записаны, так как получено сообщение о проблеме в локальной " +"Отчёт apport не записан, так как получено сообщение о проблеме в локальной " "системе" #: apt-pkg/deb/dpkgpm.cc msgid "" "No apport report written because the error message indicates a dpkg I/O error" msgstr "" -"Отчёты apport не записаны, так как получено сообщение об ошибке об ошибке " -"ввода-выводы dpkg" +"Отчёт apport не записан, так как получено сообщение об ошибке ввода-вывода " +"dpkg" #: apt-pkg/depcache.cc msgid "Building dependency tree" @@ -1326,7 +1324,7 @@ msgstr "Версии-кандидаты" #: apt-pkg/depcache.cc msgid "Dependency generation" -msgstr "Генерирование зависимостей" +msgstr "Формирование зависимостей" #: apt-pkg/depcache.cc msgid "Reading state information" @@ -1335,12 +1333,12 @@ msgstr "Чтение информации о состоянии" #: apt-pkg/depcache.cc #, c-format msgid "Failed to open StateFile %s" -msgstr "Не удалось открыть StateFile %s" +msgstr "Не удалось открыть файл состояний %s" #: apt-pkg/depcache.cc #, c-format msgid "Failed to write temporary StateFile %s" -msgstr "Не удалось записать временный StateFile %s" +msgstr "Не удалось записать временный файл состояний %s" #: apt-pkg/edsp.cc msgid "Send scenario to solver" @@ -1356,31 +1354,28 @@ msgstr "Подготовка к приёму решения" #: apt-pkg/edsp.cc msgid "External solver failed without a proper error message" -msgstr "Внешний решатель завершился с ошибкой не передав сообщения об ошибке" +msgstr "Внешний решатель завершился с ошибкой, не передав сообщения об ошибке" #: apt-pkg/edsp.cc msgid "Execute external solver" -msgstr "Запустить внешний решатель" +msgstr "Выполнение внешнего решателя" #: apt-pkg/edsp.cc -#, fuzzy msgid "Execute external planner" -msgstr "Запустить внешний решатель" +msgstr "Выполнение внешнего планировщика" #: apt-pkg/edsp.cc -#, fuzzy msgid "Send request to planner" -msgstr "Отправка запроса решателю" +msgstr "Отправка запроса планировщику" #: apt-pkg/edsp.cc -#, fuzzy msgid "Send scenario to planner" -msgstr "Отправка сценария решателю" +msgstr "Отправка сценария планировщику" #: apt-pkg/edsp.cc -#, fuzzy msgid "External planner failed without a proper error message" -msgstr "Внешний решатель завершился с ошибкой не передав сообщения об ошибке" +msgstr "" +"Внешний планировщик завершился с ошибкой, не передав сообщения об ошибке" #: apt-pkg/indexcopy.cc #, c-format @@ -1412,7 +1407,7 @@ msgstr "Не удалось найти аутентификационную за #: apt-pkg/indexcopy.cc #, c-format msgid "Hash mismatch for: %s" -msgstr "Не совпадает хеш сумма для: %s" +msgstr "Не совпадает хеш-сумма для: %s" #: apt-pkg/init.cc #, c-format @@ -1439,8 +1434,8 @@ msgid "" "Could not perform immediate configuration on '%s'. Please see man 5 apt.conf " "under APT::Immediate-Configure for details. (%d)" msgstr "" -"Не удалось выполнить оперативную настройку «%s». Подробней, смотрите в man 5 " -"apt.conf о APT::Immediate-Configure. (%d)" +"Не удалось выполнить оперативную настройку «%s». Подробнее смотрите в man 5 " +"apt.conf об APT::Immediate-Configure. (%d)" #: apt-pkg/packagemanager.cc #, c-format @@ -1455,10 +1450,9 @@ msgid "" "you really want to do it, activate the APT::Force-LoopBreak option." msgstr "" "Вследствие возникновения циклических зависимостей типа Конфликтует/" -"ПредЗависит, для продолжения установки необходимо временно удалить " -"существенно важный пакет %s. Это может привести к фатальным последствиям. " -"Если вы действительно хотите продолжить, установите параметр APT::Force-" -"LoopBreak." +"Предзависит, для продолжения установки необходимо временно удалить пакет " +"первой необходимости %s. Это может привести к фатальным последствиям. Если " +"вы действительно хотите продолжить, установите параметр APT::Force-LoopBreak." #: apt-pkg/pkgcache.cc msgid "Empty package cache" @@ -1470,7 +1464,7 @@ msgstr "Кэш пакетов повреждён" #: apt-pkg/pkgcache.cc msgid "The package cache file is an incompatible version" -msgstr "Не поддерживаемая версия кэша пакетов" +msgstr "Несовместимая версия кэша пакетов" #: apt-pkg/pkgcache.cc #, c-format @@ -1480,11 +1474,11 @@ msgstr "Эта версия APT не поддерживает систему в #: apt-pkg/pkgcache.cc #, c-format msgid "The package cache was built for different architectures: %s vs %s" -msgstr "Кэш пакетов был собран для другой архитектуры: %s и %s" +msgstr "Кэш пакетов был создан для разных архитектур: %s против %s" #: apt-pkg/pkgcache.cc msgid "The package cache file is corrupted, it has the wrong hash" -msgstr "Кэш пакетов повреждён, содержит некорректный хеш" +msgstr "Кэш пакетов повреждён: у него неправильный хеш" #: apt-pkg/pkgcache.cc msgid "Depends" @@ -1492,7 +1486,7 @@ msgstr "Зависит" #: apt-pkg/pkgcache.cc msgid "PreDepends" -msgstr "ПредЗависит" +msgstr "Предзависит" #: apt-pkg/pkgcache.cc msgid "Suggests" @@ -1600,34 +1594,34 @@ msgstr "" #: apt-pkg/policy.cc #, c-format msgid "Invalid record in the preferences file %s, no Package header" -msgstr "Неверная запись в файле параметров %s: отсутствует заголовок Package" +msgstr "Неверная запись в файле предпочтений %s: отсутствует заголовок Package" #: apt-pkg/policy.cc #, c-format msgid "Did not understand pin type %s" -msgstr "Неизвестный тип фиксации %s" +msgstr "Неизвестный тип привязки %s" #: apt-pkg/policy.cc #, c-format msgid "%s: Value %s is outside the range of valid pin priorities (%d to %d)" msgstr "" -"%s: значение %s находится вне диапазона корректных закрепляющих приоритетов " -"(с %d по %d)" +"%s: значение %s находится вне диапазона корректных приоритетов привязки (с " +"%d по %d)" #: apt-pkg/policy.cc msgid "No priority (or zero) specified for pin" -msgstr "Для фиксации не указан приоритет (или указан нулевой)" +msgstr "Для привязки не указан приоритет (или указан нулевой)" #. TRANSLATOR: %u is a line number, the first %s is a filename of a file with the extension "second %s" and the third %s is a unique identifier for bugreports #: apt-pkg/sourcelist.cc #, c-format msgid "Malformed entry %u in %s file %s (%s)" -msgstr "Искажённая запись %u в %s из файла %s (%s)" +msgstr "Некорректная запись в строке %u файла «%s» %s (%s)" #: apt-pkg/sourcelist.cc #, c-format msgid "Malformed line %u in source list %s (type)" -msgstr "Искажённая строка %u в списке источников %s (тип)" +msgstr "Некорректная строка %u в списке источников %s (тип)" #: apt-pkg/sourcelist.cc #, c-format @@ -1637,21 +1631,23 @@ msgstr "Неизвестный тип «%s» в строке %u в списке #: apt-pkg/sourcelist.cc #, c-format msgid "Malformed stanza %u in source list %s (type)" -msgstr "Искажённая строка %u в списке источников %s (тип)" +msgstr "Некорректная запись %u в списке источников %s (тип)" #: apt-pkg/sourcelist.cc #, c-format msgid "Type '%s' is not known on stanza %u in source list %s" -msgstr "Неизвестный тип «%s» в строфе %u в списке источников %s" +msgstr "Неизвестный тип «%s» в записи %u в списке источников %s" #: apt-pkg/sourcelist.cc -#, fuzzy, c-format +#, c-format msgid "Unsupported file %s given on commandline" -msgstr "В командной строке указан не поддерживаемый файл" +msgstr "В командной строке указан неподдерживаемый файл %s" #: apt-pkg/srcrecords.cc msgid "You must put some 'source' URIs in your sources.list" -msgstr "Вы должны заполнить sources.list, поместив туда URI источников пакетов" +msgstr "" +"Вы должны заполнить sources.list, поместив туда URI источников пакетов с " +"исходным кодом" #: apt-pkg/tagfile.cc #, c-format @@ -1663,8 +1659,8 @@ msgid "" "Some index files failed to download. They have been ignored, or old ones " "used instead." msgstr "" -"Некоторые индексные файлы не скачались. Они были проигнорированы или вместо " -"них были использованы старые версии." +"Некоторые индексные файлы скачать не удалось. Они были проигнорированы, или " +"вместо них были использованы старые версии." #: apt-pkg/upgrade.cc msgid "Calculating upgrade" @@ -1695,7 +1691,7 @@ msgstr "Игн:%lu %s" #: apt-private/acqprogress.cc #, c-format msgid "Err:%lu %s" -msgstr "Ошк:%lu %s" +msgstr "Ошб:%lu %s" #: apt-private/acqprogress.cc #, c-format @@ -1722,6 +1718,7 @@ msgid "" "Do you want to accept these changes and continue updating from this " "repository?" msgstr "" +"Вы хотите принять эти изменения и продолжить обновление из этого репозитория?" #: apt-private/private-cachefile.cc msgid "Correcting dependencies..." @@ -1733,7 +1730,7 @@ msgstr " не удалось." #: apt-private/private-cachefile.cc msgid "Unable to correct dependencies" -msgstr "Невозможно скорректировать зависимости" +msgstr "Невозможно исправить зависимости" #: apt-private/private-cachefile.cc msgid "Unable to minimize the upgrade set" @@ -1746,8 +1743,8 @@ msgstr " Готово" #: apt-private/private-cachefile.cc apt-private/private-install.cc msgid "You might want to run 'apt --fix-broken install' to correct these." msgstr "" -"Возможно, для исправления этих ошибок вы захотите воспользоваться «apt-get -" -"f install»." +"Возможно, для исправления этих ошибок вы захотите воспользоваться «apt --fix-" +"broken install»." #: apt-private/private-cachefile.cc apt-private/private-install.cc msgid "" @@ -1755,7 +1752,7 @@ msgid "" "specify a solution)." msgstr "" "Неудовлетворённые зависимости. Попытайтесь выполнить «apt --fix-broken " -"install», не указывая имени пакета, (или найдите другое решение)." +"install», не указывая имени пакета (или указав решение)." #: apt-private/private-cacheset.cc apt-private/private-search.cc msgid "Sorting" @@ -1769,12 +1766,12 @@ msgstr "Заметьте, выбирается «%s» для задачи «%s» #: apt-private/private-cacheset.cc #, c-format msgid "Note, selecting '%s' for glob '%s'\n" -msgstr "Заметьте, выбирается «%s» для glob «%s»\n" +msgstr "Заметьте, выбирается «%s» для шаблона «%s»\n" #: apt-private/private-cacheset.cc #, c-format msgid "Note, selecting '%s' for regex '%s'\n" -msgstr "Заметьте, выбирается «%s» для regex «%s»\n" +msgstr "Заметьте, выбирается «%s» для регулярного выражения «%s»\n" #: apt-private/private-cacheset.cc #, c-format @@ -1787,7 +1784,7 @@ msgstr " [Установлен]" #: apt-private/private-cacheset.cc msgid " [Not candidate version]" -msgstr " [Нет версии-кандидата]" +msgstr " [Не версия-кандидат]" #: apt-private/private-cacheset.cc msgid "You should explicitly select one to install." @@ -1800,9 +1797,9 @@ msgid "" "This may mean that the package is missing, has been obsoleted, or\n" "is only available from another source\n" msgstr "" -"Пакет %s недоступен, но упомянут в списке зависимостей другого пакета.\n" -"Это может означать, что пакет отсутствует, устарел, или доступен из " -"источников, не упомянутых в sources.list\n" +"Пакет %s недоступен, но упомянут в списке зависимостей другого\n" +"пакета. Это может означать, что пакет отсутствует, устарел или\n" +"доступен из источников, не упомянутых в sources.list\n" #: apt-private/private-cacheset.cc msgid "However the following packages replace it:" @@ -1823,7 +1820,7 @@ msgstr "Виртуальные пакеты, подобные «%s», не мо #, c-format msgid "Package '%s' is not installed, so not removed. Did you mean '%s'?\n" msgstr "" -"Пакет «%s» не установлен, поэтому не может быть удалён. Возможно имелся в " +"Пакет «%s» не установлен, поэтому не может быть удалён. Возможно, имелся в " "виду «%s»?\n" #: apt-private/private-cacheset.cc apt-private/private-install.cc @@ -1863,7 +1860,7 @@ msgstr "В APT есть коровья СУПЕРСИЛА." #: apt-private/private-cmndline.cc msgid "This APT helper has Super Meep Powers." -msgstr "В этой программе есть Super Meep Powers." +msgstr "В этой программе есть мышиная СУПЕРСИЛА." #: apt-private/private-cmndline.cc msgid "" @@ -1884,11 +1881,11 @@ msgstr "ВНИМАНИЕ: Следующие пакеты невозможно #: apt-private/private-download.cc msgid "Authentication warning overridden.\n" -msgstr "Предупреждение об аутентификации не принято в внимание.\n" +msgstr "Предупреждение об аутентификации не принято во внимание.\n" #: apt-private/private-download.cc msgid "Some packages could not be authenticated" -msgstr "Некоторые пакеты невозможно аутентифицировать" +msgstr "Некоторые пакеты не удалось аутентифицировать" #: apt-private/private-download.cc msgid "Install these packages without verification?" @@ -1899,8 +1896,8 @@ msgid "" "There were unauthenticated packages and -y was used without --allow-" "unauthenticated" msgstr "" -"Обнаружены неудостоверенные пакеты и был указан параметр -y без --allow-" -"unauthenticated." +"Обнаружены неаутентифицированные пакеты, и был указан параметр -y без --" +"allow-unauthenticated" #: apt-private/private-download.cc #, c-format @@ -1914,7 +1911,7 @@ msgstr "Недостаточно свободного места в %s." #: apt-private/private-download.cc msgid "Unable to lock the download directory" -msgstr "Невозможно заблокировать каталог, куда складываются скачиваемые файлы" +msgstr "Невозможно заблокировать каталог загрузки" #: apt-private/private-install.cc msgid "" @@ -1923,9 +1920,9 @@ msgid "" "distribution that some required packages have not yet been created\n" "or been moved out of Incoming." msgstr "" -"Некоторые пакеты невозможно установить. Возможно, вы просите невозможного,\n" -"или же используете нестабильную версию дистрибутива, где запрошенные вами\n" -"пакеты ещё не созданы или были удалены из Incoming." +"Некоторые пакеты не могут быть установлены. Возможно, то, что вы просите,\n" +"неосуществимо, или же вы используете нестабильную версию дистрибутива, где\n" +"запрошенные вами пакеты ещё не созданы или были удалены из Incoming." #. #. if (Packages == 1) @@ -1939,7 +1936,7 @@ msgstr "" #. #: apt-private/private-install.cc msgid "The following information may help to resolve the situation:" -msgstr "Следующая информация, возможно, поможет вам:" +msgstr "Следующая информация, возможно, вам поможет:" #: apt-private/private-install.cc msgid "Broken packages" @@ -1950,14 +1947,13 @@ msgid "" "Unable to fetch some archives, maybe run apt-get update or try with --fix-" "missing?" msgstr "" -"Невозможно получить некоторые архивы, вероятно надо запустить apt-get update " -"или попытаться повторить запуск с ключом --fix-missing" +"Не удалось получить некоторые архивы; возможно, нужно запустить apt-get " +"update или попытаться повторить запуск с ключом --fix-missing?" #: apt-private/private-install.cc msgid "Internal error, InstallPackages was called with broken packages!" msgstr "" -"Внутренняя ошибка, InstallPackages была вызвана с неработоспособными " -"пакетами!" +"Внутренняя ошибка: InstallPackages была вызвана со сломанными пакетами!" #: apt-private/private-install.cc msgid "Packages need to be removed but remove is disabled." @@ -1968,13 +1964,13 @@ msgid "" "Essential packages were removed and -y was used without --allow-remove-" "essential." msgstr "" -"Удалены пакеты первой необходимости и был указан параметр -y без --allow-" +"Удалены пакеты первой необходимости, и был указан параметр -y без --allow-" "remove-essential." #: apt-private/private-install.cc msgid "Packages were downgraded and -y was used without --allow-downgrades." msgstr "" -"Пакеты заменены на старые версии и был указан параметр -y без --allow-" +"Пакеты заменены на старые версии, и был указан параметр -y без --allow-" "downgrades." #: apt-private/private-install.cc @@ -1982,12 +1978,12 @@ msgid "" "Held packages were changed and -y was used without --allow-change-held-" "packages." msgstr "" -"Были изменены зафиксированные пакеты и был указан параметр -y без --allow-" +"Были изменены зафиксированные пакеты, и был указан параметр -y без --allow-" "change-held-packages." #: apt-private/private-install.cc msgid "Internal error, Ordering didn't finish" -msgstr "Внутренняя ошибка, Ordering не завершилась" +msgstr "Внутренняя ошибка: упорядочение пакетов не завершилось" #: apt-private/private-install.cc msgid "How odd... The sizes didn't match, email apt@packages.debian.org" @@ -2013,7 +2009,7 @@ msgstr "Необходимо скачать %sB архивов.\n" #, c-format msgid "After this operation, %sB of additional disk space will be used.\n" msgstr "" -"После данной операции, объём занятого дискового пространства возрастёт на " +"После данной операции объём занятого дискового пространства возрастёт на " "%sB.\n" #. TRANSLATOR: The required space between number and unit is already included @@ -2022,7 +2018,7 @@ msgstr "" #, c-format msgid "After this operation, %sB disk space will be freed.\n" msgstr "" -"После данной операции, объём занятого дискового пространства уменьшится на " +"После данной операции объём занятого дискового пространства уменьшится на " "%sB.\n" #: apt-private/private-install.cc @@ -2035,7 +2031,7 @@ msgstr "" #. careful with hard to type or special characters (like non-breaking spaces) #: apt-private/private-install.cc msgid "Yes, do as I say!" -msgstr "Да, делать, как я скажу!" +msgstr "Да, делать, как я говорю!" #: apt-private/private-install.cc #, c-format @@ -2045,7 +2041,7 @@ msgid "" " ?] " msgstr "" "То, что вы хотите сделать, может иметь нежелательные последствия.\n" -"Чтобы продолжить, введите фразу: «%s»\n" +"Чтобы продолжить, введите фразу «%s»\n" " ?] " #: apt-private/private-install.cc @@ -2070,7 +2066,7 @@ msgstr "--fix-missing и смена носителя в данный момен #: apt-private/private-install.cc msgid "Unable to correct missing packages." -msgstr "Невозможно исправить ситуацию с пропущенными пакетами." +msgstr "Невозможно исправить отсутствие пакетов." #: apt-private/private-install.cc msgid "Aborting install." @@ -2084,14 +2080,14 @@ msgid_plural "" "The following packages disappeared from your system as\n" "all files have been overwritten by other packages:" msgstr[0] "" -"Следующий пакет исчез из системы, так как все их файлы\n" -"теперь берутся из других пакетов:" +"Следующий пакет исчез из системы, так как все его файлы\n" +"были перезаписаны другими пакетами:" msgstr[1] "" -"Следующие пакеты исчез из системы, так как все их файлы\n" -"теперь берутся из других пакетов:" +"Следующие пакеты исчезли из системы, так как все их файлы\n" +"были перезаписаны другими пакетами:" msgstr[2] "" -"Следующие пакеты исчез из системы, так как все их файлы\n" -"теперь берутся из других пакетов:" +"Следующие пакеты исчезли из системы, так как все их файлы\n" +"были перезаписаны другими пакетами:" #: apt-private/private-install.cc msgid "Note: This is done automatically and on purpose by dpkg." @@ -2099,19 +2095,19 @@ msgstr "Замечание: это сделано автоматически и #: apt-private/private-install.cc msgid "We are not supposed to delete stuff, can't start AutoRemover" -msgstr "Не предполагалось удалять stuff, невозможно запустить AutoRemover" +msgstr "Не разрешено ничего удалять — невозможно запустить AutoRemover" #: apt-private/private-install.cc msgid "" "Hmm, seems like the AutoRemover destroyed something which really\n" "shouldn't happen. Please file a bug report against apt." msgstr "" -"Хм, кажется, что AutoRemover был как-то удалён, чего не должно\n" -"было случиться. Пожалуйста, отправьте сообщение об ошибке в пакете apt." +"Хм, кажется, AutoRemover что-то сломал, чего не должно было\n" +"случиться. Пожалуйста, отправьте сообщение об ошибке в пакете apt." #: apt-private/private-install.cc msgid "Internal Error, AutoRemover broke stuff" -msgstr "Внутренняя ошибка, AutoRemover всё поломал" +msgstr "Внутренняя ошибка: AutoRemover всё поломал" #: apt-private/private-install.cc msgid "" @@ -2132,7 +2128,7 @@ msgid_plural "" "%lu packages were automatically installed and are no longer required.\n" msgstr[0] "%lu пакет был установлен автоматически и больше не требуется.\n" msgstr[1] "%lu пакета было установлено автоматически и больше не требуется.\n" -msgstr[2] "%lu пакетов было установлены автоматически и больше не требуются.\n" +msgstr[2] "%lu пакетов было установлено автоматически и больше не требуется.\n" #: apt-private/private-install.cc #, c-format @@ -2157,18 +2153,17 @@ msgstr "Рекомендуемые пакеты:" #: apt-private/private-install.cc #, c-format msgid "Skipping %s, it is already installed and upgrade is not set.\n" -msgstr "Пропускается %s — пакет уже установлен и нет команды upgrade.\n" +msgstr "Пропускается %s: пакет уже установлен, а параметр upgrade не задан.\n" #: apt-private/private-install.cc #, c-format msgid "Skipping %s, it is not installed and only upgrades are requested.\n" -msgstr "" -"Пропускается %s — пакет не установлен, а запрошено только обновление.\n" +msgstr "Пропускается %s: пакет не установлен, а запрошено только обновление.\n" #: apt-private/private-install.cc #, c-format msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n" -msgstr "Переустановка %s невозможна, он не скачивается.\n" +msgstr "Переустановка %s невозможна: он не может быть загружен.\n" #. TRANSLATORS: First string is package name, second is version #: apt-private/private-install.cc @@ -2179,7 +2174,7 @@ msgstr "Уже установлен пакет %s самой новой верс #: apt-private/private-install.cc cmdline/apt-get.cc cmdline/apt-mark.cc #, c-format msgid "%s set to manually installed.\n" -msgstr "%s установлен вручную.\n" +msgstr "%s помечен как установленный вручную.\n" #: apt-private/private-install.cc #, c-format @@ -2200,9 +2195,9 @@ msgstr "Вывод списка" msgid "There is %i additional version. Please use the '-a' switch to see it" msgid_plural "" "There are %i additional versions. Please use the '-a' switch to see them." -msgstr[0] "Есть %i дополнительная версия. Используйте «-a» для просмотра" -msgstr[1] "Есть %i дополнительные версии. Используйте «-a» для их просмотра" -msgstr[2] "Есть %i дополнительных версий. Используйте «-a» для их просмотра" +msgstr[0] "Есть %i дополнительная версия. Используйте «-a» для просмотра." +msgstr[1] "Есть %i дополнительные версии. Используйте «-a» для их просмотра." +msgstr[2] "Есть %i дополнительных версий. Используйте «-a» для их просмотра." #. TRANSLATORS: placeholder is a binary name like apt or apt-get #: apt-private/private-main.cc @@ -2213,10 +2208,10 @@ msgid "" " Keep also in mind that locking is deactivated,\n" " so don't depend on the relevance to the real current situation!\n" msgstr "" -"ЗАМЕЧАНИЕ: Производить только имитация работы!\n" -" Для реальной работы %s требуются права суперпользователя.\n" -" Учтите, что блокировка не используется,\n" -" поэтому нет полного соответствия с текущей реальной ситуацией!\n" +"ЗАМЕЧАНИЕ: Производится только имитация работы!\n" +" Для реальной работы %s требуются права суперпользователя.\n" +" Учтите, что блокировка не используется, поэтому нет полного\n" +" соответствия с текущей реальной ситуацией!\n" #: apt-private/private-output.cc apt-private/private-show.cc msgid "unknown" @@ -2233,7 +2228,7 @@ msgstr "[установлен, локальный]" #: apt-private/private-output.cc msgid "[installed,auto-removable]" -msgstr "[установлен, удаляется автоматически]" +msgstr "[установлен, может быть удалён автоматически]" #: apt-private/private-output.cc msgid "[installed,automatic]" @@ -2284,32 +2279,31 @@ msgstr " или" #: apt-private/private-output.cc msgid "The following packages have unmet dependencies:" -msgstr "Пакеты, имеющие неудовлетворённые зависимости:" +msgstr "Следующие пакеты имеют неудовлетворённые зависимости:" #: apt-private/private-output.cc msgid "The following NEW packages will be installed:" -msgstr "НОВЫЕ пакеты, которые будут установлены:" +msgstr "Следующие НОВЫЕ пакеты будут установлены:" #: apt-private/private-output.cc msgid "The following packages will be REMOVED:" -msgstr "Пакеты, которые будут УДАЛЕНЫ:" +msgstr "Следующие пакеты будут УДАЛЕНЫ:" #: apt-private/private-output.cc msgid "The following packages have been kept back:" -msgstr "Пакеты, которые будут оставлены в неизменном виде:" +msgstr "Следующие пакеты будут оставлены в неизменном виде:" #: apt-private/private-output.cc msgid "The following packages will be upgraded:" -msgstr "Пакеты, которые будут обновлены:" +msgstr "Следующие пакеты будут обновлены:" #: apt-private/private-output.cc msgid "The following packages will be DOWNGRADED:" -msgstr "Пакеты, которые будут заменены на более СТАРЫЕ версии:" +msgstr "Следующие пакеты будут заменены на СТАРЫЕ версии:" #: apt-private/private-output.cc msgid "The following held packages will be changed:" -msgstr "" -"Пакеты, которые должны были бы остаться без изменений, но будут заменены:" +msgstr "Следующие зафиксированные пакеты будут изменены:" #: apt-private/private-output.cc #, c-format @@ -2321,7 +2315,7 @@ msgid "" "WARNING: The following essential packages will be removed.\n" "This should NOT be done unless you know exactly what you are doing!" msgstr "" -"ВНИМАНИЕ: Эти существенно важные пакеты будут удалены.\n" +"ВНИМАНИЕ: Следующие пакеты первой необходимости будут удалены.\n" "НЕ ДЕЛАЙТЕ этого, если вы НЕ представляете себе все возможные последствия!" #: apt-private/private-output.cc @@ -2337,7 +2331,7 @@ msgstr "переустановлено %lu пакетов, " #: apt-private/private-output.cc #, c-format msgid "%lu downgraded, " -msgstr "%lu пакетов заменены на старые версии, " +msgstr "%lu пакетов заменено на старые версии, " #: apt-private/private-output.cc #, c-format @@ -2377,7 +2371,7 @@ msgstr "Н" #: apt-private/private-search.cc msgid "You must give at least one search pattern" -msgstr "Вы должны задать не менее одно шаблона поиска" +msgstr "Вы должны задать не менее одного шаблона поиска" #: apt-private/private-search.cc msgid "Full Text Search" @@ -2393,9 +2387,9 @@ msgstr "Список пакетов %s рассинхронизирован." msgid "There is %i additional record. Please use the '-a' switch to see it" msgid_plural "" "There are %i additional records. Please use the '-a' switch to see them." -msgstr[0] "Есть %i дополнительная запись. Используйте «-a» для просмотра" -msgstr[1] "Есть %i дополнительные записи. Используйте «-a» для их просмотра" -msgstr[2] "Есть %i дополнительных записей. Используйте «-a» для их просмотра" +msgstr[0] "Есть %i дополнительная запись. Используйте «-a» для просмотра." +msgstr[1] "Есть %i дополнительные записи. Используйте «-a» для их просмотра." +msgstr[2] "Есть %i дополнительных записей. Используйте «-a» для их просмотра." #: apt-private/private-show.cc msgid "not a real package (virtual)" @@ -2412,7 +2406,7 @@ msgstr "Кэш рассинхронизирован, невозможно обн #. Show any packages have explicit pins #: apt-private/private-show.cc msgid "Pinned packages:" -msgstr "Зафиксированные пакеты:" +msgstr "Привязанные пакеты:" #. Print the package name and the version we are forcing to #: apt-private/private-show.cc @@ -2478,7 +2472,8 @@ msgid "" "NOTICE: '%s' packaging is maintained in the '%s' version control system at:\n" "%s\n" msgstr "" -"ВНИМАНИЕ: упаковка «%s» поддерживается в системе контроля версий «%s»:\n" +"ВНИМАНИЕ: работа над пакетом «%s» ведётся в системе управления версиями " +"«%s»:\n" "%s\n" #: apt-private/private-source.cc @@ -2490,12 +2485,12 @@ msgid "" msgstr "" "Используйте:\n" "%s\n" -"для получения последних (возможно не выпущенных) обновлений пакета.\n" +"для получения последних (возможно, невыпущенных) обновлений пакета.\n" #: apt-private/private-source.cc #, c-format msgid "Skipping already downloaded file '%s'\n" -msgstr "Пропускаем уже скачанный файл «%s»\n" +msgstr "Пропускается уже скачанный файл «%s»\n" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement strings, so %sB will be correctly translate in e.g. 1,5 MB @@ -2542,18 +2537,17 @@ msgstr "Команда сборки «%s» завершилась неудачн #: apt-private/private-source.cc #, c-format msgid "Unable to get build-dependency information for %s" -msgstr "Невозможно получить информацию о зависимостях для сборки %s" +msgstr "Невозможно получить информацию о сборочных зависимостях для %s" #: apt-private/private-source.cc #, c-format msgid "%s has no build depends.\n" -msgstr "%s не имеет зависимостей для сборки.\n" +msgstr "%s не имеет сборочных зависимостей.\n" #: apt-private/private-source.cc msgid "Must specify at least one package to check builddeps for" msgstr "" -"Для проверки зависимостей для сборки необходимо указать как минимум один " -"пакет" +"Для проверки сборочных зависимостей необходимо указать как минимум один пакет" #: apt-private/private-source.cc #, c-format @@ -2561,27 +2555,29 @@ msgid "" "No architecture information available for %s. See apt.conf(5) APT::" "Architectures for setup" msgstr "" -"У %s отсутствует информация об архитектуре. Для её настройки смотрите apt." -"conf(5) APT::Architectures" +"Отсутствует информация об архитектуре %s. Для её настройки смотрите apt." +"conf(5) об APT::Architectures" #: apt-private/private-source.cc #, c-format msgid "Note, using directory '%s' to get the build dependencies\n" -msgstr "Заметим, используется каталог «%s» для получения зависимостей сборки\n" +msgstr "" +"Заметьте, используется каталог «%s» для определения сборочных зависимостей\n" #: apt-private/private-source.cc #, c-format msgid "Note, using file '%s' to get the build dependencies\n" -msgstr "Заметим, используется файл «%s» для получения зависимостей сборки\n" +msgstr "" +"Заметьте, используется файл «%s» для определения сборочных зависимостей\n" #: apt-private/private-source.cc msgid "Failed to process build dependencies" -msgstr "Обработка зависимостей для сборки завершилась неудачно" +msgstr "Обработка сборочных зависимостей завершилась неудачно" #: apt-private/private-sources.cc #, c-format msgid "Failed to parse %s. Edit again? " -msgstr "Не удалось разобрать «%s». Повторить редактирование? " +msgstr "Не удалось разобрать содержимое %s. Повторить редактирование? " #: apt-private/private-sources.cc #, c-format @@ -2604,6 +2600,8 @@ msgid "" "Usage of %s should be preferred over embedding login information directly in " "the %s entry for '%s'" msgstr "" +"Использование %s предпочтительнее, чем встраивание данных для входа " +"непосредственно в запись %s для «%s»" #: apt-private/private-update.cc #, c-format @@ -2677,7 +2675,7 @@ msgstr "Всего отношений Описание/Файл: " #: cmdline/apt-cache.cc msgid "Total Provides mappings: " -msgstr "Всего отношений Provides: " +msgstr "Всего отношений Предоставляет: " #: cmdline/apt-cache.cc msgid "Total globbed strings: " @@ -2689,7 +2687,7 @@ msgstr "Пустого места в кэше: " #: cmdline/apt-cache.cc msgid "Total space accounted for: " -msgstr "Полное учтённое пространство: " +msgstr "Всего учтённого места: " #: cmdline/apt-cache.cc msgid "This command is deprecated. Please use 'apt-mark showauto' instead." @@ -2708,18 +2706,21 @@ msgid "" "availability of the configured sources (e.g. offline).\n" msgstr "" "Использование: apt-cache [параметры] команда\n" -" apt-cache [параметры] show пакет1 [пакет2 …]\n" +" apt-cache [параметры] show пакет1 [пакет2 …]\n" "\n" -"apt-cache ищет и выдаёт доступную информацию об установленных\n" -"и неустановленных пакетах. Она работает только с данными локального\n" -"кэша, созданного командой «update» программы apt-get. В следствие\n" -"этого отображаемая информация может устаревшей, если обновление\n" -"долго не выполнялось, но зато apt-cache работает независимо от\n" -"доступности настроенных источников (например, без сети).\n" +"apt-cache ищет и отображает имеющуюся информацию об установленных и " +"доступных\n" +"для установки пакетах. Она работает исключительно с данными локального " +"кэша,\n" +"созданного командой «update», например, программы apt-get. Вследствие этого\n" +"отображаемая информация может являться устаревшей, если обновление долго не\n" +"выполнялось, но зато apt-cache работает независимо от доступности " +"настроенных\n" +"источников (например, без доступа к сети).\n" #: cmdline/apt-cache.cc msgid "Show source records" -msgstr "показать записи об источниках" +msgstr "показать информацию о пакете с исходным кодом" #: cmdline/apt-cache.cc msgid "Search the package list for a regex pattern" @@ -2765,11 +2766,11 @@ msgid "" "See 'man apt-cdrom' for more information about the CD-ROM auto-detection and " "mount point." msgstr "" -"Не удалось автоматически обнаружить CD-ROM и в точке монтирования по " +"Не удалось автоматически обнаружить CD-ROM, и в точке монтирования по " "умолчанию\n" "также ничего нет. Вы можете использовать параметр --cdrom, чтобы указать " "точку\n" -"монтирования CD-ROM. Подробней о точке монтирования и автоматическом\n" +"монтирования CD-ROM. Подробнее о точке монтирования и автоматическом\n" "обнаружении CD-ROM смотрите в «man apt-cdrom»." #: cmdline/apt-cdrom.cc @@ -2786,9 +2787,9 @@ msgid "" msgstr "" "Использование: apt-cdrom [параметры] команда\n" "\n" -"apt-cdrom используется для добавления CDROM, накопителей USB и других\n" +"apt-cdrom используется для добавления CD-ROM, накопителей USB и других\n" "сменных носителей в качестве источников пакетов APT. Точка монтирования и\n" -"информация об устройстве берётся из apt.conf(5), udev(7) и fstab(5).\n" +"информация об устройстве берутся из apt.conf(5), udev(7) и fstab(5).\n" #: cmdline/apt-config.cc msgid "Arguments not in pairs" @@ -2804,12 +2805,12 @@ msgstr "" "Использование: apt-config [параметры] команда\n" "\n" "apt-config — интерфейс к параметрам настройки, используемым\n" -"всеми инструментами APT, в основном, предназначен для отладки и\n" +"всеми инструментами APT, и в основном предназначен для отладки и\n" "использования в сценариях оболочки.\n" #: cmdline/apt-config.cc msgid "get configuration values via shell evaluation" -msgstr "получить значения настройки через вычисления оболочки" +msgstr "получить значения настройки через выполнение кода оболочки" #: cmdline/apt-config.cc msgid "show the active configuration setting" @@ -2822,6 +2823,10 @@ msgid "" "apt-dump-solver is an interface to store an EDSP scenario in\n" "a file and optionally forwards it to another solver.\n" msgstr "" +"Использование: apt-dump-solver\n" +"\n" +"apt-dump-solver — интерфейс для сохранения сценария EDSP\n" +"в файл и, при желании, передачи его другому решателю.\n" #: cmdline/apt-extracttemplates.cc msgid "" @@ -2833,9 +2838,9 @@ msgid "" msgstr "" "Использование: apt-extracttemplates файл1 [файл2 …]\n" "\n" -"apt-extracttemplates извлекает из пакетов Debian файлы config и template.\n" -"В основном, она используется debconf(1) для предложения\n" -"вопросов настройки перед установкой пакетов.\n" +"apt-extracttemplates извлекает из пакетов Debian файлы config\n" +"и template. В основном она используется debconf(1) для вопросов\n" +"настройки перед установкой пакетов.\n" #: cmdline/apt-extracttemplates.cc msgid "Cannot get debconf version. Is debconf installed?" @@ -2849,7 +2854,7 @@ msgstr "Не удалось найти пакет %s" #: cmdline/apt-get.cc cmdline/apt-mark.cc #, c-format msgid "%s set to automatically installed.\n" -msgstr "%s выбран для автоматической установки.\n" +msgstr "%s помечен как установленный автоматически.\n" #: cmdline/apt-get.cc cmdline/apt-mark.cc msgid "" @@ -2861,7 +2866,7 @@ msgstr "" #: cmdline/apt-get.cc msgid "Internal error, problem resolver broke stuff" -msgstr "Внутренняя ошибка, решатель проблем всё поломал" +msgstr "Внутренняя ошибка: решатель проблем всё поломал" #: cmdline/apt-get.cc msgid "Supported modules:" @@ -2882,8 +2887,8 @@ msgstr "" " apt-get [параметры] install|remove пакет1 [пакет2…]\n" " apt-get [параметры] source пакет1 [пакет2…]\n" "\n" -"apt-get — интерфейс командной строки для получения пакетов,\n" -"информации из доверенных источников, а также установки,\n" +"apt-get — интерфейс командной строки для получения пакетов и\n" +"информации о них из доверенных источников, а также установки,\n" "обновления и удаления пакетов вместе с их зависимостями.\n" #: cmdline/apt-get.cc @@ -2897,8 +2902,8 @@ msgstr "выполнить обновление" #: cmdline/apt-get.cc msgid "Install new packages (pkg is libc6 not libc6.deb)" msgstr "" -"установить новые пакеты (на месте пакета указывается имя пакета (libc6, а не " -"имя файла libc6.deb)" +"установить новые пакеты (указывается имя пакета libc6, а не имя файла libc6." +"deb)" #: cmdline/apt-get.cc msgid "Remove packages" @@ -2922,7 +2927,7 @@ msgstr "руководствоваться выбором, сделанным в #: cmdline/apt-get.cc msgid "Configure build-dependencies for source packages" -msgstr "настроить всё необходимое для сборки пакета из исходного кода" +msgstr "настроить сборочные зависимости для пакета с исходным кодом" #: cmdline/apt-get.cc msgid "Erase downloaded archive files" @@ -2934,7 +2939,7 @@ msgstr "удалить старые скачанные файлы архивов #: cmdline/apt-get.cc msgid "Verify that there are no broken dependencies" -msgstr "проверить наличие нарушенных зависимостей" +msgstr "проверить отсутствие нарушенных зависимостей" #: cmdline/apt-get.cc msgid "Download source archives" @@ -2946,7 +2951,7 @@ msgstr "скачать двоичный пакет в текущий катал #: cmdline/apt-get.cc msgid "Download and display the changelog for the given package" -msgstr "скачать и показать файл изменений заданного пакета" +msgstr "скачать и показать журнал изменений заданного пакета" #: cmdline/apt-helper.cc msgid "Need one URL as argument" @@ -2954,7 +2959,7 @@ msgstr "В качестве аргумента требуется URL" #: cmdline/apt-helper.cc msgid "Must specify at least one pair url/filename" -msgstr "Укажите, как минимум, одну пару url/имя файла" +msgstr "Укажите как минимум одну пару url/имя файла" #: cmdline/apt-helper.cc msgid "Download Failed" @@ -2975,11 +2980,12 @@ msgid "" "e.g. the same proxy configuration or acquire system as APT would.\n" msgstr "" "Использование: apt-helper [параметры] команда\n" -" apt-helper [параметры] cat-файл файл …\n" -" apt-helper [параметры] download-file uri target-path\n" +" apt-helper [параметры] cat-file файл …\n" +" apt-helper [параметры] download-file uri target-path\n" "\n" "apt-helper — набор различных команд для сценариев оболочки,\n" -"которые используются для обмена настройками между APT и системой.\n" +"которые используют, например, те же настройки прокси и систему\n" +"получения, что и APT.\n" #: cmdline/apt-helper.cc msgid "download the given uri to the target-path" @@ -2991,22 +2997,21 @@ msgstr "найти запись типа SRV (например, _http._tcp.ftp.d #: cmdline/apt-helper.cc msgid "concatenate files, with automatic decompression" -msgstr "склеить файлы, с автоматическим разжатием" +msgstr "объединить файлы, с автоматическим разжатием" #: cmdline/apt-helper.cc msgid "detect proxy using apt.conf" -msgstr "определять прокси с помощью apt.conf" +msgstr "определить прокси с помощью apt.conf" #: cmdline/apt-helper.cc msgid "wait for system to be online" -msgstr "" +msgstr "подождать, пока система не будет подключена к сети" #: cmdline/apt-helper.cc msgid "drop privileges before running given command" -msgstr "" +msgstr "сбросить привилегии перед выполнением заданной команды" #: cmdline/apt-internal-planner.cc -#, fuzzy msgid "" "Usage: apt-internal-planner\n" "\n" @@ -3014,10 +3019,10 @@ msgid "" "installation planner for the APT family like an external one,\n" "for debugging or the like.\n" msgstr "" -"Использование: apt-internal-solver\n" +"Использование: apt-internal-planner\n" "\n" -"apt-internal-solver — интерфейс к внутреннему решателю, предназначен\n" -"для отладки, подобен интерфейсу внешнего решателя семейства APT.\n" +"apt-internal-planner — интерфейс для использования внутреннего\n" +"планировщика APT как внешнего. Применяется для отладки.\n" #: cmdline/apt-internal-solver.cc msgid "" @@ -3029,13 +3034,13 @@ msgid "" msgstr "" "Использование: apt-internal-solver\n" "\n" -"apt-internal-solver — интерфейс к внутреннему решателю, предназначен\n" -"для отладки, подобен интерфейсу внешнего решателя семейства APT.\n" +"apt-internal-solver — интерфейс для использования внутреннего\n" +"решателя APT как внешнего. Применяется для отладки.\n" #: cmdline/apt-mark.cc #, c-format msgid "%s can not be marked as it is not installed.\n" -msgstr "%s не может быть помечен, так он не установлен.\n" +msgstr "%s не может быть помечен, так как он не установлен.\n" #: cmdline/apt-mark.cc #, c-format @@ -3055,7 +3060,7 @@ msgstr "%s уже помечен как зафиксированный.\n" #: cmdline/apt-mark.cc #, c-format msgid "%s was already not hold.\n" -msgstr "%s уже помечен как не зафиксированный.\n" +msgstr "%s уже помечен как незафиксированный.\n" #: cmdline/apt-mark.cc msgid "Executing dpkg failed. Are you root?" @@ -3098,18 +3103,18 @@ msgid "" msgstr "" "Использование: apt-mark [параметры] {auto|manual} пакет1 [пакет2 …]\n" "\n" -"apt-mark — простая программа с интерфейсом командной строки\n" -"для пометки пакетов, что они установлены вручную или автоматически.\n" -"Также может использоваться для изменения состояния выбора пакетов dpkg(1) и\n" -"показывать списки пакетов с или без определённой метки.\n" +"apt-mark — простая программа с интерфейсом командной строки для\n" +"пометки пакетов как установленных вручную или автоматически. Также\n" +"может использоваться для изменения состояния выбора пакетов dpkg(1)\n" +"и показа списка пакетов с определённой меткой или без неё.\n" #: cmdline/apt-mark.cc msgid "Mark the given packages as automatically installed" -msgstr "пометить указанные пакеты, как установленные автоматически" +msgstr "пометить указанные пакеты как установленные автоматически" #: cmdline/apt-mark.cc msgid "Mark the given packages as manually installed" -msgstr "пометить указанные пакеты, как установленные вручную" +msgstr "пометить указанные пакеты как установленные вручную" #: cmdline/apt-mark.cc msgid "Mark a package as held back" @@ -3125,7 +3130,7 @@ msgstr "вывести список автоматически установл #: cmdline/apt-mark.cc msgid "Print the list of manually installed packages" -msgstr "вывести список пакетов установленных вручную" +msgstr "вывести список пакетов, установленных вручную" #: cmdline/apt-mark.cc msgid "Print the list of package on hold" @@ -3133,7 +3138,7 @@ msgstr "вывести список зафиксированных пакето #: cmdline/apt-sortpkgs.cc msgid "Unknown package record!" -msgstr "Запись о неизвестном пакете!" +msgstr "Неизвестная запись о пакете!" #: cmdline/apt-sortpkgs.cc msgid "" @@ -3145,8 +3150,8 @@ msgid "" msgstr "" "Использование: apt-sortpkgs [параметры] файл1 [файл2 …]\n" "\n" -"apt-sortpkgs — простой инструмент для сортировки информационных файлов\n" -"пакетов. По умолчанию, он сортирует информацию о двоичных пакетах,\n" +"apt-sortpkgs — простой инструмент для сортировки файлов с информацией\n" +"о пакетах. По умолчанию он сортирует информацию о двоичных пакетах,\n" "но можно указать параметр -s, и будет выполняться сортировка пакетов\n" "с исходным кодом.\n" @@ -3162,12 +3167,11 @@ msgid "" msgstr "" "Использование: apt [параметры] команда\n" "\n" -"apt — менеджер пакетов с интерфейсом командной строки, предоставляет " -"команды\n" -"для поиска и управления, а также запросов информации о пакетах.\n" -"Он выполняет те же задачи, что и специализированные инструменты APT,\n" -"например apt-get и apt-cache, но содержит параметры, которые больше\n" -"подходят для интерактивного использования по умолчанию.\n" +"apt — менеджер пакетов с интерфейсом командной строки. Он предоставляет\n" +"команды для поиска и управления, а также запросов информации о пакетах.\n" +"apt выполняет те же задачи, что и специализированные инструменты APT,\n" +"например apt-get и apt-cache, но по умолчанию задействует параметры,\n" +"которые больше подходят для интерактивного использования.\n" #. query #: cmdline/apt.cc @@ -3227,28 +3231,27 @@ msgstr "Во время распаковки возникли ошибки. Па #: dselect/install msgid "will be configured. This may result in duplicate errors" -msgstr "будут настроены. Это может привести к повторению ошибок" +msgstr "" +"будут настроены. Это может привести к повторению ошибок или возникновению" #: dselect/install msgid "or errors caused by missing dependencies. This is OK, only the errors" msgstr "" -"или возникновению новых из-за неудовлетворённых зависимостей. Это нормально, " -"важны" +"новых из-за неудовлетворённых зависимостей. Это нормально, важны только" #: dselect/install msgid "" "above this message are important. Please fix them and run [I]nstall again" msgstr "" -"только ошибки, указанные в этом сообщении. Исправьте их и выполните " -"установку ещё раз" +"ошибки выше данного сообщения. Исправьте их и выполните установку ещё раз" #: dselect/update msgid "Merging available information" -msgstr "Слияние доступной информации" +msgstr "Объединение доступной информации" #: ftparchive/apt-ftparchive.cc msgid "Package extension list is too long" -msgstr "Список расширений, допустимых для пакетов, слишком длинен" +msgstr "Список расширений пакетов слишком длинный" #: ftparchive/apt-ftparchive.cc #, c-format @@ -3257,7 +3260,7 @@ msgstr "Ошибка обработки каталога %s" #: ftparchive/apt-ftparchive.cc msgid "Source extension list is too long" -msgstr "Список расширений источников слишком длинен" +msgstr "Список расширений пакетов с исходным кодом слишком длинный" #: ftparchive/apt-ftparchive.cc msgid "Error writing header to contents file" @@ -3267,7 +3270,7 @@ msgstr "" #: ftparchive/apt-ftparchive.cc #, c-format msgid "Error processing contents %s" -msgstr "ошибка обработки полного перечня содержимого пакетов (Contents) %s" +msgstr "Ошибка обработки полного перечня содержимого пакетов (Contents) %s" #: ftparchive/apt-ftparchive.cc msgid "" @@ -3318,20 +3321,22 @@ msgstr "" " generate config [groups]\n" " clean config\n" "\n" -"apt-ftparchive генерирует индексные файлы архивов Debian. Он поддерживает\n" -"множество стилей генерации: от полностью автоматического до функциональной " -"замены\n" -"программ dpkg-scanpackages и dpkg-scansources\n" +"apt-ftparchive создаёт индексные файлы архивов Debian. Он поддерживает\n" +"множество стилей создания: от полностью автоматического до функциональной\n" +"замены программ dpkg-scanpackages и dpkg-scansources\n" "\n" -"apt-ftparchive генерирует файлы Package (списки пакетов) для дерева\n" -"каталогов, содержащих файлы .deb. Файл Package включает в себя управляющие\n" -"поля каждого пакета, а также хеш MD5 и размер файла. Значения управляющих\n" -"полей «приоритет» (Priority) и «секция» (Section) могут быть изменены с\n" -"помощью файла override.\n" +"apt-ftparchive создаёт файлы Package (списки пакетов) для дерева каталогов,\n" +"содержащих файлы .deb. Файл Package включает в себя управляющие поля " +"каждого\n" +"пакета, а также хеш MD5 и размер файла. Значения управляющих полей " +"«приоритет»\n" +"(Priority) и «секция» (Section) могут быть изменены с помощью файла " +"override.\n" "\n" -"Кроме того, apt-ftparchive может генерировать файлы Sources из дерева\n" -"каталогов, содержащих файлы .dsc. Для указания файла override в этом \n" -"режиме можно использовать параметр --source-override.\n" +"Кроме того, apt-ftparchive может создавать файлы Sources из дерева " +"каталогов,\n" +"содержащих файлы .dsc. Для указания файла override в этом режиме необходимо\n" +"использовать параметр --source-override.\n" "\n" "Команды «packages» и «sources» надо выполнять, находясь в корневом каталоге\n" "дерева, которое вы хотите обработать. BinaryPath должен указывать на место,\n" @@ -3344,16 +3349,16 @@ msgstr "" " dists/potato/main/binary-i386/Packages\n" "\n" "Параметры:\n" -" -h Этот текст\n" -" --md5 Управление генерацией MD5-хешей\n" -" -s=? Указать файл переназначений (override) для источников\n" -" -q Не выводить сообщения в процессе работы\n" -" -d=? Указать кэширующую базу данных (не обязательно)\n" -" --no-delink Включить режим отладки процесса удаления файлов\n" -" --contents Управление генерацией полного перечня содержимого пакетов\n" +" -h этот текст\n" +" --md5 управление созданием MD5-хешей\n" +" -s=? указать файл переназначений (override) для файла Sources\n" +" -q не выводить сообщения в процессе работы\n" +" -d=? указать кэширующую базу данных (необязательно)\n" +" --no-delink включить режим отладки процесса DeLink\n" +" --contents управление созданием полного перечня содержимого пакетов\n" " (файла Contents)\n" -" -c=? Использовать указанный файл настройки\n" -" -o=? Задать значение произвольному параметру настройки" +" -c=? использовать указанный файл настройки\n" +" -o=? задать значение произвольному параметру настройки" #: ftparchive/apt-ftparchive.cc msgid "No selections matched" @@ -3367,25 +3372,25 @@ msgstr "В группе пакетов «%s» отсутствуют некот #: ftparchive/cachedb.cc #, c-format msgid "DB was corrupted, file renamed to %s.old" -msgstr "БД была повреждена, файл переименован в %s.old" +msgstr "База данных повреждена, файл переименован в %s.old" #: ftparchive/cachedb.cc #, c-format msgid "DB is old, attempting to upgrade %s" -msgstr "DB устарела, попытка обновить %s" +msgstr "База данных устарела, попытка обновить %s" #: ftparchive/cachedb.cc msgid "" "DB format is invalid. If you upgraded from an older version of apt, please " "remove and re-create the database." msgstr "" -"Некорректный формат базы данных (DB). Если вы обновляли версию apt, удалите " -"и создайте базу данных заново." +"Некорректный формат базы данных. Если вы обновляли версию apt, то удалите и " +"создайте базу данных заново." #: ftparchive/cachedb.cc #, c-format msgid "Unable to open DB file %s: %s" -msgstr "Не удалось открыть DB файл %s: %s" +msgstr "Невозможно открыть файл базы данных %s: %s" #: ftparchive/cachedb.cc msgid "Failed to read .dsc" @@ -3412,7 +3417,7 @@ msgstr "Неизвестный алгоритм сжатия «%s»" #, c-format msgid "Compressed output %s needs a compression set" msgstr "" -"Для получения сжатого вывода %s необходимо включить использования сжатия" +"Для получения сжатого вывода %s необходимо указать набор алгоритмов сжатия" #: ftparchive/multicompress.cc methods/rsh.cc msgid "Failed to create IPC pipe to subprocess" @@ -3429,7 +3434,7 @@ msgstr "Процесс-потомок, производящий сжатие" #: ftparchive/multicompress.cc #, c-format msgid "Internal error, failed to create %s" -msgstr "Внутренняя ошибка, не удалось создать %s" +msgstr "Внутренняя ошибка: не удалось создать %s" #: ftparchive/multicompress.cc msgid "IO to subprocess/file failed" @@ -3442,7 +3447,7 @@ msgstr "Ошибка чтения во время вычисления MD5" #: ftparchive/override.cc #, c-format msgid "Unable to open %s" -msgstr "Не удалось открыть %s" +msgstr "Невозможно открыть %s" #. skip spaces #. find end of word @@ -3474,12 +3479,12 @@ msgstr "Неправильная запись о переназначении (o #: ftparchive/writer.cc #, c-format msgid "W: Unable to read directory %s\n" -msgstr "W: Не удалось прочитать каталог %s\n" +msgstr "W: Невозможно прочитать каталог %s\n" #: ftparchive/writer.cc #, c-format msgid "W: Unable to stat %s\n" -msgstr "W: Не удалось прочитать атрибуты %s\n" +msgstr "W: Невозможно прочитать атрибуты %s\n" #: ftparchive/writer.cc msgid "E: " @@ -3496,7 +3501,7 @@ msgstr "E: Ошибки относятся к файлу " #: ftparchive/writer.cc #, c-format msgid "Failed to resolve %s" -msgstr "Не удалось проследовать по ссылке %s" +msgstr "Не удалось привести %s к каноническому виду" #: ftparchive/writer.cc msgid "Tree walking failed" @@ -3510,17 +3515,17 @@ msgstr "Не удалось открыть %s" #: ftparchive/writer.cc #, c-format msgid " DeLink %s [%s]\n" -msgstr "DeLink %s [%s]\n" +msgstr " DeLink %s [%s]\n" #: ftparchive/writer.cc #, c-format msgid "*** Failed to link %s to %s" -msgstr "*** Не удалось создать ссылку %s на %s" +msgstr "*** Не удалось создать ссылку %2$s на %1$s" #: ftparchive/writer.cc #, c-format msgid " DeLink limit of %sB hit.\n" -msgstr " Превышен лимит в %sB в DeLink.\n" +msgstr " Превышено ограничение в %sB для DeLink.\n" #: ftparchive/writer.cc msgid "Archive had no package field" @@ -3534,17 +3539,21 @@ msgstr " Нет записи о переназначении (override) для #: ftparchive/writer.cc #, c-format msgid " %s maintainer is %s not %s\n" -msgstr " пакет %s сопровождает %s, а не %s\n" +msgstr " Пакет %s сопровождает %s, а не %s\n" #: ftparchive/writer.cc #, c-format msgid " %s has no source override entry\n" -msgstr " Нет записи source override для %s\n" +msgstr "" +" Нет записи о переназначении пакетов с исходным кодом (source override) для " +"%s\n" #: ftparchive/writer.cc #, c-format msgid " %s has no binary override entry either\n" -msgstr " Нет записи binary override для %s\n" +msgstr "" +" Также нет записи о переназначении двоичных пакетов (binary override) для " +"%s\n" #: methods/basehttp.cc msgid "Waiting for headers" @@ -3552,31 +3561,32 @@ msgstr "Ожидание заголовков" #: methods/basehttp.cc msgid "The HTTP server sent an invalid reply header" -msgstr "Http-сервер послал неверный заголовок" +msgstr "HTTP-сервер послал неверный заголовок" #: methods/basehttp.cc msgid "Bad header line" -msgstr "Неверный заголовок" +msgstr "Неверная строка заголовка" #: methods/basehttp.cc msgid "The HTTP server sent an invalid Content-Length header" -msgstr "Http сервер послал неверный заголовок Content-Length" +msgstr "HTTP-сервер послал неверный заголовок Content-Length" #: methods/basehttp.cc msgid "The HTTP server sent an invalid Content-Range header" -msgstr "Http-сервер послал неверный заголовок Content-Range" +msgstr "HTTP-сервер послал неверный заголовок Content-Range" #: methods/basehttp.cc msgid "This HTTP server has broken range support" -msgstr "Этот HTTP-сервер не поддерживает скачивание фрагментов файлов" +msgstr "" +"Поддержка байтовых диапазонов в данном HTTP-сервере реализована некорректно" #: methods/basehttp.cc msgid "Unknown date format" -msgstr "Неизвестный формат данных" +msgstr "Неизвестный формат даты" #: methods/basehttp.cc msgid "Bad header data" -msgstr "Неверный заголовок данных" +msgstr "Неверные данные заголовка" #: methods/basehttp.cc msgid "Connection failed" @@ -3586,6 +3596,8 @@ msgstr "Соединение разорвано" #, c-format msgid "File has unexpected size (%llu != %llu). Mirror sync in progress?" msgstr "" +"Файл имеет неожиданный размер (%llu != %llu). Возможно, выполняется " +"синхронизация зеркала?" #: methods/basehttp.cc #, c-format @@ -3593,8 +3605,8 @@ msgid "" "Automatically disabled %s due to incorrect response from server/proxy. (man " "5 apt.conf)" msgstr "" -"Автоматическое отключение %s из-за некорректного ответа сервера/прокси (man " -"5 apt.conf)." +"Автоматическое отключение %s из-за некорректного ответа сервера/прокси. (man " +"5 apt.conf)" #: methods/basehttp.cc msgid "Internal error" @@ -3603,24 +3615,24 @@ msgstr "Внутренняя ошибка" #: methods/cdrom.cc #, c-format msgid "Unable to read the cdrom database %s" -msgstr "Невозможно прочесть базу %s с CD" +msgstr "Невозможно прочесть базу данных CD-ROM %s" #: methods/cdrom.cc msgid "" "Please use apt-cdrom to make this CD-ROM recognized by APT. apt-get update " "cannot be used to add new CD-ROMs" msgstr "" -"Пожалуйста, используйте apt-cdrom, чтобы APT смог распознать данный CD. apt-" -"get update не используется для добавления нового CD" +"Используйте apt-cdrom, чтобы APT смог распознать данный CD-ROM. apt-get " +"update не используется для добавления новых CD-ROM" #: methods/cdrom.cc msgid "Wrong CD-ROM" -msgstr "Ошибочный CD" +msgstr "Неверный CD-ROM" #: methods/cdrom.cc #, c-format msgid "Unable to unmount the CD-ROM in %s, it may still be in use." -msgstr "Невозможно размонтировать CD-ROM в %s, возможно он ещё используется." +msgstr "Не удалось размонтировать CD-ROM в %s; возможно, он ещё используется." #: methods/cdrom.cc msgid "Disk not found." @@ -3634,7 +3646,7 @@ msgstr "Файл не найден" #: methods/connect.cc #, c-format msgid "Direct connection to %s domains is blocked by default." -msgstr "" +msgstr "Прямое подключение к домену %s по умолчанию заблокировано." #: methods/connect.cc #, c-format @@ -3642,10 +3654,9 @@ msgid "[IP: %s %s]" msgstr "[IP: %s %s]" #: methods/connect.cc -#, fuzzy, c-format -#| msgid "Connecting to %s (%s)" +#, c-format msgid "Connected to %s (%s)" -msgstr "Соединение с %s (%s)" +msgstr "Соединено с %s (%s)" #: methods/connect.cc methods/http.cc #, c-format @@ -3655,7 +3666,7 @@ msgstr "Соединение с %s (%s)" #: methods/connect.cc #, c-format msgid "Could not create a socket for %s (f=%u t=%u p=%u)" -msgstr "Не удаётся создать сокет для %s (f=%u t=%u p=%u)" +msgstr "Не удалось создать сокет для %s (f=%u t=%u p=%u)" #: methods/connect.cc #, c-format @@ -3669,12 +3680,13 @@ msgstr "Неудачно" #: methods/connect.cc #, c-format msgid "Could not connect to %s:%s (%s)." -msgstr "Не удаётся соединиться с %s:%s (%s)." +msgstr "Не удалось соединиться с %s:%s (%s)." #: methods/connect.cc #, c-format msgid "Could not connect to %s:%s (%s), connection timed out" -msgstr "Не удаётся соединиться с %s:%s (%s), connection timed out" +msgstr "" +"Не удалось соединиться с %s:%s (%s): время ожидания для соединения истекло" #. We say this mainly because the pause here is for the #. ssh connection that is still going @@ -3686,27 +3698,27 @@ msgstr "Соединение с %s" #: methods/connect.cc #, c-format msgid "Could not resolve '%s'" -msgstr "Не удалось найти IP-адрес для «%s»" +msgstr "Не удалось разрешить «%s»" #: methods/connect.cc #, c-format msgid "Temporary failure resolving '%s'" -msgstr "Временная ошибка при попытке получить IP-адрес «%s»" +msgstr "Временная ошибка при разрешении «%s»" #: methods/connect.cc #, c-format msgid "System error resolving '%s:%s'" -msgstr "Системная ошибка при определении «%s:%s»" +msgstr "Системная ошибка при разрешении «%s:%s»" #: methods/connect.cc #, c-format msgid "Something wicked happened resolving '%s:%s' (%i - %s)" -msgstr "Что-то странное произошло при определении «%s:%s» (%i - %s)" +msgstr "Что-то странное произошло при разрешении «%s:%s» (%i - %s)" #: methods/connect.cc #, c-format msgid "Unable to connect to %s:%s:" -msgstr "Невозможно соединиться с %s: %s:" +msgstr "Невозможно соединиться с %s:%s:" #: methods/copy.cc msgid "Failed to stat" @@ -3714,7 +3726,7 @@ msgstr "Не удалось получить атрибуты" #: methods/file.cc msgid "Invalid URI, local URIS must not start with //" -msgstr "Неправильный URI, локальный URI не должен начинаться с //" +msgstr "Неправильный URI: локальный URI не должен начинаться с //" #. Login must be before getpeername otherwise dante won't work. #: methods/ftp.cc @@ -3723,7 +3735,7 @@ msgstr "Вход в систему" #: methods/ftp.cc msgid "Unable to determine the peer name" -msgstr "Невозможно определить имя удалённого сервера" +msgstr "Невозможно определить имя удалённого узла" #: methods/ftp.cc msgid "Unable to determine the local name" @@ -3749,7 +3761,7 @@ msgid "" "A proxy server was specified but no login script, Acquire::ftp::ProxyLogin " "is empty." msgstr "" -"Proxy-сервер указан, однако нет сценария входа в систему, Acquire::ftp::" +"Прокси-сервер указан, однако нет сценария входа в систему: Acquire::ftp::" "ProxyLogin пуст." #: methods/ftp.cc @@ -3787,12 +3799,11 @@ msgstr "Не удалось создать сокет" #: methods/ftp.cc msgid "Could not connect data socket, connection timed out" msgstr "" -"Не удалось присоединиться к сокету данных, время на установление соединения " -"истекло" +"Не удалось присоединить сокет данных: время ожидания для соединения истекло" #: methods/ftp.cc msgid "Could not connect passive socket." -msgstr "Невозможно присоединить пассивный сокет" +msgstr "Не удалось присоединить пассивный сокет" #: methods/ftp.cc msgid "getaddrinfo was unable to get a listening socket" @@ -3800,7 +3811,7 @@ msgstr "Вызов getaddrinfo не смог получить сокет" #: methods/ftp.cc msgid "Could not bind a socket" -msgstr "Невозможно присоединиться к сокету" +msgstr "Не удалось привязать сокет" #: methods/ftp.cc msgid "Could not listen on the socket" @@ -3826,7 +3837,7 @@ msgstr "Команда EPRT не выполнена, сервер сообщил #: methods/ftp.cc msgid "Data socket connect timed out" -msgstr "Время установления соединения для сокета данных истекло" +msgstr "Время на установление соединения для сокета данных истекло" #: methods/ftp.cc msgid "Unable to accept connection" @@ -3843,7 +3854,7 @@ msgstr "Невозможно получить файл, сервер сообщ #: methods/ftp.cc methods/rsh.cc msgid "Data socket timed out" -msgstr "Время ожидания соединения для сокета данных истекло" +msgstr "Время ожидания для сокета данных истекло" #: methods/ftp.cc #, c-format @@ -3865,7 +3876,7 @@ msgstr "Невозможно вызвать " msgid "" "Signed file isn't valid, got '%s' (does the network require authentication?)" msgstr "" -"Подписанный файл некорректен, получено «%s» (возможно в сети требуется " +"Некорректный подписанный файл: получено «%s» (возможно, в сети требуется " "аутентификация?)" #: methods/gpgv.cc @@ -3876,13 +3887,14 @@ msgstr "Найдена как минимум одна неправильная msgid "" "Internal error: Good signature, but could not determine key fingerprint?!" msgstr "" -"Внутренняя ошибка: Правильная подпись, но не удалось определить отпечаток " +"Внутренняя ошибка: правильная подпись, но не удалось определить отпечаток " "ключа?!" #: methods/gpgv.cc msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Не удалось выполнить «apt-key» для проверки подписи (gnupg установлена?)" +"Не удалось выполнить «apt-key» для проверки подписи (программа gnupg " +"установлена?)" #: methods/gpgv.cc msgid "Unknown error executing apt-key" @@ -3896,7 +3908,7 @@ msgstr "При подписи ключом %s используется нест #: methods/gpgv.cc msgid "The following signatures were invalid:\n" -msgstr "Следующие подписи неверные:\n" +msgstr "Следующие подписи неверны:\n" #: methods/gpgv.cc msgid "" @@ -3912,7 +3924,7 @@ msgstr "Ошибка записи в файл" #: methods/http.cc msgid "Error reading from server. Remote end closed connection" -msgstr "Ошибка чтения, удалённый сервер прервал соединение" +msgstr "Ошибка чтения: удалённый сервер прервал соединение" #: methods/http.cc msgid "Error reading from server" diff --git a/test/integration/test-apt-get-autoremove b/test/integration/test-apt-get-autoremove index 6f3452fbd..4dba4f164 100755 --- a/test/integration/test-apt-get-autoremove +++ b/test/integration/test-apt-get-autoremove @@ -9,6 +9,12 @@ configarchitecture 'i386' buildsimplenativepackage 'unrelated' 'all' '1' 'unstable' buildsimplenativepackage 'po-debconf' 'all' '1.0.16' 'unstable' buildsimplenativepackage 'debhelper' 'all' '8.0.0' 'unstable' 'Depends: po-debconf' +buildsimplenativepackage 'base-files' 'all' '10' 'unstable' 'Essential: yes' +buildsimplenativepackage 'fdisk' 'all' '2.30.2' 'unstable' 'XB-Important: yes' +buildsimplenativepackage 'linux-image' 'all' '4.9.80' 'unstable' +buildsimplenativepackage 'hold-me' 'all' '1.0' 'unstable' +buildsimplenativepackage 'remove-me' 'all' '1.0' 'unstable' +buildsimplenativepackage 'system-base' 'all' '1.0' 'unstable' 'Depends: unrelated, base-files, fdisk, linux-image, hold-me, remove-me' setupaptarchive testsuccess aptget install unrelated debhelper -y @@ -158,6 +164,25 @@ testsuccess aptget install debhelper --solver apt -y -o Debug::pkgDepCache::Mark testmarkedauto 'po-debconf' testdpkgstatus 'pi' '1' 'unrelated' +testsuccess aptget install system-base debhelper -y +testdpkginstalled 'debhelper' 'po-debconf' 'system-base' 'base-files' 'fdisk' 'linux-image' 'hold-me' 'remove-me' +testsuccess aptmark hold 'hold-me' +echo 'APT::NeverAutoRemove { "^linux-image$"; };' > rootdir/etc/apt/apt.conf.d/00autoremove +testsuccess aptget remove system-base -y +testsuccess aptget autoremove -y -o Debug::pkgAutoRemove=yes +DEBUGLOG=${TMPWORKINGDIRECTORY}/rootdir/tmp/autoremove.debuglog +cp "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" "$DEBUGLOG" +testsuccess grep -Fx 'Marking: fdisk:i386 2.30.2 (Important)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: base-files:i386 10 (Essential)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: unrelated:i386 1 (Manual-Installed)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: hold-me:i386 1.0 (Hold)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: po-debconf:i386 1.0.16 (Dependency)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: linux-image:i386 4.9.80 (Blacklisted [APT::NeverAutoRemove])' "$DEBUGLOG" +testdpkginstalled 'debhelper' 'po-debconf' 'base-files' 'fdisk' 'linux-image' +testdpkgstatus 'hi' '1' 'hold-me' +testdpkgnotinstalled 'remove-me' +testdpkgstatus 'pi' '1' 'unrelated' + insertinstalledpackage 'bar' 'all' '1' 'Depends: foo-provider' insertinstalledpackage 'foo-multi1-1' 'all' '1' 'Provides: foo-provider Source: foo-multi (1)' diff --git a/test/integration/test-bug-611729-mark-as-manual b/test/integration/test-bug-611729-mark-as-manual index 97ef846e3..63f8245a7 100755 --- a/test/integration/test-bug-611729-mark-as-manual +++ b/test/integration/test-bug-611729-mark-as-manual @@ -56,7 +56,7 @@ testdpkginstalled b c testmarkedauto 'b' sed -i rootdir/var/log/apt/history.log -e '/^Commandline: / d' -e '/^Start-Date: / d' -e '/^End-Date: / d' -if [ -n "$SUDO_USER" ]; then +if [ -n "$SUDO_USER" ] && [ "$(id -u "$SUDO_USER")" -gt 0 ]; then testfileequal 'rootdir/var/log/apt/history.log' " Requested-By: $SUDO_USER ($(id -u "$SUDO_USER")) Reinstall: b:i386 (1.0)" diff --git a/test/integration/test-disappearing-packages b/test/integration/test-disappearing-packages index e8748e6bc..f3fed04f3 100755 --- a/test/integration/test-disappearing-packages +++ b/test/integration/test-disappearing-packages @@ -60,7 +60,7 @@ all files have been overwritten by other packages: Note: This is done automatically and on purpose by dpkg.' tail -n 4 disappear.output sed -i rootdir/var/log/apt/history.log -e '/^Commandline: / d' -e '/^Start-Date: / d' -e '/^End-Date: / d' -e "s#:$(getarchitecture 'native') #:native #" -if [ -n "$SUDO_USER" ]; then +if [ -n "$SUDO_USER" ] && [ "$(id -u "$SUDO_USER")" -gt 0 ]; then testfileequal 'rootdir/var/log/apt/history.log' " Requested-By: $SUDO_USER ($(id -u "$SUDO_USER")) Install: old-pkg:native (1) diff --git a/test/integration/test-partial-file-support b/test/integration/test-partial-file-support index 9b5eed1e5..88fa91324 100755 --- a/test/integration/test-partial-file-support +++ b/test/integration/test-partial-file-support @@ -24,7 +24,7 @@ testdownloadfile() { else msgpass fi - sed -e '/^ <- / s#%20# #g' -e '/^ <- / s#%0a#\n#g' "$DOWNLOADLOG" | grep '^.*-Hash: ' > receivedhashes.log + sed -e '/^ <- / s#%20# #g' -e '/^ <- / s#%0a#\n#g' "$DOWNLOADLOG" | grep '^.*-Hash: ' > receivedhashes.log || true testsuccess test -s receivedhashes.log local HASHES_OK=0 local HASHES_BAD=0 diff --git a/test/integration/test-pdiff-usage b/test/integration/test-pdiff-usage index 5a650ad83..7cda2ee45 100755 --- a/test/integration/test-pdiff-usage +++ b/test/integration/test-pdiff-usage @@ -138,6 +138,8 @@ SHA256-Download: mkdir -p "${BYHASH}" find "${NORMAL}/" -maxdepth 1 -name "Index*" -exec mv '{}' "$BYHASH" \; ln -s "${BYHASH}/Index.gz" "${BYHASH}/$(sha256sum "${BYHASH}/Index.gz" | cut -f1 -d' ')" + echo 'foobar' > "${BYHASH}/$(sha256sum "$PATCHFILE" | cut -f1 -d' ')" + echo 'foobar' > "${BYHASH}/$(sha256sum "${PATCHFILE}.gz" | cut -f1 -d' ')" rm -rf rootdir/var/lib/apt/lists cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists wasmergeused "$@" -o Acquire::By-Hash=force @@ -398,7 +400,8 @@ testcase -o Acquire::IndexTargets::deb::Packages::KeepCompressed=true partialleftovers() { generatepartialleftovers "redirectme_Packages.${LOWCOSTEXT}" "redirectme_Packages-patched.${LOWCOSTEXT}"; } -webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "http://0.0.0.0:${APTHTTPPORT}/" +# redirect the InRelease file only – the other files are auto-redirected by apt +webserverconfig 'aptwebserver::redirect::replace::/redirectme/I' "http://0.0.0.0:${APTHTTPPORT}/I" rewritesourceslist "http://localhost:${APTHTTPPORT}/redirectme" aptautotest_apt_update() { aptautotest_aptget_update "$@" |