diff options
78 files changed, 4068 insertions, 8358 deletions
@@ -0,0 +1,9 @@ + +DDTP problems: +-------------- +- apt-get update clean the /var/lib/apt/lists dir + from all Translation-$index that are not in the current + enviroment or Translations apt variable +- there needs to be a list of locales (pt, sv, en) that need + both language and country code to get the right file + (is in the code in indexfile::LanguageCode(), just a bit ugly diff --git a/README.ddtp b/README.ddtp new file mode 100644 index 000000000..98f6109aa --- /dev/null +++ b/README.ddtp @@ -0,0 +1,74 @@ +TODO: +- URL-Remap for the translation files (to hack around the problem that + they are not on any ftp server yet but only on http://ddtp.debian.org/) + +Here is the original announcement of the ddtp support: + +* To: debian-devel-announce@lists.debian.org +* Subject: Translate files +* From: Michael Bramer <grisu@debian.org> +* Date: Sun, 6 Oct 2002 21:56:06 +0200 +* Mail-followup-to: debian-devel@lists.debian.org +* Message-id: <20021006195605.GA30516@home.debsupport.de> +* Old-return-path: <michael@home.debsupport.de> +* User-agent: Mutt/1.3.28i + +Hello all + +After some discussion between Anthony Towns (a ftpmaster), Jason +Gunthorpe (APT Developer) and some DDTP Coordinators we find a way to +transfer the translated package descriptions from the archive to the +user. + +The translated descriptions need to be downloadable befor any +installation process, like the other package meta information. We +choose a new file per languages with all translated package +descriptions. The package system can download one or more of this +files at 'apt-get update' time and know the translations. + +The new files are names 'Translate-$lang' and the file have this +rfc822-format: + Package: <package-name> + Description-md5: <the md5 checksum of the english description> + Description-$lang.$encoding: <translated headline> + <translated section> + +The encoding of the Description is 'UTF-8' in all languages normal. +The files will be located at 'debian/dists/sid/main/i18n/' on the ftp +server (for all architecture). In addition of the plain +'Translate-$lang' file, there will be a 'gz' and a 'bz2' version and +in future also the new incremental format version. + +The <the md5 checksum of the english description> is the md5 checksum +of the full english description, without the 'Description: '-tag and +with all spaces and newlines. Look at this example: + Description: XXX + YYY + . + ZZZ +is md5("XXX\n YYY\n .\n ZZZ\n") (perl-syntax). + + +A future APT version will download one or some 'Translate-$lang' +file(s) at 'update'-time. After this download it show a translated +description instead of the english form, if it found a translated +description of the package with the right md5 chechsum. The enviroment +of the user will controlled this process (LANG, LANGUAGE, LC_MESSAGES, +etc). With this the package system will never show a outdated +translation. + +The translations come all from the DDTP. A daily process on +ddtp.debian.org make new 'Translated-$lang' files and a script on +ftp-master request this files and move this to the debian archive. +Now the first files are accessable at + <a href="http://ddtp.debian.org/pdesc/translatefiles/">http://ddtp.debian.org/pdesc/translatefiles/</a> + +If you found wrong translations, please read the guides on +ddtp.debian.org, make a better translation and send this per mail to +the DDTP server. Don't bug the package maintainer! + +Thanks +Grisu +-- +Michael Bramer - a Debian Linux Developer <a href="http://www.debsupport.de">http://www.debsupport.de</a> +PGP: finger grisu@db.debian.org -- Linux Sysadmin -- Use Debian Linux diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index f566b16b8..04f0bb943 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -63,6 +63,7 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { Status = StatIdle; ErrorText = LookupTag(Message,"Message"); + UsedMirror = LookupTag(Message,"UsedMirror"); if (QueueCounter <= 1) { /* This indicates that the file is not available right now but might @@ -75,10 +76,17 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) Dequeue(); return; } - + Status = StatError; Dequeue(); } + + // report mirror failure back to LP if we actually use a mirror + string FailReason = LookupTag(Message, "FailReason"); + if(FailReason.size() != 0) + ReportMirrorFailure(FailReason); + else + ReportMirrorFailure(ErrorText); } /*}}}*/ // Acquire::Item::Start - Item has begun to download /*{{{*/ @@ -100,6 +108,7 @@ void pkgAcquire::Item::Done(string Message,unsigned long Size,string, { // We just downloaded something.. string FileName = LookupTag(Message,"Filename"); + UsedMirror = LookupTag(Message,"UsedMirror"); if (Complete == false && FileName == DestFile) { if (Owner->Log != 0) @@ -108,7 +117,6 @@ void pkgAcquire::Item::Done(string Message,unsigned long Size,string, if (FileSize == 0) FileSize= Size; - Status = StatDone; ErrorText = string(); Owner->Dequeue(this); @@ -131,6 +139,49 @@ void pkgAcquire::Item::Rename(string From,string To) } /*}}}*/ +void pkgAcquire::Item::ReportMirrorFailure(string FailCode) +{ + // we only act if a mirror was used at all + if(UsedMirror.empty()) + return; +#if 0 + std::cerr << "\nReportMirrorFailure: " + << UsedMirror + << " Uri: " << DescURI() + << " FailCode: " + << FailCode << std::endl; +#endif + const char *Args[40]; + unsigned int i = 0; + string report = _config->Find("Methods::Mirror::ProblemReporting", + "/usr/lib/apt/apt-report-mirror-failure"); + if(!FileExists(report)) + return; + Args[i++] = report.c_str(); + Args[i++] = UsedMirror.c_str(); + Args[i++] = DescURI().c_str(); + Args[i++] = FailCode.c_str(); + Args[i++] = NULL; + pid_t pid = ExecFork(); + if(pid < 0) + { + _error->Error("ReportMirrorFailure Fork failed"); + return; + } + else if(pid == 0) + { + execvp(Args[0], (char**)Args); + std::cerr << "Could not exec " << Args[0] << std::endl; + _exit(100); + } + if(!ExecWait(pid, "report-mirror-failure")) + { + _error->Warning("Couldn't report problem to '%s'", + _config->Find("Methods::Mirror::ProblemReporting").c_str()); + } +} + + // AcqIndex::AcqIndex - Constructor /*{{{*/ // --------------------------------------------------------------------- /* The package file is added to the queue and a second class is @@ -176,7 +227,6 @@ string pkgAcqIndex::Custom600Headers() struct stat Buf; if (stat(Final.c_str(),&Buf) != 0) return "\nIndex-File: true"; - return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); } /*}}}*/ @@ -242,6 +292,7 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5, Status = StatAuthError; ErrorText = _("MD5Sum mismatch"); Rename(DestFile,DestFile + ".FAILED"); + ReportMirrorFailure("HashChecksumFailure"); return; } // Done, move it into position @@ -315,6 +366,35 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5, Mode = decompProg; } +// AcqIndexTrans::pkgAcqIndexTrans - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* The Translation file is added to the queue */ +pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, + string URI,string URIDesc,string ShortDesc) : + pkgAcqIndex(Owner, URI, URIDesc, ShortDesc, "", "") +{ +} + + /*}}}*/ +// AcqIndexTrans::Failed - Silence failure messages for missing files /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqIndexTrans::Failed(string Message,pkgAcquire::MethodConfig *Cnf) +{ + if (Cnf->LocalOnly == true || + StringToBool(LookupTag(Message,"Transient-Failure"),false) == false) + { + // Ignore this + Status = StatDone; + Complete = false; + Dequeue(); + return; + } + + Item::Failed(Message,Cnf); +} + /*}}}*/ + pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner, string URI,string URIDesc,string ShortDesc, string MetaIndexURI, string MetaIndexURIDesc, @@ -328,8 +408,9 @@ pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner, DestFile = _config->FindDir("Dir::State::lists") + "partial/"; DestFile += URItoFileName(URI); - // remove any partial downloaded sig-file. it may confuse proxies - // and is too small to warrant a partial download anyway + // remove any partial downloaded sig-file in partial/. + // it may confuse proxies and is too small to warrant a + // partial download anyway unlink(DestFile.c_str()); // Create the item @@ -396,17 +477,22 @@ void pkgAcqMetaSig::Done(string Message,unsigned long Size,string MD5, /*}}}*/ void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { + string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); // if we get a network error we fail gracefully - if(LookupTag(Message,"FailReason") == "Timeout" || - LookupTag(Message,"FailReason") == "TmpResolveFailure" || - LookupTag(Message,"FailReason") == "ConnectionRefused") { + if(Status == StatTransientNetworkError) + { Item::Failed(Message,Cnf); + // move the sigfile back on network failures (and re-authenticated?) + if(FileExists(DestFile)) + Rename(DestFile,Final); + + // set the status back to , Item::Failed likes to reset it + Status = pkgAcquire::Item::StatTransientNetworkError; return; } // Delete any existing sigfile when the acquire failed - string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); unlink(Final.c_str()); // queue a pkgAcqMetaIndex with no sigfile @@ -729,6 +815,7 @@ void pkgAcqMetaIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) } // gpgv method failed + ReportMirrorFailure("GPGFailure"); _error->Warning("GPG error: %s: %s", Desc.Description.c_str(), LookupTag(Message,"Message").c_str()); diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index da1bea801..f659bb459 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -9,8 +9,8 @@ the Owner Acquire class. Derived classes will then call QueueURI to register all the URI's they wish to fetch at the initial moment. - Two item classes are provided to provide functionality for downloading - of Index files and downloading of Packages. + Three item classes are provided to provide functionality for + downloading of Index, Translation and Packages files. A Archive class is provided for downloading .deb files. It does Md5 checking and source location as well as a retry algorithm. @@ -48,7 +48,8 @@ class pkgAcquire::Item public: // State of the item - enum {StatIdle, StatFetching, StatDone, StatError, StatAuthError} Status; + enum {StatIdle, StatFetching, StatDone, StatError, + StatAuthError, StatTransientNetworkError} Status; string ErrorText; unsigned long FileSize; unsigned long PartialSize; @@ -56,6 +57,7 @@ class pkgAcquire::Item unsigned long ID; bool Complete; bool Local; + string UsedMirror; // Number of queues we are inserted into unsigned int QueueCounter; @@ -78,6 +80,9 @@ class pkgAcquire::Item pkgAcquire *GetOwner() {return Owner;}; virtual bool IsTrusted() {return false;}; + // report mirror problems + void ReportMirrorFailure(string FailCode); + Item(pkgAcquire *Owner); virtual ~Item(); }; @@ -107,6 +112,16 @@ class pkgAcqIndex : public pkgAcquire::Item string ShortDesct, string ExpectedMD5, string compressExt=""); }; +// Item class for translated package index files +class pkgAcqIndexTrans : public pkgAcqIndex +{ + public: + + virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf); + pkgAcqIndexTrans(pkgAcquire *Owner,string URI,string URIDesc, + string ShortDesct); +}; + struct IndexTarget { string URI; diff --git a/apt-pkg/acquire-method.cc b/apt-pkg/acquire-method.cc index 41b832f3b..180b52ad7 100644 --- a/apt-pkg/acquire-method.cc +++ b/apt-pkg/acquire-method.cc @@ -99,12 +99,11 @@ void pkgAcqMethod::Fail(string Err,bool Transient) } char S[1024]; + char *End = S; if (Queue != 0) { - snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: %s\n" - "Message: %s %s\n",Queue->Uri.c_str(),Err.c_str(), - FailExtra.c_str()); - + End += snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: %s\n" + "Message: %s %s\n",Queue->Uri.c_str(), Err.c_str(), IP.c_str()); // Dequeue FetchItem *Tmp = Queue; Queue = Queue->Next; @@ -113,10 +112,14 @@ void pkgAcqMethod::Fail(string Err,bool Transient) QueueBack = Queue; } else - snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: <UNKNOWN>\n" - "Message: %s %s\n",Err.c_str(), - FailExtra.c_str()); - + { + End += snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: <UNKNOWN>\n" + "Message: %s\n",Err.c_str()); + } + if(FailReason.empty() == false) + End += snprintf(End,sizeof(S)-50 - (End - S),"FailReason: %s\n",FailReason.c_str()); + if (UsedMirror.empty() == false) + End += snprintf(End,sizeof(S)-50 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str()); // Set the transient flag if (Transient == true) strcat(S,"Transient-Failure: true\n\n"); @@ -182,6 +185,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt) End += snprintf(End,sizeof(S)-50 - (End - S),"MD5-Hash: %s\n",Res.MD5Sum.c_str()); if (Res.SHA1Sum.empty() == false) End += snprintf(End,sizeof(S)-50 - (End - S),"SHA1-Hash: %s\n",Res.SHA1Sum.c_str()); + if (UsedMirror.empty() == false) + End += snprintf(End,sizeof(S)-50 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str()); if (Res.GPGVOutput.size() > 0) End += snprintf(End,sizeof(S)-50 - (End - S),"GPGVOutput:\n"); for (vector<string>::iterator I = Res.GPGVOutput.begin(); diff --git a/apt-pkg/acquire-method.h b/apt-pkg/acquire-method.h index f46209d12..20691cc2c 100644 --- a/apt-pkg/acquire-method.h +++ b/apt-pkg/acquire-method.h @@ -54,7 +54,9 @@ class pkgAcqMethod vector<string> Messages; FetchItem *Queue; FetchItem *QueueBack; - string FailExtra; + string FailReason; + string UsedMirror; + string IP; // Handlers for messages virtual bool Configuration(string Message); @@ -63,14 +65,14 @@ class pkgAcqMethod // Outgoing messages void Fail(bool Transient = false); inline void Fail(const char *Why, bool Transient = false) {Fail(string(Why),Transient);}; - void Fail(string Why, bool Transient = false); - void URIStart(FetchResult &Res); - void URIDone(FetchResult &Res,FetchResult *Alt = 0); + virtual void Fail(string Why, bool Transient = false); + virtual void URIStart(FetchResult &Res); + virtual void URIDone(FetchResult &Res,FetchResult *Alt = 0); + bool MediaFail(string Required,string Drive); virtual void Exit() {}; public: - enum CnfFlags {SingleInstance = (1<<0), Pipeline = (1<<1), SendConfig = (1<<2), LocalOnly = (1<<3), NeedsCleanup = (1<<4), @@ -80,7 +82,8 @@ class pkgAcqMethod void Status(const char *Format,...); int Run(bool Single = false); - inline void SetFailExtraMsg(string Msg) {FailExtra = Msg;}; + inline void SetFailReason(string Msg) {FailReason = Msg;}; + inline void SetIP(string aIP) {IP = aIP;}; pkgAcqMethod(const char *Ver,unsigned long Flags = 0); virtual ~pkgAcqMethod() {}; diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index d06024178..8ab67778b 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -307,6 +307,13 @@ bool pkgAcquire::Worker::RunMessages() pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; OwnerQ->ItemDone(Itm); + + // set some status + if(LookupTag(Message,"FailReason") == "Timeout" || + LookupTag(Message,"FailReason") == "TmpResolveFailure" || + LookupTag(Message,"FailReason") == "ConnectionRefused") + Owner->Status = pkgAcquire::Item::StatTransientNetworkError; + Owner->Failed(Message,Config); ItemDone(); diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index 5fa16e66f..bd8147291 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -20,10 +20,12 @@ #include <apt-pkg/algorithms.h> #include <apt-pkg/error.h> #include <apt-pkg/configuration.h> +#include <apt-pkg/version.h> #include <apt-pkg/sptr.h> + #include <apti18n.h> - +#include <sys/types.h> #include <iostream> /*}}}*/ using namespace std; @@ -100,6 +102,7 @@ bool pkgSimulate::Install(PkgIterator iPkg,string /*File*/) DepIterator End; D.GlobOr(Start,End); if (Start->Type == pkgCache::Dep::Conflicts || + Start->Type == pkgCache::Dep::DpkgBreaks || Start->Type == pkgCache::Dep::Obsoletes || End->Type == pkgCache::Dep::PreDepends) { @@ -149,6 +152,8 @@ bool pkgSimulate::Configure(PkgIterator iPkg) cout << " Obsoletes:" << D.TargetPkg().Name(); else if (D->Type == pkgCache::Dep::Conflicts) cout << " Conflicts:" << D.TargetPkg().Name(); + else if (D->Type == pkgCache::Dep::DpkgBreaks) + cout << " Breaks:" << D.TargetPkg().Name(); else cout << " Depends:" << D.TargetPkg().Name(); } @@ -220,6 +225,8 @@ void pkgSimulate::ShortBreaks() the necessary calculations to deal with the problems. */ bool pkgApplyStatus(pkgDepCache &Cache) { + pkgDepCache::ActionGroup group(Cache); + for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) { if (I->VersionList == 0) @@ -230,13 +237,13 @@ bool pkgApplyStatus(pkgDepCache &Cache) I->InstState == pkgCache::State::HoldReInstReq) { if (I->CurrentVer != 0 && I.CurrentVer().Downloadable() == true) - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); else { // Is this right? Will dpkg choke on an upgrade? if (Cache[I].CandidateVer != 0 && Cache[I].CandidateVerIter(Cache).Downloadable() == true) - Cache.MarkInstall(I); + Cache.MarkInstall(I, false, 0, false); else return _error->Error(_("The package %s needs to be reinstalled, " "but I can't find an archive for it."),I.Name()); @@ -253,12 +260,12 @@ bool pkgApplyStatus(pkgDepCache &Cache) case pkgCache::State::HalfConfigured: if ((I->CurrentVer != 0 && I.CurrentVer().Downloadable() == true) || I.State() != pkgCache::PkgIterator::NeedsUnpack) - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); else { if (Cache[I].CandidateVer != 0 && Cache[I].CandidateVerIter(Cache).Downloadable() == true) - Cache.MarkInstall(I); + Cache.MarkInstall(I, true, 0, false); else Cache.MarkDelete(I); } @@ -284,10 +291,12 @@ bool pkgApplyStatus(pkgDepCache &Cache) on the result. */ bool pkgFixBroken(pkgDepCache &Cache) { + pkgDepCache::ActionGroup group(Cache); + // Auto upgrade all broken packages for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) if (Cache[I].NowBroken() == true) - Cache.MarkInstall(I,true); + Cache.MarkInstall(I, true, 0, false); /* Fix packages that are in a NeedArchive state but don't have a downloadable install version */ @@ -300,7 +309,7 @@ bool pkgFixBroken(pkgDepCache &Cache) if (Cache[I].InstVerIter(Cache).Downloadable() == false) continue; - Cache.MarkInstall(I,true); + Cache.MarkInstall(I, true, 0, false); } pkgProblemResolver Fix(&Cache); @@ -317,23 +326,25 @@ bool pkgFixBroken(pkgDepCache &Cache) */ bool pkgDistUpgrade(pkgDepCache &Cache) { + pkgDepCache::ActionGroup group(Cache); + /* Auto upgrade all installed packages, this provides the basis for the installation */ for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) if (I->CurrentVer != 0) - Cache.MarkInstall(I,true); + Cache.MarkInstall(I, true, 0, false); /* Now, auto upgrade all essential packages - this ensures that the essential packages are present and working */ for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) - Cache.MarkInstall(I,true); + Cache.MarkInstall(I, true, 0, false); /* We do it again over all previously installed packages to force conflict resolution on them all. */ for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) if (I->CurrentVer != 0) - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); pkgProblemResolver Fix(&Cache); @@ -345,7 +356,7 @@ bool pkgDistUpgrade(pkgDepCache &Cache) if (I->SelectedState == pkgCache::State::Hold) { Fix.Protect(I); - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); } } } @@ -360,6 +371,8 @@ bool pkgDistUpgrade(pkgDepCache &Cache) to install packages not marked for install */ bool pkgAllUpgrade(pkgDepCache &Cache) { + pkgDepCache::ActionGroup group(Cache); + pkgProblemResolver Fix(&Cache); if (Cache.BrokenCount() != 0) @@ -376,7 +389,7 @@ bool pkgAllUpgrade(pkgDepCache &Cache) continue; if (I->CurrentVer != 0 && Cache[I].InstallVer != 0) - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); } return Fix.ResolveByKeep(); @@ -389,6 +402,8 @@ bool pkgAllUpgrade(pkgDepCache &Cache) the package is restored. */ bool pkgMinimizeUpgrade(pkgDepCache &Cache) { + pkgDepCache::ActionGroup group(Cache); + if (Cache.BrokenCount() != 0) return false; @@ -405,9 +420,9 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache) continue; // Keep it and see if that is OK - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); if (Cache.BrokenCount() != 0) - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); else { // If keep didnt actually do anything then there was no change.. @@ -567,6 +582,8 @@ void pkgProblemResolver::MakeScores() installable */ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) { + pkgDepCache::ActionGroup group(Cache); + if ((Flags[Pkg->ID] & Upgradable) == 0 || Cache[Pkg].Upgradable() == false) return false; if ((Flags[Pkg->ID] & Protected) == Protected) @@ -575,7 +592,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) Flags[Pkg->ID] &= ~Upgradable; bool WasKept = Cache[Pkg].Keep(); - Cache.MarkInstall(Pkg,false); + Cache.MarkInstall(Pkg, false, 0, false); // This must be a virtual package or something like that. if (Cache[Pkg].InstVerIter(Cache).end() == true) @@ -639,6 +656,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) /* We let the algorithm deal with conflicts on its next iteration, it is much smarter than us */ if (Start->Type == pkgCache::Dep::Conflicts || + Start->Type == pkgCache::Dep::DpkgBreaks || Start->Type == pkgCache::Dep::Obsoletes) break; @@ -660,7 +678,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) if (Fail == true) { if (WasKept == true) - Cache.MarkKeep(Pkg); + Cache.MarkKeep(Pkg, false, false); else Cache.MarkDelete(Pkg); return false; @@ -687,6 +705,8 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) upgrade packages to advoid problems. */ bool pkgProblemResolver::Resolve(bool BrokenFix) { + pkgDepCache::ActionGroup group(Cache); + unsigned long Size = Cache.Head().PackageCount; // Record which packages are marked for install @@ -702,7 +722,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) { if (Cache[I].InstBroken() == true && BrokenFix == true) { - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); if (Cache[I].Install() == true) Again = true; } @@ -768,14 +788,14 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) pkgCache::Version *OldVer = Cache[I].InstallVer; Flags[I->ID] &= ReInstateTried; - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); if (Cache[I].InstBroken() == true || OldBreaks < Cache.BrokenCount()) { if (OldVer == 0) Cache.MarkDelete(I); else - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); } else if (Debug == true) @@ -820,7 +840,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) { if (Debug == true) clog << " Or group keep for " << I.Name() << endl; - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); Change = true; } } @@ -864,6 +884,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) SPtrArray<pkgCache::Version *> VList = Start.AllTargets(); if (*VList == 0 && (Flags[I->ID] & Protected) != Protected && Start->Type != pkgCache::Dep::Conflicts && + Start->Type != pkgCache::Dep::DpkgBreaks && Start->Type != pkgCache::Dep::Obsoletes && Cache[I].NowBroken() == false) { @@ -875,7 +896,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) } Change = true; - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); break; } @@ -894,6 +915,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) if (Scores[I->ID] <= Scores[Pkg->ID] || ((Cache[Start] & pkgDepCache::DepNow) == 0 && End->Type != pkgCache::Dep::Conflicts && + End->Type != pkgCache::Dep::DpkgBreaks && End->Type != pkgCache::Dep::Obsoletes)) { // Try a little harder to fix protected packages.. @@ -912,7 +934,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) /* See if a keep will do, unless the package is protected, then installing it will be necessary */ bool Installed = Cache[I].Install(); - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); if (Cache[I].InstBroken() == false) { // Unwind operation will be keep now @@ -921,7 +943,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) // Restore if (InOr == true && Installed == true) - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); if (Debug == true) clog << " Holding Back " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl; @@ -959,7 +981,22 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) (Start->Type == pkgCache::Dep::Conflicts || Start->Type == pkgCache::Dep::Obsoletes)) continue; - + + if (Start->Type == pkgCache::Dep::DpkgBreaks) + { + /* Would it help if we upgraded? */ + if (Cache[End] & pkgDepCache::DepGCVer) { + if (Debug) + clog << " Upgrading " << Pkg.Name() << " due to Breaks field in " << I.Name() << endl; + Cache.MarkInstall(Pkg, false, 0, false); + continue; + } + if (Debug) + clog << " Will not break " << Pkg.Name() << " as stated in Breaks field in " << I.Name() <<endl; + Cache.MarkKeep(I, false, false); + continue; + } + // Skip adding to the kill list if it is protected if ((Flags[Pkg->ID] & Protected) != 0) continue; @@ -980,6 +1017,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) // Hm, nothing can possibly satisify this dep. Nuke it. if (VList[0] == 0 && Start->Type != pkgCache::Dep::Conflicts && + Start->Type != pkgCache::Dep::DpkgBreaks && Start->Type != pkgCache::Dep::Obsoletes && (Flags[I->ID] & Protected) != Protected) { @@ -993,7 +1031,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) // Restore if (InOr == true && Installed == true) - Cache.MarkInstall(I,false); + Cache.MarkInstall(I, false, 0, false); if (Debug == true) clog << " Holding Back " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl; @@ -1038,7 +1076,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) { if (Debug == true) clog << " Fixing " << I.Name() << " via keep of " << J->Pkg.Name() << endl; - Cache.MarkKeep(J->Pkg); + Cache.MarkKeep(J->Pkg, false, false); } if (Counter > 1) @@ -1068,6 +1106,20 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) return _error->Error(_("Unable to correct problems, you have held broken packages.")); } + // set the auto-flags (mvo: I'm not sure if we _really_ need this, but + // I didn't managed + pkgCache::PkgIterator I = Cache.PkgBegin(); + for (;I.end() != true; I++) { + if (Cache[I].NewInstall() && !(Flags[I->ID] & PreInstalled)) { + if(_config->FindI("Debug::pkgAutoRemove",false)) { + std::clog << "Resolve installed new pkg: " << I.Name() + << " (now marking it as auto)" << std::endl; + } + Cache[I].Flags |= pkgCache::Flag::Auto; + } + } + + return true; } /*}}}*/ @@ -1078,6 +1130,8 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) system was non-broken previously. */ bool pkgProblemResolver::ResolveByKeep() { + pkgDepCache::ActionGroup group(Cache); + unsigned long Size = Cache.Head().PackageCount; if (Debug == true) @@ -1111,7 +1165,7 @@ bool pkgProblemResolver::ResolveByKeep() { if (Debug == true) clog << "Keeping package " << I.Name() << endl; - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); if (Cache[I].InstBroken() == false) { K = PList - 1; @@ -1159,7 +1213,7 @@ bool pkgProblemResolver::ResolveByKeep() { if (Debug == true) clog << " Keeping Package " << Pkg.Name() << " due to dep" << endl; - Cache.MarkKeep(Pkg); + Cache.MarkKeep(Pkg, false, false); } if (Cache[I].InstBroken() == false) @@ -1196,14 +1250,21 @@ bool pkgProblemResolver::ResolveByKeep() /* This is used to make sure protected packages are installed */ void pkgProblemResolver::InstallProtect() { + pkgDepCache::ActionGroup group(Cache); + for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) { if ((Flags[I->ID] & Protected) == Protected) { if ((Flags[I->ID] & ToRemove) == ToRemove) Cache.MarkDelete(I); - else - Cache.MarkInstall(I,false); + else + { + // preserver the information if the package was auto + // or manual installed + bool autoInst = (Cache[I].Flags & pkgCache::Flag::Auto); + Cache.MarkInstall(I, false, 0, !autoInst); + } } } } @@ -1239,3 +1300,4 @@ void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List) qsort(List,Count,sizeof(*List),PrioComp); } /*}}}*/ + diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h index 2b326bd65..d5a9c7b0d 100644 --- a/apt-pkg/cacheiterators.h +++ b/apt-pkg/cacheiterators.h @@ -99,7 +99,7 @@ class pkgCache::VerIterator { Version *Ver; pkgCache *Owner; - + void _dummy(); public: @@ -128,6 +128,8 @@ class pkgCache::VerIterator inline const char *Section() const {return Ver->Section == 0?0:Owner->StrP + Ver->Section;}; inline const char *Arch() const {return Ver->Arch == 0?0:Owner->StrP + Ver->Arch;}; inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Ver->ParentPkg);}; + inline DescIterator DescriptionList() const; + DescIterator TranslatedDescription() const; inline DepIterator DependsList() const; inline PrvIterator ProvidesList() const; inline VerFileIterator FileList() const; @@ -148,6 +150,50 @@ class pkgCache::VerIterator }; }; +// Description Iterator +class pkgCache::DescIterator +{ + Description *Desc; + pkgCache *Owner; + + void _dummy(); + + public: + + // Iteration + void operator ++(int) {if (Desc != Owner->DescP) Desc = Owner->DescP + Desc->NextDesc;}; + inline void operator ++() {operator ++(0);}; + inline bool end() const {return Desc == Owner->DescP?true:false;}; + inline void operator =(const DescIterator &B) {Desc = B.Desc; Owner = B.Owner;}; + + // Comparison + inline bool operator ==(const DescIterator &B) const {return Desc == B.Desc;}; + inline bool operator !=(const DescIterator &B) const {return Desc != B.Desc;}; + int CompareDesc(const DescIterator &B) const; + + // Accessors + inline Description *operator ->() {return Desc;}; + inline Description const *operator ->() const {return Desc;}; + inline Description &operator *() {return *Desc;}; + inline Description const &operator *() const {return *Desc;}; + inline operator Description *() {return Desc == Owner->DescP?0:Desc;}; + inline operator Description const *() const {return Desc == Owner->DescP?0:Desc;}; + inline pkgCache *Cache() {return Owner;}; + + inline const char *LanguageCode() const {return Owner->StrP + Desc->language_code;}; + inline const char *md5() const {return Owner->StrP + Desc->md5sum;}; + inline DescFileIterator FileList() const; + inline unsigned long Index() const {return Desc - Owner->DescP;}; + + inline DescIterator() : Desc(0), Owner(0) {}; + inline DescIterator(pkgCache &Owner,Description *Trg = 0) : Desc(Trg), + Owner(&Owner) + { + if (Desc == 0) + Desc = Owner.DescP; + }; +}; + // Dependency iterator class pkgCache::DepIterator { @@ -338,6 +384,38 @@ class pkgCache::VerFileIterator inline VerFileIterator(pkgCache &Owner,VerFile *Trg) : Owner(&Owner), FileP(Trg) {}; }; +// Description File +class pkgCache::DescFileIterator +{ + pkgCache *Owner; + DescFile *FileP; + + public: + + // Iteration + void operator ++(int) {if (FileP != Owner->DescFileP) FileP = Owner->DescFileP + FileP->NextFile;}; + inline void operator ++() {operator ++(0);}; + inline bool end() const {return FileP == Owner->DescFileP?true:false;}; + + // Comparison + inline bool operator ==(const DescFileIterator &B) const {return FileP == B.FileP;}; + inline bool operator !=(const DescFileIterator &B) const {return FileP != B.FileP;}; + + // Accessors + inline DescFile *operator ->() {return FileP;}; + inline DescFile const *operator ->() const {return FileP;}; + inline DescFile const &operator *() const {return *FileP;}; + inline operator DescFile *() {return FileP == Owner->DescFileP?0:FileP;}; + inline operator DescFile const *() const {return FileP == Owner->DescFileP?0:FileP;}; + inline pkgCache *Cache() {return Owner;}; + + inline PkgFileIterator File() const {return PkgFileIterator(*Owner,FileP->File + Owner->PkgFileP);}; + inline unsigned long Index() const {return FileP - Owner->DescFileP;}; + + inline DescFileIterator() : Owner(0), FileP(0) {}; + inline DescFileIterator(pkgCache &Owner,DescFile *Trg) : Owner(&Owner), FileP(Trg) {}; +}; + // Inlined Begin functions cant be in the class because of order problems inline pkgCache::VerIterator pkgCache::PkgIterator::VersionList() const {return VerIterator(*Owner,Owner->VerP + Pkg->VersionList);}; @@ -347,11 +425,15 @@ inline pkgCache::DepIterator pkgCache::PkgIterator::RevDependsList() const {return DepIterator(*Owner,Owner->DepP + Pkg->RevDepends,Pkg);}; inline pkgCache::PrvIterator pkgCache::PkgIterator::ProvidesList() const {return PrvIterator(*Owner,Owner->ProvideP + Pkg->ProvidesList,Pkg);}; +inline pkgCache::DescIterator pkgCache::VerIterator::DescriptionList() const + {return DescIterator(*Owner,Owner->DescP + Ver->DescriptionList);}; inline pkgCache::PrvIterator pkgCache::VerIterator::ProvidesList() const {return PrvIterator(*Owner,Owner->ProvideP + Ver->ProvidesList,Ver);}; inline pkgCache::DepIterator pkgCache::VerIterator::DependsList() const {return DepIterator(*Owner,Owner->DepP + Ver->DependsList,Ver);}; inline pkgCache::VerFileIterator pkgCache::VerIterator::FileList() const {return VerFileIterator(*Owner,Owner->VerFileP + Ver->FileList);}; +inline pkgCache::DescFileIterator pkgCache::DescIterator::FileList() const + {return DescFileIterator(*Owner,Owner->DescFileP + Desc->FileList);}; #endif diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc index 4d45d38a2..aefe9c9e9 100644 --- a/apt-pkg/cdrom.cc +++ b/apt-pkg/cdrom.cc @@ -30,12 +30,16 @@ using namespace std; search that short circuits when it his a package file in the dir. This speeds it up greatly as the majority of the size is in the binary-* sub dirs. */ -bool pkgCdrom::FindPackages(string CD,vector<string> &List, - vector<string> &SList, vector<string> &SigList, +bool pkgCdrom::FindPackages(string CD, + vector<string> &List, + vector<string> &SList, + vector<string> &SigList, + vector<string> &TransList, string &InfoDir, pkgCdromStatus *log, unsigned int Depth) { static ino_t Inodes[9]; + DIR *D; // if we have a look we "pulse" now if(log) @@ -90,8 +94,28 @@ bool pkgCdrom::FindPackages(string CD,vector<string> &List, if (_config->FindB("APT::CDROM::Thorough",false) == false) return true; } + + // see if we find translatin indexes + if (stat("i18n",&Buf) == 0) + { + D = opendir("i18n"); + for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D)) + { + if(strstr(Dir->d_name,"Translation") != NULL) + { + if (_config->FindB("Debug::aptcdrom",false) == true) + std::clog << "found translations: " << Dir->d_name << "\n"; + string file = Dir->d_name; + if(file.substr(file.size()-3,file.size()) == ".gz") + file = file.substr(0,file.size()-3); + TransList.push_back(CD+"i18n/"+ file); + } + } + closedir(D); + } + - DIR *D = opendir("."); + D = opendir("."); if (D == 0) return _error->Errno("opendir","Unable to read %s",CD.c_str()); @@ -127,7 +151,7 @@ bool pkgCdrom::FindPackages(string CD,vector<string> &List, Inodes[Depth] = Buf.st_ino; // Descend - if (FindPackages(CD + Dir->d_name,List,SList,SigList,InfoDir,log,Depth+1) == false) + if (FindPackages(CD + Dir->d_name,List,SList,SigList,TransList,InfoDir,log,Depth+1) == false) break; if (chdir(CD.c_str()) != 0) @@ -612,9 +636,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log) vector<string> List; vector<string> SourceList; vector<string> SigList; + vector<string> TransList; string StartDir = SafeGetCWD(); string InfoDir; - if (FindPackages(CDROM,List,SourceList, SigList,InfoDir,log) == false) + if (FindPackages(CDROM,List,SourceList, SigList,TransList,InfoDir,log) == false) { log->Update("\n"); return false; @@ -642,11 +667,13 @@ bool pkgCdrom::Add(pkgCdromStatus *log) DropRepeats(List,"Packages"); DropRepeats(SourceList,"Sources"); DropRepeats(SigList,"Release.gpg"); + DropRepeats(TransList,""); if(log) { msg.str(""); - ioprintf(msg, _("Found %i package indexes, %i source indexes and " - "%i signatures\n"), - List.size(), SourceList.size(), SigList.size()); + ioprintf(msg, _("Found %i package indexes, %i source indexes, " + "%i translation indexes and %i signatures\n"), + List.size(), SourceList.size(), TransList.size(), + SigList.size()); log->Update(msg.str(), STEP_SCAN); } @@ -738,8 +765,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log) // Copy the package files to the state directory PackageCopy Copy; SourceCopy SrcCopy; + TranslationsCopy TransCopy; if (Copy.CopyPackages(CDROM,Name,List, log) == false || - SrcCopy.CopyPackages(CDROM,Name,SourceList, log) == false) + SrcCopy.CopyPackages(CDROM,Name,SourceList, log) == false || + TransCopy.CopyTranslations(CDROM,Name,TransList, log) == false) return false; // reduce the List so that it takes less space in sources.list diff --git a/apt-pkg/cdrom.h b/apt-pkg/cdrom.h index 085eb64e2..e18aaff3e 100644 --- a/apt-pkg/cdrom.h +++ b/apt-pkg/cdrom.h @@ -50,8 +50,11 @@ class pkgCdrom }; - bool FindPackages(string CD,vector<string> &List, - vector<string> &SList, vector<string> &SigList, + bool FindPackages(string CD, + vector<string> &List, + vector<string> &SList, + vector<string> &SigList, + vector<string> &TransList, string &InfoDir, pkgCdromStatus *log, unsigned int Depth = 0); bool DropBinaryArch(vector<string> &List); diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index d96155917..37d263794 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -32,12 +32,55 @@ #include <regex.h> #include <errno.h> #include <stdarg.h> +#include <iconv.h> #include "config.h" using namespace std; /*}}}*/ +// UTF8ToCodeset - Convert some UTF-8 string for some codeset /*{{{*/ +// --------------------------------------------------------------------- +/* This is handy to use before display some information for enduser */ +bool UTF8ToCodeset(const char *codeset, const string &orig, string *dest) +{ + iconv_t cd; + const char *inbuf; + char *inptr, *outbuf, *outptr; + size_t insize, outsize; + + cd = iconv_open(codeset, "UTF-8"); + if (cd == (iconv_t)(-1)) { + // Something went wrong + if (errno == EINVAL) + _error->Error("conversion from 'UTF-8' to '%s' not available", + codeset); + else + perror("iconv_open"); + + // Clean the destination string + *dest = ""; + + return false; + } + + insize = outsize = orig.size(); + inbuf = orig.data(); + inptr = (char *)inbuf; + outbuf = new char[insize+1]; + outptr = outbuf; + + iconv(cd, &inptr, &insize, &outptr, &outsize); + *outptr = '\0'; + + *dest = outbuf; + delete[] outbuf; + + iconv_close(cd); + + return true; +} + /*}}}*/ // strstrip - Remove white space from the front and back of a string /*{{{*/ // --------------------------------------------------------------------- /* This is handy to use when parsing a file. It also removes \n's left diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index 6ec2b7811..254087267 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -38,7 +38,8 @@ using std::ostream; #define APT_FORMAT2 #define APT_FORMAT3 #endif - + +bool UTF8ToCodeset(const char *codeset, const string &orig, string *dest); char *_strstrip(char *String); char *_strtabexpand(char *String,size_t Len); bool ParseQuoteWord(const char *&String,string &Res); diff --git a/apt-pkg/deb/debindexfile.cc b/apt-pkg/deb/debindexfile.cc index 234521efe..9f435bba5 100644 --- a/apt-pkg/deb/debindexfile.cc +++ b/apt-pkg/deb/debindexfile.cc @@ -320,6 +320,170 @@ pkgCache::PkgFileIterator debPackagesIndex::FindInCache(pkgCache &Cache) const } /*}}}*/ +// TranslationsIndex::debTranslationsIndex - Contructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +debTranslationsIndex::debTranslationsIndex(string URI,string Dist,string Section) : + pkgIndexFile(true), URI(URI), Dist(Dist), Section(Section) +{ +} + /*}}}*/ +// TranslationIndex::Trans* - Return the URI to the translation files /*{{{*/ +// --------------------------------------------------------------------- +/* */ +inline string debTranslationsIndex::IndexFile(const char *Type) const +{ + return _config->FindDir("Dir::State::lists") + URItoFileName(IndexURI(Type)); +} +string debTranslationsIndex::IndexURI(const char *Type) const +{ + string Res; + if (Dist[Dist.size() - 1] == '/') + { + if (Dist != "/") + Res = URI + Dist; + else + Res = URI; + } + else + Res = URI + "dists/" + Dist + '/' + Section + + "/i18n/Translation-"; + + Res += Type; + return Res; +} + /*}}}*/ +// TranslationsIndex::GetIndexes - Fetch the index files /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const +{ + if (TranslationsAvailable()) { + string TranslationFile = "Translation-" + LanguageCode(); + new pkgAcqIndexTrans(Owner, IndexURI(LanguageCode().c_str()), + Info(TranslationFile.c_str()), + TranslationFile); + } + + return true; +} + /*}}}*/ +// TranslationsIndex::Describe - Give a descriptive path to the index /*{{{*/ +// --------------------------------------------------------------------- +/* This should help the user find the index in the sources.list and + in the filesystem for problem solving */ +string debTranslationsIndex::Describe(bool Short) const +{ + char S[300]; + if (Short == true) + snprintf(S,sizeof(S),"%s",Info(TranslationFile().c_str()).c_str()); + else + snprintf(S,sizeof(S),"%s (%s)",Info(TranslationFile().c_str()).c_str(), + IndexFile(LanguageCode().c_str()).c_str()); + return S; +} + /*}}}*/ +// TranslationsIndex::Info - One liner describing the index URI /*{{{*/ +// --------------------------------------------------------------------- +/* */ +string debTranslationsIndex::Info(const char *Type) const +{ + string Info = ::URI::SiteOnly(URI) + ' '; + if (Dist[Dist.size() - 1] == '/') + { + if (Dist != "/") + Info += Dist; + } + else + Info += Dist + '/' + Section; + Info += " "; + Info += Type; + return Info; +} + /*}}}*/ +bool debTranslationsIndex::HasPackages() const +{ + if(!TranslationsAvailable()) + return false; + + return FileExists(IndexFile(LanguageCode().c_str())); +} + +// TranslationsIndex::Exists - Check if the index is available /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool debTranslationsIndex::Exists() const +{ + return FileExists(IndexFile(LanguageCode().c_str())); +} + /*}}}*/ +// TranslationsIndex::Size - Return the size of the index /*{{{*/ +// --------------------------------------------------------------------- +/* This is really only used for progress reporting. */ +unsigned long debTranslationsIndex::Size() const +{ + struct stat S; + if (stat(IndexFile(LanguageCode().c_str()).c_str(),&S) != 0) + return 0; + return S.st_size; +} + /*}}}*/ +// TranslationsIndex::Merge - Load the index file into a cache /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool debTranslationsIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const +{ + // Check the translation file, if in use + string TranslationFile = IndexFile(LanguageCode().c_str()); + if (TranslationsAvailable() && FileExists(TranslationFile)) + { + FileFd Trans(TranslationFile,FileFd::ReadOnly); + debListParser TransParser(&Trans); + if (_error->PendingError() == true) + return false; + + Prog.SubProgress(0, Info(TranslationFile.c_str())); + if (Gen.SelectFile(TranslationFile,string(),*this) == false) + return _error->Error("Problem with SelectFile %s",TranslationFile.c_str()); + + // Store the IMS information + pkgCache::PkgFileIterator TransFile = Gen.GetCurFile(); + struct stat TransSt; + if (fstat(Trans.Fd(),&TransSt) != 0) + return _error->Errno("fstat","Failed to stat"); + TransFile->Size = TransSt.st_size; + TransFile->mtime = TransSt.st_mtime; + + if (Gen.MergeList(TransParser) == false) + return _error->Error("Problem with MergeList %s",TranslationFile.c_str()); + } + + return true; +} + /*}}}*/ +// TranslationsIndex::FindInCache - Find this index /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgCache::PkgFileIterator debTranslationsIndex::FindInCache(pkgCache &Cache) const +{ + string FileName = IndexFile(LanguageCode().c_str()); + + pkgCache::PkgFileIterator File = Cache.FileBegin(); + for (; File.end() == false; File++) + { + if (FileName != File.FileName()) + continue; + + struct stat St; + if (stat(File.FileName(),&St) != 0) + return pkgCache::PkgFileIterator(Cache); + if ((unsigned)St.st_size != File->Size || St.st_mtime != File->mtime) + return pkgCache::PkgFileIterator(Cache); + return File; + } + return File; +} + /*}}}*/ // StatusIndex::debStatusIndex - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -416,6 +580,11 @@ class debIFTypePkg : public pkgIndexFile::Type }; debIFTypePkg() {Label = "Debian Package Index";}; }; +class debIFTypeTrans : public debIFTypePkg +{ + public: + debIFTypeTrans() {Label = "Debian Translation Index";}; +}; class debIFTypeStatus : public pkgIndexFile::Type { public: @@ -428,6 +597,7 @@ class debIFTypeStatus : public pkgIndexFile::Type }; static debIFTypeSrc _apt_Src; static debIFTypePkg _apt_Pkg; +static debIFTypeTrans _apt_Trans; static debIFTypeStatus _apt_Status; const pkgIndexFile::Type *debSourcesIndex::GetType() const @@ -438,6 +608,10 @@ const pkgIndexFile::Type *debPackagesIndex::GetType() const { return &_apt_Pkg; } +const pkgIndexFile::Type *debTranslationsIndex::GetType() const +{ + return &_apt_Trans; +} const pkgIndexFile::Type *debStatusIndex::GetType() const { return &_apt_Status; diff --git a/apt-pkg/deb/debindexfile.h b/apt-pkg/deb/debindexfile.h index a1b9583a4..57005222f 100644 --- a/apt-pkg/deb/debindexfile.h +++ b/apt-pkg/deb/debindexfile.h @@ -74,6 +74,36 @@ class debPackagesIndex : public pkgIndexFile debPackagesIndex(string URI,string Dist,string Section,bool Trusted); }; +class debTranslationsIndex : public pkgIndexFile +{ + string URI; + string Dist; + string Section; + + string Info(const char *Type) const; + string IndexFile(const char *Type) const; + string IndexURI(const char *Type) const; + + inline string TranslationFile() const {return "Translation-" + LanguageCode();}; + + public: + + virtual const Type *GetType() const; + + // Interface for acquire + virtual string Describe(bool Short) const; + virtual bool GetIndexes(pkgAcquire *Owner) const; + + // Interface for the Cache Generator + virtual bool Exists() const; + virtual bool HasPackages() const; + virtual unsigned long Size() const; + virtual bool Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const; + virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const; + + debTranslationsIndex(string URI,string Dist,string Section); +}; + class debSourcesIndex : public pkgIndexFile { string URI; diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index d0dc7a260..074abea6d 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -15,6 +15,7 @@ #include <apt-pkg/configuration.h> #include <apt-pkg/strutl.h> #include <apt-pkg/crc-16.h> +#include <apt-pkg/md5.h> #include <ctype.h> @@ -104,6 +105,8 @@ bool debListParser::NewVersion(pkgCache::VerIterator Ver) return false; if (ParseDepends(Ver,"Conflicts",pkgCache::Dep::Conflicts) == false) return false; + if (ParseDepends(Ver,"Breaks",pkgCache::Dep::DpkgBreaks) == false) + return false; if (ParseDepends(Ver,"Replaces",pkgCache::Dep::Replaces) == false) return false; @@ -117,6 +120,48 @@ bool debListParser::NewVersion(pkgCache::VerIterator Ver) return true; } /*}}}*/ +// ListParser::Description - Return the description string /*{{{*/ +// --------------------------------------------------------------------- +/* This is to return the string describing the package in debian + form. If this returns the blank string then the entry is assumed to + only describe package properties */ +string debListParser::Description() +{ + if (DescriptionLanguage().empty()) + return Section.FindS("Description"); + else + return Section.FindS(("Description-" + pkgIndexFile::LanguageCode()).c_str()); +} + /*}}}*/ +// ListParser::DescriptionLanguage - Return the description lang string /*{{{*/ +// --------------------------------------------------------------------- +/* This is to return the string describing the language of + description. If this returns the blank string then the entry is + assumed to describe original description. */ +string debListParser::DescriptionLanguage() +{ + return Section.FindS("Description").empty() ? pkgIndexFile::LanguageCode() : ""; +} + /*}}}*/ +// ListParser::Description - Return the description_md5 MD5SumValue /*{{{*/ +// --------------------------------------------------------------------- +/* This is to return the md5 string to allow the check if it is the right + description. If no Description-md5 is found in the section it will be + calculated. + */ +MD5SumValue debListParser::Description_md5() +{ + string value = Section.FindS("Description-md5"); + + if (value.empty()) + { + MD5Summation md5; + md5.Add((Description() + "\n").c_str()); + return md5.Result(); + } else + return MD5SumValue(value); +} + /*}}}*/ // ListParser::UsePackage - Update a package structure /*{{{*/ // --------------------------------------------------------------------- /* This is called to update the package with any new information @@ -150,6 +195,7 @@ unsigned short debListParser::VersionHash() // "Suggests", // "Recommends", "Conflicts", + "Breaks", "Replaces",0}; unsigned long Result = INIT_FCS; char S[1024]; diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h index 3a0e0421b..34bb29c72 100644 --- a/apt-pkg/deb/deblistparser.h +++ b/apt-pkg/deb/deblistparser.h @@ -12,6 +12,7 @@ #define PKGLIB_DEBLISTPARSER_H #include <apt-pkg/pkgcachegen.h> +#include <apt-pkg/indexfile.h> #include <apt-pkg/tagfile.h> class debListParser : public pkgCacheGenerator::ListParser @@ -47,6 +48,9 @@ class debListParser : public pkgCacheGenerator::ListParser virtual string Package(); virtual string Version(); virtual bool NewVersion(pkgCache::VerIterator Ver); + virtual string Description(); + virtual string DescriptionLanguage(); + virtual MD5SumValue Description_md5(); virtual unsigned short VersionHash(); virtual bool UsePackage(pkgCache::PkgIterator Pkg, pkgCache::VerIterator Ver); diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc index 85e5b16b3..8cf31b326 100644 --- a/apt-pkg/deb/debmetaindex.cc +++ b/apt-pkg/deb/debmetaindex.cc @@ -157,6 +157,16 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool GetAll) const ComputeIndexTargets(), new indexRecords (Dist)); + // Queue the translations + for (vector<const debSectionEntry *>::const_iterator I = SectionEntries.begin(); + I != SectionEntries.end(); I++) { + + if((*I)->IsSrc) + continue; + debTranslationsIndex i = debTranslationsIndex(URI,Dist,(*I)->Section); + i.GetIndexes(Owner); + } + return true; } @@ -181,11 +191,16 @@ vector <pkgIndexFile *> *debReleaseIndex::GetIndexFiles() Indexes = new vector <pkgIndexFile*>; for (vector<const debSectionEntry *>::const_iterator I = SectionEntries.begin(); - I != SectionEntries.end(); I++) + I != SectionEntries.end(); I++) { if ((*I)->IsSrc) Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted())); else + { Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted())); + Indexes->push_back(new debTranslationsIndex(URI, Dist, (*I)->Section)); + } + } + return Indexes; } diff --git a/apt-pkg/deb/debrecords.cc b/apt-pkg/deb/debrecords.cc index c3e579ad1..5eb2d67bb 100644 --- a/apt-pkg/deb/debrecords.cc +++ b/apt-pkg/deb/debrecords.cc @@ -12,7 +12,9 @@ #pragma implementation "apt-pkg/debrecords.h" #endif #include <apt-pkg/debrecords.h> +#include <apt-pkg/strutl.h> #include <apt-pkg/error.h> +#include <langinfo.h> /*}}}*/ // RecordParser::debRecordParser - Constructor /*{{{*/ @@ -31,6 +33,10 @@ bool debRecordParser::Jump(pkgCache::VerFileIterator const &Ver) { return Tags.Jump(Section,Ver->Offset); } +bool debRecordParser::Jump(pkgCache::DescFileIterator const &Desc) +{ + return Tags.Jump(Section,Desc->Offset); +} /*}}}*/ // RecordParser::FileName - Return the archive filename on the site /*{{{*/ // --------------------------------------------------------------------- @@ -77,7 +83,7 @@ string debRecordParser::Maintainer() /* */ string debRecordParser::ShortDesc() { - string Res = Section.FindS("Description"); + string Res = LongDesc(); string::size_type Pos = Res.find('\n'); if (Pos == string::npos) return Res; @@ -89,7 +95,20 @@ string debRecordParser::ShortDesc() /* */ string debRecordParser::LongDesc() { - return Section.FindS("Description"); + string orig, dest; + char *codeset = nl_langinfo(CODESET); + + if (!Section.FindS("Description").empty()) + orig = Section.FindS("Description").c_str(); + else + orig = Section.FindS(("Description-" + pkgIndexFile::LanguageCode()).c_str()).c_str(); + + if (strcmp(codeset,"UTF-8") != 0) { + UTF8ToCodeset(codeset, orig, &dest); + orig = dest; + } + + return orig; } /*}}}*/ // RecordParser::SourcePkg - Return the source package name if any /*{{{*/ diff --git a/apt-pkg/deb/debrecords.h b/apt-pkg/deb/debrecords.h index efef2e588..24e5aab88 100644 --- a/apt-pkg/deb/debrecords.h +++ b/apt-pkg/deb/debrecords.h @@ -19,6 +19,7 @@ #endif #include <apt-pkg/pkgrecords.h> +#include <apt-pkg/indexfile.h> #include <apt-pkg/tagfile.h> class debRecordParser : public pkgRecords::Parser @@ -30,6 +31,7 @@ class debRecordParser : public pkgRecords::Parser protected: virtual bool Jump(pkgCache::VerFileIterator const &Ver); + virtual bool Jump(pkgCache::DescFileIterator const &Desc); public: diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 3204fc1bb..cebdafe7d 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -474,6 +474,8 @@ bool pkgDPkgPM::Go(int OutStatusFd) case Item::Install: Args[n++] = "--unpack"; Size += strlen(Args[n-1]); + Args[n++] = "--auto-deconfigure"; + Size += strlen(Args[n-1]); break; } diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 2ff8a9ac7..0b181dc43 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -47,7 +47,7 @@ class pkgDPkgPM : public pkgPackageManager bool RunScripts(const char *Cnf); bool RunScriptsWithPkgs(const char *Cnf); bool SendV2Pkgs(FILE *F); - + // The Actuall installation implementation virtual bool Install(PkgIterator Pkg,string File); virtual bool Configure(PkgIterator Pkg); diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 58d1d25e5..27e0ff73f 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -16,16 +16,54 @@ #include <apt-pkg/error.h> #include <apt-pkg/sptr.h> #include <apt-pkg/algorithms.h> + +#include <apt-pkg/fileutl.h> #include <apt-pkg/configuration.h> +#include <apt-pkg/pkgsystem.h> +#include <apt-pkg/tagfile.h> + +#include <iostream> +#include <sstream> +#include <set> + +#include <sys/stat.h> #include <apti18n.h> - /*}}}*/ + +pkgDepCache::ActionGroup::ActionGroup(pkgDepCache &cache) : + cache(cache), released(false) +{ + ++cache.group_level; +} + +void pkgDepCache::ActionGroup::release() +{ + if(!released) + { + if(cache.group_level == 0) + std::cerr << "W: Unbalanced action groups, expect badness" << std::endl; + else + { + --cache.group_level; + + if(cache.group_level == 0) + cache.MarkAndSweep(); + } + + released = false; + } +} + +pkgDepCache::ActionGroup::~ActionGroup() +{ + release(); +} // DepCache::pkgDepCache - Constructors /*{{{*/ // --------------------------------------------------------------------- /* */ pkgDepCache::pkgDepCache(pkgCache *pCache,Policy *Plcy) : - Cache(pCache), PkgState(0), DepState(0) + group_level(0), Cache(pCache), PkgState(0), DepState(0) { delLocalPolicy = 0; LocalPolicy = Plcy; @@ -48,6 +86,10 @@ pkgDepCache::~pkgDepCache() /* This allocats the extension buffers and initializes them. */ bool pkgDepCache::Init(OpProgress *Prog) { + // Suppress mark updates during this operation (just in case) and + // run a mark operation when Init terminates. + ActionGroup actions(*this); + delete [] PkgState; delete [] DepState; PkgState = new StateCache[Head().PackageCount]; @@ -73,7 +115,7 @@ bool pkgDepCache::Init(OpProgress *Prog) // Find the proper cache slot StateCache &State = PkgState[I->ID]; State.iFlags = 0; - + // Figure out the install version State.CandidateVer = GetCandidateVer(I); State.InstallVer = I.CurrentVer(); @@ -95,11 +137,134 @@ bool pkgDepCache::Init(OpProgress *Prog) if(Prog != 0) Prog->Done(); - + return true; } /*}}}*/ +bool pkgDepCache::readStateFile(OpProgress *Prog) +{ + FileFd state_file; + string state = _config->FindDir("Dir::State") + "extended_states"; + if(FileExists(state)) { + state_file.Open(state, FileFd::ReadOnly); + int file_size = state_file.Size(); + if(Prog != NULL) + Prog->OverallProgress(0, file_size, 1, + _("Reading state information")); + + pkgTagFile tagfile(&state_file); + pkgTagSection section; + int amt=0; + while(tagfile.Step(section)) { + string pkgname = section.FindS("Package"); + pkgCache::PkgIterator pkg=Cache->FindPkg(pkgname); + // Silently ignore unknown packages and packages with no actual + // version. + if(!pkg.end() && !pkg.VersionList().end()) { + short reason = section.FindI("Auto-Installed", 0); + if(reason > 0) + PkgState[pkg->ID].Flags |= Flag::Auto; + if(_config->FindB("Debug::pkgAutoRemove",false)) + std::cout << "Auto-Installed : " << pkgname << std::endl; + amt+=section.size(); + if(Prog != NULL) + Prog->OverallProgress(amt, file_size, 1, + _("Reading state information")); + } + if(Prog != NULL) + Prog->OverallProgress(file_size, file_size, 1, + _("Reading state information")); + } + } + + return true; +} + +bool pkgDepCache::writeStateFile(OpProgress *prog, bool InstalledOnly) +{ + if(_config->FindB("Debug::pkgAutoRemove",false)) + std::clog << "pkgDepCache::writeStateFile()" << std::endl; + + FileFd StateFile; + string state = _config->FindDir("Dir::State") + "extended_states"; + + // if it does not exist, create a empty one + if(!FileExists(state)) + { + StateFile.Open(state, FileFd::WriteEmpty); + StateFile.Close(); + } + + // open it + if(!StateFile.Open(state, FileFd::ReadOnly)) + return _error->Error(_("Failed to open StateFile %s"), + state.c_str()); + + FILE *OutFile; + string outfile = state + ".tmp"; + if((OutFile = fopen(outfile.c_str(),"w")) == NULL) + return _error->Error(_("Failed to write temporary StateFile %s"), + outfile.c_str()); + + // first merge with the existing sections + pkgTagFile tagfile(&StateFile); + pkgTagSection section; + std::set<string> pkgs_seen; + const char *nullreorderlist[] = {0}; + while(tagfile.Step(section)) { + string pkgname = section.FindS("Package"); + // Silently ignore unknown packages and packages with no actual + // version. + pkgCache::PkgIterator pkg=Cache->FindPkg(pkgname); + if(pkg.end() || pkg.VersionList().end()) + continue; + bool oldAuto = section.FindI("Auto-Installed"); + bool newAuto = (PkgState[pkg->ID].Flags & Flag::Auto); + if(_config->FindB("Debug::pkgAutoRemove",false)) + std::clog << "Update exisiting AutoInstall info: " + << pkg.Name() << std::endl; + TFRewriteData rewrite[2]; + rewrite[0].Tag = "Auto-Installed"; + rewrite[0].Rewrite = newAuto ? "1" : "0"; + rewrite[0].NewTag = 0; + rewrite[1].Tag = 0; + TFRewrite(OutFile, section, nullreorderlist, rewrite); + fprintf(OutFile,"\n"); + pkgs_seen.insert(pkgname); + } + + // then write the ones we have not seen yet + std::ostringstream ostr; + for(pkgCache::PkgIterator pkg=Cache->PkgBegin(); !pkg.end(); pkg++) { + if(PkgState[pkg->ID].Flags & Flag::Auto) { + if (pkgs_seen.find(pkg.Name()) != pkgs_seen.end()) { + if(_config->FindB("Debug::pkgAutoRemove",false)) + std::clog << "Skipping already written " << pkg.Name() << std::endl; + continue; + } + // skip not installed ones if requested + if(InstalledOnly && pkg->CurrentVer == 0) + continue; + if(_config->FindB("Debug::pkgAutoRemove",false)) + std::clog << "Writing new AutoInstall: " + << pkg.Name() << std::endl; + ostr.str(string("")); + ostr << "Package: " << pkg.Name() + << "\nAuto-Installed: 1\n\n"; + fprintf(OutFile,ostr.str().c_str()); + fprintf(OutFile,"\n"); + } + } + fclose(OutFile); + + // move the outfile over the real file and set permissions + rename(outfile.c_str(), state.c_str()); + chmod(state.c_str(), 0644); + + return true; +} + // DepCache::CheckDep - Checks a single dependency /*{{{*/ // --------------------------------------------------------------------- /* This first checks the dependency against the main target package and @@ -114,7 +279,7 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res) we allow it anyhow because dpkg does. Technically it is a packaging bug. Conflicts may never self match */ if (Dep.TargetPkg() != Dep.ParentPkg() || - (Dep->Type != Dep::Conflicts && Dep->Type != Dep::Obsoletes)) + (Dep->Type != Dep::Conflicts && Dep->Type != Dep::DpkgBreaks && Dep->Type != Dep::Obsoletes)) { PkgIterator Pkg = Dep.TargetPkg(); // Check the base package @@ -144,7 +309,8 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res) { /* Provides may never be applied against the same package if it is a conflicts. See the comment above. */ - if (P.OwnerPkg() == Pkg && Dep->Type == Dep::Conflicts) + if (P.OwnerPkg() == Pkg && + (Dep->Type == Dep::Conflicts || Dep->Type == Dep::DpkgBreaks)) continue; // Check if the provides is a hit @@ -240,9 +406,11 @@ void pkgDepCache::AddStates(const PkgIterator &Pkg,int Add) { StateCache &State = PkgState[Pkg->ID]; - // The Package is broken + // The Package is broken (either minimal dep or policy dep) if ((State.DepState & DepInstMin) != DepInstMin) iBrokenCount += Add; + if ((State.DepState & DepInstPolicy) != DepInstPolicy) + iPolicyBrokenCount += Add; // Bad state if (Pkg.State() != PkgIterator::NeedsNothing) @@ -296,7 +464,9 @@ void pkgDepCache::BuildGroupOrs(VerIterator const &V) /* Invert for Conflicts. We have to do this twice to get the right sense for a conflicts group */ - if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes) + if (D->Type == Dep::Conflicts || + D->Type == Dep::DpkgBreaks || + D->Type == Dep::Obsoletes) State = ~State; // Add to the group if we are within an or.. @@ -307,7 +477,9 @@ void pkgDepCache::BuildGroupOrs(VerIterator const &V) Group = 0; // Invert for Conflicts - if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes) + if (D->Type == Dep::Conflicts || + D->Type == Dep::DpkgBreaks || + D->Type == Dep::Obsoletes) State = ~State; } } @@ -440,7 +612,9 @@ void pkgDepCache::Update(OpProgress *Prog) Group = 0; // Invert for Conflicts - if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes) + if (D->Type == Dep::Conflicts || + D->Type == Dep::DpkgBreaks || + D->Type == Dep::Obsoletes) State = ~State; } } @@ -453,12 +627,14 @@ void pkgDepCache::Update(OpProgress *Prog) if (Prog != 0) Prog->Progress(Done); + + readStateFile(Prog); } /*}}}*/ // DepCache::Update - Update the deps list of a package /*{{{*/ // --------------------------------------------------------------------- /* This is a helper for update that only does the dep portion of the scan. - It is mainly ment to scan reverse dependencies. */ + It is mainly meant to scan reverse dependencies. */ void pkgDepCache::Update(DepIterator D) { // Update the reverse deps @@ -468,7 +644,9 @@ void pkgDepCache::Update(DepIterator D) State = DependencyState(D); // Invert for Conflicts - if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes) + if (D->Type == Dep::Conflicts || + D->Type == Dep::DpkgBreaks || + D->Type == Dep::Obsoletes) State = ~State; RemoveStates(D.ParentPkg()); @@ -510,7 +688,7 @@ void pkgDepCache::Update(PkgIterator const &Pkg) // DepCache::MarkKeep - Put the package in the keep state /*{{{*/ // --------------------------------------------------------------------- /* */ -void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft) +void pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser) { // Simplifies other routines. if (Pkg.end() == true) @@ -522,6 +700,9 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft) Pkg.CurrentVer().Downloadable() == false) return; + /** \todo Can this be moved later in the method? */ + ActionGroup group(*this); + /* We changed the soft state all the time so the UI is a bit nicer to use */ StateCache &P = PkgState[Pkg->ID]; @@ -537,8 +718,18 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft) // We dont even try to keep virtual packages.. if (Pkg->VersionList == 0) return; - - P.Flags &= ~Flag::Auto; + +#if 0 // reseting the autoflag here means we lose the + // auto-mark information if a user selects a package for removal + // but changes his mind then and sets it for keep again + // - this makes sense as default when all Garbage dependencies + // are automatically marked for removal (as aptitude does). + // setting a package for keep then makes it no longer autoinstalled + // for all other use-case this action is rather suprising + if(FromUser && !P.Marked) + P.Flags &= ~Flag::Auto; +#endif + RemoveSizes(Pkg); RemoveStates(Pkg); @@ -564,6 +755,8 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge) if (Pkg.end() == true) return; + ActionGroup group(*this); + // Check that it is not already marked for delete StateCache &P = PkgState[Pkg->ID]; P.iFlags &= ~(AutoKept | Purge); @@ -586,7 +779,6 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge) else P.Mode = ModeDelete; P.InstallVer = 0; - P.Flags &= Flag::Auto; AddStates(Pkg); Update(Pkg); @@ -597,7 +789,8 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge) // --------------------------------------------------------------------- /* */ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, - unsigned long Depth) + unsigned long Depth, bool FromUser, + bool ForceImportantDeps) { if (Depth > 100) return; @@ -606,26 +799,27 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, if (Pkg.end() == true) return; + ActionGroup group(*this); + /* Check that it is not already marked for install and that it can be installed */ StateCache &P = PkgState[Pkg->ID]; P.iFlags &= ~AutoKept; - if (P.InstBroken() == false && (P.Mode == ModeInstall || + if ((P.InstPolicyBroken() == false && P.InstBroken() == false) && + (P.Mode == ModeInstall || P.CandidateVer == (Version *)Pkg.CurrentVer())) { if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0) - MarkKeep(Pkg); + MarkKeep(Pkg, false, FromUser); return; } // See if there is even any possible instalation candidate if (P.CandidateVer == 0) return; - // We dont even try to install virtual packages.. if (Pkg->VersionList == 0) return; - /* Target the candidate version and remove the autoflag. We reset the autoflag below if this was called recursively. Otherwise the user should have the ability to de-auto a package by changing its state */ @@ -634,7 +828,20 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, P.Mode = ModeInstall; P.InstallVer = P.CandidateVer; - P.Flags &= ~Flag::Auto; + + if(FromUser) + { + // Set it to manual if it's a new install or cancelling the + // removal of a garbage package. + if(P.Status == 2 || (!Pkg.CurrentVer().end() && !P.Marked)) + P.Flags &= ~Flag::Auto; + } + else + { + // Set it to auto if this is a new install. + if(P.Status == 2) + P.Flags |= Flag::Auto; + } if (P.CandidateVer == (Version *)Pkg.CurrentVer()) P.Mode = ModeKeep; @@ -666,10 +873,43 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, /* Check if this dep should be consider for install. If it is a user defined important dep and we are installed a new package then - it will be installed. Otherwise we only worry about critical deps */ + it will be installed. Otherwise we only check for important + deps that have changed from the installed version + */ if (IsImportantDep(Start) == false) continue; - if (Pkg->CurrentVer != 0 && Start.IsCritical() == false) + + /* check if any ImportantDep() (but not Critial) where added + * since we installed the package + */ + bool isNewImportantDep = false; + if(!ForceImportantDeps && !Start.IsCritical()) + { + bool found=false; + VerIterator instVer = Pkg.CurrentVer(); + if(!instVer.end()) + { + for (DepIterator D = instVer.DependsList(); D.end() != true; D++) + { + //FIXME: deal better with or-groups(?) + DepIterator LocalStart = D; + + if(IsImportantDep(D) && Start.TargetPkg() == D.TargetPkg()) + found=true; + } + // this is a new dep if it was not found to be already + // a important dep of the installed pacakge + isNewImportantDep = !found; + } + } + if(isNewImportantDep) + if(_config->FindB("Debug::pkgDepCache::AutoInstall",false) == true) + std::clog << "new important dependency: " + << Start.TargetPkg().Name() << std::endl; + + // skip important deps if the package is already installed + if (Pkg->CurrentVer != 0 && Start.IsCritical() == false + && !isNewImportantDep && !ForceImportantDeps) continue; /* If we are in an or group locate the first or that can @@ -680,7 +920,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, /* This bit is for processing the possibilty of an install/upgrade fixing the problem */ SPtrArray<Version *> List = Start.AllTargets(); - if ((DepState[Start->ID] & DepCVer) == DepCVer) + if (Start->Type != Dep::DpkgBreaks && + (DepState[Start->ID] & DepCVer) == DepCVer) { // Right, find the best version to install.. Version **Cur = List; @@ -711,33 +952,49 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, } } - if (InstPkg.end() == false) + if (InstPkg.end() == false) { if(_config->FindB("Debug::pkgDepCache::AutoInstall",false) == true) std::clog << "Installing " << InstPkg.Name() << " as dep of " << Pkg.Name() << std::endl; - MarkInstall(InstPkg,true,Depth + 1); - // Set the autoflag, after MarkInstall because MarkInstall unsets it - if (P->CurrentVer == 0) - PkgState[InstPkg->ID].Flags |= Flag::Auto; + // now check if we should consider it a automatic dependency or not + string sec = _config->Find("APT::Never-MarkAuto-Section",""); + if(Pkg.Section() && (string(Pkg.Section()) == sec)) + { + if(_config->FindB("Debug::pkgDepCache::AutoInstall",false) == true) + std::clog << "Setting NOT as auto-installed because its a direct dep of a package in section " << sec << std::endl; + MarkInstall(InstPkg,true,Depth + 1, true, ForceImportantDeps); + } + else + { + // mark automatic dependency + MarkInstall(InstPkg,true,Depth + 1, false, ForceImportantDeps); + // Set the autoflag, after MarkInstall because MarkInstall unsets it + if (P->CurrentVer == 0) + PkgState[InstPkg->ID].Flags |= Flag::Auto; + } } - continue; } - + /* For conflicts we just de-install the package and mark as auto, - Conflicts may not have or groups */ - if (Start->Type == Dep::Conflicts || Start->Type == Dep::Obsoletes) + Conflicts may not have or groups. For dpkg's Breaks we try to + upgrade the package. */ + if (Start->Type == Dep::Conflicts || Start->Type == Dep::Obsoletes || + Start->Type == Dep::DpkgBreaks) { for (Version **I = List; *I != 0; I++) { VerIterator Ver(*this,*I); PkgIterator Pkg = Ver.ParentPkg(); - - MarkDelete(Pkg); - PkgState[Pkg->ID].Flags |= Flag::Auto; + + if (Start->Type != Dep::DpkgBreaks) + MarkDelete(Pkg); + else + if (PkgState[Pkg->ID].CandidateVer != *I) + MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps); } continue; } @@ -749,6 +1006,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, /* */ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To) { + ActionGroup group(*this); + RemoveSizes(Pkg); RemoveStates(Pkg); @@ -767,9 +1026,11 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To) /* */ void pkgDepCache::SetCandidateVersion(VerIterator TargetVer) { + ActionGroup group(*this); + pkgCache::PkgIterator Pkg = TargetVer.ParentPkg(); StateCache &P = PkgState[Pkg->ID]; - + RemoveSizes(Pkg); RemoveStates(Pkg); @@ -782,6 +1043,18 @@ void pkgDepCache::SetCandidateVersion(VerIterator TargetVer) Update(Pkg); AddSizes(Pkg); } + +void pkgDepCache::MarkAuto(const PkgIterator &Pkg, bool Auto) +{ + StateCache &state = PkgState[Pkg->ID]; + + ActionGroup group(*this); + + if(Auto) + state.Flags |= Flag::Auto; + else + state.Flags &= ~Flag::Auto; +} /*}}}*/ // StateCache::Update - Compute the various static display things /*{{{*/ // --------------------------------------------------------------------- @@ -864,11 +1137,251 @@ pkgCache::VerIterator pkgDepCache::Policy::GetCandidateVer(PkgIterator Pkg) return Last; } /*}}}*/ + /*}}}*/ + +pkgDepCache::DefaultRootSetFunc::DefaultRootSetFunc() + : constructedSuccessfully(false) +{ + Configuration::Item const *Opts; + Opts = _config->Tree("APT::NeverAutoRemove"); + if (Opts != 0 && Opts->Child != 0) + { + Opts = Opts->Child; + for (; Opts != 0; Opts = Opts->Next) + { + if (Opts->Value.empty() == true) + continue; + + regex_t *p = new regex_t; + if(regcomp(p,Opts->Value.c_str(), + REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0) + { + regfree(p); + delete p; + _error->Error("Regex compilation error for APT::NeverAutoRemove"); + return; + } + + rootSetRegexp.push_back(p); + } + } + + constructedSuccessfully = true; +} + +pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc() +{ + for(unsigned int i = 0; i < rootSetRegexp.size(); i++) + { + regfree(rootSetRegexp[i]); + delete rootSetRegexp[i]; + } +} + + +bool pkgDepCache::DefaultRootSetFunc::InRootSet(const pkgCache::PkgIterator &pkg) +{ + for(unsigned int i = 0; i < rootSetRegexp.size(); i++) + if (regexec(rootSetRegexp[i], pkg.Name(), 0, 0, 0) == 0) + return true; + + return false; +} + +pkgDepCache::InRootSetFunc *pkgDepCache::GetRootSetFunc() +{ + DefaultRootSetFunc *f = new DefaultRootSetFunc; + if(f->wasConstructedSuccessfully()) + return f; + else + { + delete f; + return NULL; + } +} + +bool pkgDepCache::MarkFollowsRecommends() +{ + return _config->FindB("APT::AutoRemove::RecommendsImportant", true); +} + +bool pkgDepCache::MarkFollowsSuggests() +{ + return _config->FindB("APT::AutoRemove::SuggestsImportant", false); +} + +// the main mark algorithm +bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc) +{ + bool follow_recommends; + bool follow_suggests; + + // init the states + for(PkgIterator p = PkgBegin(); !p.end(); ++p) + { + PkgState[p->ID].Marked = false; + PkgState[p->ID].Garbage = false; + + // debug output + if(_config->FindB("Debug::pkgAutoRemove",false) + && PkgState[p->ID].Flags & Flag::Auto) + std::clog << "AutoDep: " << p.Name() << std::endl; + } + + // init vars + follow_recommends = MarkFollowsRecommends(); + follow_suggests = MarkFollowsSuggests(); + + + + // do the mark part, this is the core bit of the algorithm + for(PkgIterator p = PkgBegin(); !p.end(); ++p) + { + if(!(PkgState[p->ID].Flags & Flag::Auto) || + (p->Flags & Flag::Essential) || + userFunc.InRootSet(p)) + + { + // the package is installed (and set to keep) + if(PkgState[p->ID].Keep() && !p.CurrentVer().end()) + MarkPackage(p, p.CurrentVer(), + follow_recommends, follow_suggests); + // the package is to be installed + else if(PkgState[p->ID].Install()) + MarkPackage(p, PkgState[p->ID].InstVerIter(*this), + follow_recommends, follow_suggests); + } + } + + return true; +} + +// mark a single package in Mark-and-Sweep +void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &pkg, + const pkgCache::VerIterator &ver, + bool follow_recommends, + bool follow_suggests) +{ + pkgDepCache::StateCache &state = PkgState[pkg->ID]; + VerIterator candver = state.CandidateVerIter(*this); + VerIterator instver = state.InstVerIter(*this); + +#if 0 + // If a package was garbage-collected but is now being marked, we + // should re-select it + // For cases when a pkg is set to upgrade and this trigger the + // removal of a no-longer used dependency. if the pkg is set to + // keep again later it will result in broken deps + if(state.Delete() && state.RemoveReason = Unused) + { + if(ver==candver) + mark_install(pkg, false, false, NULL); + else if(ver==pkg.CurrentVer()) + MarkKeep(pkg, false, false); + + instver=state.InstVerIter(*this); + } +#endif + + // Ignore versions other than the InstVer, and ignore packages + // that are already going to be removed or just left uninstalled. + if(!(ver == instver && !instver.end())) + return; + + // if we are marked already we are done + if(state.Marked) + return; + + //std::cout << "Setting Marked for: " << pkg.Name() << std::endl; + state.Marked=true; + + if(!ver.end()) + { + for(DepIterator d = ver.DependsList(); !d.end(); ++d) + { + if(d->Type == Dep::Depends || + d->Type == Dep::PreDepends || + (follow_recommends && + d->Type == Dep::Recommends) || + (follow_suggests && + d->Type == Dep::Suggests)) + { + // Try all versions of this package. + for(VerIterator V = d.TargetPkg().VersionList(); + !V.end(); ++V) + { + if(_system->VS->CheckDep(V.VerStr(), d->CompareOp, d.TargetVer())) + { + MarkPackage(V.ParentPkg(), V, + follow_recommends, follow_suggests); + } + } + // Now try virtual packages + for(PrvIterator prv=d.TargetPkg().ProvidesList(); + !prv.end(); ++prv) + { + if(_system->VS->CheckDep(prv.ProvideVersion(), d->CompareOp, + d.TargetVer())) + { + MarkPackage(prv.OwnerPkg(), prv.OwnerVer(), + follow_recommends, follow_suggests); + } + } + } + } + } +} + +bool pkgDepCache::Sweep() +{ + // do the sweep + for(PkgIterator p=PkgBegin(); !p.end(); ++p) + { + StateCache &state=PkgState[p->ID]; + + // skip required packages + if (!p.CurrentVer().end() && + (p.CurrentVer()->Priority == pkgCache::State::Required)) + continue; + + // if it is not marked and it is installed, it's garbage + if(!state.Marked && (!p.CurrentVer().end() || state.Install())) + { + state.Garbage=true; + if(_config->FindB("Debug::pkgAutoRemove",false)) + std::cout << "Garbage: " << p.Name() << std::endl; + } + } + + return true; +} + // Policy::IsImportantDep - True if the dependency is important /*{{{*/ // --------------------------------------------------------------------- /* */ bool pkgDepCache::Policy::IsImportantDep(DepIterator Dep) { - return Dep.IsCritical(); + if(Dep.IsCritical()) + return true; + else if(Dep->Type == pkgCache::Dep::Recommends) + { + if ( _config->FindB("APT::Install-Recommends", false)) + return true; + // we suport a special mode to only install-recommends for certain + // sections + // FIXME: this is a meant as a temporarly solution until the + // recommends are cleaned up + string s = _config->Find("APT::Install-Recommends-Section",""); + if(s.size() > 0) + { + const char *sec = Dep.ParentVer().Section(); + if (sec && strcmp(sec, s.c_str()) == 0) + return true; + } + } + else if(Dep->Type == pkgCache::Dep::Suggests) + return _config->FindB("APT::Install-Suggests", false); + + return false; } /*}}}*/ diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 6d51920e9..8f759d345 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -1,4 +1,4 @@ -// -*- mode: cpp; mode: fold -*- +// -*- mode: c++; mode: fold -*- // Description /*{{{*/ // $Id: depcache.h,v 1.14 2001/02/20 07:03:17 jgg Exp $ /* ###################################################################### @@ -45,9 +45,71 @@ #include <apt-pkg/pkgcache.h> #include <apt-pkg/progress.h> +#include <regex.h> + +#include <vector> + class pkgDepCache : protected pkgCache::Namespace { public: + + /** \brief An arbitrary predicate on packages. */ + class InRootSetFunc + { + public: + virtual bool InRootSet(const pkgCache::PkgIterator &pkg) {return false;}; + virtual ~InRootSetFunc() {}; + }; + + private: + /** \brief Mark a single package and all its unmarked important + * dependencies during mark-and-sweep. + * + * Recursively invokes itself to mark all dependencies of the + * package. + * + * \param pkg The package to mark. + * + * \param ver The version of the package that is to be marked. + * + * \param follow_recommends If \b true, recommendations of the + * package will be recursively marked. + * + * \param follow_suggests If \b true, suggestions of the package + * will be recursively marked. + */ + void MarkPackage(const pkgCache::PkgIterator &pkg, + const pkgCache::VerIterator &ver, + bool follow_recommends, + bool follow_suggests); + + /** \brief Update the Marked field of all packages. + * + * Each package's StateCache::Marked field will be set to \b true + * if and only if it can be reached from the root set. By + * default, the root set consists of the set of manually installed + * or essential packages, but it can be extended using the + * parameter #rootFunc. + * + * \param rootFunc A callback that can be used to add extra + * packages to the root set. + * + * \return \b false if an error occured. + */ + bool MarkRequired(InRootSetFunc &rootFunc); + + /** \brief Set the StateCache::Garbage flag on all packages that + * should be removed. + * + * Packages that were not marked by the last call to #MarkRequired + * are tested to see whether they are actually garbage. If so, + * they are marked as such. + * + * \return \b false if an error occured. + */ + bool Sweep(); + + public: // These flags are used in DepState enum DepFlags {DepNow = (1 << 0),DepInstall = (1 << 1),DepCVer = (1 << 2), @@ -63,6 +125,84 @@ class pkgDepCache : protected pkgCache::Namespace enum VersionTypes {NowVersion, InstallVersion, CandidateVersion}; enum ModeList {ModeDelete = 0, ModeKeep = 1, ModeInstall = 2}; + + /** \brief Represents an active action group. + * + * An action group is a group of actions that are currently being + * performed. While an active group is active, certain routine + * clean-up actions that would normally be performed after every + * cache operation are delayed until the action group is + * completed. This is necessary primarily to avoid inefficiencies + * when modifying a large number of packages at once. + * + * This class represents an active action group. Creating an + * instance will create an action group; destroying one will + * destroy the corresponding action group. + * + * The following operations are suppressed by this class: + * + * - Keeping the Marked and Garbage flags up to date. + * + * \note This can be used in the future to easily accumulate + * atomic actions for undo or to display "what apt did anyway"; + * e.g., change the counter of how many action groups are active + * to a std::set of pointers to them and use those to store + * information about what happened in a group in the group. + */ + class ActionGroup + { + pkgDepCache &cache; + + bool released; + + /** Action groups are noncopyable. */ + ActionGroup(const ActionGroup &other); + public: + /** \brief Create a new ActionGroup. + * + * \param cache The cache that this ActionGroup should + * manipulate. + * + * As long as this object exists, no automatic cleanup + * operations will be undertaken. + */ + ActionGroup(pkgDepCache &cache); + + /** \brief Clean up the action group before it is destroyed. + * + * If it is destroyed later, no second cleanup wil be run. + */ + void release(); + + /** \brief Destroy the action group. + * + * If this is the last action group, the automatic cache + * cleanup operations will be undertaken. + */ + ~ActionGroup(); + }; + + /** \brief Returns \b true for packages matching a regular + * expression in APT::NeverAutoRemove. + */ + class DefaultRootSetFunc : public InRootSetFunc + { + std::vector<regex_t *> rootSetRegexp; + bool constructedSuccessfully; + + public: + DefaultRootSetFunc(); + ~DefaultRootSetFunc(); + + /** \return \b true if the class initialized successfully, \b + * false otherwise. Used to avoid throwing an exception, since + * APT classes generally don't. + */ + bool wasConstructedSuccessfully() const { return constructedSuccessfully; } + + bool InRootSet(const pkgCache::PkgIterator &pkg); + }; + struct StateCache { // Epoch stripped text versions of the two version fields @@ -79,6 +219,17 @@ class pkgDepCache : protected pkgCache::Namespace unsigned short Flags; unsigned short iFlags; // Internal flags + /** \brief \b true if this package can be reached from the root set. */ + bool Marked; + + /** \brief \b true if this package is unused and should be removed. + * + * This differs from !#Marked, because it is possible that some + * unreachable packages will be protected from becoming + * garbage. + */ + bool Garbage; + // Various tree indicators signed char Status; // -1,0,1,2 unsigned char Mode; // ModeList @@ -97,7 +248,9 @@ class pkgDepCache : protected pkgCache::Namespace inline bool Downgrade() const {return Status < 0 && Mode == ModeInstall;}; inline bool Held() const {return Status != 0 && Keep();}; inline bool NowBroken() const {return (DepState & DepNowMin) != DepNowMin;}; + inline bool NowPolicyBroken() const {return (DepState & DepNowPolicy) != DepNowPolicy;}; inline bool InstBroken() const {return (DepState & DepInstMin) != DepInstMin;}; + inline bool InstPolicyBroken() const {return (DepState & DepInstPolicy) != DepInstPolicy;}; inline bool Install() const {return Mode == ModeInstall;}; inline VerIterator InstVerIter(pkgCache &Cache) {return VerIterator(Cache,InstallVer);}; @@ -119,6 +272,14 @@ class pkgDepCache : protected pkgCache::Namespace virtual ~Policy() {}; }; + + private: + /** The number of open "action groups"; certain post-action + * operations are suppressed if this number is > 0. + */ + int group_level; + + friend class ActionGroup; protected: @@ -133,6 +294,7 @@ class pkgDepCache : protected pkgCache::Namespace unsigned long iDelCount; unsigned long iKeepCount; unsigned long iBrokenCount; + unsigned long iPolicyBrokenCount; unsigned long iBadCount; Policy *delLocalPolicy; // For memory clean up.. @@ -182,16 +344,69 @@ class pkgDepCache : protected pkgCache::Namespace inline StateCache &operator [](PkgIterator const &I) {return PkgState[I->ID];}; inline unsigned char &operator [](DepIterator const &I) {return DepState[I->ID];}; - // Manipulators - void MarkKeep(PkgIterator const &Pkg,bool Soft = false); + /** \return A function identifying packages in the root set other + * than manually installed packages and essential packages, or \b + * NULL if an error occurs. + * + * \todo Is this the best place for this function? Perhaps the + * settings for mark-and-sweep should be stored in a single + * external class? + */ + virtual InRootSetFunc *GetRootSetFunc(); + + /** \return \b true if the garbage collector should follow recommendations. + */ + virtual bool MarkFollowsRecommends(); + + /** \return \b true if the garbage collector should follow suggestions. + */ + virtual bool MarkFollowsSuggests(); + + /** \brief Update the Marked and Garbage fields of all packages. + * + * This routine is implicitly invoked after all state manipulators + * and when an ActionGroup is destroyed. It invokes #MarkRequired + * and #Sweep to do its dirty work. + * + * \param rootFunc A predicate that returns \b true for packages + * that should be added to the root set. + */ + bool MarkAndSweep(InRootSetFunc &rootFunc) + { + return MarkRequired(rootFunc) && Sweep(); + } + + bool MarkAndSweep() + { + std::auto_ptr<InRootSetFunc> f(GetRootSetFunc()); + if(f.get() != NULL) + return MarkAndSweep(*f.get()); + else + return false; + } + + /** \name State Manipulators + */ + // @{ + void MarkKeep(PkgIterator const &Pkg, bool Soft = false, + bool FromUser = true); void MarkDelete(PkgIterator const &Pkg,bool Purge = false); void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true, - unsigned long Depth = 0); + unsigned long Depth = 0, bool FromUser = true, + bool ForceImportantDeps = false); void SetReInstall(PkgIterator const &Pkg,bool To); void SetCandidateVersion(VerIterator TargetVer); + + /** Set the "is automatically installed" flag of Pkg. */ + void MarkAuto(const PkgIterator &Pkg, bool Auto); + // @} // This is for debuging void Update(OpProgress *Prog = 0); + + // read persistent states + bool readStateFile(OpProgress *prog); + bool writeStateFile(OpProgress *prog, bool InstalledOnly=false); // Size queries inline double UsrSize() {return iUsrSize;}; @@ -200,6 +415,7 @@ class pkgDepCache : protected pkgCache::Namespace inline unsigned long KeepCount() {return iKeepCount;}; inline unsigned long InstCount() {return iInstCount;}; inline unsigned long BrokenCount() {return iBrokenCount;}; + inline unsigned long PolicyBrokenCount() {return iPolicyBrokenCount;}; inline unsigned long BadCount() {return iBadCount;}; bool Init(OpProgress *Prog); diff --git a/apt-pkg/indexcopy.cc b/apt-pkg/indexcopy.cc index 1f65062f7..c9dded134 100644 --- a/apt-pkg/indexcopy.cc +++ b/apt-pkg/indexcopy.cc @@ -32,6 +32,8 @@ using namespace std; + + // IndexCopy::CopyPackages - Copy the package files from the CD /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -512,10 +514,10 @@ bool SourceCopy::RewriteEntry(FILE *Target,string File) fputc('\n',Target); return true; } - - /*}}}*/ - +// SigVerify::Verify - Verify a files md5sum against its metaindex /*{{{*/ +// --------------------------------------------------------------------- +/* */ bool SigVerify::Verify(string prefix, string file, indexRecords *MetaIndex) { const indexRecords::checkSum *Record = MetaIndex->Lookup(file); @@ -670,3 +672,178 @@ bool SigVerify::CopyAndVerify(string CDROM,string Name,vector<string> &SigList, return true; } + + +bool TranslationsCopy::CopyTranslations(string CDROM,string Name,vector<string> &List, + pkgCdromStatus *log) +{ + OpProgress *Progress = NULL; + if (List.size() == 0) + return true; + + if(log) + Progress = log->GetOpProgress(); + + bool Debug = _config->FindB("Debug::aptcdrom",false); + + // Prepare the progress indicator + unsigned long TotalSize = 0; + for (vector<string>::iterator I = List.begin(); I != List.end(); I++) + { + struct stat Buf; + if (stat(string(*I).c_str(),&Buf) != 0 && + stat(string(*I + ".gz").c_str(),&Buf) != 0) + return _error->Errno("stat","Stat failed for %s", + string(*I).c_str()); + TotalSize += Buf.st_size; + } + + unsigned long CurrentSize = 0; + unsigned int NotFound = 0; + unsigned int WrongSize = 0; + unsigned int Packages = 0; + for (vector<string>::iterator I = List.begin(); I != List.end(); I++) + { + string OrigPath = string(*I,CDROM.length()); + unsigned long FileSize = 0; + + // Open the package file + FileFd Pkg; + if (FileExists(*I) == true) + { + Pkg.Open(*I,FileFd::ReadOnly); + FileSize = Pkg.Size(); + } + else + { + FileFd From(*I + ".gz",FileFd::ReadOnly); + if (_error->PendingError() == true) + return false; + FileSize = From.Size(); + + // Get a temp file + FILE *tmp = tmpfile(); + if (tmp == 0) + return _error->Errno("tmpfile","Unable to create a tmp file"); + Pkg.Fd(dup(fileno(tmp))); + fclose(tmp); + + // Fork gzip + pid_t Process = fork(); + if (Process < 0) + return _error->Errno("fork","Couldn't fork gzip"); + + // The child + if (Process == 0) + { + dup2(From.Fd(),STDIN_FILENO); + dup2(Pkg.Fd(),STDOUT_FILENO); + SetCloseExec(STDIN_FILENO,false); + SetCloseExec(STDOUT_FILENO,false); + + const char *Args[3]; + string Tmp = _config->Find("Dir::bin::gzip","gzip"); + Args[0] = Tmp.c_str(); + Args[1] = "-d"; + Args[2] = 0; + execvp(Args[0],(char **)Args); + exit(100); + } + + // Wait for gzip to finish + if (ExecWait(Process,_config->Find("Dir::bin::gzip","gzip").c_str(),false) == false) + return _error->Error("gzip failed, perhaps the disk is full."); + + Pkg.Seek(0); + } + pkgTagFile Parser(&Pkg); + if (_error->PendingError() == true) + return false; + + // Open the output file + char S[400]; + snprintf(S,sizeof(S),"cdrom:[%s]/%s",Name.c_str(), + (*I).c_str() + CDROM.length()); + string TargetF = _config->FindDir("Dir::State::lists") + "partial/"; + TargetF += URItoFileName(S); + if (_config->FindB("APT::CDROM::NoAct",false) == true) + TargetF = "/dev/null"; + FileFd Target(TargetF,FileFd::WriteEmpty); + FILE *TargetFl = fdopen(dup(Target.Fd()),"w"); + if (_error->PendingError() == true) + return false; + if (TargetFl == 0) + return _error->Errno("fdopen","Failed to reopen fd"); + + // Setup the progress meter + if(Progress) + Progress->OverallProgress(CurrentSize,TotalSize,FileSize, + string("Reading Translation Indexes")); + + // Parse + if(Progress) + Progress->SubProgress(Pkg.Size()); + pkgTagSection Section; + this->Section = &Section; + string Prefix; + unsigned long Hits = 0; + unsigned long Chop = 0; + while (Parser.Step(Section) == true) + { + if(Progress) + Progress->Progress(Parser.Offset()); + + const char *Start; + const char *Stop; + Section.GetSection(Start,Stop); + fwrite(Start,Stop-Start, 1, TargetFl); + fputc('\n',TargetFl); + + Packages++; + Hits++; + } + fclose(TargetFl); + + if (Debug == true) + cout << " Processed by using Prefix '" << Prefix << "' and chop " << Chop << endl; + + if (_config->FindB("APT::CDROM::NoAct",false) == false) + { + // Move out of the partial directory + Target.Close(); + string FinalF = _config->FindDir("Dir::State::lists"); + FinalF += URItoFileName(S); + if (rename(TargetF.c_str(),FinalF.c_str()) != 0) + return _error->Errno("rename","Failed to rename"); + } + + + CurrentSize += FileSize; + } + if(Progress) + Progress->Done(); + + // Some stats + if(log) { + stringstream msg; + if(NotFound == 0 && WrongSize == 0) + ioprintf(msg, _("Wrote %i records.\n"), Packages); + else if (NotFound != 0 && WrongSize == 0) + ioprintf(msg, _("Wrote %i records with %i missing files.\n"), + Packages, NotFound); + else if (NotFound == 0 && WrongSize != 0) + ioprintf(msg, _("Wrote %i records with %i mismatched files\n"), + Packages, WrongSize); + if (NotFound != 0 && WrongSize != 0) + ioprintf(msg, _("Wrote %i records with %i missing files and %i mismatched files\n"), Packages, NotFound, WrongSize); + } + + if (Packages == 0) + _error->Warning("No valid records were found."); + + if (NotFound + WrongSize > 10) + _error->Warning("Alot of entries were discarded, something may be wrong.\n"); + + + return true; +} diff --git a/apt-pkg/indexcopy.h b/apt-pkg/indexcopy.h index 4dcb2b46d..7778ae595 100644 --- a/apt-pkg/indexcopy.h +++ b/apt-pkg/indexcopy.h @@ -70,6 +70,17 @@ class SourceCopy : public IndexCopy public: }; +class TranslationsCopy +{ + protected: + pkgTagSection *Section; + + public: + bool CopyTranslations(string CDROM,string Name,vector<string> &List, + pkgCdromStatus *log); +}; + + class SigVerify { bool Verify(string prefix,string file, indexRecords *records); @@ -81,4 +92,6 @@ class SigVerify vector<string> PkgList,vector<string> SrcList); }; + + #endif diff --git a/apt-pkg/indexfile.cc b/apt-pkg/indexfile.cc index 49665161d..fad38772b 100644 --- a/apt-pkg/indexfile.cc +++ b/apt-pkg/indexfile.cc @@ -12,8 +12,11 @@ #pragma implementation "apt-pkg/indexfile.h" #endif +#include <apt-pkg/configuration.h> #include <apt-pkg/indexfile.h> #include <apt-pkg/error.h> + +#include <clocale> /*}}}*/ // Global list of Item supported @@ -67,3 +70,63 @@ string pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const &Record, return string(); } /*}}}*/ +// IndexFile::TranslationsAvailable - Check if will use Translation /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgIndexFile::TranslationsAvailable() +{ + const string Translation = _config->Find("APT::Acquire::Translation", "environment"); + + if (Translation.compare("none") != 0) + return CheckLanguageCode(LanguageCode().c_str()); + else + return false; +} + /*}}}*/ +// IndexFile::CheckLanguageCode - Check the Language Code /*{{{*/ +// --------------------------------------------------------------------- +/* */ +/* common cases: de_DE, de_DE@euro, de_DE.UTF-8, de_DE.UTF-8@euro, + de_DE.ISO8859-1, tig_ER + more in /etc/gdm/locale.conf +*/ + +bool pkgIndexFile::CheckLanguageCode(const char *Lang) +{ + if (strlen(Lang) == 2 || (strlen(Lang) == 5 && Lang[2] == '_')) + return true; + + if (strcmp(Lang,"C") != 0) + _error->Warning("Wrong language code %s", Lang); + + return false; +} + /*}}}*/ +// IndexFile::LanguageCode - Return the Language Code /*{{{*/ +// --------------------------------------------------------------------- +/* return the language code */ +string pkgIndexFile::LanguageCode() +{ + const string Translation = _config->Find("APT::Acquire::Translation", "environment"); + + if (Translation.compare("environment") == 0) + { + string lang = std::setlocale(LC_MESSAGES,NULL); + + // we have a mapping of the language codes that contains all the language + // codes that need the country code as well + // (like pt_BR, pt_PT, sv_SE, zh_*, en_*) + char *need_full_langcode[] = { "pt","sv","zh","en", NULL }; + for(char **s = need_full_langcode;*s != NULL; s++) + if(lang.find(*s) == 0) + return lang.substr(0,5); + + if(lang.size() > 2) + return lang.substr(0,2); + else + return lang; + } + else + return Translation; +} + /*}}}*/ diff --git a/apt-pkg/indexfile.h b/apt-pkg/indexfile.h index 61049f4bd..d5d1cf57a 100644 --- a/apt-pkg/indexfile.h +++ b/apt-pkg/indexfile.h @@ -5,10 +5,11 @@ Index File - Abstraction for an index of archive/source file. - There are 3 primary sorts of index files, all represented by this + There are 4 primary sorts of index files, all represented by this class: Binary index files + Binary translation files Bianry index files decribing the local system Source index files @@ -80,6 +81,10 @@ class pkgIndexFile virtual bool MergeFileProvides(pkgCacheGenerator &/*Gen*/,OpProgress &/*Prog*/) const {return true;}; virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const; + static bool TranslationsAvailable(); + static bool CheckLanguageCode(const char *Lang); + static string LanguageCode(); + bool IsTrusted() const { return Trusted; }; pkgIndexFile(bool Trusted): Trusted(Trusted) {}; diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index b47378d4a..f58855792 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -40,6 +40,8 @@ bool pkgInitConfig(Configuration &Cnf) else Cnf.Set("APT::Architecture",COMMON_OS "-" COMMON_CPU); Cnf.Set("APT::Build-Essential::", "build-essential"); + Cnf.Set("APT::Install-Recommends", false); + Cnf.Set("APT::Install-Suggests", false); Cnf.Set("Dir","/"); // State @@ -54,6 +56,7 @@ bool pkgInitConfig(Configuration &Cnf) Cnf.Set("Dir::State::lists","lists/"); Cnf.Set("Dir::State::cdroms","cdroms.list"); + Cnf.Set("Dir::State::mirrors","mirrors/"); // Cache Cnf.Set("Dir::Cache","var/cache/apt/"); @@ -102,7 +105,7 @@ bool pkgInitConfig(Configuration &Cnf) bindtextdomain(textdomain(0),Cnf.FindDir("Dir::Locale").c_str()); } #endif - + return true; } /*}}}*/ diff --git a/apt-pkg/init.h b/apt-pkg/init.h index b584b2cce..905173a7a 100644 --- a/apt-pkg/init.h +++ b/apt-pkg/init.h @@ -18,7 +18,7 @@ // See the makefile #define APT_PKG_MAJOR 3 -#define APT_PKG_MINOR 12 +#define APT_PKG_MINOR 53 #define APT_PKG_RELEASE 0 extern const char *pkgVersion; diff --git a/apt-pkg/makefile b/apt-pkg/makefile index c493d3dd9..d36747d85 100644 --- a/apt-pkg/makefile +++ b/apt-pkg/makefile @@ -13,7 +13,7 @@ include ../buildlib/defaults.mak # methods/makefile - FIXME LIBRARY=apt-pkg LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER) -MAJOR=3.12 +MAJOR=3.53 MINOR=0 SLIBS=$(PTHREADLIB) $(INTLLIBS) APT_DOMAIN:=libapt-pkg$(MAJOR) diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc index 8d3a97983..61d8d914e 100644 --- a/apt-pkg/orderlist.cc +++ b/apt-pkg/orderlist.cc @@ -491,11 +491,13 @@ bool pkgOrderList::VisitProvides(DepIterator D,bool Critical) continue; if (D->Type != pkgCache::Dep::Conflicts && + D->Type != pkgCache::Dep::DpkgBreaks && D->Type != pkgCache::Dep::Obsoletes && Cache[Pkg].InstallVer != *I) continue; if ((D->Type == pkgCache::Dep::Conflicts || + D->Type == pkgCache::Dep::DpkgBreaks || D->Type == pkgCache::Dep::Obsoletes) && (Version *)Pkg.CurrentVer() != *I) continue; @@ -630,6 +632,7 @@ bool pkgOrderList::DepUnPackCrit(DepIterator D) /* Forward critical dependencies MUST be correct before the package can be unpacked. */ if (D->Type != pkgCache::Dep::Conflicts && + D->Type != pkgCache::Dep::DpkgBreaks && D->Type != pkgCache::Dep::Obsoletes && D->Type != pkgCache::Dep::PreDepends) continue; @@ -668,7 +671,7 @@ bool pkgOrderList::DepUnPackCrit(DepIterator D) } return true; } - /*}}}*/ + // OrderList::DepUnPackPreD - Critical UnPacking ordering with depends /*{{{*/ // --------------------------------------------------------------------- /* Critical PreDepends (also configure immediate and essential) strives to @@ -803,9 +806,20 @@ bool pkgOrderList::DepUnPackDep(DepIterator D) return false; } else + { if (D->Type == pkgCache::Dep::Depends) if (VisitProvides(D,false) == false) return false; + + if (D->Type == pkgCache::Dep::DpkgBreaks) + { + if (CheckDep(D) == true) + continue; + + if (VisitNode(D.TargetPkg()) == false) + return false; + } + } } return true; } @@ -953,6 +967,7 @@ bool pkgOrderList::CheckDep(DepIterator D) /* Conflicts requires that all versions are not present, depends just needs one */ if (D->Type != pkgCache::Dep::Conflicts && + D->Type != pkgCache::Dep::DpkgBreaks && D->Type != pkgCache::Dep::Obsoletes) { /* Try to find something that does not have the after flag set diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index 4b3dd8be2..1e57d6455 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -95,9 +95,10 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources, be downloaded. */ bool pkgPackageManager::FixMissing() { + pkgDepCache::ActionGroup group(Cache); pkgProblemResolver Resolve(&Cache); List->SetFileList(FileNames); - + bool Bad = false; for (PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) { @@ -106,7 +107,7 @@ bool pkgPackageManager::FixMissing() // Okay, this file is missing and we need it. Mark it for keep Bad = true; - Cache.MarkKeep(I); + Cache.MarkKeep(I, false, false); } // We have to empty the list otherwise it will not have the new changes @@ -631,14 +632,11 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() // --------------------------------------------------------------------- /* This uses the filenames in FileNames and the information in the DepCache to perform the installation of packages.*/ -pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int status_fd) +pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd) { - OrderResult Res = OrderInstall(); - if(Debug) - std::clog << "OrderInstall() returned: " << Res << std::endl; - if (Res != Failed) - if (Go(status_fd) == false) - return Failed; - return Res; + if(DoInstallPreFork() == Failed) + return Failed; + + return DoInstallPostFork(statusFd); } /*}}}*/ diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h index f64637d03..48f53576c 100644 --- a/apt-pkg/packagemanager.h +++ b/apt-pkg/packagemanager.h @@ -28,7 +28,9 @@ #endif #include <string> +#include <iostream> #include <apt-pkg/pkgcache.h> +#include <apt-pkg/depcache.h> using std::string; @@ -70,13 +72,39 @@ class pkgPackageManager : protected pkgCache::Namespace virtual bool Remove(PkgIterator /*Pkg*/,bool /*Purge*/=false) {return false;}; virtual bool Go(int statusFd=-1) {return true;}; virtual void Reset() {}; - + + // the result of the operation + OrderResult Res; + public: // Main action members bool GetArchives(pkgAcquire *Owner,pkgSourceList *Sources, pkgRecords *Recs); - OrderResult DoInstall(int statusFd=-1); + + // Do the installation + OrderResult DoInstall(int statusFd=-1); + + // stuff that needs to be done before the fork() of a library that + // uses apt + OrderResult DoInstallPreFork() { + Res = OrderInstall(); + return Res; + }; + + // stuff that needs to be done after the fork + OrderResult DoInstallPostFork(int statusFd=-1) { + bool goResult = Go(statusFd); + if(goResult == false) + return Failed; + + // if all was fine update the state file + if(Res == Completed) { + Cache.writeStateFile(NULL); + } + return Res; + }; + bool FixMissing(); pkgPackageManager(pkgDepCache *Cache); diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc index 9926befe9..93ad56641 100644 --- a/apt-pkg/pkgcache.cc +++ b/apt-pkg/pkgcache.cc @@ -26,6 +26,7 @@ #endif #include <apt-pkg/pkgcache.h> +#include <apt-pkg/indexfile.h> #include <apt-pkg/version.h> #include <apt-pkg/error.h> #include <apt-pkg/strutl.h> @@ -43,6 +44,7 @@ using std::string; + // Cache::Header::Header - Constructor /*{{{*/ // --------------------------------------------------------------------- /* Simply initialize the header */ @@ -52,7 +54,7 @@ pkgCache::Header::Header() /* Whenever the structures change the major version should be bumped, whenever the generator changes the minor version should be bumped. */ - MajorVersion = 4; + MajorVersion = 6; MinorVersion = 0; Dirty = false; @@ -60,17 +62,22 @@ pkgCache::Header::Header() PackageSz = sizeof(pkgCache::Package); PackageFileSz = sizeof(pkgCache::PackageFile); VersionSz = sizeof(pkgCache::Version); + DescriptionSz = sizeof(pkgCache::Description); DependencySz = sizeof(pkgCache::Dependency); ProvidesSz = sizeof(pkgCache::Provides); VerFileSz = sizeof(pkgCache::VerFile); + DescFileSz = sizeof(pkgCache::DescFile); PackageCount = 0; VersionCount = 0; + DescriptionCount = 0; DependsCount = 0; PackageFileCount = 0; VerFileCount = 0; + DescFileCount = 0; ProvidesCount = 0; MaxVerFileSize = 0; + MaxDescFileSize = 0; FileList = 0; StringList = 0; @@ -89,8 +96,10 @@ bool pkgCache::Header::CheckSizes(Header &Against) const PackageSz == Against.PackageSz && PackageFileSz == Against.PackageFileSz && VersionSz == Against.VersionSz && + DescriptionSz == Against.DescriptionSz && DependencySz == Against.DependencySz && VerFileSz == Against.VerFileSz && + DescFileSz == Against.DescFileSz && ProvidesSz == Against.ProvidesSz) return true; return false; @@ -115,8 +124,10 @@ bool pkgCache::ReMap() HeaderP = (Header *)Map.Data(); PkgP = (Package *)Map.Data(); VerFileP = (VerFile *)Map.Data(); + DescFileP = (DescFile *)Map.Data(); PkgFileP = (PackageFile *)Map.Data(); VerP = (Version *)Map.Data(); + DescP = (Description *)Map.Data(); ProvideP = (Provides *)Map.Data(); DepP = (Dependency *)Map.Data(); StringItemP = (StringItem *)Map.Data(); @@ -217,8 +228,8 @@ const char *pkgCache::DepType(unsigned char Type) { const char *Types[] = {"",_("Depends"),_("PreDepends"),_("Suggests"), _("Recommends"),_("Conflicts"),_("Replaces"), - _("Obsoletes")}; - if (Type < 8) + _("Obsoletes"),_("Breaks")}; + if (Type < sizeof(Types)/sizeof(*Types)) return Types[Type]; return ""; } @@ -235,11 +246,11 @@ const char *pkgCache::Priority(unsigned char Prio) return 0; } /*}}}*/ - // Bases for iterator classes /*{{{*/ void pkgCache::VerIterator::_dummy() {} void pkgCache::DepIterator::_dummy() {} void pkgCache::PrvIterator::_dummy() {} +void pkgCache::DescIterator::_dummy() {} /*}}}*/ // PkgIterator::operator ++ - Postfix incr /*{{{*/ // --------------------------------------------------------------------- @@ -281,10 +292,11 @@ pkgCache::PkgIterator::OkState pkgCache::PkgIterator::State() const // DepIterator::IsCritical - Returns true if the dep is important /*{{{*/ // --------------------------------------------------------------------- /* Currently critical deps are defined as depends, predepends and - conflicts. */ + conflicts (including dpkg's Breaks fields). */ bool pkgCache::DepIterator::IsCritical() { if (Dep->Type == pkgCache::Dep::Conflicts || + Dep->Type == pkgCache::Dep::DpkgBreaks || Dep->Type == pkgCache::Dep::Obsoletes || Dep->Type == pkgCache::Dep::Depends || Dep->Type == pkgCache::Dep::PreDepends) @@ -370,6 +382,7 @@ pkgCache::Version **pkgCache::DepIterator::AllTargets() continue; if ((Dep->Type == pkgCache::Dep::Conflicts || + Dep->Type == pkgCache::Dep::DpkgBreaks || Dep->Type == pkgCache::Dep::Obsoletes) && ParentPkg() == I.ParentPkg()) continue; @@ -386,6 +399,7 @@ pkgCache::Version **pkgCache::DepIterator::AllTargets() continue; if ((Dep->Type == pkgCache::Dep::Conflicts || + Dep->Type == pkgCache::Dep::DpkgBreaks || Dep->Type == pkgCache::Dep::Obsoletes) && ParentPkg() == I.OwnerPkg()) continue; @@ -599,3 +613,20 @@ string pkgCache::PkgFileIterator::RelStr() return Res; } /*}}}*/ +// VerIterator::TranslatedDescription - Return the a DescIter for locale/*{{{*/ +// --------------------------------------------------------------------- +/* return a DescIter for the current locale or the default if none is + * found + */ +pkgCache::DescIterator pkgCache::VerIterator::TranslatedDescription() const +{ + pkgCache::DescIterator DescDefault = DescriptionList(); + pkgCache::DescIterator Desc = DescDefault; + for (; Desc.end() == false; Desc++) + if (pkgIndexFile::LanguageCode() == Desc.LanguageCode()) + break; + if (Desc.end() == true) Desc = DescDefault; + return Desc; +}; + + /*}}}*/ diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index 587d97534..970759492 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -38,32 +38,42 @@ class pkgCache struct Package; struct PackageFile; struct Version; + struct Description; struct Provides; struct Dependency; struct StringItem; struct VerFile; + struct DescFile; // Iterators class PkgIterator; class VerIterator; + class DescIterator; class DepIterator; class PrvIterator; class PkgFileIterator; class VerFileIterator; + class DescFileIterator; friend class PkgIterator; friend class VerIterator; + friend class DescInterator; friend class DepIterator; friend class PrvIterator; friend class PkgFileIterator; friend class VerFileIterator; + friend class DescFileIterator; class Namespace; // These are all the constants used in the cache structures + + // WARNING - if you change these lists you must also edit + // the stringification in pkgcache.cc and also consider whether + // the cache file will become incompatible. struct Dep { enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4, - Conflicts=5,Replaces=6,Obsoletes=7}; + Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8}; enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3, Greater=0x4,Equals=0x5,NotEquals=0x6}; }; @@ -98,8 +108,10 @@ class pkgCache Header *HeaderP; Package *PkgP; VerFile *VerFileP; + DescFile *DescFileP; PackageFile *PkgFileP; Version *VerP; + Description *DescP; Provides *ProvideP; Dependency *DepP; StringItem *StringItemP; @@ -151,16 +163,20 @@ struct pkgCache::Header unsigned short PackageSz; unsigned short PackageFileSz; unsigned short VersionSz; + unsigned short DescriptionSz; unsigned short DependencySz; unsigned short ProvidesSz; unsigned short VerFileSz; + unsigned short DescFileSz; // Structure counts unsigned long PackageCount; unsigned long VersionCount; + unsigned long DescriptionCount; unsigned long DependsCount; unsigned long PackageFileCount; unsigned long VerFileCount; + unsigned long DescFileCount; unsigned long ProvidesCount; // Offsets @@ -169,10 +185,11 @@ struct pkgCache::Header map_ptrloc VerSysName; // StringTable map_ptrloc Architecture; // StringTable unsigned long MaxVerFileSize; + unsigned long MaxDescFileSize; /* Allocation pools, there should be one of these for each structure excluding the header */ - DynamicMMap::Pool Pools[7]; + DynamicMMap::Pool Pools[8]; // Rapid package name lookup map_ptrloc HashTable[2*1048]; @@ -193,7 +210,7 @@ struct pkgCache::Package map_ptrloc NextPackage; // Package map_ptrloc RevDepends; // Dependency map_ptrloc ProvidesList; // Provides - + // Install/Remove/Purge etc unsigned char SelectedState; // What unsigned char InstState; // Flags @@ -232,6 +249,14 @@ struct pkgCache::VerFile unsigned short Size; }; +struct pkgCache::DescFile +{ + map_ptrloc File; // PackageFile + map_ptrloc NextFile; // PkgVerFile + map_ptrloc Offset; // File offset + unsigned short Size; +}; + struct pkgCache::Version { map_ptrloc VerStr; // Stringtable @@ -241,6 +266,7 @@ struct pkgCache::Version // Lists map_ptrloc FileList; // VerFile map_ptrloc NextVer; // Version + map_ptrloc DescriptionList; // Description map_ptrloc DependsList; // Dependency map_ptrloc ParentPkg; // Package map_ptrloc ProvidesList; // Provides @@ -252,6 +278,22 @@ struct pkgCache::Version unsigned char Priority; }; +struct pkgCache::Description +{ + // Language Code store the description translation language code. If + // the value has a 0 lenght then this is readed using the Package + // file else the Translation-CODE are used. + map_ptrloc language_code; // StringTable + map_ptrloc md5sum; // StringTable + + // Linked list + map_ptrloc FileList; // DescFile + map_ptrloc NextDesc; // Description + map_ptrloc ParentPkg; // Package + + unsigned short ID; +}; + struct pkgCache::Dependency { map_ptrloc Version; // Stringtable @@ -299,11 +341,13 @@ class pkgCache::Namespace typedef pkgCache::PkgIterator PkgIterator; typedef pkgCache::VerIterator VerIterator; + typedef pkgCache::DescIterator DescIterator; typedef pkgCache::DepIterator DepIterator; typedef pkgCache::PrvIterator PrvIterator; typedef pkgCache::PkgFileIterator PkgFileIterator; typedef pkgCache::VerFileIterator VerFileIterator; typedef pkgCache::Version Version; + typedef pkgCache::Description Description; typedef pkgCache::Package Package; typedef pkgCache::Header Header; typedef pkgCache::Dep Dep; diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index de854bee5..8ec6a1719 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -26,6 +26,8 @@ #include <apt-pkg/sptr.h> #include <apt-pkg/pkgsystem.h> +#include <apt-pkg/tagfile.h> + #include <apti18n.h> #include <vector> @@ -125,16 +127,46 @@ bool pkgCacheGenerator::MergeList(ListParser &List, string Version = List.Version(); if (Version.empty() == true) { + // we first process the package, then the descriptions + // (this has the bonus that we get MMap error when we run out + // of MMap space) if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false) return _error->Error(_("Error occurred while processing %s (UsePackage1)"), PackageName.c_str()); + + // Find the right version to write the description + MD5SumValue CurMd5 = List.Description_md5(); + pkgCache::VerIterator Ver = Pkg.VersionList(); + map_ptrloc *LastVer = &Pkg->VersionList; + + for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++) + { + pkgCache::DescIterator Desc = Ver.DescriptionList(); + map_ptrloc *LastDesc = &Ver->DescriptionList; + + for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++) + { + + if (MD5SumValue(Desc.md5()) == CurMd5) + { + // Add new description + *LastDesc = NewDescription(Desc, List.DescriptionLanguage(), CurMd5, *LastDesc); + Desc->ParentPkg = Pkg.Index(); + + if (NewFileDesc(Desc,List) == false) + return _error->Error(_("Error occured while processing %s (NewFileDesc1)"),PackageName.c_str()); + break; + } + } + } + continue; } pkgCache::VerIterator Ver = Pkg.VersionList(); - map_ptrloc *Last = &Pkg->VersionList; + map_ptrloc *LastVer = &Pkg->VersionList; int Res = 1; - for (; Ver.end() == false; Last = &Ver->NextVer, Ver++) + for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++) { Res = Cache.VS->CmpVersion(Version,Ver.VerStr()); if (Res >= 0) @@ -168,7 +200,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List, // Skip to the end of the same version set. if (Res == 0) { - for (; Ver.end() == false; Last = &Ver->NextVer, Ver++) + for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++) { Res = Cache.VS->CmpVersion(Version,Ver.VerStr()); if (Res != 0) @@ -177,9 +209,10 @@ bool pkgCacheGenerator::MergeList(ListParser &List, } // Add a new version - *Last = NewVersion(Ver,Version,*Last); + *LastVer = NewVersion(Ver,Version,*LastVer); Ver->ParentPkg = Pkg.Index(); Ver->Hash = Hash; + if (List.NewVersion(Ver) == false) return _error->Error(_("Error occurred while processing %s (NewVersion1)"), PackageName.c_str()); @@ -199,6 +232,21 @@ bool pkgCacheGenerator::MergeList(ListParser &List, FoundFileDeps |= List.HasFileDeps(); return true; } + + /* Record the Description data. Description data always exist in + Packages and Translation-* files. */ + pkgCache::DescIterator Desc = Ver.DescriptionList(); + map_ptrloc *LastDesc = &Ver->DescriptionList; + + // Skip to the end of description set + for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++); + + // Add new description + *LastDesc = NewDescription(Desc, List.DescriptionLanguage(), List.Description_md5(), *LastDesc); + Desc->ParentPkg = Pkg.Index(); + + if (NewFileDesc(Desc,List) == false) + return _error->Error(_("Error occured while processing %s (NewFileDesc2)"),PackageName.c_str()); } FoundFileDeps |= List.HasFileDeps(); @@ -209,6 +257,9 @@ bool pkgCacheGenerator::MergeList(ListParser &List, if (Cache.HeaderP->VersionCount >= (1ULL<<(sizeof(Cache.VerP->ID)*8))-1) return _error->Error(_("Wow, you exceeded the number of versions " "this APT is capable of.")); + if (Cache.HeaderP->DescriptionCount >= (1ULL<<(sizeof(Cache.DescP->ID)*8))-1) + return _error->Error(_("Wow, you exceeded the number of descriptions " + "this APT is capable of.")); if (Cache.HeaderP->DependsCount >= (1ULL<<(sizeof(Cache.DepP->ID)*8))-1ULL) return _error->Error(_("Wow, you exceeded the number of dependencies " "this APT is capable of.")); @@ -271,7 +322,7 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name Pkg = Cache.FindPkg(Name); if (Pkg.end() == false) return true; - + // Get a structure unsigned long Package = Map.Allocate(sizeof(pkgCache::Package)); if (Package == 0) @@ -349,6 +400,62 @@ unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver, return Version; } /*}}}*/ +// CacheGenerator::NewFileDesc - Create a new File<->Desc association /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc, + ListParser &List) +{ + if (CurrentFile == 0) + return true; + + // Get a structure + unsigned long DescFile = Map.Allocate(sizeof(pkgCache::DescFile)); + if (DescFile == 0) + return 0; + + pkgCache::DescFileIterator DF(Cache,Cache.DescFileP + DescFile); + DF->File = CurrentFile - Cache.PkgFileP; + + // Link it to the end of the list + map_ptrloc *Last = &Desc->FileList; + for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; D++) + Last = &D->NextFile; + + DF->NextFile = *Last; + *Last = DF.Index(); + + DF->Offset = List.Offset(); + DF->Size = List.Size(); + if (Cache.HeaderP->MaxDescFileSize < DF->Size) + Cache.HeaderP->MaxDescFileSize = DF->Size; + Cache.HeaderP->DescFileCount++; + + return true; +} + /*}}}*/ +// CacheGenerator::NewDescription - Create a new Description /*{{{*/ +// --------------------------------------------------------------------- +/* This puts a description structure in the linked list */ +map_ptrloc pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc, + const string &Lang, const MD5SumValue &md5sum, + map_ptrloc Next) +{ + // Get a structure + map_ptrloc Description = Map.Allocate(sizeof(pkgCache::Description)); + if (Description == 0) + return 0; + + // Fill it in + Desc = pkgCache::DescIterator(Cache,Cache.DescP + Description); + Desc->NextDesc = Next; + Desc->ID = Cache.HeaderP->DescriptionCount++; + Desc->language_code = Map.WriteString(Lang); + Desc->md5sum = Map.WriteString(md5sum.Value()); + + return Description; +} + /*}}}*/ // ListParser::NewDepends - Create a dependency element /*{{{*/ // --------------------------------------------------------------------- /* This creates a dependency element in the tree. It is linked to the @@ -571,8 +678,10 @@ static bool CheckValidity(const string &CacheFile, FileIterator Start, if ((*Start)->Exists() == false) { +#if 0 // mvo: we no longer give a message here (Default Sources spec) _error->WarningE("stat",_("Couldn't stat source package list %s"), (*Start)->Describe().c_str()); +#endif continue; } @@ -580,7 +689,7 @@ static bool CheckValidity(const string &CacheFile, FileIterator Start, pkgCache::PkgFileIterator File = (*Start)->FindInCache(Cache); if (File.end() == true) return false; - + Visited[File->ID] = true; } @@ -676,7 +785,7 @@ static bool BuildCache(pkgCacheGenerator &Gen, bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress, MMap **OutMap,bool AllowMem) { - unsigned long MapSize = _config->FindI("APT::Cache-Limit",12*1024*1024); + unsigned long MapSize = _config->FindI("APT::Cache-Limit",16*1024*1024); vector<pkgIndexFile *> Files; for (vector<metaIndex *>::const_iterator i = List.begin(); @@ -823,7 +932,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress, /* */ bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap) { - unsigned long MapSize = _config->FindI("APT::Cache-Limit",8*1024*1024); + unsigned long MapSize = _config->FindI("APT::Cache-Limit",12*1024*1024); vector<pkgIndexFile *> Files; unsigned long EndOfSource = Files.size(); if (_system->AddStatusFiles(Files) == false) diff --git a/apt-pkg/pkgcachegen.h b/apt-pkg/pkgcachegen.h index 9a729eea4..fae1a60a6 100644 --- a/apt-pkg/pkgcachegen.h +++ b/apt-pkg/pkgcachegen.h @@ -24,6 +24,7 @@ #endif #include <apt-pkg/pkgcache.h> +#include <apt-pkg/md5.h> class pkgSourceList; class OpProgress; @@ -55,7 +56,9 @@ class pkgCacheGenerator bool NewPackage(pkgCache::PkgIterator &Pkg,const string &Pkg); bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List); + bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List); unsigned long NewVersion(pkgCache::VerIterator &Ver,const string &VerStr,unsigned long Next); + map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const string &Lang,const MD5SumValue &md5sum,map_ptrloc Next); public: @@ -108,6 +111,9 @@ class pkgCacheGenerator::ListParser virtual string Package() = 0; virtual string Version() = 0; virtual bool NewVersion(pkgCache::VerIterator Ver) = 0; + virtual string Description() = 0; + virtual string DescriptionLanguage() = 0; + virtual MD5SumValue Description_md5() = 0; virtual unsigned short VersionHash() = 0; virtual bool UsePackage(pkgCache::PkgIterator Pkg, pkgCache::VerIterator Ver) = 0; diff --git a/apt-pkg/pkgrecords.cc b/apt-pkg/pkgrecords.cc index 9c2655d6a..456b5aef4 100644 --- a/apt-pkg/pkgrecords.cc +++ b/apt-pkg/pkgrecords.cc @@ -23,11 +23,9 @@ // Records::pkgRecords - Constructor /*{{{*/ // --------------------------------------------------------------------- /* This will create the necessary structures to access the status files */ -pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) +pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), + Files(Cache.HeaderP->PackageFileCount) { - Files = new Parser *[Cache.HeaderP->PackageFileCount]; - memset(Files,0,sizeof(*Files)*Cache.HeaderP->PackageFileCount); - for (pkgCache::PkgFileIterator I = Cache.FileBegin(); I.end() == false; I++) { @@ -49,9 +47,13 @@ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) /* */ pkgRecords::~pkgRecords() { - for (unsigned I = 0; I != Cache.HeaderP->PackageFileCount; I++) - delete Files[I]; - delete [] Files; + for ( vector<Parser*>::iterator it = Files.begin(); + it != Files.end(); + ++it) + { + delete *it; + } + } /*}}}*/ // Records::Lookup - Get a parser for the package version file /*{{{*/ @@ -63,3 +65,12 @@ pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator const &Ver) return *Files[Ver.File()->ID]; } /*}}}*/ +// Records::Lookup - Get a parser for the package description file /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgRecords::Parser &pkgRecords::Lookup(pkgCache::DescFileIterator const &Desc) +{ + Files[Desc.File()->ID]->Jump(Desc); + return *Files[Desc.File()->ID]; +} + /*}}}*/ diff --git a/apt-pkg/pkgrecords.h b/apt-pkg/pkgrecords.h index 08f004414..ad3946c1b 100644 --- a/apt-pkg/pkgrecords.h +++ b/apt-pkg/pkgrecords.h @@ -23,6 +23,7 @@ #include <apt-pkg/pkgcache.h> #include <apt-pkg/fileutl.h> +#include <vector> class pkgRecords { @@ -32,12 +33,13 @@ class pkgRecords private: pkgCache &Cache; - Parser **Files; - + std::vector<Parser *>Files; + public: // Lookup function Parser &Lookup(pkgCache::VerFileIterator const &Ver); + Parser &Lookup(pkgCache::DescFileIterator const &Desc); // Construct destruct pkgRecords(pkgCache &Cache); @@ -49,6 +51,7 @@ class pkgRecords::Parser protected: virtual bool Jump(pkgCache::VerFileIterator const &Ver) = 0; + virtual bool Jump(pkgCache::DescFileIterator const &Desc) = 0; public: friend class pkgRecords; diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc index 223618cd1..8700dd17d 100644 --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@ -411,6 +411,7 @@ static const char *iTFRewritePackageOrder[] = { "Section", "Installed-Size", "Maintainer", + "Original-Maintainer", "Architecture", "Source", "Version", @@ -423,6 +424,7 @@ static const char *iTFRewritePackageOrder[] = { "Recommends", "Suggests", "Conflicts", + "Breaks", "Conffiles", "Filename", "Size", @@ -439,6 +441,7 @@ static const char *iTFRewriteSourceOrder[] = {"Package", "Priority", "Section", "Maintainer", + "Original-Maintainer", "Build-Depends", "Build-Depends-Indep", "Build-Conflicts", diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc index aea9ebeba..cc4c1559e 100644 --- a/cmdline/apt-cache.cc +++ b/cmdline/apt-cache.cc @@ -71,6 +71,12 @@ void LocalitySort(pkgCache::VerFile **begin, { qsort(begin,Count,Size,LocalityCompare); } + +void LocalitySort(pkgCache::DescFile **begin, + unsigned long Count,size_t Size) +{ + qsort(begin,Count,Size,LocalityCompare); +} /*}}}*/ // UnMet - Show unmet dependencies /*{{{*/ // --------------------------------------------------------------------- @@ -96,13 +102,15 @@ bool UnMet(CommandLine &CmdL) if (End->Type != pkgCache::Dep::PreDepends && End->Type != pkgCache::Dep::Depends && End->Type != pkgCache::Dep::Suggests && - End->Type != pkgCache::Dep::Recommends) + End->Type != pkgCache::Dep::Recommends && + End->Type != pkgCache::Dep::DpkgBreaks) continue; // Important deps only if (Important == true) if (End->Type != pkgCache::Dep::PreDepends && - End->Type != pkgCache::Dep::Depends) + End->Type != pkgCache::Dep::Depends && + End->Type != pkgCache::Dep::DpkgBreaks) continue; // Verify the or group @@ -182,7 +190,14 @@ bool DumpPackage(CommandLine &CmdL) { cout << Cur.VerStr(); for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; Vf++) - cout << "(" << Vf.File().FileName() << ")"; + cout << " (" << Vf.File().FileName() << ")"; + cout << endl; + for (pkgCache::DescIterator D = Cur.DescriptionList(); D.end() == false; D++) + { + cout << " Description Language: " << D.LanguageCode() << endl + << " File: " << D.FileList().File().FileName() << endl + << " MD5: " << D.md5() << endl; + } cout << endl; } @@ -277,11 +292,15 @@ bool Stats(CommandLine &Cmd) cout << _("Total distinct versions: ") << Cache.Head().VersionCount << " (" << SizeToStr(Cache.Head().VersionCount*Cache.Head().VersionSz) << ')' << endl; + cout << _("Total Distinct Descriptions: ") << Cache.Head().DescriptionCount << " (" << + SizeToStr(Cache.Head().DescriptionCount*Cache.Head().DescriptionSz) << ')' << endl; cout << _("Total dependencies: ") << Cache.Head().DependsCount << " (" << SizeToStr(Cache.Head().DependsCount*Cache.Head().DependencySz) << ')' << endl; cout << _("Total ver/file relations: ") << Cache.Head().VerFileCount << " (" << SizeToStr(Cache.Head().VerFileCount*Cache.Head().VerFileSz) << ')' << endl; + cout << _("Total Desc/File relations: ") << Cache.Head().DescFileCount << " (" << + SizeToStr(Cache.Head().DescFileCount*Cache.Head().DescFileSz) << ')' << endl; cout << _("Total Provides mappings: ") << Cache.Head().ProvidesCount << " (" << SizeToStr(Cache.Head().ProvidesCount*Cache.Head().ProvidesSz) << ')' << endl; @@ -344,6 +363,12 @@ bool Dump(CommandLine &Cmd) for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++) cout << " Depends: " << D.TargetPkg().Name() << ' ' << DeNull(D.TargetVer()) << endl; + for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; D++) + { + cout << " Description Language: " << D.LanguageCode() << endl + << " File: " << D.FileList().File().FileName() << endl + << " MD5: " << D.md5() << endl; + } } } @@ -846,6 +871,7 @@ bool XVcg(CommandLine &CmdL) then show the relation but do not recurse */ if (Hit == false && (D->Type == pkgCache::Dep::Conflicts || + D->Type == pkgCache::Dep::DpkgBreaks || D->Type == pkgCache::Dep::Obsoletes)) { if (Show[D.TargetPkg()->ID] == None && @@ -867,6 +893,9 @@ bool XVcg(CommandLine &CmdL) case pkgCache::Dep::Conflicts: printf("label: \"conflicts\" color: lightgreen }\n"); break; + case pkgCache::Dep::DpkgBreaks: + printf("label: \"breaks\" color: lightgreen }\n"); + break; case pkgCache::Dep::Obsoletes: printf("label: \"obsoletes\" color: lightgreen }\n"); break; @@ -1192,17 +1221,50 @@ bool DisplayRecord(pkgCache::VerIterator V) if (_error->PendingError() == true) return false; - // Read the record and then write it out again. + // Read the record unsigned char *Buffer = new unsigned char[GCache->HeaderP->MaxVerFileSize+1]; Buffer[V.FileList()->Size] = '\n'; if (PkgF.Seek(V.FileList()->Offset) == false || - PkgF.Read(Buffer,V.FileList()->Size) == false || - fwrite(Buffer,1,V.FileList()->Size+1,stdout) < (size_t)(V.FileList()->Size+1)) + PkgF.Read(Buffer,V.FileList()->Size) == false) { delete [] Buffer; return false; } - + + // Get a pointer to start of Description field + const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "Description:"); + + // Write all but Description + if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer)) + { + delete [] Buffer; + return false; + } + + // Show the right description + pkgRecords Recs(*GCache); + pkgCache::DescIterator Desc = V.TranslatedDescription(); + pkgRecords::Parser &P = Recs.Lookup(Desc.FileList()); + cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc(); + + // Find the first field after the description (if there is any) + for(DescP++;DescP != &Buffer[V.FileList()->Size];DescP++) + { + if(*DescP == '\n' && *(DescP+1) != ' ') + { + // write the rest of the buffer + const unsigned char *end=&Buffer[V.FileList()->Size]; + if (fwrite(DescP,1,end-DescP,stdout) < (size_t)(end-DescP)) + { + delete [] Buffer; + return false; + } + + break; + } + } + // write a final newline (after the description) + cout<<endl; delete [] Buffer; return true; @@ -1211,9 +1273,9 @@ bool DisplayRecord(pkgCache::VerIterator V) // Search - Perform a search /*{{{*/ // --------------------------------------------------------------------- /* This searches the package names and pacakge descriptions for a pattern */ -struct ExVerFile +struct ExDescFile { - pkgCache::VerFile *Vf; + pkgCache::DescFile *Df; bool NameMatch; }; @@ -1253,35 +1315,35 @@ bool Search(CommandLine &CmdL) return false; } - ExVerFile *VFList = new ExVerFile[Cache.HeaderP->PackageCount+1]; - memset(VFList,0,sizeof(*VFList)*Cache.HeaderP->PackageCount+1); + ExDescFile *DFList = new ExDescFile[Cache.HeaderP->PackageCount+1]; + memset(DFList,0,sizeof(*DFList)*Cache.HeaderP->PackageCount+1); // Map versions that we want to write out onto the VerList array. for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++) { - VFList[P->ID].NameMatch = NumPatterns != 0; + DFList[P->ID].NameMatch = NumPatterns != 0; for (unsigned I = 0; I != NumPatterns; I++) { if (regexec(&Patterns[I],P.Name(),0,0,0) == 0) - VFList[P->ID].NameMatch &= true; + DFList[P->ID].NameMatch &= true; else - VFList[P->ID].NameMatch = false; + DFList[P->ID].NameMatch = false; } // Doing names only, drop any that dont match.. - if (NamesOnly == true && VFList[P->ID].NameMatch == false) + if (NamesOnly == true && DFList[P->ID].NameMatch == false) continue; // Find the proper version to use. pkgCache::VerIterator V = Plcy.GetCandidateVer(P); if (V.end() == false) - VFList[P->ID].Vf = V.FileList(); + DFList[P->ID].Df = V.DescriptionList().FileList(); } // Include all the packages that provide matching names too for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++) { - if (VFList[P->ID].NameMatch == false) + if (DFList[P->ID].NameMatch == false) continue; for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++) @@ -1289,18 +1351,18 @@ bool Search(CommandLine &CmdL) pkgCache::VerIterator V = Plcy.GetCandidateVer(Prv.OwnerPkg()); if (V.end() == false) { - VFList[Prv.OwnerPkg()->ID].Vf = V.FileList(); - VFList[Prv.OwnerPkg()->ID].NameMatch = true; + DFList[Prv.OwnerPkg()->ID].Df = V.DescriptionList().FileList(); + DFList[Prv.OwnerPkg()->ID].NameMatch = true; } } } - - LocalitySort(&VFList->Vf,Cache.HeaderP->PackageCount,sizeof(*VFList)); + + LocalitySort(&DFList->Df,Cache.HeaderP->PackageCount,sizeof(*DFList)); // Iterate over all the version records and check them - for (ExVerFile *J = VFList; J->Vf != 0; J++) + for (ExDescFile *J = DFList; J->Df != 0; J++) { - pkgRecords::Parser &P = Recs.Lookup(pkgCache::VerFileIterator(Cache,J->Vf)); + pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(Cache,J->Df)); bool Match = true; if (J->NameMatch == false) @@ -1331,7 +1393,7 @@ bool Search(CommandLine &CmdL) } } - delete [] VFList; + delete [] DFList; for (unsigned I = 0; I != NumPatterns; I++) regfree(&Patterns[I]); if (ferror(stdout)) diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 64882e3e8..aa3f3f712 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -60,6 +60,7 @@ #include <errno.h> #include <regex.h> #include <sys/wait.h> +#include <sstream> /*}}}*/ using namespace std; @@ -628,6 +629,8 @@ void CacheFile::Sort() and verifies that the system is OK. */ bool CacheFile::CheckDeps(bool AllowBroken) { + bool FixBroken = _config->FindB("APT::Get::Fix-Broken",false); + if (_error->PendingError() == true) return false; @@ -639,12 +642,24 @@ bool CacheFile::CheckDeps(bool AllowBroken) if (pkgApplyStatus(*DCache) == false) return false; + if (_config->FindB("APT::Get::Fix-Policy-Broken",false) == true) + { + FixBroken = true; + if ((DCache->PolicyBrokenCount() > 0)) + { + // upgrade all policy-broken packages with ForceImportantDeps=True + for (pkgCache::PkgIterator I = Cache->PkgBegin(); !I.end(); I++) + if ((*DCache)[I].NowPolicyBroken() == true) + DCache->MarkInstall(I,true,0,false, true); + } + } + // Nothing is broken if (DCache->BrokenCount() == 0 || AllowBroken == true) return true; // Attempt to fix broken things - if (_config->FindB("APT::Get::Fix-Broken",false) == true) + if (FixBroken == true) { c1out << _("Correcting dependencies...") << flush; if (pkgFixBroken(*DCache) == false || DCache->BrokenCount() != 0) @@ -995,7 +1010,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, cerr << _("Unable to correct missing packages.") << endl; return _error->Error(_("Aborting install.")); } - + _system->UnLock(); int status_fd = _config->FindI("APT::Status-Fd",-1); pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd); @@ -1145,9 +1160,11 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache, else ExpectedInst++; - // Install it with autoinstalling enabled. - if (State.InstBroken() == true && BrokenFix == false) + // Install it with autoinstalling enabled (if we not respect the minial + // required deps or the policy) + if ((State.InstBroken() == true || State.InstPolicyBroken() == true) && BrokenFix == false) Cache.MarkInstall(Pkg,true); + return true; } /*}}}*/ @@ -1355,20 +1372,29 @@ bool DoUpdate(CommandLine &CmdL) return false; bool Failed = false; + bool TransientNetworkFailure = false; for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++) { if ((*I)->Status == pkgAcquire::Item::StatDone) continue; (*I)->Finished(); - + fprintf(stderr,_("Failed to fetch %s %s\n"),(*I)->DescURI().c_str(), (*I)->ErrorText.c_str()); + + if ((*I)->Status == pkgAcquire::Item::StatTransientNetworkError) + { + TransientNetworkFailure = true; + continue; + } + Failed = true; } // Clean out any old list files - if (!Failed && _config->FindB("APT::Get::List-Cleanup",true) == true) + if (!TransientNetworkFailure && + _config->FindB("APT::Get::List-Cleanup",true) == true) { if (Fetcher.Clean(_config->FindDir("Dir::State::lists")) == false || Fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/") == false) @@ -1380,12 +1406,81 @@ bool DoUpdate(CommandLine &CmdL) if (Cache.BuildCaches() == false) return false; - if (Failed == true) + if (TransientNetworkFailure == true) + _error->Warning(_("Some index files failed to download, they have been ignored, or old ones used instead.")); + else if (Failed == true) return _error->Error(_("Some index files failed to download, they have been ignored, or old ones used instead.")); - + return true; } /*}}}*/ +// DoAutomaticRemove - Remove all automatic unused packages /*{{{*/ +// --------------------------------------------------------------------- +/* Remove unused automatic packages */ +bool DoAutomaticRemove(CacheFile &Cache) +{ + bool Debug = _config->FindI("Debug::pkgAutoRemove",false); + bool doAutoRemove = _config->FindB("APT::Get::AutomaticRemove", false); + bool hideAutoRemove = _config->FindB("APT::Get::HideAutoRemove"); + pkgDepCache::ActionGroup group(*Cache); + + if(Debug) + std::cout << "DoAutomaticRemove()" << std::endl; + + if (_config->FindB("APT::Get::Remove",true) == false && + doAutoRemove == true) + { + c1out << _("We are not supposed to delete stuff, can't start " + "AutoRemover") << std::endl; + doAutoRemove = false; + } + + string autoremovelist, autoremoveversions; + // look over the cache to see what can be removed + for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) + { + if (Cache[Pkg].Garbage) + { + if(Pkg.CurrentVer() != 0 || Cache[Pkg].Install()) + if(Debug) + std::cout << "We could delete %s" << Pkg.Name() << std::endl; + + // only show stuff in the list that is not yet marked for removal + if(Cache[Pkg].Delete() == false) + { + autoremovelist += string(Pkg.Name()) + " "; + autoremoveversions += string(Cache[Pkg].CandVersion) + "\n"; + } + if (doAutoRemove) + { + if(Pkg.CurrentVer() != 0 && + Pkg->CurrentState != pkgCache::State::ConfigFiles) + Cache->MarkDelete(Pkg, _config->FindB("APT::Get::Purge", false)); + else + Cache->MarkKeep(Pkg, false, false); + } + } + } + if (!hideAutoRemove) + ShowList(c1out, _("The following packages were automatically installed and are no longer required:"), autoremovelist, autoremoveversions); + if (!doAutoRemove && !hideAutoRemove && autoremovelist.size() > 0) + c1out << _("Use 'apt-get autoremove' to remove them.") << std::endl; + + // Now see if we destroyed anything + if (Cache->BrokenCount() != 0) + { + c1out << _("Hmm, seems like the AutoRemover destroyed something which really\n" + "shouldn't happen. Please file a bug report against apt.") << endl; + c1out << endl; + c1out << _("The following information may help to resolve the situation:") << endl; + c1out << endl; + ShowBroken(c1out,Cache,false); + + return _error->Error(_("Internal Error, AutoRemover broke stuff")); + } + return true; +} + // DoUpgrade - Upgrade all packages /*{{{*/ // --------------------------------------------------------------------- /* Upgrade all packages without installing new packages or erasing old @@ -1406,6 +1501,51 @@ bool DoUpgrade(CommandLine &CmdL) return InstallPackages(Cache,true); } /*}}}*/ +// DoInstallTask - Install task from the command line /*{{{*/ +// --------------------------------------------------------------------- +/* Install named task */ +bool TryInstallTask(pkgDepCache &Cache, pkgProblemResolver &Fix, + bool BrokenFix, + unsigned int& ExpectedInst, + const char *taskname) +{ + const char *start, *end; + pkgCache::PkgIterator Pkg; + char buf[64*1024]; + regex_t Pattern; + + // get the records + pkgRecords Recs(Cache); + + // build regexp for the task + char S[300]; + snprintf(S, sizeof(S), "^Task:.*[^a-z]%s[^a-z].*\n", taskname); + regcomp(&Pattern,S, REG_EXTENDED | REG_NOSUB | REG_NEWLINE); + + bool found = false; + bool res = true; + for (Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++) + { + pkgCache::VerIterator ver = Cache[Pkg].CandidateVerIter(Cache); + if(ver.end()) + continue; + pkgRecords::Parser &parser = Recs.Lookup(ver.FileList()); + parser.GetRec(start,end); + strncpy(buf, start, end-start); + buf[end-start] = 0x0; + if (regexec(&Pattern,buf,0,0,0) != 0) + continue; + res &= TryToInstall(Pkg,Cache,Fix,false,true,ExpectedInst); + found = true; + } + + if(!found) + _error->Error(_("Couldn't find task %s"),taskname); + + regfree(&Pattern); + return res; +} + // DoInstall - Install packages from the command line /*{{{*/ // --------------------------------------------------------------------- /* Install named packages */ @@ -1421,6 +1561,7 @@ bool DoInstall(CommandLine &CmdL) if (Cache->BrokenCount() != 0) BrokenFix = true; + unsigned int AutoMarkChanged = 0; unsigned int ExpectedInst = 0; unsigned int Packages = 0; pkgProblemResolver Fix(Cache); @@ -1429,154 +1570,192 @@ bool DoInstall(CommandLine &CmdL) if (strcasecmp(CmdL.FileList[0],"remove") == 0) DefRemove = true; - for (const char **I = CmdL.FileList + 1; *I != 0; I++) + else if (strcasecmp(CmdL.FileList[0], "autoremove") == 0) { - // Duplicate the string - unsigned int Length = strlen(*I); - char S[300]; - if (Length >= sizeof(S)) - continue; - strcpy(S,*I); - - // See if we are removing and special indicators.. - bool Remove = DefRemove; - char *VerTag = 0; - bool VerIsRel = false; - while (Cache->FindPkg(S).end() == true) + _config->Set("APT::Get::AutomaticRemove", "true"); + DefRemove = true; + } + + // new scope for the ActionGroup + { + pkgDepCache::ActionGroup group(Cache); + for (const char **I = CmdL.FileList + 1; *I != 0; I++) { - // Handle an optional end tag indicating what to do - if (Length >= 1 && S[Length - 1] == '-') - { - Remove = true; - S[--Length] = 0; + // Duplicate the string + unsigned int Length = strlen(*I); + char S[300]; + if (Length >= sizeof(S)) continue; - } - - if (Length >= 1 && S[Length - 1] == '+') + strcpy(S,*I); + + // See if we are removing and special indicators.. + bool Remove = DefRemove; + char *VerTag = 0; + bool VerIsRel = false; + + // this is a task! + if (Length >= 1 && S[Length - 1] == '^') { - Remove = false; S[--Length] = 0; + // tasks must always be confirmed + ExpectedInst += 1000; + // see if we can install it + TryInstallTask(Cache, Fix, BrokenFix, ExpectedInst, S); continue; } - - char *Slash = strchr(S,'='); - if (Slash != 0) + + while (Cache->FindPkg(S).end() == true) { - VerIsRel = false; - *Slash = 0; - VerTag = Slash + 1; - } + // Handle an optional end tag indicating what to do + if (Length >= 1 && S[Length - 1] == '-') + { + Remove = true; + S[--Length] = 0; + continue; + } - Slash = strchr(S,'/'); - if (Slash != 0) - { - VerIsRel = true; - *Slash = 0; - VerTag = Slash + 1; - } + if (Length >= 1 && S[Length - 1] == '+') + { + Remove = false; + S[--Length] = 0; + continue; + } - break; - } + char *Slash = strchr(S,'='); + if (Slash != 0) + { + VerIsRel = false; + *Slash = 0; + VerTag = Slash + 1; + } + + Slash = strchr(S,'/'); + if (Slash != 0) + { + VerIsRel = true; + *Slash = 0; + VerTag = Slash + 1; + } + + break; + } - // Locate the package - pkgCache::PkgIterator Pkg = Cache->FindPkg(S); - Packages++; - if (Pkg.end() == true) - { - // Check if the name is a regex - const char *I; - for (I = S; *I != 0; I++) - if (*I == '?' || *I == '*' || *I == '|' || - *I == '[' || *I == '^' || *I == '$') - break; - if (*I == 0) - return _error->Error(_("Couldn't find package %s"),S); + // Locate the package + pkgCache::PkgIterator Pkg = Cache->FindPkg(S); + Packages++; + if (Pkg.end() == true) + { + // Check if the name is a regex + const char *I; + for (I = S; *I != 0; I++) + if (*I == '?' || *I == '*' || *I == '|' || + *I == '[' || *I == '^' || *I == '$') + break; + if (*I == 0) + return _error->Error(_("Couldn't find package %s"),S); - // Regexs must always be confirmed - ExpectedInst += 1000; + // Regexs must always be confirmed + ExpectedInst += 1000; - // Compile the regex pattern - regex_t Pattern; - int Res; - if ((Res = regcomp(&Pattern,S,REG_EXTENDED | REG_ICASE | - REG_NOSUB)) != 0) - { - char Error[300]; - regerror(Res,&Pattern,Error,sizeof(Error)); - return _error->Error(_("Regex compilation error - %s"),Error); - } + // Compile the regex pattern + regex_t Pattern; + int Res; + if ((Res = regcomp(&Pattern,S,REG_EXTENDED | REG_ICASE | + REG_NOSUB)) != 0) + { + char Error[300]; + regerror(Res,&Pattern,Error,sizeof(Error)); + return _error->Error(_("Regex compilation error - %s"),Error); + } - // Run over the matches - bool Hit = false; - for (Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++) - { - if (regexec(&Pattern,Pkg.Name(),0,0,0) != 0) - continue; + // Run over the matches + bool Hit = false; + for (Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++) + { + if (regexec(&Pattern,Pkg.Name(),0,0,0) != 0) + continue; + + ioprintf(c1out,_("Note, selecting %s for regex '%s'\n"), + Pkg.Name(),S); - ioprintf(c1out,_("Note, selecting %s for regex '%s'\n"), - Pkg.Name(),S); + if (VerTag != 0) + if (TryToChangeVer(Pkg,Cache,VerTag,VerIsRel) == false) + return false; + Hit |= TryToInstall(Pkg,Cache,Fix,Remove,BrokenFix, + ExpectedInst,false); + } + regfree(&Pattern); + + if (Hit == false) + return _error->Error(_("Couldn't find package %s"),S); + } + else + { + if (VerTag != 0) if (TryToChangeVer(Pkg,Cache,VerTag,VerIsRel) == false) return false; - - Hit |= TryToInstall(Pkg,Cache,Fix,Remove,BrokenFix, - ExpectedInst,false); - } - regfree(&Pattern); - - if (Hit == false) - return _error->Error(_("Couldn't find package %s"),S); - } - else - { - if (VerTag != 0) - if (TryToChangeVer(Pkg,Cache,VerTag,VerIsRel) == false) + if (TryToInstall(Pkg,Cache,Fix,Remove,BrokenFix,ExpectedInst) == false) return false; - if (TryToInstall(Pkg,Cache,Fix,Remove,BrokenFix,ExpectedInst) == false) - return false; - } - } - /* If we are in the Broken fixing mode we do not attempt to fix the - problems. This is if the user invoked install without -f and gave - packages */ - if (BrokenFix == true && Cache->BrokenCount() != 0) - { - c1out << _("You might want to run `apt-get -f install' to correct these:") << endl; - ShowBroken(c1out,Cache,false); + // see if we need to fix the auto-mark flag + // e.g. apt-get install foo + // where foo is marked automatic + if(!Remove && + Cache[Pkg].Install() == false && + (Cache[Pkg].Flags & pkgCache::Flag::Auto)) + { + ioprintf(c1out,_("%s set to manual installed.\n"), + Pkg.Name()); + Cache->MarkAuto(Pkg,false); + AutoMarkChanged++; + } + } + } - return _error->Error(_("Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).")); - } + /* If we are in the Broken fixing mode we do not attempt to fix the + problems. This is if the user invoked install without -f and gave + packages */ + if (BrokenFix == true && Cache->BrokenCount() != 0) + { + c1out << _("You might want to run `apt-get -f install' to correct these:") << endl; + ShowBroken(c1out,Cache,false); + + return _error->Error(_("Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).")); + } - // Call the scored problem resolver - Fix.InstallProtect(); - if (Fix.Resolve(true) == false) - _error->Discard(); + // Call the scored problem resolver + Fix.InstallProtect(); + if (Fix.Resolve(true) == false) + _error->Discard(); - // Now we check the state of the packages, - if (Cache->BrokenCount() != 0) - { - c1out << - _("Some packages could not be installed. This may mean that you have\n" - "requested an impossible situation or if you are using the unstable\n" - "distribution that some required packages have not yet been created\n" - "or been moved out of Incoming.") << endl; - if (Packages == 1) + // Now we check the state of the packages, + if (Cache->BrokenCount() != 0) { - c1out << endl; c1out << - _("Since you only requested a single operation it is extremely likely that\n" - "the package is simply not installable and a bug report against\n" - "that package should be filed.") << endl; - } + _("Some packages could not be installed. This may mean that you have\n" + "requested an impossible situation or if you are using the unstable\n" + "distribution that some required packages have not yet been created\n" + "or been moved out of Incoming.") << endl; + if (Packages == 1) + { + c1out << endl; + c1out << + _("Since you only requested a single operation it is extremely likely that\n" + "the package is simply not installable and a bug report against\n" + "that package should be filed.") << endl; + } + + c1out << _("The following information may help to resolve the situation:") << endl; + c1out << endl; + ShowBroken(c1out,Cache,false); + return _error->Error(_("Broken packages")); + } + } + if (!DoAutomaticRemove(Cache)) + return false; - c1out << _("The following information may help to resolve the situation:") << endl; - c1out << endl; - ShowBroken(c1out,Cache,false); - return _error->Error(_("Broken packages")); - } - /* Print out a list of packages that are going to be installed extra to what the user asked */ if (Cache->InstCount() != ExpectedInst) @@ -1596,8 +1775,8 @@ bool DoInstall(CommandLine &CmdL) if (*J == 0) { List += string(I.Name()) + " "; - VersionsList += string(Cache[I].CandVersion) + "\n"; - } + VersionsList += string(Cache[I].CandVersion) + "\n"; + } } ShowList(c1out,_("The following extra packages will be installed:"),List,VersionsList); @@ -1694,6 +1873,14 @@ bool DoInstall(CommandLine &CmdL) } + // if nothing changed in the cache, but only the automark information + // we write the StateFile here, otherwise it will be written in + // cache.commit() + if (AutoMarkChanged > 0 && + Cache->DelCount() == 0 && Cache->InstCount() == 0 && + Cache->BadCount() == 0) + Cache->writeStateFile(NULL); + // See if we need to prompt if (Cache->InstCount() == ExpectedInst && Cache->DelCount() == 0) return InstallPackages(Cache,false,false); @@ -1732,6 +1919,8 @@ bool DoDSelectUpgrade(CommandLine &CmdL) if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false) return false; + pkgDepCache::ActionGroup group(Cache); + // Install everything with the install flag set pkgCache::PkgIterator I = Cache->PkgBegin(); for (;I.end() != true; I++) @@ -2539,7 +2728,10 @@ int main(int argc,const char *argv[]) {0,"remove","APT::Get::Remove",0}, {0,"only-source","APT::Get::Only-Source",0}, {0,"arch-only","APT::Get::Arch-Only",0}, + {0,"auto-remove","APT::Get::AutomaticRemove",0}, {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0}, + {0,"install-recommends","APT::Install-Recommends",CommandLine::Boolean}, + {0,"fix-policy","APT::Get::Fix-Policy-Broken",0}, {'c',"config-file",0,CommandLine::ConfigFile}, {'o',"option",0,CommandLine::ArbItem}, {0,0,0,0}}; @@ -2547,6 +2739,7 @@ int main(int argc,const char *argv[]) {"upgrade",&DoUpgrade}, {"install",&DoInstall}, {"remove",&DoInstall}, + {"autoremove",&DoInstall}, {"dist-upgrade",&DoDistUpgrade}, {"dselect-upgrade",&DoDSelectUpgrade}, {"build-dep",&DoBuildDep}, diff --git a/cmdline/apt-key b/cmdline/apt-key index 90ecae2cf..7c1aad0cf 100755 --- a/cmdline/apt-key +++ b/cmdline/apt-key @@ -9,14 +9,14 @@ GPG_CMD="gpg --no-options --no-default-keyring --secret-keyring /etc/apt/secring GPG="$GPG_CMD --keyring /etc/apt/trusted.gpg" -ARCHIVE_KEYRING=/usr/share/keyrings/debian-archive-keyring.gpg -REMOVED_KEYS=/usr/share/keyrings/debian-archive-removed-keys.gpg +ARCHIVE_KEYRING=/usr/share/keyrings/ubuntu-archive-keyring.gpg +REMOVED_KEYS=/usr/share/keyrings/ubuntu-archive-removed-keys.gpg update() { if [ ! -f $ARCHIVE_KEYRING ]; then echo >&2 "ERROR: Can't find the archive-keyring" - echo >&2 "Is the debian-archive-keyring package installed?" + echo >&2 "Is the ubuntu-keyring package installed?" exit 1 fi diff --git a/cmdline/apt-mark b/cmdline/apt-mark new file mode 100755 index 000000000..dadc01366 --- /dev/null +++ b/cmdline/apt-mark @@ -0,0 +1,64 @@ +#!/usr/bin/python + +from optparse import OptionParser + +try: + import apt_pkg +except ImportError: + print "Error importing apt_pkg, is python-apt installed?" + +import sys +import os.path + +actions = { "markauto" : 1, + "unmarkauto": 0 + } + +if __name__ == "__main__": + apt_pkg.init() + + # option parsing + parser = OptionParser() + parser.usage = "%prog [options] {markauto|unmarkauto} packages..." + parser.add_option("-f", "--file", action="store", type="string", + dest="filename", + help="read/write a different file") + parser.add_option("-v", "--verbose", + action="store_true", dest="verbose", default=False, + help="print verbose status messages to stdout") + (options, args) = parser.parse_args() + if len(args) < 2: + parser.error("not enough argument") + + # get pkgs to change + if args[0] not in actions.keys(): + parser.error("first argument must be 'markauto' or 'unmarkauto'") + pkgs = args[1:] + action = actions[args[0]] + + # get the state-file + if not options.filename: + STATE_FILE = apt_pkg.Config.FindDir("Dir::State") + "extended_states" + else: + STATE_FILE=options.state_file + + # open the statefile + if os.path.exists(STATE_FILE): + tagfile = apt_pkg.ParseTagFile(open(STATE_FILE)) + outfile = open(STATE_FILE+".tmp","w") + while tagfile.Step(): + pkgname = tagfile.Section.get("Package") + autoInst = tagfile.Section.get("Auto-Installed") + if pkgname in pkgs: + if options.verbose: + print "changing %s to %s" % (pkgname,action) + newsec = apt_pkg.RewriteSection(tagfile.Section, + [], + [ ("Auto-Installed",str(action)) ] + ) + outfile.write(newsec+"\n") + else: + outfile.write(str(tagfile.Section)+"\n") + # all done, rename the tmpfile + os.chmod(outfile.name, 0644) + os.rename(outfile.name, STATE_FILE) diff --git a/cmdline/apt-report-mirror-failure b/cmdline/apt-report-mirror-failure new file mode 100755 index 000000000..1567e78e3 --- /dev/null +++ b/cmdline/apt-report-mirror-failure @@ -0,0 +1,24 @@ +#!/usr/bin/python + +import sys +import urllib +import apt_pkg + +apt_pkg.init() +url = apt_pkg.Config.Find("Acquire::Mirror::ReportFailures", None) + #"http://people.ubuntu.com:9000/mirror-failure") + #"http://localhost:9000/mirror-failure") +if not url: + sys.exit(0) + +print "Reporting mirror failure to '%s'" % url + +data = {} +data['mirror'] = sys.argv[1] +data['failurl'] = sys.argv[2] +data['error'] = sys.argv[3] +f = urllib.urlopen(url, urllib.urlencode(data)) +f.read() +f.close() + + diff --git a/cmdline/makefile b/cmdline/makefile index 882a0e1b5..2a5bdfbea 100644 --- a/cmdline/makefile +++ b/cmdline/makefile @@ -52,3 +52,15 @@ SOURCE=apt-key TO=$(BIN) TARGET=program include $(COPY_H) + +# The apt-mark program +SOURCE=apt-mark +TO=$(BIN) +TARGET=program +include $(COPY_H) + +# The apt-key program +SOURCE=apt-report-mirror-failure +TO=$(BIN) +TARGET=program +include $(COPY_H) diff --git a/configure.in b/configure.in index c7bf253d1..a537bf24f 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib) AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in) dnl -- SET THIS TO THE RELEASE VERSION -- -AC_DEFINE_UNQUOTED(VERSION,"0.6.46.5") +AC_DEFINE_UNQUOTED(VERSION,"0.6.46.4ubuntu11") PACKAGE="apt" AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE") AC_SUBST(PACKAGE) diff --git a/debian/apt.conf.ubuntu b/debian/apt.conf.ubuntu new file mode 100644 index 000000000..3a9945b54 --- /dev/null +++ b/debian/apt.conf.ubuntu @@ -0,0 +1,11 @@ +APT +{ + NeverAutoRemove + { + "^linux-image.*"; + "^linux-restricted-modules.*"; + }; + + Install-Recommends-Section "metapackages"; + Never-MarkAuto-Section "metapackages"; +}; diff --git a/debian/apt.cron.daily b/debian/apt.cron.daily index 26dfa2530..b4cbf1c8a 100644 --- a/debian/apt.cron.daily +++ b/debian/apt.cron.daily @@ -14,6 +14,12 @@ # "APT::Periodic::AutocleanInterval" # - Do "apt-get autoclean" every n-days (0=disable) # +# "APT::Periodic::Unattended-Upgrade" +# - Run the "unattended-upgrade" security upgrade script +# every n-days (0=disabled) +# Requires the package "unattended-upgrades" and will write +# a log in /var/log/unattended-upgrades +# # "APT::Archives::MaxAge", # - Set maximum allowed age of a cache package file. If a cache # package file is older it is deleted (0=disable) @@ -148,6 +154,10 @@ eval $(apt-config shell UpdateInterval APT::Periodic::Update-Package-Lists Downl AutocleanInterval=$DownloadUpgradeableInterval eval $(apt-config shell AutocleanInterval APT::Periodic::Autoclean) +UnattendedUpgradeInterval=0 +eval $(apt-config shell UnattendedUpgradeInterval APT::Periodic::Unattended-Upgrade) + + # laptop check, on_ac_power returns: # 0 (true) System is on mains power # 1 (false) System is not on mains power @@ -182,5 +192,11 @@ if check_stamp $AUTOCLEAN_STAMP $AutocleanInterval; then update_stamp $AUTOCLEAN_STAMP fi +UPGRADE_STAMP=/var/lib/apt/periodic/upgrade-stamp +if check_stamp $UPGRADE_STAMP $UnattendedUpgradeInterval; then + unattended-upgrade + update_stamp $UPGRADE_STAMP +fi + # check cache size check_size_constraints diff --git a/debian/apt.dirs b/debian/apt.dirs index e1cb738fa..025898e84 100644 --- a/debian/apt.dirs +++ b/debian/apt.dirs @@ -2,8 +2,10 @@ usr/bin usr/lib/apt/methods usr/lib/dpkg/methods/apt etc/apt +etc/apt/apt.conf.d etc/apt/sources.list.d var/cache/apt/archives/partial var/lib/apt/lists/partial +var/lib/apt/mirrors/partial var/lib/apt/periodic usr/share/bug/apt diff --git a/debian/apt.postinst b/debian/apt.postinst index 88fb932df..df0433057 100644 --- a/debian/apt.postinst +++ b/debian/apt.postinst @@ -17,11 +17,9 @@ case "$1" in configure) if ! test -f /etc/apt/trusted.gpg; then - cp /usr/share/apt/debian-archive.gpg /etc/apt/trusted.gpg + cp /usr/share/apt/ubuntu-archive.gpg /etc/apt/trusted.gpg fi - apt-key update - ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/debian/changelog b/debian/changelog index 8294c45d9..e0a735e2f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,26 +1,16 @@ -apt (0.6.47) UNRELEASED; urgency=low +apt (0.6.46.4ubuntu11) UNRELEASED; urgency=low - * apt-pkg/algorithm.cc: - - use clog for all debugging - - only increase the score of installed applications if they - are not obsolete - - fix resolver bug on removal triggered by weak-dependencies - with or-groups - * methods/http.cc: - - send apt version in User-Agent - * apt-pkg/deb/debrecords.cc: - - fix SHA1Hash() return value - * apt-pkg/cdrom.cc: - - only unmount if APT::CDROM::NoMount is false - * methods/cdrom.cc: - - only umount if it was mounted by the method before * po/gl.po: - - fix error translation that causes trouble to lsb_release + - fix error in translation that causes trouble to lsb_release + (LP#79165) * apt-pkg/acquire-item.cc: - - if decompression of a index fails, delete the index - * [ABI] apt-pkg/acquire.{cc,h}: + - if decompression of a index fails, delete the index (LP#68202) + * apt-pkg/acquire.{cc,h}: - deal better with duplicated sources.list entries (avoid double queuing of URLs) - this fixes hangs in bzip/gzip + (LP#102511) + * Fix broken use of awk in apt-key that caused removal of the wrong keys + from the keyring. Closes: #412572 * merged from Christian Perrier: * mr.po: New Marathi translation Closes: #416806 * zh_CN.po: Updated by Eric Pareja Closes: #416822 @@ -35,9 +25,119 @@ apt (0.6.47) UNRELEASED; urgency=low * *.po: Unfuzzy after upstream typo corrections * apt-pkg/policy.cc: - allow multiple packages (thanks to David Foerster) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 17 Apr 2007 15:53:37 +0200 + +apt (0.6.46.4ubuntu10) feisty; urgency=low + + * apt-pkg/depcache.cc: + - added "APT::Never-MarkAuto-Section" and consider dependencies + of packages in this section manual (LP#59893) + - ensure proper permissions in the extended_state file (LP#67037) + * debian/apt.conf.ubuntu: + - added APT::Never-MarkAuto-Section "metapackages" (LP#59893) + * cmdline/apt-get.cc: + - "apt-get install foo" on a already installed package foo will + clean the automatic installed flag (LP#72007) + - do not show packages already marked for removal as auto-installed + (LP#64493) + - applied patch to (optionally) hide the auto-remove information + (thanks to Frode M. Døving) (LP#69148) + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 14 Mar 2007 13:32:32 +0100 + +apt (0.6.46.4ubuntu9) feisty; urgency=low + + * debian/control: + - set XS-Vcs-Bzr header + - Set Ubuntu maintainer address + * apt-pkg/cdrom.cc: + - only unmount if APT::CDROM::NoMount is false + - only umount if it was mounted by the method before + * cmdline/apt-get.cc: + - fix version output in autoremove list (LP#68941) + * apt-pkg/packagemanager.cc: + - do not spin 100% cpu in FixMissing() (LP#84476) + * apt-pkg/indexfile.cc: + - fix problem overwriting APT::Acquire::Translation + * doc/examples/configure-index: + - document APT::Acquire::Translation + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 13 Mar 2007 15:24:39 +0100 + +apt (0.6.46.4ubuntu8) feisty; urgency=low + + * fix segfault in the pkgRecords destructor + * Bump ABI version + * debian/control: + - make the libcurl3-gnutls-dev versionized (LP#86614) + + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 26 Feb 2007 14:26:33 +0100 + +apt (0.6.46.4ubuntu7) feisty; urgency=low + + * Merged the apt--mirror branch. This means that a new 'mirror' + method is available that will allow dynamic mirror updates. + The sources.list entry looks something like this: + "deb mirror://mirrors.lp.net/get_mirror feisty main restricted" + + It also supports error reporting to a configurable url for mirror + problems/failures. + * Bump ABI version + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 6 Feb 2007 11:38:06 +0100 + +apt (0.6.46.4ubuntu6) feisty; urgency=low + + * methods/http.cc: + - send apt version in User-Agent + * apt-pkg/deb/debrecords.cc: + - fix SHA1Hash() return value + * apt-pkg/algorithms.cc: + - fix resolver bug on removal triggered by weak-dependencies + with or-groups + - fix segfault (lp: #76530) + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 20 Dec 2006 11:04:36 +0100 + +apt (0.6.46.4ubuntu5) feisty; urgency=low + + * added apt-transport-https package to provide a optional + https transport (apt-https spec) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 19 Dec 2006 16:23:43 +0100 + +apt (0.6.46.4ubuntu4) feisty; urgency=low + * apt-pkg/algorithms.cc: + - only increase the score of installed applications if they + are not obsolete + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 18 Dec 2006 19:39:05 +0100 +apt (0.6.46.4ubuntu3) feisty; urgency=low + + * apt-pkg/algorithm.cc: + - use clog for all debugging + * apt-pkg/depcache.cc: + - never mark Required package for autoremoval (lp: #75882) + + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 18 Dec 2006 11:56:05 +0100 + +apt (0.6.46.4ubuntu2) feisty; urgency=low + + * apt-pkg/algorithms.cc: add missing call to MarkKeep + so that dist-upgrade isn't broken by unsatisfiable Breaks. + (thanks to Ian Jackson) + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 7 Dec 2006 23:07:24 +0100 + +apt (0.6.46.4ubuntu1) feisty; urgency=low + + * merged with debian + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 7 Dec 2006 12:13:14 +0100 + apt (0.6.46.4-0.1) unstable; urgency=emergency * NMU @@ -84,6 +184,26 @@ apt (0.6.46.3-0.1) unstable; urgency=high -- Andreas Barth <aba@not.so.argh.org> Tue, 5 Dec 2006 10:34:56 +0000 +apt (0.6.46.3ubuntu2) feisty; urgency=low + + * apt-pkg/algorithms.cc: add missing call to MarkKeep + so that dist-upgrade isn't broken by unsatisfiable Breaks. + + -- Ian Jackson <iwj@ubuntu.com> Thu, 7 Dec 2006 15:46:52 +0000 + +apt (0.6.46.3ubuntu1) feisty; urgency=low + + * doc/apt-get.8.xml: + - documented autoremove, thanks to Vladimír Lapá%GÄ%@ek + (lp: #62919) + * fix broken i18n in the dpkg progress reporting, thanks to + Frans Pop and Steinar Gunderson. (closes: #389261) + * po/en_GB.po: + - typo (lp: #61270) + * add apt-secure.8 to "See also" section + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 23 Nov 2006 07:24:12 +0100 + apt (0.6.46.3) unstable; urgency=low * apt-pkg/deb/dpkgpm.cc: @@ -145,10 +265,46 @@ apt (0.6.46) unstable; urgency=low * debian/control: - switched to libdb4.4 for building (closes: #381019) * cmdline/apt-get.cc: - - show only the recommends/suggests for the candidate-version, not for all - versions of the package (closes: #257054) - - properly handle recommends/suggests or-groups when printing the list of - suggested/recommends packages (closes: #311619) + - fix in the TryInstallTask() code to make sure that all package + there are marked manual install (lp: #61684) + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 28 Sep 2006 00:34:20 +0200 + +apt (0.6.45ubuntu14) edgy; urgency=low + + * cmdline/apt-get.cc: + - fix in the TryInstallTask() code to make sure that all package + there are marked manual install (lp: #61684) + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 28 Sep 2006 00:34:20 +0200 + +apt (0.6.45ubuntu13) edgy; urgency=low + + * no-changes upload to make apt rebuild against latest g++ and + fix synaptic FTBFS (see bug: #62461 for details) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 26 Sep 2006 22:33:10 +0200 + +apt (0.6.45ubuntu12) edgy; urgency=low + + * apt-pkg/depcache.cc: + - fix in the sweep() code, set garbage flag for packages scheduled + for removal too + - do not change the autoFlag in MarkKeep(), this can lead to suprising + side effects + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 21 Sep 2006 00:58:24 +0200 + +apt (0.6.45ubuntu11) edgy; urgency=low + + * removed "installtask" and change it so that tasknames can be given + with "apt-get install taskname^" + * improve the writeStateFile() code + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 20 Sep 2006 14:14:24 +0200 + +apt (0.6.45ubuntu10) edgy; urgency=low + * methods/http.cc: - check more careful for incorrect proxy settings (closes: #378868) * methods/gzip.cc: @@ -173,8 +329,113 @@ apt (0.6.46) unstable; urgency=low caseinsensitive (closes: #384182) - reverted MMap use in the tagfile because it does not work across pipes (closes: #383487) + * added "installtask" command + * added new ubuntu specific rewrite rule for "Original-Maintainer" - -- Michael Vogt <mvo@debian.org> Thu, 21 Sep 2006 10:25:03 +0200 + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 19 Sep 2006 15:07:51 +0200 + +apt (0.6.45ubuntu9) edgy; urgency=low + + * cmdline/apt-get.cc: + - if --no-remove is given, do not run the AutoRemove code + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 13 Sep 2006 11:54:20 +0200 + +apt (0.6.45ubuntu8) edgy; urgency=low + + * apt-pkg/algorithm.cc: + - fix pkgProblemResolver.InstallProtect() to preserve the auto-install + information (lp: #59457) + * cmdline/apt-get.cc: + - fix typo in autoremove information (lp: #59420) + * install apt-mark to modify the automatically install information for + packages + + -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 8 Sep 2006 20:07:22 +0200 + +apt (0.6.45ubuntu7) edgy; urgency=low + + * apt-pkg/depcache.cc: + - fix a bug in the install-recommends-section code + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 7 Sep 2006 18:22:38 +0200 + +apt (0.6.45ubuntu6) edgy; urgency=low + + [Michael Vogt] + * cmdline/apt-get.cc: + - always show auto-removable packages and give a hint how to remove + them + * debian/apt.conf.ubuntu: + - exlucde linux-image and linux-restricted-modules from ever being + auto-removed + - added "metapackages" as the section we want to install recommends + by default + * apt-pkg/depcache.cc: + - added support to turn install-recommends selectively on/off by + section + [Ian Jackson] + * Tests pass without code changes! Except that we need this: + * Bump cache file major version to force rebuild so that Breaks + dependencies are included. + * Don't depend on or suggest any particular dpkg or dpkg-dev versions; + --auto-deconfigure is very very old and dpkg-dev's Breaks support + is more or less orthogonal. + * Initial draft of `Breaks' implementation. Appears to compile, + but as yet *completely untested*. + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 7 Sep 2006 11:50:52 +0200 + +apt (0.6.45ubuntu5) edgy; urgency=low + + * apt-pkg/pkgcachegen.cc: + - increase the APT::Cache-Limit to deal with the increased demand due + to the translated descriptions + * apt-pkg/deb/dpkgpm.cc: + - pass "--auto-deconfigure" to dpkg on install to support the + new "breaks" in dpkg + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 15 Aug 2006 12:06:26 +0200 + +apt (0.6.45ubuntu4) edgy; urgency=low + + * cmdline/apt-get.cc: + - fix in the new --fix-polciy code + + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 14 Aug 2006 21:08:11 +0200 + +apt (0.6.45ubuntu3) edgy; urgency=low + + * ABI break + * merged latest apt--install-recommends (closes: #559000) + * added "--fix-policy" option to can be used as "--fix-broken" and + will install missing weak depends (recommends, and/or suggests + depending on the settings) + * merged the apt--ddtp branch + + -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 11 Aug 2006 12:53:23 +0200 + +apt (0.6.45ubuntu2) edgy; urgency=low + + * debian/control: + - switched to libdb4.4 for building (closes: #381019) + * cmdline/apt-get.cc: + - show only the recommends/suggests for the candidate-version, not for all + versions of the package (closes: #257054) + - properly handle recommends/suggests or-groups when printing the list of + suggested/recommends packages (closes: #311619) + * merged "apt--install-recommends" branch: + - added "{no-}install-recommends" commandline option + - added APT::Install-{Recommends,Suggests} option + - currently Install-Recommends defaults to "False" + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 9 Aug 2006 23:38:46 +0200 + +apt (0.6.45ubuntu1) edgy; urgency=low + + * merged with debian/unstable + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 1 Aug 2006 15:43:22 +0200 apt (0.6.45) unstable; urgency=low @@ -215,7 +476,38 @@ apt (0.6.45) unstable; urgency=low -- Michael Vogt <mvo@debian.org> Thu, 27 Jul 2006 00:52:05 +0200 -apt (0.6.44.2) unstable; urgency=low +apt (0.6.44.2ubuntu4) edgy; urgency=low + + * Make apt-get dselect-upgrade happy again + + -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 21 Jul 2006 11:03:02 +0200 + +apt (0.6.44.2ubuntu3) edgy; urgency=low + + * Close extended_states file after writing it. + + -- Colin Watson <cjwatson@ubuntu.com> Tue, 18 Jul 2006 00:12:13 +0100 + +apt (0.6.44.2ubuntu2) edgy; urgency=low + + * create a empty extended_states file if none exists already + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 4 Jul 2006 09:23:03 +0200 + +apt (0.6.44.2ubuntu1) edgy; urgency=low + + * merged with debian/unstable + * merged the "auto-mark" branch to support aptitude like + marking of automatically installed dependencies and added + "apt-get remove --auto-remove" to remove unused auto-installed + packages again + * changed library version from 3.11 to 3.50 to make it clearly + different from the debian version (we are ABI incompatible because + of the auto-mark patch) + + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 3 Jul 2006 18:30:46 +0200 + +apt (0.6.44.2) unstable; urgency=low * apt-pkg/depcache.cc: - added Debug::pkgDepCache::AutoInstall (thanks to infinity) @@ -283,6 +575,26 @@ apt (0.6.44) unstable; urgency=low -- Michael Vogt <mvo@debian.org> Mon, 8 May 2006 22:28:53 +0200 +apt (0.6.43.3ubuntu3) dapper; urgency=low + + * methods/http.cc: + - fix the user-agent string + + -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 26 May 2006 18:09:32 +0200 + +apt (0.6.43.3ubuntu2) dapper; urgency=low + + * apt-pkg/deb/dpkgpm.cc: wording fixes (thanks to Matt Zimmerman) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 18 Apr 2006 13:24:40 +0200 + +apt (0.6.43.3ubuntu1) dapper; urgency=low + + * apt-pkg/acquire.cc: don't show ETA if it is 0 or absurdely large in + the status-fd (ubuntu #28954) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 28 Mar 2006 20:34:46 +0200 + apt (0.6.43.3) unstable; urgency=low * Merge bubulle@debian.org--2005/apt--main--0 up to patch-186: @@ -292,16 +604,46 @@ apt (0.6.43.3) unstable; urgency=low * pl.po: Completed to 512t. Closes: #349514 * sk.po: Completed to 512t. Closes: #349474 * gl.po: Completed to 512 strings Closes: #349407 + * vi.po: Completed to 512 strings * sv.po: Completed to 512 strings Closes: #349210 * ru.po: Completed to 512 strings Closes: #349154 * da.po: Completed to 512 strings Closes: #349084 * fr.po: Completed to 512 strings + * LINGUAS: Add Welsh + * *.po: Updated from sources (512 strings) * vi.po: Completed to 511 strings Closes: #348968 - * zh_CN.po: Completed to 512t. Closes: #353936 - * it.po: Completed to 512t. Closes: #352803 - * pt_BR.po: Completed to 512t. Closes: #352419 + * apt-pkg/deb/deblistparser.cc: + - don't explode on a DepCompareOp in a Provides line, but warn about + it and ignore it otherwise (thanks to James Troup for reporting it) + * cmdline/apt-get.cc: + - don't lock the lists directory in DoInstall, breaks --print-uri + (thanks to James Troup for reporting it) + * debian/apt.dirs: create /etc/apt/sources.list.d + * make apt-cache madison work without deb-src entries (#352583) + * cmdline/apt-get.cc: only run the list-cleaner if a update was + successfull + * apt-get update errors are only warnings nowdays + * be more careful with the signature file on network failures + + -- Michael Vogt <mvo@debian.org> Wed, 22 Feb 2006 10:13:04 +0100 + +apt (0.6.43.2ubuntu1) dapper; urgency=low + + * Merge bubulle@debian.org--2005/apt--main--0 up to patch-182: + * ca.po: Completed to 512t. Closes: #351592 + * eu.po: Completed to 512t. Closes: #350483 + * ja.po: Completed to 512t. Closes: #349806 + * pl.po: Completed to 512t. Closes: #349514 + * sk.po: Completed to 512t. Closes: #349474 + * gl.po: Completed to 512 strings Closes: #349407 + * vi.po: Completed to 512 strings + * sv.po: Completed to 512 strings Closes: #349210 + * ru.po: Completed to 512 strings Closes: #349154 + * da.po: Completed to 512 strings Closes: #349084 + * fr.po: Completed to 512 strings * LINGUAS: Add Welsh * *.po: Updated from sources (512 strings) + * vi.po: Completed to 511 strings Closes: #348968 * apt-pkg/deb/deblistparser.cc: - don't explode on a DepCompareOp in a Provides line, but warn about it and ignore it otherwise (thanks to James Troup for reporting it) @@ -312,8 +654,10 @@ apt (0.6.43.3) unstable; urgency=low * make apt-cache madison work without deb-src entries (#352583) * cmdline/apt-get.cc: only run the list-cleaner if a update was successfull + * apt-get update errors are only warnings nowdays + * be more careful with the signature file on network failures - -- Michael Vogt <mvo@debian.org> Wed, 22 Feb 2006 10:13:04 +0100 + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 20 Feb 2006 22:27:48 +0100 apt (0.6.43.2) unstable; urgency=low @@ -338,8 +682,26 @@ apt (0.6.43.2) unstable; urgency=low -- Michael Vogt <mvo@debian.org> Thu, 19 Jan 2006 00:06:33 +0100 -apt (0.6.43.1) unstable; urgency=low +apt (0.6.43.1ubuntu1) dapper; urgency=low + + * Merge bubulle@debian.org--2005/apt--main--0 up to patch-159: + - en_GB.po, de.po: fix spaces errors in "Ign " translations + Closes: #347258 + - makefile: make update-po a pre-requisite of clean target so + that POT and PO files are always up-to-date + - sv.po: Completed to 511t. Closes: #346450 + - sk.po: Completed to 511t. Closes: #346369 + - fr.po: Completed to 511t + - *.po: Updated from sources (511 strings) + * add patch to fix http download corruption problem (thanks to + Petr Vandrovec, closes: #280844, #290694) + * added APT::Periodic::Unattended-Upgrade (requires the package + "unattended-upgrade") + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 10 Jan 2006 17:09:31 +0100 +apt (0.6.43.1) unstable; urgency=low + * Merge bubulle@debian.org--2005/apt--main--0 up to patch-148: * fr.po: Completed to 510 strings * it.po: Completed to 510t @@ -361,6 +723,19 @@ apt (0.6.43.1) unstable; urgency=low -- Michael Vogt <mvo@debian.org> Fri, 6 Jan 2006 01:17:08 +0100 +apt (0.6.43ubuntu2) dapper; urgency=low + + * merged some missing bits that wheren't merged by baz in the previous + upload (*grumble*) + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 8 Dec 2005 18:35:58 +0100 + +apt (0.6.43ubuntu1) dapper; urgency=low + + * merged with debian + + -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 25 Nov 2005 11:36:29 +0100 + apt (0.6.43) unstable; urgency=medium * Merge bubulle@debian.org--2005/apt--main--0 up to patch-132: @@ -381,6 +756,22 @@ apt (0.6.43) unstable; urgency=medium -- Michael Vogt <mvo@debian.org> Tue, 29 Nov 2005 00:17:07 +0100 +apt (0.6.42.3ubuntu2) dapper; urgency=low + + * Merge bubulle@debian.org--2005/apt--main--0 up to patch-131: + * zh_CN.po: Completed to 507 strings(Closes: #338267) + * gl.po: Completed to 510 strings (Closes: #338356) + * added support for "/etc/apt/sources.list.d" directory + (closes: #66325) + + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 14 Nov 2005 15:30:12 +0100 + +apt (0.6.42.3ubuntu1) dapper; urgency=low + + * synced with debian + + -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 10 Nov 2005 05:05:56 +0100 + apt (0.6.42.3) unstable; urgency=low * Merge bubulle@debian.org--2005/apt--main--0 up to patch-129: @@ -428,13 +819,13 @@ apt (0.6.42) unstable; urgency=low - unmount the cdrom when apt failed to locate any package files * allow cdrom failures and fallback to other sources in that case (closes: #44135) - * better error text when dpkg-source fails + * better error text when dpkg-source fails * Merge bubulle@debian.org--2005/apt--main--0 up to patch-115: - patch-99: Added Galician translation - patch-100: Completed Danish translation (Closes: #325686) - patch-104: French translation completed - patch-109: Italian translation completed - - patch-112: Swedish translation update + - patch-112: Swedish translation update - patch-115: Basque translation completed (Closes: #333299) * applied french man-page update (thanks to Philippe Batailler) (closes: #316638, #327456) @@ -448,12 +839,12 @@ apt (0.6.42) unstable; urgency=low * apt-pkg/contrib/md5.cc: - fix a alignment problem on sparc64 that gives random bus errors (thanks to Fabbione for providing a test-case) - * init the default ScreenWidth to 79 columns by default + * init the default ScreenWidth to 79 columns by default (Closes: #324921) - * cmdline/apt-cdrom.cc: + * cmdline/apt-cdrom.cc: - fix some missing gettext() calls (closes: #334539) * doc/apt-cache.8.xml: fix typo (closes: #334714) - + -- Michael Vogt <mvo@debian.org> Wed, 19 Oct 2005 22:02:09 +0200 apt (0.6.41) unstable; urgency=low @@ -461,8 +852,8 @@ apt (0.6.41) unstable; urgency=low * improved the support for "error" and "conffile" reporting from dpkg, added the format to README.progress-reporting * added README.progress-reporting to the apt-doc package - * improved the network timeout handling, if a index file from a - sources.list times out or EAI_AGAIN is returned from getaddrinfo, + * improved the network timeout handling, if a index file from a + sources.list times out or EAI_AGAIN is returned from getaddrinfo, don't try to get the other files from that entry * Support architecture-specific extra overrides (closes: #225947). Thanks to Anthony Towns for idea and @@ -470,10 +861,10 @@ apt (0.6.41) unstable; urgency=low * Javier Fernandez-Sanguino Pen~a: - Added a first version of an apt-secure.8 manpage, and modified apt-key and apt.end accordingly. Also added the 'update' - argument to apt-key which was previously not documented + argument to apt-key which was previously not documented (Closes: #322120) * Andreas Pakulat: - - added example apt-ftparchive.conf file to doc/examples + - added example apt-ftparchive.conf file to doc/examples (closes: #322483) * Fix a incorrect example in the man-page (closes: #282918) * Fix a bug for very long lines in the apt-cdrom code (closes: #280356) @@ -482,10 +873,84 @@ apt (0.6.41) unstable; urgency=low * Change pkgPolicy::Pin from private to protected to let subclasses access it too (closes: #321799) * add default constructor for PrvIterator (closes: #322267) - * Reread status configuration on debSystem::Initialize() + * Reread status configuration on debSystem::Initialize() (needed for apt-proxy, thanks to Otavio for this patch) - + -- Michael Vogt <mvo@debian.org> Mon, 5 Sep 2005 22:59:03 +0200 + +apt (0.6.40.1ubuntu8) breezy; urgency=low + + * Cherry picked michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-62: + - fix for a bad memory/file leak in the mmap code (ubuntu #15603) + * po/de.po, po/fr.po: + - updated the translations + * po/makefile: + - create a single pot file in each domain dir to make rosetta happy + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 28 Sep 2005 10:16:06 +0200 + +apt (0.6.40.1ubuntu7) breezy; urgency=low + + * updated the pot/po files , no code changes + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 27 Sep 2005 18:38:16 +0200 + +apt (0.6.40.1ubuntu6) breezy; urgency=low + + * Cherry picked michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-56: + - make it possible for apt to handle a failed MediaChange event and + fall back to other sources (ubuntu #13713) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 13 Sep 2005 22:09:50 +0200 + +apt (0.6.40.1ubuntu5) breezy; urgency=low + + * Cherry picked michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-{50,51}. + This adds media-change reporting to the apt status-fd (ubuntu #15213) + * Cherry picked michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-55: + apt-pkg/cdrom.cc: + - unmount the cdrom when apt failed to locate any package files + + -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 12 Sep 2005 15:44:26 +0200 + +apt (0.6.40.1ubuntu4) breezy; urgency=low + + * debian/apt.cron.daily: + - fix a embarrassing typo + + -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 7 Sep 2005 10:10:37 +0200 + +apt (0.6.40.1ubuntu3) breezy; urgency=low + + * debian/apt.cron.daily: + - use the ctime as well when figuring what packages need to + be removed. This fixes the problem that packages copied with + "cp -a" (e.g. from the installer) have old mtimes (ubuntu #14504) + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 6 Sep 2005 18:30:46 +0200 + +apt (0.6.40.1ubuntu2) breezy; urgency=low + + * improved the support for "error" and "conffile" reporting from + dpkg, added the format to README.progress-reporting + * added README.progress-reporting to the apt-doc package + * Do md5sum checking for file and cdrom method (closes: #319142) + * Change pkgPolicy::Pin from private to protected to let subclasses + access it too (closes: #321799) + * methods/connect.cc: + - send failure reason for EAI_AGAIN (TmpResolveFailure) to acuire-item + * apt-pkg/acquire-item.cc: + - fail early if a FailReason is TmpResolveFailure (avoids hangs during + the install when no network is available) + * merged michael.vogt@ubuntu.com--2005/apt--trust-cdrom--0 + + -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 23 Aug 2005 19:44:55 +0200 + +apt (0.6.40.1ubuntu1) breezy; urgency=low + + * Synchronize with Debian + + -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 5 Aug 2005 14:20:56 +0200 apt (0.6.40.1) unstable; urgency=low @@ -496,6 +961,12 @@ apt (0.6.40.1) unstable; urgency=low -- Michael Vogt <mvo@debian.org> Fri, 5 Aug 2005 13:24:58 +0200 +apt (0.6.40ubuntu1) breezy; urgency=low + + * Synchronize with Debian + + -- Matt Zimmerman <mdz@ubuntu.com> Thu, 4 Aug 2005 15:53:22 -0700 + apt (0.6.40) unstable; urgency=low * Patch from Jordi Mallach to mark some additional strings for translation @@ -511,6 +982,39 @@ apt (0.6.40) unstable; urgency=low -- Matt Zimmerman <mdz@debian.org> Thu, 28 Jul 2005 11:57:32 -0700 +apt (0.6.39ubuntu4) breezy; urgency=low + + * Fix keyring paths in apt-key, apt.postinst (I swear I remember doing this + before...) + + -- Matt Zimmerman <mdz@ubuntu.com> Wed, 29 Jun 2005 08:39:17 -0700 + +apt (0.6.39ubuntu3) breezy; urgency=low + + * Fix keyring locations for Ubuntu in apt-key too. + + -- Colin Watson <cjwatson@ubuntu.com> Wed, 29 Jun 2005 14:45:36 +0100 + +apt (0.6.39ubuntu2) breezy; urgency=low + + * Install ubuntu-archive.gpg rather than debian-archive.gpg as + /etc/apt/trusted.gpg. + + -- Colin Watson <cjwatson@ubuntu.com> Wed, 29 Jun 2005 11:53:34 +0100 + +apt (0.6.39ubuntu1) breezy; urgency=low + + * Michael Vogt + - Change debian/bugscript to use #!/bin/bash (Closes: #313402) + - Fix a incorrect example in the man-page (closes: #282918) + - Support architecture-specific extra overrides + (closes: #225947). Thanks to Anthony Towns for idea and + the patch, thanks to Colin Watson for testing it. + - better report network timeouts from the methods to the acuire code, + only timeout once per sources.list line + + -- Matt Zimmerman <mdz@ubuntu.com> Tue, 28 Jun 2005 11:52:24 -0700 + apt (0.6.39) unstable; urgency=low * Welsh translation update: daf@muse.19inch.net--2005/apt--main--0--patch-6 @@ -521,7 +1025,14 @@ apt (0.6.39) unstable; urgency=low * Update priority of apt-utils to important, to match the override file * Install only one keyring on each branch (Closes: #316119) - -- Matt Zimmerman <mdz@debian.org> Tue, 28 Jun 2005 11:51:09 -0700 + -- Matt Zimmerman <mdz@debian.org> Tue, 28 Jun 2005 11:35:21 -0700 + +apt (0.6.38ubuntu1) breezy; urgency=low + + * First release from Ubuntu branch + * Merge with --main--0, switch back to Ubuntu keyring + + -- Matt Zimmerman <mdz@ubuntu.com> Sat, 25 Jun 2005 16:52:41 -0700 apt (0.6.38) unstable; urgency=low @@ -553,6 +1064,7 @@ apt (0.6.37) breezy; urgency=low * Add Welsh translation from Dafydd Harries (daf@muse.19inch.net--2005/apt--main--0--patch-1) * Change debian/bugscript to use #!/bin/bash (Closes: #313402) + * Fix a incorrect example in the man-page (closes: #282918) -- Matt Zimmerman <mdz@ubuntu.com> Tue, 24 May 2005 14:38:25 -0700 diff --git a/debian/control b/debian/control index 3cba50acb..502edd0c6 100644 --- a/debian/control +++ b/debian/control @@ -1,11 +1,13 @@ Source: apt Section: admin Priority: important -Maintainer: APT Development Team <deity@lists.debian.org> +Maintainer: Michael Vogt <mvo@ubuntu.com> +XSBC-Original-Maintainer: APT Development Team <deity@lists.debian.org> Uploaders: Jason Gunthorpe <jgg@debian.org>, Adam Heath <doogie@debian.org>, Matt Zimmerman <mdz@debian.org>, Michael Vogt <mvo@debian.org> Standards-Version: 3.6.2.2 -Build-Depends: debhelper (>= 5.0), libdb4.4-dev, gettext (>= 0.12) +Build-Depends: debhelper (>= 5.0), libdb4.4-dev, gettext (>= 0.12), libcurl3-gnutls-dev (>= 7.15.5) Build-Depends-Indep: debiandoc-sgml, docbook-utils (>= 0.6.12-1) +XS-Vcs-Bzr: http://bazaar.launchpad.net/~ubuntu-core-dev/apt/ubuntu Package: apt Architecture: any @@ -13,7 +15,7 @@ Depends: ${shlibs:Depends} Priority: important Replaces: libapt-pkg-doc (<< 0.3.7), libapt-pkg-dev (<< 0.3.7) Provides: ${libapt-pkg:provides} -Recommends: debian-archive-keyring +Recommends: ubuntu-keyring Suggests: aptitude | synaptic | gnome-apt | wajig, dpkg-dev, apt-doc, bzip2, gnupg Section: admin Description: Advanced front-end for dpkg @@ -65,3 +67,12 @@ Description: APT utility programs apt-extracttemplates is used by debconf to prompt for configuration questions before installation. apt-ftparchive is used to create Package and other index files. apt-sortpkgs is a Package/Source file normalizer. + +Package: apt-transport-https +Architecture: any +Depends: ${shlibs:Depends} +Priority: optional +Section: admin +Description: APT https transport + This package contains a APT https transport. It makes it possible to + use 'deb https://foo distro main' lines in the sources.list. diff --git a/debian/rules b/debian/rules index 02ee734bb..3defd3c29 100755 --- a/debian/rules +++ b/debian/rules @@ -185,7 +185,7 @@ apt-doc: build-doc # Build architecture-dependent files here. -binary-arch: apt libapt-pkg-dev apt-utils +binary-arch: apt-transport-https apt libapt-pkg-dev apt-utils apt: build debian/shlibs.local dh_testdir -p$@ dh_testroot -p$@ @@ -210,10 +210,19 @@ apt: build debian/shlibs.local cp debian/bugscript debian/$@/usr/share/bug/apt/script - cp share/debian-archive.gpg debian/$@/usr/share/$@ - + cp share/ubuntu-archive.gpg debian/$@/usr/share/$@ + cp debian/apt.conf.ubuntu debian/$@/etc/apt/apt.conf.d/01ubuntu # head -n 500 ChangeLog > debian/ChangeLog + # make rosetta happy and remove pot files in po/ (but leave stuff + # in po/domains/* untouched) and cp *.po into each domain dir + rm -f build/po/*.pot + rm -f po/*.pot + + # move the mirror failure script in place + mv debian/$@/usr/bin/apt-report-mirror-failure \ + debian/$@/usr/lib/apt/apt-report-mirror-failure \ + dh_installexamples -p$@ $(BLD)/docs/examples/* dh_installman -p$@ dh_installcron -p$@ @@ -286,6 +295,32 @@ apt-utils: build debian/shlibs.local dh_md5sums -p$@ dh_builddeb -p$@ +apt-transport-https: build debian/shlibs.local + dh_testdir -p$@ + dh_testroot -p$@ + dh_clean -p$@ -k + dh_installdirs -p$@ + + # install the method + mkdir -p debian/$@/usr/lib/apt/methods + mv $(BLD)/bin/methods/https debian/$@/usr/lib/apt/methods + + dh_installdocs -p$@ + dh_installexamples -p$@ + + # Install the man pages.. + dh_installman -p$@ + + dh_installchangelogs -p$@ + dh_strip -p$@ + dh_compress -p$@ + dh_fixperms -p$@ + dh_installdeb -p$@ + dh_shlibdeps -p$@ -l`pwd`/debian/apt/usr/lib:`pwd`/debian/$@/usr/lib + dh_gencontrol -p$@ + dh_md5sums -p$@ + dh_builddeb -p$@ + source diff: @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false @@ -338,4 +373,4 @@ arch-build: mkdir -p debian/arch-build/apt-$(APT_DEBVER) tar -c --exclude=arch-build --no-recursion -f - `bzr inventory` | (cd debian/arch-build/$(PKG)-$(APT_DEBVER);tar xf -) $(MAKE) -C debian/arch-build/apt-$(APT_DEBVER) startup doc - (cd debian/arch-build/apt-$(APT_DEBVER); $(DEB_BUILD_PROG)) + (cd debian/arch-build/apt-$(APT_DEBVER); $(DEB_BUILD_PROG); dpkg-genchanges -S > ../apt_$(APT_DEBVER)_source.changes) diff --git a/doc/apt-cache.8.xml b/doc/apt-cache.8.xml index 2779f2501..c1e65332d 100644 --- a/doc/apt-cache.8.xml +++ b/doc/apt-cache.8.xml @@ -151,7 +151,7 @@ Reverse Provides: a dependency but were not provided by any package. Missing packages may be in evidence if a full distribution is not accessed, or if a package (real or virtual) has been dropped from the distribution. Usually they - are referenced from Conflicts statements.</para> + are referenced from Conflicts or Breaks statements.</para> </listitem> <listitem><para><literal>Total distinct</literal> versions is the number of package versions diff --git a/doc/apt-get.8.xml b/doc/apt-get.8.xml index 17f663a35..3c245b83b 100644 --- a/doc/apt-get.8.xml +++ b/doc/apt-get.8.xml @@ -47,6 +47,7 @@ <arg>check</arg> <arg>clean</arg> <arg>autoclean</arg> + <arg>autoremove</arg> </group> </cmdsynopsis> </refsynopsisdiv> @@ -203,6 +204,11 @@ <literal>APT::Clean-Installed</literal> will prevent installed packages from being erased if it is set to off.</para></listitem> </varlistentry> + + <varlistentry><term>autoremove</term> + <listitem><para><literal>autoremove</literal> is used to remove packages that were automatically + installed to satisfy dependencies for some package and that are no more needed.</para></listitem> + </varlistentry> </variablelist> </refsect1> @@ -382,6 +388,13 @@ Configuration Item: <literal>APT::Get::Remove</literal>.</para></listitem> </varlistentry> + <varlistentry><term><option>--auto-remove</option></term> + <listitem><para>If the command is either <literal>install</literal> or <literal>remove</literal>, + then this option acts like running <literal>autoremove</literal> command, removing the unused + dependency packages. Configuration Item: <literal>APT::Get::AutomaticRemove</literal>. + </para></listitem> + </varlistentry> + <varlistentry><term><option>--only-source</option></term> <listitem><para>Only has meaning for the <literal>source</literal> and <literal>build-dep</literal> diff --git a/doc/apt_preferences.5.xml b/doc/apt_preferences.5.xml index 175339f5a..ab0107d36 100644 --- a/doc/apt_preferences.5.xml +++ b/doc/apt_preferences.5.xml @@ -184,7 +184,7 @@ belonging to any distribution whose Archive name is "<literal>unstable</literal> <programlisting> Package: * Pin: release a=unstable -Pin-Priority: 50 +Pin-Priority: 500 </programlisting> <simpara>The following record assigns a high priority to all package versions diff --git a/doc/cache.sgml b/doc/cache.sgml index aa87db986..e257dcd81 100644 --- a/doc/cache.sgml +++ b/doc/cache.sgml @@ -492,7 +492,7 @@ This is the parsed priority value of the package. Dependency contains the information for a single dependency record. The records are split up like this to ease processing by the client. The base of list linked list is Version.DependsList. All forms of dependencies are recorded -here including Conflicts, Suggests and Recommends. +here including Conflicts, Breaks, Suggests and Recommends. <p> Multiple depends on the same package must be grouped together in @@ -671,6 +671,7 @@ of them. #define pkgDEP_Recommends 4 #define pkgDEP_Conflicts 5 #define pkgDEP_Replaces 6 +#define pkgDEP_Breaks 8 </example> </sect1> diff --git a/doc/dpkg-tech.sgml b/doc/dpkg-tech.sgml index 23372d71f..7c6e023dd 100644 --- a/doc/dpkg-tech.sgml +++ b/doc/dpkg-tech.sgml @@ -46,6 +46,8 @@ The basic dpkg package control file supports the following major features:- productivity of the package <item>Conflicts, to specify a package which must NOT be installed in order for the package to be configured + <item>Breaks, to specify a package which is broken by the + package and which should therefore not be configured while broken </list> Each of these dependencies can specify a version and a depedency on that version, for example "<= 0.5-1", "== 2.7.2-1", etc. The comparators available diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 73e20aa43..baa8b9a5c 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -24,11 +24,16 @@ APT { Architecture "i386"; Build-Essential "build-essential"; - + + NeverAutoRemove { "linux-kernel.*"; }; // packages that should never + // considered for autoRemove + // Options for apt-get Get { Arch-Only "false"; + AutomaticRemove "false"; + HideAutoRemove "false"; Download-Only "false"; Simulate "false"; Assume-Yes "false"; @@ -90,6 +95,16 @@ APT Cache-Limit "4194304"; Default-Release ""; + // consider Recommends, Suggests as important dependencies that should + // be installed by default + Install-Recommends "false"; + Install-Suggests "false"; + + // install recommends automatically for packages in this section + Install-Recommends-Section "metapackages"; + + // consider dependencies of packages in this section manual + Never-MarkAuto-Section "metapackages"; // Write progress messages on this fd (for stuff like base-config) Status-Fd "-1"; @@ -120,6 +135,18 @@ Acquire Dl-Limit "7"; // 7Kb/sec maximum download rate }; + // HTTPS method configuration: + // - uses the http proxy config + // - uses the http cache-control values + // - uses the http Dl-Limit values + https + { + Verify-Peer "false"; + SslCert "/etc/apt/some.pem"; + CaPath "/etc/ssl/certs"; + Verify-Host" "2"; + }; + ftp { Proxy "ftp://127.0.0.1/"; @@ -160,6 +187,20 @@ Acquire { Options {"--ignore-time-conflict";} // not very usefull on a normal system }; + + mirror + { + RefreshInterval "360"; // refresh interval in minutes + MaxAge "90"; // max age for a mirror file in days before + // it gets deleted + // mirror failure reporting script + ProblemReporting "/usr/lib/apt/apt-report-mirror-failure"; + // mirror failure reporting url + ReportFailures "http://example.com/mirror-failure"; + }; + + // translations can be set here to "none", "environment" or "$locale" + Translation "none"; }; // Directory layout @@ -173,6 +214,7 @@ Dir "/" userstatus "status.user"; status "/var/lib/dpkg/status"; cdroms "cdroms.list"; + mirrors "mirrors/"; }; // Location of the cache dir @@ -255,16 +297,17 @@ Debug pkgDPkgPM "false"; pkgDPkgProgressReporting "false"; pkgOrderList "false"; + pkgAutoRemove "false"; // show information about automatic removes BuildDeps "false"; - pkgInitialize "false"; // This one will dump the configuration space NoLocking "false"; Acquire::Ftp "false"; // Show ftp command traffic Acquire::Http "false"; // Show http command traffic + Acquire::Https "false"; // Show https debug Acquire::gpgv "false"; // Show the gpgv traffic + Acquire::Mirror "false"; // Show debugging of the mirror method aptcdrom "false"; // Show found package files IdentCdrom "false"; - } /* Whatever you do, do not use this configuration file!! Take out ONLY diff --git a/doc/examples/sources.list b/doc/examples/sources.list index 9af1c3c4c..a958899ae 100644 --- a/doc/examples/sources.list +++ b/doc/examples/sources.list @@ -1,9 +1,11 @@ # See sources.list(5) for more information, especialy # Remember that you can only use http, ftp or file URIs # CDROMs are managed through the apt-cdrom tool. -deb http://http.us.debian.org/debian stable main contrib non-free -deb http://security.debian.org stable/updates main contrib non-free +deb http://us.archive.ubuntu.com/ubuntu dapper main restricted +deb-src http://us.archive.ubuntu.com/ubuntu dapper main restricted -# Uncomment if you want the apt-get source function to work -#deb-src http://http.us.debian.org/debian stable main contrib non-free -#deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free +deb http://security.ubuntu.com/ubuntu dapper-security main restricted +deb-src http://security.ubuntu.com/ubuntu dapper-security main restricted + +deb http://us.archive.ubuntu.com/ubuntu dapper-updates main restricted +deb-src http://us.archive.ubuntu.com/ubuntu dapper-updates main restricted diff --git a/methods/connect.cc b/methods/connect.cc index 8c2ac6d56..145001fb3 100644 --- a/methods/connect.cc +++ b/methods/connect.cc @@ -18,6 +18,7 @@ #include <stdio.h> #include <errno.h> #include <unistd.h> +#include <sstream> // Internet stuff #include <netinet/in.h> @@ -67,12 +68,10 @@ static bool DoConnect(struct addrinfo *Addr,string Host, wrong this will get tacked onto the end of the error message */ if (LastHostAddr->ai_next != 0) { - char Name2[NI_MAXHOST + NI_MAXSERV + 10]; - snprintf(Name2,sizeof(Name2),_("[IP: %s %s]"),Name,Service); - Owner->SetFailExtraMsg(string(Name2)); - } - else - Owner->SetFailExtraMsg(""); + std::stringstream ss; + ioprintf(ss, _("[IP: %s %s]"),Name,Service); + Owner->SetIP(ss.str()); + } // Get a socket if ((Fd = socket(Addr->ai_family,Addr->ai_socktype, @@ -89,7 +88,7 @@ static bool DoConnect(struct addrinfo *Addr,string Host, /* This implements a timeout for connect by opening the connection nonblocking */ if (WaitFd(Fd,true,TimeOut) == false) { - Owner->SetFailExtraMsg("\nFailReason: Timeout"); + Owner->SetFailReason("Timeout"); return _error->Error(_("Could not connect to %s:%s (%s), " "connection timed out"),Host.c_str(),Service,Name); } @@ -104,7 +103,7 @@ static bool DoConnect(struct addrinfo *Addr,string Host, { errno = Err; if(errno == ECONNREFUSED) - Owner->SetFailExtraMsg("\nFailReason: ConnectionRefused"); + Owner->SetFailReason("ConnectionRefused"); return _error->Errno("connect",_("Could not connect to %s:%s (%s)."),Host.c_str(), Service,Name); } @@ -164,12 +163,13 @@ bool Connect(string Host,int Port,const char *Service,int DefPort,int &Fd, DefPort = 0; continue; } + Owner->SetFailReason("ResolveFailure"); return _error->Error(_("Could not resolve '%s'"),Host.c_str()); } if (Res == EAI_AGAIN) { - Owner->SetFailExtraMsg("\nFailReason: TmpResolveFailure"); + Owner->SetFailReason("TmpResolveFailure"); return _error->Error(_("Temporary failure resolving '%s'"), Host.c_str()); } diff --git a/methods/http.cc b/methods/http.cc index 06b91686c..ecfb80bd2 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -38,7 +38,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <iostream> #include <apti18n.h> // Internet stuff @@ -58,7 +57,7 @@ time_t HttpMethod::FailTime = 0; unsigned long PipelineDepth = 10; unsigned long TimeOut = 120; bool Debug = false; - +URI Proxy; unsigned long CircleBuf::BwReadLimit=0; unsigned long CircleBuf::BwTickReadData=0; @@ -715,7 +714,7 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) Req += string("Authorization: Basic ") + Base64Encode(Uri.User + ":" + Uri.Password) + "\r\n"; - Req += "User-Agent: Debian APT-HTTP/1.3 ("VERSION")\r\n\r\n"; + Req += "User-Agent: Ubuntu APT-HTTP/1.3 ("VERSION")\r\n\r\n"; if (Debug == true) cerr << Req << endl; @@ -916,6 +915,9 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) failure */ if (Srv->Result < 200 || Srv->Result >= 300) { + char err[255]; + snprintf(err,sizeof(err)-1,"HttpError%i",Srv->Result); + SetFailReason(err); _error->Error("%u %s",Srv->Result,Srv->Code); if (Srv->HaveContent == true) return 4; @@ -991,7 +993,7 @@ void HttpMethod::SigTerm(int) depth. */ bool HttpMethod::Fetch(FetchItem *) { - if (Server == 0) + if (Server == 0) return true; // Queue the requests @@ -1224,13 +1226,5 @@ int HttpMethod::Loop() } /*}}}*/ -int main() -{ - setlocale(LC_ALL, ""); - - HttpMethod Mth; - - return Mth.Loop(); -} diff --git a/methods/http.h b/methods/http.h index 541e2952c..5eac11401 100644 --- a/methods/http.h +++ b/methods/http.h @@ -13,7 +13,7 @@ #define MAXLEN 360 -#include <iostream> + using std::cout; using std::endl; @@ -134,7 +134,6 @@ class HttpMethod : public pkgAcqMethod bool ServerDie(ServerState *Srv); int DealWithHeaders(FetchResult &Res,ServerState *Srv); - virtual bool Fetch(FetchItem *); virtual bool Configuration(string Message); // In the event of a fatal signal this file will be closed and timestamped. @@ -142,6 +141,9 @@ class HttpMethod : public pkgAcqMethod static int FailFd; static time_t FailTime; static void SigTerm(int); + + protected: + virtual bool Fetch(FetchItem *); public: friend class ServerState; @@ -158,6 +160,5 @@ class HttpMethod : public pkgAcqMethod }; }; -URI Proxy; #endif diff --git a/methods/http_main.cc b/methods/http_main.cc new file mode 100644 index 000000000..2c46ab19d --- /dev/null +++ b/methods/http_main.cc @@ -0,0 +1,15 @@ +#include <apt-pkg/fileutl.h> +#include <apt-pkg/acquire-method.h> + +#include "connect.h" +#include "rfc2553emu.h" +#include "http.h" + + +int main() +{ + setlocale(LC_ALL, ""); + + HttpMethod Mth; + return Mth.Loop(); +} diff --git a/methods/https.cc b/methods/https.cc new file mode 100644 index 000000000..b758e4ab3 --- /dev/null +++ b/methods/https.cc @@ -0,0 +1,249 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: http.cc,v 1.59 2004/05/08 19:42:35 mdz Exp $ +/* ###################################################################### + + HTTPS Aquire Method - This is the HTTPS aquire method for APT. + + It uses libcurl + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include <apt-pkg/fileutl.h> +#include <apt-pkg/acquire-method.h> +#include <apt-pkg/error.h> +#include <apt-pkg/hashes.h> + +#include <sys/stat.h> +#include <sys/time.h> +#include <utime.h> +#include <unistd.h> +#include <signal.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <iostream> +#include <apti18n.h> +#include <sstream> + +#include "config.h" +#include "https.h" + + /*}}}*/ +using namespace std; + +size_t +HttpsMethod::write_data(void *buffer, size_t size, size_t nmemb, void *userp) +{ + HttpsMethod *me = (HttpsMethod *)userp; + + if(me->File->Write(buffer, size*nmemb) != true) + return false; + + return size*nmemb; +} + +int +HttpsMethod::progress_callback(void *clientp, double dltotal, double dlnow, + double ultotal, double ulnow) +{ + HttpsMethod *me = (HttpsMethod *)clientp; + if(dltotal > 0 && me->Res.Size == 0) { + me->Res.Size = dltotal; + me->URIStart(me->Res); + } + return 0; +} + +bool HttpsMethod::SetupProxy() +{ + URI ServerName = Queue->Uri; + + // Determine the proxy setting + if (getenv("http_proxy") == 0) + { + string DefProxy = _config->Find("Acquire::http::Proxy"); + string SpecificProxy = _config->Find("Acquire::http::Proxy::" + ServerName.Host); + if (SpecificProxy.empty() == false) + { + if (SpecificProxy == "DIRECT") + Proxy = ""; + else + Proxy = SpecificProxy; + } + else + Proxy = DefProxy; + } + + // Parse no_proxy, a , separated list of domains + if (getenv("no_proxy") != 0) + { + if (CheckDomainList(ServerName.Host,getenv("no_proxy")) == true) + Proxy = ""; + } + + // Determine what host and port to use based on the proxy settings + int Port = 0; + string Host; + if (Proxy.empty() == true || Proxy.Host.empty() == true) + { + } + else + { + if (Proxy.Port != 0) + curl_easy_setopt(curl, CURLOPT_PROXYPORT, Proxy.Port); + curl_easy_setopt(curl, CURLOPT_PROXY, Proxy.Host.c_str()); + } +} + + +// HttpsMethod::Fetch - Fetch an item /*{{{*/ +// --------------------------------------------------------------------- +/* This adds an item to the pipeline. We keep the pipeline at a fixed + depth. */ +bool HttpsMethod::Fetch(FetchItem *Itm) +{ + stringstream ss; + struct stat SBuf; + struct curl_slist *headers=NULL; + char curl_errorstr[CURL_ERROR_SIZE]; + + // TODO: + // - http::Timeout + // - http::Pipeline-Depth + // - error checking/reporting + // - more debug options? (CURLOPT_DEBUGFUNCTION?) + + SetupProxy(); + + // callbacks + curl_easy_setopt(curl, CURLOPT_URL, Itm->Uri.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); + curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback); + curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, this); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); + + // FIXME: https: offer various options of verification + bool peer_verify = _config->FindB("Acquire::https::Verify-Peer", false); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, peer_verify); + + // sslcert file + string pem = _config->Find("Acquire::https::SslCert",""); + if(pem != "") + curl_easy_setopt(curl, CURLOPT_SSLCERT, pem.c_str()); + + // CA-Dir + string certdir = _config->Find("Acquire::https::CaPath",""); + if(certdir != "") + curl_easy_setopt(curl, CURLOPT_CAPATH, certdir.c_str()); + + // Server-verify + int verify = _config->FindI("Acquire::https::Verify-Host",2); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, verify); + + // cache-control + if(_config->FindB("Acquire::http::No-Cache",false) == false) + { + // cache enabled + if (_config->FindB("Acquire::http::No-Store",false) == true) + headers = curl_slist_append(headers,"Cache-Control: no-store"); + ioprintf(ss, "Cache-Control: max-age=%u", _config->FindI("Acquire::http::Max-Age",0)); + headers = curl_slist_append(headers, ss.str().c_str()); + } else { + // cache disabled by user + headers = curl_slist_append(headers, "Cache-Control: no-cache"); + headers = curl_slist_append(headers, "Pragma: no-cache"); + } + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + + // set time values + curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); + curl_easy_setopt(curl, CURLOPT_TIMEVALUE, Itm->LastModified); + + // speed limit + int dlLimit = _config->FindI("Acquire::http::Dl-Limit",0)*1024; + if (dlLimit > 0) + curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, dlLimit); + + // set header + curl_easy_setopt(curl, CURLOPT_USERAGENT,"Debian APT-CURL/1.0 ("VERSION")"); + + // debug + if(_config->FindB("Debug::Acquire::https", false)) + curl_easy_setopt(curl, CURLOPT_VERBOSE, true); + + // error handling + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errorstr); + + // In this case we send an if-range query with a range header + if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0) + curl_easy_setopt(curl, CURLOPT_RESUME_FROM, (long)SBuf.st_size); + + // go for it - if the file exists, append on it + File = new FileFd(Itm->DestFile, FileFd::WriteAny); + File->Seek(File->Size()); + + // keep apt updated + Res.Filename = Itm->DestFile; + + // get it! + CURLcode success = curl_easy_perform(curl); + + + // cleanup + if(success != 0) { + _error->Error(curl_errorstr); + Fail(); + return true; + } + + if (Res.Size == 0) + Res.Size = File->Size(); + + // check the downloaded result + struct stat Buf; + if (stat(File->Name().c_str(),&Buf) == 0) + { + Res.Size = Buf.st_size; + Res.Filename = File->Name(); + Res.LastModified = Buf.st_mtime; + Res.IMSHit = false; + if (Itm->LastModified != 0 && Buf.st_mtime >= Itm->LastModified) + { + Res.IMSHit = true; + Res.LastModified = Itm->LastModified; + } + } + + // take hashes + Hashes Hash; + FileFd Fd(Res.Filename, FileFd::ReadOnly); + Hash.AddFD(Fd.Fd(), Fd.Size()); + Res.TakeHashes(Hash); + + // keep apt updated + URIDone(Res); + + // cleanup + File->Close(); + Res.Size = 0; + delete File; + curl_slist_free_all(headers); + + return true; +}; + +int main() +{ + setlocale(LC_ALL, ""); + + HttpsMethod Mth; + curl_global_init(CURL_GLOBAL_SSL) ; + + return Mth.Run(); +} + + diff --git a/methods/https.h b/methods/https.h new file mode 100644 index 000000000..6620a10fc --- /dev/null +++ b/methods/https.h @@ -0,0 +1,48 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $ +// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $ +/* ###################################################################### + + HTTP Aquire Method - This is the HTTP aquire method for APT. + + ##################################################################### */ + /*}}}*/ + +#ifndef APT_HTTP_H +#define APT_HTTP_H + +#define MAXLEN 360 + +#include <iostream> +#include <curl/curl.h> + +using std::cout; +using std::endl; + +class HttpsMethod; + + +class HttpsMethod : public pkgAcqMethod +{ + + virtual bool Fetch(FetchItem *); + static size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp); + static int progress_callback(void *clientp, double dltotal, double dlnow, + double ultotal, double ulnow); + bool SetupProxy(); + CURL *curl; + FetchResult Res; + + public: + FileFd *File; + + HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig) + { + File = 0; + curl = curl_easy_init(); + }; +}; + +URI Proxy; + +#endif diff --git a/methods/makefile b/methods/makefile index 3f561a2c3..610bd5b49 100644 --- a/methods/makefile +++ b/methods/makefile @@ -7,7 +7,7 @@ include ../buildlib/defaults.mak BIN := $(BIN)/methods # FIXME.. -LIB_APT_PKG_MAJOR = 3.12 +LIB_APT_PKG_MAJOR = 3.53 APT_DOMAIN := libapt-pkg$(LIB_APT_PKG_MAJOR) # The file method @@ -49,7 +49,14 @@ include $(PROGRAM_H) PROGRAM=http SLIBS = -lapt-pkg $(SOCKETLIBS) LIB_MAKES = apt-pkg/makefile -SOURCE = http.cc rfc2553emu.cc connect.cc +SOURCE = http.cc http_main.cc rfc2553emu.cc connect.cc +include $(PROGRAM_H) + +# The https method +PROGRAM=https +SLIBS = -lapt-pkg -lcurl +LIB_MAKES = apt-pkg/makefile +SOURCE = https.cc include $(PROGRAM_H) # The ftp method @@ -66,6 +73,13 @@ LIB_MAKES = apt-pkg/makefile SOURCE = rsh.cc include $(PROGRAM_H) +# The mirror method +PROGRAM=mirror +SLIBS = -lapt-pkg $(SOCKETLIBS) +LIB_MAKES = apt-pkg/makefile +SOURCE = mirror.cc http.cc rfc2553emu.cc connect.cc +include $(PROGRAM_H) + # SSH and vzip2 method symlink binary: $(BIN)/ssh $(BIN)/bzip2 veryclean: clean-$(BIN)/ssh clean-$(BIN)/bzip2 diff --git a/methods/mirror.cc b/methods/mirror.cc new file mode 100644 index 000000000..9fe64fd70 --- /dev/null +++ b/methods/mirror.cc @@ -0,0 +1,282 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: mirror.cc,v 1.59 2004/05/08 19:42:35 mdz Exp $ +/* ###################################################################### + + Mirror Aquire Method - This is the Mirror aquire method for APT. + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include <apt-pkg/fileutl.h> +#include <apt-pkg/acquire-method.h> +#include <apt-pkg/acquire-item.h> +#include <apt-pkg/acquire.h> +#include <apt-pkg/error.h> +#include <apt-pkg/hashes.h> +#include <apt-pkg/sourcelist.h> + +#include <fstream> +#include <iostream> +#include <stdarg.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <dirent.h> + +using namespace std; + +#include "mirror.h" +#include "http.h" +#include "apti18n.h" + /*}}}*/ + +/* Done: + * - works with http (only!) + * - always picks the first mirror from the list + * - call out to problem reporting script + * - supports "deb mirror://host/path/to/mirror-list/// dist component" + * - uses pkgAcqMethod::FailReason() to have a string representation + * of the failure that is also send to LP + * + * TODO: + * - deal with runing as non-root because we can't write to the lists + dir then -> use the cached mirror file + * - better method to download than having a pkgAcquire interface here + * and better error handling there! + * - support more than http + * - testing :) + */ + +MirrorMethod::MirrorMethod() + : HttpMethod(), HasMirrorFile(false) +{ +}; + +// HttpMethod::Configuration - Handle a configuration message /*{{{*/ +// --------------------------------------------------------------------- +/* We stash the desired pipeline depth */ +bool MirrorMethod::Configuration(string Message) +{ + if (pkgAcqMethod::Configuration(Message) == false) + return false; + Debug = _config->FindB("Debug::Acquire::mirror",false); + + return true; +} + /*}}}*/ + +// clean the mirrors dir based on ttl information +bool MirrorMethod::Clean(string Dir) +{ + vector<metaIndex *>::const_iterator I; + + if(Debug) + clog << "MirrorMethod::Clean(): " << Dir << endl; + + // read sources.list + pkgSourceList list; + list.ReadMainList(); + + DIR *D = opendir(Dir.c_str()); + if (D == 0) + return _error->Errno("opendir",_("Unable to read %s"),Dir.c_str()); + + string StartDir = SafeGetCWD(); + if (chdir(Dir.c_str()) != 0) + { + closedir(D); + return _error->Errno("chdir",_("Unable to change to %s"),Dir.c_str()); + } + + for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D)) + { + // Skip some files.. + if (strcmp(Dir->d_name,"lock") == 0 || + strcmp(Dir->d_name,"partial") == 0 || + strcmp(Dir->d_name,".") == 0 || + strcmp(Dir->d_name,"..") == 0) + continue; + + // see if we have that uri + for(I=list.begin(); I != list.end(); I++) + { + string uri = (*I)->GetURI(); + if(uri.substr(0,strlen("mirror://")) != string("mirror://")) + continue; + string BaseUri = uri.substr(0,uri.size()-1); + if (URItoFileName(BaseUri) == Dir->d_name) + break; + } + // nothing found, nuke it + if (I == list.end()) + unlink(Dir->d_name); + }; + + chdir(StartDir.c_str()); + closedir(D); + return true; +} + + +bool MirrorMethod::GetMirrorFile(string mirror_uri_str) +{ + /* + - a mirror_uri_str looks like this: + mirror://people.ubuntu.com/~mvo/apt/mirror/mirrors/dists/feisty/Release.gpg + + - the matching source.list entry + deb mirror://people.ubuntu.com/~mvo/apt/mirror/mirrors feisty main + + - we actually want to go after: + http://people.ubuntu.com/~mvo/apt/mirror/mirrors + + And we need to save the BaseUri for later: + - mirror://people.ubuntu.com/~mvo/apt/mirror/mirrors + + FIXME: what if we have two similar prefixes? + mirror://people.ubuntu.com/~mvo/mirror + mirror://people.ubuntu.com/~mvo/mirror2 + then mirror_uri_str looks like: + mirror://people.ubuntu.com/~mvo/apt/mirror/dists/feisty/Release.gpg + mirror://people.ubuntu.com/~mvo/apt/mirror2/dists/feisty/Release.gpg + we search sources.list and find: + mirror://people.ubuntu.com/~mvo/apt/mirror + in both cases! So we need to apply some domain knowledge here :( and + check for /dists/ or /Release.gpg as suffixes + */ + if(Debug) + std::cerr << "GetMirrorFile: " << mirror_uri_str << std::endl; + + // read sources.list and find match + vector<metaIndex *>::const_iterator I; + pkgSourceList list; + list.ReadMainList(); + for(I=list.begin(); I != list.end(); I++) + { + string uristr = (*I)->GetURI(); + if(Debug) + std::cerr << "Checking: " << uristr << std::endl; + if(uristr.substr(0,strlen("mirror://")) != string("mirror://")) + continue; + // find matching uri in sources.list + if(mirror_uri_str.substr(0,uristr.size()) == uristr) + { + if(Debug) + std::cerr << "found BaseURI: " << uristr << std::endl; + BaseUri = uristr.substr(0,uristr.size()-1); + } + } + string fetch = BaseUri; + fetch.replace(0,strlen("mirror://"),"http://"); + + // get new file + MirrorFile = _config->FindDir("Dir::State::mirrors") + URItoFileName(BaseUri); + + if(Debug) + { + cerr << "base-uri: " << BaseUri << endl; + cerr << "mirror-file: " << MirrorFile << endl; + } + + // check the file, if it is not older than RefreshInterval just use it + // otherwise try to get a new one + if(FileExists(MirrorFile)) + { + struct stat buf; + time_t t,now,refresh; + if(stat(MirrorFile.c_str(), &buf) != 0) + return false; + t = std::max(buf.st_mtime, buf.st_ctime); + now = time(NULL); + refresh = 60*_config->FindI("Acquire::Mirror::RefreshInterval",360); + if(t + refresh > now) + { + if(Debug) + clog << "Mirror file is in RefreshInterval" << endl; + HasMirrorFile = true; + return true; + } + if(Debug) + clog << "Mirror file " << MirrorFile << " older than " << refresh << "min, re-download it" << endl; + } + + // not that great to use pkgAcquire here, but we do not have + // any other way right now + pkgAcquire Fetcher; + new pkgAcqFile(&Fetcher, fetch, "", 0, "", "", "", MirrorFile); + bool res = (Fetcher.Run() == pkgAcquire::Continue); + if(res) + HasMirrorFile = true; + Fetcher.Shutdown(); + return res; +} + +bool MirrorMethod::SelectMirror() +{ + // FIXME: make the mirror selection more clever, do not + // just use the first one! + ifstream in(MirrorFile.c_str()); + getline(in, Mirror); + if(Debug) + cerr << "Using mirror: " << Mirror << endl; + + UsedMirror = Mirror; + return true; +} + +// MirrorMethod::Fetch - Fetch an item /*{{{*/ +// --------------------------------------------------------------------- +/* This adds an item to the pipeline. We keep the pipeline at a fixed + depth. */ +bool MirrorMethod::Fetch(FetchItem *Itm) +{ + // select mirror only once per session + if(!HasMirrorFile) + { + Clean(_config->FindDir("Dir::State::mirrors")); + GetMirrorFile(Itm->Uri); + SelectMirror(); + } + + for (FetchItem *I = Queue; I != 0; I = I->Next) + { + if(I->Uri.find("mirror://") != string::npos) + I->Uri.replace(0,BaseUri.size(),Mirror); + } + + // now run the real fetcher + return HttpMethod::Fetch(Itm); +}; + +void MirrorMethod::Fail(string Err,bool Transient) +{ + if(Queue->Uri.find("http://") != string::npos) + Queue->Uri.replace(0,Mirror.size(), BaseUri); + pkgAcqMethod::Fail(Err, Transient); +} + +void MirrorMethod::URIStart(FetchResult &Res) +{ + if(Queue->Uri.find("http://") != string::npos) + Queue->Uri.replace(0,Mirror.size(), BaseUri); + pkgAcqMethod::URIStart(Res); +} + +void MirrorMethod::URIDone(FetchResult &Res,FetchResult *Alt) +{ + if(Queue->Uri.find("http://") != string::npos) + Queue->Uri.replace(0,Mirror.size(), BaseUri); + pkgAcqMethod::URIDone(Res, Alt); +} + + +int main() +{ + setlocale(LC_ALL, ""); + + MirrorMethod Mth; + + return Mth.Loop(); +} + + diff --git a/methods/mirror.h b/methods/mirror.h new file mode 100644 index 000000000..798f5a9b5 --- /dev/null +++ b/methods/mirror.h @@ -0,0 +1,51 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $ +// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $ +/* ###################################################################### + + MIRROR Aquire Method - This is the MIRROR aquire method for APT. + + ##################################################################### */ + /*}}}*/ + +#ifndef APT_MIRROR_H +#define APT_MIRROR_H + + +#include <iostream> + +using std::cout; +using std::cerr; +using std::endl; + +#include "http.h" + +class MirrorMethod : public HttpMethod +{ + FetchResult Res; + // we simply transform between BaseUri and Mirror + string BaseUri; // the original mirror://... url + string Mirror; // the selected mirror uri (http://...) + string MirrorFile; // + bool HasMirrorFile; + + bool Debug; + + protected: + bool GetMirrorFile(string uri); + bool SelectMirror(); + bool Clean(string dir); + + // we need to overwrite those to transform the url back + virtual void Fail(string Why, bool Transient = false); + virtual void URIStart(FetchResult &Res); + virtual void URIDone(FetchResult &Res,FetchResult *Alt = 0); + virtual bool Configuration(string Message); + + public: + MirrorMethod(); + virtual bool Fetch(FetchItem *Itm); +}; + + +#endif diff --git a/mirror-failure.py b/mirror-failure.py new file mode 100644 index 000000000..e7d2bbf54 --- /dev/null +++ b/mirror-failure.py @@ -0,0 +1,23 @@ +# File: cgihttpserver-example-1.py + +import CGIHTTPServer +import BaseHTTPServer + +class Handler(CGIHTTPServer.CGIHTTPRequestHandler): + #cgi_directories = ["/cgi"] + def do_POST(self): + print "do_POST" + #print self.command + #print self.path + #print self.headers + print self.client_address + data = self.rfile.read(int(self.headers["content-length"])) + print data + self.wfile.write("200 Ok\n"); + +PORT = 8000 + +httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler) +print "serving at port", PORT +httpd.serve_forever() + diff --git a/po/apt-all.pot b/po/apt-all.pot index 981b0465a..b55c31ff4 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-19 11:37+0100\n" +"POT-Creation-Date: 2007-04-27 15:16+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -1462,18 +1462,18 @@ msgstr "" msgid "Unparsable control file" msgstr "" -#: methods/cdrom.cc:115 +#: methods/cdrom.cc:114 #, c-format msgid "Unable to read the cdrom database %s" msgstr "" -#: methods/cdrom.cc:124 +#: methods/cdrom.cc:123 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 "" -#: methods/cdrom.cc:132 +#: methods/cdrom.cc:131 msgid "Wrong CD-ROM" msgstr "" @@ -2213,12 +2213,12 @@ msgstr "" #. only show the ETA if it makes sense #. two days -#: apt-pkg/acquire.cc:823 +#: apt-pkg/acquire.cc:830 #, c-format msgid "Retrieving file %li of %li (%s remaining)" msgstr "" -#: apt-pkg/acquire.cc:825 +#: apt-pkg/acquire.cc:832 #, c-format msgid "Retrieving file %li of %li" msgstr "" @@ -2264,16 +2264,16 @@ msgstr "" msgid "You may want to run apt-get update to correct these problems" msgstr "" -#: apt-pkg/policy.cc:269 +#: apt-pkg/policy.cc:270 msgid "Invalid record in the preferences file, no Package header" msgstr "" -#: apt-pkg/policy.cc:291 +#: apt-pkg/policy.cc:292 #, c-format msgid "Did not understand pin type %s" msgstr "" -#: apt-pkg/policy.cc:299 +#: apt-pkg/policy.cc:300 msgid "No priority (or zero) specified for pin" msgstr "" @@ -2361,35 +2361,35 @@ msgstr "" msgid "rename failed, %s (%s -> %s)." msgstr "" -#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:945 +#: apt-pkg/acquire-item.cc:243 apt-pkg/acquire-item.cc:952 msgid "MD5Sum mismatch" msgstr "" -#: apt-pkg/acquire-item.cc:640 +#: apt-pkg/acquire-item.cc:647 msgid "There is no public key available for the following key IDs:\n" msgstr "" -#: apt-pkg/acquire-item.cc:753 +#: apt-pkg/acquire-item.cc:760 #, c-format msgid "" "I wasn't able to locate a file for the %s package. This might mean you need " "to manually fix this package. (due to missing arch)" msgstr "" -#: apt-pkg/acquire-item.cc:812 +#: apt-pkg/acquire-item.cc:819 #, c-format msgid "" "I wasn't able to locate file for the %s package. This might mean you need to " "manually fix this package." msgstr "" -#: apt-pkg/acquire-item.cc:848 +#: apt-pkg/acquire-item.cc:855 #, c-format msgid "" "The package index files are corrupted. No Filename: field for package %s." msgstr "" -#: apt-pkg/acquire-item.cc:935 +#: apt-pkg/acquire-item.cc:942 msgid "Size mismatch" msgstr "" @@ -2405,66 +2405,66 @@ msgid "" "Mounting CD-ROM\n" msgstr "" -#: apt-pkg/cdrom.cc:518 apt-pkg/cdrom.cc:600 +#: apt-pkg/cdrom.cc:516 apt-pkg/cdrom.cc:598 msgid "Identifying.. " msgstr "" -#: apt-pkg/cdrom.cc:543 +#: apt-pkg/cdrom.cc:541 #, c-format msgid "Stored label: %s \n" msgstr "" -#: apt-pkg/cdrom.cc:563 +#: apt-pkg/cdrom.cc:561 #, c-format msgid "Using CD-ROM mount point %s\n" msgstr "" -#: apt-pkg/cdrom.cc:581 +#: apt-pkg/cdrom.cc:579 msgid "Unmounting CD-ROM\n" msgstr "" -#: apt-pkg/cdrom.cc:585 +#: apt-pkg/cdrom.cc:583 msgid "Waiting for disc...\n" msgstr "" #. Mount the new CDROM -#: apt-pkg/cdrom.cc:593 +#: apt-pkg/cdrom.cc:591 msgid "Mounting CD-ROM...\n" msgstr "" -#: apt-pkg/cdrom.cc:611 +#: apt-pkg/cdrom.cc:609 msgid "Scanning disc for index files..\n" msgstr "" -#: apt-pkg/cdrom.cc:649 +#: apt-pkg/cdrom.cc:647 #, c-format msgid "Found %i package indexes, %i source indexes and %i signatures\n" msgstr "" -#: apt-pkg/cdrom.cc:714 +#: apt-pkg/cdrom.cc:712 msgid "That is not a valid name, try again.\n" msgstr "" -#: apt-pkg/cdrom.cc:730 +#: apt-pkg/cdrom.cc:728 #, c-format msgid "" "This disc is called: \n" "'%s'\n" msgstr "" -#: apt-pkg/cdrom.cc:734 +#: apt-pkg/cdrom.cc:732 msgid "Copying package lists..." msgstr "" -#: apt-pkg/cdrom.cc:758 +#: apt-pkg/cdrom.cc:756 msgid "Writing new source list\n" msgstr "" -#: apt-pkg/cdrom.cc:767 +#: apt-pkg/cdrom.cc:765 msgid "Source list entries for this disc are:\n" msgstr "" -#: apt-pkg/cdrom.cc:810 +#: apt-pkg/cdrom.cc:807 msgid "Unmounting CD-ROM..." msgstr "" diff --git a/po/ar.po b/po/ar.po deleted file mode 100644 index 8a0b74706..000000000 --- a/po/ar.po +++ /dev/null @@ -1,2566 +0,0 @@ -# translation of apt_po.po to Arabic -# This file is put in the public domain. -# -# Ossama M. Khayat <okhayat@yahoo.com>, 2005, 2006. -msgid "" -msgstr "" -"Project-Id-Version: apt_po\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-10-11 20:34+0200\n" -"PO-Revision-Date: 2006-10-20 21:28+0300\n" -"Last-Translator: Ossama M. Khayat <okhayat@yahoo.com>\n" -"Language-Team: Arabic <support@arabeyes.org>\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Arabic\n" -"X-Poedit-Country: Lebanon\n" -"X-Poedit-SourceCharset: utf-8\n" -"X-Generator: KBabel 1.11.4\n" - -#: cmdline/apt-cache.cc:135 -#, c-format -msgid "Package %s version %s has an unmet dep:\n" -msgstr "الحزمة %s النسخة %s لها معتمد غير مستوفى:\n" - -#: cmdline/apt-cache.cc:175 cmdline/apt-cache.cc:527 cmdline/apt-cache.cc:615 -#: cmdline/apt-cache.cc:771 cmdline/apt-cache.cc:989 cmdline/apt-cache.cc:1357 -#: cmdline/apt-cache.cc:1508 -#, c-format -msgid "Unable to locate package %s" -msgstr "تعذر العثور على الحزمة %s" - -#: cmdline/apt-cache.cc:232 -msgid "Total package names : " -msgstr "أسماء الحزم الكلية :" - -#: cmdline/apt-cache.cc:272 -msgid " Normal packages: " -msgstr " الحزم العادية:" - -#: cmdline/apt-cache.cc:273 -msgid " Pure virtual packages: " -msgstr "الحزمة الوهمية تماماً:" - -#: cmdline/apt-cache.cc:274 -msgid " Single virtual packages: " -msgstr " الحزمة الوهمية المفردة:" - -#: cmdline/apt-cache.cc:275 -msgid " Mixed virtual packages: " -msgstr " الحزم الوهمية المختلطة:" - -#: cmdline/apt-cache.cc:276 -msgid " Missing: " -msgstr " مفقودة:" - -#: cmdline/apt-cache.cc:278 -msgid "Total distinct versions: " -msgstr "مجموع النسخ الفريدة:" - -#: cmdline/apt-cache.cc:280 -msgid "Total dependencies: " -msgstr "مجموع المعتمدات:" - -#: cmdline/apt-cache.cc:283 -msgid "Total ver/file relations: " -msgstr "مجموع علاقات النسخ/الملفات:" - -#: cmdline/apt-cache.cc:285 -msgid "Total Provides mappings: " -msgstr "مجموع علاقات النسخ/الملفات:" - -#: cmdline/apt-cache.cc:297 -msgid "Total globbed strings: " -msgstr "" - -#: cmdline/apt-cache.cc:311 -msgid "Total dependency version space: " -msgstr "" - -#: cmdline/apt-cache.cc:316 -msgid "Total slack space: " -msgstr "" - -#: cmdline/apt-cache.cc:324 -msgid "Total space accounted for: " -msgstr "مجموع المساحة المحسوب حسابها:" - -#: cmdline/apt-cache.cc:446 cmdline/apt-cache.cc:1189 -#, c-format -msgid "Package file %s is out of sync." -msgstr "" - -#: cmdline/apt-cache.cc:1231 -msgid "You must give exactly one pattern" -msgstr "يجب أن تعطي صيغة واحدة بالضبط" - -#: cmdline/apt-cache.cc:1385 -msgid "No packages found" -msgstr "لم يُعثر على أية حزم" - -#: cmdline/apt-cache.cc:1462 -msgid "Package files:" -msgstr "ملفات الحزم:" - -#: cmdline/apt-cache.cc:1469 cmdline/apt-cache.cc:1555 -msgid "Cache is out of sync, can't x-ref a package file" -msgstr "" - -#: cmdline/apt-cache.cc:1470 -#, c-format -msgid "%4i %s\n" -msgstr "%4i %s\n" - -#. Show any packages have explicit pins -#: cmdline/apt-cache.cc:1482 -msgid "Pinned packages:" -msgstr "الحزم المُدبّسة:" - -#: cmdline/apt-cache.cc:1494 cmdline/apt-cache.cc:1535 -msgid "(not found)" -msgstr "(غير موجود)" - -#. Installed version -#: cmdline/apt-cache.cc:1515 -msgid " Installed: " -msgstr " مُثبّت:" - -#: cmdline/apt-cache.cc:1517 cmdline/apt-cache.cc:1525 -msgid "(none)" -msgstr "(لاشيء)" - -#. Candidate Version -#: cmdline/apt-cache.cc:1522 -msgid " Candidate: " -msgstr " مرشّح: " - -#: cmdline/apt-cache.cc:1532 -msgid " Package pin: " -msgstr "" - -#. Show the priority tables -#: cmdline/apt-cache.cc:1541 -msgid " Version table:" -msgstr " جدول النسخ:" - -#: cmdline/apt-cache.cc:1556 -#, c-format -msgid " %4i %s\n" -msgstr " %4i %s\n" - -#: cmdline/apt-cache.cc:1652 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70 -#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550 -#: cmdline/apt-get.cc:2387 cmdline/apt-sortpkgs.cc:144 -#, c-format -msgid "%s %s for %s %s compiled on %s %s\n" -msgstr "%s %s لـ%s %s مُجمّع على %s %s\n" - -#: cmdline/apt-cache.cc:1659 -msgid "" -"Usage: apt-cache [options] command\n" -" apt-cache [options] add file1 [file2 ...]\n" -" apt-cache [options] showpkg pkg1 [pkg2 ...]\n" -" apt-cache [options] showsrc pkg1 [pkg2 ...]\n" -"\n" -"apt-cache is a low-level tool used to manipulate APT's binary\n" -"cache files, and query information from them\n" -"\n" -"Commands:\n" -" add - Add a package file to the source cache\n" -" gencaches - Build both the package and source cache\n" -" showpkg - Show some general information for a single package\n" -" showsrc - Show source records\n" -" stats - Show some basic statistics\n" -" dump - Show the entire file in a terse form\n" -" dumpavail - Print an available file to stdout\n" -" unmet - Show unmet dependencies\n" -" search - Search the package list for a regex pattern\n" -" show - Show a readable record for the package\n" -" depends - Show raw dependency information for a package\n" -" rdepends - Show reverse dependency information for a package\n" -" pkgnames - List the names of all packages\n" -" dotty - Generate package graphs for GraphVis\n" -" xvcg - Generate package graphs for xvcg\n" -" policy - Show policy settings\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -p=? The package cache.\n" -" -s=? The source cache.\n" -" -q Disable progress indicator.\n" -" -i Show only important deps for the unmet command.\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -"See the apt-cache(8) and apt.conf(5) manual pages for more information.\n" -msgstr "" - -#: cmdline/apt-cdrom.cc:78 -msgid "Please provide a name for this Disc, such as 'Debian 2.1r1 Disk 1'" -msgstr "الرجاء كتابة اسم لهذا القرص، مثال 'Debian 2.1r1 Disk 1'" - -#: cmdline/apt-cdrom.cc:93 -msgid "Please insert a Disc in the drive and press enter" -msgstr "الرجاء إدخال قرص في السواقة وضغط الزر enter" - -#: cmdline/apt-cdrom.cc:117 -msgid "Repeat this process for the rest of the CDs in your set." -msgstr "كرر هذه العملية لباقي الأقراص المدمجة في المجموعة." - -#: cmdline/apt-config.cc:41 -msgid "Arguments not in pairs" -msgstr "" - -#: cmdline/apt-config.cc:76 -msgid "" -"Usage: apt-config [options] command\n" -"\n" -"apt-config is a simple tool to read the APT config file\n" -"\n" -"Commands:\n" -" shell - Shell mode\n" -" dump - Show the configuration\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" - -#: cmdline/apt-extracttemplates.cc:98 -#, c-format -msgid "%s not a valid DEB package." -msgstr "%s ليس حزمة DEB صالحة." - -#: cmdline/apt-extracttemplates.cc:232 -msgid "" -"Usage: apt-extracttemplates file1 [file2 ...]\n" -"\n" -"apt-extracttemplates is a tool to extract config and template info\n" -"from debian packages\n" -"\n" -"Options:\n" -" -h This help text\n" -" -t Set the temp dir\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" - -#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:710 -#, c-format -msgid "Unable to write to %s" -msgstr "تعذرت الكتابة إلى %s" - -#: cmdline/apt-extracttemplates.cc:310 -msgid "Cannot get debconf version. Is debconf installed?" -msgstr "تعذر الحصول على نسخة debconf. هل هي مثبتة؟" - -#: ftparchive/apt-ftparchive.cc:167 ftparchive/apt-ftparchive.cc:341 -msgid "Package extension list is too long" -msgstr "قائمة توسيعات الحزمة طويلة جداً" - -#: ftparchive/apt-ftparchive.cc:169 ftparchive/apt-ftparchive.cc:183 -#: ftparchive/apt-ftparchive.cc:206 ftparchive/apt-ftparchive.cc:256 -#: ftparchive/apt-ftparchive.cc:270 ftparchive/apt-ftparchive.cc:292 -#, c-format -msgid "Error processing directory %s" -msgstr "خطأ في معالجة الدليل %s" - -#: ftparchive/apt-ftparchive.cc:254 -msgid "Source extension list is too long" -msgstr "قائمة توسيعات المصدر طويلة جداً" - -#: ftparchive/apt-ftparchive.cc:371 -msgid "Error writing header to contents file" -msgstr "خطأ في كتابة الترويسة إلى ملف المحتويات" - -#: ftparchive/apt-ftparchive.cc:401 -#, c-format -msgid "Error processing contents %s" -msgstr "خطأ في معالجة المحتويات %s" - -#: ftparchive/apt-ftparchive.cc:556 -msgid "" -"Usage: apt-ftparchive [options] command\n" -"Commands: packages binarypath [overridefile [pathprefix]]\n" -" sources srcpath [overridefile [pathprefix]]\n" -" contents path\n" -" release path\n" -" generate config [groups]\n" -" clean config\n" -"\n" -"apt-ftparchive generates index files for Debian archives. It supports\n" -"many styles of generation from fully automated to functional replacements\n" -"for dpkg-scanpackages and dpkg-scansources\n" -"\n" -"apt-ftparchive generates Package files from a tree of .debs. The\n" -"Package file contains the contents of all the control fields from\n" -"each package as well as the MD5 hash and filesize. An override file\n" -"is supported to force the value of Priority and Section.\n" -"\n" -"Similarly apt-ftparchive generates Sources files from a tree of .dscs.\n" -"The --source-override option can be used to specify a src override file\n" -"\n" -"The 'packages' and 'sources' command should be run in the root of the\n" -"tree. BinaryPath should point to the base of the recursive search and \n" -"override file should contain the override flags. Pathprefix is\n" -"appended to the filename fields if present. Example usage from the \n" -"Debian archive:\n" -" apt-ftparchive packages dists/potato/main/binary-i386/ > \\\n" -" dists/potato/main/binary-i386/Packages\n" -"\n" -"Options:\n" -" -h This help text\n" -" --md5 Control MD5 generation\n" -" -s=? Source override file\n" -" -q Quiet\n" -" -d=? Select the optional caching database\n" -" --no-delink Enable delinking debug mode\n" -" --contents Control contents file generation\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option" -msgstr "" - -#: ftparchive/apt-ftparchive.cc:762 -msgid "No selections matched" -msgstr "لم تُطابق أية تحديدات" - -#: ftparchive/apt-ftparchive.cc:835 -#, c-format -msgid "Some files are missing in the package file group `%s'" -msgstr "بعض الملفات مفقودة في مجموعة ملف الحزمة `%s'" - -#: ftparchive/cachedb.cc:47 -#, c-format -msgid "DB was corrupted, file renamed to %s.old" -msgstr "قاعدة البيانات كانت فاسدة، فتم تغيير اسمها إلى %s.old" - -#: ftparchive/cachedb.cc:65 -#, c-format -msgid "DB is old, attempting to upgrade %s" -msgstr "قاعدة البيانات قديمة، محاولة ترقية %s" - -#: ftparchive/cachedb.cc:76 -msgid "" -"DB format is invalid. If you upgraded from a older version of apt, please " -"remove and re-create the database." -msgstr "" - -#: ftparchive/cachedb.cc:81 -#, c-format -msgid "Unable to open DB file %s: %s" -msgstr "تعذر فتح ملف قاعدة البيانات %s: %s" - -#: ftparchive/cachedb.cc:127 apt-inst/extract.cc:181 apt-inst/extract.cc:193 -#: apt-inst/extract.cc:210 apt-inst/deb/dpkgdb.cc:121 methods/gpgv.cc:272 -#, c-format -msgid "Failed to stat %s" -msgstr "" - -#: ftparchive/cachedb.cc:242 -msgid "Archive has no control record" -msgstr "" - -#: ftparchive/cachedb.cc:448 -msgid "Unable to get a cursor" -msgstr "" - -#: ftparchive/writer.cc:79 -#, c-format -msgid "W: Unable to read directory %s\n" -msgstr "W: تعذرت قراءة الدليل %s\n" - -#: ftparchive/writer.cc:84 -#, c-format -msgid "W: Unable to stat %s\n" -msgstr "" - -#: ftparchive/writer.cc:135 -msgid "E: " -msgstr "E: " - -#: ftparchive/writer.cc:137 -msgid "W: " -msgstr "W: " - -#: ftparchive/writer.cc:144 -msgid "E: Errors apply to file " -msgstr "" - -#: ftparchive/writer.cc:161 ftparchive/writer.cc:191 -#, c-format -msgid "Failed to resolve %s" -msgstr "" - -#: ftparchive/writer.cc:173 -msgid "Tree walking failed" -msgstr "" - -#: ftparchive/writer.cc:198 -#, c-format -msgid "Failed to open %s" -msgstr "فشل فتح %s" - -#: ftparchive/writer.cc:257 -#, c-format -msgid " DeLink %s [%s]\n" -msgstr " DeLink %s [%s]\n" - -#: ftparchive/writer.cc:265 -#, c-format -msgid "Failed to readlink %s" -msgstr "" - -#: ftparchive/writer.cc:269 -#, c-format -msgid "Failed to unlink %s" -msgstr "" - -#: ftparchive/writer.cc:276 -#, c-format -msgid "*** Failed to link %s to %s" -msgstr "*** فشل ربط %s بـ%s" - -#: ftparchive/writer.cc:286 -#, c-format -msgid " DeLink limit of %sB hit.\n" -msgstr "" - -#: ftparchive/writer.cc:390 -msgid "Archive had no package field" -msgstr "" - -#: ftparchive/writer.cc:398 ftparchive/writer.cc:613 -#, c-format -msgid " %s has no override entry\n" -msgstr "" - -#: ftparchive/writer.cc:443 ftparchive/writer.cc:701 -#, c-format -msgid " %s maintainer is %s not %s\n" -msgstr "" - -#: ftparchive/writer.cc:623 -#, c-format -msgid " %s has no source override entry\n" -msgstr "" - -#: ftparchive/writer.cc:627 -#, c-format -msgid " %s has no binary override entry either\n" -msgstr "" - -#: ftparchive/contents.cc:317 -#, c-format -msgid "Internal error, could not locate member %s" -msgstr "خطأ داخلي، تعذر العثور على العضو %s" - -#: ftparchive/contents.cc:353 ftparchive/contents.cc:384 -msgid "realloc - Failed to allocate memory" -msgstr "realloc - فشل تعيين الذاكرة" - -#: ftparchive/override.cc:38 ftparchive/override.cc:146 -#, c-format -msgid "Unable to open %s" -msgstr "تعذر فتح %s" - -#: ftparchive/override.cc:64 ftparchive/override.cc:170 -#, c-format -msgid "Malformed override %s line %lu #1" -msgstr "" - -#: ftparchive/override.cc:78 ftparchive/override.cc:182 -#, c-format -msgid "Malformed override %s line %lu #2" -msgstr "" - -#: ftparchive/override.cc:92 ftparchive/override.cc:195 -#, c-format -msgid "Malformed override %s line %lu #3" -msgstr "" - -#: ftparchive/override.cc:131 ftparchive/override.cc:205 -#, c-format -msgid "Failed to read the override file %s" -msgstr "" - -#: ftparchive/multicompress.cc:75 -#, c-format -msgid "Unknown compression algorithm '%s'" -msgstr "" - -#: ftparchive/multicompress.cc:105 -#, c-format -msgid "Compressed output %s needs a compression set" -msgstr "" - -#: ftparchive/multicompress.cc:172 methods/rsh.cc:91 -msgid "Failed to create IPC pipe to subprocess" -msgstr "" - -#: ftparchive/multicompress.cc:198 -msgid "Failed to create FILE*" -msgstr "" - -#: ftparchive/multicompress.cc:201 -msgid "Failed to fork" -msgstr "" - -#: ftparchive/multicompress.cc:215 -msgid "Compress child" -msgstr "" - -#: ftparchive/multicompress.cc:238 -#, c-format -msgid "Internal error, failed to create %s" -msgstr "خطأ داخلي، تعذر إنشاء %s" - -#: ftparchive/multicompress.cc:289 -msgid "Failed to create subprocess IPC" -msgstr "" - -#: ftparchive/multicompress.cc:324 -msgid "Failed to exec compressor " -msgstr "" - -#: ftparchive/multicompress.cc:363 -msgid "decompressor" -msgstr "" - -#: ftparchive/multicompress.cc:406 -msgid "IO to subprocess/file failed" -msgstr "" - -#: ftparchive/multicompress.cc:458 -msgid "Failed to read while computing MD5" -msgstr "" - -#: ftparchive/multicompress.cc:475 -#, c-format -msgid "Problem unlinking %s" -msgstr "" - -#: ftparchive/multicompress.cc:490 apt-inst/extract.cc:188 -#, c-format -msgid "Failed to rename %s to %s" -msgstr "فشل تغيير اسم %s إلى %s" - -#: cmdline/apt-get.cc:120 -msgid "Y" -msgstr "Y" - -#: cmdline/apt-get.cc:142 cmdline/apt-get.cc:1506 -#, c-format -msgid "Regex compilation error - %s" -msgstr "" - -#: cmdline/apt-get.cc:237 -msgid "The following packages have unmet dependencies:" -msgstr "" - -#: cmdline/apt-get.cc:327 -#, c-format -msgid "but %s is installed" -msgstr "إلا أن %s مثبت" - -#: cmdline/apt-get.cc:329 -#, c-format -msgid "but %s is to be installed" -msgstr "إلا أنه سيتم تثبيت %s" - -#: cmdline/apt-get.cc:336 -msgid "but it is not installable" -msgstr "إلا أنه غير قابل للتثبيت" - -#: cmdline/apt-get.cc:338 -msgid "but it is a virtual package" -msgstr "إلا أنها حزمة وهمية" - -#: cmdline/apt-get.cc:341 -msgid "but it is not installed" -msgstr "إلا أنها غير مثبتة" - -#: cmdline/apt-get.cc:341 -msgid "but it is not going to be installed" -msgstr "إلا أنه لن يتم تثبيتها" - -#: cmdline/apt-get.cc:346 -msgid " or" -msgstr " أو" - -#: cmdline/apt-get.cc:375 -msgid "The following NEW packages will be installed:" -msgstr "سيتم تثبيت الحزم الجديدة التالية:" - -#: cmdline/apt-get.cc:401 -msgid "The following packages will be REMOVED:" -msgstr "سيتم إزالة الحزم التالية:" - -#: cmdline/apt-get.cc:423 -msgid "The following packages have been kept back:" -msgstr "سيتم الإبقاء على الحزم التالية:" - -#: cmdline/apt-get.cc:444 -msgid "The following packages will be upgraded:" -msgstr "ستتم ترقية الحزم التالية:" - -#: cmdline/apt-get.cc:465 -msgid "The following packages will be DOWNGRADED:" -msgstr "سيتم تثبيط الحزم التالية:" - -#: cmdline/apt-get.cc:485 -msgid "The following held packages will be changed:" -msgstr "سيتم تغيير الحزم المبقاة التالية:" - -#: cmdline/apt-get.cc:538 -#, c-format -msgid "%s (due to %s) " -msgstr "%s (بسبب %s) " - -#: cmdline/apt-get.cc:546 -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" -"لا يجب أن تقوم بهذا إلى إن كنت تعرف تماماً ما تقوم به!" - -#: cmdline/apt-get.cc:577 -#, c-format -msgid "%lu upgraded, %lu newly installed, " -msgstr "%lu سيتم ترقيتها، %lu مثبتة حديثاً، " - -#: cmdline/apt-get.cc:581 -#, c-format -msgid "%lu reinstalled, " -msgstr "%lu أعيد تثبيتها، " - -#: cmdline/apt-get.cc:583 -#, c-format -msgid "%lu downgraded, " -msgstr "%lu مثبطة، " - -#: cmdline/apt-get.cc:585 -#, c-format -msgid "%lu to remove and %lu not upgraded.\n" -msgstr "%lu لإزالتها و %lu لم يتم ترقيتها.\n" - -#: cmdline/apt-get.cc:589 -#, c-format -msgid "%lu not fully installed or removed.\n" -msgstr "%lu غير مثبتة بالكامل أو مزالة.\n" - -#: cmdline/apt-get.cc:649 -msgid "Correcting dependencies..." -msgstr "تصحيح المعتمدات..." - -#: cmdline/apt-get.cc:652 -msgid " failed." -msgstr " فشل." - -#: cmdline/apt-get.cc:655 -msgid "Unable to correct dependencies" -msgstr "لم يمكن تصحيح المعتمدات" - -#: cmdline/apt-get.cc:658 -msgid "Unable to minimize the upgrade set" -msgstr "لم يمكن تقليص مجموعة الترقية" - -#: cmdline/apt-get.cc:660 -msgid " Done" -msgstr " تم" - -#: cmdline/apt-get.cc:664 -msgid "You might want to run `apt-get -f install' to correct these." -msgstr "قد ترغب بتنفيذ الأمر `apt-get -f install' لتصحيح هذه." - -#: cmdline/apt-get.cc:667 -msgid "Unmet dependencies. Try using -f." -msgstr "مُعتمدات غير مستوفاة. حاول استخدام -f." - -#: cmdline/apt-get.cc:689 -msgid "WARNING: The following packages cannot be authenticated!" -msgstr "تحذير: تعذرت المصادقة على الحزم التالية!" - -#: cmdline/apt-get.cc:693 -msgid "Authentication warning overridden.\n" -msgstr "تم غض النظر عن تحذير المصادقة.\n" - -#: cmdline/apt-get.cc:700 -msgid "Install these packages without verification [y/N]? " -msgstr "تثبيت هذه الحزم دون التحقق منها [y/N]؟ " - -#: cmdline/apt-get.cc:702 -msgid "Some packages could not be authenticated" -msgstr "تعذرت المصادقة على بعض الحزم" - -#: cmdline/apt-get.cc:711 cmdline/apt-get.cc:858 -msgid "There are problems and -y was used without --force-yes" -msgstr "هناك مشاكل وتم استخدام -y دون --force-yes" - -#: cmdline/apt-get.cc:755 -msgid "Internal error, InstallPackages was called with broken packages!" -msgstr "خطأ داخلي، تم طلب InstallPackages مع وجود حزم معطوبة!" - -#: cmdline/apt-get.cc:764 -msgid "Packages need to be removed but remove is disabled." -msgstr "حزم بحاجة للإزالة لكن الإزالة مُعطّلة." - -#: cmdline/apt-get.cc:775 -msgid "Internal error, Ordering didn't finish" -msgstr "خطأ داخلي، لم تنته عملية الترتيب" - -#: cmdline/apt-get.cc:791 cmdline/apt-get.cc:1818 cmdline/apt-get.cc:1851 -msgid "Unable to lock the download directory" -msgstr "تعذر قَفْل دليل التنزيل" - -#: cmdline/apt-get.cc:801 cmdline/apt-get.cc:1899 cmdline/apt-get.cc:2135 -#: apt-pkg/cachefile.cc:67 -msgid "The list of sources could not be read." -msgstr "تعذرت قراءة قائمة المصادر." - -#: cmdline/apt-get.cc:816 -msgid "How odd.. The sizes didn't match, email apt@packages.debian.org" -msgstr "يا للغرابة.. لم تتطابق الأحجام، الرجاء مراسلة apt@packages.debian.org" - -#: cmdline/apt-get.cc:821 -#, c-format -msgid "Need to get %sB/%sB of archives.\n" -msgstr "بحاجة إلى جلب %sب/%sب من الأرشيف.\n" - -#: cmdline/apt-get.cc:824 -#, c-format -msgid "Need to get %sB of archives.\n" -msgstr "بحاجة إلى جلب %sب من الأرشيف.\n" - -#: cmdline/apt-get.cc:829 -#, c-format -msgid "After unpacking %sB of additional disk space will be used.\n" -msgstr "بعد الاستخراج %sب من المساحة الإضافيّة سيتمّ استخدامها.\n" - -#: cmdline/apt-get.cc:832 -#, c-format -msgid "After unpacking %sB disk space will be freed.\n" -msgstr "بعد الاستخراج %sب من المساحة ستفرّغ.\n" - -#: cmdline/apt-get.cc:846 cmdline/apt-get.cc:1989 -#, c-format -msgid "Couldn't determine free space in %s" -msgstr "تعذر حساب المساحة الحرة في %s" - -#: cmdline/apt-get.cc:849 -#, c-format -msgid "You don't have enough free space in %s." -msgstr "ليس هناك مساحة كافية في %s." - -#: cmdline/apt-get.cc:864 cmdline/apt-get.cc:884 -msgid "Trivial Only specified but this is not a trivial operation." -msgstr "" - -#: cmdline/apt-get.cc:866 -msgid "Yes, do as I say!" -msgstr "نعم، افعل ما أقوله!" - -#: cmdline/apt-get.cc:868 -#, c-format -msgid "" -"You are about to do something potentially harmful.\n" -"To continue type in the phrase '%s'\n" -" ?] " -msgstr "" -"أنت على وشك أن تقوم بشيء ضارّ جداً\n" -"كي تستمر اكتب العبارة '%s'\n" -" ؟] " - -#: cmdline/apt-get.cc:874 cmdline/apt-get.cc:893 -msgid "Abort." -msgstr "إجهاض." - -#: cmdline/apt-get.cc:889 -msgid "Do you want to continue [Y/n]? " -msgstr "هل تريد الاستمرار [Y/n]؟" - -#: cmdline/apt-get.cc:961 cmdline/apt-get.cc:1365 cmdline/apt-get.cc:2032 -#, c-format -msgid "Failed to fetch %s %s\n" -msgstr "فشل إحضار %s %s\n" - -#: cmdline/apt-get.cc:979 -msgid "Some files failed to download" -msgstr "فشل تنزيل بعض الملفات" - -#: cmdline/apt-get.cc:980 cmdline/apt-get.cc:2041 -msgid "Download complete and in download only mode" -msgstr "اكتمل التنزيل وفي وضع التنزيل فقط" - -#: cmdline/apt-get.cc:986 -msgid "" -"Unable to fetch some archives, maybe run apt-get update or try with --fix-" -"missing?" -msgstr "" -"تعذر إحضار بعض الأرشيف، ربما يمكنك محاولة تنفيذ apt-get update أو إضافة --" -"fix-missing؟" - -#: cmdline/apt-get.cc:990 -msgid "--fix-missing and media swapping is not currently supported" -msgstr "--fix-missing وتبديل الأوساط غير مدعومة حالياً" - -#: cmdline/apt-get.cc:995 -msgid "Unable to correct missing packages." -msgstr "تعذر تصحيح الحزم المفقودة." - -#: cmdline/apt-get.cc:996 -msgid "Aborting install." -msgstr "إجهاض التثبيت." - -#: cmdline/apt-get.cc:1030 -#, c-format -msgid "Note, selecting %s instead of %s\n" -msgstr "لاحظ، تحديد %s بدلاً من %s\n" - -#: cmdline/apt-get.cc:1040 -#, c-format -msgid "Skipping %s, it is already installed and upgrade is not set.\n" -msgstr "تخطّي %s، حيث أنها مثبتة ولم يتمّ تعيين الترقية.\n" - -#: cmdline/apt-get.cc:1058 -#, c-format -msgid "Package %s is not installed, so not removed\n" -msgstr "الحزمة %s غير مُثبّتة، لذلك لن تُزال\n" - -#: cmdline/apt-get.cc:1069 -#, c-format -msgid "Package %s is a virtual package provided by:\n" -msgstr "الحزمة %s وهميّة وتوفّرها:\n" - -#: cmdline/apt-get.cc:1081 -msgid " [Installed]" -msgstr " [مُثبّتة]" - -#: cmdline/apt-get.cc:1086 -msgid "You should explicitly select one to install." -msgstr "يجب اختيار واحدة بالتحديد لتثبيتها." - -#: cmdline/apt-get.cc:1091 -#, c-format -msgid "" -"Package %s is not available, but is referred to by another package.\n" -"This may mean that the package is missing, has been obsoleted, or\n" -"is only available from another source\n" -msgstr "" - -#: cmdline/apt-get.cc:1110 -msgid "However the following packages replace it:" -msgstr "على أيّ فإن الحزم التالية تحلّ مكانها:" - -#: cmdline/apt-get.cc:1113 -#, c-format -msgid "Package %s has no installation candidate" -msgstr "الحزمة %s ليس لها مرشح تثبيت" - -#: cmdline/apt-get.cc:1133 -#, c-format -msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n" -msgstr "إعادة تثبيت %s غير ممكنة، حيث أنّه لا يمكن تنزيلها.\n" - -#: cmdline/apt-get.cc:1141 -#, c-format -msgid "%s is already the newest version.\n" -msgstr "%s هي النسخة الأحدث.\n" - -#: cmdline/apt-get.cc:1168 -#, c-format -msgid "Release '%s' for '%s' was not found" -msgstr "تعذر العثور على الإصدارة '%s' للحزمة '%s'" - -#: cmdline/apt-get.cc:1170 -#, c-format -msgid "Version '%s' for '%s' was not found" -msgstr "تعذر العثور على النسخة '%s' للحزمة '%s'" - -#: cmdline/apt-get.cc:1176 -#, c-format -msgid "Selected version %s (%s) for %s\n" -msgstr "النسخة المحددة %s (%s) للإصدارة %s\n" - -#: cmdline/apt-get.cc:1313 -msgid "The update command takes no arguments" -msgstr "لا يقبل الأمر update أية مُعطيات" - -#: cmdline/apt-get.cc:1326 -msgid "Unable to lock the list directory" -msgstr "تعذر قفل دليل القائمة" - -#: cmdline/apt-get.cc:1384 -msgid "" -"Some index files failed to download, they have been ignored, or old ones " -"used instead." -msgstr "" - -#: cmdline/apt-get.cc:1403 -msgid "Internal error, AllUpgrade broke stuff" -msgstr "خطأ داخلي، عطب AllUpgrade بعض الأشياء" - -#: cmdline/apt-get.cc:1493 cmdline/apt-get.cc:1529 -#, c-format -msgid "Couldn't find package %s" -msgstr "تعذر العثور على الحزمة %s" - -#: cmdline/apt-get.cc:1516 -#, c-format -msgid "Note, selecting %s for regex '%s'\n" -msgstr "لاحظ، تحديد %s بسبب صيغة regex '%s'\n" - -#: cmdline/apt-get.cc:1546 -msgid "You might want to run `apt-get -f install' to correct these:" -msgstr "قد ترغب بتشغيل `apt-get -f install' لتصحيح هذه:" - -#: cmdline/apt-get.cc:1549 -msgid "" -"Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a " -"solution)." -msgstr "" -"مُعتمدات غير مستوفاة. جرب 'apt-get -f install' بدون أسماء حزم (أو حدّد حلاً)." - -#: cmdline/apt-get.cc:1561 -msgid "" -"Some packages could not be installed. This may mean that you have\n" -"requested an impossible situation or if you are using the unstable\n" -"distribution that some required packages have not yet been created\n" -"or been moved out of Incoming." -msgstr "" - -#: cmdline/apt-get.cc:1569 -msgid "" -"Since you only requested a single operation it is extremely likely that\n" -"the package is simply not installable and a bug report against\n" -"that package should be filed." -msgstr "" - -#: cmdline/apt-get.cc:1574 -msgid "The following information may help to resolve the situation:" -msgstr "قد تساعد المعلومات التالية في حل المشكلة:" - -#: cmdline/apt-get.cc:1577 -msgid "Broken packages" -msgstr "حزم معطوبة" - -#: cmdline/apt-get.cc:1603 -msgid "The following extra packages will be installed:" -msgstr "سيتم تثبيت الحزم الإضافيّة التالية:" - -#: cmdline/apt-get.cc:1692 -msgid "Suggested packages:" -msgstr "الحزم المقترحة:" - -#: cmdline/apt-get.cc:1693 -msgid "Recommended packages:" -msgstr "الحزم المستحسنة:" - -#: cmdline/apt-get.cc:1713 -msgid "Calculating upgrade... " -msgstr "حساب الترقية..." - -#: cmdline/apt-get.cc:1716 methods/ftp.cc:702 methods/connect.cc:101 -msgid "Failed" -msgstr "فشل" - -#: cmdline/apt-get.cc:1721 -msgid "Done" -msgstr "تمّ" - -#: cmdline/apt-get.cc:1786 cmdline/apt-get.cc:1794 -msgid "Internal error, problem resolver broke stuff" -msgstr "" - -#: cmdline/apt-get.cc:1894 -msgid "Must specify at least one package to fetch source for" -msgstr "يجب تحديد حزمة واحدة على الأقل لجلب مصدرها" - -#: cmdline/apt-get.cc:1924 cmdline/apt-get.cc:2153 -#, c-format -msgid "Unable to find a source package for %s" -msgstr "تعذر العثور على مصدر الحزمة %s" - -#: cmdline/apt-get.cc:1968 -#, c-format -msgid "Skipping already downloaded file '%s'\n" -msgstr "تخطي الملف '%s' المنزل مسبقاً\n" - -#: cmdline/apt-get.cc:1992 -#, c-format -msgid "You don't have enough free space in %s" -msgstr "ليس هناك مساحة كافية في %s" - -#: cmdline/apt-get.cc:1997 -#, c-format -msgid "Need to get %sB/%sB of source archives.\n" -msgstr "يجب جلب %sب/%sب من الأرشيفات المصدرية.\n" - -#: cmdline/apt-get.cc:2000 -#, c-format -msgid "Need to get %sB of source archives.\n" -msgstr "يجب جلب %sب من الأرشيفات المصدريّة.\n" - -#: cmdline/apt-get.cc:2006 -#, c-format -msgid "Fetch source %s\n" -msgstr "إحضار المصدر %s\n" - -#: cmdline/apt-get.cc:2037 -msgid "Failed to fetch some archives." -msgstr "فشل إحضار بعض الأرشيفات." - -#: cmdline/apt-get.cc:2065 -#, c-format -msgid "Skipping unpack of already unpacked source in %s\n" -msgstr "" - -#: cmdline/apt-get.cc:2077 -#, c-format -msgid "Unpack command '%s' failed.\n" -msgstr "أمر فك الحزمة '%s' فشل.\n" - -#: cmdline/apt-get.cc:2078 -#, c-format -msgid "Check if the 'dpkg-dev' package is installed.\n" -msgstr "" - -#: cmdline/apt-get.cc:2095 -#, c-format -msgid "Build command '%s' failed.\n" -msgstr "أمر البناء '%s' فشل.\n" - -#: cmdline/apt-get.cc:2114 -msgid "Child process failed" -msgstr "" - -#: cmdline/apt-get.cc:2130 -msgid "Must specify at least one package to check builddeps for" -msgstr "" - -#: cmdline/apt-get.cc:2158 -#, c-format -msgid "Unable to get build-dependency information for %s" -msgstr "" - -#: cmdline/apt-get.cc:2178 -#, c-format -msgid "%s has no build depends.\n" -msgstr "" - -#: cmdline/apt-get.cc:2230 -#, c-format -msgid "" -"%s dependency for %s cannot be satisfied because the package %s cannot be " -"found" -msgstr "" - -#: cmdline/apt-get.cc:2282 -#, c-format -msgid "" -"%s dependency for %s cannot be satisfied because no available versions of " -"package %s can satisfy version requirements" -msgstr "" - -#: cmdline/apt-get.cc:2317 -#, c-format -msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new" -msgstr "" - -#: cmdline/apt-get.cc:2342 -#, c-format -msgid "Failed to satisfy %s dependency for %s: %s" -msgstr "" - -#: cmdline/apt-get.cc:2356 -#, c-format -msgid "Build-dependencies for %s could not be satisfied." -msgstr "" - -#: cmdline/apt-get.cc:2360 -msgid "Failed to process build dependencies" -msgstr "" - -#: cmdline/apt-get.cc:2392 -msgid "Supported modules:" -msgstr "الوحدات المدعومة:" - -#: cmdline/apt-get.cc:2433 -msgid "" -"Usage: apt-get [options] command\n" -" apt-get [options] install|remove pkg1 [pkg2 ...]\n" -" apt-get [options] source pkg1 [pkg2 ...]\n" -"\n" -"apt-get is a simple command line interface for downloading and\n" -"installing packages. The most frequently used commands are update\n" -"and install.\n" -"\n" -"Commands:\n" -" update - Retrieve new lists of packages\n" -" upgrade - Perform an upgrade\n" -" install - Install new packages (pkg is libc6 not libc6.deb)\n" -" remove - Remove packages\n" -" source - Download source archives\n" -" build-dep - Configure build-dependencies for source packages\n" -" dist-upgrade - Distribution upgrade, see apt-get(8)\n" -" dselect-upgrade - Follow dselect selections\n" -" clean - Erase downloaded archive files\n" -" autoclean - Erase old downloaded archive files\n" -" check - Verify that there are no broken dependencies\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -q Loggable output - no progress indicator\n" -" -qq No output except for errors\n" -" -d Download only - do NOT install or unpack archives\n" -" -s No-act. Perform ordering simulation\n" -" -y Assume Yes to all queries and do not prompt\n" -" -f Attempt to continue if the integrity check fails\n" -" -m Attempt to continue if archives are unlocatable\n" -" -u Show a list of upgraded packages as well\n" -" -b Build the source package after fetching it\n" -" -V Show verbose version numbers\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -"See the apt-get(8), sources.list(5) and apt.conf(5) manual\n" -"pages for more information and options.\n" -" This APT has Super Cow Powers.\n" -msgstr "" - -#: cmdline/acqprogress.cc:55 -msgid "Hit " -msgstr "" - -#: cmdline/acqprogress.cc:79 -msgid "Get:" -msgstr "جلب:" - -#: cmdline/acqprogress.cc:110 -msgid "Ign " -msgstr "تجاهل" - -#: cmdline/acqprogress.cc:114 -msgid "Err " -msgstr "خطأ" - -#: cmdline/acqprogress.cc:135 -#, c-format -msgid "Fetched %sB in %s (%sB/s)\n" -msgstr "جلب %sب في %s (%sب/ث)\n" - -#: cmdline/acqprogress.cc:225 -#, c-format -msgid " [Working]" -msgstr " [يعمل]" - -#: cmdline/acqprogress.cc:271 -#, c-format -msgid "" -"Media change: please insert the disc labeled\n" -" '%s'\n" -"in the drive '%s' and press enter\n" -msgstr "" -"تغيير الوسط: الرجاء إدخال القرص المُسمّى\n" -" '%s'\n" -"في السوّاقة '%s' وضغط مفتاح الإدخال\n" - -#: cmdline/apt-sortpkgs.cc:86 -msgid "Unknown package record!" -msgstr "سجل حزمة مجهول!" - -#: cmdline/apt-sortpkgs.cc:150 -msgid "" -"Usage: apt-sortpkgs [options] file1 [file2 ...]\n" -"\n" -"apt-sortpkgs is a simple tool to sort package files. The -s option is used\n" -"to indicate what kind of file it is.\n" -"\n" -"Options:\n" -" -h This help text\n" -" -s Use source file sorting\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" - -#: dselect/install:32 -msgid "Bad default setting!" -msgstr "إعداد افتراضيّ سيّء!" - -#: dselect/install:51 dselect/install:83 dselect/install:87 dselect/install:93 -#: dselect/install:104 dselect/update:45 -msgid "Press enter to continue." -msgstr "اضغط مفتاح الإدخال للاستمرار." - -#: dselect/install:100 -msgid "Some errors occurred while unpacking. I'm going to configure the" -msgstr "حدثت بعض الأخطاء أثناء فك الحزمة. سأقوم بتهيئة " - -#: dselect/install:101 -msgid "packages that were installed. This may result in duplicate errors" -msgstr "الحزم التي تم تثبيتها. قد يتسبب هذا بظهر أخطاء متكررة" - -#: dselect/install:102 -msgid "or errors caused by missing dependencies. This is OK, only the errors" -msgstr "أو أخطاء سبّبتها المُعتمدات المفقودة. لا بأس بهذا، فقط الأخطاء" - -#: dselect/install:103 -msgid "" -"above this message are important. Please fix them and run [I]nstall again" -msgstr "أعلى هذه الرسالة مهمّة. الرجاء تصحيحها وتشغيل التثبيت مجدداً" - -#: dselect/update:30 -msgid "Merging available information" -msgstr "دمج المعلومات المتوفرة" - -#: apt-inst/contrib/extracttar.cc:117 -msgid "Failed to create pipes" -msgstr "" - -#: apt-inst/contrib/extracttar.cc:144 -msgid "Failed to exec gzip " -msgstr "فشل تنفيذ gzip" - -#: apt-inst/contrib/extracttar.cc:181 apt-inst/contrib/extracttar.cc:207 -msgid "Corrupted archive" -msgstr "أرشيف فاسد" - -#: apt-inst/contrib/extracttar.cc:196 -msgid "Tar checksum failed, archive corrupted" -msgstr "فشل تحقّق Checksum لملف Tar، الأرشيف فاسد" - -#: apt-inst/contrib/extracttar.cc:299 -#, c-format -msgid "Unknown TAR header type %u, member %s" -msgstr "" - -#: apt-inst/contrib/arfile.cc:73 -msgid "Invalid archive signature" -msgstr "توقيع الأرشيف غير صالح" - -#: apt-inst/contrib/arfile.cc:81 -msgid "Error reading archive member header" -msgstr "" - -#: apt-inst/contrib/arfile.cc:93 apt-inst/contrib/arfile.cc:105 -msgid "Invalid archive member header" -msgstr "" - -#: apt-inst/contrib/arfile.cc:131 -msgid "Archive is too short" -msgstr "الأرشيف قصير جداً" - -#: apt-inst/contrib/arfile.cc:135 -msgid "Failed to read the archive headers" -msgstr "فشلت قراءة ترويسات الأرشيف" - -#: apt-inst/filelist.cc:384 -msgid "DropNode called on still linked node" -msgstr "" - -#: apt-inst/filelist.cc:416 -msgid "Failed to locate the hash element!" -msgstr "" - -#: apt-inst/filelist.cc:463 -msgid "Failed to allocate diversion" -msgstr "" - -#: apt-inst/filelist.cc:468 -msgid "Internal error in AddDiversion" -msgstr "خطأ داخلي في AddDiversion" - -#: apt-inst/filelist.cc:481 -#, c-format -msgid "Trying to overwrite a diversion, %s -> %s and %s/%s" -msgstr "" - -#: apt-inst/filelist.cc:510 -#, c-format -msgid "Double add of diversion %s -> %s" -msgstr "" - -#: apt-inst/filelist.cc:553 -#, c-format -msgid "Duplicate conf file %s/%s" -msgstr "ملف تهيئة مُزدوج %s/%s" - -#: apt-inst/dirstream.cc:45 apt-inst/dirstream.cc:50 apt-inst/dirstream.cc:53 -#, c-format -msgid "Failed to write file %s" -msgstr "فشلت كتابة الملف %s" - -#: apt-inst/dirstream.cc:96 apt-inst/dirstream.cc:104 -#, c-format -msgid "Failed to close file %s" -msgstr "فشل إغلاق الملف %s" - -#: apt-inst/extract.cc:96 apt-inst/extract.cc:167 -#, c-format -msgid "The path %s is too long" -msgstr "المسار %s طويل جداً" - -#: apt-inst/extract.cc:127 -#, c-format -msgid "Unpacking %s more than once" -msgstr "فكّ تحزيم %s أكثر من مرّة" - -#: apt-inst/extract.cc:137 -#, c-format -msgid "The directory %s is diverted" -msgstr "" - -#: apt-inst/extract.cc:147 -#, c-format -msgid "The package is trying to write to the diversion target %s/%s" -msgstr "" - -#: apt-inst/extract.cc:157 apt-inst/extract.cc:300 -msgid "The diversion path is too long" -msgstr "" - -#: apt-inst/extract.cc:243 -#, c-format -msgid "The directory %s is being replaced by a non-directory" -msgstr "" - -#: apt-inst/extract.cc:283 -msgid "Failed to locate node in its hash bucket" -msgstr "" - -#: apt-inst/extract.cc:287 -msgid "The path is too long" -msgstr "المسار طويل جداً" - -#: apt-inst/extract.cc:417 -#, c-format -msgid "Overwrite package match with no version for %s" -msgstr "" - -#: apt-inst/extract.cc:434 -#, c-format -msgid "File %s/%s overwrites the one in the package %s" -msgstr "" - -#: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:750 -#: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/sourcelist.cc:324 -#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38 -#, c-format -msgid "Unable to read %s" -msgstr "تعذرت قراءة %s" - -#: apt-inst/extract.cc:494 -#, c-format -msgid "Unable to stat %s" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:55 apt-inst/deb/dpkgdb.cc:61 -#, c-format -msgid "Failed to remove %s" -msgstr "تعذرت إزالة %s" - -#: apt-inst/deb/dpkgdb.cc:110 apt-inst/deb/dpkgdb.cc:112 -#, c-format -msgid "Unable to create %s" -msgstr "تعذر إنشاء %s" - -#: apt-inst/deb/dpkgdb.cc:118 -#, c-format -msgid "Failed to stat %sinfo" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:123 -msgid "The info and temp directories need to be on the same filesystem" -msgstr "" - -#. Build the status cache -#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:643 -#: apt-pkg/pkgcachegen.cc:712 apt-pkg/pkgcachegen.cc:717 -#: apt-pkg/pkgcachegen.cc:840 -msgid "Reading package lists" -msgstr "قراءة قوائم الحزم" - -#: apt-inst/deb/dpkgdb.cc:180 -#, c-format -msgid "Failed to change to the admin dir %sinfo" -msgstr "فشل تغيير دليل الإدارة إلى %sinfo" - -#: apt-inst/deb/dpkgdb.cc:201 apt-inst/deb/dpkgdb.cc:355 -#: apt-inst/deb/dpkgdb.cc:448 -msgid "Internal error getting a package name" -msgstr "خطأ داخلي أثناء الحصول على اسم الحزمة" - -#: apt-inst/deb/dpkgdb.cc:205 apt-inst/deb/dpkgdb.cc:386 -msgid "Reading file listing" -msgstr "قراءة سرد الملفات" - -#: apt-inst/deb/dpkgdb.cc:216 -#, c-format -msgid "" -"Failed to open the list file '%sinfo/%s'. If you cannot restore this file " -"then make it empty and immediately re-install the same version of the " -"package!" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:229 apt-inst/deb/dpkgdb.cc:242 -#, c-format -msgid "Failed reading the list file %sinfo/%s" -msgstr "فشلت قراءة ملف القائمة %sinfo/%s" - -#: apt-inst/deb/dpkgdb.cc:266 -msgid "Internal error getting a node" -msgstr "خطأ داخلي أثناء الحصول على node" - -#: apt-inst/deb/dpkgdb.cc:309 -#, c-format -msgid "Failed to open the diversions file %sdiversions" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:324 -msgid "The diversion file is corrupted" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:331 apt-inst/deb/dpkgdb.cc:336 -#: apt-inst/deb/dpkgdb.cc:341 -#, c-format -msgid "Invalid line in the diversion file: %s" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:362 -msgid "Internal error adding a diversion" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:383 -msgid "The pkg cache must be initialized first" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:443 -#, c-format -msgid "Failed to find a Package: header, offset %lu" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:465 -#, c-format -msgid "Bad ConfFile section in the status file. Offset %lu" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:470 -#, c-format -msgid "Error parsing MD5. Offset %lu" -msgstr "" - -#: apt-inst/deb/debfile.cc:42 apt-inst/deb/debfile.cc:47 -#, c-format -msgid "This is not a valid DEB archive, missing '%s' member" -msgstr "" - -#: apt-inst/deb/debfile.cc:52 -#, c-format -msgid "This is not a valid DEB archive, it has no '%s' or '%s' member" -msgstr "" - -#: apt-inst/deb/debfile.cc:112 -#, c-format -msgid "Couldn't change to %s" -msgstr "تعذر التغيير إلى %s" - -#: apt-inst/deb/debfile.cc:138 -msgid "Internal error, could not locate member" -msgstr "خطأ داخلي، تعذر العثور على العضو" - -#: apt-inst/deb/debfile.cc:171 -msgid "Failed to locate a valid control file" -msgstr "فشل العثور على ملف تحكّم صالح" - -#: apt-inst/deb/debfile.cc:256 -msgid "Unparsable control file" -msgstr "" - -#: methods/cdrom.cc:114 -#, c-format -msgid "Unable to read the cdrom database %s" -msgstr "تعذرت قراءة قاعدة بيانات القرص المدمج %s" - -#: methods/cdrom.cc:123 -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 بهذا القرص المدمج. لا يمكن استخدام apt-" -"get update لإضافة أقراص مدمجة جديدة." - -#: methods/cdrom.cc:131 -msgid "Wrong CD-ROM" -msgstr "القرص المدمج الخطأ" - -#: methods/cdrom.cc:164 -#, c-format -msgid "Unable to unmount the CD-ROM in %s, it may still be in use." -msgstr "تعذر فكّ القرص المدمج من %s، إذ قد يكون لا يزال قيد الاستخدام." - -#: methods/cdrom.cc:169 -msgid "Disk not found." -msgstr "لم يُعثر على القرص." - -#: methods/cdrom.cc:177 methods/file.cc:79 methods/rsh.cc:264 -msgid "File not found" -msgstr "لم يُعثر على الملف" - -#: methods/copy.cc:42 methods/gpgv.cc:281 methods/gzip.cc:141 -#: methods/gzip.cc:150 -msgid "Failed to stat" -msgstr "فشيل تنفيذ stat" - -#: methods/copy.cc:79 methods/gpgv.cc:278 methods/gzip.cc:147 -msgid "Failed to set modification time" -msgstr "فشل تعيين وقت التعديل" - -#: methods/file.cc:44 -msgid "Invalid URI, local URIS must not start with //" -msgstr "" - -#. Login must be before getpeername otherwise dante won't work. -#: methods/ftp.cc:162 -msgid "Logging in" -msgstr "تسجيل الدخول" - -#: methods/ftp.cc:168 -msgid "Unable to determine the peer name" -msgstr "" - -#: methods/ftp.cc:173 -msgid "Unable to determine the local name" -msgstr "" - -#: methods/ftp.cc:204 methods/ftp.cc:232 -#, c-format -msgid "The server refused the connection and said: %s" -msgstr "رفض الخادم اتصالنا بالرد: %s" - -#: methods/ftp.cc:210 -#, c-format -msgid "USER failed, server said: %s" -msgstr "فشل USER، ردّ الخادم: %s" - -#: methods/ftp.cc:217 -#, c-format -msgid "PASS failed, server said: %s" -msgstr "فشل PASS، ردّ الخادم: %s" - -#: methods/ftp.cc:237 -msgid "" -"A proxy server was specified but no login script, Acquire::ftp::ProxyLogin " -"is empty." -msgstr "" -"تم تحديد خادم بروكسي ولكن دون نص تسجيل دخول برمجي، Acquire::ftp::ProxyLogin " -"فارغ." - -#: methods/ftp.cc:265 -#, c-format -msgid "Login script command '%s' failed, server said: %s" -msgstr "فشل أمر نص تسجيل الدخول البرمجي '%s'، ردّ الخادم: %s" - -#: methods/ftp.cc:291 -#, c-format -msgid "TYPE failed, server said: %s" -msgstr "فشل TYPE، ردّ الخادم: %s" - -#: methods/ftp.cc:329 methods/ftp.cc:440 methods/rsh.cc:183 methods/rsh.cc:226 -msgid "Connection timeout" -msgstr "انتهى وقت الاتصال" - -#: methods/ftp.cc:335 -msgid "Server closed the connection" -msgstr "أغلق الخادم الاتصال" - -#: methods/ftp.cc:338 apt-pkg/contrib/fileutl.cc:471 methods/rsh.cc:190 -msgid "Read error" -msgstr "خطأ في القراءة" - -#: methods/ftp.cc:345 methods/rsh.cc:197 -msgid "A response overflowed the buffer." -msgstr "" - -#: methods/ftp.cc:362 methods/ftp.cc:374 -msgid "Protocol corruption" -msgstr "" - -#: methods/ftp.cc:446 apt-pkg/contrib/fileutl.cc:510 methods/rsh.cc:232 -msgid "Write error" -msgstr "خطأ في الكتابة" - -#: methods/ftp.cc:687 methods/ftp.cc:693 methods/ftp.cc:729 -msgid "Could not create a socket" -msgstr "" - -#: methods/ftp.cc:698 -msgid "Could not connect data socket, connection timed out" -msgstr "" - -#: methods/ftp.cc:704 -msgid "Could not connect passive socket." -msgstr "" - -#: methods/ftp.cc:722 -msgid "getaddrinfo was unable to get a listening socket" -msgstr "" - -#: methods/ftp.cc:736 -msgid "Could not bind a socket" -msgstr "" - -#: methods/ftp.cc:740 -msgid "Could not listen on the socket" -msgstr "" - -#: methods/ftp.cc:747 -msgid "Could not determine the socket's name" -msgstr "" - -#: methods/ftp.cc:779 -msgid "Unable to send PORT command" -msgstr "تعذر إرسال الأمر PORT" - -#: methods/ftp.cc:789 -#, c-format -msgid "Unknown address family %u (AF_*)" -msgstr "" - -#: methods/ftp.cc:798 -#, c-format -msgid "EPRT failed, server said: %s" -msgstr "فشل EPRT، ردّ الخادم: %s" - -#: methods/ftp.cc:818 -msgid "Data socket connect timed out" -msgstr "" - -#: methods/ftp.cc:825 -msgid "Unable to accept connection" -msgstr "تعذر قبول الاتصال" - -#: methods/ftp.cc:864 methods/http.cc:958 methods/rsh.cc:303 -msgid "Problem hashing file" -msgstr "" - -#: methods/ftp.cc:877 -#, c-format -msgid "Unable to fetch file, server said '%s'" -msgstr "تعذر إحضار الملف، ردّ الخادم '%s'" - -#: methods/ftp.cc:892 methods/rsh.cc:322 -msgid "Data socket timed out" -msgstr "" - -#: methods/ftp.cc:922 -#, c-format -msgid "Data transfer failed, server said '%s'" -msgstr "فشل نقل البيانات، ردّ الخادم '%s'" - -#. Get the files information -#: methods/ftp.cc:997 -msgid "Query" -msgstr "استعلام" - -#: methods/ftp.cc:1109 -msgid "Unable to invoke " -msgstr "" - -#: methods/connect.cc:64 -#, c-format -msgid "Connecting to %s (%s)" -msgstr "الاتصال بـ%s (%s)" - -#: methods/connect.cc:71 -#, c-format -msgid "[IP: %s %s]" -msgstr "[IP: %s %s]" - -#: methods/connect.cc:80 -#, c-format -msgid "Could not create a socket for %s (f=%u t=%u p=%u)" -msgstr "" - -#: methods/connect.cc:86 -#, c-format -msgid "Cannot initiate the connection to %s:%s (%s)." -msgstr "تعذر تمهيد الاتصال بـ%s:%s (%s)." - -#: methods/connect.cc:93 -#, c-format -msgid "Could not connect to %s:%s (%s), connection timed out" -msgstr "تعذر الاتصال بـ%s:%s (%s)، انتهى وقت الاتصال" - -#: methods/connect.cc:108 -#, c-format -msgid "Could not connect to %s:%s (%s)." -msgstr "تعذر الاتصال بـ%s:%s (%s)." - -#. We say this mainly because the pause here is for the -#. ssh connection that is still going -#: methods/connect.cc:136 methods/rsh.cc:425 -#, c-format -msgid "Connecting to %s" -msgstr "الاتصال بـ%s" - -#: methods/connect.cc:167 -#, c-format -msgid "Could not resolve '%s'" -msgstr "" - -#: methods/connect.cc:173 -#, c-format -msgid "Temporary failure resolving '%s'" -msgstr "" - -#: methods/connect.cc:176 -#, c-format -msgid "Something wicked happened resolving '%s:%s' (%i)" -msgstr "" - -#: methods/connect.cc:223 -#, c-format -msgid "Unable to connect to %s %s:" -msgstr "تعذر الاتصال بـ%s %s:" - -#: methods/gpgv.cc:65 -#, c-format -msgid "Couldn't access keyring: '%s'" -msgstr "" - -#: methods/gpgv.cc:100 -msgid "E: Argument list from Acquire::gpgv::Options too long. Exiting." -msgstr "" - -#: methods/gpgv.cc:204 -msgid "" -"Internal error: Good signature, but could not determine key fingerprint?!" -msgstr "" - -#: methods/gpgv.cc:209 -msgid "At least one invalid signature was encountered." -msgstr "" - -#: methods/gpgv.cc:213 -#, c-format -msgid "Could not execute '%s' to verify signature (is gnupg installed?)" -msgstr "" - -#: methods/gpgv.cc:218 -msgid "Unknown error executing gpgv" -msgstr "" - -#: methods/gpgv.cc:249 -msgid "The following signatures were invalid:\n" -msgstr "" - -#: methods/gpgv.cc:256 -msgid "" -"The following signatures couldn't be verified because the public key is not " -"available:\n" -msgstr "" - -#: methods/gzip.cc:64 -#, c-format -msgid "Couldn't open pipe for %s" -msgstr "" - -#: methods/gzip.cc:109 -#, c-format -msgid "Read error from %s process" -msgstr "" - -#: methods/http.cc:376 -msgid "Waiting for headers" -msgstr "بانتظار الترويسات" - -#: methods/http.cc:522 -#, c-format -msgid "Got a single header line over %u chars" -msgstr "" - -#: methods/http.cc:530 -msgid "Bad header line" -msgstr "سطر ترويسة سيء" - -#: methods/http.cc:549 methods/http.cc:556 -msgid "The HTTP server sent an invalid reply header" -msgstr "أرسل خادم http ترويسة ردّ غير صالحة" - -#: methods/http.cc:585 -msgid "The HTTP server sent an invalid Content-Length header" -msgstr "أرسل خادم http ترويسة طول محتويات (ِContent-Length) غير صالحة" - -#: methods/http.cc:600 -msgid "The HTTP server sent an invalid Content-Range header" -msgstr "أرسل خادم http ترويسة مدى محتويات (ِContent-Range) غير صالحة" - -#: methods/http.cc:602 -msgid "This HTTP server has broken range support" -msgstr "خادم http له دعم مدى معطوب" - -#: methods/http.cc:626 -msgid "Unknown date format" -msgstr "نسق تاريخ مجهول" - -#: methods/http.cc:773 -msgid "Select failed" -msgstr "فشل التحديد" - -#: methods/http.cc:778 -msgid "Connection timed out" -msgstr "انتهى وقت الاتصال" - -#: methods/http.cc:801 -msgid "Error writing to output file" -msgstr "خطأ في الكتابة إلى ملف المُخرجات" - -#: methods/http.cc:832 -msgid "Error writing to file" -msgstr "خطأ في الكتابة إلى الملف" - -#: methods/http.cc:860 -msgid "Error writing to the file" -msgstr "خطأ في الكتابة إلى الملف" - -#: methods/http.cc:874 -msgid "Error reading from server. Remote end closed connection" -msgstr "خطأ في القراءة من الخادم. أقفل الطرف الآخر الاتصال" - -#: methods/http.cc:876 -msgid "Error reading from server" -msgstr "خطأ في القراءة من الخادم" - -#: methods/http.cc:1107 -msgid "Bad header data" -msgstr "بيانات ترويسة سيئة" - -#: methods/http.cc:1124 -msgid "Connection failed" -msgstr "فشل الاتصال" - -#: methods/http.cc:1215 -msgid "Internal error" -msgstr "خطأ داخلي" - -#: apt-pkg/contrib/mmap.cc:82 -msgid "Can't mmap an empty file" -msgstr "" - -#: apt-pkg/contrib/mmap.cc:87 -#, c-format -msgid "Couldn't make mmap of %lu bytes" -msgstr "" - -#: apt-pkg/contrib/strutl.cc:938 -#, c-format -msgid "Selection %s not found" -msgstr "تعذر العثور على التحديد %s" - -#: apt-pkg/contrib/configuration.cc:436 -#, c-format -msgid "Unrecognized type abbreviation: '%c'" -msgstr "اختصار نوع مجهول: '%c'" - -#: apt-pkg/contrib/configuration.cc:494 -#, c-format -msgid "Opening configuration file %s" -msgstr "فتح ملف التهيئة %s" - -#: apt-pkg/contrib/configuration.cc:512 -#, c-format -msgid "Line %d too long (max %d)" -msgstr "السطر %d طويل جداً (أقصاه %d)" - -#: apt-pkg/contrib/configuration.cc:608 -#, c-format -msgid "Syntax error %s:%u: Block starts with no name." -msgstr "" - -#: apt-pkg/contrib/configuration.cc:627 -#, c-format -msgid "Syntax error %s:%u: Malformed tag" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:644 -#, c-format -msgid "Syntax error %s:%u: Extra junk after value" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:684 -#, c-format -msgid "Syntax error %s:%u: Directives can only be done at the top level" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:691 -#, c-format -msgid "Syntax error %s:%u: Too many nested includes" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:695 apt-pkg/contrib/configuration.cc:700 -#, c-format -msgid "Syntax error %s:%u: Included from here" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:704 -#, c-format -msgid "Syntax error %s:%u: Unsupported directive '%s'" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:738 -#, c-format -msgid "Syntax error %s:%u: Extra junk at end of file" -msgstr "" - -#: apt-pkg/contrib/progress.cc:154 -#, c-format -msgid "%c%s... Error!" -msgstr "%c%s... خطأ!" - -#: apt-pkg/contrib/progress.cc:156 -#, c-format -msgid "%c%s... Done" -msgstr "%c%s... تمّ" - -#: apt-pkg/contrib/cmndline.cc:80 -#, c-format -msgid "Command line option '%c' [from %s] is not known." -msgstr "خيار سطر الأمر '%c' [من %s] مجهول." - -#: apt-pkg/contrib/cmndline.cc:106 apt-pkg/contrib/cmndline.cc:114 -#: apt-pkg/contrib/cmndline.cc:122 -#, c-format -msgid "Command line option %s is not understood" -msgstr "خيار سطر الأمر %s غير مفهوم" - -#: apt-pkg/contrib/cmndline.cc:127 -#, c-format -msgid "Command line option %s is not boolean" -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:166 apt-pkg/contrib/cmndline.cc:187 -#, c-format -msgid "Option %s requires an argument." -msgstr "الخيار %s يتطلّب مُعطى." - -#: apt-pkg/contrib/cmndline.cc:201 apt-pkg/contrib/cmndline.cc:207 -#, c-format -msgid "Option %s: Configuration item specification must have an =<val>." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:237 -#, c-format -msgid "Option %s requires an integer argument, not '%s'" -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:268 -#, c-format -msgid "Option '%s' is too long" -msgstr "الخيار '%s' طويل جداً" - -#: apt-pkg/contrib/cmndline.cc:301 -#, c-format -msgid "Sense %s is not understood, try true or false." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:351 -#, c-format -msgid "Invalid operation %s" -msgstr "عمليّة غير صالحة %s" - -#: apt-pkg/contrib/cdromutl.cc:55 -#, c-format -msgid "Unable to stat the mount point %s" -msgstr "" - -#: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:427 apt-pkg/clean.cc:44 -#, c-format -msgid "Unable to change to %s" -msgstr "" - -#: apt-pkg/contrib/cdromutl.cc:190 -msgid "Failed to stat the cdrom" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:82 -#, c-format -msgid "Not using locking for read only lock file %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:87 -#, c-format -msgid "Could not open lock file %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:105 -#, c-format -msgid "Not using locking for nfs mounted lock file %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:109 -#, c-format -msgid "Could not get lock %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:377 -#, c-format -msgid "Waited for %s but it wasn't there" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:387 -#, c-format -msgid "Sub-process %s received a segmentation fault." -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:390 -#, c-format -msgid "Sub-process %s returned an error code (%u)" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:392 -#, c-format -msgid "Sub-process %s exited unexpectedly" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:436 -#, c-format -msgid "Could not open file %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:492 -#, c-format -msgid "read, still have %lu to read but none left" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:522 -#, c-format -msgid "write, still have %lu to write but couldn't" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:597 -msgid "Problem closing the file" -msgstr "مشكلة في إغلاق الملف" - -#: apt-pkg/contrib/fileutl.cc:603 -msgid "Problem unlinking the file" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:614 -msgid "Problem syncing the file" -msgstr "مشكلة في مزامنة الملف" - -#: apt-pkg/pkgcache.cc:126 -msgid "Empty package cache" -msgstr "" - -#: apt-pkg/pkgcache.cc:132 -msgid "The package cache file is corrupted" -msgstr "" - -#: apt-pkg/pkgcache.cc:137 -msgid "The package cache file is an incompatible version" -msgstr "" - -#: apt-pkg/pkgcache.cc:142 -#, c-format -msgid "This APT does not support the versioning system '%s'" -msgstr "" - -#: apt-pkg/pkgcache.cc:147 -msgid "The package cache was built for a different architecture" -msgstr "" - -#: apt-pkg/pkgcache.cc:218 -msgid "Depends" -msgstr "يعتمد" - -#: apt-pkg/pkgcache.cc:218 -msgid "PreDepends" -msgstr "يعتمد مسبقاً" - -#: apt-pkg/pkgcache.cc:218 -msgid "Suggests" -msgstr "يستحسن" - -#: apt-pkg/pkgcache.cc:219 -msgid "Recommends" -msgstr "يقترح" - -#: apt-pkg/pkgcache.cc:219 -msgid "Conflicts" -msgstr "يعارض" - -#: apt-pkg/pkgcache.cc:219 -msgid "Replaces" -msgstr "يستبدل" - -#: apt-pkg/pkgcache.cc:220 -msgid "Obsoletes" -msgstr "يُلغي" - -#: apt-pkg/pkgcache.cc:231 -msgid "important" -msgstr "مهم" - -#: apt-pkg/pkgcache.cc:231 -msgid "required" -msgstr "مطلوب" - -#: apt-pkg/pkgcache.cc:231 -msgid "standard" -msgstr "قياسي" - -#: apt-pkg/pkgcache.cc:232 -msgid "optional" -msgstr "اختياري" - -#: apt-pkg/pkgcache.cc:232 -msgid "extra" -msgstr "إضافي" - -#: apt-pkg/depcache.cc:61 apt-pkg/depcache.cc:90 -msgid "Building dependency tree" -msgstr "" - -#: apt-pkg/depcache.cc:62 -msgid "Candidate versions" -msgstr "" - -#: apt-pkg/depcache.cc:91 -msgid "Dependency generation" -msgstr "" - -#: apt-pkg/tagfile.cc:106 -#, c-format -msgid "Unable to parse package file %s (1)" -msgstr "" - -#: apt-pkg/tagfile.cc:193 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "" - -#: apt-pkg/sourcelist.cc:94 -#, c-format -msgid "Malformed line %lu in source list %s (URI)" -msgstr "" - -#: apt-pkg/sourcelist.cc:96 -#, c-format -msgid "Malformed line %lu in source list %s (dist)" -msgstr "" - -#: apt-pkg/sourcelist.cc:99 -#, c-format -msgid "Malformed line %lu in source list %s (URI parse)" -msgstr "" - -#: apt-pkg/sourcelist.cc:105 -#, c-format -msgid "Malformed line %lu in source list %s (absolute dist)" -msgstr "" - -#: apt-pkg/sourcelist.cc:112 -#, c-format -msgid "Malformed line %lu in source list %s (dist parse)" -msgstr "" - -#: apt-pkg/sourcelist.cc:203 -#, c-format -msgid "Opening %s" -msgstr "فتح %s" - -#: apt-pkg/sourcelist.cc:220 apt-pkg/cdrom.cc:426 -#, c-format -msgid "Line %u too long in source list %s." -msgstr "" - -#: apt-pkg/sourcelist.cc:240 -#, c-format -msgid "Malformed line %u in source list %s (type)" -msgstr "" - -#: apt-pkg/sourcelist.cc:244 -#, c-format -msgid "Type '%s' is not known on line %u in source list %s" -msgstr "" - -#: apt-pkg/sourcelist.cc:252 apt-pkg/sourcelist.cc:255 -#, c-format -msgid "Malformed line %u in source list %s (vendor id)" -msgstr "" - -#: apt-pkg/packagemanager.cc:402 -#, c-format -msgid "" -"This installation run will require temporarily removing the essential " -"package %s due to a Conflicts/Pre-Depends loop. This is often bad, but if " -"you really want to do it, activate the APT::Force-LoopBreak option." -msgstr "" - -#: apt-pkg/pkgrecords.cc:37 -#, c-format -msgid "Index file type '%s' is not supported" -msgstr "" - -#: apt-pkg/algorithms.cc:241 -#, c-format -msgid "" -"The package %s needs to be reinstalled, but I can't find an archive for it." -msgstr "" - -#: apt-pkg/algorithms.cc:1059 -msgid "" -"Error, pkgProblemResolver::Resolve generated breaks, this may be caused by " -"held packages." -msgstr "" - -#: apt-pkg/algorithms.cc:1061 -msgid "Unable to correct problems, you have held broken packages." -msgstr "" - -#: apt-pkg/acquire.cc:62 -#, c-format -msgid "Lists directory %spartial is missing." -msgstr "" - -#: apt-pkg/acquire.cc:66 -#, c-format -msgid "Archive directory %spartial is missing." -msgstr "" - -#. only show the ETA if it makes sense -#. two days -#: apt-pkg/acquire.cc:823 -#, c-format -msgid "Retrieving file %li of %li (%s remaining)" -msgstr "" - -#: apt-pkg/acquire.cc:825 -#, c-format -msgid "Retrieving file %li of %li" -msgstr "" - -#: apt-pkg/acquire-worker.cc:113 -#, c-format -msgid "The method driver %s could not be found." -msgstr "" - -#: apt-pkg/acquire-worker.cc:162 -#, c-format -msgid "Method %s did not start correctly" -msgstr "" - -#: apt-pkg/acquire-worker.cc:377 -#, c-format -msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter." -msgstr "الرجاء إدخال القرص المُسمّى '%s' في السوّاقة '%s' وضغط مفتاح الإدخال." - -#: apt-pkg/init.cc:120 -#, c-format -msgid "Packaging system '%s' is not supported" -msgstr "نظام الحزم '%s' غير مدعوم" - -#: apt-pkg/init.cc:136 -msgid "Unable to determine a suitable packaging system type" -msgstr "" - -#: apt-pkg/clean.cc:61 -#, c-format -msgid "Unable to stat %s." -msgstr "" - -#: apt-pkg/srcrecords.cc:48 -msgid "You must put some 'source' URIs in your sources.list" -msgstr "" - -#: apt-pkg/cachefile.cc:73 -msgid "The package lists or status file could not be parsed or opened." -msgstr "" - -#: apt-pkg/cachefile.cc:77 -msgid "You may want to run apt-get update to correct these problems" -msgstr "قد يساعدك تنفيذ الأمر apt-get update في تصحيح هذه المشاكل" - -#: apt-pkg/policy.cc:269 -msgid "Invalid record in the preferences file, no Package header" -msgstr "" - -#: apt-pkg/policy.cc:291 -#, c-format -msgid "Did not understand pin type %s" -msgstr "" - -#: apt-pkg/policy.cc:299 -msgid "No priority (or zero) specified for pin" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:74 -msgid "Cache has an incompatible versioning system" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:117 -#, c-format -msgid "Error occurred while processing %s (NewPackage)" -msgstr "حدث خطأ أثناء معالجة %s (NewPackage)" - -#: apt-pkg/pkgcachegen.cc:129 -#, c-format -msgid "Error occurred while processing %s (UsePackage1)" -msgstr "حدث خطأ أثناء معالجة %s (UserPackage1)" - -#: apt-pkg/pkgcachegen.cc:150 -#, c-format -msgid "Error occurred while processing %s (UsePackage2)" -msgstr "حدث خطأ أثناء معالجة %s (UserPackage2)" - -#: apt-pkg/pkgcachegen.cc:154 -#, c-format -msgid "Error occurred while processing %s (NewFileVer1)" -msgstr "حدث خطأ أثناء معالجة %s (NewFileVer1)" - -#: apt-pkg/pkgcachegen.cc:184 -#, c-format -msgid "Error occurred while processing %s (NewVersion1)" -msgstr "حدث خطأ أثناء معالجة %s (NewVersion1)" - -#: apt-pkg/pkgcachegen.cc:188 -#, c-format -msgid "Error occurred while processing %s (UsePackage3)" -msgstr "حدث خطأ أثناء معالجة %s (UsePackage3)" - -#: apt-pkg/pkgcachegen.cc:192 -#, c-format -msgid "Error occurred while processing %s (NewVersion2)" -msgstr "حدث خطأ أثناء معالجة %s (NewVersion2)" - -#: apt-pkg/pkgcachegen.cc:207 -msgid "Wow, you exceeded the number of package names this APT is capable of." -msgstr "" - -#: apt-pkg/pkgcachegen.cc:210 -msgid "Wow, you exceeded the number of versions this APT is capable of." -msgstr "" - -#: apt-pkg/pkgcachegen.cc:213 -msgid "Wow, you exceeded the number of dependencies this APT is capable of." -msgstr "" - -#: apt-pkg/pkgcachegen.cc:241 -#, c-format -msgid "Error occurred while processing %s (FindPkg)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:254 -#, c-format -msgid "Error occurred while processing %s (CollectFileProvides)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:260 -#, c-format -msgid "Package %s %s was not found while processing file dependencies" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:574 -#, c-format -msgid "Couldn't stat source package list %s" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:658 -msgid "Collecting File Provides" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:785 apt-pkg/pkgcachegen.cc:792 -msgid "IO Error saving source cache" -msgstr "" - -#: apt-pkg/acquire-item.cc:126 -#, c-format -msgid "rename failed, %s (%s -> %s)." -msgstr "فشل إعادة التسمية ، %s (%s -> %s)." - -#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:945 -msgid "MD5Sum mismatch" -msgstr "MD5Sum غير متطابقة" - -#: apt-pkg/acquire-item.cc:640 -msgid "There is no public key available for the following key IDs:\n" -msgstr "" - -#: apt-pkg/acquire-item.cc:753 -#, c-format -msgid "" -"I wasn't able to locate a file for the %s package. This might mean you need " -"to manually fix this package. (due to missing arch)" -msgstr "" - -#: apt-pkg/acquire-item.cc:812 -#, c-format -msgid "" -"I wasn't able to locate file for the %s package. This might mean you need to " -"manually fix this package." -msgstr "" - -#: apt-pkg/acquire-item.cc:848 -#, c-format -msgid "" -"The package index files are corrupted. No Filename: field for package %s." -msgstr "" - -#: apt-pkg/acquire-item.cc:935 -msgid "Size mismatch" -msgstr "الحجم غير متطابق" - -#: apt-pkg/vendorlist.cc:66 -#, c-format -msgid "Vendor block %s contains no fingerprint" -msgstr "" - -#: apt-pkg/cdrom.cc:507 -#, c-format -msgid "" -"Using CD-ROM mount point %s\n" -"Mounting CD-ROM\n" -msgstr "" - -#: apt-pkg/cdrom.cc:516 apt-pkg/cdrom.cc:598 -msgid "Identifying.. " -msgstr "جاري التعرف..." - -#: apt-pkg/cdrom.cc:541 -#, c-format -msgid "Stored label: %s \n" -msgstr "" - -#: apt-pkg/cdrom.cc:561 -#, c-format -msgid "Using CD-ROM mount point %s\n" -msgstr "" - -#: apt-pkg/cdrom.cc:579 -msgid "Unmounting CD-ROM\n" -msgstr "فك تركيب القرص المدمج\n" - -#: apt-pkg/cdrom.cc:583 -msgid "Waiting for disc...\n" -msgstr "بانتظار القرص...\n" - -#. Mount the new CDROM -#: apt-pkg/cdrom.cc:591 -msgid "Mounting CD-ROM...\n" -msgstr "تركيب القرص...\n" - -#: apt-pkg/cdrom.cc:609 -msgid "Scanning disc for index files..\n" -msgstr "" - -#: apt-pkg/cdrom.cc:647 -#, c-format -msgid "Found %i package indexes, %i source indexes and %i signatures\n" -msgstr "" - -#: apt-pkg/cdrom.cc:710 -msgid "That is not a valid name, try again.\n" -msgstr "هذا الاسم غير صالح، حاول مجدداً.\n" - -#: apt-pkg/cdrom.cc:726 -#, c-format -msgid "" -"This disc is called: \n" -"'%s'\n" -msgstr "" -"هذا القرص مسمى: \n" -"'%s'\n" - -#: apt-pkg/cdrom.cc:730 -msgid "Copying package lists..." -msgstr "نسخ قوائم الحزم..." - -#: apt-pkg/cdrom.cc:754 -msgid "Writing new source list\n" -msgstr "كتابة لائحة المصادر الجديدة\n" - -#: apt-pkg/cdrom.cc:763 -msgid "Source list entries for this disc are:\n" -msgstr "" - -#: apt-pkg/cdrom.cc:803 -msgid "Unmounting CD-ROM..." -msgstr "فك تركيب القرص المدمج..." - -#: apt-pkg/indexcopy.cc:261 -#, c-format -msgid "Wrote %i records.\n" -msgstr "" - -#: apt-pkg/indexcopy.cc:263 -#, c-format -msgid "Wrote %i records with %i missing files.\n" -msgstr "" - -#: apt-pkg/indexcopy.cc:266 -#, c-format -msgid "Wrote %i records with %i mismatched files\n" -msgstr "" - -#: apt-pkg/indexcopy.cc:269 -#, c-format -msgid "Wrote %i records with %i missing files and %i mismatched files\n" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:358 -#, c-format -msgid "Preparing %s" -msgstr "تحضير %s" - -#: apt-pkg/deb/dpkgpm.cc:359 -#, c-format -msgid "Unpacking %s" -msgstr "فتح %s" - -#: apt-pkg/deb/dpkgpm.cc:364 -#, c-format -msgid "Preparing to configure %s" -msgstr "التحضير لتهيئة %s" - -#: apt-pkg/deb/dpkgpm.cc:365 -#, c-format -msgid "Configuring %s" -msgstr "تهيئة %s" - -#: apt-pkg/deb/dpkgpm.cc:366 -#, c-format -msgid "Installed %s" -msgstr "تم تثبيت %s" - -#: apt-pkg/deb/dpkgpm.cc:371 -#, c-format -msgid "Preparing for removal of %s" -msgstr "التحضير لإزالة %s" - -#: apt-pkg/deb/dpkgpm.cc:372 -#, c-format -msgid "Removing %s" -msgstr "إزالة %s" - -#: apt-pkg/deb/dpkgpm.cc:373 -#, c-format -msgid "Removed %s" -msgstr "تم إزالة %s" - -#: apt-pkg/deb/dpkgpm.cc:378 -#, c-format -msgid "Preparing to completely remove %s" -msgstr "التحضير لإزالة %s بالكامل" - -#: apt-pkg/deb/dpkgpm.cc:379 -#, c-format -msgid "Completely removed %s" -msgstr "تمت إزالة %s بالكامل" - -#: methods/rsh.cc:330 -msgid "Connection closed prematurely" -msgstr "" - -#~ msgid "File date has changed %s" -#~ msgstr "تغير تاريخ الملف %s" diff --git a/po/ku.po b/po/ku.po deleted file mode 100644 index 9871384f4..000000000 --- a/po/ku.po +++ /dev/null @@ -1,2573 +0,0 @@ -# Kurdish translation for apt -# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006 -# This file is distributed under the same license as the apt package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2006. -# -msgid "" -msgstr "" -"Project-Id-Version: apt\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-10-11 20:34+0200\n" -"PO-Revision-Date: 2006-09-16 17:51+0100\n" -"Last-Translator: Erdal Ronahi <erdal.ronahi@gmail.com>\n" -"Language-Team: Kurdish <ku@li.org>\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: cmdline/apt-cache.cc:135 -#, c-format -msgid "Package %s version %s has an unmet dep:\n" -msgstr "" - -#: cmdline/apt-cache.cc:175 cmdline/apt-cache.cc:527 cmdline/apt-cache.cc:615 -#: cmdline/apt-cache.cc:771 cmdline/apt-cache.cc:989 cmdline/apt-cache.cc:1357 -#: cmdline/apt-cache.cc:1508 -#, c-format -msgid "Unable to locate package %s" -msgstr "Pakêt nehate dîtin %s" - -#: cmdline/apt-cache.cc:232 -msgid "Total package names : " -msgstr "Navên paketan bi giştî :" - -#: cmdline/apt-cache.cc:272 -msgid " Normal packages: " -msgstr " Pakêtên normal:" - -#: cmdline/apt-cache.cc:273 -msgid " Pure virtual packages: " -msgstr " Pakêtên farazî yên safî:" - -#: cmdline/apt-cache.cc:274 -msgid " Single virtual packages: " -msgstr " Pakêta tenê ya farazî:" - -#: cmdline/apt-cache.cc:275 -msgid " Mixed virtual packages: " -msgstr " Pakêtên hevbeş yên farazî:" - -#: cmdline/apt-cache.cc:276 -msgid " Missing: " -msgstr " Winda: " - -#: cmdline/apt-cache.cc:278 -msgid "Total distinct versions: " -msgstr "Guhertoyên vekirî yên giştî:" - -#: cmdline/apt-cache.cc:280 -msgid "Total dependencies: " -msgstr "Bindestên giştî:" - -#: cmdline/apt-cache.cc:283 -msgid "Total ver/file relations: " -msgstr "" - -#: cmdline/apt-cache.cc:285 -msgid "Total Provides mappings: " -msgstr "" - -#: cmdline/apt-cache.cc:297 -msgid "Total globbed strings: " -msgstr "" - -#: cmdline/apt-cache.cc:311 -msgid "Total dependency version space: " -msgstr "" - -#: cmdline/apt-cache.cc:316 -msgid "Total slack space: " -msgstr "Cihê giştî yê sist:" - -#: cmdline/apt-cache.cc:324 -msgid "Total space accounted for: " -msgstr "Cihê giştî yê veqetandî: " - -#: cmdline/apt-cache.cc:446 cmdline/apt-cache.cc:1189 -#, c-format -msgid "Package file %s is out of sync." -msgstr "Pakêta dosya %s li derveyî demê ye." - -#: cmdline/apt-cache.cc:1231 -msgid "You must give exactly one pattern" -msgstr "Pêwist e tu mînakekê bidî" - -#: cmdline/apt-cache.cc:1385 -msgid "No packages found" -msgstr "Pakêt nayên dîtin" - -#: cmdline/apt-cache.cc:1462 -msgid "Package files:" -msgstr "Pelgehên Pakêt:" - -#: cmdline/apt-cache.cc:1469 cmdline/apt-cache.cc:1555 -msgid "Cache is out of sync, can't x-ref a package file" -msgstr "" - -#: cmdline/apt-cache.cc:1470 -#, c-format -msgid "%4i %s\n" -msgstr "%4i %s\n" - -#. Show any packages have explicit pins -#: cmdline/apt-cache.cc:1482 -msgid "Pinned packages:" -msgstr "" - -#: cmdline/apt-cache.cc:1494 cmdline/apt-cache.cc:1535 -msgid "(not found)" -msgstr "(nehate dîtin)" - -#. Installed version -#: cmdline/apt-cache.cc:1515 -msgid " Installed: " -msgstr " Sazkirî: " - -#: cmdline/apt-cache.cc:1517 cmdline/apt-cache.cc:1525 -msgid "(none)" -msgstr "(ne tiştek)" - -#. Candidate Version -#: cmdline/apt-cache.cc:1522 -msgid " Candidate: " -msgstr " Berendam: " - -#: cmdline/apt-cache.cc:1532 -msgid " Package pin: " -msgstr " Destika pakêtê:" - -#. Show the priority tables -#: cmdline/apt-cache.cc:1541 -msgid " Version table:" -msgstr " Tabloya guhertoyan:" - -#: cmdline/apt-cache.cc:1556 -#, c-format -msgid " %4i %s\n" -msgstr " %4i %s\n" - -#: cmdline/apt-cache.cc:1652 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70 -#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550 -#: cmdline/apt-get.cc:2387 cmdline/apt-sortpkgs.cc:144 -#, c-format -msgid "%s %s for %s %s compiled on %s %s\n" -msgstr "%s %s ji bo %s %s komkirî di %s %s de\n" - -#: cmdline/apt-cache.cc:1659 -msgid "" -"Usage: apt-cache [options] command\n" -" apt-cache [options] add file1 [file2 ...]\n" -" apt-cache [options] showpkg pkg1 [pkg2 ...]\n" -" apt-cache [options] showsrc pkg1 [pkg2 ...]\n" -"\n" -"apt-cache is a low-level tool used to manipulate APT's binary\n" -"cache files, and query information from them\n" -"\n" -"Commands:\n" -" add - Add a package file to the source cache\n" -" gencaches - Build both the package and source cache\n" -" showpkg - Show some general information for a single package\n" -" showsrc - Show source records\n" -" stats - Show some basic statistics\n" -" dump - Show the entire file in a terse form\n" -" dumpavail - Print an available file to stdout\n" -" unmet - Show unmet dependencies\n" -" search - Search the package list for a regex pattern\n" -" show - Show a readable record for the package\n" -" depends - Show raw dependency information for a package\n" -" rdepends - Show reverse dependency information for a package\n" -" pkgnames - List the names of all packages\n" -" dotty - Generate package graphs for GraphVis\n" -" xvcg - Generate package graphs for xvcg\n" -" policy - Show policy settings\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -p=? The package cache.\n" -" -s=? The source cache.\n" -" -q Disable progress indicator.\n" -" -i Show only important deps for the unmet command.\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -"See the apt-cache(8) and apt.conf(5) manual pages for more information.\n" -msgstr "" - -#: cmdline/apt-cdrom.cc:78 -msgid "Please provide a name for this Disc, such as 'Debian 2.1r1 Disk 1'" -msgstr "Ji kerema xwe re navekî li vî Dîsketî bike, wekî 'Debian 2.1r1 Disk 1'" - -#: cmdline/apt-cdrom.cc:93 -msgid "Please insert a Disc in the drive and press enter" -msgstr "Dîsketê siwar bike û piştre bişkoja derbaskirinê bitikîne" - -#: cmdline/apt-cdrom.cc:117 -msgid "Repeat this process for the rest of the CDs in your set." -msgstr "" - -#: cmdline/apt-config.cc:41 -msgid "Arguments not in pairs" -msgstr "" - -#: cmdline/apt-config.cc:76 -msgid "" -"Usage: apt-config [options] command\n" -"\n" -"apt-config is a simple tool to read the APT config file\n" -"\n" -"Commands:\n" -" shell - Shell mode\n" -" dump - Show the configuration\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" -"Bikaranîn: apt-config [vebijark] ferman\n" -"apt-config, amûra xwendina dosyeya mîhengên APTê ye\n" -"\n" -"Ferman\n" -" shell - moda shell\n" -" dump - Mîhengan nîşan dide\n" -"\n" -"Vebijark:\n" -" -h Ev dosyeya alîkariyê ye.\n" -" -c=? Dosyeya mîhengan nîşan dide\n" -" -o=? Rê li ber vedike ku tu karibe li gorî dilê xwe vebijarkan diyar bike. " -"mînak -o dir::cache=/tmp\n" - -#: cmdline/apt-extracttemplates.cc:98 -#, c-format -msgid "%s not a valid DEB package." -msgstr "%s ne paketeke DEB ya derbasdar e." - -#: cmdline/apt-extracttemplates.cc:232 -msgid "" -"Usage: apt-extracttemplates file1 [file2 ...]\n" -"\n" -"apt-extracttemplates is a tool to extract config and template info\n" -"from debian packages\n" -"\n" -"Options:\n" -" -h This help text\n" -" -t Set the temp dir\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" - -#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:710 -#, c-format -msgid "Unable to write to %s" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: cmdline/apt-extracttemplates.cc:310 -msgid "Cannot get debconf version. Is debconf installed?" -msgstr "Guhertoya debconf nehate stendin. debconf sazkirî ye?" - -#: ftparchive/apt-ftparchive.cc:167 ftparchive/apt-ftparchive.cc:341 -msgid "Package extension list is too long" -msgstr "Lîsteya dirêjahiya pakêtê zêde dirêj e" - -#: ftparchive/apt-ftparchive.cc:169 ftparchive/apt-ftparchive.cc:183 -#: ftparchive/apt-ftparchive.cc:206 ftparchive/apt-ftparchive.cc:256 -#: ftparchive/apt-ftparchive.cc:270 ftparchive/apt-ftparchive.cc:292 -#, c-format -msgid "Error processing directory %s" -msgstr "Di şixulandina pêrista %s de çewtî" - -#: ftparchive/apt-ftparchive.cc:254 -msgid "Source extension list is too long" -msgstr "Lîsteya dirêjahiya çavkaniyê zêde dirêj e" - -#: ftparchive/apt-ftparchive.cc:371 -msgid "Error writing header to contents file" -msgstr "Dema li dosyeya naverokê joreagahî dihate nivîsîn çewtî" - -#: ftparchive/apt-ftparchive.cc:401 -#, c-format -msgid "Error processing contents %s" -msgstr "Dema şixulandina naveroka %s çewtî" - -#: ftparchive/apt-ftparchive.cc:556 -msgid "" -"Usage: apt-ftparchive [options] command\n" -"Commands: packages binarypath [overridefile [pathprefix]]\n" -" sources srcpath [overridefile [pathprefix]]\n" -" contents path\n" -" release path\n" -" generate config [groups]\n" -" clean config\n" -"\n" -"apt-ftparchive generates index files for Debian archives. It supports\n" -"many styles of generation from fully automated to functional replacements\n" -"for dpkg-scanpackages and dpkg-scansources\n" -"\n" -"apt-ftparchive generates Package files from a tree of .debs. The\n" -"Package file contains the contents of all the control fields from\n" -"each package as well as the MD5 hash and filesize. An override file\n" -"is supported to force the value of Priority and Section.\n" -"\n" -"Similarly apt-ftparchive generates Sources files from a tree of .dscs.\n" -"The --source-override option can be used to specify a src override file\n" -"\n" -"The 'packages' and 'sources' command should be run in the root of the\n" -"tree. BinaryPath should point to the base of the recursive search and \n" -"override file should contain the override flags. Pathprefix is\n" -"appended to the filename fields if present. Example usage from the \n" -"Debian archive:\n" -" apt-ftparchive packages dists/potato/main/binary-i386/ > \\\n" -" dists/potato/main/binary-i386/Packages\n" -"\n" -"Options:\n" -" -h This help text\n" -" --md5 Control MD5 generation\n" -" -s=? Source override file\n" -" -q Quiet\n" -" -d=? Select the optional caching database\n" -" --no-delink Enable delinking debug mode\n" -" --contents Control contents file generation\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option" -msgstr "" - -#: ftparchive/apt-ftparchive.cc:762 -msgid "No selections matched" -msgstr "" - -#: ftparchive/apt-ftparchive.cc:835 -#, c-format -msgid "Some files are missing in the package file group `%s'" -msgstr "Di koma pelgehên pakêta '%s' de hin pelgeh kêm in" - -#: ftparchive/cachedb.cc:47 -#, c-format -msgid "DB was corrupted, file renamed to %s.old" -msgstr "DB xerabe ye, navê dosyeyê weke %s.old hate guherandin" - -#: ftparchive/cachedb.cc:65 -#, c-format -msgid "DB is old, attempting to upgrade %s" -msgstr "Danegir kevn e, ji bo bilindkirina %s hewl dide" - -#: ftparchive/cachedb.cc:76 -msgid "" -"DB format is invalid. If you upgraded from a older version of apt, please " -"remove and re-create the database." -msgstr "" - -#: ftparchive/cachedb.cc:81 -#, c-format -msgid "Unable to open DB file %s: %s" -msgstr "Danegira %s nehate vekirin: %s" - -#: ftparchive/cachedb.cc:127 apt-inst/extract.cc:181 apt-inst/extract.cc:193 -#: apt-inst/extract.cc:210 apt-inst/deb/dpkgdb.cc:121 methods/gpgv.cc:272 -#, c-format -msgid "Failed to stat %s" -msgstr "" - -#: ftparchive/cachedb.cc:242 -msgid "Archive has no control record" -msgstr "Tomara kontrola arşîvê tuneye" - -#: ftparchive/cachedb.cc:448 -msgid "Unable to get a cursor" -msgstr "" - -#: ftparchive/writer.cc:79 -#, c-format -msgid "W: Unable to read directory %s\n" -msgstr "W: pelrêça %s nayê xwendin\n" - -#: ftparchive/writer.cc:84 -#, c-format -msgid "W: Unable to stat %s\n" -msgstr "" - -#: ftparchive/writer.cc:135 -msgid "E: " -msgstr "E: " - -#: ftparchive/writer.cc:137 -msgid "W: " -msgstr "W: " - -#: ftparchive/writer.cc:144 -msgid "E: Errors apply to file " -msgstr "" - -#: ftparchive/writer.cc:161 ftparchive/writer.cc:191 -#, c-format -msgid "Failed to resolve %s" -msgstr "%s ji hev nehate veçirandin" - -#: ftparchive/writer.cc:173 -msgid "Tree walking failed" -msgstr "" - -#: ftparchive/writer.cc:198 -#, c-format -msgid "Failed to open %s" -msgstr "%s venebû" - -#: ftparchive/writer.cc:257 -#, c-format -msgid " DeLink %s [%s]\n" -msgstr "" - -#: ftparchive/writer.cc:265 -#, c-format -msgid "Failed to readlink %s" -msgstr "" - -#: ftparchive/writer.cc:269 -#, c-format -msgid "Failed to unlink %s" -msgstr "" - -#: ftparchive/writer.cc:276 -#, c-format -msgid "*** Failed to link %s to %s" -msgstr "" - -#: ftparchive/writer.cc:286 -#, c-format -msgid " DeLink limit of %sB hit.\n" -msgstr "" - -#: ftparchive/writer.cc:390 -msgid "Archive had no package field" -msgstr "Di arşîvê de qada pakêtê tuneye" - -#: ftparchive/writer.cc:398 ftparchive/writer.cc:613 -#, c-format -msgid " %s has no override entry\n" -msgstr "" - -#: ftparchive/writer.cc:443 ftparchive/writer.cc:701 -#, c-format -msgid " %s maintainer is %s not %s\n" -msgstr "" - -#: ftparchive/writer.cc:623 -#, c-format -msgid " %s has no source override entry\n" -msgstr "" - -#: ftparchive/writer.cc:627 -#, c-format -msgid " %s has no binary override entry either\n" -msgstr "" - -#: ftparchive/contents.cc:317 -#, c-format -msgid "Internal error, could not locate member %s" -msgstr "" - -#: ftparchive/contents.cc:353 ftparchive/contents.cc:384 -msgid "realloc - Failed to allocate memory" -msgstr "" - -#: ftparchive/override.cc:38 ftparchive/override.cc:146 -#, c-format -msgid "Unable to open %s" -msgstr "%s venebû" - -#: ftparchive/override.cc:64 ftparchive/override.cc:170 -#, c-format -msgid "Malformed override %s line %lu #1" -msgstr "" - -#: ftparchive/override.cc:78 ftparchive/override.cc:182 -#, c-format -msgid "Malformed override %s line %lu #2" -msgstr "" - -#: ftparchive/override.cc:92 ftparchive/override.cc:195 -#, c-format -msgid "Malformed override %s line %lu #3" -msgstr "" - -#: ftparchive/override.cc:131 ftparchive/override.cc:205 -#, c-format -msgid "Failed to read the override file %s" -msgstr "" - -#: ftparchive/multicompress.cc:75 -#, c-format -msgid "Unknown compression algorithm '%s'" -msgstr "" - -#: ftparchive/multicompress.cc:105 -#, c-format -msgid "Compressed output %s needs a compression set" -msgstr "" - -#: ftparchive/multicompress.cc:172 methods/rsh.cc:91 -msgid "Failed to create IPC pipe to subprocess" -msgstr "" - -#: ftparchive/multicompress.cc:198 -msgid "Failed to create FILE*" -msgstr "" - -#: ftparchive/multicompress.cc:201 -msgid "Failed to fork" -msgstr "" - -#: ftparchive/multicompress.cc:215 -msgid "Compress child" -msgstr "" - -#: ftparchive/multicompress.cc:238 -#, c-format -msgid "Internal error, failed to create %s" -msgstr "" - -#: ftparchive/multicompress.cc:289 -msgid "Failed to create subprocess IPC" -msgstr "" - -#: ftparchive/multicompress.cc:324 -msgid "Failed to exec compressor " -msgstr "" - -#: ftparchive/multicompress.cc:363 -msgid "decompressor" -msgstr "" - -#: ftparchive/multicompress.cc:406 -msgid "IO to subprocess/file failed" -msgstr "" - -#: ftparchive/multicompress.cc:458 -msgid "Failed to read while computing MD5" -msgstr "" - -#: ftparchive/multicompress.cc:475 -#, c-format -msgid "Problem unlinking %s" -msgstr "" - -#: ftparchive/multicompress.cc:490 apt-inst/extract.cc:188 -#, c-format -msgid "Failed to rename %s to %s" -msgstr "" - -#: cmdline/apt-get.cc:120 -msgid "Y" -msgstr "E" - -#: cmdline/apt-get.cc:142 cmdline/apt-get.cc:1506 -#, c-format -msgid "Regex compilation error - %s" -msgstr "" - -#: cmdline/apt-get.cc:237 -msgid "The following packages have unmet dependencies:" -msgstr "" - -#: cmdline/apt-get.cc:327 -#, c-format -msgid "but %s is installed" -msgstr "lê %s sazkirî ye" - -#: cmdline/apt-get.cc:329 -#, c-format -msgid "but %s is to be installed" -msgstr "lê %s dê were sazkirin" - -#: cmdline/apt-get.cc:336 -msgid "but it is not installable" -msgstr "lê sazkirina wê ne gengaz e" - -#: cmdline/apt-get.cc:338 -msgid "but it is a virtual package" -msgstr "lê paketeke farazî ye" - -#: cmdline/apt-get.cc:341 -msgid "but it is not installed" -msgstr "lê ne sazkirî ye" - -#: cmdline/apt-get.cc:341 -msgid "but it is not going to be installed" -msgstr "lê dê neyê sazkirin" - -#: cmdline/apt-get.cc:346 -msgid " or" -msgstr " û" - -#: cmdline/apt-get.cc:375 -msgid "The following NEW packages will be installed:" -msgstr "Ev pakêtên NÛ dê werine sazkirin:" - -#: cmdline/apt-get.cc:401 -msgid "The following packages will be REMOVED:" -msgstr "Ev pakêt dê werine RAKIRIN:" - -#: cmdline/apt-get.cc:423 -msgid "The following packages have been kept back:" -msgstr "" - -#: cmdline/apt-get.cc:444 -msgid "The following packages will be upgraded:" -msgstr "Ev paket dê werine bilindkirin:" - -#: cmdline/apt-get.cc:465 -msgid "The following packages will be DOWNGRADED:" -msgstr "" - -#: cmdline/apt-get.cc:485 -msgid "The following held packages will be changed:" -msgstr "" - -#: cmdline/apt-get.cc:538 -#, c-format -msgid "%s (due to %s) " -msgstr "%s (ji ber %s)" - -#: cmdline/apt-get.cc:546 -msgid "" -"WARNING: The following essential packages will be removed.\n" -"This should NOT be done unless you know exactly what you are doing!" -msgstr "" - -#: cmdline/apt-get.cc:577 -#, c-format -msgid "%lu upgraded, %lu newly installed, " -msgstr "" - -#: cmdline/apt-get.cc:581 -#, c-format -msgid "%lu reinstalled, " -msgstr "%lu ji nû ve sazkirî" - -#: cmdline/apt-get.cc:583 -#, c-format -msgid "%lu downgraded, " -msgstr "" - -#: cmdline/apt-get.cc:585 -#, c-format -msgid "%lu to remove and %lu not upgraded.\n" -msgstr "" - -#: cmdline/apt-get.cc:589 -#, c-format -msgid "%lu not fully installed or removed.\n" -msgstr "" - -#: cmdline/apt-get.cc:649 -msgid "Correcting dependencies..." -msgstr "Bindestî tên serrastkirin..." - -#: cmdline/apt-get.cc:652 -msgid " failed." -msgstr " neserketî." - -#: cmdline/apt-get.cc:655 -msgid "Unable to correct dependencies" -msgstr "" - -#: cmdline/apt-get.cc:658 -msgid "Unable to minimize the upgrade set" -msgstr "" - -#: cmdline/apt-get.cc:660 -msgid " Done" -msgstr " Temam" - -#: cmdline/apt-get.cc:664 -msgid "You might want to run `apt-get -f install' to correct these." -msgstr "" - -#: cmdline/apt-get.cc:667 -msgid "Unmet dependencies. Try using -f." -msgstr "" - -#: cmdline/apt-get.cc:689 -msgid "WARNING: The following packages cannot be authenticated!" -msgstr "" - -#: cmdline/apt-get.cc:693 -msgid "Authentication warning overridden.\n" -msgstr "" - -#: cmdline/apt-get.cc:700 -msgid "Install these packages without verification [y/N]? " -msgstr "" - -#: cmdline/apt-get.cc:702 -msgid "Some packages could not be authenticated" -msgstr "" - -#: cmdline/apt-get.cc:711 cmdline/apt-get.cc:858 -msgid "There are problems and -y was used without --force-yes" -msgstr "" - -#: cmdline/apt-get.cc:755 -msgid "Internal error, InstallPackages was called with broken packages!" -msgstr "" - -#: cmdline/apt-get.cc:764 -msgid "Packages need to be removed but remove is disabled." -msgstr "" - -#: cmdline/apt-get.cc:775 -msgid "Internal error, Ordering didn't finish" -msgstr "" - -#: cmdline/apt-get.cc:791 cmdline/apt-get.cc:1818 cmdline/apt-get.cc:1851 -msgid "Unable to lock the download directory" -msgstr "Pelrêça daxistinê nayê quflekirin" - -#: cmdline/apt-get.cc:801 cmdline/apt-get.cc:1899 cmdline/apt-get.cc:2135 -#: apt-pkg/cachefile.cc:67 -msgid "The list of sources could not be read." -msgstr "" - -#: cmdline/apt-get.cc:816 -msgid "How odd.. The sizes didn't match, email apt@packages.debian.org" -msgstr "" - -#: cmdline/apt-get.cc:821 -#, c-format -msgid "Need to get %sB/%sB of archives.\n" -msgstr "" - -#: cmdline/apt-get.cc:824 -#, c-format -msgid "Need to get %sB of archives.\n" -msgstr "" - -#: cmdline/apt-get.cc:829 -#, c-format -msgid "After unpacking %sB of additional disk space will be used.\n" -msgstr "" - -#: cmdline/apt-get.cc:832 -#, c-format -msgid "After unpacking %sB disk space will be freed.\n" -msgstr "" - -#: cmdline/apt-get.cc:846 cmdline/apt-get.cc:1989 -#, c-format -msgid "Couldn't determine free space in %s" -msgstr "" - -#: cmdline/apt-get.cc:849 -#, c-format -msgid "You don't have enough free space in %s." -msgstr "" - -#: cmdline/apt-get.cc:864 cmdline/apt-get.cc:884 -msgid "Trivial Only specified but this is not a trivial operation." -msgstr "" - -#: cmdline/apt-get.cc:866 -msgid "Yes, do as I say!" -msgstr "" - -#: cmdline/apt-get.cc:868 -#, c-format -msgid "" -"You are about to do something potentially harmful.\n" -"To continue type in the phrase '%s'\n" -" ?] " -msgstr "" - -#: cmdline/apt-get.cc:874 cmdline/apt-get.cc:893 -msgid "Abort." -msgstr "" - -#: cmdline/apt-get.cc:889 -msgid "Do you want to continue [Y/n]? " -msgstr "" - -#: cmdline/apt-get.cc:961 cmdline/apt-get.cc:1365 cmdline/apt-get.cc:2032 -#, c-format -msgid "Failed to fetch %s %s\n" -msgstr "" - -#: cmdline/apt-get.cc:979 -msgid "Some files failed to download" -msgstr "" - -#: cmdline/apt-get.cc:980 cmdline/apt-get.cc:2041 -msgid "Download complete and in download only mode" -msgstr "" - -#: cmdline/apt-get.cc:986 -msgid "" -"Unable to fetch some archives, maybe run apt-get update or try with --fix-" -"missing?" -msgstr "" - -#: cmdline/apt-get.cc:990 -msgid "--fix-missing and media swapping is not currently supported" -msgstr "" - -#: cmdline/apt-get.cc:995 -msgid "Unable to correct missing packages." -msgstr "" - -#: cmdline/apt-get.cc:996 -msgid "Aborting install." -msgstr "" - -#: cmdline/apt-get.cc:1030 -#, c-format -msgid "Note, selecting %s instead of %s\n" -msgstr "" - -#: cmdline/apt-get.cc:1040 -#, c-format -msgid "Skipping %s, it is already installed and upgrade is not set.\n" -msgstr "" - -#: cmdline/apt-get.cc:1058 -#, c-format -msgid "Package %s is not installed, so not removed\n" -msgstr "" - -#: cmdline/apt-get.cc:1069 -#, c-format -msgid "Package %s is a virtual package provided by:\n" -msgstr "" - -#: cmdline/apt-get.cc:1081 -msgid " [Installed]" -msgstr " [Sazkirî]" - -#: cmdline/apt-get.cc:1086 -msgid "You should explicitly select one to install." -msgstr "" - -#: cmdline/apt-get.cc:1091 -#, c-format -msgid "" -"Package %s is not available, but is referred to by another package.\n" -"This may mean that the package is missing, has been obsoleted, or\n" -"is only available from another source\n" -msgstr "" - -#: cmdline/apt-get.cc:1110 -msgid "However the following packages replace it:" -msgstr "" - -#: cmdline/apt-get.cc:1113 -#, c-format -msgid "Package %s has no installation candidate" -msgstr "" - -#: cmdline/apt-get.cc:1133 -#, c-format -msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n" -msgstr "" - -#: cmdline/apt-get.cc:1141 -#, c-format -msgid "%s is already the newest version.\n" -msgstr "" - -#: cmdline/apt-get.cc:1168 -#, c-format -msgid "Release '%s' for '%s' was not found" -msgstr "" - -#: cmdline/apt-get.cc:1170 -#, c-format -msgid "Version '%s' for '%s' was not found" -msgstr "" - -#: cmdline/apt-get.cc:1176 -#, c-format -msgid "Selected version %s (%s) for %s\n" -msgstr "" - -#: cmdline/apt-get.cc:1313 -msgid "The update command takes no arguments" -msgstr "" - -#: cmdline/apt-get.cc:1326 -msgid "Unable to lock the list directory" -msgstr "" - -#: cmdline/apt-get.cc:1384 -msgid "" -"Some index files failed to download, they have been ignored, or old ones " -"used instead." -msgstr "" - -#: cmdline/apt-get.cc:1403 -msgid "Internal error, AllUpgrade broke stuff" -msgstr "" - -#: cmdline/apt-get.cc:1493 cmdline/apt-get.cc:1529 -#, c-format -msgid "Couldn't find package %s" -msgstr "" - -#: cmdline/apt-get.cc:1516 -#, c-format -msgid "Note, selecting %s for regex '%s'\n" -msgstr "" - -#: cmdline/apt-get.cc:1546 -msgid "You might want to run `apt-get -f install' to correct these:" -msgstr "" - -#: cmdline/apt-get.cc:1549 -msgid "" -"Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a " -"solution)." -msgstr "" - -#: cmdline/apt-get.cc:1561 -msgid "" -"Some packages could not be installed. This may mean that you have\n" -"requested an impossible situation or if you are using the unstable\n" -"distribution that some required packages have not yet been created\n" -"or been moved out of Incoming." -msgstr "" - -#: cmdline/apt-get.cc:1569 -msgid "" -"Since you only requested a single operation it is extremely likely that\n" -"the package is simply not installable and a bug report against\n" -"that package should be filed." -msgstr "" - -#: cmdline/apt-get.cc:1574 -msgid "The following information may help to resolve the situation:" -msgstr "" - -#: cmdline/apt-get.cc:1577 -msgid "Broken packages" -msgstr "Paketên şikestî" - -#: cmdline/apt-get.cc:1603 -msgid "The following extra packages will be installed:" -msgstr "" - -#: cmdline/apt-get.cc:1692 -msgid "Suggested packages:" -msgstr "Paketên tên pêşniyaz kirin:" - -#: cmdline/apt-get.cc:1693 -msgid "Recommended packages:" -msgstr "Paketên tên tawsiyê kirin:" - -#: cmdline/apt-get.cc:1713 -msgid "Calculating upgrade... " -msgstr "" - -#: cmdline/apt-get.cc:1716 methods/ftp.cc:702 methods/connect.cc:101 -msgid "Failed" -msgstr "Serneket" - -#: cmdline/apt-get.cc:1721 -msgid "Done" -msgstr "Temam" - -#: cmdline/apt-get.cc:1786 cmdline/apt-get.cc:1794 -msgid "Internal error, problem resolver broke stuff" -msgstr "" - -#: cmdline/apt-get.cc:1894 -msgid "Must specify at least one package to fetch source for" -msgstr "" - -#: cmdline/apt-get.cc:1924 cmdline/apt-get.cc:2153 -#, c-format -msgid "Unable to find a source package for %s" -msgstr "" - -#: cmdline/apt-get.cc:1968 -#, c-format -msgid "Skipping already downloaded file '%s'\n" -msgstr "" - -#: cmdline/apt-get.cc:1992 -#, c-format -msgid "You don't have enough free space in %s" -msgstr "" - -#: cmdline/apt-get.cc:1997 -#, c-format -msgid "Need to get %sB/%sB of source archives.\n" -msgstr "" - -#: cmdline/apt-get.cc:2000 -#, c-format -msgid "Need to get %sB of source archives.\n" -msgstr "" - -#: cmdline/apt-get.cc:2006 -#, c-format -msgid "Fetch source %s\n" -msgstr "" - -#: cmdline/apt-get.cc:2037 -msgid "Failed to fetch some archives." -msgstr "" - -#: cmdline/apt-get.cc:2065 -#, c-format -msgid "Skipping unpack of already unpacked source in %s\n" -msgstr "" - -#: cmdline/apt-get.cc:2077 -#, c-format -msgid "Unpack command '%s' failed.\n" -msgstr "" - -#: cmdline/apt-get.cc:2078 -#, c-format -msgid "Check if the 'dpkg-dev' package is installed.\n" -msgstr "" - -#: cmdline/apt-get.cc:2095 -#, c-format -msgid "Build command '%s' failed.\n" -msgstr "" - -#: cmdline/apt-get.cc:2114 -msgid "Child process failed" -msgstr "" - -#: cmdline/apt-get.cc:2130 -msgid "Must specify at least one package to check builddeps for" -msgstr "" - -#: cmdline/apt-get.cc:2158 -#, c-format -msgid "Unable to get build-dependency information for %s" -msgstr "" - -#: cmdline/apt-get.cc:2178 -#, c-format -msgid "%s has no build depends.\n" -msgstr "" - -#: cmdline/apt-get.cc:2230 -#, c-format -msgid "" -"%s dependency for %s cannot be satisfied because the package %s cannot be " -"found" -msgstr "" - -#: cmdline/apt-get.cc:2282 -#, c-format -msgid "" -"%s dependency for %s cannot be satisfied because no available versions of " -"package %s can satisfy version requirements" -msgstr "" - -#: cmdline/apt-get.cc:2317 -#, c-format -msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new" -msgstr "" - -#: cmdline/apt-get.cc:2342 -#, c-format -msgid "Failed to satisfy %s dependency for %s: %s" -msgstr "" - -#: cmdline/apt-get.cc:2356 -#, c-format -msgid "Build-dependencies for %s could not be satisfied." -msgstr "" - -#: cmdline/apt-get.cc:2360 -msgid "Failed to process build dependencies" -msgstr "" - -#: cmdline/apt-get.cc:2392 -msgid "Supported modules:" -msgstr "" - -#: cmdline/apt-get.cc:2433 -msgid "" -"Usage: apt-get [options] command\n" -" apt-get [options] install|remove pkg1 [pkg2 ...]\n" -" apt-get [options] source pkg1 [pkg2 ...]\n" -"\n" -"apt-get is a simple command line interface for downloading and\n" -"installing packages. The most frequently used commands are update\n" -"and install.\n" -"\n" -"Commands:\n" -" update - Retrieve new lists of packages\n" -" upgrade - Perform an upgrade\n" -" install - Install new packages (pkg is libc6 not libc6.deb)\n" -" remove - Remove packages\n" -" source - Download source archives\n" -" build-dep - Configure build-dependencies for source packages\n" -" dist-upgrade - Distribution upgrade, see apt-get(8)\n" -" dselect-upgrade - Follow dselect selections\n" -" clean - Erase downloaded archive files\n" -" autoclean - Erase old downloaded archive files\n" -" check - Verify that there are no broken dependencies\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -q Loggable output - no progress indicator\n" -" -qq No output except for errors\n" -" -d Download only - do NOT install or unpack archives\n" -" -s No-act. Perform ordering simulation\n" -" -y Assume Yes to all queries and do not prompt\n" -" -f Attempt to continue if the integrity check fails\n" -" -m Attempt to continue if archives are unlocatable\n" -" -u Show a list of upgraded packages as well\n" -" -b Build the source package after fetching it\n" -" -V Show verbose version numbers\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -"See the apt-get(8), sources.list(5) and apt.conf(5) manual\n" -"pages for more information and options.\n" -" This APT has Super Cow Powers.\n" -msgstr "" - -#: cmdline/acqprogress.cc:55 -msgid "Hit " -msgstr "" - -#: cmdline/acqprogress.cc:79 -msgid "Get:" -msgstr "" - -#: cmdline/acqprogress.cc:110 -msgid "Ign " -msgstr "" - -#: cmdline/acqprogress.cc:114 -msgid "Err " -msgstr "" - -#: cmdline/acqprogress.cc:135 -#, c-format -msgid "Fetched %sB in %s (%sB/s)\n" -msgstr "" - -#: cmdline/acqprogress.cc:225 -#, c-format -msgid " [Working]" -msgstr " [Dixebite]" - -#: cmdline/acqprogress.cc:271 -#, c-format -msgid "" -"Media change: please insert the disc labeled\n" -" '%s'\n" -"in the drive '%s' and press enter\n" -msgstr "" - -#: cmdline/apt-sortpkgs.cc:86 -msgid "Unknown package record!" -msgstr "" - -#: cmdline/apt-sortpkgs.cc:150 -msgid "" -"Usage: apt-sortpkgs [options] file1 [file2 ...]\n" -"\n" -"apt-sortpkgs is a simple tool to sort package files. The -s option is used\n" -"to indicate what kind of file it is.\n" -"\n" -"Options:\n" -" -h This help text\n" -" -s Use source file sorting\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" - -#: dselect/install:32 -msgid "Bad default setting!" -msgstr "" - -#: dselect/install:51 dselect/install:83 dselect/install:87 dselect/install:93 -#: dselect/install:104 dselect/update:45 -msgid "Press enter to continue." -msgstr "" - -#: dselect/install:100 -msgid "Some errors occurred while unpacking. I'm going to configure the" -msgstr "" - -#: dselect/install:101 -msgid "packages that were installed. This may result in duplicate errors" -msgstr "" - -#: dselect/install:102 -msgid "or errors caused by missing dependencies. This is OK, only the errors" -msgstr "" - -#: dselect/install:103 -msgid "" -"above this message are important. Please fix them and run [I]nstall again" -msgstr "" - -#: dselect/update:30 -msgid "Merging available information" -msgstr "" - -#: apt-inst/contrib/extracttar.cc:117 -#, fuzzy -msgid "Failed to create pipes" -msgstr "%s ji hev nehate veçirandin" - -#: apt-inst/contrib/extracttar.cc:144 -#, fuzzy -msgid "Failed to exec gzip " -msgstr "%s ji hev nehate veçirandin" - -#: apt-inst/contrib/extracttar.cc:181 apt-inst/contrib/extracttar.cc:207 -msgid "Corrupted archive" -msgstr "" - -#: apt-inst/contrib/extracttar.cc:196 -msgid "Tar checksum failed, archive corrupted" -msgstr "" - -#: apt-inst/contrib/extracttar.cc:299 -#, c-format -msgid "Unknown TAR header type %u, member %s" -msgstr "" - -#: apt-inst/contrib/arfile.cc:73 -msgid "Invalid archive signature" -msgstr "" - -#: apt-inst/contrib/arfile.cc:81 -msgid "Error reading archive member header" -msgstr "" - -#: apt-inst/contrib/arfile.cc:93 apt-inst/contrib/arfile.cc:105 -msgid "Invalid archive member header" -msgstr "" - -#: apt-inst/contrib/arfile.cc:131 -#, fuzzy -msgid "Archive is too short" -msgstr "Tomara kontrola arşîvê tuneye" - -#: apt-inst/contrib/arfile.cc:135 -msgid "Failed to read the archive headers" -msgstr "" - -#: apt-inst/filelist.cc:384 -msgid "DropNode called on still linked node" -msgstr "" - -#: apt-inst/filelist.cc:416 -msgid "Failed to locate the hash element!" -msgstr "" - -#: apt-inst/filelist.cc:463 -#, fuzzy -msgid "Failed to allocate diversion" -msgstr "%s venebû" - -#: apt-inst/filelist.cc:468 -msgid "Internal error in AddDiversion" -msgstr "" - -#: apt-inst/filelist.cc:481 -#, c-format -msgid "Trying to overwrite a diversion, %s -> %s and %s/%s" -msgstr "" - -#: apt-inst/filelist.cc:510 -#, c-format -msgid "Double add of diversion %s -> %s" -msgstr "" - -#: apt-inst/filelist.cc:553 -#, c-format -msgid "Duplicate conf file %s/%s" -msgstr "" - -#: apt-inst/dirstream.cc:45 apt-inst/dirstream.cc:50 apt-inst/dirstream.cc:53 -#, fuzzy, c-format -msgid "Failed to write file %s" -msgstr "%s ji hev nehate veçirandin" - -#: apt-inst/dirstream.cc:96 apt-inst/dirstream.cc:104 -#, fuzzy, c-format -msgid "Failed to close file %s" -msgstr "%s venebû" - -#: apt-inst/extract.cc:96 apt-inst/extract.cc:167 -#, fuzzy, c-format -msgid "The path %s is too long" -msgstr "Lîsteya dirêjahiya çavkaniyê zêde dirêj e" - -#: apt-inst/extract.cc:127 -#, c-format -msgid "Unpacking %s more than once" -msgstr "" - -#: apt-inst/extract.cc:137 -#, c-format -msgid "The directory %s is diverted" -msgstr "" - -#: apt-inst/extract.cc:147 -#, c-format -msgid "The package is trying to write to the diversion target %s/%s" -msgstr "" - -#: apt-inst/extract.cc:157 apt-inst/extract.cc:300 -#, fuzzy -msgid "The diversion path is too long" -msgstr "Lîsteya dirêjahiya çavkaniyê zêde dirêj e" - -#: apt-inst/extract.cc:243 -#, c-format -msgid "The directory %s is being replaced by a non-directory" -msgstr "" - -#: apt-inst/extract.cc:283 -msgid "Failed to locate node in its hash bucket" -msgstr "" - -#: apt-inst/extract.cc:287 -msgid "The path is too long" -msgstr "" - -#: apt-inst/extract.cc:417 -#, c-format -msgid "Overwrite package match with no version for %s" -msgstr "" - -#: apt-inst/extract.cc:434 -#, c-format -msgid "File %s/%s overwrites the one in the package %s" -msgstr "" - -#: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:750 -#: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/sourcelist.cc:324 -#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38 -#, fuzzy, c-format -msgid "Unable to read %s" -msgstr "%s venebû" - -#: apt-inst/extract.cc:494 -#, fuzzy, c-format -msgid "Unable to stat %s" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: apt-inst/deb/dpkgdb.cc:55 apt-inst/deb/dpkgdb.cc:61 -#, fuzzy, c-format -msgid "Failed to remove %s" -msgstr "%s ji hev nehate veçirandin" - -#: apt-inst/deb/dpkgdb.cc:110 apt-inst/deb/dpkgdb.cc:112 -#, fuzzy, c-format -msgid "Unable to create %s" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: apt-inst/deb/dpkgdb.cc:118 -#, fuzzy, c-format -msgid "Failed to stat %sinfo" -msgstr "%s venebû" - -#: apt-inst/deb/dpkgdb.cc:123 -msgid "The info and temp directories need to be on the same filesystem" -msgstr "" - -#. Build the status cache -#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:643 -#: apt-pkg/pkgcachegen.cc:712 apt-pkg/pkgcachegen.cc:717 -#: apt-pkg/pkgcachegen.cc:840 -#, fuzzy -msgid "Reading package lists" -msgstr "Paketên şikestî" - -#: apt-inst/deb/dpkgdb.cc:180 -#, c-format -msgid "Failed to change to the admin dir %sinfo" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:201 apt-inst/deb/dpkgdb.cc:355 -#: apt-inst/deb/dpkgdb.cc:448 -msgid "Internal error getting a package name" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:205 apt-inst/deb/dpkgdb.cc:386 -msgid "Reading file listing" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:216 -#, c-format -msgid "" -"Failed to open the list file '%sinfo/%s'. If you cannot restore this file " -"then make it empty and immediately re-install the same version of the " -"package!" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:229 apt-inst/deb/dpkgdb.cc:242 -#, c-format -msgid "Failed reading the list file %sinfo/%s" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:266 -msgid "Internal error getting a node" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:309 -#, c-format -msgid "Failed to open the diversions file %sdiversions" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:324 -msgid "The diversion file is corrupted" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:331 apt-inst/deb/dpkgdb.cc:336 -#: apt-inst/deb/dpkgdb.cc:341 -#, c-format -msgid "Invalid line in the diversion file: %s" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:362 -msgid "Internal error adding a diversion" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:383 -msgid "The pkg cache must be initialized first" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:443 -#, c-format -msgid "Failed to find a Package: header, offset %lu" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:465 -#, c-format -msgid "Bad ConfFile section in the status file. Offset %lu" -msgstr "" - -#: apt-inst/deb/dpkgdb.cc:470 -#, c-format -msgid "Error parsing MD5. Offset %lu" -msgstr "" - -#: apt-inst/deb/debfile.cc:42 apt-inst/deb/debfile.cc:47 -#, c-format -msgid "This is not a valid DEB archive, missing '%s' member" -msgstr "" - -#: apt-inst/deb/debfile.cc:52 -#, c-format -msgid "This is not a valid DEB archive, it has no '%s' or '%s' member" -msgstr "" - -#: apt-inst/deb/debfile.cc:112 -#, c-format -msgid "Couldn't change to %s" -msgstr "" - -#: apt-inst/deb/debfile.cc:138 -msgid "Internal error, could not locate member" -msgstr "" - -#: apt-inst/deb/debfile.cc:171 -msgid "Failed to locate a valid control file" -msgstr "" - -#: apt-inst/deb/debfile.cc:256 -msgid "Unparsable control file" -msgstr "" - -#: methods/cdrom.cc:114 -#, fuzzy, c-format -msgid "Unable to read the cdrom database %s" -msgstr "Pakêt nehate dîtin %s" - -#: methods/cdrom.cc:123 -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 "" - -#: methods/cdrom.cc:131 -msgid "Wrong CD-ROM" -msgstr "" - -#: methods/cdrom.cc:164 -#, c-format -msgid "Unable to unmount the CD-ROM in %s, it may still be in use." -msgstr "" - -#: methods/cdrom.cc:169 -#, fuzzy -msgid "Disk not found." -msgstr "(nehate dîtin)" - -#: methods/cdrom.cc:177 methods/file.cc:79 methods/rsh.cc:264 -#, fuzzy -msgid "File not found" -msgstr "(nehate dîtin)" - -#: methods/copy.cc:42 methods/gpgv.cc:281 methods/gzip.cc:141 -#: methods/gzip.cc:150 -#, fuzzy -msgid "Failed to stat" -msgstr "%s venebû" - -#: methods/copy.cc:79 methods/gpgv.cc:278 methods/gzip.cc:147 -msgid "Failed to set modification time" -msgstr "" - -#: methods/file.cc:44 -msgid "Invalid URI, local URIS must not start with //" -msgstr "" - -#. Login must be before getpeername otherwise dante won't work. -#: methods/ftp.cc:162 -msgid "Logging in" -msgstr "" - -#: methods/ftp.cc:168 -msgid "Unable to determine the peer name" -msgstr "" - -#: methods/ftp.cc:173 -#, fuzzy -msgid "Unable to determine the local name" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: methods/ftp.cc:204 methods/ftp.cc:232 -#, c-format -msgid "The server refused the connection and said: %s" -msgstr "" - -#: methods/ftp.cc:210 -#, c-format -msgid "USER failed, server said: %s" -msgstr "" - -#: methods/ftp.cc:217 -#, c-format -msgid "PASS failed, server said: %s" -msgstr "" - -#: methods/ftp.cc:237 -msgid "" -"A proxy server was specified but no login script, Acquire::ftp::ProxyLogin " -"is empty." -msgstr "" - -#: methods/ftp.cc:265 -#, c-format -msgid "Login script command '%s' failed, server said: %s" -msgstr "" - -#: methods/ftp.cc:291 -#, c-format -msgid "TYPE failed, server said: %s" -msgstr "" - -#: methods/ftp.cc:329 methods/ftp.cc:440 methods/rsh.cc:183 methods/rsh.cc:226 -msgid "Connection timeout" -msgstr "" - -#: methods/ftp.cc:335 -msgid "Server closed the connection" -msgstr "" - -#: methods/ftp.cc:338 apt-pkg/contrib/fileutl.cc:471 methods/rsh.cc:190 -msgid "Read error" -msgstr "" - -#: methods/ftp.cc:345 methods/rsh.cc:197 -msgid "A response overflowed the buffer." -msgstr "" - -#: methods/ftp.cc:362 methods/ftp.cc:374 -msgid "Protocol corruption" -msgstr "" - -#: methods/ftp.cc:446 apt-pkg/contrib/fileutl.cc:510 methods/rsh.cc:232 -msgid "Write error" -msgstr "" - -#: methods/ftp.cc:687 methods/ftp.cc:693 methods/ftp.cc:729 -msgid "Could not create a socket" -msgstr "" - -#: methods/ftp.cc:698 -msgid "Could not connect data socket, connection timed out" -msgstr "" - -#: methods/ftp.cc:704 -msgid "Could not connect passive socket." -msgstr "" - -#: methods/ftp.cc:722 -msgid "getaddrinfo was unable to get a listening socket" -msgstr "" - -#: methods/ftp.cc:736 -msgid "Could not bind a socket" -msgstr "" - -#: methods/ftp.cc:740 -msgid "Could not listen on the socket" -msgstr "" - -#: methods/ftp.cc:747 -msgid "Could not determine the socket's name" -msgstr "" - -#: methods/ftp.cc:779 -msgid "Unable to send PORT command" -msgstr "" - -#: methods/ftp.cc:789 -#, c-format -msgid "Unknown address family %u (AF_*)" -msgstr "" - -#: methods/ftp.cc:798 -#, c-format -msgid "EPRT failed, server said: %s" -msgstr "" - -#: methods/ftp.cc:818 -msgid "Data socket connect timed out" -msgstr "" - -#: methods/ftp.cc:825 -msgid "Unable to accept connection" -msgstr "" - -#: methods/ftp.cc:864 methods/http.cc:958 methods/rsh.cc:303 -msgid "Problem hashing file" -msgstr "" - -#: methods/ftp.cc:877 -#, fuzzy, c-format -msgid "Unable to fetch file, server said '%s'" -msgstr "Danegira %s nehate vekirin: %s" - -#: methods/ftp.cc:892 methods/rsh.cc:322 -msgid "Data socket timed out" -msgstr "" - -#: methods/ftp.cc:922 -#, c-format -msgid "Data transfer failed, server said '%s'" -msgstr "" - -#. Get the files information -#: methods/ftp.cc:997 -msgid "Query" -msgstr "" - -#: methods/ftp.cc:1109 -#, fuzzy -msgid "Unable to invoke " -msgstr "%s venebû" - -#: methods/connect.cc:64 -#, c-format -msgid "Connecting to %s (%s)" -msgstr "" - -#: methods/connect.cc:71 -#, c-format -msgid "[IP: %s %s]" -msgstr "" - -#: methods/connect.cc:80 -#, c-format -msgid "Could not create a socket for %s (f=%u t=%u p=%u)" -msgstr "" - -#: methods/connect.cc:86 -#, c-format -msgid "Cannot initiate the connection to %s:%s (%s)." -msgstr "" - -#: methods/connect.cc:93 -#, c-format -msgid "Could not connect to %s:%s (%s), connection timed out" -msgstr "" - -#: methods/connect.cc:108 -#, c-format -msgid "Could not connect to %s:%s (%s)." -msgstr "" - -#. We say this mainly because the pause here is for the -#. ssh connection that is still going -#: methods/connect.cc:136 methods/rsh.cc:425 -#, c-format -msgid "Connecting to %s" -msgstr "" - -#: methods/connect.cc:167 -#, fuzzy, c-format -msgid "Could not resolve '%s'" -msgstr "%s ji hev nehate veçirandin" - -#: methods/connect.cc:173 -#, c-format -msgid "Temporary failure resolving '%s'" -msgstr "" - -#: methods/connect.cc:176 -#, c-format -msgid "Something wicked happened resolving '%s:%s' (%i)" -msgstr "" - -#: methods/connect.cc:223 -#, fuzzy, c-format -msgid "Unable to connect to %s %s:" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: methods/gpgv.cc:65 -#, c-format -msgid "Couldn't access keyring: '%s'" -msgstr "" - -#: methods/gpgv.cc:100 -msgid "E: Argument list from Acquire::gpgv::Options too long. Exiting." -msgstr "" - -#: methods/gpgv.cc:204 -msgid "" -"Internal error: Good signature, but could not determine key fingerprint?!" -msgstr "" - -#: methods/gpgv.cc:209 -msgid "At least one invalid signature was encountered." -msgstr "" - -#: methods/gpgv.cc:213 -#, c-format -msgid "Could not execute '%s' to verify signature (is gnupg installed?)" -msgstr "" - -#: methods/gpgv.cc:218 -msgid "Unknown error executing gpgv" -msgstr "" - -#: methods/gpgv.cc:249 -#, fuzzy -msgid "The following signatures were invalid:\n" -msgstr "Ev pakêtên NÛ dê werine sazkirin:" - -#: methods/gpgv.cc:256 -msgid "" -"The following signatures couldn't be verified because the public key is not " -"available:\n" -msgstr "" - -#: methods/gzip.cc:64 -#, c-format -msgid "Couldn't open pipe for %s" -msgstr "" - -#: methods/gzip.cc:109 -#, c-format -msgid "Read error from %s process" -msgstr "" - -#: methods/http.cc:376 -msgid "Waiting for headers" -msgstr "" - -#: methods/http.cc:522 -#, c-format -msgid "Got a single header line over %u chars" -msgstr "" - -#: methods/http.cc:530 -msgid "Bad header line" -msgstr "" - -#: methods/http.cc:549 methods/http.cc:556 -msgid "The HTTP server sent an invalid reply header" -msgstr "" - -#: methods/http.cc:585 -msgid "The HTTP server sent an invalid Content-Length header" -msgstr "" - -#: methods/http.cc:600 -msgid "The HTTP server sent an invalid Content-Range header" -msgstr "" - -#: methods/http.cc:602 -msgid "This HTTP server has broken range support" -msgstr "" - -#: methods/http.cc:626 -msgid "Unknown date format" -msgstr "" - -#: methods/http.cc:773 -#, fuzzy -msgid "Select failed" -msgstr " neserketî." - -#: methods/http.cc:778 -msgid "Connection timed out" -msgstr "" - -#: methods/http.cc:801 -#, fuzzy -msgid "Error writing to output file" -msgstr "Dema li dosyeya naverokê joreagahî dihate nivîsîn çewtî" - -#: methods/http.cc:832 -#, fuzzy -msgid "Error writing to file" -msgstr "Dema li dosyeya naverokê joreagahî dihate nivîsîn çewtî" - -#: methods/http.cc:860 -#, fuzzy -msgid "Error writing to the file" -msgstr "Dema li dosyeya naverokê joreagahî dihate nivîsîn çewtî" - -#: methods/http.cc:874 -msgid "Error reading from server. Remote end closed connection" -msgstr "" - -#: methods/http.cc:876 -msgid "Error reading from server" -msgstr "" - -#: methods/http.cc:1107 -msgid "Bad header data" -msgstr "" - -#: methods/http.cc:1124 -msgid "Connection failed" -msgstr "" - -#: methods/http.cc:1215 -msgid "Internal error" -msgstr "" - -#: apt-pkg/contrib/mmap.cc:82 -msgid "Can't mmap an empty file" -msgstr "" - -#: apt-pkg/contrib/mmap.cc:87 -#, c-format -msgid "Couldn't make mmap of %lu bytes" -msgstr "" - -#: apt-pkg/contrib/strutl.cc:938 -#, c-format -msgid "Selection %s not found" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:436 -#, c-format -msgid "Unrecognized type abbreviation: '%c'" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:494 -#, c-format -msgid "Opening configuration file %s" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:512 -#, c-format -msgid "Line %d too long (max %d)" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:608 -#, c-format -msgid "Syntax error %s:%u: Block starts with no name." -msgstr "" - -#: apt-pkg/contrib/configuration.cc:627 -#, c-format -msgid "Syntax error %s:%u: Malformed tag" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:644 -#, c-format -msgid "Syntax error %s:%u: Extra junk after value" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:684 -#, c-format -msgid "Syntax error %s:%u: Directives can only be done at the top level" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:691 -#, c-format -msgid "Syntax error %s:%u: Too many nested includes" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:695 apt-pkg/contrib/configuration.cc:700 -#, c-format -msgid "Syntax error %s:%u: Included from here" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:704 -#, c-format -msgid "Syntax error %s:%u: Unsupported directive '%s'" -msgstr "" - -#: apt-pkg/contrib/configuration.cc:738 -#, c-format -msgid "Syntax error %s:%u: Extra junk at end of file" -msgstr "" - -#: apt-pkg/contrib/progress.cc:154 -#, c-format -msgid "%c%s... Error!" -msgstr "" - -#: apt-pkg/contrib/progress.cc:156 -#, c-format -msgid "%c%s... Done" -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:80 -#, c-format -msgid "Command line option '%c' [from %s] is not known." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:106 apt-pkg/contrib/cmndline.cc:114 -#: apt-pkg/contrib/cmndline.cc:122 -#, c-format -msgid "Command line option %s is not understood" -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:127 -#, c-format -msgid "Command line option %s is not boolean" -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:166 apt-pkg/contrib/cmndline.cc:187 -#, c-format -msgid "Option %s requires an argument." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:201 apt-pkg/contrib/cmndline.cc:207 -#, c-format -msgid "Option %s: Configuration item specification must have an =<val>." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:237 -#, c-format -msgid "Option %s requires an integer argument, not '%s'" -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:268 -#, fuzzy, c-format -msgid "Option '%s' is too long" -msgstr "Lîsteya dirêjahiya çavkaniyê zêde dirêj e" - -#: apt-pkg/contrib/cmndline.cc:301 -#, c-format -msgid "Sense %s is not understood, try true or false." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:351 -#, c-format -msgid "Invalid operation %s" -msgstr "" - -#: apt-pkg/contrib/cdromutl.cc:55 -#, fuzzy, c-format -msgid "Unable to stat the mount point %s" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:427 apt-pkg/clean.cc:44 -#, fuzzy, c-format -msgid "Unable to change to %s" -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: apt-pkg/contrib/cdromutl.cc:190 -msgid "Failed to stat the cdrom" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:82 -#, c-format -msgid "Not using locking for read only lock file %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:87 -#, fuzzy, c-format -msgid "Could not open lock file %s" -msgstr "Danegira %s nehate vekirin: %s" - -#: apt-pkg/contrib/fileutl.cc:105 -#, c-format -msgid "Not using locking for nfs mounted lock file %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:109 -#, c-format -msgid "Could not get lock %s" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:377 -#, c-format -msgid "Waited for %s but it wasn't there" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:387 -#, c-format -msgid "Sub-process %s received a segmentation fault." -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:390 -#, c-format -msgid "Sub-process %s returned an error code (%u)" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:392 -#, c-format -msgid "Sub-process %s exited unexpectedly" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:436 -#, fuzzy, c-format -msgid "Could not open file %s" -msgstr "Danegira %s nehate vekirin: %s" - -#: apt-pkg/contrib/fileutl.cc:492 -#, c-format -msgid "read, still have %lu to read but none left" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:522 -#, c-format -msgid "write, still have %lu to write but couldn't" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:597 -msgid "Problem closing the file" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:603 -msgid "Problem unlinking the file" -msgstr "" - -#: apt-pkg/contrib/fileutl.cc:614 -msgid "Problem syncing the file" -msgstr "" - -#: apt-pkg/pkgcache.cc:126 -msgid "Empty package cache" -msgstr "" - -#: apt-pkg/pkgcache.cc:132 -msgid "The package cache file is corrupted" -msgstr "" - -#: apt-pkg/pkgcache.cc:137 -msgid "The package cache file is an incompatible version" -msgstr "" - -#: apt-pkg/pkgcache.cc:142 -#, c-format -msgid "This APT does not support the versioning system '%s'" -msgstr "" - -#: apt-pkg/pkgcache.cc:147 -msgid "The package cache was built for a different architecture" -msgstr "" - -#: apt-pkg/pkgcache.cc:218 -msgid "Depends" -msgstr "" - -#: apt-pkg/pkgcache.cc:218 -msgid "PreDepends" -msgstr "" - -#: apt-pkg/pkgcache.cc:218 -msgid "Suggests" -msgstr "" - -#: apt-pkg/pkgcache.cc:219 -#, fuzzy -msgid "Recommends" -msgstr "Paketên tên tawsiyê kirin:" - -#: apt-pkg/pkgcache.cc:219 -msgid "Conflicts" -msgstr "" - -#: apt-pkg/pkgcache.cc:219 -msgid "Replaces" -msgstr "" - -#: apt-pkg/pkgcache.cc:220 -msgid "Obsoletes" -msgstr "" - -#: apt-pkg/pkgcache.cc:231 -msgid "important" -msgstr "" - -#: apt-pkg/pkgcache.cc:231 -msgid "required" -msgstr "" - -#: apt-pkg/pkgcache.cc:231 -msgid "standard" -msgstr "" - -#: apt-pkg/pkgcache.cc:232 -msgid "optional" -msgstr "" - -#: apt-pkg/pkgcache.cc:232 -msgid "extra" -msgstr "" - -#: apt-pkg/depcache.cc:61 apt-pkg/depcache.cc:90 -msgid "Building dependency tree" -msgstr "" - -#: apt-pkg/depcache.cc:62 -#, fuzzy -msgid "Candidate versions" -msgstr " Berendam: " - -#: apt-pkg/depcache.cc:91 -msgid "Dependency generation" -msgstr "" - -#: apt-pkg/tagfile.cc:106 -#, fuzzy, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Pakêt nehate dîtin %s" - -#: apt-pkg/tagfile.cc:193 -#, fuzzy, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Pakêt nehate dîtin %s" - -#: apt-pkg/sourcelist.cc:94 -#, c-format -msgid "Malformed line %lu in source list %s (URI)" -msgstr "" - -#: apt-pkg/sourcelist.cc:96 -#, c-format -msgid "Malformed line %lu in source list %s (dist)" -msgstr "" - -#: apt-pkg/sourcelist.cc:99 -#, c-format -msgid "Malformed line %lu in source list %s (URI parse)" -msgstr "" - -#: apt-pkg/sourcelist.cc:105 -#, c-format -msgid "Malformed line %lu in source list %s (absolute dist)" -msgstr "" - -#: apt-pkg/sourcelist.cc:112 -#, c-format -msgid "Malformed line %lu in source list %s (dist parse)" -msgstr "" - -#: apt-pkg/sourcelist.cc:203 -#, c-format -msgid "Opening %s" -msgstr "" - -#: apt-pkg/sourcelist.cc:220 apt-pkg/cdrom.cc:426 -#, c-format -msgid "Line %u too long in source list %s." -msgstr "" - -#: apt-pkg/sourcelist.cc:240 -#, c-format -msgid "Malformed line %u in source list %s (type)" -msgstr "" - -#: apt-pkg/sourcelist.cc:244 -#, c-format -msgid "Type '%s' is not known on line %u in source list %s" -msgstr "" - -#: apt-pkg/sourcelist.cc:252 apt-pkg/sourcelist.cc:255 -#, c-format -msgid "Malformed line %u in source list %s (vendor id)" -msgstr "" - -#: apt-pkg/packagemanager.cc:402 -#, c-format -msgid "" -"This installation run will require temporarily removing the essential " -"package %s due to a Conflicts/Pre-Depends loop. This is often bad, but if " -"you really want to do it, activate the APT::Force-LoopBreak option." -msgstr "" - -#: apt-pkg/pkgrecords.cc:37 -#, c-format -msgid "Index file type '%s' is not supported" -msgstr "" - -#: apt-pkg/algorithms.cc:241 -#, c-format -msgid "" -"The package %s needs to be reinstalled, but I can't find an archive for it." -msgstr "" - -#: apt-pkg/algorithms.cc:1059 -msgid "" -"Error, pkgProblemResolver::Resolve generated breaks, this may be caused by " -"held packages." -msgstr "" - -#: apt-pkg/algorithms.cc:1061 -msgid "Unable to correct problems, you have held broken packages." -msgstr "" - -#: apt-pkg/acquire.cc:62 -#, c-format -msgid "Lists directory %spartial is missing." -msgstr "" - -#: apt-pkg/acquire.cc:66 -#, c-format -msgid "Archive directory %spartial is missing." -msgstr "" - -#. only show the ETA if it makes sense -#. two days -#: apt-pkg/acquire.cc:823 -#, c-format -msgid "Retrieving file %li of %li (%s remaining)" -msgstr "" - -#: apt-pkg/acquire.cc:825 -#, c-format -msgid "Retrieving file %li of %li" -msgstr "" - -#: apt-pkg/acquire-worker.cc:113 -#, c-format -msgid "The method driver %s could not be found." -msgstr "" - -#: apt-pkg/acquire-worker.cc:162 -#, c-format -msgid "Method %s did not start correctly" -msgstr "" - -#: apt-pkg/acquire-worker.cc:377 -#, fuzzy, c-format -msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter." -msgstr "Dîsketê siwar bike û piştre bişkoja derbaskirinê bitikîne" - -#: apt-pkg/init.cc:120 -#, c-format -msgid "Packaging system '%s' is not supported" -msgstr "" - -#: apt-pkg/init.cc:136 -msgid "Unable to determine a suitable packaging system type" -msgstr "" - -#: apt-pkg/clean.cc:61 -#, fuzzy, c-format -msgid "Unable to stat %s." -msgstr "Nivîsandin ji bo %s ne pêkane" - -#: apt-pkg/srcrecords.cc:48 -msgid "You must put some 'source' URIs in your sources.list" -msgstr "" - -#: apt-pkg/cachefile.cc:73 -msgid "The package lists or status file could not be parsed or opened." -msgstr "" - -#: apt-pkg/cachefile.cc:77 -msgid "You may want to run apt-get update to correct these problems" -msgstr "" - -#: apt-pkg/policy.cc:269 -msgid "Invalid record in the preferences file, no Package header" -msgstr "" - -#: apt-pkg/policy.cc:291 -#, c-format -msgid "Did not understand pin type %s" -msgstr "" - -#: apt-pkg/policy.cc:299 -msgid "No priority (or zero) specified for pin" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:74 -msgid "Cache has an incompatible versioning system" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:117 -#, c-format -msgid "Error occurred while processing %s (NewPackage)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:129 -#, c-format -msgid "Error occurred while processing %s (UsePackage1)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:150 -#, c-format -msgid "Error occurred while processing %s (UsePackage2)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:154 -#, c-format -msgid "Error occurred while processing %s (NewFileVer1)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:184 -#, c-format -msgid "Error occurred while processing %s (NewVersion1)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:188 -#, c-format -msgid "Error occurred while processing %s (UsePackage3)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:192 -#, c-format -msgid "Error occurred while processing %s (NewVersion2)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:207 -msgid "Wow, you exceeded the number of package names this APT is capable of." -msgstr "" - -#: apt-pkg/pkgcachegen.cc:210 -msgid "Wow, you exceeded the number of versions this APT is capable of." -msgstr "" - -#: apt-pkg/pkgcachegen.cc:213 -msgid "Wow, you exceeded the number of dependencies this APT is capable of." -msgstr "" - -#: apt-pkg/pkgcachegen.cc:241 -#, c-format -msgid "Error occurred while processing %s (FindPkg)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:254 -#, c-format -msgid "Error occurred while processing %s (CollectFileProvides)" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:260 -#, c-format -msgid "Package %s %s was not found while processing file dependencies" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:574 -#, c-format -msgid "Couldn't stat source package list %s" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:658 -msgid "Collecting File Provides" -msgstr "" - -#: apt-pkg/pkgcachegen.cc:785 apt-pkg/pkgcachegen.cc:792 -msgid "IO Error saving source cache" -msgstr "" - -#: apt-pkg/acquire-item.cc:126 -#, c-format -msgid "rename failed, %s (%s -> %s)." -msgstr "" - -#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:945 -msgid "MD5Sum mismatch" -msgstr "" - -#: apt-pkg/acquire-item.cc:640 -msgid "There is no public key available for the following key IDs:\n" -msgstr "" - -#: apt-pkg/acquire-item.cc:753 -#, c-format -msgid "" -"I wasn't able to locate a file for the %s package. This might mean you need " -"to manually fix this package. (due to missing arch)" -msgstr "" - -#: apt-pkg/acquire-item.cc:812 -#, c-format -msgid "" -"I wasn't able to locate file for the %s package. This might mean you need to " -"manually fix this package." -msgstr "" - -#: apt-pkg/acquire-item.cc:848 -#, c-format -msgid "" -"The package index files are corrupted. No Filename: field for package %s." -msgstr "" - -#: apt-pkg/acquire-item.cc:935 -msgid "Size mismatch" -msgstr "" - -#: apt-pkg/vendorlist.cc:66 -#, c-format -msgid "Vendor block %s contains no fingerprint" -msgstr "" - -#: apt-pkg/cdrom.cc:507 -#, c-format -msgid "" -"Using CD-ROM mount point %s\n" -"Mounting CD-ROM\n" -msgstr "" - -#: apt-pkg/cdrom.cc:516 apt-pkg/cdrom.cc:598 -msgid "Identifying.. " -msgstr "" - -#: apt-pkg/cdrom.cc:541 -#, c-format -msgid "Stored label: %s \n" -msgstr "" - -#: apt-pkg/cdrom.cc:561 -#, c-format -msgid "Using CD-ROM mount point %s\n" -msgstr "" - -#: apt-pkg/cdrom.cc:579 -msgid "Unmounting CD-ROM\n" -msgstr "" - -#: apt-pkg/cdrom.cc:583 -msgid "Waiting for disc...\n" -msgstr "" - -#. Mount the new CDROM -#: apt-pkg/cdrom.cc:591 -msgid "Mounting CD-ROM...\n" -msgstr "" - -#: apt-pkg/cdrom.cc:609 -msgid "Scanning disc for index files..\n" -msgstr "" - -#: apt-pkg/cdrom.cc:647 -#, c-format -msgid "Found %i package indexes, %i source indexes and %i signatures\n" -msgstr "" - -#: apt-pkg/cdrom.cc:710 -msgid "That is not a valid name, try again.\n" -msgstr "" - -#: apt-pkg/cdrom.cc:726 -#, c-format -msgid "" -"This disc is called: \n" -"'%s'\n" -msgstr "" - -#: apt-pkg/cdrom.cc:730 -msgid "Copying package lists..." -msgstr "" - -#: apt-pkg/cdrom.cc:754 -msgid "Writing new source list\n" -msgstr "" - -#: apt-pkg/cdrom.cc:763 -msgid "Source list entries for this disc are:\n" -msgstr "" - -#: apt-pkg/cdrom.cc:803 -msgid "Unmounting CD-ROM..." -msgstr "" - -#: apt-pkg/indexcopy.cc:261 -#, c-format -msgid "Wrote %i records.\n" -msgstr "" - -#: apt-pkg/indexcopy.cc:263 -#, c-format -msgid "Wrote %i records with %i missing files.\n" -msgstr "" - -#: apt-pkg/indexcopy.cc:266 -#, c-format -msgid "Wrote %i records with %i mismatched files\n" -msgstr "" - -#: apt-pkg/indexcopy.cc:269 -#, c-format -msgid "Wrote %i records with %i missing files and %i mismatched files\n" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:358 -#, c-format -msgid "Preparing %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:359 -#, c-format -msgid "Unpacking %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:364 -#, c-format -msgid "Preparing to configure %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:365 -#, c-format -msgid "Configuring %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:366 -#, fuzzy, c-format -msgid "Installed %s" -msgstr " Sazkirî: " - -#: apt-pkg/deb/dpkgpm.cc:371 -#, c-format -msgid "Preparing for removal of %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:372 -#, c-format -msgid "Removing %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:373 -#, c-format -msgid "Removed %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:378 -#, c-format -msgid "Preparing to completely remove %s" -msgstr "" - -#: apt-pkg/deb/dpkgpm.cc:379 -#, c-format -msgid "Completely removed %s" -msgstr "" - -#: methods/rsh.cc:330 -msgid "Connection closed prematurely" -msgstr "" diff --git a/po/makefile b/po/makefile index 45e5b1e5a..07dc51c07 100644 --- a/po/makefile +++ b/po/makefile @@ -40,6 +40,9 @@ $(POTFILES) : $(PO)/%.pot : --files-from=$(PO)/POTFILES_$*.in -o $(PO)/domains/$*/c.pot rm -f $(PO)/POTFILES_$*.in $(MSGCOMM) --more-than=0 $(PO)/domains/$*/c.pot $(PO)/domains/$*/sh.pot --output=$@ + # copy into the domain dirs to make rosetta happy + rm -f $(PO)/domains/$*/*.pot + cp $@ $(PO)/domains/$* $(PACKAGE)-all.pot: $(POTFILES) $(MSGCOMM) --more-than=0 $(POTFILES) --output=$@ diff --git a/po/uk.po b/po/uk.po deleted file mode 100644 index 78131e66c..000000000 --- a/po/uk.po +++ /dev/null @@ -1,2782 +0,0 @@ -# translation of uk.po to Ukrainian -# This file is put in the public domain. -# -# Artem Bondarenko <artem.brz@gmail.com>, 2006. -# Borys Yanovych <borys.yanovych@gmail.com>, 2006. -msgid "" -msgstr "" -"Project-Id-Version: uk\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-10-11 20:34+0200\n" -"PO-Revision-Date: 2006-12-11 17:58+0100\n" -"Last-Translator: Borys Yanovych <borys.yanovych@gmail.com>\n" -"Language-Team: Ukrainian\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\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" - -#: cmdline/apt-cache.cc:135 -#, c-format -msgid "Package %s version %s has an unmet dep:\n" -msgstr "Пакунок %s версії %s має незадоволену залежність:\n" - -#: cmdline/apt-cache.cc:175 cmdline/apt-cache.cc:527 cmdline/apt-cache.cc:615 -#: cmdline/apt-cache.cc:771 cmdline/apt-cache.cc:989 cmdline/apt-cache.cc:1357 -#: cmdline/apt-cache.cc:1508 -#, c-format -msgid "Unable to locate package %s" -msgstr "Не можу знайти пакунок %s" - -#: cmdline/apt-cache.cc:232 -msgid "Total package names : " -msgstr "Всього назв пакунків : " - -#: cmdline/apt-cache.cc:272 -msgid " Normal packages: " -msgstr " Нормальних пакунків: " - -#: cmdline/apt-cache.cc:273 -msgid " Pure virtual packages: " -msgstr " Чисто віртуальних пакунків: " - -#: cmdline/apt-cache.cc:274 -msgid " Single virtual packages: " -msgstr " Окремих віртуальних пакунків: " - -#: cmdline/apt-cache.cc:275 -msgid " Mixed virtual packages: " -msgstr " Змішаних віртуальних пакунків: " - -#: cmdline/apt-cache.cc:276 -msgid " Missing: " -msgstr " Пропущено: " - -#: cmdline/apt-cache.cc:278 -msgid "Total distinct versions: " -msgstr "Всього унікальних версій: " - -#: cmdline/apt-cache.cc:280 -msgid "Total dependencies: " -msgstr "Всього залежностей: " - -#: cmdline/apt-cache.cc:283 -msgid "Total ver/file relations: " -msgstr "Всього відносин Версія/Файл: " - -#: cmdline/apt-cache.cc:285 -msgid "Total Provides mappings: " -msgstr "Всього відносин Provides: " - -#: cmdline/apt-cache.cc:297 -msgid "Total globbed strings: " -msgstr "Всього розгорнутих рядків: " - -#: cmdline/apt-cache.cc:311 -msgid "Total dependency version space: " -msgstr "Всього інформації про залежності: " - -#: cmdline/apt-cache.cc:316 -msgid "Total slack space: " -msgstr "Порожнього місця в кеші: " - -#: cmdline/apt-cache.cc:324 -msgid "Total space accounted for: " -msgstr "Загальний простір полічений для: " - -#: cmdline/apt-cache.cc:446 cmdline/apt-cache.cc:1189 -#, c-format -msgid "Package file %s is out of sync." -msgstr "Перелік пакунків %s розсинхронізований." - -#: cmdline/apt-cache.cc:1231 -msgid "You must give exactly one pattern" -msgstr "Ви повинні задати точно один шаблон" - -#: cmdline/apt-cache.cc:1385 -msgid "No packages found" -msgstr "Жодного пакунка не знайдено" - -#: cmdline/apt-cache.cc:1462 -msgid "Package files:" -msgstr "Файли з переліком пакунків:" - -#: cmdline/apt-cache.cc:1469 cmdline/apt-cache.cc:1555 -msgid "Cache is out of sync, can't x-ref a package file" -msgstr "Кеш не синхронізований, неможливо знайти посилання на файл переліку пакунків" - -#: cmdline/apt-cache.cc:1470 -#, c-format -msgid "%4i %s\n" -msgstr "%4i %s\n" - -#. Show any packages have explicit pins -#: cmdline/apt-cache.cc:1482 -msgid "Pinned packages:" -msgstr "\"Приколоті\" пакунки:" - -#: cmdline/apt-cache.cc:1494 cmdline/apt-cache.cc:1535 -msgid "(not found)" -msgstr "(не знайдено)" - -#. Installed version -#: cmdline/apt-cache.cc:1515 -msgid " Installed: " -msgstr " Встановлено: " - -#: cmdline/apt-cache.cc:1517 cmdline/apt-cache.cc:1525 -msgid "(none)" -msgstr "(відсутній)" - -#. Candidate Version -#: cmdline/apt-cache.cc:1522 -msgid " Candidate: " -msgstr " Кандидат: " - -#: cmdline/apt-cache.cc:1532 -msgid " Package pin: " -msgstr " \"Приколювач\"(pin) пакунка: " - -#. Show the priority tables -#: cmdline/apt-cache.cc:1541 -msgid " Version table:" -msgstr " Таблиця версій:" - -#: cmdline/apt-cache.cc:1556 -#, c-format -msgid " %4i %s\n" -msgstr " %4i %s\n" - -#: cmdline/apt-cache.cc:1652 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70 -#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550 -#: cmdline/apt-get.cc:2387 cmdline/apt-sortpkgs.cc:144 -#, c-format -msgid "%s %s for %s %s compiled on %s %s\n" -msgstr "%s %s для %s %s скомпільовано %s %s\n" - -#: cmdline/apt-cache.cc:1659 -msgid "" -"Usage: apt-cache [options] command\n" -" apt-cache [options] add file1 [file2 ...]\n" -" apt-cache [options] showpkg pkg1 [pkg2 ...]\n" -" apt-cache [options] showsrc pkg1 [pkg2 ...]\n" -"\n" -"apt-cache is a low-level tool used to manipulate APT's binary\n" -"cache files, and query information from them\n" -"\n" -"Commands:\n" -" add - Add a package file to the source cache\n" -" gencaches - Build both the package and source cache\n" -" showpkg - Show some general information for a single package\n" -" showsrc - Show source records\n" -" stats - Show some basic statistics\n" -" dump - Show the entire file in a terse form\n" -" dumpavail - Print an available file to stdout\n" -" unmet - Show unmet dependencies\n" -" search - Search the package list for a regex pattern\n" -" show - Show a readable record for the package\n" -" depends - Show raw dependency information for a package\n" -" rdepends - Show reverse dependency information for a package\n" -" pkgnames - List the names of all packages\n" -" dotty - Generate package graphs for GraphVis\n" -" xvcg - Generate package graphs for xvcg\n" -" policy - Show policy settings\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -p=? The package cache.\n" -" -s=? The source cache.\n" -" -q Disable progress indicator.\n" -" -i Show only important deps for the unmet command.\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -"See the apt-cache(8) and apt.conf(5) manual pages for more information.\n" -msgstr "" -"Використання: apt-cache [options] command\n" -" або: apt-cache [options] add file1 [file1 ...]\n" -" або: apt-cache [options] showpkg pkg1 [pkg2 ...]\n" -" або: apt-cache [options] showsrc pkg1 [pkg2 ...]\n" -"\n" -"apt-cache - низькорівневий інструмент, що використається для керування\n" -"двійковими кеш-файлами APT'а, а також для добування інформації з них\n" -"Команди:\n" -" add - додати файл пакунка в кеш джерел\n" -" gencaches - побудувати обидва кеша пакунків - бінарних і з вихідними " -"текстами\n" -" showpkg - загальна інформація про конкретний пакунок\n" -" stats - основна статистика\n" -" dump - показати весь файл у стислій формі\n" -" dumpavail - видати на stdout список доступних пакунків\n" -" unmet - показати незадоволені залежності\n" -" search - знайти пакунки, назва яких задовольняє регулярний вираз\n" -" show - показати інформацію про пакунок в зрозумілій формі\n" -" depends - показати \"сиру\" інформацію про залежності пакунка\n" -" rdepends - показати інформацію про зворотні залежності пакунка\n" -" pkgnames - показати імена всіх пакунків\n" -" dotty - генерувати граф залежностей пакунків у форматі GraphVis\n" -" xvcg - генерувати граф залежностей пакунків у форматі xvcg\n" -" policy - показати поточну політику вибору пакунків\n" -"\n" -"Опції:\n" -" -h Цей текст.\n" -" -p=? Кеш пакунків.\n" -" -s=? Кеш джерел.\n" -" -q Не показувати індикатор прогресу.\n" -" -i Показувати тільки важливі залежності для команди unmet.\n" -" -c=? Читати зазначений файл конфігурації.\n" -" -o=? Встановити довільну опцію конфігурації, наприклад, -o dir::cache=/" -"tmp\n" -"Подробиці в сторінках керівництва apt-cache(8) і apt.conf(5).\n" - -#: cmdline/apt-cdrom.cc:78 -msgid "Please provide a name for this Disc, such as 'Debian 2.1r1 Disk 1'" -msgstr "Задайте назву для цього диска, наприклад 'Debian 2.1r1 Disk 1'" - -#: cmdline/apt-cdrom.cc:93 -msgid "Please insert a Disc in the drive and press enter" -msgstr "Вставте диск у пристрій і натисніть Ввід" - -#: cmdline/apt-cdrom.cc:117 -msgid "Repeat this process for the rest of the CDs in your set." -msgstr "Повторіть цей процес для інших наявних CD." - -#: cmdline/apt-config.cc:41 -msgid "Arguments not in pairs" -msgstr "Непарні аргументи" - -#: cmdline/apt-config.cc:76 -msgid "" -"Usage: apt-config [options] command\n" -"\n" -"apt-config is a simple tool to read the APT config file\n" -"\n" -"Commands:\n" -" shell - Shell mode\n" -" dump - Show the configuration\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" -"Використання: apt-config [options] command\n" -"\n" -"apt-config - простий інструмент для читання конфігураційного файлу APT\n" -"\n" -"Команди:\n" -" shell - режим shell\n" -" dump - показати конфігурацію\n" -"\n" -"Опції:\n" -" -h Цей текст.\n" -" -с=? Читати зазначений конфігураційний файл.\n" -" -o=? Встановити довільну опцію, наприклад, -o dir::cache=/tmp\n" - -#: cmdline/apt-extracttemplates.cc:98 -#, c-format -msgid "%s not a valid DEB package." -msgstr "%s не є правильним DEB-пакунком." - -#: cmdline/apt-extracttemplates.cc:232 -msgid "" -"Usage: apt-extracttemplates file1 [file2 ...]\n" -"\n" -"apt-extracttemplates is a tool to extract config and template info\n" -"from debian packages\n" -"\n" -"Options:\n" -" -h This help text\n" -" -t Set the temp dir\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" -"Використання: apt-extracttemplates file1 [file2 ...]\n" -"\n" -"apt-extracttemplates витягує з пакунків Debian конфігураційні скрипти\n" -"і файли-шаблони\n" -"\n" -"Опції:\n" -" -h Цей текст\n" -" -t Встановити теку для тимчасових файлів\n" -" -c=? Читати зазначений конфігураційний файл\n" -" -o=? Вказати довільну опцію, наприклад, -o dir::cache=/tmp\n" - -#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:710 -#, c-format -msgid "Unable to write to %s" -msgstr "Неможливо записати в %s" - -#: cmdline/apt-extracttemplates.cc:310 -msgid "Cannot get debconf version. Is debconf installed?" -msgstr "Неможливо визначити версію debconf. Він встановлений?" - -#: ftparchive/apt-ftparchive.cc:167 ftparchive/apt-ftparchive.cc:341 -msgid "Package extension list is too long" -msgstr "Список розширень, припустимих для пакунків, занадто довгий" - -#: ftparchive/apt-ftparchive.cc:169 ftparchive/apt-ftparchive.cc:183 -#: ftparchive/apt-ftparchive.cc:206 ftparchive/apt-ftparchive.cc:256 -#: ftparchive/apt-ftparchive.cc:270 ftparchive/apt-ftparchive.cc:292 -#, c-format -msgid "Error processing directory %s" -msgstr "Помилка обробки течи %s" - -#: ftparchive/apt-ftparchive.cc:254 -msgid "Source extension list is too long" -msgstr "" -"Список розширень, припустимих для пакунків з вихідними текстами, занадто " -"довгий" - -#: ftparchive/apt-ftparchive.cc:371 -msgid "Error writing header to contents file" -msgstr "Помилка запису заголовка в повний перелік вмісту пакунків (Contents)" - -#: ftparchive/apt-ftparchive.cc:401 -#, c-format -msgid "Error processing contents %s" -msgstr "помилка обробки повного переліку вмісту пакунків (Contents) %s" - -#: ftparchive/apt-ftparchive.cc:556 -msgid "" -"Usage: apt-ftparchive [options] command\n" -"Commands: packages binarypath [overridefile [pathprefix]]\n" -" sources srcpath [overridefile [pathprefix]]\n" -" contents path\n" -" release path\n" -" generate config [groups]\n" -" clean config\n" -"\n" -"apt-ftparchive generates index files for Debian archives. It supports\n" -"many styles of generation from fully automated to functional replacements\n" -"for dpkg-scanpackages and dpkg-scansources\n" -"\n" -"apt-ftparchive generates Package files from a tree of .debs. The\n" -"Package file contains the contents of all the control fields from\n" -"each package as well as the MD5 hash and filesize. An override file\n" -"is supported to force the value of Priority and Section.\n" -"\n" -"Similarly apt-ftparchive generates Sources files from a tree of .dscs.\n" -"The --source-override option can be used to specify a src override file\n" -"\n" -"The 'packages' and 'sources' command should be run in the root of the\n" -"tree. BinaryPath should point to the base of the recursive search and \n" -"override file should contain the override flags. Pathprefix is\n" -"appended to the filename fields if present. Example usage from the \n" -"Debian archive:\n" -" apt-ftparchive packages dists/potato/main/binary-i386/ > \\\n" -" dists/potato/main/binary-i386/Packages\n" -"\n" -"Options:\n" -" -h This help text\n" -" --md5 Control MD5 generation\n" -" -s=? Source override file\n" -" -q Quiet\n" -" -d=? Select the optional caching database\n" -" --no-delink Enable delinking debug mode\n" -" --contents Control contents file generation\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option" -msgstr "" -"Використання: apt-ftparchive [параметри] команда\n" -"Команди: packages binarypath [overridefile [pathprefix]]\n" -" sources srcpath [overridefile [pathprefix]]\n" -" contents path\n" -" release path\n" -" generate config [groups]\n" -" clean config\n" -"\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" -"\n" -"Крім того, apt-ftparchive може генерувати файли Sources з дерева\n" -"тек, що містять файли .dsc. Для вказівки файлу override у цьому \n" -"режимі можна використати параметр --source-override.\n" -"\n" -"Команди 'packages' і 'sources' треба виконувати, перебуваючи в кореневій " -"теці\n" -"дерева, що ви хочете обробити. BinaryPath повинен вказувати на місце,\n" -"з якого починається рекурсивний обхід, а файл перепризначень (override)\n" -"повинен містити запис про перепризначення керуючих полів. Якщо був " -"зазначений\n" -"Pathprefix, то його значення додається до керуючих полів, що містять\n" -"імена файлів. Приклад використання для архіву Debian:\n" -" apt-ftparchive packages dists/potato/main/binary-i386/ > \\\n" -" 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" -" (файлу Contents)\n" -" -c=? Використати зазначений конфігураційний файл\n" -" -o=? Вказати довільний параметр конфігурації" - -#: ftparchive/apt-ftparchive.cc:762 -msgid "No selections matched" -msgstr "Збігів не виявлено" - -#: ftparchive/apt-ftparchive.cc:835 -#, c-format -msgid "Some files are missing in the package file group `%s'" -msgstr "У групі пакунків '%s' відсутні деякі файли" - -#: ftparchive/cachedb.cc:47 -#, c-format -msgid "DB was corrupted, file renamed to %s.old" -msgstr "БД була пошкоджена, файл перейменований в %s.old" - -#: ftparchive/cachedb.cc:65 -#, c-format -msgid "DB is old, attempting to upgrade %s" -msgstr "DB застаріла, намагаюсь оновити %s" - -#: ftparchive/cachedb.cc:76 -msgid "" -"DB format is invalid. If you upgraded from a older version of apt, please " -"remove and re-create the database." -msgstr "Формати DB не є правильним. Якщо ви оновилися зі старої версії apt, будь ласка видаліть і наново створіть базу." - -#: ftparchive/cachedb.cc:81 -#, c-format -msgid "Unable to open DB file %s: %s" -msgstr "Не вдалося відкрити DB файл %s: %s" - -#: ftparchive/cachedb.cc:127 apt-inst/extract.cc:181 apt-inst/extract.cc:193 -#: apt-inst/extract.cc:210 apt-inst/deb/dpkgdb.cc:121 methods/gpgv.cc:272 -#, c-format -msgid "Failed to stat %s" -msgstr "Не вдалося одержати атрибути %s" - -#: ftparchive/cachedb.cc:242 -msgid "Archive has no control record" -msgstr "В архіві немає поля control" - -#: ftparchive/cachedb.cc:448 -msgid "Unable to get a cursor" -msgstr "Неможливо одержати курсор" - -#: ftparchive/writer.cc:79 -#, c-format -msgid "W: Unable to read directory %s\n" -msgstr "W: Не вдалося прочитати теку %s\n" - -#: ftparchive/writer.cc:84 -#, c-format -msgid "W: Unable to stat %s\n" -msgstr "W: Неможливо прочитати атрибути %s\n" - -#: ftparchive/writer.cc:135 -msgid "E: " -msgstr "E: " - -#: ftparchive/writer.cc:137 -msgid "W: " -msgstr "W: " - -#: ftparchive/writer.cc:144 -msgid "E: Errors apply to file " -msgstr "E: Помилки відносяться до файлу" - -#: ftparchive/writer.cc:161 ftparchive/writer.cc:191 -#, c-format -msgid "Failed to resolve %s" -msgstr "Не вдалося піти по посиланню %s" - -#: ftparchive/writer.cc:173 -msgid "Tree walking failed" -msgstr "Не вдалося зробити обхід дерева" - -#: ftparchive/writer.cc:198 -#, c-format -msgid "Failed to open %s" -msgstr "Не вдалося відкрити %s" - -#: ftparchive/writer.cc:257 -#, c-format -msgid " DeLink %s [%s]\n" -msgstr "DeLink %s [%s]\n" - -#: ftparchive/writer.cc:265 -#, c-format -msgid "Failed to readlink %s" -msgstr "Не вдалося прочитати посилання %s" - -#: ftparchive/writer.cc:269 -#, c-format -msgid "Failed to unlink %s" -msgstr "Не вдалося видалити %s" - -#: ftparchive/writer.cc:276 -#, c-format -msgid "*** Failed to link %s to %s" -msgstr "*** Не вдалося створити посилання %s на %s" - -#: ftparchive/writer.cc:286 -#, c-format -msgid " DeLink limit of %sB hit.\n" -msgstr "Перевищено ліміт в %s в DeLink.\n" - -#: ftparchive/writer.cc:390 -msgid "Archive had no package field" -msgstr "В архіві немає поля package" - -#: ftparchive/writer.cc:398 ftparchive/writer.cc:613 -#, c-format -msgid " %s has no override entry\n" -msgstr " Відсутній запис про перепризначення для %s\n" - -#: ftparchive/writer.cc:443 ftparchive/writer.cc:701 -#, c-format -msgid " %s maintainer is %s not %s\n" -msgstr " пакунок %s супроводжує %s, а не %s\n" - -#: ftparchive/writer.cc:623 -#, c-format -msgid " %s has no source override entry\n" -msgstr "" - -#: ftparchive/writer.cc:627 -#, c-format -msgid " %s has no binary override entry either\n" -msgstr "" - -#: ftparchive/contents.cc:317 -#, c-format -msgid "Internal error, could not locate member %s" -msgstr "Внутрішня помилка, не можу знайти складову частину %s" - -#: ftparchive/contents.cc:353 ftparchive/contents.cc:384 -msgid "realloc - Failed to allocate memory" -msgstr "realloc - не вдалося виділити пам'ять" - -#: ftparchive/override.cc:38 ftparchive/override.cc:146 -#, c-format -msgid "Unable to open %s" -msgstr "Не вдалося відкрити %s" - -#: ftparchive/override.cc:64 ftparchive/override.cc:170 -#, c-format -msgid "Malformed override %s line %lu #1" -msgstr "Спотворений запис про перепризначення (override) %s на рядку %lu #1" - -#: ftparchive/override.cc:78 ftparchive/override.cc:182 -#, c-format -msgid "Malformed override %s line %lu #2" -msgstr "Спотворений запис про перепризначення (override) %s на рядку %lu #2" - -#: ftparchive/override.cc:92 ftparchive/override.cc:195 -#, c-format -msgid "Malformed override %s line %lu #3" -msgstr "Спотворений запис про перепризначення (override) %s на рядку %lu #3" - -#: ftparchive/override.cc:131 ftparchive/override.cc:205 -#, c-format -msgid "Failed to read the override file %s" -msgstr "Не вдалося прочитати файл перепризначень (override)%s" - -#: ftparchive/multicompress.cc:75 -#, c-format -msgid "Unknown compression algorithm '%s'" -msgstr "Невідомий алгоритм стиснення '%s'" - -#: ftparchive/multicompress.cc:105 -#, c-format -msgid "Compressed output %s needs a compression set" -msgstr "Для отримання стиснутого виводу %s необхідно ввімкнути пакування" - -#: ftparchive/multicompress.cc:172 methods/rsh.cc:91 -msgid "Failed to create IPC pipe to subprocess" -msgstr "Не вдалося створити IPC-канал для породженого процесу" - -#: ftparchive/multicompress.cc:198 -msgid "Failed to create FILE*" -msgstr "Не вдалося створити FILE*" - -#: ftparchive/multicompress.cc:201 -msgid "Failed to fork" -msgstr "Не вдалося виконати породжений процес" - -#: ftparchive/multicompress.cc:215 -msgid "Compress child" -msgstr "Процес-нащадок, що виконує пакування" - -#: ftparchive/multicompress.cc:238 -#, c-format -msgid "Internal error, failed to create %s" -msgstr "Внутрішня помилка, не вдалося створити %s" - -#: ftparchive/multicompress.cc:289 -msgid "Failed to create subprocess IPC" -msgstr "Не вдалося створити IPC з породженим процесом" - -#: ftparchive/multicompress.cc:324 -msgid "Failed to exec compressor " -msgstr "Не вдалося виконати компресор " - -#: ftparchive/multicompress.cc:363 -msgid "decompressor" -msgstr "декомпресор" - -#: ftparchive/multicompress.cc:406 -msgid "IO to subprocess/file failed" -msgstr "Помилка уведення/виводу в підпроцес/файл" - -#: ftparchive/multicompress.cc:458 -msgid "Failed to read while computing MD5" -msgstr "Помилка читання під час обчислення MD5" - -#: ftparchive/multicompress.cc:475 -#, c-format -msgid "Problem unlinking %s" -msgstr "Не вдалося видалити %s" - -#: ftparchive/multicompress.cc:490 apt-inst/extract.cc:188 -#, c-format -msgid "Failed to rename %s to %s" -msgstr "Не вдалося перейменувати %s в %s" - -#: cmdline/apt-get.cc:120 -msgid "Y" -msgstr "Т" - -#: cmdline/apt-get.cc:142 cmdline/apt-get.cc:1506 -#, c-format -msgid "Regex compilation error - %s" -msgstr "Помилка компіляції регулярного виразу - %s" - -#: cmdline/apt-get.cc:237 -msgid "The following packages have unmet dependencies:" -msgstr "Пакунки, що мають незадоволені залежності:" - -#: cmdline/apt-get.cc:327 -#, c-format -msgid "but %s is installed" -msgstr "але %s вже встановлений" - -#: cmdline/apt-get.cc:329 -#, c-format -msgid "but %s is to be installed" -msgstr "але %s буде встановлений" - -#: cmdline/apt-get.cc:336 -msgid "but it is not installable" -msgstr "але він не може бути встановлений" - -#: cmdline/apt-get.cc:338 -msgid "but it is a virtual package" -msgstr "але це віртуальний пакунок" - -#: cmdline/apt-get.cc:341 -msgid "but it is not installed" -msgstr "але він не встановлений" - -#: cmdline/apt-get.cc:341 -msgid "but it is not going to be installed" -msgstr "але він не буде встановлений" - -#: cmdline/apt-get.cc:346 -msgid " or" -msgstr " чи" - -#: cmdline/apt-get.cc:375 -msgid "The following NEW packages will be installed:" -msgstr "НОВІ пакунки, які будуть встановлені:" - -#: cmdline/apt-get.cc:401 -msgid "The following packages will be REMOVED:" -msgstr "Пакунки, які будуть ВИДАЛЕНІ:" - -#: cmdline/apt-get.cc:423 -msgid "The following packages have been kept back:" -msgstr "Пакунки, які будуть залишені в незмінному вигляді:" - -#: cmdline/apt-get.cc:444 -msgid "The following packages will be upgraded:" -msgstr "Пакунки, які будуть ОНОВЛЕНІ:" - -#: cmdline/apt-get.cc:465 -msgid "The following packages will be DOWNGRADED:" -msgstr "Пакунки, будуть замінені на більш СТАРІ версії:" - -#: cmdline/apt-get.cc:485 -msgid "The following held packages will be changed:" -msgstr "Пакунки, які повинні були б залишитися без змін, але будуть замінені:" - -#: cmdline/apt-get.cc:538 -#, c-format -msgid "%s (due to %s) " -msgstr "%s (внаслідок %s) " - -#: cmdline/apt-get.cc:546 -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" -"НЕ РОБІТЬ цього, якщо ви НЕ уявляєте собі всі можливі наслідки!" - -#: cmdline/apt-get.cc:577 -#, c-format -msgid "%lu upgraded, %lu newly installed, " -msgstr "оновлено %lu, встановлено %lu нових пакунків, " - -#: cmdline/apt-get.cc:581 -#, c-format -msgid "%lu reinstalled, " -msgstr " %lu перевстановлено, " - -#: cmdline/apt-get.cc:583 -#, c-format -msgid "%lu downgraded, " -msgstr "%lu пакунків замінено на старі версії, " - -#: cmdline/apt-get.cc:585 -#, c-format -msgid "%lu to remove and %lu not upgraded.\n" -msgstr "для видалення відмічено %lu пакунків, і %lu пакунків не оновлено.\n" - -#: cmdline/apt-get.cc:589 -#, c-format -msgid "%lu not fully installed or removed.\n" -msgstr "не встановлено до кінця чи видалено %lu пакунків.\n" - -#: cmdline/apt-get.cc:649 -msgid "Correcting dependencies..." -msgstr "Виправлення залежностей..." - -#: cmdline/apt-get.cc:652 -msgid " failed." -msgstr " невдача." - -#: cmdline/apt-get.cc:655 -msgid "Unable to correct dependencies" -msgstr "Неможливо скоригувати залежності" - -#: cmdline/apt-get.cc:658 -msgid "Unable to minimize the upgrade set" -msgstr "Неможливо мінімізувати набір оновлень" - -#: cmdline/apt-get.cc:660 -msgid " Done" -msgstr " Виконано" - -#: cmdline/apt-get.cc:664 -msgid "You might want to run `apt-get -f install' to correct these." -msgstr "" -"Можливо, для виправлення цих помилок ви захочете скористатися 'apt-get -f " -"install'." - -#: cmdline/apt-get.cc:667 -msgid "Unmet dependencies. Try using -f." -msgstr "Незадоволені залежності. Спробуйте використати -f." - -#: cmdline/apt-get.cc:689 -msgid "WARNING: The following packages cannot be authenticated!" -msgstr "УВАГА: Наступні пакунки неможливо автентифікувати!" - -#: cmdline/apt-get.cc:693 -msgid "Authentication warning overridden.\n" -msgstr "Автентифікаційне попередження не прийнято до уваги.\n" - -#: cmdline/apt-get.cc:700 -msgid "Install these packages without verification [y/N]? " -msgstr "Встановити ці пакунки без перевірки [т/Н]? " - -#: cmdline/apt-get.cc:702 -msgid "Some packages could not be authenticated" -msgstr "Деякі пакунки неможливо автентифікувати" - -#: cmdline/apt-get.cc:711 cmdline/apt-get.cc:858 -msgid "There are problems and -y was used without --force-yes" -msgstr "Існують проблеми, а опція -y використана без --force-yes" - -#: cmdline/apt-get.cc:755 -msgid "Internal error, InstallPackages was called with broken packages!" -msgstr "" -"Внутрішня помилка, InstallPackages була викликана з непрацездатними " -"пакунками!" - -#: cmdline/apt-get.cc:764 -msgid "Packages need to be removed but remove is disabled." -msgstr "Пакунки необхідно видалити, але видалення заборонене." - -#: cmdline/apt-get.cc:775 -msgid "Internal error, Ordering didn't finish" -msgstr "Внутрішня помилка, Ordering не завершилася" - -#: cmdline/apt-get.cc:791 cmdline/apt-get.cc:1818 cmdline/apt-get.cc:1851 -msgid "Unable to lock the download directory" -msgstr "Неможливо заблокувати теку для завантаження" - -#: cmdline/apt-get.cc:801 cmdline/apt-get.cc:1899 cmdline/apt-get.cc:2135 -#: apt-pkg/cachefile.cc:67 -msgid "The list of sources could not be read." -msgstr "Неможливо прочитати перелік джерел." - -#: cmdline/apt-get.cc:816 -msgid "How odd.. The sizes didn't match, email apt@packages.debian.org" -msgstr "Дивно.. Розбіжність розмірів, напишіть на apt@packages.debian.org" - -#: cmdline/apt-get.cc:821 -#, c-format -msgid "Need to get %sB/%sB of archives.\n" -msgstr "Необхідно завантажити %sB/%sB архівів.\n" - -#: cmdline/apt-get.cc:824 -#, c-format -msgid "Need to get %sB of archives.\n" -msgstr "Необхідно завантажити %sB архівів.\n" - -#: cmdline/apt-get.cc:829 -#, c-format -msgid "After unpacking %sB of additional disk space will be used.\n" -msgstr "Після розпакування об'єм зайнятого дискового простору зросте на %sB.\n" - -#: cmdline/apt-get.cc:832 -#, c-format -msgid "After unpacking %sB disk space will be freed.\n" -msgstr "Після розпакування об'єм зайнятого дискового простору зменшиться на %sB.\n" - -#: cmdline/apt-get.cc:846 cmdline/apt-get.cc:1989 -#, c-format -msgid "Couldn't determine free space in %s" -msgstr "Не вдалося визначити кількість вільного місця в %s" - -#: cmdline/apt-get.cc:849 -#, c-format -msgid "You don't have enough free space in %s." -msgstr "Недостатньо вільного місця в %s." - -#: cmdline/apt-get.cc:864 cmdline/apt-get.cc:884 -msgid "Trivial Only specified but this is not a trivial operation." -msgstr "" -"Запитане виконання тільки тривіальних операцій, але це не тривіальна " -"операція." - -#: cmdline/apt-get.cc:866 -msgid "Yes, do as I say!" -msgstr "Так, робити, як я скажу!" - -#: cmdline/apt-get.cc:868 -#, c-format -msgid "" -"You are about to do something potentially harmful.\n" -"To continue type in the phrase '%s'\n" -" ?] " -msgstr "" -"Те, що ви хочете зробити, може мати небажані наслідки.\n" -"Щоб продовжити, введіть фразу: '%s'\n" -" ?] " - -#: cmdline/apt-get.cc:874 cmdline/apt-get.cc:893 -msgid "Abort." -msgstr "Перервано." - -#: cmdline/apt-get.cc:889 -msgid "Do you want to continue [Y/n]? " -msgstr "Бажаєте продовжити [Т/н]? " - -#: cmdline/apt-get.cc:961 cmdline/apt-get.cc:1365 cmdline/apt-get.cc:2032 -#, c-format -msgid "Failed to fetch %s %s\n" -msgstr "Не вдалося завантажити %s %s\n" - -#: cmdline/apt-get.cc:979 -msgid "Some files failed to download" -msgstr "Деякі файли не вдалося завантажити" - -#: cmdline/apt-get.cc:980 cmdline/apt-get.cc:2041 -msgid "Download complete and in download only mode" -msgstr "Вказано режим \"тільки завантаження\", і завантаження завершено" - -#: cmdline/apt-get.cc:986 -msgid "" -"Unable to fetch some archives, maybe run apt-get update or try with --fix-" -"missing?" -msgstr "" -"Неможливо завантажити деякі архіви, імовірно треба виконати apt-get update " -"або спробувати повторити запуск з ключем --fix-missing?" - -#: cmdline/apt-get.cc:990 -msgid "--fix-missing and media swapping is not currently supported" -msgstr "--fix-missing і зміна носія в даний момент не підтримується" - -#: cmdline/apt-get.cc:995 -msgid "Unable to correct missing packages." -msgstr "Неможливо виправити втрачені пакунки." - -#: cmdline/apt-get.cc:996 -msgid "Aborting install." -msgstr "Переривається встановлення." - -#: cmdline/apt-get.cc:1030 -#, c-format -msgid "Note, selecting %s instead of %s\n" -msgstr "Помітьте, замість %2$s вибирається %1$s\n" - -#: cmdline/apt-get.cc:1040 -#, c-format -msgid "Skipping %s, it is already installed and upgrade is not set.\n" -msgstr "" -"Пропускається %s - пакунок вже встановлений, і опція upgrade не " -"встановлена.\n" - -#: cmdline/apt-get.cc:1058 -#, c-format -msgid "Package %s is not installed, so not removed\n" -msgstr "Пакунок %s не встановлений, тому не може бути видалений\n" - -#: cmdline/apt-get.cc:1069 -#, c-format -msgid "Package %s is a virtual package provided by:\n" -msgstr "Пакунок %s - віртуальний, його функції надаються пакунками:\n" - -#: cmdline/apt-get.cc:1081 -msgid " [Installed]" -msgstr " [Встановлено]" - -#: cmdline/apt-get.cc:1086 -msgid "You should explicitly select one to install." -msgstr "Ви повинні явно вказати, який саме ви хочете встановити." - -#: cmdline/apt-get.cc:1091 -#, c-format -msgid "" -"Package %s is not available, but is referred to by another package.\n" -"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" - -#: cmdline/apt-get.cc:1110 -msgid "However the following packages replace it:" -msgstr "Однак наступні пакунки можуть його замінити:" - -#: cmdline/apt-get.cc:1113 -#, c-format -msgid "Package %s has no installation candidate" -msgstr "Для пакунка %s не знайдені кандидати на встановлення" - -#: cmdline/apt-get.cc:1133 -#, c-format -msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n" -msgstr "Перевстановлення %s неможливе, бо він не може бути завантаженим.\n" - -#: cmdline/apt-get.cc:1141 -#, c-format -msgid "%s is already the newest version.\n" -msgstr "Вже встановлена найновіша версія %s.\n" - -#: cmdline/apt-get.cc:1168 -#, c-format -msgid "Release '%s' for '%s' was not found" -msgstr "Реліз '%s' для '%s' не знайдений" - -#: cmdline/apt-get.cc:1170 -#, c-format -msgid "Version '%s' for '%s' was not found" -msgstr "Версія '%s' для '%s' не знайдена" - -#: cmdline/apt-get.cc:1176 -#, c-format -msgid "Selected version %s (%s) for %s\n" -msgstr "Обрана версія %s (%s) для %s\n" - -#: cmdline/apt-get.cc:1313 -msgid "The update command takes no arguments" -msgstr "Команді update не потрібні аргументи" - -#: cmdline/apt-get.cc:1326 -msgid "Unable to lock the list directory" -msgstr "Неможливо заблокувати теку з переліками пакунків" - -#: cmdline/apt-get.cc:1384 -msgid "" -"Some index files failed to download, they have been ignored, or old ones " -"used instead." -msgstr "" -"Деякі індексні файли не завантажилися, вони були зігноровані або замість них " -"були використані старі версії." - -#: cmdline/apt-get.cc:1403 -msgid "Internal error, AllUpgrade broke stuff" -msgstr "Внутрішня помилка, AllUpgrade все поламав" - -#: cmdline/apt-get.cc:1493 cmdline/apt-get.cc:1529 -#, c-format -msgid "Couldn't find package %s" -msgstr "Не можу знайти пакунок %s" - -#: cmdline/apt-get.cc:1516 -#, c-format -msgid "Note, selecting %s for regex '%s'\n" -msgstr "Помітьте, регулярний вираз %2$s призводить до вибору %1$s\n" - -#: cmdline/apt-get.cc:1546 -msgid "You might want to run `apt-get -f install' to correct these:" -msgstr "" -"Можливо, для виправлення цих помилок Ви захочете скористатися 'apt-get -f " -"install':" - -#: cmdline/apt-get.cc:1549 -msgid "" -"Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a " -"solution)." -msgstr "" -"Незадоволені залежності. Спробуйте виконати 'apt-get -f install', не " -"вказуючи імені пакунка (або знайдіть інше рішення)." - -#: cmdline/apt-get.cc:1561 -msgid "" -"Some packages could not be installed. This may mean that you have\n" -"requested an impossible situation or if you are using the unstable\n" -"distribution that some required packages have not yet been created\n" -"or been moved out of Incoming." -msgstr "" -"Деякі пакунки неможливо встановити. Можливо, Ви просите неможливого,\n" -"або ж використаєте нестабільний дистрибутив, і запитані Вами пакунки\n" -"ще не створені або були вилучені з Incoming." - -#: cmdline/apt-get.cc:1569 -msgid "" -"Since you only requested a single operation it is extremely likely that\n" -"the package is simply not installable and a bug report against\n" -"that package should be filed." -msgstr "" -"Так як Ви просили виконати тільки одну операцію, те найімовірніше, що\n" -"пакунок просто не може бути встановлений через помилки в самому пакунку.\n" -"Необхідно відіслати звіт про цю помилку." - -#: cmdline/apt-get.cc:1574 -msgid "The following information may help to resolve the situation:" -msgstr "Наступна інформація можливо допоможе Вам:" - -#: cmdline/apt-get.cc:1577 -msgid "Broken packages" -msgstr "Зламані пакунки" - -#: cmdline/apt-get.cc:1603 -msgid "The following extra packages will be installed:" -msgstr "Будуть встановлені наступні додаткові пакунки:" - -#: cmdline/apt-get.cc:1692 -msgid "Suggested packages:" -msgstr "Пропоновані пакунки:" - -#: cmdline/apt-get.cc:1693 -msgid "Recommended packages:" -msgstr "Рекомендовані пакунки:" - -#: cmdline/apt-get.cc:1713 -msgid "Calculating upgrade... " -msgstr "Обчислення оновлень... " - -#: cmdline/apt-get.cc:1716 methods/ftp.cc:702 methods/connect.cc:101 -msgid "Failed" -msgstr "Невдача" - -#: cmdline/apt-get.cc:1721 -msgid "Done" -msgstr "Виконано" - -#: cmdline/apt-get.cc:1786 cmdline/apt-get.cc:1794 -msgid "Internal error, problem resolver broke stuff" -msgstr "Внутрішня помилка, вирішувач проблем все поламав" - -#: cmdline/apt-get.cc:1894 -msgid "Must specify at least one package to fetch source for" -msgstr "" -"Вкажіть як мінімум один пакунок, для якого необхідно завантажити вихідні " -"тексти" - -#: cmdline/apt-get.cc:1924 cmdline/apt-get.cc:2153 -#, c-format -msgid "Unable to find a source package for %s" -msgstr "Неможливо знайти пакунок з вихідними текстами для %s" - -#: cmdline/apt-get.cc:1968 -#, c-format -msgid "Skipping already downloaded file '%s'\n" -msgstr "Пропускаємо вже завантажений файл '%s'\n" - -#: cmdline/apt-get.cc:1992 -#, c-format -msgid "You don't have enough free space in %s" -msgstr "Недостатньо місця в %s" - -#: cmdline/apt-get.cc:1997 -#, c-format -msgid "Need to get %sB/%sB of source archives.\n" -msgstr "Необхідно завантажити %sB/%sB з архівів вихідних текстів.\n" - -#: cmdline/apt-get.cc:2000 -#, c-format -msgid "Need to get %sB of source archives.\n" -msgstr "Потрібно завантажити %sB архівів з вихідними текстами.\n" - -#: cmdline/apt-get.cc:2006 -#, c-format -msgid "Fetch source %s\n" -msgstr "Завантаження вихідних текстів %s\n" - -#: cmdline/apt-get.cc:2037 -msgid "Failed to fetch some archives." -msgstr "Деякі архіви не вдалося завантажити." - -#: cmdline/apt-get.cc:2065 -#, c-format -msgid "Skipping unpack of already unpacked source in %s\n" -msgstr "" -"Розпакування вихідних текстів пропущено, тому що в %s вже перебувають " -"розпаковані вихідні тексти\n" - -#: cmdline/apt-get.cc:2077 -#, c-format -msgid "Unpack command '%s' failed.\n" -msgstr "Команда розпакування '%s' завершилася невдало.\n" - -#: cmdline/apt-get.cc:2078 -#, c-format -msgid "Check if the 'dpkg-dev' package is installed.\n" -msgstr "Перевірте, чи встановлений пакунок 'dpkg-dev'.\n" - -#: cmdline/apt-get.cc:2095 -#, c-format -msgid "Build command '%s' failed.\n" -msgstr "Команда побудови '%s' закінчилася невдало.\n" - -#: cmdline/apt-get.cc:2114 -msgid "Child process failed" -msgstr "Породжений процес завершився невдало" - -#: cmdline/apt-get.cc:2130 -msgid "Must specify at least one package to check builddeps for" -msgstr "" -"Для перевірки залежностей для побудови необхідно вказати як мінімум один " -"пакунок" - -#: cmdline/apt-get.cc:2158 -#, c-format -msgid "Unable to get build-dependency information for %s" -msgstr "Неможливо одержати інформацію про залежності для побудови %s" - -#: cmdline/apt-get.cc:2178 -#, c-format -msgid "%s has no build depends.\n" -msgstr "%s не має залежностей для побудови.\n" - -#: cmdline/apt-get.cc:2230 -#, c-format -msgid "" -"%s dependency for %s cannot be satisfied because the package %s cannot be " -"found" -msgstr "Залежність типу %s для %s не може бути задоволена, бо пакунок %s не знайдено" - -#: cmdline/apt-get.cc:2282 -#, c-format -msgid "" -"%s dependency for %s cannot be satisfied because no available versions of " -"package %s can satisfy version requirements" -msgstr "" -"Залежність типу %s для %s не може бути задоволена, бо ні одна з версій " -"пакунка %s не задовольняє умови" - -#: cmdline/apt-get.cc:2317 -#, c-format -msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new" -msgstr "" -"Не вдалося задовольнити залежність типу %s для пакунка %s: Встановлений " -"пакунок %s новіше, аніж треба" - -#: cmdline/apt-get.cc:2342 -#, c-format -msgid "Failed to satisfy %s dependency for %s: %s" -msgstr "Неможливо задовольнити залежність типу %s для пакунка %s: %s" - -#: cmdline/apt-get.cc:2356 -#, c-format -msgid "Build-dependencies for %s could not be satisfied." -msgstr "Залежності для побудови %s не можуть бути задоволені." - -#: cmdline/apt-get.cc:2360 -msgid "Failed to process build dependencies" -msgstr "Обробка залежностей для побудови закінчилася невдало" - -#: cmdline/apt-get.cc:2392 -msgid "Supported modules:" -msgstr "Підтримувані модулі:" - -#: cmdline/apt-get.cc:2433 -msgid "" -"Usage: apt-get [options] command\n" -" apt-get [options] install|remove pkg1 [pkg2 ...]\n" -" apt-get [options] source pkg1 [pkg2 ...]\n" -"\n" -"apt-get is a simple command line interface for downloading and\n" -"installing packages. The most frequently used commands are update\n" -"and install.\n" -"\n" -"Commands:\n" -" update - Retrieve new lists of packages\n" -" upgrade - Perform an upgrade\n" -" install - Install new packages (pkg is libc6 not libc6.deb)\n" -" remove - Remove packages\n" -" source - Download source archives\n" -" build-dep - Configure build-dependencies for source packages\n" -" dist-upgrade - Distribution upgrade, see apt-get(8)\n" -" dselect-upgrade - Follow dselect selections\n" -" clean - Erase downloaded archive files\n" -" autoclean - Erase old downloaded archive files\n" -" check - Verify that there are no broken dependencies\n" -"\n" -"Options:\n" -" -h This help text.\n" -" -q Loggable output - no progress indicator\n" -" -qq No output except for errors\n" -" -d Download only - do NOT install or unpack archives\n" -" -s No-act. Perform ordering simulation\n" -" -y Assume Yes to all queries and do not prompt\n" -" -f Attempt to continue if the integrity check fails\n" -" -m Attempt to continue if archives are unlocatable\n" -" -u Show a list of upgraded packages as well\n" -" -b Build the source package after fetching it\n" -" -V Show verbose version numbers\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -"See the apt-get(8), sources.list(5) and apt.conf(5) manual\n" -"pages for more information and options.\n" -" This APT has Super Cow Powers.\n" -msgstr "" -"Використання: apt-get [options] command\n" -" apt-get [options] install|remove pkg1 [pkg2 ...]\n" -" apt-get [options] source pkg1 [pkg2 ...]\n" -"\n" -"apt-get - простий інтерфейс командного рядка для завантаження й\n" -"встановлення пакунків. Найбільш часто використовувані команди - update \n" -"і install.\n" -"\n" -"Команди:\n" -" update - завантажити нові переліки пакунків\n" -" upgrade - виконати оновлення пакунків\n" -" install - встановити нові пакунки (назва пакунка вказується\n" -" як libc6, а не libc6.deb)\n" -" remove - видалити пакунок\n" -" source - завантажити архіви з вихідними текстами\n" -" build-dep - завантажити все необхідне для побудови зазначеного\n" -" пакунку з вихідних текстів\n" -" dist-upgrade - оновити всю систему, докладніше - в apt-get(8)\n" -" dselect-upgrade - керуватися вибором, зробленим в dselect'і\n" -" clean - видалити завантажені архіви\n" -" autoclean - видалити старі завантажені архіви\n" -" check - перевірити наявність порушених залежностей\n" -"\n" -"Опції:\n" -" -h Цей текст.\n" -" -q Виводити повідомлення, придатні для запису у файл журналу.\n" -" Не виводити індикатор прогресу\n" -" -qq Виводити тільки повідомлення про помилки\n" -" -d Тільки завантажити - не встановлювати й не розпаковувати архіви\n" -" -s Не виконувати дії насправді. Імітація роботи\n" -" -y Відповідати \"Так\" на всі питання. Самі питання при цьому не " -"виводяться\n" -" -f Продовжувати, навіть якщо перевірка цілісності не пройшла\n" -" -m Продовжувати, навіть якщо місце розташування архівів невідомо\n" -" -u Показувати список оновлюваних пакунків\n" -" -b Компілювати пакунок з вихідних текстів після їхнього завантаження\n" -" -V Показувати версії пакунків\n" -" -c=? Читати зазначений файл конфігурації\n" -" -o=? Встановити довільну опцію, наприклад, -o dir::cache=/tmp\n" -"Сторінки керівництва apt-get(8), sources.list(5) і apt.conf(5)\n" -"містять більше інформації.\n" -" This APT has Super Cow Powers.\n" - -#: cmdline/acqprogress.cc:55 -msgid "Hit " -msgstr "В кеші " - -#: cmdline/acqprogress.cc:79 -msgid "Get:" -msgstr "Отр:" - -#: cmdline/acqprogress.cc:110 -msgid "Ign " -msgstr "Ігн " - -#: cmdline/acqprogress.cc:114 -msgid "Err " -msgstr "Пом " - -#: cmdline/acqprogress.cc:135 -#, c-format -msgid "Fetched %sB in %s (%sB/s)\n" -msgstr "Отримано %sB за %sB (%sB/s)\n" - -#: cmdline/acqprogress.cc:225 -#, c-format -msgid " [Working]" -msgstr " [Йде робота]" - -#: cmdline/acqprogress.cc:271 -#, c-format -msgid "" -"Media change: please insert the disc labeled\n" -" '%s'\n" -"in the drive '%s' and press enter\n" -msgstr "Зміна носія: вставте диск з міткою '%s' у пристрій '%s' і натисніть Ввід\n" - -#: cmdline/apt-sortpkgs.cc:86 -msgid "Unknown package record!" -msgstr "Запис про невідомий пакунок!" - -#: cmdline/apt-sortpkgs.cc:150 -msgid "" -"Usage: apt-sortpkgs [options] file1 [file2 ...]\n" -"\n" -"apt-sortpkgs is a simple tool to sort package files. The -s option is used\n" -"to indicate what kind of file it is.\n" -"\n" -"Options:\n" -" -h This help text\n" -" -s Use source file sorting\n" -" -c=? Read this configuration file\n" -" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" -msgstr "" -"Використання: apt-sortpkgs [options] file1 [file2 ...]\n" -"\n" -"apt-sortpkgs - простий інструмент для сортування переліків пакунків. Опція -" -"s\n" -"використається, щоб вказати тип списку.\n" -"\n" -"Опції:\n" -" -h цей текст\n" -" -s сортувати список файлів з вихідними текстами\n" -" -c=? читати зазначений файл конфігурації\n" -" -o=? встановити довільну опцію, наприклад, -o dir::cache=/tmp\n" - -#: dselect/install:32 -msgid "Bad default setting!" -msgstr "Неправильне значення по замовчуванню!" - -#: dselect/install:51 dselect/install:83 dselect/install:87 dselect/install:93 -#: dselect/install:104 dselect/update:45 -msgid "Press enter to continue." -msgstr "Для продовження натисніть Ввід." - -#: dselect/install:100 -msgid "Some errors occurred while unpacking. I'm going to configure the" -msgstr "Під час розпакування виникли помилки. Буде продовжено процес налаштування" - -#: dselect/install:101 -msgid "packages that were installed. This may result in duplicate errors" -msgstr "встановлених пакунків. Це може призвести до повторення помилок або" - -#: dselect/install:102 -msgid "or errors caused by missing dependencies. This is OK, only the errors" -msgstr "виникненню нових через незадоволені залежності. Це нормально," - -#: dselect/install:103 -msgid "above this message are important. Please fix them and run [I]nstall again" -msgstr "" -"важливі тільки помилки, зазначені вище. Виправте їх і виконаєте установку ще " -"раз" - -#: dselect/update:30 -msgid "Merging available information" -msgstr "Об'єднання інформації про доступні пакунки" - -#: apt-inst/contrib/extracttar.cc:117 -msgid "Failed to create pipes" -msgstr "Не вдалося створити канали (pipes)" - -#: apt-inst/contrib/extracttar.cc:144 -msgid "Failed to exec gzip " -msgstr "Не вдалося виконати компресор gzip" - -#: apt-inst/contrib/extracttar.cc:181 apt-inst/contrib/extracttar.cc:207 -msgid "Corrupted archive" -msgstr "Пошкоджений архів" - -#: apt-inst/contrib/extracttar.cc:196 -msgid "Tar checksum failed, archive corrupted" -msgstr "Контрольна сума tar архіву невірна, архів пошкоджений" - -#: apt-inst/contrib/extracttar.cc:299 -#, c-format -msgid "Unknown TAR header type %u, member %s" -msgstr "Невідомий тип заголовку TAR %u, член %s" - -#: apt-inst/contrib/arfile.cc:73 -msgid "Invalid archive signature" -msgstr "Невірний підпис архіву" - -#: apt-inst/contrib/arfile.cc:81 -msgid "Error reading archive member header" -msgstr "Неможливо прочитати заголовок \"member\" архіву" - -#: apt-inst/contrib/arfile.cc:93 apt-inst/contrib/arfile.cc:105 -msgid "Invalid archive member header" -msgstr "Невірний заголовок \"member\" архіву" - -#: apt-inst/contrib/arfile.cc:131 -msgid "Archive is too short" -msgstr "Архів занадто малий" - -#: apt-inst/contrib/arfile.cc:135 -msgid "Failed to read the archive headers" -msgstr "Не вдалося прочитати заголовки архіву" - -#: apt-inst/filelist.cc:384 -msgid "DropNode called on still linked node" -msgstr "DropNode викликано для вузла, який ще використовується" - -#: apt-inst/filelist.cc:416 -msgid "Failed to locate the hash element!" -msgstr "Не вдалося знайти елемент хешу!" - -#: apt-inst/filelist.cc:463 -#, fuzzy -msgid "Failed to allocate diversion" -msgstr "Не вдалося створити diversion" - -#: apt-inst/filelist.cc:468 -msgid "Internal error in AddDiversion" -msgstr "Внутрішня помилка в AddDiversion" - -#: apt-inst/filelist.cc:481 -#, fuzzy, c-format -msgid "Trying to overwrite a diversion, %s -> %s and %s/%s" -msgstr "Спроба зміни diversion, %s -> %s і %s/%s" - -#: apt-inst/filelist.cc:510 -#, fuzzy, c-format -msgid "Double add of diversion %s -> %s" -msgstr "Подвійне додавання diversion %s -> %s" - -#: apt-inst/filelist.cc:553 -#, c-format -msgid "Duplicate conf file %s/%s" -msgstr "Копія конфігураційного файлу %s/%s" - -#: apt-inst/dirstream.cc:45 apt-inst/dirstream.cc:50 apt-inst/dirstream.cc:53 -#, c-format -msgid "Failed to write file %s" -msgstr "Не вдалося записати файл %s" - -#: apt-inst/dirstream.cc:96 apt-inst/dirstream.cc:104 -#, c-format -msgid "Failed to close file %s" -msgstr "Не вдалося закрити файл %s" - -#: apt-inst/extract.cc:96 apt-inst/extract.cc:167 -#, c-format -msgid "The path %s is too long" -msgstr "Шлях %s занадто довгий" - -#: apt-inst/extract.cc:127 -#, c-format -msgid "Unpacking %s more than once" -msgstr "Розпакування %s більш ніж один раз" - -#: apt-inst/extract.cc:137 -#, fuzzy, c-format -msgid "The directory %s is diverted" -msgstr "Тека %s входить до переліку diverted" - -#: apt-inst/extract.cc:147 -#, c-format -msgid "The package is trying to write to the diversion target %s/%s" -msgstr "Пакунок намагається писати у diversion %s/%s" - -#: apt-inst/extract.cc:157 apt-inst/extract.cc:300 -#, fuzzy -msgid "The diversion path is too long" -msgstr "Шлях diversion занадто довгий" - -#: apt-inst/extract.cc:243 -#, c-format -msgid "The directory %s is being replaced by a non-directory" -msgstr "Тека %s замінюється не текою" - -#: apt-inst/extract.cc:283 -#, fuzzy -msgid "Failed to locate node in its hash bucket" -msgstr "Не вдалося розмістити вузол у хеші" - -#: apt-inst/extract.cc:287 -msgid "The path is too long" -msgstr "Шлях занадто довгий" - -#: apt-inst/extract.cc:417 -#, c-format -msgid "Overwrite package match with no version for %s" -msgstr "Файли заміняються вмістом пакунка %s без версії" - -#: apt-inst/extract.cc:434 -#, c-format -msgid "File %s/%s overwrites the one in the package %s" -msgstr "Файл %s/%s перезаписує файл пакунку %s" - -#: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:750 -#: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/sourcelist.cc:324 -#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38 -#, c-format -msgid "Unable to read %s" -msgstr "Неможливо прочитати %s" - -#: apt-inst/extract.cc:494 -#, c-format -msgid "Unable to stat %s" -msgstr "Неможливо прочитати атрибути %s" - -#: apt-inst/deb/dpkgdb.cc:55 apt-inst/deb/dpkgdb.cc:61 -#, c-format -msgid "Failed to remove %s" -msgstr "Невдача видалення %s" - -#: apt-inst/deb/dpkgdb.cc:110 apt-inst/deb/dpkgdb.cc:112 -#, c-format -msgid "Unable to create %s" -msgstr "Неможливо створити %s" - -#: apt-inst/deb/dpkgdb.cc:118 -#, c-format -msgid "Failed to stat %sinfo" -msgstr "Не вдалося прочитати атрибути %sinfo" - -#: apt-inst/deb/dpkgdb.cc:123 -msgid "The info and temp directories need to be on the same filesystem" -msgstr "Теки info і temp повинні бути на тій самій файловій системі" - -#. Build the status cache -#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:643 -#: apt-pkg/pkgcachegen.cc:712 apt-pkg/pkgcachegen.cc:717 -#: apt-pkg/pkgcachegen.cc:840 -msgid "Reading package lists" -msgstr "Читання списків пакунків" - -#: apt-inst/deb/dpkgdb.cc:180 -#, c-format -msgid "Failed to change to the admin dir %sinfo" -msgstr "Невдача зміни до адміністративної теки %sinfo" - -#: apt-inst/deb/dpkgdb.cc:201 apt-inst/deb/dpkgdb.cc:355 -#: apt-inst/deb/dpkgdb.cc:448 -msgid "Internal error getting a package name" -msgstr "Внутрішня помилка отримання назви пакунку" - -#: apt-inst/deb/dpkgdb.cc:205 apt-inst/deb/dpkgdb.cc:386 -msgid "Reading file listing" -msgstr "Читання переліку файлів" - -#: apt-inst/deb/dpkgdb.cc:216 -#, c-format -msgid "" -"Failed to open the list file '%sinfo/%s'. If you cannot restore this file " -"then make it empty and immediately re-install the same version of the " -"package!" -msgstr "" -"Не вдалося відкрити list файл '%sinfo/%s'. Якщо Ви не можете відновити цей " -"файл, тоді зробіть його пустим і негайно перевстановіть ту ж саму версію " -"пакунка!" - -#: apt-inst/deb/dpkgdb.cc:229 apt-inst/deb/dpkgdb.cc:242 -#, c-format -msgid "Failed reading the list file %sinfo/%s" -msgstr "Невдача читання list файла %sinfo/%s" - -#: apt-inst/deb/dpkgdb.cc:266 -#, fuzzy -msgid "Internal error getting a node" -msgstr "Внутрішня помилка при отриманні Node" - -#: apt-inst/deb/dpkgdb.cc:309 -#, fuzzy, c-format -msgid "Failed to open the diversions file %sdiversions" -msgstr "Не вдалося відкрити файл diversions %sdiversions" - -#: apt-inst/deb/dpkgdb.cc:324 -msgid "The diversion file is corrupted" -msgstr "Файл diversion пошкоджений" - -#: apt-inst/deb/dpkgdb.cc:331 apt-inst/deb/dpkgdb.cc:336 -#: apt-inst/deb/dpkgdb.cc:341 -#, c-format -msgid "Invalid line in the diversion file: %s" -msgstr "Невірний рядок в файлі diversions: %s" - -#: apt-inst/deb/dpkgdb.cc:362 -#, fuzzy -msgid "Internal error adding a diversion" -msgstr "Внутрішня помилка при додаванні diversion" - -#: apt-inst/deb/dpkgdb.cc:383 -msgid "The pkg cache must be initialized first" -msgstr "Спочатку потрібно ініціалізувати кешу пакунків" - -#: apt-inst/deb/dpkgdb.cc:443 -#, fuzzy, c-format -msgid "Failed to find a Package: header, offset %lu" -msgstr "Не вдалося знайти пакунок: заголовок, зсув %lu" - -#: apt-inst/deb/dpkgdb.cc:465 -#, c-format -msgid "Bad ConfFile section in the status file. Offset %lu" -msgstr "Погана секція ConfFile у файлі стану. Зсув %lu" - -#: apt-inst/deb/dpkgdb.cc:470 -#, fuzzy, c-format -msgid "Error parsing MD5. Offset %lu" -msgstr "Помилка обробки MD5. Зсув %lu" - -#: apt-inst/deb/debfile.cc:42 apt-inst/deb/debfile.cc:47 -#, c-format -msgid "This is not a valid DEB archive, missing '%s' member" -msgstr "Невірний DEB архів, відсутній член '%s'" - -#: apt-inst/deb/debfile.cc:52 -#, c-format -msgid "This is not a valid DEB archive, it has no '%s' or '%s' member" -msgstr "Невірний DEB архів, відсутній член '%s' чи '%s'" - -#: apt-inst/deb/debfile.cc:112 -#, c-format -msgid "Couldn't change to %s" -msgstr "Неможливо змінити на %s" - -#: apt-inst/deb/debfile.cc:138 -msgid "Internal error, could not locate member" -msgstr "Внутрішня помилка, не можу знайти member" - -#: apt-inst/deb/debfile.cc:171 -msgid "Failed to locate a valid control file" -msgstr "Не вдалося знайти правильний файл control" - -#: apt-inst/deb/debfile.cc:256 -msgid "Unparsable control file" -msgstr "Неможливо обробити файл control" - -#: methods/cdrom.cc:114 -#, c-format -msgid "Unable to read the cdrom database %s" -msgstr "Неможливо прочитати базу %s з компакт-диску" - -#: methods/cdrom.cc:123 -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-ROM, 'apt-get " -"update' не можна використовувати для додавання нових компакт-дисків" - -#: methods/cdrom.cc:131 -msgid "Wrong CD-ROM" -msgstr "Невірний CD-ROM" - -#: methods/cdrom.cc:164 -#, c-format -msgid "Unable to unmount the CD-ROM in %s, it may still be in use." -msgstr "Неможливо відмонтувати CD-ROM в %s, можливо він все ще використовується." - -#: methods/cdrom.cc:169 -msgid "Disk not found." -msgstr "Диск не знайдено." - -#: methods/cdrom.cc:177 methods/file.cc:79 methods/rsh.cc:264 -msgid "File not found" -msgstr "Файл не знайдено" - -#: methods/copy.cc:42 methods/gpgv.cc:281 methods/gzip.cc:141 -#: methods/gzip.cc:150 -msgid "Failed to stat" -msgstr "Не вдалося отримати атрибути" - -#: methods/copy.cc:79 methods/gpgv.cc:278 methods/gzip.cc:147 -msgid "Failed to set modification time" -msgstr "Не вдалося встановити час модифікації" - -#: methods/file.cc:44 -msgid "Invalid URI, local URIS must not start with //" -msgstr "Невірне посилання, локальні посилання не повинні починатися з //" - -#. Login must be before getpeername otherwise dante won't work. -#: methods/ftp.cc:162 -msgid "Logging in" -msgstr "Реєструюсь в" - -#: methods/ftp.cc:168 -msgid "Unable to determine the peer name" -msgstr "Неможливо визначити назву вузла" - -#: methods/ftp.cc:173 -msgid "Unable to determine the local name" -msgstr "Неможливо визначити локальну назву" - -#: methods/ftp.cc:204 methods/ftp.cc:232 -#, c-format -msgid "The server refused the connection and said: %s" -msgstr "Сервер розірвав з'єднання і мовив: %s" - -#: methods/ftp.cc:210 -#, c-format -msgid "USER failed, server said: %s" -msgstr "USER завершилась невдачею, сервер мовив: %s" - -#: methods/ftp.cc:217 -#, c-format -msgid "PASS failed, server said: %s" -msgstr "PASS завершилась невдачею, сервер мовив: %s" - -#: methods/ftp.cc:237 -msgid "" -"A proxy server was specified but no login script, Acquire::ftp::ProxyLogin " -"is empty." -msgstr "" -"Вказано проксі-сервер, але відсутній скрипт логіну, Acquire::ftp::ProxyLogin " -"порожній." - -#: methods/ftp.cc:265 -#, c-format -msgid "Login script command '%s' failed, server said: %s" -msgstr "Команда '%s'скрипту логіна завершилась невдачею, сервер мовив: %s" - -#: methods/ftp.cc:291 -#, c-format -msgid "TYPE failed, server said: %s" -msgstr "TYPE завершилась невдачею, сервер мовив: %s" - -#: methods/ftp.cc:329 methods/ftp.cc:440 methods/rsh.cc:183 methods/rsh.cc:226 -msgid "Connection timeout" -msgstr "Час з'єднання вичерпався" - -#: methods/ftp.cc:335 -msgid "Server closed the connection" -msgstr "Сервер закрив з'єднання" - -#: methods/ftp.cc:338 apt-pkg/contrib/fileutl.cc:471 methods/rsh.cc:190 -msgid "Read error" -msgstr "Помилка читання" - -#: methods/ftp.cc:345 methods/rsh.cc:197 -msgid "A response overflowed the buffer." -msgstr "Відповідь переповнила буфер." - -#: methods/ftp.cc:362 methods/ftp.cc:374 -msgid "Protocol corruption" -msgstr "Спотворений протокол" - -#: methods/ftp.cc:446 apt-pkg/contrib/fileutl.cc:510 methods/rsh.cc:232 -msgid "Write error" -msgstr "Помилка запису" - -#: methods/ftp.cc:687 methods/ftp.cc:693 methods/ftp.cc:729 -msgid "Could not create a socket" -msgstr "Неможливо створити сокет (socket)" - -#: methods/ftp.cc:698 -msgid "Could not connect data socket, connection timed out" -msgstr "Неможливо під'єднати сокет (socket) з даними, час з'єднання вичерпався" - -#: methods/ftp.cc:704 -msgid "Could not connect passive socket." -msgstr "Неможливо під'єднати пасивний сокет (passive socket)." - -#: methods/ftp.cc:722 -#, fuzzy -msgid "getaddrinfo was unable to get a listening socket" -msgstr "Виклик getaddrinfo не зміг отримати сокет" - -#: methods/ftp.cc:736 -msgid "Could not bind a socket" -msgstr "Неможливо здійснити прив'язку(bind) сокету" - -#: methods/ftp.cc:740 -msgid "Could not listen on the socket" -msgstr "Неможливо утримувати з'єднання на сокеті" - -#: methods/ftp.cc:747 -msgid "Could not determine the socket's name" -msgstr "Не вдалося визначити назву сокета" - -#: methods/ftp.cc:779 -msgid "Unable to send PORT command" -msgstr "Неможливо відіслати команду PORT" - -#: methods/ftp.cc:789 -#, c-format -msgid "Unknown address family %u (AF_*)" -msgstr "Невідоме адресове сімейство %u (AF_*)" - -#: methods/ftp.cc:798 -#, c-format -msgid "EPRT failed, server said: %s" -msgstr "EPRT завершилась невдачею, сервер мовив: %s" - -#: methods/ftp.cc:818 -msgid "Data socket connect timed out" -msgstr "Час з'єднання з сокетом даних вичерпався" - -#: methods/ftp.cc:825 -msgid "Unable to accept connection" -msgstr "Неможливо прийняти з'єднання" - -#: methods/ftp.cc:864 methods/http.cc:958 methods/rsh.cc:303 -msgid "Problem hashing file" -msgstr "Проблема хешування файла" - -#: methods/ftp.cc:877 -#, c-format -msgid "Unable to fetch file, server said '%s'" -msgstr "Неможливо завантажити файл, сервер мовив: '%s'" - -#: methods/ftp.cc:892 methods/rsh.cc:322 -msgid "Data socket timed out" -msgstr "Час з'єднання з сокетом даних вичерпався" - -#: methods/ftp.cc:922 -#, c-format -msgid "Data transfer failed, server said '%s'" -msgstr "Передача даних обірвалася, сервер мовив '%s'" - -#. Get the files information -#: methods/ftp.cc:997 -msgid "Query" -msgstr "Черга" - -#: methods/ftp.cc:1109 -msgid "Unable to invoke " -msgstr "Неможливо викликати " - -#: methods/connect.cc:64 -#, c-format -msgid "Connecting to %s (%s)" -msgstr "З'єднання з %s (%s)" - -#: methods/connect.cc:71 -#, c-format -msgid "[IP: %s %s]" -msgstr "[IP: %s %s]" - -#: methods/connect.cc:80 -#, c-format -msgid "Could not create a socket for %s (f=%u t=%u p=%u)" -msgstr "Неможливо створити сокет для %s (f=%u t=%u p=%u)" - -#: methods/connect.cc:86 -#, c-format -msgid "Cannot initiate the connection to %s:%s (%s)." -msgstr "Неможливо ініціалізувати з'єднання з %s:%s (%s)." - -#: methods/connect.cc:93 -#, c-format -msgid "Could not connect to %s:%s (%s), connection timed out" -msgstr "Неможливо з'єднатися з %s:%s (%s), час з'єднання вичерпався" - -#: methods/connect.cc:108 -#, c-format -msgid "Could not connect to %s:%s (%s)." -msgstr "Неможливо під'єднатися до %s:%s (%s)." - -#. We say this mainly because the pause here is for the -#. ssh connection that is still going -#: methods/connect.cc:136 methods/rsh.cc:425 -#, c-format -msgid "Connecting to %s" -msgstr "З'єднання з %s" - -#: methods/connect.cc:167 -#, c-format -msgid "Could not resolve '%s'" -msgstr "Не можу визначити IP-адресу для %s" - -#: methods/connect.cc:173 -#, c-format -msgid "Temporary failure resolving '%s'" -msgstr "Тимчасова помилка при отриманні IP-адреси '%s'" - -#: methods/connect.cc:176 -#, c-format -msgid "Something wicked happened resolving '%s:%s' (%i)" -msgstr "Сталося щось дивне при спробі отримати IP-адресу для '%s:%s' (%i)" - -#: methods/connect.cc:223 -#, c-format -msgid "Unable to connect to %s %s:" -msgstr "Неможливо під'єднатися до %s %s:" - -#: methods/gpgv.cc:65 -#, c-format -msgid "Couldn't access keyring: '%s'" -msgstr "Неможливо отримати доступ до зв'язки ключів: '%s'" - -#: methods/gpgv.cc:100 -msgid "E: Argument list from Acquire::gpgv::Options too long. Exiting." -msgstr "E: Перелік аргументів з Acquire::gpgv::Options занадто довгий. Відміна." - -#: methods/gpgv.cc:204 -msgid "Internal error: Good signature, but could not determine key fingerprint?!" -msgstr "Внутрішня помилка: Підпис (signature) правильний, однак його відбиток визначити неможливо?!" - -#: methods/gpgv.cc:209 -msgid "At least one invalid signature was encountered." -msgstr "Знайдено як мінімум один невірний підпис." - -#: methods/gpgv.cc:213 -#, c-format -msgid "Could not execute '%s' to verify signature (is gnupg installed?)" -msgstr "Неможливо виконати '%s' для перевірки підпису (gnupg встановлено?)" - -#: methods/gpgv.cc:218 -msgid "Unknown error executing gpgv" -msgstr "Невідома помилка виконання gpgv" - -#: methods/gpgv.cc:249 -msgid "The following signatures were invalid:\n" -msgstr "Наступні підписи були невірними:\n" - -#: methods/gpgv.cc:256 -msgid "" -"The following signatures couldn't be verified because the public key is not " -"available:\n" -msgstr "" -"Ці підписи не можуть бути перевірені, оскільки відсутній відповідний " -"публічний ключ:\n" - -#: methods/gzip.cc:64 -#, c-format -msgid "Couldn't open pipe for %s" -msgstr "Неможливо відкрити канал (pipe) для %s" - -#: methods/gzip.cc:109 -#, c-format -msgid "Read error from %s process" -msgstr "Помилка читання з процесу %s" - -#: methods/http.cc:376 -msgid "Waiting for headers" -msgstr "Очікування на заголовки" - -#: methods/http.cc:522 -#, c-format -msgid "Got a single header line over %u chars" -msgstr "Отримано один рядок заголовку понад %u символів" - -#: methods/http.cc:530 -msgid "Bad header line" -msgstr "Поганий рядок заголовку" - -#: methods/http.cc:549 methods/http.cc:556 -msgid "The HTTP server sent an invalid reply header" -msgstr "HTTP сервер відіслав невірний заголовок 'reply'" - -#: methods/http.cc:585 -msgid "The HTTP server sent an invalid Content-Length header" -msgstr "HTTP сервер відіслав невірний заголовок 'Content-Length'" - -#: methods/http.cc:600 -msgid "The HTTP server sent an invalid Content-Range header" -msgstr "HTTP сервер відіслав невірний заголовок 'Content-Range'" - -#: methods/http.cc:602 -msgid "This HTTP server has broken range support" -msgstr "Цей HTTP сервер має поламану підтримку 'range'" - -#: methods/http.cc:626 -msgid "Unknown date format" -msgstr "Невідомий формат дати" - -#: methods/http.cc:773 -msgid "Select failed" -msgstr "Вибір не вдався" - -#: methods/http.cc:778 -msgid "Connection timed out" -msgstr "Час очікування з'єднання вийшов" - -#: methods/http.cc:801 -msgid "Error writing to output file" -msgstr "Помилка запису в вихідний файл" - -#: methods/http.cc:832 -#, fuzzy -msgid "Error writing to file" -msgstr "Помилка запису в файл" - -#: methods/http.cc:860 -#, fuzzy -msgid "Error writing to the file" -msgstr "Помилка запису в файл" - -#: methods/http.cc:874 -msgid "Error reading from server. Remote end closed connection" -msgstr "Помилка читання з сервера. Віддалена сторона закрила з'єднання" - -#: methods/http.cc:876 -msgid "Error reading from server" -msgstr "Помилка читання з сервера" - -#: methods/http.cc:1107 -msgid "Bad header data" -msgstr "Погана заголовкова інформація" - -#: methods/http.cc:1124 -msgid "Connection failed" -msgstr "З'єднання не вдалося" - -#: methods/http.cc:1215 -msgid "Internal error" -msgstr "Внутрішня помилка" - -#: apt-pkg/contrib/mmap.cc:82 -msgid "Can't mmap an empty file" -msgstr "Неможливо відобразити в пам'яті порожній файл" - -#: apt-pkg/contrib/mmap.cc:87 -#, c-format -msgid "Couldn't make mmap of %lu bytes" -msgstr "Неможливо відобразити в пам'яті %lu байт" - -#: apt-pkg/contrib/strutl.cc:938 -#, c-format -msgid "Selection %s not found" -msgstr "Вибір %s не знайдено" - -#: apt-pkg/contrib/configuration.cc:436 -#, c-format -msgid "Unrecognized type abbreviation: '%c'" -msgstr "Нерозпізнаваний тип абревіатури: '%c'" - -#: apt-pkg/contrib/configuration.cc:494 -#, c-format -msgid "Opening configuration file %s" -msgstr "Відкривається конфігураційний файл %s" - -#: apt-pkg/contrib/configuration.cc:512 -#, c-format -msgid "Line %d too long (max %d)" -msgstr "Рядок %d занадто довгий (максимум %d)" - -#: apt-pkg/contrib/configuration.cc:608 -#, c-format -msgid "Syntax error %s:%u: Block starts with no name." -msgstr "Синтаксична помилка %s:%u: Блок починається без назви." - -#: apt-pkg/contrib/configuration.cc:627 -#, c-format -msgid "Syntax error %s:%u: Malformed tag" -msgstr "Синтаксична помилка %s:%u: спотворена мітка" - -#: apt-pkg/contrib/configuration.cc:644 -#, c-format -msgid "Syntax error %s:%u: Extra junk after value" -msgstr "Синтаксична помилка %s:%u: зайві символи після величини" - -#: apt-pkg/contrib/configuration.cc:684 -#, c-format -msgid "Syntax error %s:%u: Directives can only be done at the top level" -msgstr "" -"Синтаксична помилка %s:%u: Директиви можуть бути виконані тільки на " -"найвищому рівні" - -#: apt-pkg/contrib/configuration.cc:691 -#, c-format -msgid "Syntax error %s:%u: Too many nested includes" -msgstr "Синтаксична помилка %s:%u: Забагато вмонтованих включень" - -#: apt-pkg/contrib/configuration.cc:695 apt-pkg/contrib/configuration.cc:700 -#, c-format -msgid "Syntax error %s:%u: Included from here" -msgstr "Синтаксична помилка %s:%u: Включена звідси" - -#: apt-pkg/contrib/configuration.cc:704 -#, c-format -msgid "Syntax error %s:%u: Unsupported directive '%s'" -msgstr "Синтаксична помилка %s:%u: Директива '%s' не підтримується" - -#: apt-pkg/contrib/configuration.cc:738 -#, c-format -msgid "Syntax error %s:%u: Extra junk at end of file" -msgstr "Синтаксична помилка %s:%u: зайві символи в кінці файла" - -#: apt-pkg/contrib/progress.cc:154 -#, c-format -msgid "%c%s... Error!" -msgstr "%c%s... Помилка!" - -#: apt-pkg/contrib/progress.cc:156 -#, c-format -msgid "%c%s... Done" -msgstr "%c%s... Виконано" - -#: apt-pkg/contrib/cmndline.cc:80 -#, c-format -msgid "Command line option '%c' [from %s] is not known." -msgstr "Невідомий параметр '%c' [з %s] командного рядка." - -#: apt-pkg/contrib/cmndline.cc:106 apt-pkg/contrib/cmndline.cc:114 -#: apt-pkg/contrib/cmndline.cc:122 -#, c-format -msgid "Command line option %s is not understood" -msgstr "Незрозумілий параметр %s командного рядка" - -#: apt-pkg/contrib/cmndline.cc:127 -#, c-format -msgid "Command line option %s is not boolean" -msgstr "Не логічний параметр %s командного рядка" - -#: apt-pkg/contrib/cmndline.cc:166 apt-pkg/contrib/cmndline.cc:187 -#, c-format -msgid "Option %s requires an argument." -msgstr "Параметр %s потребує аргументу." - -#: apt-pkg/contrib/cmndline.cc:201 apt-pkg/contrib/cmndline.cc:207 -#, c-format -msgid "Option %s: Configuration item specification must have an =<val>." -msgstr "" - -#: apt-pkg/contrib/cmndline.cc:237 -#, c-format -msgid "Option %s requires an integer argument, not '%s'" -msgstr "Параметр %s потребує цілочисленого аргумент, а не '%s'" - -#: apt-pkg/contrib/cmndline.cc:268 -#, c-format -msgid "Option '%s' is too long" -msgstr "Параметр '%s' занадто довгий" - -#: apt-pkg/contrib/cmndline.cc:301 -#, c-format -msgid "Sense %s is not understood, try true or false." -msgstr "Незрозумілий вираз %s , спробуйте true чи false." - -#: apt-pkg/contrib/cmndline.cc:351 -#, c-format -msgid "Invalid operation %s" -msgstr "Невірна дія %s" - -#: apt-pkg/contrib/cdromutl.cc:55 -#, c-format -msgid "Unable to stat the mount point %s" -msgstr "Неможливо прочитати атрибути точки монтування %s" - -#: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:427 apt-pkg/clean.cc:44 -#, c-format -msgid "Unable to change to %s" -msgstr "Неможливо зробити зміни у %s" - -#: apt-pkg/contrib/cdromutl.cc:190 -msgid "Failed to stat the cdrom" -msgstr "Не вдалося прочитати атрибути cdrom" - -#: apt-pkg/contrib/fileutl.cc:82 -#, c-format -msgid "Not using locking for read only lock file %s" -msgstr "" -"Блокування не використовується, так як файл блокування %s доступний тільки " -"для читання" - -#: apt-pkg/contrib/fileutl.cc:87 -#, c-format -msgid "Could not open lock file %s" -msgstr "Неможливо відкрити lock файл %s" - -#: apt-pkg/contrib/fileutl.cc:105 -#, c-format -msgid "Not using locking for nfs mounted lock file %s" -msgstr "" -"Блокування не використовується, так як файл блокування %s знаходиться на " -"файловій системі nfs" - -#: apt-pkg/contrib/fileutl.cc:109 -#, c-format -msgid "Could not get lock %s" -msgstr "Неможливо отримати lock %s" - -#: apt-pkg/contrib/fileutl.cc:377 -#, c-format -msgid "Waited for %s but it wasn't there" -msgstr "Очікується на %s але його тут немає" - -#: apt-pkg/contrib/fileutl.cc:387 -#, c-format -msgid "Sub-process %s received a segmentation fault." -msgstr "Підпроцес %s отримав segmentation fault." - -#: apt-pkg/contrib/fileutl.cc:390 -#, c-format -msgid "Sub-process %s returned an error code (%u)" -msgstr "Підпроцес %s повернув код помилки (%u)" - -#: apt-pkg/contrib/fileutl.cc:392 -#, c-format -msgid "Sub-process %s exited unexpectedly" -msgstr "Підпроцес %s раптово завершився" - -#: apt-pkg/contrib/fileutl.cc:436 -#, c-format -msgid "Could not open file %s" -msgstr "Неможливо відкрити файл %s" - -#: apt-pkg/contrib/fileutl.cc:492 -#, c-format -msgid "read, still have %lu to read but none left" -msgstr "помилка при читанні, мали прочитати ще %lu байт, але нічого більше немає" - -#: apt-pkg/contrib/fileutl.cc:522 -#, c-format -msgid "write, still have %lu to write but couldn't" -msgstr "помилка при записі, мали записати ще %lu байт, але не змогли" - -#: apt-pkg/contrib/fileutl.cc:597 -msgid "Problem closing the file" -msgstr "Проблема з закриттям файла" - -#: apt-pkg/contrib/fileutl.cc:603 -msgid "Problem unlinking the file" -msgstr "Проблема з роз'єднанням файла" - -#: apt-pkg/contrib/fileutl.cc:614 -msgid "Problem syncing the file" -msgstr "Проблема з синхронізацією файла" - -#: apt-pkg/pkgcache.cc:126 -msgid "Empty package cache" -msgstr "Кеш пакунків порожній" - -#: apt-pkg/pkgcache.cc:132 -msgid "The package cache file is corrupted" -msgstr "Файл кешу пакунків пошкоджений" - -#: apt-pkg/pkgcache.cc:137 -msgid "The package cache file is an incompatible version" -msgstr "Файл кешу пакунків має несумісну версію" - -#: apt-pkg/pkgcache.cc:142 -#, c-format -msgid "This APT does not support the versioning system '%s'" -msgstr "APT не підтримує систему версій '%s'" - -#: apt-pkg/pkgcache.cc:147 -msgid "The package cache was built for a different architecture" -msgstr "Кеш пакунків був побудований для іншої архітектури" - -#: apt-pkg/pkgcache.cc:218 -msgid "Depends" -msgstr "Залежить (depends)" - -#: apt-pkg/pkgcache.cc:218 -msgid "PreDepends" -msgstr "Попередньо-залежить (PreDepends)" - -#: apt-pkg/pkgcache.cc:218 -msgid "Suggests" -msgstr "Пропонує (suggests)" - -#: apt-pkg/pkgcache.cc:219 -msgid "Recommends" -msgstr "Рекомендує (recommends)" - -#: apt-pkg/pkgcache.cc:219 -msgid "Conflicts" -msgstr "Конфліктує (conflicts)" - -#: apt-pkg/pkgcache.cc:219 -msgid "Replaces" -msgstr "Замінює (replaces)" - -#: apt-pkg/pkgcache.cc:220 -msgid "Obsoletes" -msgstr "Заміщує (obsoletes)" - -#: apt-pkg/pkgcache.cc:231 -msgid "important" -msgstr "важливий (important)" - -#: apt-pkg/pkgcache.cc:231 -msgid "required" -msgstr "необхідний (required)" - -#: apt-pkg/pkgcache.cc:231 -msgid "standard" -msgstr "стандартний (standard)" - -#: apt-pkg/pkgcache.cc:232 -msgid "optional" -msgstr "необов'язковий (optional)" - -#: apt-pkg/pkgcache.cc:232 -msgid "extra" -msgstr "додатковий (extra)" - -#: apt-pkg/depcache.cc:61 apt-pkg/depcache.cc:90 -msgid "Building dependency tree" -msgstr "Побудова дерева залежностей" - -#: apt-pkg/depcache.cc:62 -msgid "Candidate versions" -msgstr "Версії кандидатів" - -#: apt-pkg/depcache.cc:91 -msgid "Dependency generation" -msgstr "Ґенерація залежностей" - -#: apt-pkg/tagfile.cc:106 -#, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Неможливо обробити файл %s пакунку (1)" - -#: apt-pkg/tagfile.cc:193 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Неможливо обробити файл %s пакунку (2)" - -#: apt-pkg/sourcelist.cc:94 -#, c-format -msgid "Malformed line %lu in source list %s (URI)" -msgstr "Спотворений рядок %lu в переліку джерел %s (проблема в URI)" - -#: apt-pkg/sourcelist.cc:96 -#, c-format -msgid "Malformed line %lu in source list %s (dist)" -msgstr "Спотворений рядок %lu в переліку джерел %s (dist)" - -#: apt-pkg/sourcelist.cc:99 -#, c-format -msgid "Malformed line %lu in source list %s (URI parse)" -msgstr "Спотворений рядок %lu в переліку джерел %s (URI parse)" - -#: apt-pkg/sourcelist.cc:105 -#, c-format -msgid "Malformed line %lu in source list %s (absolute dist)" -msgstr "Спотворений рядок %lu в переліку джерел %s (absolute dist)" - -#: apt-pkg/sourcelist.cc:112 -#, c-format -msgid "Malformed line %lu in source list %s (dist parse)" -msgstr "Спотворений рядок %lu в переліку джерел %s (dist parse)" - -#: apt-pkg/sourcelist.cc:203 -#, c-format -msgid "Opening %s" -msgstr "Відкривається %s" - -#: apt-pkg/sourcelist.cc:220 apt-pkg/cdrom.cc:426 -#, c-format -msgid "Line %u too long in source list %s." -msgstr "Рядок %u в переліку джерел %s є занадто довгим." - -#: apt-pkg/sourcelist.cc:240 -#, c-format -msgid "Malformed line %u in source list %s (type)" -msgstr "Спотворений рядок %u в переліку джерел %s (type)" - -#: apt-pkg/sourcelist.cc:244 -#, c-format -msgid "Type '%s' is not known on line %u in source list %s" -msgstr "Невідомий тип '%s' в рядку %u з переліку джерел %s" - -#: apt-pkg/sourcelist.cc:252 apt-pkg/sourcelist.cc:255 -#, c-format -msgid "Malformed line %u in source list %s (vendor id)" -msgstr "Спотворений рядок %u в переліку джерел %s (vendor id)" - -#: apt-pkg/packagemanager.cc:402 -#, c-format -msgid "" -"This installation run will require temporarily removing the essential " -"package %s due to a Conflicts/Pre-Depends loop. This is often bad, but if " -"you really want to do it, activate the APT::Force-LoopBreak option." -msgstr "" -"Для виконання даного встановлення потрібне тимчасове видалення невіддільного " -"пакунку %s через конфлікти/петлеві пре-залежності (Pre-Depends loop). Загалом, це є " -"поганою ідеєю, однак, якщо Ви дійсно бажаєте це зробити, активуйте параметр APT::Force-" -"LoopBreak." - -#: apt-pkg/pkgrecords.cc:37 -#, c-format -msgid "Index file type '%s' is not supported" -msgstr "Тип '%s' індексного файлу не підтримується" - -#: apt-pkg/algorithms.cc:241 -#, c-format -msgid "The package %s needs to be reinstalled, but I can't find an archive for it." -msgstr "" -"Необхідно перевстановити пакунок %s, але я не можу знайти архіву для " -"нього." - -#: apt-pkg/algorithms.cc:1059 -msgid "" -"Error, pkgProblemResolver::Resolve generated breaks, this may be caused by " -"held packages." -msgstr "" -"Помилка, pkgProblemResolver::Resolve згенерував зупинку, це може бути " -"пов'язано з зафіксованими пакунками." - -#: apt-pkg/algorithms.cc:1061 -msgid "Unable to correct problems, you have held broken packages." -msgstr "Неможливо усунути проблеми, Ви маєте поламані зафіксовані пакунки." - -#: apt-pkg/acquire.cc:62 -#, c-format -msgid "Lists directory %spartial is missing." -msgstr "Lists тека %spartial відсутня." - -#: apt-pkg/acquire.cc:66 -#, c-format -msgid "Archive directory %spartial is missing." -msgstr "Архівна тека %spartial відсутня." - -#. only show the ETA if it makes sense -#. two days -#: apt-pkg/acquire.cc:823 -#, fuzzy, c-format -msgid "Retrieving file %li of %li (%s remaining)" -msgstr "Завантажується файл %li з %li (%s залишилось)" - -#: apt-pkg/acquire.cc:825 -#, fuzzy, c-format -msgid "Retrieving file %li of %li" -msgstr "Завантажується файл %li з %li" - -#: apt-pkg/acquire-worker.cc:113 -#, c-format -msgid "The method driver %s could not be found." -msgstr "Драйвер для методу %s не знайдено." - -#: apt-pkg/acquire-worker.cc:162 -#, c-format -msgid "Method %s did not start correctly" -msgstr "Метод %s стартував некоректним чином" - -#: apt-pkg/acquire-worker.cc:377 -#, c-format -msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter." -msgstr "Будь ласка, вставте диск з міткою '%s' в привід '%s' і натисніть Enter." - -#: apt-pkg/init.cc:120 -#, c-format -msgid "Packaging system '%s' is not supported" -msgstr "Пакункова система '%s' не підтримується" - -#: apt-pkg/init.cc:136 -msgid "Unable to determine a suitable packaging system type" -msgstr "Неможливо визначити тип необхідної пакункової системи" - -#: apt-pkg/clean.cc:61 -#, c-format -msgid "Unable to stat %s." -msgstr "Неможливо прочитати атрибути %s." - -#: apt-pkg/srcrecords.cc:48 -msgid "You must put some 'source' URIs in your sources.list" -msgstr "Ви повинні помістити деякі \"джерельні\" посилання в Ваш sources.list" - -#: apt-pkg/cachefile.cc:73 -msgid "The package lists or status file could not be parsed or opened." -msgstr "Не можу обробити/відкрити перелік пакунків або файл стану." - -#: apt-pkg/cachefile.cc:77 -msgid "You may want to run apt-get update to correct these problems" -msgstr "Можливо, Ви захочете запустити 'apt-get update' для виправлення цих помилок" - -#: apt-pkg/policy.cc:269 -msgid "Invalid record in the preferences file, no Package header" -msgstr "Невірний запис в preferences файлі, відсутній заголовок Package" - -#: apt-pkg/policy.cc:291 -#, c-format -msgid "Did not understand pin type %s" -msgstr "Не зрозумів тип %s для pin" - -#: apt-pkg/policy.cc:299 -msgid "No priority (or zero) specified for pin" -msgstr "Не встановлено пріоритету (або встановлено 0) для pin" - -#: apt-pkg/pkgcachegen.cc:74 -msgid "Cache has an incompatible versioning system" -msgstr "Кеш має несумісну систему версій" - -#: apt-pkg/pkgcachegen.cc:117 -#, c-format -msgid "Error occurred while processing %s (NewPackage)" -msgstr "Виникла помилка під час обробки %s (NewPackage)" - -#: apt-pkg/pkgcachegen.cc:129 -#, c-format -msgid "Error occurred while processing %s (UsePackage1)" -msgstr "Виникла помилка під час обробки %s (UsePackage1)" - -#: apt-pkg/pkgcachegen.cc:150 -#, c-format -msgid "Error occurred while processing %s (UsePackage2)" -msgstr "Виникла помилка під час обробки %s (UsePackage2)" - -#: apt-pkg/pkgcachegen.cc:154 -#, c-format -msgid "Error occurred while processing %s (NewFileVer1)" -msgstr "Виникла помилка під час обробки %s (NewFileVer1)" - -#: apt-pkg/pkgcachegen.cc:184 -#, c-format -msgid "Error occurred while processing %s (NewVersion1)" -msgstr "Виникла помилка під час обробки %s (NewVersion1)" - -#: apt-pkg/pkgcachegen.cc:188 -#, c-format -msgid "Error occurred while processing %s (UsePackage3)" -msgstr "Виникла помилка під час обробки %s (UsePackage3)" - -#: apt-pkg/pkgcachegen.cc:192 -#, c-format -msgid "Error occurred while processing %s (NewVersion2)" -msgstr "Виникла помилка під час обробки %s (NewVersion2)" - -#: apt-pkg/pkgcachegen.cc:207 -msgid "Wow, you exceeded the number of package names this APT is capable of." -msgstr "ОГО! Ви перевищили граничну кількість назв пакунків, які APT в змозі обробити." - -#: apt-pkg/pkgcachegen.cc:210 -msgid "Wow, you exceeded the number of versions this APT is capable of." -msgstr "ОГО! Ви перевищили граничну кількість версій, які APT в змозі обробити." - -#: apt-pkg/pkgcachegen.cc:213 -msgid "Wow, you exceeded the number of dependencies this APT is capable of." -msgstr "ОГО! Ви перевищили граничну кількість залежностей, які APT в змозі обробити." - -#: apt-pkg/pkgcachegen.cc:241 -#, c-format -msgid "Error occurred while processing %s (FindPkg)" -msgstr "Виникла помилка під час обробки %s (FindPkg)" - -#: apt-pkg/pkgcachegen.cc:254 -#, c-format -msgid "Error occurred while processing %s (CollectFileProvides)" -msgstr "Виникла помилка під час обробки %s (CollectFileProvides)" - -#: apt-pkg/pkgcachegen.cc:260 -#, c-format -msgid "Package %s %s was not found while processing file dependencies" -msgstr "Під час обробки файла залежностей не знайдено пакунка %s %s" - -#: apt-pkg/pkgcachegen.cc:574 -#, c-format -msgid "Couldn't stat source package list %s" -msgstr "Не вдалося отримати атрибути переліку джерельних пакунків %s" - -#: apt-pkg/pkgcachegen.cc:658 -msgid "Collecting File Provides" -msgstr "Збирання файлу Provides" - -#: apt-pkg/pkgcachegen.cc:785 apt-pkg/pkgcachegen.cc:792 -msgid "IO Error saving source cache" -msgstr "Помилка вводу/виводу під час збереження джерельного кешу" - -#: apt-pkg/acquire-item.cc:126 -#, c-format -msgid "rename failed, %s (%s -> %s)." -msgstr "не вдалося перейменувати, %s (%s -> %s)." - -#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:945 -msgid "MD5Sum mismatch" -msgstr "Невідповідність MD5Sum" - -#: apt-pkg/acquire-item.cc:640 -msgid "There is no public key available for the following key IDs:\n" -msgstr "Немає публічних ключів для таких ідентифікаторів:\n" - -#: apt-pkg/acquire-item.cc:753 -#, c-format -msgid "" -"I wasn't able to locate a file for the %s package. This might mean you need " -"to manually fix this package. (due to missing arch)" -msgstr "" -"Не можу знайти файл для пакунку %s. Можливо, Вам доведеться власноруч " -"виправити цей пакунок. (відсутня архітектура)" - -#: apt-pkg/acquire-item.cc:812 -#, c-format -msgid "" -"I wasn't able to locate file for the %s package. This might mean you need to " -"manually fix this package." -msgstr "" -"Не можу знайти файл для пакунку %s. Можливо, Вам доведеться власноруч " -"виправити цей пакунок." - -#: apt-pkg/acquire-item.cc:848 -#, c-format -msgid "The package index files are corrupted. No Filename: field for package %s." -msgstr "Індексні файли пакунків пошкоджені. Не знайдено поле Filename: для пакунку %s." - -#: apt-pkg/acquire-item.cc:935 -msgid "Size mismatch" -msgstr "Невідповідність розміру" - -#: apt-pkg/vendorlist.cc:66 -#, c-format -msgid "Vendor block %s contains no fingerprint" -msgstr "Блок постачальника %s не містить відбитку (fingerprint)" - -#: apt-pkg/cdrom.cc:507 -#, c-format -msgid "" -"Using CD-ROM mount point %s\n" -"Mounting CD-ROM\n" -msgstr "" -"Використовую %s в якості точки монтування для CD-ROM\n" -"Монтування CD-ROM\n" - -#: apt-pkg/cdrom.cc:516 apt-pkg/cdrom.cc:598 -msgid "Identifying.. " -msgstr "Ідентифікація.. " - -#: apt-pkg/cdrom.cc:541 -#, c-format -msgid "Stored label: %s \n" -msgstr "Записано мітку: %s \n" - -#: apt-pkg/cdrom.cc:561 -#, c-format -msgid "Using CD-ROM mount point %s\n" -msgstr "Використовую %s в якості точки монтування для CD-ROM\n" - -#: apt-pkg/cdrom.cc:579 -msgid "Unmounting CD-ROM\n" -msgstr "Відмонтування CD-ROM\n" - -#: apt-pkg/cdrom.cc:583 -msgid "Waiting for disc...\n" -msgstr "Чекаю на диск...\n" - -#. Mount the new CDROM -#: apt-pkg/cdrom.cc:591 -msgid "Mounting CD-ROM...\n" -msgstr "Монтування CD-ROM...\n" - -#: apt-pkg/cdrom.cc:609 -msgid "Scanning disc for index files..\n" -msgstr "Пошук індексних файлів на диску..\n" - -#: apt-pkg/cdrom.cc:647 -#, c-format -msgid "Found %i package indexes, %i source indexes and %i signatures\n" -msgstr "Знайдено %i індексів пакунків, %i індексів джерел і %i підписів\n" - -#: apt-pkg/cdrom.cc:710 -msgid "That is not a valid name, try again.\n" -msgstr "Не є вірною назвою, спробуйте ще.\n" - -#: apt-pkg/cdrom.cc:726 -#, c-format -msgid "" -"This disc is called: \n" -"'%s'\n" -msgstr "" -"Назва цього диску: \n" -"'%s'\n" - -#: apt-pkg/cdrom.cc:730 -msgid "Copying package lists..." -msgstr "Копіюються списки пакунків..." - -#: apt-pkg/cdrom.cc:754 -msgid "Writing new source list\n" -msgstr "Записується новий перелік джерел\n" - -#: apt-pkg/cdrom.cc:763 -msgid "Source list entries for this disc are:\n" -msgstr "Перелік джерел для цього диску:\n" - -#: apt-pkg/cdrom.cc:803 -msgid "Unmounting CD-ROM..." -msgstr "Відмонтування CD-ROM..." - -#: apt-pkg/indexcopy.cc:261 -#, c-format -msgid "Wrote %i records.\n" -msgstr "Збережено %i записів.\n" - -#: apt-pkg/indexcopy.cc:263 -#, c-format -msgid "Wrote %i records with %i missing files.\n" -msgstr "Збережено %i записів з %i відсутніми файлами.\n" - -#: apt-pkg/indexcopy.cc:266 -#, c-format -msgid "Wrote %i records with %i mismatched files\n" -msgstr "Збережено %i записів з %i невідповідними файлам\n" - -#: apt-pkg/indexcopy.cc:269 -#, c-format -msgid "Wrote %i records with %i missing files and %i mismatched files\n" -msgstr "Збережено %i записів з %i відсутніми і %i невідповідними файлами\n" - -#: apt-pkg/deb/dpkgpm.cc:358 -#, c-format -msgid "Preparing %s" -msgstr "Підготовка %s" - -#: apt-pkg/deb/dpkgpm.cc:359 -#, c-format -msgid "Unpacking %s" -msgstr "Розпаковується %s" - -#: apt-pkg/deb/dpkgpm.cc:364 -#, c-format -msgid "Preparing to configure %s" -msgstr "Підготовка до налаштування %s" - -#: apt-pkg/deb/dpkgpm.cc:365 -#, c-format -msgid "Configuring %s" -msgstr "Налаштовується %s" - -#: apt-pkg/deb/dpkgpm.cc:366 -#, c-format -msgid "Installed %s" -msgstr "%s встановлено" - -#: apt-pkg/deb/dpkgpm.cc:371 -#, c-format -msgid "Preparing for removal of %s" -msgstr "Підготовка до видалення %s" - -#: apt-pkg/deb/dpkgpm.cc:372 -#, c-format -msgid "Removing %s" -msgstr "Видаляється %s" - -#: apt-pkg/deb/dpkgpm.cc:373 -#, c-format -msgid "Removed %s" -msgstr "%s видалено" - -#: apt-pkg/deb/dpkgpm.cc:378 -#, c-format -msgid "Preparing to completely remove %s" -msgstr "Підготовка до повного видалення %s" - -#: apt-pkg/deb/dpkgpm.cc:379 -#, c-format -msgid "Completely removed %s" -msgstr "%s повністю видалено" - -#: methods/rsh.cc:330 -msgid "Connection closed prematurely" -msgstr "З'єднання завершено передчасно" - diff --git a/share/debian-archive.gpg b/share/debian-archive.gpg Binary files differindex da1aa5e97..bb5ed5033 100644 --- a/share/debian-archive.gpg +++ b/share/debian-archive.gpg |