diff options
323 files changed, 12367 insertions, 7644 deletions
diff --git a/apt-inst/contrib/arfile.h b/apt-inst/contrib/arfile.h index 0f62a34a0..f53356847 100644 --- a/apt-inst/contrib/arfile.h +++ b/apt-inst/contrib/arfile.h @@ -17,6 +17,7 @@ #include <string> +#include <apt-pkg/macros.h> #ifndef APT_8_CLEANER_HEADERS #include <apt-pkg/fileutl.h> #endif @@ -61,7 +62,11 @@ struct ARArchive::Member unsigned long long Size; // Location of the data. +#if APT_PKG_ABI >= 413 + unsigned long long Start; +#else unsigned long Start; +#endif Member *Next; Member() : Start(0), Next(0) {}; diff --git a/apt-inst/contrib/extracttar.cc b/apt-inst/contrib/extracttar.cc index 0ba3f0521..be0b69d96 100644 --- a/apt-inst/contrib/extracttar.cc +++ b/apt-inst/contrib/extracttar.cc @@ -60,9 +60,13 @@ struct ExtractTar::TarHeader // ExtractTar::ExtractTar - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -ExtractTar::ExtractTar(FileFd &Fd,unsigned long Max,string DecompressionProgram) : File(Fd), - MaxInSize(Max), DecompressProg(DecompressionProgram) - +#if APT_PKG_ABI >= 413 +ExtractTar::ExtractTar(FileFd &Fd,unsigned long long Max,string DecompressionProgram) + : File(Fd), MaxInSize(Max), DecompressProg(DecompressionProgram) +#else +ExtractTar::ExtractTar(FileFd &Fd,unsigned long Max,string DecompressionProgram) + : File(Fd), MaxInSize(Max), DecompressProg(DecompressionProgram) +#endif { GZPid = -1; Eof = false; @@ -267,7 +271,7 @@ bool ExtractTar::Go(pkgDirStream &Stream) case GNU_LongLink: { - unsigned long Length = Itm.Size; + unsigned long long Length = Itm.Size; unsigned char Block[512]; while (Length > 0) { @@ -286,7 +290,7 @@ bool ExtractTar::Go(pkgDirStream &Stream) case GNU_LongName: { - unsigned long Length = Itm.Size; + unsigned long long Length = Itm.Size; unsigned char Block[512]; while (Length > 0) { @@ -315,11 +319,11 @@ bool ExtractTar::Go(pkgDirStream &Stream) return false; // Copy the file over the FD - unsigned long Size = Itm.Size; + unsigned long long Size = Itm.Size; while (Size != 0) { unsigned char Junk[32*1024]; - unsigned long Read = min(Size,(unsigned long)sizeof(Junk)); + unsigned long Read = min(Size, (unsigned long long)sizeof(Junk)); if (InFd.Read(Junk,((Read+511)/512)*512) == false) return false; diff --git a/apt-inst/contrib/extracttar.h b/apt-inst/contrib/extracttar.h index 4b29df314..57be956bd 100644 --- a/apt-inst/contrib/extracttar.h +++ b/apt-inst/contrib/extracttar.h @@ -15,6 +15,7 @@ #define PKGLIB_EXTRACTTAR_H #include <apt-pkg/fileutl.h> +#include <apt-pkg/macros.h> #include <string> @@ -39,7 +40,11 @@ class ExtractTar GNU_LongLink = 'K',GNU_LongName = 'L'}; FileFd &File; +#if APT_PKG_ABI >= 413 + unsigned long long MaxInSize; +#else unsigned long MaxInSize; +#endif int GZPid; FileFd InFd; bool Eof; @@ -52,8 +57,12 @@ class ExtractTar public: bool Go(pkgDirStream &Stream); - + +#if APT_PKG_ABI >= 413 + ExtractTar(FileFd &Fd,unsigned long long Max,std::string DecompressionProgram); +#else ExtractTar(FileFd &Fd,unsigned long Max,std::string DecompressionProgram); +#endif virtual ~ExtractTar(); }; diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index a63cb6716..a8bf754e4 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -203,7 +203,11 @@ bool debDebFile::MemControlExtract::DoItem(Item &Itm,int &Fd) /* Just memcopy the block from the tar extractor and put it in the right place in the pre-allocated memory block. */ bool debDebFile::MemControlExtract::Process(Item &/*Itm*/,const unsigned char *Data, +#if APT_PKG_ABI >= 413 + unsigned long long Size,unsigned long long Pos) +#else unsigned long Size,unsigned long Pos) +#endif { memcpy(Control + Pos, Data,Size); return true; @@ -232,7 +236,11 @@ bool debDebFile::MemControlExtract::Read(debDebFile &Deb) // --------------------------------------------------------------------- /* The given memory block is loaded into the parser and parsed as a control record. */ +#if APT_PKG_ABI >= 413 +bool debDebFile::MemControlExtract::TakeControl(const void *Data,unsigned long long Size) +#else bool debDebFile::MemControlExtract::TakeControl(const void *Data,unsigned long Size) +#endif { delete [] Control; Control = new char[Size+2]; diff --git a/apt-inst/deb/debfile.h b/apt-inst/deb/debfile.h index 880bcf6c5..9d286716a 100644 --- a/apt-inst/deb/debfile.h +++ b/apt-inst/deb/debfile.h @@ -27,6 +27,7 @@ #include <apt-pkg/arfile.h> #include <apt-pkg/dirstream.h> #include <apt-pkg/tagfile.h> +#include <apt-pkg/macros.h> #include <string> @@ -81,13 +82,20 @@ class debDebFile::MemControlExtract : public pkgDirStream // Members from DirStream virtual bool DoItem(Item &Itm,int &Fd); virtual bool Process(Item &Itm,const unsigned char *Data, +#if APT_PKG_ABI >= 413 + unsigned long long Size,unsigned long long Pos); +#else unsigned long Size,unsigned long Pos); - +#endif // Helpers bool Read(debDebFile &Deb); +#if APT_PKG_ABI >= 413 + bool TakeControl(const void *Data,unsigned long long Size); +#else bool TakeControl(const void *Data,unsigned long Size); - +#endif + MemControlExtract() : IsControl(false), Control(0), Length(0), Member("control") {}; MemControlExtract(std::string Member) : IsControl(false), Control(0), Length(0), Member(Member) {}; ~MemControlExtract() {delete [] Control;}; diff --git a/apt-inst/dirstream.cc b/apt-inst/dirstream.cc index 39ebb3bb4..888020bfb 100644 --- a/apt-inst/dirstream.cc +++ b/apt-inst/dirstream.cc @@ -76,7 +76,6 @@ bool pkgDirStream::DoItem(Item &Itm,int &Fd) if(mkdir(Itm.Name,Itm.Mode) < 0) return false; return true; - break; } case Item::FIFO: break; diff --git a/apt-inst/dirstream.h b/apt-inst/dirstream.h index 1be2688a1..53ac24ba5 100644 --- a/apt-inst/dirstream.h +++ b/apt-inst/dirstream.h @@ -25,6 +25,7 @@ #ifndef PKGLIB_DIRSTREAM_H #define PKGLIB_DIRSTREAM_H +#include <apt-pkg/macros.h> class pkgDirStream { @@ -37,10 +38,15 @@ class pkgDirStream Directory, FIFO} Type; char *Name; char *LinkTarget; +#if APT_PKG_ABI >= 413 + unsigned long long Size; +#endif unsigned long Mode; unsigned long UID; unsigned long GID; +#if APT_PKG_ABI < 413 unsigned long Size; +#endif unsigned long MTime; unsigned long Major; unsigned long Minor; @@ -49,9 +55,13 @@ class pkgDirStream virtual bool DoItem(Item &Itm,int &Fd); virtual bool Fail(Item &Itm,int Fd); virtual bool FinishedFile(Item &Itm,int Fd); +#if APT_PKG_ABI >= 413 + virtual bool Process(Item &/*Itm*/,const unsigned char * /*Data*/, + unsigned long long /*Size*/,unsigned long long /*Pos*/) {return true;}; +#else virtual bool Process(Item &/*Itm*/,const unsigned char * /*Data*/, unsigned long /*Size*/,unsigned long /*Pos*/) {return true;}; - +#endif virtual ~pkgDirStream() {}; }; diff --git a/apt-inst/extract.cc b/apt-inst/extract.cc index b60784450..026182c18 100644 --- a/apt-inst/extract.cc +++ b/apt-inst/extract.cc @@ -404,7 +404,7 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde, // Now see if this package matches one in a replace depends pkgCache::DepIterator Dep = Ver.DependsList(); bool Ok = false; - for (; Dep.end() == false; Dep++) + for (; Dep.end() == false; ++Dep) { if (Dep->Type != pkgCache::Dep::Replaces) continue; diff --git a/apt-inst/makefile b/apt-inst/makefile index af887bba8..e4a3ae702 100644 --- a/apt-inst/makefile +++ b/apt-inst/makefile @@ -14,7 +14,7 @@ include ../buildlib/libversion.mak # The library name LIBRARY=apt-inst -MAJOR=1.5 +MAJOR=1.6 MINOR=0 SLIBS=$(PTHREADLIB) -lapt-pkg APT_DOMAIN:=libapt-inst$(MAJOR) diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 253cbdaf7..dd85fda79 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -50,16 +50,74 @@ using namespace std; +static void printHashSumComparision(std::string const &URI, HashStringList const &Expected, HashStringList const &Actual) /*{{{*/ +{ + if (_config->FindB("Debug::Acquire::HashSumMismatch", false) == false) + return; + std::cerr << std::endl << URI << ":" << std::endl << " Expected Hash: " << std::endl; + for (HashStringList::const_iterator hs = Expected.begin(); hs != Expected.end(); ++hs) + std::cerr << "\t- " << hs->toStr() << std::endl; + std::cerr << " Actual Hash: " << std::endl; + for (HashStringList::const_iterator hs = Actual.begin(); hs != Actual.end(); ++hs) + std::cerr << "\t- " << hs->toStr() << std::endl; +} + /*}}}*/ +static std::string GetPartialFileName(std::string const &file) /*{{{*/ +{ + std::string DestFile = _config->FindDir("Dir::State::lists") + "partial/"; + DestFile += file; + return DestFile; +} + /*}}}*/ +static std::string GetPartialFileNameFromURI(std::string const &uri) /*{{{*/ +{ + return GetPartialFileName(URItoFileName(uri)); +} + /*}}}*/ +static std::string GetCompressedFileName(std::string const &URI, std::string const &Name, std::string const &Ext) /*{{{*/ +{ + if (Ext.empty() || Ext == "uncompressed") + return Name; + + // do not reverify cdrom sources as apt-cdrom may rewrite the Packages + // file when its doing the indexcopy + if (URI.substr(0,6) == "cdrom:") + return Name; + + // adjust DestFile if its compressed on disk + if (_config->FindB("Acquire::GzipIndexes",false) == true) + return Name + '.' + Ext; + return Name; +} + /*}}}*/ +static bool AllowInsecureRepositories(indexRecords const * const MetaIndexParser, pkgAcqMetaBase * const TransactionManager, pkgAcquire::Item * const I) /*{{{*/ +{ + if(MetaIndexParser->IsAlwaysTrusted() || _config->FindB("Acquire::AllowInsecureRepositories") == true) + return true; + + _error->Error(_("Use --allow-insecure-repositories to force the update")); + TransactionManager->AbortTransaction(); + I->Status = pkgAcquire::Item::StatError; + return false; +} + /*}}}*/ + + // Acquire::Item::Item - Constructor /*{{{*/ -// --------------------------------------------------------------------- -/* */ -pkgAcquire::Item::Item(pkgAcquire *Owner) : Owner(Owner), FileSize(0), - PartialSize(0), Mode(0), ID(0), Complete(false), - Local(false), QueueCounter(0) +APT_IGNORE_DEPRECATED_PUSH +pkgAcquire::Item::Item(pkgAcquire *Owner, + HashStringList const &ExpectedHashes, + pkgAcqMetaBase *TransactionManager) + : Owner(Owner), FileSize(0), PartialSize(0), Mode(0), ID(0), Complete(false), + Local(false), QueueCounter(0), TransactionManager(TransactionManager), + ExpectedAdditionalItems(0), ExpectedHashes(ExpectedHashes) { Owner->Add(this); Status = StatIdle; + if(TransactionManager != NULL) + TransactionManager->Add(this); } +APT_IGNORE_DEPRECATED_POP /*}}}*/ // Acquire::Item::~Item - Destructor /*{{{*/ // --------------------------------------------------------------------- @@ -75,15 +133,15 @@ pkgAcquire::Item::~Item() fetch this object */ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { - Status = StatIdle; - ErrorText = LookupTag(Message,"Message"); + if(ErrorText.empty()) + ErrorText = LookupTag(Message,"Message"); UsedMirror = LookupTag(Message,"UsedMirror"); if (QueueCounter <= 1) { /* This indicates that the file is not available right now but might be sometime later. If we do a retry cycle then this should be retried [CDROMs] */ - if (Cnf->LocalOnly == true && + if (Cnf != NULL && Cnf->LocalOnly == true && StringToBool(LookupTag(Message,"Transient-Failure"),false) == true) { Status = StatIdle; @@ -92,11 +150,18 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) } Status = StatError; + Complete = false; Dequeue(); - } + } + else + Status = StatIdle; + + // check fail reason + string const FailReason = LookupTag(Message, "FailReason"); + if(FailReason == "MaximumSizeExceeded") + RenameOnError(MaximumSizeExceeded); // report mirror failure back to LP if we actually use a mirror - string FailReason = LookupTag(Message, "FailReason"); if(FailReason.size() != 0) ReportMirrorFailure(FailReason); else @@ -110,6 +175,7 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) void pkgAcquire::Item::Start(string /*Message*/,unsigned long long Size) { Status = StatFetching; + ErrorText.clear(); if (FileSize == 0 && Complete == false) FileSize = Size; } @@ -117,12 +183,12 @@ void pkgAcquire::Item::Start(string /*Message*/,unsigned long long Size) // Acquire::Item::Done - Item downloaded OK /*{{{*/ // --------------------------------------------------------------------- /* */ -void pkgAcquire::Item::Done(string Message,unsigned long long Size,string /*Hash*/, +void pkgAcquire::Item::Done(string Message,unsigned long long Size,HashStringList const &/*Hash*/, pkgAcquire::MethodConfig * /*Cnf*/) { // We just downloaded something.. string FileName = LookupTag(Message,"Filename"); - UsedMirror = LookupTag(Message,"UsedMirror"); + UsedMirror = LookupTag(Message,"UsedMirror"); if (Complete == false && !Local && FileName == DestFile) { if (Owner->Log != 0) @@ -140,21 +206,32 @@ void pkgAcquire::Item::Done(string Message,unsigned long long Size,string /*Hash // --------------------------------------------------------------------- /* This helper function is used by a lot of item methods as their final step */ -void pkgAcquire::Item::Rename(string From,string To) +bool pkgAcquire::Item::Rename(string From,string To) { - if (rename(From.c_str(),To.c_str()) != 0) - { - char S[300]; - snprintf(S,sizeof(S),_("rename failed, %s (%s -> %s)."),strerror(errno), - From.c_str(),To.c_str()); - Status = StatError; - ErrorText = S; - } + if (rename(From.c_str(),To.c_str()) == 0) + return true; + + std::string S; + strprintf(S, _("rename failed, %s (%s -> %s)."), strerror(errno), + From.c_str(),To.c_str()); + Status = StatError; + ErrorText += S; + return false; +} + /*}}}*/ +void pkgAcquire::Item::QueueURI(ItemDesc &Item) /*{{{*/ +{ + Owner->Enqueue(Item); +} + /*}}}*/ +void pkgAcquire::Item::Dequeue() /*{{{*/ +{ + Owner->Dequeue(this); } /*}}}*/ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const error)/*{{{*/ { - if(FileExists(DestFile)) + if (RealFileExists(DestFile)) Rename(DestFile, DestFile + ".FAILED"); switch (error) @@ -174,10 +251,28 @@ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const Status = StatError; // do not report as usually its not the mirrors fault, but Portal/Proxy break; + case SignatureError: + ErrorText = _("Signature error"); + Status = StatError; + break; + case NotClearsigned: + ErrorText = _("Does not start with a cleartext signature"); + Status = StatError; + break; + case MaximumSizeExceeded: + // the method is expected to report a good error for this + Status = StatError; + break; } return false; } /*}}}*/ +void pkgAcquire::Item::SetActiveSubprocess(const std::string &subprocess)/*{{{*/ +{ + ActiveSubprocess = subprocess; + APT_IGNORE_DEPRECATED(Mode = ActiveSubprocess.c_str();) +} + /*}}}*/ // Acquire::Item::ReportMirrorFailure /*{{{*/ // --------------------------------------------------------------------- void pkgAcquire::Item::ReportMirrorFailure(string FailCode) @@ -192,148 +287,37 @@ void pkgAcquire::Item::ReportMirrorFailure(string FailCode) << " 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; + + std::vector<char const*> Args; + Args.push_back(report.c_str()); + Args.push_back(UsedMirror.c_str()); + Args.push_back(DescURI().c_str()); + Args.push_back(FailCode.c_str()); + Args.push_back(NULL); + pid_t pid = ExecFork(); - if(pid < 0) + if(pid < 0) { _error->Error("ReportMirrorFailure Fork failed"); return; } - else if(pid == 0) + else if(pid == 0) { - execvp(Args[0], (char**)Args); + execvp(Args[0], (char**)Args.data()); std::cerr << "Could not exec " << Args[0] << std::endl; _exit(100); } - if(!ExecWait(pid, "report-mirror-failure")) + if(!ExecWait(pid, "report-mirror-failure")) { _error->Warning("Couldn't report problem to '%s'", _config->Find("Methods::Mirror::ProblemReporting").c_str()); } } /*}}}*/ -// AcqSubIndex::AcqSubIndex - Constructor /*{{{*/ -// --------------------------------------------------------------------- -/* Get a sub-index file based on checksums from a 'master' file and - possibly query additional files */ -pkgAcqSubIndex::pkgAcqSubIndex(pkgAcquire *Owner, string const &URI, - string const &URIDesc, string const &ShortDesc, - HashString const &ExpectedHash) - : Item(Owner), ExpectedHash(ExpectedHash) -{ - /* XXX: Beware: Currently this class does nothing (of value) anymore ! */ - Debug = _config->FindB("Debug::pkgAcquire::SubIndex",false); - - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(URI); - - Desc.URI = URI; - Desc.Description = URIDesc; - Desc.Owner = this; - Desc.ShortDesc = ShortDesc; - - QueueURI(Desc); - - if(Debug) - std::clog << "pkgAcqSubIndex: " << Desc.URI << std::endl; -} - /*}}}*/ -// AcqSubIndex::Custom600Headers - Insert custom request headers /*{{{*/ -// --------------------------------------------------------------------- -/* The only header we use is the last-modified header. */ -string pkgAcqSubIndex::Custom600Headers() -{ - string Final = _config->FindDir("Dir::State::lists"); - Final += URItoFileName(Desc.URI); - - struct stat Buf; - if (stat(Final.c_str(),&Buf) != 0) - return "\nIndex-File: true\nFail-Ignore: true\n"; - return "\nIndex-File: true\nFail-Ignore: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); -} - /*}}}*/ -void pkgAcqSubIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/ -{ - if(Debug) - std::clog << "pkgAcqSubIndex failed: " << Desc.URI << " with " << Message << std::endl; - - Complete = false; - Status = StatDone; - Dequeue(); - - // No good Index is provided -} - /*}}}*/ -void pkgAcqSubIndex::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/ - pkgAcquire::MethodConfig *Cnf) -{ - if(Debug) - std::clog << "pkgAcqSubIndex::Done(): " << Desc.URI << std::endl; - - string FileName = LookupTag(Message,"Filename"); - if (FileName.empty() == true) - { - Status = StatError; - ErrorText = "Method gave a blank filename"; - return; - } - - if (FileName != DestFile) - { - Local = true; - Desc.URI = "copy:" + FileName; - QueueURI(Desc); - return; - } - - Item::Done(Message,Size,Md5Hash,Cnf); - - string FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(Desc.URI); - - /* Downloaded invalid transindex => Error (LP: #346386) (Closes: #627642) */ - indexRecords SubIndexParser; - if (FileExists(DestFile) == true && !SubIndexParser.Load(DestFile)) { - Status = StatError; - ErrorText = SubIndexParser.ErrorText; - return; - } - - // success in downloading the index - // rename the index - if(Debug) - std::clog << "Renaming: " << DestFile << " -> " << FinalFile << std::endl; - Rename(DestFile,FinalFile); - chmod(FinalFile.c_str(),0644); - DestFile = FinalFile; - - if(ParseIndex(DestFile) == false) - return Failed("", NULL); - - Complete = true; - Status = StatDone; - Dequeue(); - return; -} - /*}}}*/ -bool pkgAcqSubIndex::ParseIndex(string const &IndexFile) /*{{{*/ -{ - indexRecords SubIndexParser; - if (FileExists(IndexFile) == false || SubIndexParser.Load(IndexFile) == false) - return false; - // so something with the downloaded index - return true; -} - /*}}}*/ // AcqDiffIndex::AcqDiffIndex - Constructor /*{{{*/ // --------------------------------------------------------------------- /* Get the DiffIndex file first and see if there are patches available @@ -342,21 +326,23 @@ bool pkgAcqSubIndex::ParseIndex(string const &IndexFile) /*{{{*/ * the original packages file */ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner, - string URI,string URIDesc,string ShortDesc, - HashString ExpectedHash) - : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash), - Description(URIDesc) + pkgAcqMetaBase *TransactionManager, + IndexTarget const * const Target, + HashStringList const &ExpectedHashes, + indexRecords *MetaIndexParser) + : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, + MetaIndexParser), PackagesFileReadyInPartial(false) { Debug = _config->FindB("Debug::pkgAcquire::Diffs",false); - Desc.Description = URIDesc + "/DiffIndex"; + RealURI = Target->URI; Desc.Owner = this; - Desc.ShortDesc = ShortDesc; - Desc.URI = URI + ".diff/Index"; + Desc.Description = Target->Description + ".diff/Index"; + Desc.ShortDesc = Target->ShortDesc; + Desc.URI = Target->URI + ".diff/Index"; - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(Desc.URI); + DestFile = GetPartialFileNameFromURI(Desc.URI); if(Debug) std::clog << "pkgAcqDiffIndex: " << Desc.URI << std::endl; @@ -372,9 +358,7 @@ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner, Desc.URI.substr(0,strlen("file:/")) == "file:/") { // we don't have a pkg file or we don't want to queue - if(Debug) - std::clog << "No index file, local or canceld by user" << std::endl; - Failed("", NULL); + Failed("No index file, local or canceld by user", NULL); return; } @@ -389,11 +373,15 @@ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner, // AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/ // --------------------------------------------------------------------- /* The only header we use is the last-modified header. */ +#if APT_PKG_ABI >= 413 +string pkgAcqDiffIndex::Custom600Headers() const +#else string pkgAcqDiffIndex::Custom600Headers() +#endif { string Final = _config->FindDir("Dir::State::lists"); Final += URItoFileName(Desc.URI); - + if(Debug) std::clog << "Custom600Header-IMS: " << Final << std::endl; @@ -406,190 +394,333 @@ string pkgAcqDiffIndex::Custom600Headers() /*}}}*/ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile) /*{{{*/ { + // failing here is fine: our caller will take care of trying to + // get the complete file if patching fails if(Debug) std::clog << "pkgAcqDiffIndex::ParseIndexDiff() " << IndexDiffFile << std::endl; - pkgTagSection Tags; - string ServerSha1; - vector<DiffInfo> available_patches; - FileFd Fd(IndexDiffFile,FileFd::ReadOnly); pkgTagFile TF(&Fd); if (_error->PendingError() == true) return false; - if(TF.Step(Tags) == true) + pkgTagSection Tags; + if(unlikely(TF.Step(Tags) == false)) + return false; + + HashStringList ServerHashes; + unsigned long long ServerSize = 0; + + for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) { - bool found = false; - DiffInfo d; - string size; + std::string tagname = *type; + tagname.append("-Current"); + std::string const tmp = Tags.FindS(tagname.c_str()); + if (tmp.empty() == true) + continue; - string const tmp = Tags.FindS("SHA1-Current"); + string hash; + unsigned long long size; std::stringstream ss(tmp); - ss >> ServerSha1 >> size; - unsigned long const ServerSize = atol(size.c_str()); + ss >> hash >> size; + if (unlikely(hash.empty() == true)) + continue; + if (unlikely(ServerSize != 0 && ServerSize != size)) + continue; + ServerHashes.push_back(HashString(*type, hash)); + ServerSize = size; + } - FileFd fd(CurrentPackagesFile, FileFd::ReadOnly); - SHA1Summation SHA1; - SHA1.AddFD(fd); - string const local_sha1 = SHA1.Result(); + if (ServerHashes.usable() == false) + { + if (Debug == true) + std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": Did not find a good hashsum in the index" << std::endl; + return false; + } - if(local_sha1 == ServerSha1) + if (ServerHashes != HashSums()) + { + if (Debug == true) { - // we have the same sha1 as the server so we are done here - if(Debug) - std::clog << "Package file is up-to-date" << std::endl; - // list cleanup needs to know that this file as well as the already - // present index is ours, so we create an empty diff to save it for us - new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc, - ExpectedHash, ServerSha1, available_patches); - return true; + std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": Index has different hashes than parser, probably older, so fail pdiffing" << std::endl; + printHashSumComparision(CurrentPackagesFile, ServerHashes, HashSums()); } - else + return false; + } + + if (ServerHashes.VerifyFile(CurrentPackagesFile) == true) + { + // we have the same sha1 as the server so we are done here + if(Debug) + std::clog << "pkgAcqDiffIndex: Package file " << CurrentPackagesFile << " is up-to-date" << std::endl; + + // list cleanup needs to know that this file as well as the already + // present index is ours, so we create an empty diff to save it for us + new pkgAcqIndexDiffs(Owner, TransactionManager, Target, + ExpectedHashes, MetaIndexParser); + return true; + } + + FileFd fd(CurrentPackagesFile, FileFd::ReadOnly); + Hashes LocalHashesCalc; + LocalHashesCalc.AddFD(fd); + HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList(); + + if(Debug) + std::clog << "Server-Current: " << ServerHashes.find(NULL)->toStr() << " and we start at " + << fd.Name() << " " << fd.FileSize() << " " << LocalHashes.find(NULL)->toStr() << std::endl; + + // parse all of (provided) history + vector<DiffInfo> available_patches; + bool firstAcceptedHashes = true; + for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + { + if (LocalHashes.find(*type) == NULL) + continue; + + std::string tagname = *type; + tagname.append("-History"); + std::string const tmp = Tags.FindS(tagname.c_str()); + if (tmp.empty() == true) + continue; + + string hash, filename; + unsigned long long size; + std::stringstream ss(tmp); + + while (ss >> hash >> size >> filename) { - if(Debug) - std::clog << "SHA1-Current: " << ServerSha1 << " and we start at "<< fd.Name() << " " << fd.Size() << " " << local_sha1 << std::endl; + if (unlikely(hash.empty() == true || filename.empty() == true)) + continue; - // check the historie and see what patches we need - string const history = Tags.FindS("SHA1-History"); - std::stringstream hist(history); - while(hist >> d.sha1 >> size >> d.file) + // see if we have a record for this file already + std::vector<DiffInfo>::iterator cur = available_patches.begin(); + for (; cur != available_patches.end(); ++cur) { - // read until the first match is found - // from that point on, we probably need all diffs - if(d.sha1 == local_sha1) - found=true; - else if (found == false) + if (cur->file != filename || unlikely(cur->result_size != size)) continue; - - if(Debug) - std::clog << "Need to get diff: " << d.file << std::endl; - available_patches.push_back(d); + cur->result_hashes.push_back(HashString(*type, hash)); + break; } - - if (available_patches.empty() == false) + if (cur != available_patches.end()) + continue; + if (firstAcceptedHashes == true) { - // patching with too many files is rather slow compared to a fast download - unsigned long const fileLimit = _config->FindI("Acquire::PDiffs::FileLimit", 0); - if (fileLimit != 0 && fileLimit < available_patches.size()) - { - if (Debug) - std::clog << "Need " << available_patches.size() << " diffs (Limit is " << fileLimit - << ") so fallback to complete download" << std::endl; - return false; - } - - // see if the patches are too big - found = false; // it was true and it will be true again at the end - d = *available_patches.begin(); - string const firstPatch = d.file; - unsigned long patchesSize = 0; - std::stringstream patches(Tags.FindS("SHA1-Patches")); - while(patches >> d.sha1 >> size >> d.file) - { - if (firstPatch == d.file) - found = true; - else if (found == false) - continue; - - patchesSize += atol(size.c_str()); - } - unsigned long const sizeLimit = ServerSize * _config->FindI("Acquire::PDiffs::SizeLimit", 100); - if (sizeLimit > 0 && (sizeLimit/100) < patchesSize) - { - if (Debug) - std::clog << "Need " << patchesSize << " bytes (Limit is " << sizeLimit/100 - << ") so fallback to complete download" << std::endl; - return false; - } + DiffInfo next; + next.file = filename; + next.result_hashes.push_back(HashString(*type, hash)); + next.result_size = size; + next.patch_size = 0; + available_patches.push_back(next); + } + else + { + if (Debug == true) + std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": File " << filename + << " wasn't in the list for the first parsed hash! (history)" << std::endl; + break; } } + firstAcceptedHashes = false; + } - // we have something, queue the next diff - if(found) + if (unlikely(available_patches.empty() == true)) + { + if (Debug) + std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": " + << "Couldn't find any patches for the patch series." << std::endl; + return false; + } + + for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + { + if (LocalHashes.find(*type) == NULL) + continue; + + std::string tagname = *type; + tagname.append("-Patches"); + std::string const tmp = Tags.FindS(tagname.c_str()); + if (tmp.empty() == true) + continue; + + string hash, filename; + unsigned long long size; + std::stringstream ss(tmp); + + while (ss >> hash >> size >> filename) { - // queue the diffs - string::size_type const last_space = Description.rfind(" "); - if(last_space != string::npos) - Description.erase(last_space, Description.size()-last_space); - - /* decide if we should download patches one by one or in one go: - The first is good if the server merges patches, but many don't so client - based merging can be attempt in which case the second is better. - "bad things" will happen if patches are merged on the server, - but client side merging is attempt as well */ - bool pdiff_merge = _config->FindB("Acquire::PDiffs::Merge", true); - if (pdiff_merge == true) - { - // reprepro adds this flag if it has merged patches on the server - std::string const precedence = Tags.FindS("X-Patch-Precedence"); - pdiff_merge = (precedence != "merged"); - } + if (unlikely(hash.empty() == true || filename.empty() == true)) + continue; - if (pdiff_merge == false) - new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc, - ExpectedHash, ServerSha1, available_patches); - else + // see if we have a record for this file already + std::vector<DiffInfo>::iterator cur = available_patches.begin(); + for (; cur != available_patches.end(); ++cur) { - std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size()); - for(size_t i = 0; i < available_patches.size(); ++i) - (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner, RealURI, Description, Desc.ShortDesc, ExpectedHash, - available_patches[i], diffs); + if (cur->file != filename) + continue; + if (unlikely(cur->patch_size != 0 && cur->patch_size != size)) + continue; + cur->patch_hashes.push_back(HashString(*type, hash)); + cur->patch_size = size; + break; } - - Complete = false; - Status = StatDone; - Dequeue(); - return true; + if (cur != available_patches.end()) + continue; + if (Debug == true) + std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": File " << filename + << " wasn't in the list for the first parsed hash! (patches)" << std::endl; + break; } } + + bool foundStart = false; + for (std::vector<DiffInfo>::iterator cur = available_patches.begin(); + cur != available_patches.end(); ++cur) + { + if (LocalHashes != cur->result_hashes) + continue; + + available_patches.erase(available_patches.begin(), cur); + foundStart = true; + break; + } + + if (foundStart == false || unlikely(available_patches.empty() == true)) + { + if (Debug) + std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": " + << "Couldn't find the start of the patch series." << std::endl; + return false; + } + + // patching with too many files is rather slow compared to a fast download + unsigned long const fileLimit = _config->FindI("Acquire::PDiffs::FileLimit", 0); + if (fileLimit != 0 && fileLimit < available_patches.size()) + { + if (Debug) + std::clog << "Need " << available_patches.size() << " diffs (Limit is " << fileLimit + << ") so fallback to complete download" << std::endl; + return false; + } + + // calculate the size of all patches we have to get + // note that all sizes are uncompressed, while we download compressed files + unsigned long long patchesSize = 0; + for (std::vector<DiffInfo>::const_iterator cur = available_patches.begin(); + cur != available_patches.end(); ++cur) + patchesSize += cur->patch_size; + unsigned long long const sizeLimit = ServerSize * _config->FindI("Acquire::PDiffs::SizeLimit", 100); + if (sizeLimit > 0 && (sizeLimit/100) < patchesSize) + { + if (Debug) + std::clog << "Need " << patchesSize << " bytes (Limit is " << sizeLimit/100 + << ") so fallback to complete download" << std::endl; + return false; + } + + // FIXME: make this use the method + PackagesFileReadyInPartial = true; + std::string const Partial = GetPartialFileNameFromURI(RealURI); + + FileFd From(CurrentPackagesFile, FileFd::ReadOnly); + FileFd To(Partial, FileFd::WriteEmpty); + if(CopyFile(From, To) == false) + return _error->Errno("CopyFile", "failed to copy"); - // Nothing found, report and return false - // Failing here is ok, if we return false later, the full - // IndexFile is queued if(Debug) - std::clog << "Can't find a patch in the index file" << std::endl; - return false; + std::cerr << "Done copying " << CurrentPackagesFile + << " -> " << Partial + << std::endl; + + // we have something, queue the diffs + string::size_type const last_space = Description.rfind(" "); + if(last_space != string::npos) + Description.erase(last_space, Description.size()-last_space); + + /* decide if we should download patches one by one or in one go: + The first is good if the server merges patches, but many don't so client + based merging can be attempt in which case the second is better. + "bad things" will happen if patches are merged on the server, + but client side merging is attempt as well */ + bool pdiff_merge = _config->FindB("Acquire::PDiffs::Merge", true); + if (pdiff_merge == true) + { + // reprepro adds this flag if it has merged patches on the server + std::string const precedence = Tags.FindS("X-Patch-Precedence"); + pdiff_merge = (precedence != "merged"); + } + + if (pdiff_merge == false) + { + new pkgAcqIndexDiffs(Owner, TransactionManager, Target, ExpectedHashes, + MetaIndexParser, available_patches); + } + else + { + std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size()); + for(size_t i = 0; i < available_patches.size(); ++i) + (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner, TransactionManager, + Target, + ExpectedHashes, + MetaIndexParser, + available_patches[i], + diffs); + } + + Complete = false; + Status = StatDone; + Dequeue(); + return true; } /*}}}*/ -void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/ +void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig * Cnf)/*{{{*/ { + Item::Failed(Message,Cnf); + Status = StatDone; + if(Debug) std::clog << "pkgAcqDiffIndex failed: " << Desc.URI << " with " << Message << std::endl << "Falling back to normal index file acquire" << std::endl; - new pkgAcqIndex(Owner, RealURI, Description, Desc.ShortDesc, - ExpectedHash); - - Complete = false; - Status = StatDone; - Dequeue(); + new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser); } /*}}}*/ -void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/ +void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,HashStringList const &Hashes, /*{{{*/ pkgAcquire::MethodConfig *Cnf) { if(Debug) std::clog << "pkgAcqDiffIndex::Done(): " << Desc.URI << std::endl; - Item::Done(Message,Size,Md5Hash,Cnf); + Item::Done(Message, Size, Hashes, Cnf); + + // verify the index target + if(Target && Target->MetaKey != "" && MetaIndexParser && Hashes.usable()) + { + std::string IndexMetaKey = Target->MetaKey + ".diff/Index"; + indexRecords::checkSum *Record = MetaIndexParser->Lookup(IndexMetaKey); + if(Record && Record->Hashes.usable() && Hashes != Record->Hashes) + { + RenameOnError(HashSumMismatch); + printHashSumComparision(RealURI, Record->Hashes, Hashes); + Failed(Message, Cnf); + return; + } + + } string FinalFile; - FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI); + FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(Desc.URI); - // success in downloading the index - // rename the index - FinalFile += string(".IndexDiff"); - if(Debug) - std::clog << "Renaming: " << DestFile << " -> " << FinalFile - << std::endl; - Rename(DestFile,FinalFile); - chmod(FinalFile.c_str(),0644); - DestFile = FinalFile; + if(StringToBool(LookupTag(Message,"IMS-Hit"),false)) + DestFile = FinalFile; if(!ParseDiffIndex(DestFile)) - return Failed("", NULL); + return Failed("Message: Couldn't parse pdiff index", Cnf); + + // queue for final move + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); Complete = true; Status = StatDone; @@ -603,26 +734,28 @@ void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash * for each diff and the index */ pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner, - string URI,string URIDesc,string ShortDesc, - HashString ExpectedHash, - string ServerSha1, + pkgAcqMetaBase *TransactionManager, + struct IndexTarget const * const Target, + HashStringList const &ExpectedHashes, + indexRecords *MetaIndexParser, vector<DiffInfo> diffs) - : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash), - available_patches(diffs), ServerSha1(ServerSha1) + : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser), + available_patches(diffs) { - - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(URI); + DestFile = GetPartialFileNameFromURI(Target->URI); Debug = _config->FindB("Debug::pkgAcquire::Diffs",false); - Description = URIDesc; + RealURI = Target->URI; Desc.Owner = this; - Desc.ShortDesc = ShortDesc; + Description = Target->Description; + Desc.ShortDesc = Target->ShortDesc; if(available_patches.empty() == true) { - // we are done (yeah!) + // we are done (yeah!), check hashes against the final file + DestFile = _config->FindDir("Dir::State::lists"); + DestFile += URItoFileName(Target->URI); Finish(true); } else @@ -633,33 +766,42 @@ pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner, } } /*}}}*/ -void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/ +void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig * Cnf)/*{{{*/ { + Item::Failed(Message,Cnf); + Status = StatDone; + if(Debug) std::clog << "pkgAcqIndexDiffs failed: " << Desc.URI << " with " << Message << std::endl << "Falling back to normal index file acquire" << std::endl; - new pkgAcqIndex(Owner, RealURI, Description,Desc.ShortDesc, - ExpectedHash); + new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser); Finish(); } /*}}}*/ // Finish - helper that cleans the item out of the fetcher queue /*{{{*/ void pkgAcqIndexDiffs::Finish(bool allDone) { + if(Debug) + std::clog << "pkgAcqIndexDiffs::Finish(): " + << allDone << " " + << Desc.URI << std::endl; + // we restore the original name, this is required, otherwise // the file will be cleaned if(allDone) { - DestFile = _config->FindDir("Dir::State::lists"); - DestFile += URItoFileName(RealURI); - - if(!ExpectedHash.empty() && !ExpectedHash.VerifyFile(DestFile)) + if(HashSums().usable() && !HashSums().VerifyFile(DestFile)) { RenameOnError(HashSumMismatch); Dequeue(); return; } + // queue for copy + std::string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); + // this is for the "real" finish Complete = true; Status = StatDone; @@ -679,21 +821,32 @@ void pkgAcqIndexDiffs::Finish(bool allDone) /*}}}*/ bool pkgAcqIndexDiffs::QueueNextDiff() /*{{{*/ { - // calc sha1 of the just patched file - string FinalFile = _config->FindDir("Dir::State::lists"); - FinalFile += URItoFileName(RealURI); + std::string const FinalFile = GetPartialFileNameFromURI(RealURI); + + if(!FileExists(FinalFile)) + { + Failed("Message: No FinalFile " + FinalFile + " available", NULL); + return false; + } FileFd fd(FinalFile, FileFd::ReadOnly); - SHA1Summation SHA1; - SHA1.AddFD(fd); - string local_sha1 = string(SHA1.Result()); + Hashes LocalHashesCalc; + LocalHashesCalc.AddFD(fd); + HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList(); + if(Debug) - std::clog << "QueueNextDiff: " - << FinalFile << " (" << local_sha1 << ")"<<std::endl; + std::clog << "QueueNextDiff: " << FinalFile << " (" << LocalHashes.find(NULL)->toStr() << ")" << std::endl; + + if (unlikely(LocalHashes.usable() == false || ExpectedHashes.usable() == false)) + { + Failed("Local/Expected hashes are not usable", NULL); + return false; + } + // final file reached before all patches are applied - if(local_sha1 == ServerSha1) + if(LocalHashes == ExpectedHashes) { Finish(true); return true; @@ -701,10 +854,10 @@ bool pkgAcqIndexDiffs::QueueNextDiff() /*{{{*/ // remove all patches until the next matching patch is found // this requires the Index file to be ordered - for(vector<DiffInfo>::iterator I=available_patches.begin(); + for(vector<DiffInfo>::iterator I = available_patches.begin(); available_patches.empty() == false && I != available_patches.end() && - I->sha1 != local_sha1; + I->result_hashes != LocalHashes; ++I) { available_patches.erase(I); @@ -713,38 +866,48 @@ bool pkgAcqIndexDiffs::QueueNextDiff() /*{{{*/ // error checking and falling back if no patch was found if(available_patches.empty() == true) { - Failed("", NULL); + Failed("No patches left to reach target", NULL); return false; } // queue the right diff Desc.URI = RealURI + ".diff/" + available_patches[0].file + ".gz"; Desc.Description = Description + " " + available_patches[0].file + string(".pdiff"); - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(RealURI + ".diff/" + available_patches[0].file); + DestFile = GetPartialFileNameFromURI(RealURI + ".diff/" + available_patches[0].file); if(Debug) std::clog << "pkgAcqIndexDiffs::QueueNextDiff(): " << Desc.URI << std::endl; - + QueueURI(Desc); return true; } /*}}}*/ -void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/ +void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size, HashStringList const &Hashes, /*{{{*/ pkgAcquire::MethodConfig *Cnf) { if(Debug) std::clog << "pkgAcqIndexDiffs::Done(): " << Desc.URI << std::endl; - Item::Done(Message,Size,Md5Hash,Cnf); + Item::Done(Message, Size, Hashes, Cnf); - string FinalFile; - FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI); + // FIXME: verify this download too before feeding it to rred + std::string const FinalFile = GetPartialFileNameFromURI(RealURI); // success in downloading a diff, enter ApplyDiff state if(State == StateFetchDiff) { + FileFd fd(DestFile, FileFd::ReadOnly, FileFd::Gzip); + class Hashes LocalHashesCalc; + LocalHashesCalc.AddFD(fd); + HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList(); + + if (fd.Size() != available_patches[0].patch_size || + available_patches[0].patch_hashes != LocalHashes) + { + Failed("Patch has Size/Hashsum mismatch", NULL); + return; + } // rred excepts the patch as $FinalFile.ed Rename(DestFile,FinalFile+".ed"); @@ -756,7 +919,7 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has Local = true; Desc.URI = "rred:" + FinalFile; QueueURI(Desc); - Mode = "rred"; + SetActiveSubprocess("rred"); return; } @@ -779,37 +942,39 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has // see if there is more to download if(available_patches.empty() == false) { - new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc, - ExpectedHash, ServerSha1, available_patches); + new pkgAcqIndexDiffs(Owner, TransactionManager, Target, + ExpectedHashes, MetaIndexParser, + available_patches); return Finish(); } else + // update + DestFile = FinalFile; return Finish(true); } } /*}}}*/ // AcqIndexMergeDiffs::AcqIndexMergeDiffs - Constructor /*{{{*/ pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner, - string const &URI, string const &URIDesc, - string const &ShortDesc, HashString const &ExpectedHash, - DiffInfo const &patch, - std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches) - : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash), - patch(patch),allPatches(allPatches), State(StateFetchDiff) + pkgAcqMetaBase *TransactionManager, + struct IndexTarget const * const Target, + HashStringList const &ExpectedHashes, + indexRecords *MetaIndexParser, + DiffInfo const &patch, + std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches) + : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser), + patch(patch), allPatches(allPatches), State(StateFetchDiff) { - - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(URI); - Debug = _config->FindB("Debug::pkgAcquire::Diffs",false); - Description = URIDesc; + RealURI = Target->URI; Desc.Owner = this; - Desc.ShortDesc = ShortDesc; + Description = Target->Description; + Desc.ShortDesc = Target->ShortDesc; Desc.URI = RealURI + ".diff/" + patch.file + ".gz"; Desc.Description = Description + " " + patch.file + string(".pdiff"); - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(RealURI + ".diff/" + patch.file); + + DestFile = GetPartialFileNameFromURI(RealURI + ".diff/" + patch.file); if(Debug) std::clog << "pkgAcqIndexMergeDiffs: " << Desc.URI << std::endl; @@ -817,13 +982,13 @@ pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner, QueueURI(Desc); } /*}}}*/ -void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/ +void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * Cnf)/*{{{*/ { if(Debug) std::clog << "pkgAcqIndexMergeDiffs failed: " << Desc.URI << " with " << Message << std::endl; - Complete = false; + + Item::Failed(Message,Cnf); Status = StatDone; - Dequeue(); // check if we are the first to fail, otherwise we are done here State = StateDoneDiff; @@ -835,22 +1000,33 @@ void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*C // first failure means we should fallback State = StateErrorDiff; std::clog << "Falling back to normal index file acquire" << std::endl; - new pkgAcqIndex(Owner, RealURI, Description,Desc.ShortDesc, - ExpectedHash); + new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser); } /*}}}*/ -void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/ +void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,HashStringList const &Hashes, /*{{{*/ pkgAcquire::MethodConfig *Cnf) { if(Debug) std::clog << "pkgAcqIndexMergeDiffs::Done(): " << Desc.URI << std::endl; - Item::Done(Message,Size,Md5Hash,Cnf); + Item::Done(Message,Size,Hashes,Cnf); - string const FinalFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); + // FIXME: verify download before feeding it to rred + string const FinalFile = GetPartialFileNameFromURI(RealURI); if (State == StateFetchDiff) { + FileFd fd(DestFile, FileFd::ReadOnly, FileFd::Gzip); + class Hashes LocalHashesCalc; + LocalHashesCalc.AddFD(fd); + HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList(); + + if (fd.Size() != patch.patch_size || patch.patch_hashes != LocalHashes) + { + Failed("Patch has Size/Hashsum mismatch", NULL); + return; + } + // rred expects the patch as $FinalFile.ed.$patchname.gz Rename(DestFile, FinalFile + ".ed." + patch.file + ".gz"); @@ -874,35 +1050,38 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M Local = true; Desc.URI = "rred:" + FinalFile; QueueURI(Desc); - Mode = "rred"; + SetActiveSubprocess("rred"); return; } // success in download/apply all diffs, clean up else if (State == StateApplyDiff) { // see if we really got the expected file - if(!ExpectedHash.empty() && !ExpectedHash.VerifyFile(DestFile)) + if(ExpectedHashes.usable() && !ExpectedHashes.VerifyFile(DestFile)) { RenameOnError(HashSumMismatch); return; } + + std::string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + // move the result into place if(Debug) - std::clog << "Moving patched file in place: " << std::endl + std::clog << "Queue patched file in place: " << std::endl << DestFile << " -> " << FinalFile << std::endl; - Rename(DestFile, FinalFile); - chmod(FinalFile.c_str(), 0644); - // otherwise lists cleanup will eat the file - DestFile = FinalFile; + // queue for copy by the transaction manager + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); // ensure the ed's are gone regardless of list-cleanup for (std::vector<pkgAcqIndexMergeDiffs *>::const_iterator I = allPatches->begin(); I != allPatches->end(); ++I) { - std::string patch = FinalFile + ".ed." + (*I)->patch.file + ".gz"; - unlink(patch.c_str()); + std::string const PartialFile = GetPartialFileNameFromURI(RealURI); + std::string patch = PartialFile + ".ed." + (*I)->patch.file + ".gz"; + unlink(patch.c_str()); } // all set and done @@ -912,66 +1091,116 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M } } /*}}}*/ +// AcqBaseIndex::VerifyHashByMetaKey - verify hash for the given metakey /*{{{*/ +bool pkgAcqBaseIndex::VerifyHashByMetaKey(HashStringList const &Hashes) +{ + if(MetaKey != "" && Hashes.usable()) + { + indexRecords::checkSum *Record = MetaIndexParser->Lookup(MetaKey); + if(Record && Record->Hashes.usable() && Hashes != Record->Hashes) + { + printHashSumComparision(RealURI, Record->Hashes, Hashes); + return false; + } + } + return true; +} + /*}}}*/ // AcqIndex::AcqIndex - Constructor /*{{{*/ // --------------------------------------------------------------------- -/* The package file is added to the queue and a second class is - instantiated to fetch the revision file */ +/* The package file is added to the queue and a second class is + instantiated to fetch the revision file */ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner, string URI,string URIDesc,string ShortDesc, - HashString ExpectedHash, string comprExt) - : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash) + HashStringList const &ExpectedHash) + : pkgAcqBaseIndex(Owner, 0, NULL, ExpectedHash, NULL) { - if(comprExt.empty() == true) - { - // autoselect the compression method - std::vector<std::string> types = APT::Configuration::getCompressionTypes(); - for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t) - comprExt.append(*t).append(" "); - if (comprExt.empty() == false) - comprExt.erase(comprExt.end()-1); - } - CompressionExtension = comprExt; + RealURI = URI; + AutoSelectCompression(); Init(URI, URIDesc, ShortDesc); + + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "New pkgIndex with TransactionManager " + << TransactionManager << std::endl; } -pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner, IndexTarget const *Target, - HashString const &ExpectedHash, indexRecords const *MetaIndexParser) - : Item(Owner), RealURI(Target->URI), ExpectedHash(ExpectedHash) + /*}}}*/ +// AcqIndex::AcqIndex - Constructor /*{{{*/ +pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + IndexTarget const *Target, + HashStringList const &ExpectedHash, + indexRecords *MetaIndexParser) + : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHash, + MetaIndexParser) { + RealURI = Target->URI; + // autoselect the compression method + AutoSelectCompression(); + Init(Target->URI, Target->Description, Target->ShortDesc); + + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "New pkgIndex with TransactionManager " + << TransactionManager << std::endl; +} + /*}}}*/ +// AcqIndex::AutoSelectCompression - Select compression /*{{{*/ +void pkgAcqIndex::AutoSelectCompression() +{ std::vector<std::string> types = APT::Configuration::getCompressionTypes(); - CompressionExtension = ""; - if (ExpectedHash.empty() == false) + CompressionExtensions = ""; + if (ExpectedHashes.usable()) { - for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t) - if (*t == "uncompressed" || MetaIndexParser->Exists(string(Target->MetaKey).append(".").append(*t)) == true) - CompressionExtension.append(*t).append(" "); + for (std::vector<std::string>::const_iterator t = types.begin(); + t != types.end(); ++t) + { + std::string CompressedMetaKey = string(Target->MetaKey).append(".").append(*t); + if (*t == "uncompressed" || + MetaIndexParser->Exists(CompressedMetaKey) == true) + CompressionExtensions.append(*t).append(" "); + } } else { for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t) - CompressionExtension.append(*t).append(" "); + CompressionExtensions.append(*t).append(" "); } - if (CompressionExtension.empty() == false) - CompressionExtension.erase(CompressionExtension.end()-1); - - Init(Target->URI, Target->Description, Target->ShortDesc); + if (CompressionExtensions.empty() == false) + CompressionExtensions.erase(CompressionExtensions.end()-1); } /*}}}*/ // AcqIndex::Init - defered Constructor /*{{{*/ -void pkgAcqIndex::Init(string const &URI, string const &URIDesc, string const &ShortDesc) { - Decompression = false; - Erase = false; +void pkgAcqIndex::Init(string const &URI, string const &URIDesc, + string const &ShortDesc) +{ + Stage = STAGE_DOWNLOAD; - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(URI); + DestFile = GetPartialFileNameFromURI(URI); - std::string const comprExt = CompressionExtension.substr(0, CompressionExtension.find(' ')); - if (comprExt == "uncompressed") + CurrentCompressionExtension = CompressionExtensions.substr(0, CompressionExtensions.find(' ')); + if (CurrentCompressionExtension == "uncompressed") + { Desc.URI = URI; - else { - Desc.URI = URI + '.' + comprExt; - DestFile = DestFile + '.' + comprExt; + if(Target) + MetaKey = string(Target->MetaKey); + } + else + { + Desc.URI = URI + '.' + CurrentCompressionExtension; + DestFile = DestFile + '.' + CurrentCompressionExtension; + if(Target) + MetaKey = string(Target->MetaKey) + '.' + CurrentCompressionExtension; + } + + // load the filesize + if(MetaIndexParser) + { + indexRecords::checkSum *Record = MetaIndexParser->Lookup(MetaKey); + if(Record) + FileSize = Record->Size; + + InitByHashIfNeeded(MetaKey); } Desc.Description = URIDesc; @@ -981,154 +1210,186 @@ void pkgAcqIndex::Init(string const &URI, string const &URIDesc, string const &S QueueURI(Desc); } /*}}}*/ +// AcqIndex::AdjustForByHash - modify URI for by-hash support /*{{{*/ +void pkgAcqIndex::InitByHashIfNeeded(const std::string MetaKey) +{ + // TODO: + // - (maybe?) add support for by-hash into the sources.list as flag + // - make apt-ftparchive generate the hashes (and expire?) + std::string HostKnob = "APT::Acquire::" + ::URI(Desc.URI).Host + "::By-Hash"; + if(_config->FindB("APT::Acquire::By-Hash", false) == true || + _config->FindB(HostKnob, false) == true || + MetaIndexParser->GetSupportsAcquireByHash()) + { + indexRecords::checkSum *Record = MetaIndexParser->Lookup(MetaKey); + if(Record) + { + // FIXME: should we really use the best hash here? or a fixed one? + const HashString *TargetHash = Record->Hashes.find(""); + std::string ByHash = "/by-hash/" + TargetHash->HashType() + "/" + TargetHash->HashValue(); + size_t trailing_slash = Desc.URI.find_last_of("/"); + Desc.URI = Desc.URI.replace( + trailing_slash, + Desc.URI.substr(trailing_slash+1).size()+1, + ByHash); + } else { + _error->Warning( + "Fetching ByHash requested but can not find record for %s", + MetaKey.c_str()); + } + } +} + /*}}}*/ // AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/ // --------------------------------------------------------------------- /* The only header we use is the last-modified header. */ +#if APT_PKG_ABI >= 413 +string pkgAcqIndex::Custom600Headers() const +#else string pkgAcqIndex::Custom600Headers() +#endif { - std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' ')); - string Final = _config->FindDir("Dir::State::lists"); - Final += URItoFileName(RealURI); - if (_config->FindB("Acquire::GzipIndexes",false)) - Final += compExt; - + string Final = GetFinalFilename(); + string msg = "\nIndex-File: true"; - // FIXME: this really should use "IndexTarget::IsOptional()" but that - // seems to be difficult without breaking ABI - if (ShortDesc().find("Translation") != 0) - msg += "\nFail-Ignore: true"; struct stat Buf; if (stat(Final.c_str(),&Buf) == 0) msg += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); + if(Target->IsOptional()) + msg += "\nFail-Ignore: true"; + return msg; } /*}}}*/ -void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/ +// pkgAcqIndex::Failed - getting the indexfile failed /*{{{*/ +void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { - size_t const nextExt = CompressionExtension.find(' '); + Item::Failed(Message,Cnf); + + size_t const nextExt = CompressionExtensions.find(' '); if (nextExt != std::string::npos) { - CompressionExtension = CompressionExtension.substr(nextExt+1); + CompressionExtensions = CompressionExtensions.substr(nextExt+1); Init(RealURI, Desc.Description, Desc.ShortDesc); + Status = StatIdle; return; } // on decompression failure, remove bad versions in partial/ - if (Decompression && Erase) { - string s = _config->FindDir("Dir::State::lists") + "partial/"; - s.append(URItoFileName(RealURI)); - unlink(s.c_str()); + if (Stage == STAGE_DECOMPRESS_AND_VERIFY) + { + unlink(EraseFileName.c_str()); } Item::Failed(Message,Cnf); + + if(Target->IsOptional() && ExpectedHashes.empty() && Stage == STAGE_DOWNLOAD) + Status = StatDone; + else + TransactionManager->AbortTransaction(); } /*}}}*/ -// pkgAcqIndex::GetFinalFilename - Return the full final file path /*{{{*/ -std::string pkgAcqIndex::GetFinalFilename(std::string const &URI, - std::string const &compExt) +// pkgAcqIndex::GetFinalFilename - Return the full final file path /*{{{*/ +std::string pkgAcqIndex::GetFinalFilename() const { std::string FinalFile = _config->FindDir("Dir::State::lists"); - FinalFile += URItoFileName(URI); - if (_config->FindB("Acquire::GzipIndexes",false) == true) - FinalFile += '.' + compExt; - return FinalFile; + FinalFile += URItoFileName(RealURI); + return GetCompressedFileName(RealURI, FinalFile, CurrentCompressionExtension); } /*}}}*/ // AcqIndex::ReverifyAfterIMS - Reverify index after an ims-hit /*{{{*/ -void pkgAcqIndex::ReverifyAfterIMS(std::string const &FileName) +void pkgAcqIndex::ReverifyAfterIMS() { - std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' ')); - if (_config->FindB("Acquire::GzipIndexes",false) == true) - DestFile += compExt; + // update destfile to *not* include the compression extension when doing + // a reverify (as its uncompressed on disk already) + DestFile = GetCompressedFileName(RealURI, GetPartialFileNameFromURI(RealURI), CurrentCompressionExtension); - string FinalFile = GetFinalFilename(RealURI, compExt); - Rename(FinalFile, FileName); - Decompression = true; - Desc.URI = "copy:" + FileName; + // copy FinalFile into partial/ so that we check the hash again + string FinalFile = GetFinalFilename(); + Stage = STAGE_DECOMPRESS_AND_VERIFY; + Desc.URI = "copy:" + FinalFile; QueueURI(Desc); } /*}}}*/ +// AcqIndex::ValidateFile - Validate the content of the downloaded file /*{{{*/ +bool pkgAcqIndex::ValidateFile(const std::string &FileName) +{ + // FIXME: this can go away once we only ever download stuff that + // has a valid hash and we never do GET based probing + // FIXME2: this also leaks debian-isms into the code and should go therefore + + /* Always validate the index file for correctness (all indexes must + * have a Package field) (LP: #346386) (Closes: #627642) + */ + FileFd fd(FileName, FileFd::ReadOnly, FileFd::Extension); + // Only test for correctness if the content of the file is not empty + // (empty is ok) + if (fd.Size() > 0) + { + pkgTagSection sec; + pkgTagFile tag(&fd); + + // all our current indexes have a field 'Package' in each section + if (_error->PendingError() == true || + tag.Step(sec) == false || + sec.Exists("Package") == false) + return false; + } + return true; +} + /*}}}*/ // AcqIndex::Done - Finished a fetch /*{{{*/ // --------------------------------------------------------------------- /* This goes through a number of states.. On the initial fetch the method could possibly return an alternate filename which points to the uncompressed version of the file. If this is so the file is copied into the partial directory. In all other cases the file - is decompressed with a gzip uri. */ -void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash, + is decompressed with a compressed uri. */ +void pkgAcqIndex::Done(string Message, + unsigned long long Size, + HashStringList const &Hashes, pkgAcquire::MethodConfig *Cfg) { - Item::Done(Message,Size,Hash,Cfg); - std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' ')); + Item::Done(Message,Size,Hashes,Cfg); - if (Decompression == true) + switch(Stage) { - if (_config->FindB("Debug::pkgAcquire::Auth", false)) - { - std::cerr << std::endl << RealURI << ": Computed Hash: " << Hash; - std::cerr << " Expected Hash: " << ExpectedHash.toStr() << std::endl; - } - - if (!ExpectedHash.empty() && ExpectedHash.toStr() != Hash) - { - Desc.URI = RealURI; - RenameOnError(HashSumMismatch); - return; - } - - // FIXME: this can go away once we only ever download stuff that - // has a valid hash and we never do GET based probing - // - /* Always verify the index file for correctness (all indexes must - * have a Package field) (LP: #346386) (Closes: #627642) - */ - FileFd fd(DestFile, FileFd::ReadOnly, FileFd::Extension); - // Only test for correctness if the file is not empty (empty is ok) - if (fd.Size() > 0) - { - pkgTagSection sec; - pkgTagFile tag(&fd); - - // all our current indexes have a field 'Package' in each section - if (_error->PendingError() == true || tag.Step(sec) == false || sec.Exists("Package") == false) - { - RenameOnError(InvalidFormat); - return; - } - } - - // Done, move it into position - string FinalFile = GetFinalFilename(RealURI, compExt); - Rename(DestFile,FinalFile); - chmod(FinalFile.c_str(),0644); - - /* We restore the original name to DestFile so that the clean operation - will work OK */ - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(RealURI); - if (_config->FindB("Acquire::GzipIndexes",false)) - DestFile += '.' + compExt; - - // Remove the compressed version. - if (Erase == true) - unlink(DestFile.c_str()); + case STAGE_DOWNLOAD: + StageDownloadDone(Message, Hashes, Cfg); + break; + case STAGE_DECOMPRESS_AND_VERIFY: + StageDecompressDone(Message, Hashes, Cfg); + break; + } +} + /*}}}*/ +// AcqIndex::StageDownloadDone - Queue for decompress and verify /*{{{*/ +void pkgAcqIndex::StageDownloadDone(string Message, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cfg) +{ + // First check if the calculcated Hash of the (compressed) downloaded + // file matches the hash we have in the MetaIndexRecords for this file + if(VerifyHashByMetaKey(Hashes) == false) + { + RenameOnError(HashSumMismatch); + Failed(Message, Cfg); return; } - Erase = false; Complete = true; - + // Handle the unzipd case string FileName = LookupTag(Message,"Alt-Filename"); if (FileName.empty() == false) { - Decompression = true; + Stage = STAGE_DECOMPRESS_AND_VERIFY; Local = true; DestFile += ".decomp"; Desc.URI = "copy:" + FileName; QueueURI(Desc); - Mode = "copy"; + SetActiveSubprocess("copy"); return; } @@ -1139,355 +1400,502 @@ void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash, ErrorText = "Method gave a blank filename"; } - if (FileName == DestFile) - Erase = true; - else + // Methods like e.g. "file:" will give us a (compressed) FileName that is + // not the "DestFile" we set, in this case we uncompress from the local file + if (FileName != DestFile) Local = true; + else + EraseFileName = FileName; - // The files timestamp matches, for non-local URLs reverify the local - // file, for local file, uncompress again to ensure the hashsum is still - // matching the Release file - bool const IsCDROM = RealURI.substr(0,6) == "cdrom:"; - if ((Local == false || IsCDROM == true) && - StringToBool(LookupTag(Message,"IMS-Hit"),false) == true) + // we need to verify the file against the current Release file again + // on if-modfied-since hit to avoid a stale attack against us + if(StringToBool(LookupTag(Message,"IMS-Hit"),false) == true) { - // set destfile to the final destfile - if(_config->FindB("Acquire::GzipIndexes",false) == false) - { - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(RealURI); - } - - // do not reverify cdrom sources as apt-cdrom may rewrite the Packages - // file when its doing the indexcopy - if (IsCDROM == false) - ReverifyAfterIMS(FileName); + // The files timestamp matches, reverify by copy into partial/ + EraseFileName = ""; + ReverifyAfterIMS(); return; } - string decompProg; - // If we enable compressed indexes, queue for hash verification + // If we have compressed indexes enabled, queue for hash verification if (_config->FindB("Acquire::GzipIndexes",false)) { - DestFile = _config->FindDir("Dir::State::lists"); - DestFile += URItoFileName(RealURI) + '.' + compExt; - - Decompression = true; + DestFile = GetPartialFileNameFromURI(RealURI + '.' + CurrentCompressionExtension); + EraseFileName = ""; + Stage = STAGE_DECOMPRESS_AND_VERIFY; Desc.URI = "copy:" + FileName; QueueURI(Desc); - + SetActiveSubprocess("copy"); return; } // get the binary name for your used compression type - decompProg = _config->Find(string("Acquire::CompressionTypes::").append(compExt),""); - if(decompProg.empty() == false); - else if(compExt == "uncompressed") + string decompProg; + if(CurrentCompressionExtension == "uncompressed") decompProg = "copy"; - else { - _error->Error("Unsupported extension: %s", compExt.c_str()); + else + decompProg = _config->Find(string("Acquire::CompressionTypes::").append(CurrentCompressionExtension),""); + if(decompProg.empty() == true) + { + _error->Error("Unsupported extension: %s", CurrentCompressionExtension.c_str()); return; } - Decompression = true; + // queue uri for the next stage + Stage = STAGE_DECOMPRESS_AND_VERIFY; DestFile += ".decomp"; Desc.URI = decompProg + ":" + FileName; QueueURI(Desc); + SetActiveSubprocess(decompProg); +} + /*}}}*/ +// pkgAcqIndex::StageDecompressDone - Final verification /*{{{*/ +void pkgAcqIndex::StageDecompressDone(string Message, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cfg) +{ + if (ExpectedHashes.usable() && ExpectedHashes != Hashes) + { + Desc.URI = RealURI; + RenameOnError(HashSumMismatch); + printHashSumComparision(RealURI, ExpectedHashes, Hashes); + Failed(Message, Cfg); + return; + } + + if(!ValidateFile(DestFile)) + { + RenameOnError(InvalidFormat); + Failed(Message, Cfg); + return; + } + + // remove the compressed version of the file + unlink(EraseFileName.c_str()); + + // Done, queue for rename on transaction finished + TransactionManager->TransactionStageCopy(this, DestFile, GetFinalFilename()); - // FIXME: this points to a c++ string that goes out of scope - Mode = decompProg.c_str(); + return; } /*}}}*/ -// 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, HashString(), "") +// AcqMetaBase::Add - Add a item to the current Transaction /*{{{*/ +void pkgAcqMetaBase::Add(Item *I) { + Transaction.push_back(I); } -pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, IndexTarget const *Target, - HashString const &ExpectedHash, indexRecords const *MetaIndexParser) - : pkgAcqIndex(Owner, Target, ExpectedHash, MetaIndexParser) + /*}}}*/ +// AcqMetaBase::AbortTransaction - Abort the current Transaction /*{{{*/ +void pkgAcqMetaBase::AbortTransaction() { + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "AbortTransaction: " << TransactionManager << std::endl; + + // ensure the toplevel is in error state too + for (std::vector<Item*>::iterator I = Transaction.begin(); + I != Transaction.end(); ++I) + { + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << " Cancel: " << (*I)->DestFile << std::endl; + // the transaction will abort, so stop anything that is idle + if ((*I)->Status == pkgAcquire::Item::StatIdle) + { + (*I)->Status = pkgAcquire::Item::StatDone; + (*I)->Dequeue(); + } + } + Transaction.clear(); } /*}}}*/ -// AcqIndexTrans::Custom600Headers - Insert custom request headers /*{{{*/ -// --------------------------------------------------------------------- -string pkgAcqIndexTrans::Custom600Headers() +// AcqMetaBase::TransactionHasError - Check for errors in Transaction /*{{{*/ +bool pkgAcqMetaBase::TransactionHasError() { - std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' ')); - string Final = _config->FindDir("Dir::State::lists"); - Final += URItoFileName(RealURI); - if (_config->FindB("Acquire::GzipIndexes",false)) - Final += compExt; + for (pkgAcquire::ItemIterator I = Transaction.begin(); + I != Transaction.end(); ++I) + if((*I)->Status != pkgAcquire::Item::StatDone && + (*I)->Status != pkgAcquire::Item::StatIdle) + return true; - struct stat Buf; - if (stat(Final.c_str(),&Buf) != 0) - return "\nFail-Ignore: true\nIndex-File: true"; - return "\nFail-Ignore: true\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); + return false; } /*}}}*/ -// AcqIndexTrans::Failed - Silence failure messages for missing files /*{{{*/ -// --------------------------------------------------------------------- -/* */ -void pkgAcqIndexTrans::Failed(string Message,pkgAcquire::MethodConfig *Cnf) +// AcqMetaBase::CommitTransaction - Commit a transaction /*{{{*/ +void pkgAcqMetaBase::CommitTransaction() { - size_t const nextExt = CompressionExtension.find(' '); - if (nextExt != std::string::npos) + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "CommitTransaction: " << this << std::endl; + + // move new files into place *and* remove files that are not + // part of the transaction but are still on disk + for (std::vector<Item*>::iterator I = Transaction.begin(); + I != Transaction.end(); ++I) { - CompressionExtension = CompressionExtension.substr(nextExt+1); - Init(RealURI, Desc.Description, Desc.ShortDesc); - Status = StatIdle; - return; - } + if((*I)->PartialFile != "") + { + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "mv " << (*I)->PartialFile << " -> "<< (*I)->DestFile << " " + << (*I)->DescURI() << std::endl; - if (Cnf->LocalOnly == true || - StringToBool(LookupTag(Message,"Transient-Failure"),false) == false) - { - // Ignore this - Status = StatDone; - Complete = false; - Dequeue(); - return; + Rename((*I)->PartialFile, (*I)->DestFile); + } else { + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "rm " + << (*I)->DestFile + << " " + << (*I)->DescURI() + << std::endl; + unlink((*I)->DestFile.c_str()); + } + // mark that this transaction is finished + (*I)->TransactionManager = 0; } + Transaction.clear(); +} + /*}}}*/ +// AcqMetaBase::TransactionStageCopy - Stage a file for copying /*{{{*/ +void pkgAcqMetaBase::TransactionStageCopy(Item *I, + const std::string &From, + const std::string &To) +{ + I->PartialFile = From; + I->DestFile = To; +} + /*}}}*/ +// AcqMetaBase::TransactionStageRemoval - Sage a file for removal /*{{{*/ +void pkgAcqMetaBase::TransactionStageRemoval(Item *I, + const std::string &FinalFile) +{ + I->PartialFile = ""; + I->DestFile = FinalFile; +} + /*}}}*/ +// AcqMetaBase::GenerateAuthWarning - Check gpg authentication error /*{{{*/ +bool pkgAcqMetaBase::CheckStopAuthentication(const std::string &RealURI, + const std::string &Message) +{ + // FIXME: this entire function can do now that we disallow going to + // a unauthenticated state and can cleanly rollback - Item::Failed(Message,Cnf); + string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); + + if(FileExists(Final)) + { + Status = StatTransientNetworkError; + _error->Warning(_("An error occurred during the signature " + "verification. The repository is not updated " + "and the previous index files will be used. " + "GPG error: %s: %s\n"), + Desc.Description.c_str(), + LookupTag(Message,"Message").c_str()); + RunScripts("APT::Update::Auth-Failure"); + return true; + } else if (LookupTag(Message,"Message").find("NODATA") != string::npos) { + /* Invalid signature file, reject (LP: #346386) (Closes: #627642) */ + _error->Error(_("GPG error: %s: %s"), + Desc.Description.c_str(), + LookupTag(Message,"Message").c_str()); + Status = StatError; + return true; + } else { + _error->Warning(_("GPG error: %s: %s"), + Desc.Description.c_str(), + LookupTag(Message,"Message").c_str()); + } + // gpgv method failed + ReportMirrorFailure("GPGFailure"); + return false; } /*}}}*/ -pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner, /*{{{*/ +// AcqMetaSig::AcqMetaSig - Constructor /*{{{*/ +pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, string URI,string URIDesc,string ShortDesc, - string MetaIndexURI, string MetaIndexURIDesc, - string MetaIndexShortDesc, + string MetaIndexFile, const vector<IndexTarget*>* IndexTargets, indexRecords* MetaIndexParser) : - Item(Owner), RealURI(URI), MetaIndexURI(MetaIndexURI), - MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc), - MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets) + pkgAcqMetaBase(Owner, IndexTargets, MetaIndexParser, + HashStringList(), TransactionManager), + RealURI(URI), MetaIndexFile(MetaIndexFile), URIDesc(URIDesc), + ShortDesc(ShortDesc) { DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(URI); + DestFile += URItoFileName(RealURI); - // remove any partial downloaded sig-file in partial/. - // it may confuse proxies and is too small to warrant a + // 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()); + // set the TransactionManager + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "New pkgAcqMetaSig with TransactionManager " + << TransactionManager << std::endl; + // Create the item Desc.Description = URIDesc; Desc.Owner = this; Desc.ShortDesc = ShortDesc; Desc.URI = URI; - - string Final = _config->FindDir("Dir::State::lists"); - Final += URItoFileName(RealURI); - if (RealFileExists(Final) == true) - { - // File was already in place. It needs to be re-downloaded/verified - // because Release might have changed, we do give it a different - // name than DestFile because otherwise the http method will - // send If-Range requests and there are too many broken servers - // out there that do not understand them - LastGoodSig = DestFile+".reverify"; - Rename(Final,LastGoodSig); - } QueueURI(Desc); } /*}}}*/ pkgAcqMetaSig::~pkgAcqMetaSig() /*{{{*/ { - // if the file was never queued undo file-changes done in the constructor - if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false && - LastGoodSig.empty() == false) - { - string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); - if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true) - Rename(LastGoodSig, Final); - } - } /*}}}*/ // pkgAcqMetaSig::Custom600Headers - Insert custom request headers /*{{{*/ // --------------------------------------------------------------------- -/* The only header we use is the last-modified header. */ +#if APT_PKG_ABI >= 413 +string pkgAcqMetaSig::Custom600Headers() const +#else string pkgAcqMetaSig::Custom600Headers() +#endif { - struct stat Buf; - if (stat(LastGoodSig.c_str(),&Buf) != 0) - return "\nIndex-File: true"; - - return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); + std::string Header = GetCustom600Headers(RealURI); + return Header; } - -void pkgAcqMetaSig::Done(string Message,unsigned long long Size,string MD5, + /*}}}*/ +// pkgAcqMetaSig::Done - The signature was downloaded/verified /*{{{*/ +// --------------------------------------------------------------------- +/* The only header we use is the last-modified header. */ +void pkgAcqMetaSig::Done(string Message,unsigned long long Size, + HashStringList const &Hashes, pkgAcquire::MethodConfig *Cfg) { - Item::Done(Message,Size,MD5,Cfg); + Item::Done(Message, Size, Hashes, Cfg); - string FileName = LookupTag(Message,"Filename"); - if (FileName.empty() == true) + if(AuthPass == false) { - Status = StatError; - ErrorText = "Method gave a blank filename"; + if(CheckDownloadDone(Message, RealURI) == true) + { + // destfile will be modified to point to MetaIndexFile for the + // gpgv method, so we need to save it here + MetaIndexFileSignature = DestFile; + QueueForSignatureVerify(MetaIndexFile, MetaIndexFileSignature); + } return; } - - if (FileName != DestFile) + else { - // We have to copy it into place - Local = true; - Desc.URI = "copy:" + FileName; - QueueURI(Desc); - return; + if(CheckAuthDone(Message, RealURI) == true) + { + std::string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + TransactionManager->TransactionStageCopy(this, MetaIndexFileSignature, FinalFile); + } } - - Complete = true; - - // put the last known good file back on i-m-s hit (it will - // be re-verified again) - // Else do nothing, we have the new file in DestFile then - if(StringToBool(LookupTag(Message,"IMS-Hit"),false) == true) - Rename(LastGoodSig, DestFile); - - // queue a pkgAcqMetaIndex to be verified against the sig we just retrieved - new pkgAcqMetaIndex(Owner, MetaIndexURI, MetaIndexURIDesc, - MetaIndexShortDesc, DestFile, IndexTargets, - MetaIndexParser); - } /*}}}*/ void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)/*{{{*/ { - string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); + Item::Failed(Message,Cnf); - // if we get a network error we fail gracefully - if(Status == StatTransientNetworkError) - { - Item::Failed(Message,Cnf); - // move the sigfile back on transient network failures - if(FileExists(LastGoodSig)) - Rename(LastGoodSig,Final); + // check if we need to fail at this point + if (AuthPass == true && CheckStopAuthentication(RealURI, Message)) + return; - // set the status back to , Item::Failed likes to reset it - Status = pkgAcquire::Item::StatTransientNetworkError; - return; + // FIXME: meh, this is not really elegant + string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); + string const InReleaseURI = RealURI.replace(RealURI.rfind("Release.gpg"), 12, + "InRelease"); + string const FinalInRelease = _config->FindDir("Dir::State::lists") + URItoFileName(InReleaseURI); + + if (RealFileExists(Final) || RealFileExists(FinalInRelease)) + { + std::string downgrade_msg; + strprintf(downgrade_msg, _("The repository '%s' is no longer signed."), + URIDesc.c_str()); + if(_config->FindB("Acquire::AllowDowngradeToInsecureRepositories")) + { + // meh, the users wants to take risks (we still mark the packages + // from this repository as unauthenticated) + _error->Warning("%s", downgrade_msg.c_str()); + _error->Warning(_("This is normally not allowed, but the option " + "Acquire::AllowDowngradeToInsecureRepositories was " + "given to override it.")); + Status = StatDone; + } else { + _error->Error("%s", downgrade_msg.c_str()); + Rename(MetaIndexFile, MetaIndexFile+".FAILED"); + Item::Failed("Message: " + downgrade_msg, Cnf); + TransactionManager->AbortTransaction(); + return; + } } + else + _error->Warning(_("The data from '%s' is not signed. Packages " + "from that repository can not be authenticated."), + URIDesc.c_str()); - // Delete any existing sigfile when the acquire failed - unlink(Final.c_str()); + // this ensures that any file in the lists/ dir is removed by the + // transaction + DestFile = GetPartialFileNameFromURI(RealURI); + TransactionManager->TransactionStageRemoval(this, DestFile); - // queue a pkgAcqMetaIndex with no sigfile - new pkgAcqMetaIndex(Owner, MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc, - "", IndexTargets, MetaIndexParser); + // only allow going further if the users explicitely wants it + if(AllowInsecureRepositories(MetaIndexParser, TransactionManager, this) == true) + { + // we parse the indexes here because at this point the user wanted + // a repository that may potentially harm him + MetaIndexParser->Load(MetaIndexFile); + QueueIndexes(true); + } - if (Cnf->LocalOnly == true || + // FIXME: this is used often (e.g. in pkgAcqIndexTrans) so refactor + if (Cnf->LocalOnly == true || StringToBool(LookupTag(Message,"Transient-Failure"),false) == false) - { + { // Ignore this Status = StatDone; - Complete = false; - Dequeue(); - return; } - - Item::Failed(Message,Cnf); } /*}}}*/ pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner, /*{{{*/ + pkgAcqMetaBase *TransactionManager, string URI,string URIDesc,string ShortDesc, - string SigFile, - const vector<struct IndexTarget*>* IndexTargets, + string MetaIndexSigURI,string MetaIndexSigURIDesc, string MetaIndexSigShortDesc, + const vector<IndexTarget*>* IndexTargets, indexRecords* MetaIndexParser) : - Item(Owner), RealURI(URI), SigFile(SigFile), IndexTargets(IndexTargets), - MetaIndexParser(MetaIndexParser), AuthPass(false), IMSHit(false) + pkgAcqMetaBase(Owner, IndexTargets, MetaIndexParser, HashStringList(), + TransactionManager), + RealURI(URI), URIDesc(URIDesc), ShortDesc(ShortDesc), + MetaIndexSigURI(MetaIndexSigURI), MetaIndexSigURIDesc(MetaIndexSigURIDesc), + MetaIndexSigShortDesc(MetaIndexSigShortDesc) { - DestFile = _config->FindDir("Dir::State::lists") + "partial/"; - DestFile += URItoFileName(URI); + if(TransactionManager == NULL) + { + this->TransactionManager = this; + this->TransactionManager->Add(this); + } + + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "New pkgAcqMetaIndex with TransactionManager " + << this->TransactionManager << std::endl; + + + Init(URIDesc, ShortDesc); +} + /*}}}*/ +// pkgAcqMetaIndex::Init - Delayed constructor /*{{{*/ +void pkgAcqMetaIndex::Init(std::string URIDesc, std::string ShortDesc) +{ + DestFile = GetPartialFileNameFromURI(RealURI); // Create the item Desc.Description = URIDesc; Desc.Owner = this; Desc.ShortDesc = ShortDesc; - Desc.URI = URI; + Desc.URI = RealURI; + // we expect more item + ExpectedAdditionalItems = IndexTargets->size(); QueueURI(Desc); } /*}}}*/ // pkgAcqMetaIndex::Custom600Headers - Insert custom request headers /*{{{*/ // --------------------------------------------------------------------- -/* The only header we use is the last-modified header. */ +#if APT_PKG_ABI >= 413 +string pkgAcqMetaIndex::Custom600Headers() const +#else string pkgAcqMetaIndex::Custom600Headers() +#endif { - string Final = _config->FindDir("Dir::State::lists"); - Final += URItoFileName(RealURI); - - struct stat Buf; - if (stat(Final.c_str(),&Buf) != 0) - return "\nIndex-File: true"; - - return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); + return GetCustom600Headers(RealURI); } /*}}}*/ -void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,string Hash, /*{{{*/ +void pkgAcqMetaIndex::Done(string Message,unsigned long long Size, /*{{{*/ + HashStringList const &Hashes, pkgAcquire::MethodConfig *Cfg) { - Item::Done(Message,Size,Hash,Cfg); + Item::Done(Message,Size,Hashes,Cfg); - // MetaIndexes are done in two passes: one to download the - // metaindex with an appropriate method, and a second to verify it - // with the gpgv method - - if (AuthPass == true) + if(CheckDownloadDone(Message, RealURI)) { - AuthDone(Message); + // we have a Release file, now download the Signature, all further + // verify/queue for additional downloads will be done in the + // pkgAcqMetaSig::Done() code + std::string MetaIndexFile = DestFile; + new pkgAcqMetaSig(Owner, TransactionManager, + MetaIndexSigURI, MetaIndexSigURIDesc, + MetaIndexSigShortDesc, MetaIndexFile, IndexTargets, + MetaIndexParser); - // all cool, move Release file into place - Complete = true; + string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); } - else - { - RetrievalDone(Message); - if (!Complete) - // Still more retrieving to do - return; +} + /*}}}*/ +bool pkgAcqMetaBase::CheckAuthDone(string Message, const string &RealURI) /*{{{*/ +{ + // At this point, the gpgv method has succeeded, so there is a + // valid signature from a key in the trusted keyring. We + // perform additional verification of its contents, and use them + // to verify the indexes we are about to download - if (SigFile == "") - { - // There was no signature file, so we are finished. Download - // the indexes and do only hashsum verification if possible - MetaIndexParser->Load(DestFile); - QueueIndexes(false); - } - else - { - // There was a signature file, so pass it to gpgv for - // verification - - if (_config->FindB("Debug::pkgAcquire::Auth", false)) - std::cerr << "Metaindex acquired, queueing gpg verification (" - << SigFile << "," << DestFile << ")\n"; - AuthPass = true; - Desc.URI = "gpgv:" + SigFile; - QueueURI(Desc); - Mode = "gpgv"; - return; - } + if (!MetaIndexParser->Load(DestFile)) + { + Status = StatAuthError; + ErrorText = MetaIndexParser->ErrorText; + return false; } - if (Complete == true) + if (!VerifyVendor(Message, RealURI)) { - string FinalFile = _config->FindDir("Dir::State::lists"); - FinalFile += URItoFileName(RealURI); - if (SigFile == DestFile) - SigFile = FinalFile; - Rename(DestFile,FinalFile); - chmod(FinalFile.c_str(),0644); - DestFile = FinalFile; + return false; } + + if (_config->FindB("Debug::pkgAcquire::Auth", false)) + std::cerr << "Signature verification succeeded: " + << DestFile << std::endl; + + // Download further indexes with verification + // + // it would be really nice if we could simply do + // if (IMSHit == false) QueueIndexes(true) + // and skip the download if the Release file has not changed + // - but right now the list cleaner will needs to be tricked + // to not delete all our packages/source indexes in this case + QueueIndexes(true); + + return true; +} + /*}}}*/ +// pkgAcqMetaBase::GetCustom600Headers - Get header for AcqMetaBase /*{{{*/ +// --------------------------------------------------------------------- +string pkgAcqMetaBase::GetCustom600Headers(const string &RealURI) const +{ + std::string Header = "\nIndex-File: true"; + std::string MaximumSize; + strprintf(MaximumSize, "\nMaximum-Size: %i", + _config->FindI("Acquire::MaxReleaseFileSize", 10*1000*1000)); + Header += MaximumSize; + + string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + + struct stat Buf; + if (stat(FinalFile.c_str(),&Buf) == 0) + Header += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); + + return Header; +} + /*}}}*/ +// pkgAcqMetaBase::QueueForSignatureVerify /*{{{*/ +void pkgAcqMetaBase::QueueForSignatureVerify(const std::string &MetaIndexFile, + const std::string &MetaIndexFileSignature) +{ + AuthPass = true; + Desc.URI = "gpgv:" + MetaIndexFileSignature; + DestFile = MetaIndexFile; + QueueURI(Desc); + SetActiveSubprocess("gpgv"); } /*}}}*/ -void pkgAcqMetaIndex::RetrievalDone(string Message) /*{{{*/ +// pkgAcqMetaBase::CheckDownloadDone /*{{{*/ +bool pkgAcqMetaBase::CheckDownloadDone(const std::string &Message, + const std::string &RealURI) { // We have just finished downloading a Release file (it is not // verified yet) @@ -1497,7 +1905,7 @@ void pkgAcqMetaIndex::RetrievalDone(string Message) /*{{{*/ { Status = StatError; ErrorText = "Method gave a blank filename"; - return; + return false; } if (FileName != DestFile) @@ -1505,7 +1913,7 @@ void pkgAcqMetaIndex::RetrievalDone(string Message) /*{{{*/ Local = true; Desc.URI = "copy:" + FileName; QueueURI(Desc); - return; + return false; } // make sure to verify against the right file on I-M-S hit @@ -1514,181 +1922,74 @@ void pkgAcqMetaIndex::RetrievalDone(string Message) /*{{{*/ { string FinalFile = _config->FindDir("Dir::State::lists"); FinalFile += URItoFileName(RealURI); - if (SigFile == DestFile) - { - SigFile = FinalFile; - // constructor of pkgAcqMetaClearSig moved it out of the way, - // now move it back in on IMS hit for the 'old' file - string const OldClearSig = DestFile + ".reverify"; - if (RealFileExists(OldClearSig) == true) - Rename(OldClearSig, FinalFile); - } DestFile = FinalFile; } - Complete = true; -} - /*}}}*/ -void pkgAcqMetaIndex::AuthDone(string Message) /*{{{*/ -{ - // At this point, the gpgv method has succeeded, so there is a - // valid signature from a key in the trusted keyring. We - // perform additional verification of its contents, and use them - // to verify the indexes we are about to download - if (!MetaIndexParser->Load(DestFile)) - { - Status = StatAuthError; - ErrorText = MetaIndexParser->ErrorText; - return; - } - - if (!VerifyVendor(Message)) - { - return; - } - - if (_config->FindB("Debug::pkgAcquire::Auth", false)) - std::cerr << "Signature verification succeeded: " - << DestFile << std::endl; - - // do not trust any previously unverified content that we may have - string LastGoodSigFile = _config->FindDir("Dir::State::lists").append("partial/").append(URItoFileName(RealURI)); - if (DestFile != SigFile) - LastGoodSigFile.append(".gpg"); - LastGoodSigFile.append(".reverify"); - if(IMSHit == false && RealFileExists(LastGoodSigFile) == false) - { - for (vector <struct IndexTarget*>::const_iterator Target = IndexTargets->begin(); - Target != IndexTargets->end(); - ++Target) - { - // remove old indexes - std::string index = _config->FindDir("Dir::State::lists") + - URItoFileName((*Target)->URI); - unlink(index.c_str()); - // and also old gzipindexes - std::vector<std::string> types = APT::Configuration::getCompressionTypes(); - for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t) - { - index += '.' + (*t); - unlink(index.c_str()); - } - } - } - - - // Download further indexes with verification - QueueIndexes(true); - - // is it a clearsigned MetaIndex file? - if (DestFile == SigFile) - return; + // set Item to complete as the remaining work is all local (verify etc) + Complete = true; - // Done, move signature file into position - string VerifiedSigFile = _config->FindDir("Dir::State::lists") + - URItoFileName(RealURI) + ".gpg"; - Rename(SigFile,VerifiedSigFile); - chmod(VerifiedSigFile.c_str(),0644); + return true; } /*}}}*/ -void pkgAcqMetaIndex::QueueIndexes(bool verify) /*{{{*/ +void pkgAcqMetaBase::QueueIndexes(bool verify) /*{{{*/ { -#if 0 - /* Reject invalid, existing Release files (LP: #346386) (Closes: #627642) - * FIXME: Disabled; it breaks unsigned repositories without hashes */ - if (!verify && FileExists(DestFile) && !MetaIndexParser->Load(DestFile)) - { - Status = StatError; - ErrorText = MetaIndexParser->ErrorText; - return; - } -#endif - bool transInRelease = false; - { - std::vector<std::string> const keys = MetaIndexParser->MetaKeys(); - for (std::vector<std::string>::const_iterator k = keys.begin(); k != keys.end(); ++k) - // FIXME: Feels wrong to check for hardcoded string here, but what should we do else… - if (k->find("Translation-") != std::string::npos) - { - transInRelease = true; - break; - } - } + // at this point the real Items are loaded in the fetcher + ExpectedAdditionalItems = 0; - for (vector <struct IndexTarget*>::const_iterator Target = IndexTargets->begin(); + vector <struct IndexTarget*>::const_iterator Target; + for (Target = IndexTargets->begin(); Target != IndexTargets->end(); ++Target) { - HashString ExpectedIndexHash; + HashStringList ExpectedIndexHashes; const indexRecords::checkSum *Record = MetaIndexParser->Lookup((*Target)->MetaKey); - bool compressedAvailable = false; - if (Record == NULL) + + // optional target that we do not have in the Release file are + // skipped + if (verify == true && Record == NULL && (*Target)->IsOptional()) + continue; + + // targets without a hash record are a error when verify is required + if (verify == true && Record == NULL) { - if ((*Target)->IsOptional() == true) - { - std::vector<std::string> types = APT::Configuration::getCompressionTypes(); - for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t) - if (MetaIndexParser->Exists((*Target)->MetaKey + "." + *t) == true) - { - compressedAvailable = true; - break; - } - } - else if (verify == true) - { - Status = StatAuthError; - strprintf(ErrorText, _("Unable to find expected entry '%s' in Release file (Wrong sources.list entry or malformed file)"), (*Target)->MetaKey.c_str()); - return; - } + Status = StatAuthError; + strprintf(ErrorText, _("Unable to find expected entry '%s' in Release file (Wrong sources.list entry or malformed file)"), (*Target)->MetaKey.c_str()); + return; } - else + + if (Record) + ExpectedIndexHashes = Record->Hashes; + + if (_config->FindB("Debug::pkgAcquire::Auth", false)) { - ExpectedIndexHash = Record->Hash; - if (_config->FindB("Debug::pkgAcquire::Auth", false)) - { - std::cerr << "Queueing: " << (*Target)->URI << std::endl; - std::cerr << "Expected Hash: " << ExpectedIndexHash.toStr() << std::endl; - std::cerr << "For: " << Record->MetaKeyFilename << std::endl; - } - if (verify == true && ExpectedIndexHash.empty() == true && (*Target)->IsOptional() == false) - { - Status = StatAuthError; - strprintf(ErrorText, _("Unable to find hash sum for '%s' in Release file"), (*Target)->MetaKey.c_str()); - return; - } - } + std::cerr << "Queueing: " << (*Target)->URI << std::endl + << "Expected Hash:" << std::endl; + for (HashStringList::const_iterator hs = ExpectedIndexHashes.begin(); hs != ExpectedIndexHashes.end(); ++hs) + std::cerr << "\t- " << hs->toStr() << std::endl; + std::cerr << "For: " << Record->MetaKeyFilename << std::endl; - if ((*Target)->IsOptional() == true) + } + if (verify == true && ExpectedIndexHashes.empty() == true) { - if ((*Target)->IsSubIndex() == true) - new pkgAcqSubIndex(Owner, (*Target)->URI, (*Target)->Description, - (*Target)->ShortDesc, ExpectedIndexHash); - else if (transInRelease == false || Record != NULL || compressedAvailable == true) - { - if (_config->FindB("Acquire::PDiffs",true) == true && transInRelease == true && - MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true) - new pkgAcqDiffIndex(Owner, (*Target)->URI, (*Target)->Description, - (*Target)->ShortDesc, ExpectedIndexHash); - else - new pkgAcqIndexTrans(Owner, *Target, ExpectedIndexHash, MetaIndexParser); - } - continue; + Status = StatAuthError; + strprintf(ErrorText, _("Unable to find hash sum for '%s' in Release file"), (*Target)->MetaKey.c_str()); + return; } - /* Queue Packages file (either diff or full packages files, depending + /* Queue the Index file (Packages, Sources, Translation-$foo + (either diff or full packages files, depending on the users option) - we also check if the PDiff Index file is listed in the Meta-Index file. Ideal would be if pkgAcqDiffIndex would test this instead, but passing the required info to it is to much hassle */ if(_config->FindB("Acquire::PDiffs",true) == true && (verify == false || - MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true)) - new pkgAcqDiffIndex(Owner, (*Target)->URI, (*Target)->Description, - (*Target)->ShortDesc, ExpectedIndexHash); + MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true)) + new pkgAcqDiffIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser); else - new pkgAcqIndex(Owner, *Target, ExpectedIndexHash, MetaIndexParser); + new pkgAcqIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser); } } /*}}}*/ -bool pkgAcqMetaIndex::VerifyVendor(string Message) /*{{{*/ +bool pkgAcqMetaBase::VerifyVendor(string Message, const string &RealURI)/*{{{*/ { string::size_type pos; @@ -1765,147 +2066,169 @@ bool pkgAcqMetaIndex::VerifyVendor(string Message) /*{{{*/ return true; } /*}}}*/ -// pkgAcqMetaIndex::Failed - no Release file present or no signature file present /*{{{*/ -// --------------------------------------------------------------------- -/* */ -void pkgAcqMetaIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/) +// pkgAcqMetaIndex::Failed - no Release file present /*{{{*/ +void pkgAcqMetaIndex::Failed(string Message, + pkgAcquire::MethodConfig * Cnf) { - if (AuthPass == true) - { - // gpgv method failed, if we have a good signature - string LastGoodSigFile = _config->FindDir("Dir::State::lists").append("partial/").append(URItoFileName(RealURI)); - if (DestFile != SigFile) - LastGoodSigFile.append(".gpg"); - LastGoodSigFile.append(".reverify"); + pkgAcquire::Item::Failed(Message, Cnf); + Status = StatDone; - if(FileExists(LastGoodSigFile)) - { - string VerifiedSigFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); - if (DestFile != SigFile) - VerifiedSigFile.append(".gpg"); - Rename(LastGoodSigFile, VerifiedSigFile); - Status = StatTransientNetworkError; - _error->Warning(_("An error occurred during the signature " - "verification. The repository is not updated " - "and the previous index files will be used. " - "GPG error: %s: %s\n"), - Desc.Description.c_str(), - LookupTag(Message,"Message").c_str()); - RunScripts("APT::Update::Auth-Failure"); - return; - } else if (LookupTag(Message,"Message").find("NODATA") != string::npos) { - /* Invalid signature file, reject (LP: #346386) (Closes: #627642) */ - _error->Error(_("GPG error: %s: %s"), - Desc.Description.c_str(), - LookupTag(Message,"Message").c_str()); - return; - } else { - _error->Warning(_("GPG error: %s: %s"), - Desc.Description.c_str(), - LookupTag(Message,"Message").c_str()); - } - // gpgv method failed - ReportMirrorFailure("GPGFailure"); - } + string FinalFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); - /* Always move the meta index, even if gpgv failed. This ensures - * that PackageFile objects are correctly filled in */ - if (FileExists(DestFile)) { - string FinalFile = _config->FindDir("Dir::State::lists"); - FinalFile += URItoFileName(RealURI); - /* InRelease files become Release files, otherwise - * they would be considered as trusted later on */ - if (SigFile == DestFile) { - RealURI = RealURI.replace(RealURI.rfind("InRelease"), 9, - "Release"); - FinalFile = FinalFile.replace(FinalFile.rfind("InRelease"), 9, - "Release"); - SigFile = FinalFile; - } - Rename(DestFile,FinalFile); - chmod(FinalFile.c_str(),0644); + _error->Warning(_("The repository '%s' does not have a Release file. " + "This is deprecated, please contact the owner of the " + "repository."), URIDesc.c_str()); - DestFile = FinalFile; - } - - // No Release file was present, or verification failed, so fall + // No Release file was present so fall // back to queueing Packages files without verification - QueueIndexes(false); + // only allow going further if the users explicitely wants it + if(AllowInsecureRepositories(MetaIndexParser, TransactionManager, this) == true) + { + // Done, queue for rename on transaction finished + if (FileExists(DestFile)) + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); + + // queue without any kind of hashsum support + QueueIndexes(false); + } +} + /*}}}*/ +void pkgAcqMetaIndex::Finished() /*{{{*/ +{ + if(_config->FindB("Debug::Acquire::Transaction", false) == true) + std::clog << "Finished: " << DestFile <<std::endl; + if(TransactionManager != NULL && + TransactionManager->TransactionHasError() == false) + TransactionManager->CommitTransaction(); } /*}}}*/ pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire *Owner, /*{{{*/ string const &URI, string const &URIDesc, string const &ShortDesc, string const &MetaIndexURI, string const &MetaIndexURIDesc, string const &MetaIndexShortDesc, string const &MetaSigURI, string const &MetaSigURIDesc, string const &MetaSigShortDesc, - const vector<struct IndexTarget*>* IndexTargets, + const vector<IndexTarget*>* IndexTargets, indexRecords* MetaIndexParser) : - pkgAcqMetaIndex(Owner, URI, URIDesc, ShortDesc, "", IndexTargets, MetaIndexParser), - MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc), - MetaSigURI(MetaSigURI), MetaSigURIDesc(MetaSigURIDesc), MetaSigShortDesc(MetaSigShortDesc) + pkgAcqMetaIndex(Owner, NULL, URI, URIDesc, ShortDesc, MetaSigURI, MetaSigURIDesc,MetaSigShortDesc, IndexTargets, MetaIndexParser), + MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc), + MetaSigURI(MetaSigURI), MetaSigURIDesc(MetaSigURIDesc), MetaSigShortDesc(MetaSigShortDesc) { - SigFile = DestFile; + // index targets + (worst case:) Release/Release.gpg + ExpectedAdditionalItems = IndexTargets->size() + 2; - // keep the old InRelease around in case of transistent network errors - string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); - if (RealFileExists(Final) == true) - { - string const LastGoodSig = DestFile + ".reverify"; - Rename(Final,LastGoodSig); - } } /*}}}*/ pkgAcqMetaClearSig::~pkgAcqMetaClearSig() /*{{{*/ { - // if the file was never queued undo file-changes done in the constructor - if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false) - { - string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI); - string const LastGoodSig = DestFile + ".reverify"; - if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true) - Rename(LastGoodSig, Final); - } } /*}}}*/ // pkgAcqMetaClearSig::Custom600Headers - Insert custom request headers /*{{{*/ // --------------------------------------------------------------------- -// FIXME: this can go away once the InRelease file is used widely +#if APT_PKG_ABI >= 413 +string pkgAcqMetaClearSig::Custom600Headers() const +#else string pkgAcqMetaClearSig::Custom600Headers() +#endif { - string Final = _config->FindDir("Dir::State::lists"); - Final += URItoFileName(RealURI); + string Header = GetCustom600Headers(RealURI); + Header += "\nFail-Ignore: true"; + return Header; +} + /*}}}*/ +// pkgAcqMetaClearSig::Done - We got a file /*{{{*/ +// --------------------------------------------------------------------- +void pkgAcqMetaClearSig::Done(std::string Message,unsigned long long Size, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cnf) +{ + Item::Done(Message, Size, Hashes, Cnf); - struct stat Buf; - if (stat(Final.c_str(),&Buf) != 0) + // if we expect a ClearTextSignature (InRelase), ensure that + // this is what we get and if not fail to queue a + // Release/Release.gpg, see #346386 + if (FileExists(DestFile) && !StartsWithGPGClearTextSignature(DestFile)) { - Final = DestFile + ".reverify"; - if (stat(Final.c_str(),&Buf) != 0) - return "\nIndex-File: true\nFail-Ignore: true\n"; + pkgAcquire::Item::Failed(Message, Cnf); + RenameOnError(NotClearsigned); + TransactionManager->AbortTransaction(); + return; } - return "\nIndex-File: true\nFail-Ignore: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); + if(AuthPass == false) + { + if(CheckDownloadDone(Message, RealURI) == true) + QueueForSignatureVerify(DestFile, DestFile); + return; + } + else + { + if(CheckAuthDone(Message, RealURI) == true) + { + string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + + // queue for copy in place + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); + } + } } /*}}}*/ void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/ { + Item::Failed(Message, Cnf); + + // we failed, we will not get additional items from this method + ExpectedAdditionalItems = 0; + if (AuthPass == false) { - // Remove the 'old' InRelease file if we try Release.gpg now as otherwise - // the file will stay around and gives a false-auth impression (CVE-2012-0214) + // Queue the 'old' InRelease file for removal if we try Release.gpg + // as otherwise the file will stay around and gives a false-auth + // impression (CVE-2012-0214) string FinalFile = _config->FindDir("Dir::State::lists"); FinalFile.append(URItoFileName(RealURI)); - if (FileExists(FinalFile)) - unlink(FinalFile.c_str()); + TransactionManager->TransactionStageRemoval(this, FinalFile); + Status = StatDone; - new pkgAcqMetaSig(Owner, - MetaSigURI, MetaSigURIDesc, MetaSigShortDesc, + new pkgAcqMetaIndex(Owner, TransactionManager, MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc, + MetaSigURI, MetaSigURIDesc, MetaSigShortDesc, IndexTargets, MetaIndexParser); - if (Cnf->LocalOnly == true || - StringToBool(LookupTag(Message, "Transient-Failure"), false) == false) - Dequeue(); } else - pkgAcqMetaIndex::Failed(Message, Cnf); + { + if(CheckStopAuthentication(RealURI, Message)) + return; + + _error->Warning(_("The data from '%s' is not signed. Packages " + "from that repository can not be authenticated."), + URIDesc.c_str()); + + // No Release file was present, or verification failed, so fall + // back to queueing Packages files without verification + // only allow going further if the users explicitely wants it + if(AllowInsecureRepositories(MetaIndexParser, TransactionManager, this) == true) + { + Status = StatDone; + + /* Always move the meta index, even if gpgv failed. This ensures + * that PackageFile objects are correctly filled in */ + if (FileExists(DestFile)) + { + string FinalFile = _config->FindDir("Dir::State::lists"); + FinalFile += URItoFileName(RealURI); + /* InRelease files become Release files, otherwise + * they would be considered as trusted later on */ + RealURI = RealURI.replace(RealURI.rfind("InRelease"), 9, + "Release"); + FinalFile = FinalFile.replace(FinalFile.rfind("InRelease"), 9, + "Release"); + + // Done, queue for rename on transaction finished + TransactionManager->TransactionStageCopy(this, DestFile, FinalFile); + } + QueueIndexes(false); + } + } } /*}}}*/ // AcqArchive::AcqArchive - Constructor /*{{{*/ @@ -1915,7 +2238,7 @@ void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /* pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources, pkgRecords *Recs,pkgCache::VerIterator const &Version, string &StoreFilename) : - Item(Owner), Version(Version), Sources(Sources), Recs(Recs), + Item(Owner, HashStringList()), Version(Version), Sources(Sources), Recs(Recs), StoreFilename(StoreFilename), Vf(Version.FileList()), Trusted(false) { @@ -2000,7 +2323,6 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources, checking later. */ bool pkgAcqArchive::QueueNext() { - string const ForceHash = _config->Find("Acquire::ForceHash"); for (; Vf.end() == false; ++Vf) { // Ignore not source sources @@ -2021,31 +2343,10 @@ bool pkgAcqArchive::QueueNext() pkgRecords::Parser &Parse = Recs->Lookup(Vf); if (_error->PendingError() == true) return false; - + string PkgFile = Parse.FileName(); - if (ForceHash.empty() == false) - { - if(stringcasecmp(ForceHash, "sha512") == 0) - ExpectedHash = HashString("SHA512", Parse.SHA512Hash()); - else if(stringcasecmp(ForceHash, "sha256") == 0) - ExpectedHash = HashString("SHA256", Parse.SHA256Hash()); - else if (stringcasecmp(ForceHash, "sha1") == 0) - ExpectedHash = HashString("SHA1", Parse.SHA1Hash()); - else - ExpectedHash = HashString("MD5Sum", Parse.MD5Hash()); - } - else - { - string Hash; - if ((Hash = Parse.SHA512Hash()).empty() == false) - ExpectedHash = HashString("SHA512", Hash); - else if ((Hash = Parse.SHA256Hash()).empty() == false) - ExpectedHash = HashString("SHA256", Hash); - else if ((Hash = Parse.SHA1Hash()).empty() == false) - ExpectedHash = HashString("SHA1", Hash); - else - ExpectedHash = HashString("MD5Sum", Parse.MD5Hash()); - } + ExpectedHashes = Parse.Hashes(); + if (PkgFile.empty() == true) return _error->Error(_("The package index files are corrupted. No Filename: " "field for package %s."), @@ -2132,10 +2433,10 @@ bool pkgAcqArchive::QueueNext() // AcqArchive::Done - Finished fetching /*{{{*/ // --------------------------------------------------------------------- /* */ -void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash, +void pkgAcqArchive::Done(string Message,unsigned long long Size, HashStringList const &CalcHashes, pkgAcquire::MethodConfig *Cfg) { - Item::Done(Message,Size,CalcHash,Cfg); + Item::Done(Message, Size, CalcHashes, Cfg); // Check the size if (Size != Version->Size) @@ -2143,11 +2444,12 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash, RenameOnError(SizeMismatch); return; } - - // Check the hash - if(ExpectedHash.toStr() != CalcHash) + + // FIXME: could this empty() check impose *any* sort of security issue? + if(ExpectedHashes.usable() && ExpectedHashes != CalcHashes) { RenameOnError(HashSumMismatch); + printHashSumComparision(DestFile, ExpectedHashes, CalcHashes); return; } @@ -2160,21 +2462,19 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash, return; } - Complete = true; - // Reference filename if (FileName != DestFile) { StoreFilename = DestFile = FileName; Local = true; + Complete = true; return; } - + // Done, move it into position string FinalFile = _config->FindDir("Dir::Cache::Archives"); FinalFile += flNotDir(StoreFilename); Rename(DestFile,FinalFile); - StoreFilename = DestFile = FinalFile; Complete = true; } @@ -2184,8 +2484,8 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash, /* Here we try other sources */ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { - ErrorText = LookupTag(Message,"Message"); - + Item::Failed(Message,Cnf); + /* We don't really want to retry on failed media swaps, this prevents that. An interesting observation is that permanent failures are not recorded. */ @@ -2195,10 +2495,10 @@ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf) // Vf = Version.FileList(); while (Vf.end() == false) ++Vf; StoreFilename = string(); - Item::Failed(Message,Cnf); return; } - + + Status = StatIdle; if (QueueNext() == false) { // This is the retry counter @@ -2211,15 +2511,19 @@ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf) if (QueueNext() == true) return; } - + StoreFilename = string(); - Item::Failed(Message,Cnf); + Status = StatError; } } /*}}}*/ // AcqArchive::IsTrusted - Determine whether this archive comes from a trusted source /*{{{*/ // --------------------------------------------------------------------- +#if APT_PKG_ABI >= 413 +APT_PURE bool pkgAcqArchive::IsTrusted() const +#else APT_PURE bool pkgAcqArchive::IsTrusted() +#endif { return Trusted; } @@ -2238,11 +2542,11 @@ void pkgAcqArchive::Finished() // AcqFile::pkgAcqFile - Constructor /*{{{*/ // --------------------------------------------------------------------- /* The file is added to the queue */ -pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash, +pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI, HashStringList const &Hashes, unsigned long long Size,string Dsc,string ShortDesc, const string &DestDir, const string &DestFilename, bool IsIndexFile) : - Item(Owner), ExpectedHash(Hash), IsIndexFile(IsIndexFile) + Item(Owner, Hashes), IsIndexFile(IsIndexFile) { Retries = _config->FindI("Acquire::Retries",0); @@ -2279,15 +2583,16 @@ pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash, // AcqFile::Done - Item downloaded OK /*{{{*/ // --------------------------------------------------------------------- /* */ -void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash, +void pkgAcqFile::Done(string Message,unsigned long long Size,HashStringList const &CalcHashes, pkgAcquire::MethodConfig *Cnf) { - Item::Done(Message,Size,CalcHash,Cnf); + Item::Done(Message,Size,CalcHashes,Cnf); // Check the hash - if(!ExpectedHash.empty() && ExpectedHash.toStr() != CalcHash) + if(ExpectedHashes.usable() && ExpectedHashes != CalcHashes) { RenameOnError(HashSumMismatch); + printHashSumComparision(DestFile, ExpectedHashes, CalcHashes); return; } @@ -2328,7 +2633,12 @@ void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash, // Symlink the file if (symlink(FileName.c_str(),DestFile.c_str()) != 0) { - ErrorText = "Link to " + DestFile + " failure "; + _error->PushToStack(); + _error->Errno("pkgAcqFile::Done", "Symlinking file %s failed", DestFile.c_str()); + std::stringstream msg; + _error->DumpErrors(msg); + _error->RevertToStack(); + ErrorText = msg.str(); Status = StatError; Complete = false; } @@ -2340,25 +2650,29 @@ void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash, /* Here we try other sources */ void pkgAcqFile::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { - ErrorText = LookupTag(Message,"Message"); - + Item::Failed(Message,Cnf); + // This is the retry counter if (Retries != 0 && Cnf->LocalOnly == false && StringToBool(LookupTag(Message,"Transient-Failure"),false) == true) { - Retries--; + --Retries; QueueURI(Desc); + Status = StatIdle; return; } - - Item::Failed(Message,Cnf); + } /*}}}*/ // AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/ // --------------------------------------------------------------------- /* The only header we use is the last-modified header. */ +#if APT_PKG_ABI >= 413 +string pkgAcqFile::Custom600Headers() const +#else string pkgAcqFile::Custom600Headers() +#endif { if (IsIndexFile) return "\nIndex-File: true"; diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index 384c5ee2b..1af737e00 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -46,6 +46,8 @@ class indexRecords; class pkgRecords; class pkgSourceList; +class IndexTarget; +class pkgAcqMetaBase; /** \brief Represents the process by which a pkgAcquire object should {{{ * retrieve a file or a collection of files. @@ -61,6 +63,10 @@ class pkgSourceList; */ class pkgAcquire::Item : public WeakPointable { + friend class pkgAcqMetaBase; + + void *d; + protected: /** \brief The acquire object with which this item is associated. */ @@ -71,12 +77,11 @@ class pkgAcquire::Item : public WeakPointable * \param Item Metadata about this item (its URI and * description). */ - inline void QueueURI(ItemDesc &Item) - {Owner->Enqueue(Item);}; + void QueueURI(ItemDesc &Item); /** \brief Remove this item from its owner's queue. */ - inline void Dequeue() {Owner->Dequeue(this);}; - + void Dequeue(); + /** \brief Rename a file without modifying its timestamp. * * Many item methods call this as their final action. @@ -86,7 +91,7 @@ class pkgAcquire::Item : public WeakPointable * \param To The new name of \a From. If \a To exists it will be * overwritten. */ - void Rename(std::string From,std::string To); + bool Rename(std::string From,std::string To); public: @@ -115,7 +120,7 @@ class pkgAcquire::Item : public WeakPointable /** \brief The item was could not be downloaded because of * a transient network error (e.g. network down) */ - StatTransientNetworkError + StatTransientNetworkError, } Status; /** \brief Contains a textual description of the error encountered @@ -132,7 +137,12 @@ class pkgAcquire::Item : public WeakPointable /** \brief If not \b NULL, contains the name of a subprocess that * is operating on this object (for instance, "gzip" or "gpgv"). */ - const char *Mode; + APT_DEPRECATED const char *Mode; + + /** \brief contains the name of the subprocess that is operating on this object + * (for instance, "gzip", "rred" or "gpgv"). This is obsoleting #Mode from above + * as it can manage the lifetime of included string properly. */ + std::string ActiveSubprocess; /** \brief A client-supplied unique identifier. * @@ -166,12 +176,28 @@ class pkgAcquire::Item : public WeakPointable * \sa pkgAcquire */ unsigned int QueueCounter; + + /** \brief TransactionManager */ + pkgAcqMetaBase *TransactionManager; + + /** \brief The number of additional fetch items that are expected + * once this item is done. + * + * Some items like pkgAcqMeta{Index,Sig} will queue additional + * items. This variable can be set by the methods if it knows + * in advance how many items to expect to get a more accurate + * progress. + */ + unsigned int ExpectedAdditionalItems; /** \brief The name of the file into which the retrieved object * will be written. */ std::string DestFile; + /** \brief storge name until a transaction is finished */ + std::string PartialFile; + /** \brief Invoked by the acquire worker when the object couldn't * be fetched. * @@ -201,12 +227,12 @@ class pkgAcquire::Item : public WeakPointable * \param Message Data from the acquire method. Use LookupTag() * to parse it. * \param Size The size of the object that was fetched. - * \param Hash The HashSum of the object that was fetched. + * \param Hashes The HashSums of the object that was fetched. * \param Cnf The method via which the object was fetched. * * \sa pkgAcqMethod */ - virtual void Done(std::string Message,unsigned long long Size,std::string Hash, + virtual void Done(std::string Message, unsigned long long Size, HashStringList const &Hashes, pkgAcquire::MethodConfig *Cnf); /** \brief Invoked when the worker starts to fetch this object. @@ -228,7 +254,11 @@ class pkgAcquire::Item : public WeakPointable * line, so they should (if nonempty) have a leading newline and * no trailing newline. */ +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const {return std::string();}; +#else virtual std::string Custom600Headers() {return std::string();}; +#endif /** \brief A "descriptive" URI-like string. * @@ -244,20 +274,27 @@ class pkgAcquire::Item : public WeakPointable /** \brief Invoked by the worker when the download is completely done. */ virtual void Finished() {}; - /** \brief HashSum + /** \brief HashSums * - * \return the HashSum of this object, if applicable; otherwise, an - * empty string. + * \return the HashSums of this object, if applicable; otherwise, an + * empty list. */ - virtual std::string HashSum() {return std::string();}; + HashStringList HashSums() const {return ExpectedHashes;}; + std::string HashSum() const {HashStringList const hashes = HashSums(); HashString const * const hs = hashes.find(NULL); return hs != NULL ? hs->toStr() : ""; }; /** \return the acquire process with which this item is associated. */ + pkgAcquire *GetOwner() const {return Owner;}; +#if APT_PKG_ABI < 413 pkgAcquire *GetOwner() {return Owner;}; +#endif /** \return \b true if this object is being fetched from a trusted source. */ +#if APT_PKG_ABI >= 413 + virtual bool IsTrusted() const {return false;}; +#else virtual bool IsTrusted() {return false;}; +#endif - // report mirror problems /** \brief Report mirror problem * * This allows reporting mirror failures back to a centralized @@ -267,6 +304,11 @@ class pkgAcquire::Item : public WeakPointable */ void ReportMirrorFailure(std::string FailCode); + /** \brief Set the name of the current active subprocess + * + * See also #ActiveSubprocess + */ + void SetActiveSubprocess(const std::string &subprocess); /** \brief Initialize an item. * @@ -274,12 +316,12 @@ class pkgAcquire::Item : public WeakPointable * process, but does not place it into any fetch queues (you must * manually invoke QueueURI() to do so). * - * Initializes all fields of the item other than Owner to 0, - * false, or the empty string. - * * \param Owner The new owner of this item. + * \param ExpectedHashes of the file represented by this item */ - Item(pkgAcquire *Owner); + Item(pkgAcquire *Owner, + HashStringList const &ExpectedHashes=HashStringList(), + pkgAcqMetaBase *TransactionManager=NULL); /** \brief Remove this item from its owner's queue by invoking * pkgAcquire::Remove. @@ -291,7 +333,10 @@ class pkgAcquire::Item : public WeakPointable enum RenameOnErrorState { HashSumMismatch, SizeMismatch, - InvalidFormat + InvalidFormat, + SignatureError, + NotClearsigned, + MaximumSizeExceeded }; /** \brief Rename failed file and set error @@ -299,62 +344,321 @@ class pkgAcquire::Item : public WeakPointable * \param state respresenting the error we encountered */ bool RenameOnError(RenameOnErrorState const state); + + /** \brief The HashSums of the item is supposed to have than done */ + HashStringList ExpectedHashes; + + /** \brief The item that is currently being downloaded. */ + pkgAcquire::ItemDesc Desc; }; /*}}}*/ /** \brief Information about an index patch (aka diff). */ /*{{{*/ -struct DiffInfo { +struct APT_HIDDEN DiffInfo { /** The filename of the diff. */ std::string file; - /** The sha1 hash of the diff. */ - std::string sha1; + /** The hashes of the diff */ + HashStringList result_hashes; + + /** The hashes of the file after the diff is applied */ + HashStringList patch_hashes; - /** The size of the diff. */ - unsigned long size; + /** The size of the file after the diff is applied */ + unsigned long long result_size; + + /** The size of the diff itself */ + unsigned long long patch_size; }; /*}}}*/ -/** \brief An item that is responsible for fetching a SubIndex {{{ - * - * The MetaIndex file includes only records for important indexes - * and records for these SubIndex files so these can carry records - * for addition files like PDiffs and Translations - */ -class pkgAcqSubIndex : public pkgAcquire::Item +class pkgAcqMetaBase : public pkgAcquire::Item /*{{{*/ { + void *d; + protected: - /** \brief If \b true, debugging information will be written to std::clog. */ - bool Debug; + std::vector<Item*> Transaction; - /** \brief The item that is currently being downloaded. */ - pkgAcquire::ItemDesc Desc; + /** \brief A package-system-specific parser for the meta-index file. */ + indexRecords *MetaIndexParser; - /** \brief The Hash that this file should have after download + /** \brief The index files which should be looked up in the meta-index + * and then downloaded. */ - HashString ExpectedHash; + const std::vector<IndexTarget*>* IndexTargets; - public: - // Specialized action members - virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash, - pkgAcquire::MethodConfig *Cnf); - virtual std::string DescURI() {return Desc.URI;}; - virtual std::string Custom600Headers(); - virtual bool ParseIndex(std::string const &IndexFile); + /** \brief If \b true, the index's signature is currently being verified. + */ + bool AuthPass; - /** \brief Create a new pkgAcqSubIndex. + // required to deal gracefully with problems caused by incorrect ims hits + bool IMSHit; + + /** \brief Starts downloading the individual index files. * - * \param Owner The Acquire object that owns this item. + * \param verify If \b true, only indices whose expected hashsum + * can be determined from the meta-index will be downloaded, and + * the hashsums of indices will be checked (reporting + * #StatAuthError if there is a mismatch). If verify is \b false, + * no hashsum checking will be performed. + */ + void QueueIndexes(bool verify); + + /** \brief Called when a file is finished being retrieved. * - * \param URI The URI of the list file to download. + * If the file was not downloaded to DestFile, a copy process is + * set up to copy it to DestFile; otherwise, Complete is set to \b + * true and the file is moved to its final location. * - * \param URIDesc A long description of the list file to download. + * \param Message The message block received from the fetch + * subprocess. + */ + bool CheckDownloadDone(const std::string &Message, + const std::string &RealURI); + + /** \brief Queue the downloaded Signature for verification */ + void QueueForSignatureVerify(const std::string &MetaIndexFile, + const std::string &MetaIndexFileSignature); + + /** \brief get the custom600 header for all pkgAcqMeta */ + std::string GetCustom600Headers(const std::string &RealURI) const; + + /** \brief Called when authentication succeeded. * - * \param ShortDesc A short description of the list file to download. + * Sanity-checks the authenticated file, queues up the individual + * index files for download, and saves the signature in the lists + * directory next to the authenticated list file. + * + * \param Message The message block received from the fetch + * subprocess. + */ + bool CheckAuthDone(std::string Message, const std::string &RealURI); + + /** Check if the current item should fail at this point */ + bool CheckStopAuthentication(const std::string &RealURI, + const std::string &Message); + + /** \brief Check that the release file is a release file for the + * correct distribution. * - * \param ExpectedHash The list file's MD5 signature. + * \return \b true if no fatal errors were encountered. + */ + bool VerifyVendor(std::string Message, const std::string &RealURI); + + public: + // transaction code + void Add(Item *I); + void AbortTransaction(); + bool TransactionHasError() APT_PURE; + void CommitTransaction(); + + /** \brief Stage (queue) a copy action when the transaction is committed + */ + void TransactionStageCopy(Item *I, + const std::string &From, + const std::string &To); + /** \brief Stage (queue) a removal action when the transaction is committed + */ + void TransactionStageRemoval(Item *I, const std::string &FinalFile); + + pkgAcqMetaBase(pkgAcquire *Owner, + const std::vector<IndexTarget*>* IndexTargets, + indexRecords* MetaIndexParser, + HashStringList const &ExpectedHashes=HashStringList(), + pkgAcqMetaBase *TransactionManager=NULL) + : Item(Owner, ExpectedHashes, TransactionManager), + MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets), + AuthPass(false), IMSHit(false) {}; +}; + /*}}}*/ +/** \brief An acquire item that downloads the detached signature {{{ + * of a meta-index (Release) file, then queues up the release + * file itself. + * + * \todo Why protected members? + * + * \sa pkgAcqMetaIndex + */ +class APT_HIDDEN pkgAcqMetaSig : public pkgAcqMetaBase +{ + void *d; + + protected: + + /** \brief The URI of the signature file. Unlike Desc.URI, this is + * never modified; it is used to determine the file that is being + * downloaded. + */ + std::string RealURI; + + /** \brief The file we need to verify */ + std::string MetaIndexFile; + + /** \brief The file we use to verify the MetaIndexFile with */ + std::string MetaIndexFileSignature; + + /** \brief Long URI description used in the acquire system */ + std::string URIDesc; + + /** \brief Short URI description used in the acquire system */ + std::string ShortDesc; + + public: + + // Specialized action members + virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); + virtual void Done(std::string Message,unsigned long long Size, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cnf); +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const; +#else + virtual std::string Custom600Headers(); +#endif + virtual std::string DescURI() {return RealURI; }; + + /** \brief Create a new pkgAcqMetaSig. */ + pkgAcqMetaSig(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + std::string URI,std::string URIDesc, std::string ShortDesc, + std::string MetaIndexFile, + const std::vector<IndexTarget*>* IndexTargets, + indexRecords* MetaIndexParser); + virtual ~pkgAcqMetaSig(); +}; + /*}}}*/ +/** \brief An item that is responsible for downloading the meta-index {{{ + * file (i.e., Release) itself and verifying its signature. + * + * Once the download and verification are complete, the downloads of + * the individual index files are queued up using pkgAcqDiffIndex. + * If the meta-index file had a valid signature, the expected hashsums + * of the index files will be the md5sums listed in the meta-index; + * otherwise, the expected hashsums will be "" (causing the + * authentication of the index files to be bypassed). + */ +class APT_HIDDEN pkgAcqMetaIndex : public pkgAcqMetaBase +{ + void *d; + + protected: + /** \brief The URI that is actually being downloaded; never + * modified by pkgAcqMetaIndex. */ - pkgAcqSubIndex(pkgAcquire *Owner, std::string const &URI,std::string const &URIDesc, - std::string const &ShortDesc, HashString const &ExpectedHash); + std::string RealURI; + + std::string URIDesc; + std::string ShortDesc; + + /** \brief The URI of the meta-index file for the detached signature */ + std::string MetaIndexSigURI; + + /** \brief A "URI-style" description of the meta-index file */ + std::string MetaIndexSigURIDesc; + + /** \brief A brief description of the meta-index file */ + std::string MetaIndexSigShortDesc; + + /** \brief delayed constructor */ + void Init(std::string URIDesc, std::string ShortDesc); + + public: + + // Specialized action members + virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); + virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cnf); +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const; +#else + virtual std::string Custom600Headers(); +#endif + virtual std::string DescURI() {return RealURI; }; + virtual void Finished(); + + /** \brief Create a new pkgAcqMetaIndex. */ + pkgAcqMetaIndex(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + std::string URI,std::string URIDesc, std::string ShortDesc, + std::string MetaIndexSigURI, std::string MetaIndexSigURIDesc, std::string MetaIndexSigShortDesc, + const std::vector<IndexTarget*>* IndexTargets, + indexRecords* MetaIndexParser); +}; + /*}}}*/ +/** \brief An item repsonsible for downloading clearsigned metaindexes {{{*/ +class APT_HIDDEN pkgAcqMetaClearSig : public pkgAcqMetaIndex +{ + void *d; + + /** \brief The URI of the meta-index file for the detached signature */ + std::string MetaIndexURI; + + /** \brief A "URI-style" description of the meta-index file */ + std::string MetaIndexURIDesc; + + /** \brief A brief description of the meta-index file */ + std::string MetaIndexShortDesc; + + /** \brief The URI of the detached meta-signature file if the clearsigned one failed. */ + std::string MetaSigURI; + + /** \brief A "URI-style" description of the meta-signature file */ + std::string MetaSigURIDesc; + + /** \brief A brief description of the meta-signature file */ + std::string MetaSigShortDesc; + +public: + virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const; +#else + virtual std::string Custom600Headers(); +#endif + virtual void Done(std::string Message,unsigned long long Size, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cnf); + + /** \brief Create a new pkgAcqMetaClearSig. */ + pkgAcqMetaClearSig(pkgAcquire *Owner, + std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc, + std::string const &MetaIndexURI, std::string const &MetaIndexURIDesc, std::string const &MetaIndexShortDesc, + std::string const &MetaSigURI, std::string const &MetaSigURIDesc, std::string const &MetaSigShortDesc, + const std::vector<IndexTarget*>* IndexTargets, + indexRecords* MetaIndexParser); + virtual ~pkgAcqMetaClearSig(); +}; + /*}}}*/ +/** \brief Common base class for all classes that deal with fetching {{{ + indexes + */ +class pkgAcqBaseIndex : public pkgAcquire::Item +{ + void *d; + + protected: + /** \brief Pointer to the IndexTarget data + */ + const struct IndexTarget * Target; + + /** \brief Pointer to the indexRecords parser */ + indexRecords *MetaIndexParser; + + /** \brief The MetaIndex Key */ + std::string MetaKey; + + /** \brief The URI of the index file to recreate at our end (either + * by downloading it or by applying partial patches). + */ + std::string RealURI; + + bool VerifyHashByMetaKey(HashStringList const &Hashes); + + pkgAcqBaseIndex(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + struct IndexTarget const * const Target, + HashStringList const &ExpectedHashes, + indexRecords *MetaIndexParser) + : Item(Owner, ExpectedHashes, TransactionManager), Target(Target), + MetaIndexParser(MetaIndexParser) {}; }; /*}}}*/ /** \brief An item that is responsible for fetching an index file of {{{ @@ -366,25 +670,14 @@ class pkgAcqSubIndex : public pkgAcquire::Item * * \sa pkgAcqIndexDiffs, pkgAcqIndex */ -class pkgAcqDiffIndex : public pkgAcquire::Item +class APT_HIDDEN pkgAcqDiffIndex : public pkgAcqBaseIndex { + void *d; + protected: /** \brief If \b true, debugging information will be written to std::clog. */ bool Debug; - /** \brief The item that is currently being downloaded. */ - pkgAcquire::ItemDesc Desc; - - /** \brief The URI of the index file to recreate at our end (either - * by downloading it or by applying partial patches). - */ - std::string RealURI; - - /** \brief The Hash that the real index file should have after - * all patches have been applied. - */ - HashString ExpectedHash; - /** \brief The index file which will be patched to generate the new * file. */ @@ -395,13 +688,21 @@ class pkgAcqDiffIndex : public pkgAcquire::Item */ std::string Description; + /** \brief If the copy step of the packages file is done + */ + bool PackagesFileReadyInPartial; + public: // Specialized action members virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash, + virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes, pkgAcquire::MethodConfig *Cnf); virtual std::string DescURI() {return RealURI + "Index";}; +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const; +#else virtual std::string Custom600Headers(); +#endif /** \brief Parse the Index file for a set of Packages diffs. * @@ -426,10 +727,13 @@ class pkgAcqDiffIndex : public pkgAcquire::Item * * \param ShortDesc A short description of the list file to download. * - * \param ExpectedHash The list file's MD5 signature. + * \param ExpectedHashes The list file's hashsums which are expected. */ - pkgAcqDiffIndex(pkgAcquire *Owner,std::string URI,std::string URIDesc, - std::string ShortDesc, HashString ExpectedHash); + pkgAcqDiffIndex(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + struct IndexTarget const * const Target, + HashStringList const &ExpectedHashes, + indexRecords *MetaIndexParser); }; /*}}}*/ /** \brief An item that is responsible for fetching client-merge patches {{{ @@ -443,8 +747,10 @@ class pkgAcqDiffIndex : public pkgAcquire::Item * * \sa pkgAcqDiffIndex, pkgAcqIndex */ -class pkgAcqIndexMergeDiffs : public pkgAcquire::Item +class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex { + void *d; + protected: /** \brief If \b true, debugging output will be written to @@ -452,21 +758,6 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item */ bool Debug; - /** \brief description of the item that is currently being - * downloaded. - */ - pkgAcquire::ItemDesc Desc; - - /** \brief URI of the package index file that is being - * reconstructed. - */ - std::string RealURI; - - /** \brief HashSum of the package index file that is being - * reconstructed. - */ - HashString ExpectedHash; - /** \brief description of the file being downloaded. */ std::string Description; @@ -499,9 +790,8 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item * outright; its arguments are ignored. */ virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - - virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash, - pkgAcquire::MethodConfig *Cnf); + virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cnf); virtual std::string DescURI() {return RealURI + "Index";}; /** \brief Create an index merge-diff item. @@ -515,7 +805,7 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item * * \param ShortDesc A brief description of this item. * - * \param ExpectedHash The expected md5sum of the completely + * \param ExpectedHashes The expected md5sum of the completely * reconstructed package index file; the index file will be tested * against this value when it is entirely reconstructed. * @@ -525,9 +815,13 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item * \param allPatches contains all related items so that each item can * check if it was the last one to complete the download step */ - pkgAcqIndexMergeDiffs(pkgAcquire *Owner,std::string const &URI,std::string const &URIDesc, - std::string const &ShortDesc, HashString const &ExpectedHash, - DiffInfo const &patch, std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches); + pkgAcqIndexMergeDiffs(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + struct IndexTarget const * const Target, + HashStringList const &ExpectedHash, + indexRecords *MetaIndexParser, + DiffInfo const &patch, + std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches); }; /*}}}*/ /** \brief An item that is responsible for fetching server-merge patches {{{ @@ -541,8 +835,10 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item * * \sa pkgAcqDiffIndex, pkgAcqIndex */ -class pkgAcqIndexDiffs : public pkgAcquire::Item +class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex { + void *d; + private: /** \brief Queue up the next diff download. @@ -554,20 +850,20 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item * \return \b true if an applicable diff was found, \b false * otherwise. */ - bool QueueNextDiff(); + APT_HIDDEN bool QueueNextDiff(); /** \brief Handle tasks that must be performed after the item * finishes downloading. * - * Dequeues the item and checks the resulting file's md5sum - * against ExpectedHash after the last patch was applied. + * Dequeues the item and checks the resulting file's hashsums + * against ExpectedHashes after the last patch was applied. * There is no need to check the md5/sha1 after a "normal" * patch because QueueNextDiff() will check the sha1 later. * * \param allDone If \b true, the file was entirely reconstructed, * and its md5sum is verified. */ - void Finish(bool allDone=false); + APT_HIDDEN void Finish(bool allDone=false); protected: @@ -576,21 +872,6 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item */ bool Debug; - /** \brief A description of the item that is currently being - * downloaded. - */ - pkgAcquire::ItemDesc Desc; - - /** \brief The URI of the package index file that is being - * reconstructed. - */ - std::string RealURI; - - /** \brief The HashSum of the package index file that is being - * reconstructed. - */ - HashString ExpectedHash; - /** A description of the file being downloaded. */ std::string Description; @@ -604,9 +885,6 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item */ std::vector<DiffInfo> available_patches; - /** Stop applying patches when reaching that sha1 */ - std::string ServerSha1; - /** The current status of this patch. */ enum DiffState { @@ -632,9 +910,9 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item */ virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash, + virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes, pkgAcquire::MethodConfig *Cnf); - virtual std::string DescURI() {return RealURI + "Index";}; + virtual std::string DescURI() {return RealURI + "IndexDiffs";}; /** \brief Create an index diff item. * @@ -650,19 +928,19 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item * * \param ShortDesc A brief description of this item. * - * \param ExpectedHash The expected md5sum of the completely + * \param ExpectedHashes The expected hashsums of the completely * reconstructed package index file; the index file will be tested * against this value when it is entirely reconstructed. * - * \param ServerSha1 is the sha1sum of the current file on the server - * * \param diffs The remaining diffs from the index of diffs. They * should be ordered so that each diff appears before any diff * that depends on it. */ - pkgAcqIndexDiffs(pkgAcquire *Owner,std::string URI,std::string URIDesc, - std::string ShortDesc, HashString ExpectedHash, - std::string ServerSha1, + pkgAcqIndexDiffs(pkgAcquire *Owner, + pkgAcqMetaBase *TransactionManager, + struct IndexTarget const * const Target, + HashStringList const &ExpectedHash, + indexRecords *MetaIndexParser, std::vector<DiffInfo> diffs=std::vector<DiffInfo>()); }; /*}}}*/ @@ -673,56 +951,77 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item * * \todo Why does pkgAcqIndex have protected members? */ -class pkgAcqIndex : public pkgAcquire::Item +class APT_HIDDEN pkgAcqIndex : public pkgAcqBaseIndex { - protected: + void *d; - /** \brief If \b true, the index file has been decompressed. */ - bool Decompression; + protected: - /** \brief If \b true, the partially downloaded file will be - * removed when the download completes. + /** \brief The stages the method goes through + * + * The method first downloads the indexfile, then its decompressed (or + * copied) and verified */ - bool Erase; + enum AllStages { + STAGE_DOWNLOAD, + STAGE_DECOMPRESS_AND_VERIFY, + }; + AllStages Stage; - // Unused, used to be used to verify that "Packages: " header was there - bool __DELME_ON_NEXT_ABI_BREAK_Verify; + /** \brief Handle what needs to be done when the download is done */ + void StageDownloadDone(std::string Message, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cfg); - /** \brief The download request that is currently being - * processed. + /** \brief Handle what needs to be done when the decompression/copy is + * done */ - pkgAcquire::ItemDesc Desc; + void StageDecompressDone(std::string Message, + HashStringList const &Hashes, + pkgAcquire::MethodConfig *Cfg); - /** \brief The object that is actually being fetched (minus any - * compression-related extensions). + /** \brief If \b set, this partially downloaded file will be + * removed when the download completes. */ - std::string RealURI; - - /** \brief The expected hashsum of the decompressed index file. */ - HashString ExpectedHash; + std::string EraseFileName; /** \brief The compression-related file extensions that are being * added to the downloaded file one by one if first fails (e.g., "gz bz2"). */ - std::string CompressionExtension; + std::string CompressionExtensions; + + /** \brief The actual compression extension currently used */ + std::string CurrentCompressionExtension; - /** \brief Get the full pathname of the final file for the given URI + /** \brief Do the changes needed to fetch via AptByHash (if needed) */ + void InitByHashIfNeeded(const std::string MetaKey); + + /** \brief Auto select the right compression to use */ + void AutoSelectCompression(); + + /** \brief Get the full pathname of the final file for the current URI */ - std::string GetFinalFilename(std::string const &URI, - std::string const &compExt); + std::string GetFinalFilename() const; /** \brief Schedule file for verification after a IMS hit */ - void ReverifyAfterIMS(std::string const &FileName); + void ReverifyAfterIMS(); + + /** \brief Validate the downloaded index file */ + bool ValidateFile(const std::string &FileName); public: // Specialized action members virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash, + virtual void Done(std::string Message,unsigned long long Size, + HashStringList const &Hashes, pkgAcquire::MethodConfig *Cnf); +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const; +#else virtual std::string Custom600Headers(); +#endif virtual std::string DescURI() {return Desc.URI;}; - virtual std::string HashSum() {return ExpectedHash.toStr(); }; /** \brief Create a pkgAcqIndex. * @@ -735,7 +1034,7 @@ class pkgAcqIndex : public pkgAcquire::Item * * \param ShortDesc A brief description of this index file. * - * \param ExpectedHash The expected hashsum of this index file. + * \param ExpectedHashes The expected hashsum of this index file. * * \param compressExt The compression-related extension with which * this index file should be downloaded, or "" to autodetect @@ -744,47 +1043,21 @@ class pkgAcqIndex : public pkgAcquire::Item * fallback is ".gz" or none. */ pkgAcqIndex(pkgAcquire *Owner,std::string URI,std::string URIDesc, - std::string ShortDesc, HashString ExpectedHash, - std::string compressExt=""); - pkgAcqIndex(pkgAcquire *Owner, struct IndexTarget const * const Target, - HashString const &ExpectedHash, indexRecords const *MetaIndexParser); - void Init(std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc); -}; - /*}}}*/ -/** \brief An acquire item that is responsible for fetching a {{{ - * translated index file. - * - * The only difference from pkgAcqIndex is that transient failures - * are suppressed: no error occurs if the translated index file is - * missing. - */ -class pkgAcqIndexTrans : public pkgAcqIndex -{ - public: - - virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual std::string Custom600Headers(); - - /** \brief Create a pkgAcqIndexTrans. - * - * \param Owner The pkgAcquire object with which this item is - * associated. - * - * \param URI The URI of the index file that is to be downloaded. - * - * \param URIDesc A "URI-style" description of this index file. - * - * \param ShortDesc A brief description of this index file. - */ - pkgAcqIndexTrans(pkgAcquire *Owner,std::string URI,std::string URIDesc, - std::string ShortDesc); - pkgAcqIndexTrans(pkgAcquire *Owner, struct IndexTarget const * const Target, - HashString const &ExpectedHash, indexRecords const *MetaIndexParser); + std::string ShortDesc, HashStringList const &ExpectedHashes); + pkgAcqIndex(pkgAcquire *Owner, pkgAcqMetaBase *TransactionManager, + IndexTarget const * const Target, + HashStringList const &ExpectedHash, + indexRecords *MetaIndexParser); + + void Init(std::string const &URI, std::string const &URIDesc, + std::string const &ShortDesc); }; /*}}}*/ /** \brief Information about an index file. */ /*{{{*/ -class IndexTarget +class APT_HIDDEN IndexTarget { + void *d; + public: /** \brief A URI from which the index file can be downloaded. */ std::string URI; @@ -803,230 +1076,18 @@ class IndexTarget virtual bool IsOptional() const { return false; } - virtual bool IsSubIndex() const { - return false; - } }; /*}}}*/ /** \brief Information about an optional index file. */ /*{{{*/ -class OptionalIndexTarget : public IndexTarget +class APT_HIDDEN OptionalIndexTarget : public IndexTarget { + void *d; + virtual bool IsOptional() const { return true; } }; /*}}}*/ -/** \brief Information about an subindex index file. */ /*{{{*/ -class SubIndexTarget : public IndexTarget -{ - virtual bool IsSubIndex() const { - return true; - } -}; - /*}}}*/ -/** \brief Information about an subindex index file. */ /*{{{*/ -class OptionalSubIndexTarget : public OptionalIndexTarget -{ - virtual bool IsSubIndex() const { - return true; - } -}; - /*}}}*/ - -/** \brief An acquire item that downloads the detached signature {{{ - * of a meta-index (Release) file, then queues up the release - * file itself. - * - * \todo Why protected members? - * - * \sa pkgAcqMetaIndex - */ -class pkgAcqMetaSig : public pkgAcquire::Item -{ - protected: - /** \brief The last good signature file */ - std::string LastGoodSig; - - /** \brief The fetch request that is currently being processed. */ - pkgAcquire::ItemDesc Desc; - - /** \brief The URI of the signature file. Unlike Desc.URI, this is - * never modified; it is used to determine the file that is being - * downloaded. - */ - std::string RealURI; - - /** \brief The URI of the meta-index file to be fetched after the signature. */ - std::string MetaIndexURI; - - /** \brief A "URI-style" description of the meta-index file to be - * fetched after the signature. - */ - std::string MetaIndexURIDesc; - - /** \brief A brief description of the meta-index file to be fetched - * after the signature. - */ - std::string MetaIndexShortDesc; - - /** \brief A package-system-specific parser for the meta-index file. */ - indexRecords* MetaIndexParser; - - /** \brief The index files which should be looked up in the meta-index - * and then downloaded. - * - * \todo Why a list of pointers instead of a list of structs? - */ - const std::vector<struct IndexTarget*>* IndexTargets; - - public: - - // Specialized action members - virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash, - pkgAcquire::MethodConfig *Cnf); - virtual std::string Custom600Headers(); - virtual std::string DescURI() {return RealURI; }; - - /** \brief Create a new pkgAcqMetaSig. */ - pkgAcqMetaSig(pkgAcquire *Owner,std::string URI,std::string URIDesc, std::string ShortDesc, - std::string MetaIndexURI, std::string MetaIndexURIDesc, std::string MetaIndexShortDesc, - const std::vector<struct IndexTarget*>* IndexTargets, - indexRecords* MetaIndexParser); - virtual ~pkgAcqMetaSig(); -}; - /*}}}*/ -/** \brief An item that is responsible for downloading the meta-index {{{ - * file (i.e., Release) itself and verifying its signature. - * - * Once the download and verification are complete, the downloads of - * the individual index files are queued up using pkgAcqDiffIndex. - * If the meta-index file had a valid signature, the expected hashsums - * of the index files will be the md5sums listed in the meta-index; - * otherwise, the expected hashsums will be "" (causing the - * authentication of the index files to be bypassed). - */ -class pkgAcqMetaIndex : public pkgAcquire::Item -{ - protected: - /** \brief The fetch command that is currently being processed. */ - pkgAcquire::ItemDesc Desc; - - /** \brief The URI that is actually being downloaded; never - * modified by pkgAcqMetaIndex. - */ - std::string RealURI; - - /** \brief The file in which the signature for this index was stored. - * - * If empty, the signature and the md5sums of the individual - * indices will not be checked. - */ - std::string SigFile; - - /** \brief The index files to download. */ - const std::vector<struct IndexTarget*>* IndexTargets; - - /** \brief The parser for the meta-index file. */ - indexRecords* MetaIndexParser; - - /** \brief If \b true, the index's signature is currently being verified. - */ - bool AuthPass; - // required to deal gracefully with problems caused by incorrect ims hits - bool IMSHit; - - /** \brief Check that the release file is a release file for the - * correct distribution. - * - * \return \b true if no fatal errors were encountered. - */ - bool VerifyVendor(std::string Message); - - /** \brief Called when a file is finished being retrieved. - * - * If the file was not downloaded to DestFile, a copy process is - * set up to copy it to DestFile; otherwise, Complete is set to \b - * true and the file is moved to its final location. - * - * \param Message The message block received from the fetch - * subprocess. - */ - void RetrievalDone(std::string Message); - - /** \brief Called when authentication succeeded. - * - * Sanity-checks the authenticated file, queues up the individual - * index files for download, and saves the signature in the lists - * directory next to the authenticated list file. - * - * \param Message The message block received from the fetch - * subprocess. - */ - void AuthDone(std::string Message); - - /** \brief Starts downloading the individual index files. - * - * \param verify If \b true, only indices whose expected hashsum - * can be determined from the meta-index will be downloaded, and - * the hashsums of indices will be checked (reporting - * #StatAuthError if there is a mismatch). If verify is \b false, - * no hashsum checking will be performed. - */ - void QueueIndexes(bool verify); - - public: - - // Specialized action members - virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size, std::string Hash, - pkgAcquire::MethodConfig *Cnf); - virtual std::string Custom600Headers(); - virtual std::string DescURI() {return RealURI; }; - - /** \brief Create a new pkgAcqMetaIndex. */ - pkgAcqMetaIndex(pkgAcquire *Owner, - std::string URI,std::string URIDesc, std::string ShortDesc, - std::string SigFile, - const std::vector<struct IndexTarget*>* IndexTargets, - indexRecords* MetaIndexParser); -}; - /*}}}*/ -/** \brief An item repsonsible for downloading clearsigned metaindexes {{{*/ -class pkgAcqMetaClearSig : public pkgAcqMetaIndex -{ - /** \brief The URI of the meta-index file for the detached signature */ - std::string MetaIndexURI; - - /** \brief A "URI-style" description of the meta-index file */ - std::string MetaIndexURIDesc; - - /** \brief A brief description of the meta-index file */ - std::string MetaIndexShortDesc; - - /** \brief The URI of the detached meta-signature file if the clearsigned one failed. */ - std::string MetaSigURI; - - /** \brief A "URI-style" description of the meta-signature file */ - std::string MetaSigURIDesc; - - /** \brief A brief description of the meta-signature file */ - std::string MetaSigShortDesc; - -public: - void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual std::string Custom600Headers(); - - /** \brief Create a new pkgAcqMetaClearSig. */ - pkgAcqMetaClearSig(pkgAcquire *Owner, - std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc, - std::string const &MetaIndexURI, std::string const &MetaIndexURIDesc, std::string const &MetaIndexShortDesc, - std::string const &MetaSigURI, std::string const &MetaSigURIDesc, std::string const &MetaSigShortDesc, - const std::vector<struct IndexTarget*>* IndexTargets, - indexRecords* MetaIndexParser); - virtual ~pkgAcqMetaClearSig(); -}; - /*}}}*/ /** \brief An item that is responsible for fetching a package file. {{{ * * If the package file already exists in the cache, nothing will be @@ -1034,13 +1095,12 @@ public: */ class pkgAcqArchive : public pkgAcquire::Item { + void *d; + protected: /** \brief The package version being fetched. */ pkgCache::VerIterator Version; - /** \brief The fetch command that is currently being processed. */ - pkgAcquire::ItemDesc Desc; - /** \brief The list of sources from which to pick archives to * download this package from. */ @@ -1051,9 +1111,6 @@ class pkgAcqArchive : public pkgAcquire::Item */ pkgRecords *Recs; - /** \brief The hashsum of this package. */ - HashString ExpectedHash; - /** \brief A location in which the actual filename of the package * should be stored. */ @@ -1080,14 +1137,17 @@ class pkgAcqArchive : public pkgAcquire::Item public: virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string Hash, + virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes, pkgAcquire::MethodConfig *Cnf); virtual std::string DescURI() {return Desc.URI;}; virtual std::string ShortDesc() {return Desc.ShortDesc;}; virtual void Finished(); - virtual std::string HashSum() {return ExpectedHash.toStr(); }; +#if APT_PKG_ABI >= 413 + virtual bool IsTrusted() const; +#else virtual bool IsTrusted(); - +#endif + /** \brief Create a new pkgAcqArchive. * * \param Owner The pkgAcquire object with which this item is @@ -1119,11 +1179,7 @@ class pkgAcqArchive : public pkgAcquire::Item */ class pkgAcqFile : public pkgAcquire::Item { - /** \brief The currently active download process. */ - pkgAcquire::ItemDesc Desc; - - /** \brief The hashsum of the file to download, if it is known. */ - HashString ExpectedHash; + void *d; /** \brief How many times to retry the download, set from * Acquire::Retries. @@ -1137,11 +1193,14 @@ class pkgAcqFile : public pkgAcquire::Item // Specialized action members virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf); - virtual void Done(std::string Message,unsigned long long Size,std::string CalcHash, + virtual void Done(std::string Message,unsigned long long Size, HashStringList const &CalcHashes, pkgAcquire::MethodConfig *Cnf); virtual std::string DescURI() {return Desc.URI;}; - virtual std::string HashSum() {return ExpectedHash.toStr(); }; +#if APT_PKG_ABI >= 413 + virtual std::string Custom600Headers() const; +#else virtual std::string Custom600Headers(); +#endif /** \brief Create a new pkgAcqFile object. * @@ -1150,8 +1209,8 @@ class pkgAcqFile : public pkgAcquire::Item * * \param URI The URI to download. * - * \param Hash The hashsum of the file to download, if it is known; - * otherwise "". + * \param Hashes The hashsums of the file to download, if they are known; + * otherwise empty list. * * \param Size The size of the file to download, if it is known; * otherwise 0. @@ -1174,7 +1233,7 @@ class pkgAcqFile : public pkgAcquire::Item * is the absolute name to which the file should be downloaded. */ - pkgAcqFile(pkgAcquire *Owner, std::string URI, std::string Hash, unsigned long long Size, + pkgAcqFile(pkgAcquire *Owner, std::string URI, HashStringList const &Hashes, unsigned long long Size, std::string Desc, std::string ShortDesc, const std::string &DestDir="", const std::string &DestFilename="", bool IsIndexFile=false); diff --git a/apt-pkg/acquire-method.cc b/apt-pkg/acquire-method.cc index 746c553f1..c29ef469e 100644 --- a/apt-pkg/acquire-method.cc +++ b/apt-pkg/acquire-method.cc @@ -102,7 +102,10 @@ void pkgAcqMethod::Fail(string Err,bool Transient) if (Queue != 0) { std::cout << "400 URI Failure\nURI: " << Queue->Uri << "\n" - << "Message: " << Err << " " << IP << "\n"; + << "Message: " << Err; + if (IP.empty() == false && _config->FindB("Acquire::Failure::ShowIP", true) == true) + std::cout << " " << IP; + std::cout << "\n"; Dequeue(); } else @@ -119,6 +122,18 @@ void pkgAcqMethod::Fail(string Err,bool Transient) std::cout << "\n" << std::flush; } /*}}}*/ +// AcqMethod::DropPrivsOrDie - Drop privileges or die /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqMethod::DropPrivsOrDie() +{ + if (!DropPrivileges()) { + Fail(false); + exit(112); /* call the european emergency number */ + } +} + + /*}}}*/ // AcqMethod::URIStart - Indicate a download is starting /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -147,6 +162,16 @@ void pkgAcqMethod::URIStart(FetchResult &Res) // AcqMethod::URIDone - A URI is finished /*{{{*/ // --------------------------------------------------------------------- /* */ +static void printHashStringList(HashStringList const * const list) +{ + for (HashStringList::const_iterator hash = list->begin(); hash != list->end(); ++hash) + { + // very old compatibility name for MD5Sum + if (hash->HashType() == "MD5Sum") + std::cout << "MD5-Hash: " << hash->HashValue() << "\n"; + std::cout << hash->HashType() << "-Hash: " << hash->HashValue() << "\n"; + } +} void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt) { if (Queue == 0) @@ -164,15 +189,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt) if (Res.LastModified != 0) std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n"; - if (Res.MD5Sum.empty() == false) - std::cout << "MD5-Hash: " << Res.MD5Sum << "\n" - << "MD5Sum-Hash: " << Res.MD5Sum << "\n"; - if (Res.SHA1Sum.empty() == false) - std::cout << "SHA1-Hash: " << Res.SHA1Sum << "\n"; - if (Res.SHA256Sum.empty() == false) - std::cout << "SHA256-Hash: " << Res.SHA256Sum << "\n"; - if (Res.SHA512Sum.empty() == false) - std::cout << "SHA512-Hash: " << Res.SHA512Sum << "\n"; + printHashStringList(&Res.Hashes); + if (UsedMirror.empty() == false) std::cout << "UsedMirror: " << UsedMirror << "\n"; if (Res.GPGVOutput.empty() == false) @@ -200,15 +218,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt) if (Alt->LastModified != 0) std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n"; - if (Alt->MD5Sum.empty() == false) - std::cout << "Alt-MD5-Hash: " << Alt->MD5Sum << "\n"; - if (Alt->SHA1Sum.empty() == false) - std::cout << "Alt-SHA1-Hash: " << Alt->SHA1Sum << "\n"; - if (Alt->SHA256Sum.empty() == false) - std::cout << "Alt-SHA256-Hash: " << Alt->SHA256Sum << "\n"; - if (Alt->SHA512Sum.empty() == false) - std::cout << "Alt-SHA512-Hash: " << Alt->SHA512Sum << "\n"; - + printHashStringList(&Alt->Hashes); + if (Alt->IMSHit == true) std::cout << "Alt-IMS-Hit: true\n"; } @@ -355,6 +366,17 @@ int pkgAcqMethod::Run(bool Single) Tmp->LastModified = 0; Tmp->IndexFile = StringToBool(LookupTag(Message,"Index-File"),false); Tmp->FailIgnore = StringToBool(LookupTag(Message,"Fail-Ignore"),false); + Tmp->ExpectedHashes = HashStringList(); + for (char const * const * t = HashString::SupportedHashes(); *t != NULL; ++t) + { + std::string tag = "Expected-"; + tag.append(*t); + std::string const hash = LookupTag(Message, tag.c_str()); + if (hash.empty() == false) + Tmp->ExpectedHashes.push_back(HashString(*t, hash)); + } + char *End; + Tmp->MaximumSize = strtoll(LookupTag(Message, "Maximum-Size", "0").c_str(), &End, 10); Tmp->Next = 0; // Append it to the list @@ -442,12 +464,9 @@ pkgAcqMethod::FetchResult::FetchResult() : LastModified(0), // --------------------------------------------------------------------- /* This hides the number of hashes we are supporting from the caller. It just deals with the hash class. */ -void pkgAcqMethod::FetchResult::TakeHashes(Hashes &Hash) +void pkgAcqMethod::FetchResult::TakeHashes(class Hashes &Hash) { - MD5Sum = Hash.MD5.Result(); - SHA1Sum = Hash.SHA1.Result(); - SHA256Sum = Hash.SHA256.Result(); - SHA512Sum = Hash.SHA512.Result(); + Hashes = Hash.GetHashStringList(); } /*}}}*/ void pkgAcqMethod::Dequeue() { /*{{{*/ @@ -458,3 +477,5 @@ void pkgAcqMethod::Dequeue() { /*{{{*/ delete Tmp; } /*}}}*/ + +pkgAcqMethod::~pkgAcqMethod() {} diff --git a/apt-pkg/acquire-method.h b/apt-pkg/acquire-method.h index 221ccf273..399454892 100644 --- a/apt-pkg/acquire-method.h +++ b/apt-pkg/acquire-method.h @@ -20,6 +20,7 @@ #ifndef PKGLIB_ACQUIRE_METHOD_H #define PKGLIB_ACQUIRE_METHOD_H +#include <apt-pkg/hashes.h> #include <apt-pkg/macros.h> #include <stdarg.h> @@ -33,7 +34,6 @@ #include <apt-pkg/strutl.h> #endif -class Hashes; class pkgAcqMethod { protected: @@ -44,17 +44,20 @@ class pkgAcqMethod std::string Uri; std::string DestFile; + int DestFileFd; time_t LastModified; bool IndexFile; bool FailIgnore; + HashStringList ExpectedHashes; + // a maximum size we will download, this can be the exact filesize + // for when we know it or a arbitrary limit when we don't know the + // filesize (like a InRelease file) + unsigned long long MaximumSize; }; struct FetchResult { - std::string MD5Sum; - std::string SHA1Sum; - std::string SHA256Sum; - std::string SHA512Sum; + HashStringList Hashes; std::vector<std::string> GPGVOutput; time_t LastModified; bool IMSHit; @@ -62,7 +65,7 @@ class pkgAcqMethod unsigned long long Size; unsigned long long ResumePoint; - void TakeHashes(Hashes &Hash); + void TakeHashes(class Hashes &Hash); FetchResult(); }; @@ -106,8 +109,8 @@ class pkgAcqMethod inline void SetIP(std::string aIP) {IP = aIP;}; pkgAcqMethod(const char *Ver,unsigned long Flags = 0); - virtual ~pkgAcqMethod() {}; - + virtual ~pkgAcqMethod(); + void DropPrivsOrDie(); private: APT_HIDDEN void Dequeue(); }; diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 047a655ce..f4d1ad412 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -34,12 +34,29 @@ #include <signal.h> #include <stdio.h> #include <errno.h> +#include <sys/types.h> +#include <pwd.h> +#include <grp.h> #include <apti18n.h> /*}}}*/ using namespace std; +static void ChangeOwnerAndPermissionOfFile(char const * const requester, char const * const file, char const * const user, char const * const group, mode_t const mode) /*{{{*/ +{ + if (getuid() == 0 && strlen(user) != 0 && strlen(group) != 0) // if we aren't root, we can't chown, so don't try it + { + // ensure the file is owned by root and has good permissions + struct passwd const * const pw = getpwnam(user); + struct group const * const gr = getgrnam(group); + if (pw != NULL && gr != NULL && chown(file, pw->pw_uid, gr->gr_gid) != 0) + _error->WarningE(requester, "chown to %s:%s of file %s failed", user, group, file); + } + if (chmod(file, mode) != 0) + _error->WarningE(requester, "chmod 0%o of file %s failed", mode, file); +} + /*}}}*/ // Worker::Worker - Constructor for Queue startup /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -306,7 +323,10 @@ bool pkgAcquire::Worker::RunMessages() pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; - + + if (RealFileExists(Owner->DestFile)) + ChangeOwnerAndPermissionOfFile("201::URIDone", Owner->DestFile.c_str(), "root", "root", 0644); + // Display update before completion if (Log != 0 && Log->MorePulses == true) Log->Pulse(Owner->GetOwner()); @@ -326,25 +346,30 @@ bool pkgAcquire::Worker::RunMessages() Owner->DestFile.c_str(), LookupTag(Message,"Size","0").c_str(),TotalSize); // see if there is a hash to verify - string RecivedHash; - HashString expectedHash(Owner->HashSum()); - if(!expectedHash.empty()) + HashStringList ReceivedHashes; + HashStringList expectedHashes = Owner->HashSums(); + for (HashStringList::const_iterator hs = expectedHashes.begin(); hs != expectedHashes.end(); ++hs) { - string hashTag = expectedHash.HashType()+"-Hash"; - string hashSum = LookupTag(Message, hashTag.c_str()); - if(!hashSum.empty()) - RecivedHash = expectedHash.HashType() + ":" + hashSum; - if(_config->FindB("Debug::pkgAcquire::Auth", false) == true) - { - clog << "201 URI Done: " << Owner->DescURI() << endl - << "RecivedHash: " << RecivedHash << endl - << "ExpectedHash: " << expectedHash.toStr() - << endl << endl; - } + std::string const tagname = hs->HashType() + "-Hash"; + std::string const hashsum = LookupTag(Message, tagname.c_str()); + if (hashsum.empty() == false) + ReceivedHashes.push_back(HashString(hs->HashType(), hashsum)); + } + + if(_config->FindB("Debug::pkgAcquire::Auth", false) == true) + { + std::clog << "201 URI Done: " << Owner->DescURI() << endl + << "ReceivedHash:" << endl; + for (HashStringList::const_iterator hs = ReceivedHashes.begin(); hs != ReceivedHashes.end(); ++hs) + std::clog << "\t- " << hs->toStr() << std::endl; + std::clog << "ExpectedHash:" << endl; + for (HashStringList::const_iterator hs = expectedHashes.begin(); hs != expectedHashes.end(); ++hs) + std::clog << "\t- " << hs->toStr() << std::endl; + std::clog << endl; } - Owner->Done(Message, ServerSize, RecivedHash.c_str(), Config); + Owner->Done(Message, ServerSize, ReceivedHashes, Config); ItemDone(); - + // Log that we are done if (Log != 0) { @@ -366,16 +391,21 @@ bool pkgAcquire::Worker::RunMessages() { if (Itm == 0) { - _error->Error("Method gave invalid 400 URI Failure message"); + std::string const msg = LookupTag(Message,"Message"); + _error->Error("Method gave invalid 400 URI Failure message: %s", msg.c_str()); break; } // Display update before completion if (Log != 0 && Log->MorePulses == true) Log->Pulse(Itm->Owner->GetOwner()); - + pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; + + if (RealFileExists(Owner->DestFile)) + ChangeOwnerAndPermissionOfFile("400::URIFailure", Owner->DestFile.c_str(), "root", "root", 0644); + OwnerQ->ItemDone(Itm); // set some status @@ -525,9 +555,25 @@ bool pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem *Item) Message.reserve(300); Message += "URI: " + Item->URI; Message += "\nFilename: " + Item->Owner->DestFile; + HashStringList const hsl = Item->Owner->HashSums(); + for (HashStringList::const_iterator hs = hsl.begin(); hs != hsl.end(); ++hs) + Message += "\nExpected-" + hs->HashType() + ": " + hs->HashValue(); + if(Item->Owner->FileSize > 0) + { + string MaximumSize; + strprintf(MaximumSize, "%llu", Item->Owner->FileSize); + Message += "\nMaximum-Size: " + MaximumSize; + } Message += Item->Owner->Custom600Headers(); Message += "\n\n"; - + + if (RealFileExists(Item->Owner->DestFile)) + { + std::string SandboxUser = _config->Find("APT::Sandbox::User"); + ChangeOwnerAndPermissionOfFile("Item::QueueURI", Item->Owner->DestFile.c_str(), + SandboxUser.c_str(), "root", 0600); + } + if (Debug == true) clog << " -> " << Access << ':' << QuoteString(Message,"\n") << endl; OutQueue += Message; diff --git a/apt-pkg/acquire-worker.h b/apt-pkg/acquire-worker.h index 67aee4b59..db8889c8e 100644 --- a/apt-pkg/acquire-worker.h +++ b/apt-pkg/acquire-worker.h @@ -101,6 +101,11 @@ class pkgAcquire::Worker : public WeakPointable */ int OutFd; + /** \brief The socket to send SCM_RIGHTS message through + */ + int PrivSepSocketFd; + int PrivSepSocketFdChild; + /** \brief Set to \b true if the worker is in a state in which it * might generate data or command responses. * diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 057bc24cd..0c815c005 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -27,15 +27,20 @@ #include <vector> #include <iostream> #include <sstream> +#include <iomanip> + #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> - +#include <pwd.h> +#include <grp.h> #include <dirent.h> #include <sys/time.h> #include <sys/select.h> #include <errno.h> +#include <sys/stat.h> +#include <sys/types.h> #include <apti18n.h> /*}}}*/ @@ -49,52 +54,110 @@ pkgAcquire::pkgAcquire() : LockFD(-1), Queues(0), Workers(0), Configs(0), Log(NU Debug(_config->FindB("Debug::pkgAcquire",false)), Running(false) { - string const Mode = _config->Find("Acquire::Queue-Mode","host"); - if (strcasecmp(Mode.c_str(),"host") == 0) - QueueMode = QueueHost; - if (strcasecmp(Mode.c_str(),"access") == 0) - QueueMode = QueueAccess; + Initialize(); } -pkgAcquire::pkgAcquire(pkgAcquireStatus *Progress) : LockFD(-1), Queues(0), Workers(0), - Configs(0), Log(Progress), ToFetch(0), +pkgAcquire::pkgAcquire(pkgAcquireStatus *Progress) : LockFD(-1), Queues(0), Workers(0), + Configs(0), Log(NULL), ToFetch(0), Debug(_config->FindB("Debug::pkgAcquire",false)), Running(false) { + Initialize(); + SetLog(Progress); +} +void pkgAcquire::Initialize() +{ string const Mode = _config->Find("Acquire::Queue-Mode","host"); if (strcasecmp(Mode.c_str(),"host") == 0) QueueMode = QueueHost; if (strcasecmp(Mode.c_str(),"access") == 0) QueueMode = QueueAccess; - Setup(Progress, ""); + + // chown the auth.conf file as it will be accessed by our methods + std::string const SandboxUser = _config->Find("APT::Sandbox::User"); + if (getuid() == 0 && SandboxUser.empty() == false) // if we aren't root, we can't chown, so don't try it + { + struct passwd const * const pw = getpwnam(SandboxUser.c_str()); + struct group const * const gr = getgrnam("root"); + if (pw != NULL && gr != NULL) + { + std::string const AuthConf = _config->FindFile("Dir::Etc::netrc"); + if(AuthConf.empty() == false && RealFileExists(AuthConf) && + chown(AuthConf.c_str(), pw->pw_uid, gr->gr_gid) != 0) + _error->WarningE("SetupAPTPartialDirectory", "chown to %s:root of file %s failed", SandboxUser.c_str(), AuthConf.c_str()); + } + } } /*}}}*/ -// Acquire::Setup - Delayed Constructor /*{{{*/ -// --------------------------------------------------------------------- -/* Do everything needed to be a complete Acquire object and report the - success (or failure) back so the user knows that something is wrong… */ +// Acquire::GetLock - lock directory and prepare for action /*{{{*/ +static bool SetupAPTPartialDirectory(std::string const &grand, std::string const &parent) +{ + std::string const partial = parent + "partial"; + mode_t const mode = umask(S_IWGRP | S_IWOTH); + bool const creation_fail = (CreateAPTDirectoryIfNeeded(grand, partial) == false && + CreateAPTDirectoryIfNeeded(parent, partial) == false); + umask(mode); + if (creation_fail == true) + return false; + + std::string const SandboxUser = _config->Find("APT::Sandbox::User"); + if (getuid() == 0 && SandboxUser.empty() == false) // if we aren't root, we can't chown, so don't try it + { + struct passwd const * const pw = getpwnam(SandboxUser.c_str()); + struct group const * const gr = getgrnam("root"); + if (pw != NULL && gr != NULL) + { + // chown the partial dir + if(chown(partial.c_str(), pw->pw_uid, gr->gr_gid) != 0) + _error->WarningE("SetupAPTPartialDirectory", "chown to %s:root of directory %s failed", SandboxUser.c_str(), partial.c_str()); + } + } + if (chmod(partial.c_str(), 0700) != 0) + _error->WarningE("SetupAPTPartialDirectory", "chmod 0700 of directory %s failed", partial.c_str()); + + return true; +} bool pkgAcquire::Setup(pkgAcquireStatus *Progress, string const &Lock) { Log = Progress; + if (Lock.empty()) + { + string const listDir = _config->FindDir("Dir::State::lists"); + if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir) == false) + return _error->Errno("Acquire", _("List directory %spartial is missing."), listDir.c_str()); + string const archivesDir = _config->FindDir("Dir::Cache::Archives"); + if (SetupAPTPartialDirectory(_config->FindDir("Dir::Cache"), archivesDir) == false) + return _error->Errno("Acquire", _("Archives directory %spartial is missing."), archivesDir.c_str()); + return true; + } + return GetLock(Lock); +} +bool pkgAcquire::GetLock(std::string const &Lock) +{ + if (Lock.empty() == true) + return false; // check for existence and possibly create auxiliary directories string const listDir = _config->FindDir("Dir::State::lists"); - string const partialListDir = listDir + "partial/"; string const archivesDir = _config->FindDir("Dir::Cache::Archives"); - string const partialArchivesDir = archivesDir + "partial/"; - if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false && - CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false) - return _error->Errno("Acquire", _("List directory %spartial is missing."), listDir.c_str()); - - if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::Cache"), partialArchivesDir) == false && - CreateAPTDirectoryIfNeeded(archivesDir, partialArchivesDir) == false) - return _error->Errno("Acquire", _("Archives directory %spartial is missing."), archivesDir.c_str()); + if (Lock == listDir) + { + if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir) == false) + return _error->Errno("Acquire", _("List directory %spartial is missing."), listDir.c_str()); + } + if (Lock == archivesDir) + { + if (SetupAPTPartialDirectory(_config->FindDir("Dir::Cache"), archivesDir) == false) + return _error->Errno("Acquire", _("Archives directory %spartial is missing."), archivesDir.c_str()); + } - if (Lock.empty() == true || _config->FindB("Debug::NoLocking", false) == true) + if (_config->FindB("Debug::NoLocking", false) == true) return true; // Lock the directory this acquire object will work in - LockFD = GetLock(flCombine(Lock, "lock")); + if (LockFD != -1) + close(LockFD); + LockFD = ::GetLock(flCombine(Lock, "lock")); if (LockFD == -1) return _error->Error(_("Unable to lock directory %s"), Lock.c_str()); @@ -580,27 +643,18 @@ pkgAcquire::UriIterator pkgAcquire::UriEnd() // Acquire::MethodConfig::MethodConfig - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgAcquire::MethodConfig::MethodConfig() +pkgAcquire::MethodConfig::MethodConfig() : d(NULL), Next(0), SingleInstance(false), + Pipeline(false), SendConfig(false), LocalOnly(false), NeedsCleanup(false), + Removable(false) { - SingleInstance = false; - Pipeline = false; - SendConfig = false; - LocalOnly = false; - Removable = false; - Next = 0; } /*}}}*/ // Queue::Queue - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgAcquire::Queue::Queue(string Name,pkgAcquire *Owner) : Name(Name), - Owner(Owner) +pkgAcquire::Queue::Queue(string Name,pkgAcquire *Owner) : d(NULL), Next(0), + Name(Name), Items(0), Workers(0), Owner(Owner), PipeDepth(0), MaxPipeDepth(1) { - Items = 0; - Next = 0; - Workers = 0; - MaxPipeDepth = 1; - PipeDepth = 0; } /*}}}*/ // Queue::~Queue - Destructor /*{{{*/ @@ -804,7 +858,7 @@ void pkgAcquire::Queue::Bump() // AcquireStatus::pkgAcquireStatus - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgAcquireStatus::pkgAcquireStatus() : d(NULL), Update(true), MorePulses(false) +pkgAcquireStatus::pkgAcquireStatus() : d(NULL), Percent(0), Update(true), MorePulses(false) { Start(); } @@ -824,7 +878,9 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) // Compute the total number of bytes to fetch unsigned int Unknown = 0; unsigned int Count = 0; - for (pkgAcquire::ItemCIterator I = Owner->ItemsBegin(); I != Owner->ItemsEnd(); + bool UnfetchedReleaseFiles = false; + for (pkgAcquire::ItemCIterator I = Owner->ItemsBegin(); + I != Owner->ItemsEnd(); ++I, ++Count) { TotalItems++; @@ -835,6 +891,13 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) if ((*I)->Local == true) continue; + // see if the method tells us to expect more + TotalItems += (*I)->ExpectedAdditionalItems; + + // check if there are unfetched Release files + if ((*I)->Complete == false && (*I)->ExpectedAdditionalItems > 0) + UnfetchedReleaseFiles = true; + TotalBytes += (*I)->FileSize; if ((*I)->Complete == true) CurrentBytes += (*I)->FileSize; @@ -846,6 +909,7 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) unsigned long long ResumeSize = 0; for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0; I = Owner->WorkerStep(I)) + { if (I->CurrentItem != 0 && I->CurrentItem->Owner->Complete == false) { CurrentBytes += I->CurrentSize; @@ -856,6 +920,7 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) I->CurrentItem->Owner->Complete == false) TotalBytes += I->CurrentSize; } + } // Normalize the figures and account for unknown size downloads if (TotalBytes <= 0) @@ -866,6 +931,12 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) // Wha?! Is not supposed to happen. if (CurrentBytes > TotalBytes) CurrentBytes = TotalBytes; + + // debug + if (_config->FindB("Debug::acquire::progress", false) == true) + std::clog << " Bytes: " + << SizeToStr(CurrentBytes) << " / " << SizeToStr(TotalBytes) + << std::endl; // Compute the CPS struct timeval NewTime; @@ -886,6 +957,14 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) Time = NewTime; } + // calculate the percentage, if we have too little data assume 1% + if (TotalBytes > 0 && UnfetchedReleaseFiles) + Percent = 0; + else + // use both files and bytes because bytes can be unreliable + Percent = (0.8 * (CurrentBytes/float(TotalBytes)*100.0) + + 0.2 * (CurrentItems/float(TotalItems)*100.0)); + int fd = _config->FindI("APT::Status-Fd",-1); if(fd > 0) { @@ -903,13 +982,11 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) else snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems); - - // build the status str status << "dlstatus:" << i - << ":" << (CurrentBytes/float(TotalBytes)*100.0) - << ":" << msg - << endl; + << ":" << std::setprecision(3) << Percent + << ":" << msg + << endl; std::string const dlstatus = status.str(); FileFd::Write(fd, dlstatus.c_str(), dlstatus.size()); @@ -964,3 +1041,7 @@ void pkgAcquireStatus::Fetched(unsigned long long Size,unsigned long long Resume FetchedBytes += Size - Resume; } /*}}}*/ + +APT_CONST pkgAcquire::UriIterator::~UriIterator() {} +APT_CONST pkgAcquire::MethodConfig::~MethodConfig() {} +APT_CONST pkgAcquireStatus::~pkgAcquireStatus() {} diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h index ef16d8556..f33362922 100644 --- a/apt-pkg/acquire.h +++ b/apt-pkg/acquire.h @@ -351,14 +351,24 @@ class pkgAcquire * long as the pkgAcquire object does. * \param Lock defines a lock file that should be acquired to ensure * only one Acquire class is in action at the time or an empty string - * if no lock file should be used. + * if no lock file should be used. If set also all needed directories + * will be created. */ - bool Setup(pkgAcquireStatus *Progress = NULL, std::string const &Lock = ""); + APT_DEPRECATED bool Setup(pkgAcquireStatus *Progress = NULL, std::string const &Lock = ""); void SetLog(pkgAcquireStatus *Progress) { Log = Progress; } + /** \brief acquire lock and perform directory setup + * + * \param Lock defines a lock file that should be acquired to ensure + * only one Acquire class is in action at the time or an empty string + * if no lock file should be used. If set also all needed directories + * will be created and setup. + */ + bool GetLock(std::string const &Lock); + /** \brief Construct a new pkgAcquire. */ - pkgAcquire(pkgAcquireStatus *Log) APT_DEPRECATED; + pkgAcquire(pkgAcquireStatus *Log); pkgAcquire(); /** \brief Destroy this pkgAcquire object. @@ -368,6 +378,8 @@ class pkgAcquire */ virtual ~pkgAcquire(); + private: + APT_HIDDEN void Initialize(); }; /** \brief Represents a single download source from which an item @@ -585,7 +597,7 @@ class pkgAcquire::UriIterator * * \param Q The queue over which this UriIterator should iterate. */ - UriIterator(pkgAcquire::Queue *Q) : CurQ(Q), CurItem(0) + UriIterator(pkgAcquire::Queue *Q) : d(NULL), CurQ(Q), CurItem(0) { while (CurItem == 0 && CurQ != 0) { @@ -593,7 +605,7 @@ class pkgAcquire::UriIterator CurQ = CurQ->Next; } } - virtual ~UriIterator() {}; + virtual ~UriIterator(); }; /*}}}*/ /** \brief Information about the properties of a single acquire method. {{{*/ @@ -651,8 +663,7 @@ struct pkgAcquire::MethodConfig */ MethodConfig(); - /* \brief Destructor, empty currently */ - virtual ~MethodConfig() {}; + virtual ~MethodConfig(); }; /*}}}*/ /** \brief A monitor object for downloads controlled by the pkgAcquire class. {{{ @@ -714,6 +725,10 @@ class pkgAcquireStatus /** \brief The number of items that have been successfully downloaded. */ unsigned long CurrentItems; + /** \brief The estimated percentage of the download (0-100) + */ + double Percent; + public: /** \brief If \b true, the download scheduler should call Pulse() @@ -794,7 +809,7 @@ class pkgAcquireStatus /** \brief Initialize all counters to 0 and the time to the current time. */ pkgAcquireStatus(); - virtual ~pkgAcquireStatus() {}; + virtual ~pkgAcquireStatus(); }; /*}}}*/ /** @} */ diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index b83831053..adbec82f7 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -640,13 +640,17 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) // ProblemResolver::Resolve - calls a resolver to fix the situation /*{{{*/ // --------------------------------------------------------------------- /* */ +#if APT_PKG_ABI < 413 bool pkgProblemResolver::Resolve(bool BrokenFix) { + return Resolve(BrokenFix, NULL); +} +#endif +bool pkgProblemResolver::Resolve(bool BrokenFix, OpProgress * const Progress) +{ std::string const solver = _config->Find("APT::Solver", "internal"); - if (solver != "internal") { - OpTextProgress Prog(*_config); - return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, &Prog); - } + if (solver != "internal") + return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, Progress); return ResolveInternal(BrokenFix); } /*}}}*/ @@ -1140,13 +1144,17 @@ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I) /* This is the work horse of the soft upgrade routine. It is very gental in that it does not install or remove any packages. It is assumed that the system was non-broken previously. */ +#if APT_PKG_ABI < 413 bool pkgProblemResolver::ResolveByKeep() { + return ResolveByKeep(NULL); +} +#endif +bool pkgProblemResolver::ResolveByKeep(OpProgress * const Progress) +{ std::string const solver = _config->Find("APT::Solver", "internal"); - if (solver != "internal") { - OpTextProgress Prog(*_config); - return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog); - } + if (solver != "internal") + return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress); return ResolveByKeepInternal(); } /*}}}*/ diff --git a/apt-pkg/algorithms.h b/apt-pkg/algorithms.h index f35bd9a13..2ac28c0d7 100644 --- a/apt-pkg/algorithms.h +++ b/apt-pkg/algorithms.h @@ -82,9 +82,9 @@ class pkgSimulate : public pkgPackageManager /*{{{*/ virtual bool Remove(PkgIterator Pkg,bool Purge); private: - void ShortBreaks(); - void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate); - + APT_HIDDEN void ShortBreaks(); + APT_HIDDEN void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate); + public: pkgSimulate(pkgDepCache *Cache); @@ -114,7 +114,7 @@ class pkgProblemResolver /*{{{*/ // Sort stuff static pkgProblemResolver *This; - static int ScoreSort(const void *a,const void *b) APT_PURE; + APT_HIDDEN static int ScoreSort(const void *a,const void *b) APT_PURE; struct PackageKill { @@ -122,12 +122,12 @@ class pkgProblemResolver /*{{{*/ DepIterator Dep; }; - void MakeScores(); - bool DoUpgrade(pkgCache::PkgIterator Pkg); + APT_HIDDEN void MakeScores(); + APT_HIDDEN bool DoUpgrade(pkgCache::PkgIterator Pkg); + + APT_HIDDEN bool ResolveInternal(bool const BrokenFix = false); + APT_HIDDEN bool ResolveByKeepInternal(); - bool ResolveInternal(bool const BrokenFix = false); - bool ResolveByKeepInternal(); - protected: bool InstOrNewPolicyBroken(pkgCache::PkgIterator Pkg); @@ -136,12 +136,22 @@ class pkgProblemResolver /*{{{*/ inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected; Cache.MarkProtected(Pkg);}; inline void Remove(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= ToRemove;}; inline void Clear(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] &= ~(Protected | ToRemove);}; - - // Try to intelligently resolve problems by installing and removing packages + + // Try to intelligently resolve problems by installing and removing packages +#if APT_PKG_ABI >= 413 + bool Resolve(bool BrokenFix = false, OpProgress * const Progress = NULL); +#else bool Resolve(bool BrokenFix = false); - + bool Resolve(bool BrokenFix, OpProgress * const Progress); +#endif + // Try to resolve problems only by using keep +#if APT_PKG_ABI >= 413 + bool ResolveByKeep(OpProgress * const Progress = NULL); +#else bool ResolveByKeep(); + bool ResolveByKeep(OpProgress * const Progress); +#endif APT_DEPRECATED void InstallProtect(); diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc index 9982759c6..01b85a74e 100644 --- a/apt-pkg/aptconfiguration.cc +++ b/apt-pkg/aptconfiguration.cc @@ -32,6 +32,35 @@ #include <apti18n.h> /*}}}*/ namespace APT { +// setDefaultConfigurationForCompressors /*{{{*/ +static void setDefaultConfigurationForCompressors() { + // Set default application paths to check for optional compression types + _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2"); + _config->CndSet("Dir::Bin::xz", "/usr/bin/xz"); + if (FileExists(_config->FindFile("Dir::Bin::xz")) == true) { + _config->Set("Dir::Bin::lzma", _config->FindFile("Dir::Bin::xz")); + _config->Set("APT::Compressor::lzma::Binary", "xz"); + if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) { + _config->Set("APT::Compressor::lzma::CompressArg::", "--format=lzma"); + _config->Set("APT::Compressor::lzma::CompressArg::", "-9"); + } + if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) { + _config->Set("APT::Compressor::lzma::UncompressArg::", "--format=lzma"); + _config->Set("APT::Compressor::lzma::UncompressArg::", "-d"); + } + } else { + _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma"); + if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) { + _config->Set("APT::Compressor::lzma::CompressArg::", "--suffix="); + _config->Set("APT::Compressor::lzma::CompressArg::", "-9"); + } + if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) { + _config->Set("APT::Compressor::lzma::UncompressArg::", "--suffix="); + _config->Set("APT::Compressor::lzma::UncompressArg::", "-d"); + } + } +} + /*}}}*/ // getCompressionTypes - Return Vector of usable compressiontypes /*{{{*/ // --------------------------------------------------------------------- /* return a vector of compression types in the preferred order. */ @@ -402,35 +431,6 @@ bool Configuration::checkArchitecture(std::string const &Arch) { return (std::find(archs.begin(), archs.end(), Arch) != archs.end()); } /*}}}*/ -// setDefaultConfigurationForCompressors /*{{{*/ -void Configuration::setDefaultConfigurationForCompressors() { - // Set default application paths to check for optional compression types - _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2"); - _config->CndSet("Dir::Bin::xz", "/usr/bin/xz"); - if (FileExists(_config->FindFile("Dir::Bin::xz")) == true) { - _config->Set("Dir::Bin::lzma", _config->FindFile("Dir::Bin::xz")); - _config->Set("APT::Compressor::lzma::Binary", "xz"); - if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) { - _config->Set("APT::Compressor::lzma::CompressArg::", "--format=lzma"); - _config->Set("APT::Compressor::lzma::CompressArg::", "-9"); - } - if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) { - _config->Set("APT::Compressor::lzma::UncompressArg::", "--format=lzma"); - _config->Set("APT::Compressor::lzma::UncompressArg::", "-d"); - } - } else { - _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma"); - if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) { - _config->Set("APT::Compressor::lzma::CompressArg::", "--suffix="); - _config->Set("APT::Compressor::lzma::CompressArg::", "-9"); - } - if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) { - _config->Set("APT::Compressor::lzma::UncompressArg::", "--suffix="); - _config->Set("APT::Compressor::lzma::UncompressArg::", "-d"); - } - } -} - /*}}}*/ // getCompressors - Return Vector of usealbe compressors /*{{{*/ // --------------------------------------------------------------------- /* return a vector of compressors used by apt-ftparchive in the @@ -540,7 +540,7 @@ std::string const Configuration::getBuildProfilesString() { return ""; std::vector<std::string>::const_iterator p = profiles.begin(); std::string list = *p; - for (; p != profiles.end(); ++p) + for (++p; p != profiles.end(); ++p) list.append(",").append(*p); return list; } diff --git a/apt-pkg/aptconfiguration.h b/apt-pkg/aptconfiguration.h index dfed194ae..c7b8d2d73 100644 --- a/apt-pkg/aptconfiguration.h +++ b/apt-pkg/aptconfiguration.h @@ -123,9 +123,6 @@ public: /*{{{*/ /** \return Return a comma-separated list of enabled build profile specifications */ std::string static const getBuildProfilesString(); /*}}}*/ - private: /*{{{*/ - void static setDefaultConfigurationForCompressors(); - /*}}}*/ }; /*}}}*/ } diff --git a/apt-pkg/cachefilter.cc b/apt-pkg/cachefilter.cc index e388f2450..4362f43e3 100644 --- a/apt-pkg/cachefilter.cc +++ b/apt-pkg/cachefilter.cc @@ -6,6 +6,7 @@ // Include Files /*{{{*/ #include <config.h> +#include <apt-pkg/cachefile.h> #include <apt-pkg/cachefilter.h> #include <apt-pkg/error.h> #include <apt-pkg/pkgcache.h> @@ -22,7 +23,11 @@ /*}}}*/ namespace APT { namespace CacheFilter { -PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) : d(NULL) {/*{{{*/ +APT_CONST Matcher::~Matcher() {} +APT_CONST PackageMatcher::~PackageMatcher() {} + +// Name matches RegEx /*{{{*/ +PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) { pattern = new regex_t; int const Res = regcomp(pattern, Pattern.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB); if (Res == 0) @@ -34,41 +39,36 @@ PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) : d regerror(Res, pattern, Error, sizeof(Error)); _error->Error(_("Regex compilation error - %s"), Error); } - /*}}}*/ -bool PackageNameMatchesRegEx::operator() (pkgCache::PkgIterator const &Pkg) {/*{{{*/ +bool PackageNameMatchesRegEx::operator() (pkgCache::PkgIterator const &Pkg) { if (unlikely(pattern == NULL)) return false; else return regexec(pattern, Pkg.Name(), 0, 0, 0) == 0; } - /*}}}*/ -bool PackageNameMatchesRegEx::operator() (pkgCache::GrpIterator const &Grp) {/*{{{*/ +bool PackageNameMatchesRegEx::operator() (pkgCache::GrpIterator const &Grp) { if (unlikely(pattern == NULL)) return false; else return regexec(pattern, Grp.Name(), 0, 0, 0) == 0; } - /*}}}*/ -PackageNameMatchesRegEx::~PackageNameMatchesRegEx() { /*{{{*/ +PackageNameMatchesRegEx::~PackageNameMatchesRegEx() { if (pattern == NULL) return; regfree(pattern); delete pattern; } /*}}}*/ - -// Fnmatch support /*{{{*/ -//---------------------------------------------------------------------- -bool PackageNameMatchesFnmatch::operator() (pkgCache::PkgIterator const &Pkg) {/*{{{*/ +// Name matches Fnmatch /*{{{*/ +PackageNameMatchesFnmatch::PackageNameMatchesFnmatch(std::string const &Pattern) : + Pattern(Pattern) {} +bool PackageNameMatchesFnmatch::operator() (pkgCache::PkgIterator const &Pkg) { return fnmatch(Pattern.c_str(), Pkg.Name(), FNM_CASEFOLD) == 0; } - /*}}}*/ -bool PackageNameMatchesFnmatch::operator() (pkgCache::GrpIterator const &Grp) {/*{{{*/ +bool PackageNameMatchesFnmatch::operator() (pkgCache::GrpIterator const &Grp) { return fnmatch(Pattern.c_str(), Grp.Name(), FNM_CASEFOLD) == 0; } /*}}}*/ - -// CompleteArch to <kernel>-<cpu> tuple /*{{{*/ +// Architecture matches <kernel>-<cpu> specification /*{{{*/ //---------------------------------------------------------------------- /* The complete architecture, consisting of <kernel>-<cpu>. */ static std::string CompleteArch(std::string const &arch) { @@ -82,12 +82,10 @@ static std::string CompleteArch(std::string const &arch) { else if (arch == "any") return "*-*"; else return "linux-" + arch; } - /*}}}*/ -PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern) :/*{{{*/ - literal(pattern), complete(CompleteArch(pattern)), isPattern(isPattern), d(NULL) { +PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern) : + literal(pattern), complete(CompleteArch(pattern)), isPattern(isPattern) { } - /*}}}*/ -bool PackageArchitectureMatchesSpecification::operator() (char const * const &arch) {/*{{{*/ +bool PackageArchitectureMatchesSpecification::operator() (char const * const &arch) { if (strcmp(literal.c_str(), arch) == 0 || strcmp(complete.c_str(), arch) == 0) return true; @@ -96,16 +94,112 @@ bool PackageArchitectureMatchesSpecification::operator() (char const * const &ar return fnmatch(complete.c_str(), pkgarch.c_str(), 0) == 0; return fnmatch(pkgarch.c_str(), complete.c_str(), 0) == 0; } - /*}}}*/ -bool PackageArchitectureMatchesSpecification::operator() (pkgCache::PkgIterator const &Pkg) {/*{{{*/ +bool PackageArchitectureMatchesSpecification::operator() (pkgCache::PkgIterator const &Pkg) { return (*this)(Pkg.Arch()); } +PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification() { +} /*}}}*/ -bool PackageArchitectureMatchesSpecification::operator() (pkgCache::VerIterator const &Ver) {/*{{{*/ - return (*this)(Ver.ParentPkg()); +// Package is new install /*{{{*/ +PackageIsNewInstall::PackageIsNewInstall(pkgCacheFile * const Cache) : Cache(Cache) {} +APT_PURE bool PackageIsNewInstall::operator() (pkgCache::PkgIterator const &Pkg) { + return (*Cache)[Pkg].NewInstall(); } +PackageIsNewInstall::~PackageIsNewInstall() {} /*}}}*/ -PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification() { /*{{{*/ +// Generica like True, False, NOT, AND, OR /*{{{*/ +APT_CONST bool TrueMatcher::operator() (pkgCache::PkgIterator const &) { return true; } +APT_CONST bool TrueMatcher::operator() (pkgCache::GrpIterator const &) { return true; } +APT_CONST bool TrueMatcher::operator() (pkgCache::VerIterator const &) { return true; } + +APT_CONST bool FalseMatcher::operator() (pkgCache::PkgIterator const &) { return false; } +APT_CONST bool FalseMatcher::operator() (pkgCache::GrpIterator const &) { return false; } +APT_CONST bool FalseMatcher::operator() (pkgCache::VerIterator const &) { return false; } + +NOTMatcher::NOTMatcher(Matcher * const matcher) : matcher(matcher) {} +bool NOTMatcher::operator() (pkgCache::PkgIterator const &Pkg) { return ! (*matcher)(Pkg); } +bool NOTMatcher::operator() (pkgCache::GrpIterator const &Grp) { return ! (*matcher)(Grp); } +bool NOTMatcher::operator() (pkgCache::VerIterator const &Ver) { return ! (*matcher)(Ver); } +NOTMatcher::~NOTMatcher() { delete matcher; } + +ANDMatcher::ANDMatcher() {} +ANDMatcher::ANDMatcher(Matcher * const matcher1) { + AND(matcher1); +} +ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2) { + AND(matcher1).AND(matcher2); +} +ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3) { + AND(matcher1).AND(matcher2).AND(matcher3); +} +ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4) { + AND(matcher1).AND(matcher2).AND(matcher3).AND(matcher4); +} +ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5) { + AND(matcher1).AND(matcher2).AND(matcher3).AND(matcher4).AND(matcher5); +} +ANDMatcher& ANDMatcher::AND(Matcher * const matcher) { matchers.push_back(matcher); return *this; } +bool ANDMatcher::operator() (pkgCache::PkgIterator const &Pkg) { + for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M) + if ((**M)(Pkg) == false) + return false; + return true; +} +bool ANDMatcher::operator() (pkgCache::GrpIterator const &Grp) { + for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M) + if ((**M)(Grp) == false) + return false; + return true; +} +bool ANDMatcher::operator() (pkgCache::VerIterator const &Ver) { + for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M) + if ((**M)(Ver) == false) + return false; + return true; +} +ANDMatcher::~ANDMatcher() { + for (std::vector<Matcher *>::iterator M = matchers.begin(); M != matchers.end(); ++M) + delete *M; +} + +ORMatcher::ORMatcher() {} +ORMatcher::ORMatcher(Matcher * const matcher1) { + OR(matcher1); +} +ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2) { + OR(matcher1).OR(matcher2); +} +ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3) { + OR(matcher1).OR(matcher2).OR(matcher3); +} +ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4) { + OR(matcher1).OR(matcher2).OR(matcher3).OR(matcher4); +} +ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5) { + OR(matcher1).OR(matcher2).OR(matcher3).OR(matcher4).OR(matcher5); +} +ORMatcher& ORMatcher::OR(Matcher * const matcher) { matchers.push_back(matcher); return *this; } +bool ORMatcher::operator() (pkgCache::PkgIterator const &Pkg) { + for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M) + if ((**M)(Pkg) == true) + return true; + return false; +} +bool ORMatcher::operator() (pkgCache::GrpIterator const &Grp) { + for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M) + if ((**M)(Grp) == true) + return true; + return false; +} +bool ORMatcher::operator() (pkgCache::VerIterator const &Ver) { + for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M) + if ((**M)(Ver) == true) + return true; + return false; +} +ORMatcher::~ORMatcher() { + for (std::vector<Matcher *>::iterator M = matchers.begin(); M != matchers.end(); ++M) + delete *M; } /*}}}*/ diff --git a/apt-pkg/cachefilter.h b/apt-pkg/cachefilter.h index 6d10d1163..b4697b773 100644 --- a/apt-pkg/cachefilter.h +++ b/apt-pkg/cachefilter.h @@ -10,86 +10,90 @@ #include <apt-pkg/cacheiterators.h> #include <string> +#include <vector> #include <regex.h> + +class pkgCacheFile; /*}}}*/ namespace APT { namespace CacheFilter { -#define PACKAGE_MATCHER_ABI_COMPAT 1 -#ifdef PACKAGE_MATCHER_ABI_COMPAT - -// PackageNameMatchesRegEx /*{{{*/ -class PackageNameMatchesRegEx { - /** \brief dpointer placeholder (for later in case we need it) */ - void *d; - regex_t* pattern; +class Matcher { public: - PackageNameMatchesRegEx(std::string const &Pattern); - bool operator() (pkgCache::PkgIterator const &Pkg); - bool operator() (pkgCache::GrpIterator const &Grp); - ~PackageNameMatchesRegEx(); + virtual bool operator() (pkgCache::PkgIterator const &/*Pkg*/) = 0; + virtual bool operator() (pkgCache::GrpIterator const &/*Grp*/) = 0; + virtual bool operator() (pkgCache::VerIterator const &/*Ver*/) = 0; + virtual ~Matcher(); }; - /*}}}*/ -// PackageNameMatchesFnmatch /*{{{*/ - class PackageNameMatchesFnmatch { - /** \brief dpointer placeholder (for later in case we need it) */ - void *d; - const std::string Pattern; + +class PackageMatcher : public Matcher { public: - PackageNameMatchesFnmatch(std::string const &Pattern) - : Pattern(Pattern) {}; - bool operator() (pkgCache::PkgIterator const &Pkg); - bool operator() (pkgCache::GrpIterator const &Grp); - ~PackageNameMatchesFnmatch() {}; + virtual bool operator() (pkgCache::PkgIterator const &Pkg) = 0; + virtual bool operator() (pkgCache::VerIterator const &Ver) { return (*this)(Ver.ParentPkg()); } + virtual bool operator() (pkgCache::GrpIterator const &/*Grp*/) { return false; } + virtual ~PackageMatcher(); }; - /*}}}*/ -// PackageArchitectureMatchesSpecification /*{{{*/ -/** \class PackageArchitectureMatchesSpecification - \brief matching against architecture specification strings - The strings are of the format \<kernel\>-\<cpu\> where either component, - or the whole string, can be the wildcard "any" as defined in - debian-policy §11.1 "Architecture specification strings". - - Examples: i386, mipsel, linux-any, any-amd64, any */ -class PackageArchitectureMatchesSpecification { - std::string literal; - std::string complete; - bool isPattern; - /** \brief dpointer placeholder (for later in case we need it) */ - void *d; +// Generica like True, False, NOT, AND, OR /*{{{*/ +class TrueMatcher : public Matcher { public: - /** \brief matching against architecture specification strings - * - * @param pattern is the architecture specification string - * @param isPattern defines if the given \b pattern is a - * architecture specification pattern to match others against - * or if it is the fixed string and matched against patterns - */ - PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern = true); - bool operator() (char const * const &arch); - bool operator() (pkgCache::PkgIterator const &Pkg); - bool operator() (pkgCache::VerIterator const &Ver); - ~PackageArchitectureMatchesSpecification(); + virtual bool operator() (pkgCache::PkgIterator const &Pkg); + virtual bool operator() (pkgCache::GrpIterator const &Grp); + virtual bool operator() (pkgCache::VerIterator const &Ver); }; - /*}}}*/ -#else +class FalseMatcher : public Matcher { +public: + virtual bool operator() (pkgCache::PkgIterator const &Pkg); + virtual bool operator() (pkgCache::GrpIterator const &Grp); + virtual bool operator() (pkgCache::VerIterator const &Ver); +}; -class PackageMatcher { - public: - virtual bool operator() (pkgCache::PkgIterator const &Pkg) { return false; }; - virtual bool operator() (pkgCache::GrpIterator const &Grp) { return false; }; - virtual bool operator() (pkgCache::VerIterator const &Ver) { return false; }; - - virtual ~PackageMatcher() {}; +class NOTMatcher : public Matcher { + Matcher * const matcher; +public: + NOTMatcher(Matcher * const matcher); + virtual bool operator() (pkgCache::PkgIterator const &Pkg); + virtual bool operator() (pkgCache::GrpIterator const &Grp); + virtual bool operator() (pkgCache::VerIterator const &Ver); + virtual ~NOTMatcher(); }; -// PackageNameMatchesRegEx /*{{{*/ -class PackageNameMatchesRegEx : public PackageMatcher { - /** \brief dpointer placeholder (for later in case we need it) */ - void *d; +class ANDMatcher : public Matcher { + std::vector<Matcher *> matchers; +public: + // 5 ought to be enough for everybody… c++11 variadic templates would be nice + ANDMatcher(); + ANDMatcher(Matcher * const matcher1); + ANDMatcher(Matcher * const matcher1, Matcher * const matcher2); + ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3); + ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4); + ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5); + ANDMatcher& AND(Matcher * const matcher); + virtual bool operator() (pkgCache::PkgIterator const &Pkg); + virtual bool operator() (pkgCache::GrpIterator const &Grp); + virtual bool operator() (pkgCache::VerIterator const &Ver); + virtual ~ANDMatcher(); +}; +class ORMatcher : public Matcher { + std::vector<Matcher *> matchers; +public: + // 5 ought to be enough for everybody… c++11 variadic templates would be nice + ORMatcher(); + ORMatcher(Matcher * const matcher1); + ORMatcher(Matcher * const matcher1, Matcher * const matcher2); + ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3); + ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4); + ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5); + ORMatcher& OR(Matcher * const matcher); + virtual bool operator() (pkgCache::PkgIterator const &Pkg); + virtual bool operator() (pkgCache::GrpIterator const &Grp); + virtual bool operator() (pkgCache::VerIterator const &Ver); + virtual ~ORMatcher(); +}; + /*}}}*/ +class PackageNameMatchesRegEx : public PackageMatcher { /*{{{*/ regex_t* pattern; public: PackageNameMatchesRegEx(std::string const &Pattern); @@ -98,20 +102,16 @@ public: virtual ~PackageNameMatchesRegEx(); }; /*}}}*/ -// PackageNameMatchesFnmatch /*{{{*/ - class PackageNameMatchesFnmatch : public PackageMatcher{ - /** \brief dpointer placeholder (for later in case we need it) */ - void *d; - const std::string Pattern; +class PackageNameMatchesFnmatch : public PackageMatcher { /*{{{*/ + const std::string Pattern; public: - PackageNameMatchesFnmatch(std::string const &Pattern) - : Pattern(Pattern) {}; - virtual bool operator() (pkgCache::PkgIterator const &Pkg); + PackageNameMatchesFnmatch(std::string const &Pattern); + virtual bool operator() (pkgCache::PkgIterator const &Pkg); virtual bool operator() (pkgCache::GrpIterator const &Grp); virtual ~PackageNameMatchesFnmatch() {}; }; /*}}}*/ -// PackageArchitectureMatchesSpecification /*{{{*/ +class PackageArchitectureMatchesSpecification : public PackageMatcher { /*{{{*/ /** \class PackageArchitectureMatchesSpecification \brief matching against architecture specification strings @@ -120,12 +120,9 @@ public: debian-policy §11.1 "Architecture specification strings". Examples: i386, mipsel, linux-any, any-amd64, any */ -class PackageArchitectureMatchesSpecification : public PackageMatcher { std::string literal; std::string complete; bool isPattern; - /** \brief dpointer placeholder (for later in case we need it) */ - void *d; public: /** \brief matching against architecture specification strings * @@ -137,11 +134,18 @@ public: PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern = true); bool operator() (char const * const &arch); virtual bool operator() (pkgCache::PkgIterator const &Pkg); - virtual bool operator() (pkgCache::VerIterator const &Ver); virtual ~PackageArchitectureMatchesSpecification(); }; -#endif /*}}}*/ +class PackageIsNewInstall : public PackageMatcher { /*{{{*/ + pkgCacheFile * const Cache; +public: + PackageIsNewInstall(pkgCacheFile * const Cache); + virtual bool operator() (pkgCache::PkgIterator const &Pkg); + virtual ~PackageIsNewInstall(); +}; + /*}}}*/ + } } #endif diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h index 513f40f17..fe798799c 100644 --- a/apt-pkg/cacheiterators.h +++ b/apt-pkg/cacheiterators.h @@ -159,10 +159,14 @@ class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> { enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure}; // Accessors - inline const char *Name() const {return S->Name == 0?0:Owner->StrP + S->Name;} + inline const char *Name() const { return Group().Name(); } // Versions have sections - and packages can have different versions with different sections // so this interface is broken by design. Run as fast as you can to Version.Section(). - APT_DEPRECATED inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;} + APT_DEPRECATED inline const char *Section() const { + APT_IGNORE_DEPRECATED_PUSH + return S->Section == 0?0:Owner->StrP + S->Section; + APT_IGNORE_DEPRECATED_POP + } inline bool Purge() const {return S->CurrentState == pkgCache::State::Purge || (S->CurrentVer == 0 && S->CurrentState == pkgCache::State::NotInstalled);} inline const char *Arch() const {return S->Arch == 0?0:Owner->StrP + S->Arch;} @@ -213,6 +217,14 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> { // Accessors inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;} inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;} +#if APT_PKG_ABI >= 413 + /** \brief source package name this version comes from + Always contains the name, even if it is the same as the binary name */ + inline const char *SourcePkgName() const {return Owner->StrP + S->SourcePkgName;} + /** \brief source version this version comes from + Always contains the version string, even if it is the same as the binary version */ + inline const char *SourceVerStr() const {return Owner->StrP + S->SourceVerStr;} +#endif inline const char *Arch() const { if ((S->MultiArch & pkgCache::Version::All) == pkgCache::Version::All) return "all"; @@ -334,7 +346,7 @@ class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> { inline void operator ++() {operator ++(0);} // Accessors - inline const char *Name() const {return Owner->StrP + Owner->PkgP[S->ParentPkg].Name;} + inline const char *Name() const {return ParentPkg().Name();} inline const char *ProvideVersion() const {return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;} inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);} inline VerIterator OwnerVer() const {return VerIterator(*Owner,Owner->VerP + S->Version);} diff --git a/apt-pkg/cacheset.cc b/apt-pkg/cacheset.cc index 2ed6a96da..9127a4064 100644 --- a/apt-pkg/cacheset.cc +++ b/apt-pkg/cacheset.cc @@ -24,6 +24,7 @@ #include <apt-pkg/depcache.h> #include <apt-pkg/macros.h> #include <apt-pkg/pkgcache.h> +#include <apt-pkg/fileutl.h> #include <stddef.h> #include <stdio.h> @@ -36,8 +37,23 @@ #include <apti18n.h> /*}}}*/ namespace APT { -// FromTask - Return all packages in the cache from a specific task /*{{{*/ -bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { + +// PackageFrom - selecting the appropriate method for package selection /*{{{*/ +bool CacheSetHelper::PackageFrom(enum PkgSelector const select, PackageContainerInterface * const pci, + pkgCacheFile &Cache, std::string const &pattern) { + switch (select) { + case UNKNOWN: return false; + case REGEX: return PackageFromRegEx(pci, Cache, pattern); + case TASK: return PackageFromTask(pci, Cache, pattern); + case FNMATCH: return PackageFromFnmatch(pci, Cache, pattern); + case PACKAGENAME: return PackageFromPackageName(pci, Cache, pattern); + case STRING: return PackageFromString(pci, Cache, pattern); + } + return false; +} + /*}}}*/ +// PackageFromTask - Return all packages in the cache from a specific task /*{{{*/ +bool CacheSetHelper::PackageFromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) { size_t const archfound = pattern.find_last_of(':'); std::string arch = "native"; if (archfound != std::string::npos) { @@ -54,7 +70,7 @@ bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci, bool const wasEmpty = pci->empty(); if (wasEmpty == true) - pci->setConstructor(TASK); + pci->setConstructor(CacheSetHelper::TASK); // get the records pkgRecords Recs(Cache); @@ -90,32 +106,32 @@ bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci, continue; pci->insert(Pkg); - helper.showTaskSelection(Pkg, pattern); + showPackageSelection(Pkg, CacheSetHelper::TASK, pattern); found = true; } regfree(&Pattern); if (found == false) { - helper.canNotFindTask(pci, Cache, pattern); - pci->setConstructor(UNKNOWN); + canNotFindPackage(CacheSetHelper::TASK, pci, Cache, pattern); + pci->setConstructor(CacheSetHelper::UNKNOWN); return false; } - if (wasEmpty == false && pci->getConstructor() != UNKNOWN) - pci->setConstructor(UNKNOWN); + if (wasEmpty == false && pci->getConstructor() != CacheSetHelper::UNKNOWN) + pci->setConstructor(CacheSetHelper::UNKNOWN); return true; } /*}}}*/ -// FromRegEx - Return all packages in the cache matching a pattern /*{{{*/ -bool PackageContainerInterface::FromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { +// PackageFromRegEx - Return all packages in the cache matching a pattern /*{{{*/ +bool CacheSetHelper::PackageFromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) { static const char * const isregex = ".?+*|[^$"; if (pattern.find_first_of(isregex) == std::string::npos) return false; bool const wasEmpty = pci->empty(); if (wasEmpty == true) - pci->setConstructor(REGEX); + pci->setConstructor(CacheSetHelper::REGEX); size_t archfound = pattern.find_last_of(':'); std::string arch = "native"; @@ -149,28 +165,25 @@ bool PackageContainerInterface::FromRegEx(PackageContainerInterface * const pci, } pci->insert(Pkg); - helper.showRegExSelection(Pkg, pattern); + showPackageSelection(Pkg, CacheSetHelper::REGEX, pattern); found = true; } if (found == false) { - helper.canNotFindRegEx(pci, Cache, pattern); - pci->setConstructor(UNKNOWN); + canNotFindPackage(CacheSetHelper::REGEX, pci, Cache, pattern); + pci->setConstructor(CacheSetHelper::UNKNOWN); return false; } - if (wasEmpty == false && pci->getConstructor() != UNKNOWN) - pci->setConstructor(UNKNOWN); + if (wasEmpty == false && pci->getConstructor() != CacheSetHelper::UNKNOWN) + pci->setConstructor(CacheSetHelper::UNKNOWN); return true; } /*}}}*/ -// FromFnmatch - Returns the package defined by this fnmatch /*{{{*/ -bool -PackageContainerInterface::FromFnmatch(PackageContainerInterface * const pci, - pkgCacheFile &Cache, - std::string pattern, - CacheSetHelper &helper) +// PackageFromFnmatch - Returns the package defined by this fnmatch /*{{{*/ +bool CacheSetHelper::PackageFromFnmatch(PackageContainerInterface * const pci, + pkgCacheFile &Cache, std::string pattern) { static const char * const isfnmatch = ".?*[]!"; if (pattern.find_first_of(isfnmatch) == std::string::npos) @@ -178,7 +191,7 @@ PackageContainerInterface::FromFnmatch(PackageContainerInterface * const pci, bool const wasEmpty = pci->empty(); if (wasEmpty == true) - pci->setConstructor(FNMATCH); + pci->setConstructor(CacheSetHelper::FNMATCH); size_t archfound = pattern.find_last_of(':'); std::string arch = "native"; @@ -212,33 +225,25 @@ PackageContainerInterface::FromFnmatch(PackageContainerInterface * const pci, } pci->insert(Pkg); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - helper.showFnmatchSelection(Pkg, pattern); -#else - helper.showRegExSelection(Pkg, pattern); -#endif + showPackageSelection(Pkg, CacheSetHelper::FNMATCH, pattern); found = true; } if (found == false) { -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - helper.canNotFindFnmatch(pci, Cache, pattern); -#else - helper.canNotFindRegEx(pci, Cache, pattern); -#endif - pci->setConstructor(UNKNOWN); + canNotFindPackage(CacheSetHelper::FNMATCH, pci, Cache, pattern); + pci->setConstructor(CacheSetHelper::UNKNOWN); return false; } - if (wasEmpty == false && pci->getConstructor() != UNKNOWN) - pci->setConstructor(UNKNOWN); + if (wasEmpty == false && pci->getConstructor() != CacheSetHelper::UNKNOWN) + pci->setConstructor(CacheSetHelper::UNKNOWN); return true; } /*}}}*/ -// FromName - Returns the package defined by this string /*{{{*/ -pkgCache::PkgIterator PackageContainerInterface::FromName(pkgCacheFile &Cache, - std::string const &str, CacheSetHelper &helper) { +// PackageFromName - Returns the package defined by this string /*{{{*/ +pkgCache::PkgIterator CacheSetHelper::PackageFromName(pkgCacheFile &Cache, + std::string const &str) { std::string pkg = str; size_t archfound = pkg.find_last_of(':'); std::string arch; @@ -259,13 +264,13 @@ pkgCache::PkgIterator PackageContainerInterface::FromName(pkgCacheFile &Cache, Pkg = Cache.GetPkgCache()->FindPkg(pkg, arch); if (Pkg.end() == true) - return helper.canNotFindPkgName(Cache, str); + return canNotFindPkgName(Cache, str); return Pkg; } /*}}}*/ -// FromGroup - Returns the package defined by this string /*{{{*/ -bool PackageContainerInterface::FromGroup(PackageContainerInterface * const pci, pkgCacheFile &Cache, - std::string pkg, CacheSetHelper &helper) { +// PackageFromPackageName - Returns the package defined by this string /*{{{*/ +bool CacheSetHelper::PackageFromPackageName(PackageContainerInterface * const pci, pkgCacheFile &Cache, + std::string pkg) { if (unlikely(Cache.GetPkgCache() == 0)) return false; @@ -305,7 +310,7 @@ bool PackageContainerInterface::FromGroup(PackageContainerInterface * const pci, } } - pkgCache::PkgIterator Pkg = helper.canNotFindPkgName(Cache, pkg); + pkgCache::PkgIterator Pkg = canNotFindPkgName(Cache, pkg); if (Pkg.end() == true) return false; @@ -313,19 +318,18 @@ bool PackageContainerInterface::FromGroup(PackageContainerInterface * const pci, return true; } /*}}}*/ -// FromString - Return all packages matching a specific string /*{{{*/ -bool PackageContainerInterface::FromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str, CacheSetHelper &helper) { +// PackageFromString - Return all packages matching a specific string /*{{{*/ +bool CacheSetHelper::PackageFromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str) { bool found = true; _error->PushToStack(); - if (FromGroup(pci, Cache, str, helper) == false && - FromTask(pci, Cache, str, helper) == false && -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - FromFnmatch(pci, Cache, str, helper) == false) -#endif - FromRegEx(pci, Cache, str, helper) == false) + if (PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, str) == false && + PackageFrom(CacheSetHelper::TASK, pci, Cache, str) == false && + // FIXME: hm, hm, regexp/fnmatch incompatible? + PackageFrom(CacheSetHelper::FNMATCH, pci, Cache, str) == false && + PackageFrom(CacheSetHelper::REGEX, pci, Cache, str) == false) { - helper.canNotFindPackage(pci, Cache, str); + canNotFindPackage(CacheSetHelper::PACKAGENAME, pci, Cache, str); found = false; } @@ -336,51 +340,50 @@ bool PackageContainerInterface::FromString(PackageContainerInterface * const pci return found; } /*}}}*/ -// FromCommandLine - Return all packages specified on commandline /*{{{*/ -bool PackageContainerInterface::FromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper) { +// PackageFromCommandLine - Return all packages specified on commandline /*{{{*/ +bool CacheSetHelper::PackageFromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline) { bool found = false; for (const char **I = cmdline; *I != 0; ++I) - found |= PackageContainerInterface::FromString(pci, Cache, *I, helper); + found |= PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, *I); return found; } /*}}}*/ // FromModifierCommandLine - helper doing the work for PKG:GroupedFromCommandLine /*{{{*/ -bool PackageContainerInterface::FromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci, +bool CacheSetHelper::PackageFromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci, pkgCacheFile &Cache, const char * cmdline, - std::list<Modifier> const &mods, CacheSetHelper &helper) { + std::list<PkgModifier> const &mods) { std::string str = cmdline; unsigned short fallback = modID; bool modifierPresent = false; - for (std::list<Modifier>::const_iterator mod = mods.begin(); + for (std::list<PkgModifier>::const_iterator mod = mods.begin(); mod != mods.end(); ++mod) { size_t const alength = strlen(mod->Alias); switch(mod->Pos) { - case Modifier::POSTFIX: + case PkgModifier::POSTFIX: if (str.compare(str.length() - alength, alength, mod->Alias, 0, alength) != 0) continue; str.erase(str.length() - alength); modID = mod->ID; break; - case Modifier::PREFIX: + case PkgModifier::PREFIX: continue; - case Modifier::NONE: + case PkgModifier::NONE: continue; } modifierPresent = true; break; } if (modifierPresent == true) { - bool const errors = helper.showErrors(false); - pkgCache::PkgIterator Pkg = FromName(Cache, cmdline, helper); - helper.showErrors(errors); - if (Pkg.end() == false) { - pci->insert(Pkg); + bool const errors = showErrors(false); + bool const found = PackageFrom(PACKAGENAME, pci, Cache, cmdline); + showErrors(errors); + if (found == true) { modID = fallback; return true; } } - return FromString(pci, Cache, str, helper); + return PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, str); } /*}}}*/ // FromModifierCommandLine - helper doing the work for VER:GroupedFromCommandLine /*{{{*/ @@ -389,7 +392,7 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID, pkgCacheFile &Cache, const char * cmdline, std::list<Modifier> const &mods, CacheSetHelper &helper) { - Version select = NEWEST; + CacheSetHelper::VerSelector select = CacheSetHelper::NEWEST; std::string str = cmdline; if (unlikely(str.empty() == true)) return false; @@ -432,7 +435,8 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID, // FromCommandLine - Return all versions specified on commandline /*{{{*/ bool VersionContainerInterface::FromCommandLine(VersionContainerInterface * const vci, pkgCacheFile &Cache, const char **cmdline, - Version const &fallback, CacheSetHelper &helper) { + CacheSetHelper::VerSelector const fallback, + CacheSetHelper &helper) { bool found = false; for (const char **I = cmdline; *I != 0; ++I) found |= VersionContainerInterface::FromString(vci, Cache, *I, fallback, helper); @@ -442,8 +446,17 @@ bool VersionContainerInterface::FromCommandLine(VersionContainerInterface * cons // FromString - Returns all versions spedcified by a string /*{{{*/ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci, pkgCacheFile &Cache, std::string pkg, - Version const &fallback, CacheSetHelper &helper, + CacheSetHelper::VerSelector const fallback, + CacheSetHelper &helper, bool const onlyFromName) { + PackageSet pkgset; + if(FileExists(pkg)) { + helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg); + if(pkgset.empty() == true) + return false; + return VersionContainerInterface::FromPackage(vci, Cache, pkgset.begin(), fallback, helper); + } + std::string ver; bool verIsRel = false; size_t const vertag = pkg.find_last_of("/="); @@ -452,15 +465,14 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci verIsRel = (pkg[vertag] == '/'); pkg.erase(vertag); } - PackageSet pkgset; if (onlyFromName == false) - PackageContainerInterface::FromString(&pkgset, Cache, pkg, helper); + helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg); else { - pkgset.insert(PackageContainerInterface::FromName(Cache, pkg, helper)); + helper.PackageFrom(CacheSetHelper::PACKAGENAME, &pkgset, Cache, pkg); } bool errors = true; - if (pkgset.getConstructor() != PackageSet::UNKNOWN) + if (pkgset.getConstructor() != CacheSetHelper::UNKNOWN) errors = helper.showErrors(false); bool found = false; @@ -479,7 +491,7 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci if (P->VersionList != 0) V = P.VersionList(); else - V = helper.canNotFindNewestVer(Cache, P); + V = helper.canNotGetVersion(CacheSetHelper::NEWEST, Cache, P); } else { pkgVersionMatch Match(ver, (verIsRel == true ? pkgVersionMatch::Release : pkgVersionMatch::Version)); @@ -496,11 +508,14 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci } if (V.end() == true) continue; - helper.showSelectedVersion(P, V, ver, verIsRel); + if (verIsRel == true) + helper.showVersionSelection(P, V, CacheSetHelper::RELEASE, ver); + else + helper.showVersionSelection(P, V, CacheSetHelper::VERSIONNUMBER, ver); vci->insert(V); found = true; } - if (pkgset.getConstructor() != PackageSet::UNKNOWN) + if (pkgset.getConstructor() != CacheSetHelper::UNKNOWN) helper.showErrors(errors); return found; } @@ -509,30 +524,30 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci bool VersionContainerInterface::FromPackage(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &P, - Version const &fallback, + CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper) { pkgCache::VerIterator V; bool showErrors; bool found = false; switch(fallback) { - case ALL: + case CacheSetHelper::ALL: if (P->VersionList != 0) for (V = P.VersionList(); V.end() != true; ++V) found |= vci->insert(V); else - helper.canNotFindAllVer(vci, Cache, P); + helper.canNotFindVersion(CacheSetHelper::ALL, vci, Cache, P); break; - case CANDANDINST: + case CacheSetHelper::CANDANDINST: found |= vci->insert(getInstalledVer(Cache, P, helper)); found |= vci->insert(getCandidateVer(Cache, P, helper)); break; - case CANDIDATE: + case CacheSetHelper::CANDIDATE: found |= vci->insert(getCandidateVer(Cache, P, helper)); break; - case INSTALLED: + case CacheSetHelper::INSTALLED: found |= vci->insert(getInstalledVer(Cache, P, helper)); break; - case CANDINST: + case CacheSetHelper::CANDINST: showErrors = helper.showErrors(false); V = getCandidateVer(Cache, P, helper); if (V.end() == true) @@ -541,9 +556,9 @@ bool VersionContainerInterface::FromPackage(VersionContainerInterface * const vc if (V.end() == false) found |= vci->insert(V); else - helper.canNotFindInstCandVer(vci, Cache, P); + helper.canNotFindVersion(CacheSetHelper::CANDINST, vci, Cache, P); break; - case INSTCAND: + case CacheSetHelper::INSTCAND: showErrors = helper.showErrors(false); V = getInstalledVer(Cache, P, helper); if (V.end() == true) @@ -552,14 +567,18 @@ bool VersionContainerInterface::FromPackage(VersionContainerInterface * const vc if (V.end() == false) found |= vci->insert(V); else - helper.canNotFindInstCandVer(vci, Cache, P); + helper.canNotFindVersion(CacheSetHelper::INSTCAND, vci, Cache, P); break; - case NEWEST: + case CacheSetHelper::NEWEST: if (P->VersionList != 0) found |= vci->insert(P.VersionList()); else - helper.canNotFindNewestVer(Cache, P); + helper.canNotFindVersion(CacheSetHelper::NEWEST, vci, Cache, P); break; + case CacheSetHelper::RELEASE: + case CacheSetHelper::VERSIONNUMBER: + // both make no sense here, so always false + return false; } return found; } @@ -576,7 +595,7 @@ pkgCache::VerIterator VersionContainerInterface::getCandidateVer(pkgCacheFile &C Cand = Cache[Pkg].CandidateVerIter(Cache); } if (Cand.end() == true) - return helper.canNotFindCandidateVer(Cache, Pkg); + return helper.canNotGetVersion(CacheSetHelper::CANDIDATE, Cache, Pkg); return Cand; } /*}}}*/ @@ -584,19 +603,26 @@ pkgCache::VerIterator VersionContainerInterface::getCandidateVer(pkgCacheFile &C pkgCache::VerIterator VersionContainerInterface::getInstalledVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg, CacheSetHelper &helper) { if (Pkg->CurrentVer == 0) - return helper.canNotFindInstalledVer(Cache, Pkg); + return helper.canNotGetVersion(CacheSetHelper::INSTALLED, Cache, Pkg); return Pkg.CurrentVer(); } /*}}}*/ -// canNotFindPkgName - handle the case no package has this name /*{{{*/ -pkgCache::PkgIterator CacheSetHelper::canNotFindPkgName(pkgCacheFile &Cache, - std::string const &str) { - if (ShowError == true) - _error->Insert(ErrorType, _("Unable to locate package %s"), str.c_str()); - return pkgCache::PkgIterator(Cache, 0); +// canNotFindPackage - with the given selector and pattern /*{{{*/ +void CacheSetHelper::canNotFindPackage(enum PkgSelector const select, + PackageContainerInterface * const pci, pkgCacheFile &Cache, + std::string const &pattern) { + switch (select) { +APT_IGNORE_DEPRECATED_PUSH + case REGEX: canNotFindRegEx(pci, Cache, pattern); break; + case TASK: canNotFindTask(pci, Cache, pattern); break; + case FNMATCH: canNotFindFnmatch(pci, Cache, pattern); break; + case PACKAGENAME: canNotFindPackage(pci, Cache, pattern); break; + case STRING: canNotFindPackage(pci, Cache, pattern); break; + case UNKNOWN: break; +APT_IGNORE_DEPRECATED_POP + } } - /*}}}*/ // canNotFindTask - handle the case no package is found for a task /*{{{*/ void CacheSetHelper::canNotFindTask(PackageContainerInterface * const /*pci*/, pkgCacheFile &/*Cache*/, std::string pattern) { if (ShowError == true) @@ -608,17 +634,45 @@ void CacheSetHelper::canNotFindRegEx(PackageContainerInterface * const /*pci*/, if (ShowError == true) _error->Insert(ErrorType, _("Couldn't find any package by regex '%s'"), pattern.c_str()); } -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) + /*}}}*/ // canNotFindFnmatch - handle the case no package is found by a fnmatch /*{{{*/ -void CacheSetHelper::canNotFindFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) { + void CacheSetHelper::canNotFindFnmatch(PackageContainerInterface * const /*pci*/, pkgCacheFile &/*Cache*/, std::string pattern) { if (ShowError == true) _error->Insert(ErrorType, _("Couldn't find any package by glob '%s'"), pattern.c_str()); } -#endif /*}}}*/ + /*}}}*/ // canNotFindPackage - handle the case no package is found from a string/*{{{*/ APT_CONST void CacheSetHelper::canNotFindPackage(PackageContainerInterface * const /*pci*/, pkgCacheFile &/*Cache*/, std::string const &/*str*/) { } /*}}}*/ + /*}}}*/ +// canNotFindPkgName - handle the case no package has this name /*{{{*/ +pkgCache::PkgIterator CacheSetHelper::canNotFindPkgName(pkgCacheFile &Cache, + std::string const &str) { + if (ShowError == true) + _error->Insert(ErrorType, _("Unable to locate package %s"), str.c_str()); + return pkgCache::PkgIterator(Cache, 0); +} + /*}}}*/ +// canNotFindVersion - for package by selector /*{{{*/ +void CacheSetHelper::canNotFindVersion(enum VerSelector const select, VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) +{ + switch (select) { +APT_IGNORE_DEPRECATED_PUSH + case ALL: canNotFindAllVer(vci, Cache, Pkg); break; + case INSTCAND: canNotFindInstCandVer(vci, Cache, Pkg); break; + case CANDINST: canNotFindCandInstVer(vci, Cache, Pkg); break; + case NEWEST: canNotFindNewestVer(Cache, Pkg); break; + case CANDIDATE: canNotFindCandidateVer(Cache, Pkg); break; + case INSTALLED: canNotFindInstalledVer(Cache, Pkg); break; +APT_IGNORE_DEPRECATED_POP + case CANDANDINST: canNotGetCandInstVer(Cache, Pkg); break; + case RELEASE: + case VERSIONNUMBER: + // invalid in this branch + break; + } +} // canNotFindAllVer /*{{{*/ void CacheSetHelper::canNotFindAllVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &/*Cache*/, pkgCache::PkgIterator const &Pkg) { @@ -627,19 +681,37 @@ void CacheSetHelper::canNotFindAllVer(VersionContainerInterface * const /*vci*/, } /*}}}*/ // canNotFindInstCandVer /*{{{*/ -void CacheSetHelper::canNotFindInstCandVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &/*Cache*/, +void CacheSetHelper::canNotFindInstCandVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { - if (ShowError == true) - _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str()); + canNotGetInstCandVer(Cache, Pkg); } /*}}}*/ // canNotFindInstCandVer /*{{{*/ -void CacheSetHelper::canNotFindCandInstVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &/*Cache*/, +void CacheSetHelper::canNotFindCandInstVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { - if (ShowError == true) - _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str()); + canNotGetCandInstVer(Cache, Pkg); } /*}}}*/ + /*}}}*/ +// canNotGetVersion - for package by selector /*{{{*/ +pkgCache::VerIterator CacheSetHelper::canNotGetVersion(enum VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { + switch (select) { +APT_IGNORE_DEPRECATED_PUSH + case NEWEST: return canNotFindNewestVer(Cache, Pkg); + case CANDIDATE: return canNotFindCandidateVer(Cache, Pkg); + case INSTALLED: return canNotFindInstalledVer(Cache, Pkg); +APT_IGNORE_DEPRECATED_POP + case CANDINST: return canNotGetCandInstVer(Cache, Pkg); + case INSTCAND: return canNotGetInstCandVer(Cache, Pkg); + case ALL: + case CANDANDINST: + case RELEASE: + case VERSIONNUMBER: + // invalid in this branch + return pkgCache::VerIterator(Cache, 0); + } + return pkgCache::VerIterator(Cache, 0); +} // canNotFindNewestVer /*{{{*/ pkgCache::VerIterator CacheSetHelper::canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { @@ -664,6 +736,37 @@ pkgCache::VerIterator CacheSetHelper::canNotFindInstalledVer(pkgCacheFile &Cache return pkgCache::VerIterator(Cache, 0); } /*}}}*/ +// canNotFindInstCandVer /*{{{*/ +pkgCache::VerIterator CacheSetHelper::canNotGetInstCandVer(pkgCacheFile &Cache, + pkgCache::PkgIterator const &Pkg) { + if (ShowError == true) + _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str()); + return pkgCache::VerIterator(Cache, 0); +} + /*}}}*/ +// canNotFindInstCandVer /*{{{*/ +pkgCache::VerIterator CacheSetHelper::canNotGetCandInstVer(pkgCacheFile &Cache, + pkgCache::PkgIterator const &Pkg) { + if (ShowError == true) + _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str()); + return pkgCache::VerIterator(Cache, 0); +} + /*}}}*/ + /*}}}*/ +// showPackageSelection - by selector and given pattern /*{{{*/ +APT_CONST void CacheSetHelper::showPackageSelection(pkgCache::PkgIterator const &pkg, enum PkgSelector const select, + std::string const &pattern) { + switch (select) { +APT_IGNORE_DEPRECATED_PUSH + case REGEX: showRegExSelection(pkg, pattern); break; + case TASK: showTaskSelection(pkg, pattern); break; + case FNMATCH: showFnmatchSelection(pkg, pattern); break; +APT_IGNORE_DEPRECATED_POP + case PACKAGENAME: /* no suprises here */ break; + case STRING: /* handled by the special cases */ break; + case UNKNOWN: break; + } +} // showTaskSelection /*{{{*/ APT_CONST void CacheSetHelper::showTaskSelection(pkgCache::PkgIterator const &/*pkg*/, std::string const &/*pattern*/) { @@ -674,14 +777,35 @@ APT_CONST void CacheSetHelper::showRegExSelection(pkgCache::PkgIterator const &/ std::string const &/*pattern*/) { } /*}}}*/ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) // showFnmatchSelection /*{{{*/ -APT_CONST void CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator const &pkg, - std::string const &pattern) { +APT_CONST void CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator const &/*pkg*/, + std::string const &/*pattern*/) { } /*}}}*/ -#endif -// showSelectedVersion /*{{{*/ + /*}}}*/ +// showVersionSelection /*{{{*/ +APT_CONST void CacheSetHelper::showVersionSelection(pkgCache::PkgIterator const &Pkg, + pkgCache::VerIterator const &Ver, enum VerSelector const select, std::string const &pattern) { + switch (select) { +APT_IGNORE_DEPRECATED_PUSH + case RELEASE: + showSelectedVersion(Pkg, Ver, pattern, true); + break; + case VERSIONNUMBER: + showSelectedVersion(Pkg, Ver, pattern, false); + break; +APT_IGNORE_DEPRECATED_POP + case NEWEST: + case CANDIDATE: + case INSTALLED: + case CANDINST: + case INSTCAND: + case ALL: + case CANDANDINST: + // not really suprises, but in fact: just not implemented + break; + } +} APT_CONST void CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator const &/*Pkg*/, pkgCache::VerIterator const /*Ver*/, std::string const &/*ver*/, diff --git a/apt-pkg/cacheset.h b/apt-pkg/cacheset.h index b7229bc04..884e8b859 100644 --- a/apt-pkg/cacheset.h +++ b/apt-pkg/cacheset.h @@ -13,14 +13,17 @@ #include <map> #include <set> #include <list> +#include <vector> #include <string> #include <iterator> +#include <algorithm> #include <stddef.h> #include <apt-pkg/error.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/cacheiterators.h> +#include <apt-pkg/macros.h> #ifndef APT_8_CLEANER_HEADERS #include <apt-pkg/cachefile.h> @@ -51,36 +54,127 @@ public: /*{{{*/ ShowError(ShowError), ErrorType(ErrorType) {} virtual ~CacheSetHelper() {} - virtual void showTaskSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern); - virtual void showRegExSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - virtual void showFnmatchSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern); -#endif - virtual void showSelectedVersion(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const Ver, - std::string const &ver, bool const verIsRel); + enum PkgSelector { UNKNOWN, REGEX, TASK, FNMATCH, PACKAGENAME, STRING }; - virtual void canNotFindTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); - virtual void canNotFindRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - virtual void canNotFindFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); -#endif - virtual void canNotFindPackage(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str); + virtual bool PackageFrom(enum PkgSelector const select, PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern); + + virtual bool PackageFromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline); + + struct PkgModifier { + enum Position { NONE, PREFIX, POSTFIX }; + unsigned short ID; + const char * const Alias; + Position Pos; + PkgModifier (unsigned short const &id, const char * const alias, Position const &pos) : ID(id), Alias(alias), Pos(pos) {} + }; + virtual bool PackageFromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci, + pkgCacheFile &Cache, const char * cmdline, + std::list<PkgModifier> const &mods); + + // use PackageFrom(PACKAGENAME, …) instead + APT_DEPRECATED pkgCache::PkgIterator PackageFromName(pkgCacheFile &Cache, std::string const &pattern); + + /** \brief be notified about the package being selected via pattern + * + * Main use is probably to show a message to the user what happened + * + * \param pkg is the package which was selected + * \param select is the selection method which choose the package + * \param pattern is the string used by the selection method to pick the package + */ + virtual void showPackageSelection(pkgCache::PkgIterator const &pkg, PkgSelector const select, std::string const &pattern); + // use the method above instead, react only on the type you need and let the base handle the rest if need be + // this allows use to add new selection methods without breaking the ABI constantly with new virtual methods + APT_DEPRECATED virtual void showTaskSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern); + APT_DEPRECATED virtual void showRegExSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern); + APT_DEPRECATED virtual void showFnmatchSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern); + + /** \brief be notified if a package can't be found via pattern + * + * Can be used to show a message as well as to try something else to make it match + * + * \param select is the method tried for selection + * \param pci is the container the package should be inserted in + * \param Cache is the package universe available + * \param pattern is the string not matching anything + */ + virtual void canNotFindPackage(enum PkgSelector const select, PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern); + // same as above for showPackageSelection + APT_DEPRECATED virtual void canNotFindTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + APT_DEPRECATED virtual void canNotFindRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + APT_DEPRECATED virtual void canNotFindFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + APT_DEPRECATED virtual void canNotFindPackage(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str); + + /** \brief specifies which version(s) we want to refer to */ + enum VerSelector { + /** by release string */ + RELEASE, + /** by version number string */ + VERSIONNUMBER, + /** All versions */ + ALL, + /** Candidate and installed version */ + CANDANDINST, + /** Candidate version */ + CANDIDATE, + /** Installed version */ + INSTALLED, + /** Candidate or if non installed version */ + CANDINST, + /** Installed or if non candidate version */ + INSTCAND, + /** Newest version */ + NEWEST + }; + + /** \brief be notified about the version being selected via pattern + * + * Main use is probably to show a message to the user what happened + * Note that at the moment this method is only called for RELEASE + * and VERSION selections, not for the others. + * + * \param Pkg is the package which was selected for + * \param Ver is the version selected + * \param select is the selection method which choose the version + * \param pattern is the string used by the selection method to pick the version + */ + virtual void showVersionSelection(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const &Ver, + enum VerSelector const select, std::string const &pattern); + // renamed to have a similar interface to showPackageSelection + APT_DEPRECATED virtual void showSelectedVersion(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const Ver, + std::string const &ver, bool const verIsRel); - virtual void canNotFindAllVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); - virtual void canNotFindInstCandVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, + /** \brief be notified if a version can't be found for a package + * + * Main use is probably to show a message to the user what happened + * + * \param select is the method tried for selection + * \param vci is the container the version should be inserted in + * \param Cache is the package universe available + * \param Pkg is the package we wanted a version from + */ + virtual void canNotFindVersion(enum VerSelector const select, VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); + // same as above for showPackageSelection + APT_DEPRECATED virtual void canNotFindAllVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); + APT_DEPRECATED virtual void canNotFindInstCandVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); - virtual void canNotFindCandInstVer(VersionContainerInterface * const vci, + APT_DEPRECATED virtual void canNotFindCandInstVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); - virtual pkgCache::PkgIterator canNotFindPkgName(pkgCacheFile &Cache, std::string const &str); - virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, + // the difference between canNotFind and canNotGet is that the later is more low-level + // and called from other places: In this case looking into the code is the only real answer… + virtual pkgCache::VerIterator canNotGetVersion(enum VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); + // same as above for showPackageSelection + APT_DEPRECATED virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); - virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, + APT_DEPRECATED virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); - virtual pkgCache::VerIterator canNotFindInstalledVer(pkgCacheFile &Cache, + APT_DEPRECATED virtual pkgCache::VerIterator canNotFindInstalledVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg); + virtual pkgCache::PkgIterator canNotFindPkgName(pkgCacheFile &Cache, std::string const &str); + bool showErrors() const { return ShowError; } bool showErrors(bool const newValue) { if (ShowError == newValue) return ShowError; else return ((ShowError = newValue) == false); } GlobalError::MsgType errorType() const { return ErrorType; } @@ -98,7 +192,19 @@ public: /*{{{*/ protected: bool ShowError; GlobalError::MsgType ErrorType; + + pkgCache::VerIterator canNotGetInstCandVer(pkgCacheFile &Cache, + pkgCache::PkgIterator const &Pkg); + pkgCache::VerIterator canNotGetCandInstVer(pkgCacheFile &Cache, + pkgCache::PkgIterator const &Pkg); + + bool PackageFromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + bool PackageFromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + bool PackageFromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + bool PackageFromPackageName(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern); + bool PackageFromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern); }; /*}}}*/ + class PackageContainerInterface { /*{{{*/ /** \class PackageContainerInterface @@ -119,14 +225,7 @@ public: inline std::string FullName(bool const Pretty) const { return getPkg().FullName(Pretty); } inline std::string FullName() const { return getPkg().FullName(); } APT_DEPRECATED inline const char *Section() const { -#if __GNUC__ >= 4 - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - return getPkg().Section(); -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif + APT_IGNORE_DEPRECATED(return getPkg().Section();) } inline bool Purge() const {return getPkg().Purge(); } inline const char *Arch() const {return getPkg().Arch(); } @@ -151,29 +250,46 @@ public: virtual bool empty() const = 0; virtual void clear() = 0; - enum Constructor { UNKNOWN, REGEX, TASK, FNMATCH }; - virtual void setConstructor(Constructor const &con) = 0; - virtual Constructor getConstructor() const = 0; - - static bool FromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper); - static bool FromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper); - static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper); - static bool FromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper); - static bool FromGroup(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper); - static bool FromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper); - static bool FromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper); - - struct Modifier { - enum Position { NONE, PREFIX, POSTFIX }; - unsigned short ID; - const char * const Alias; - Position Pos; - Modifier (unsigned short const &id, const char * const alias, Position const &pos) : ID(id), Alias(alias), Pos(pos) {} - }; - - static bool FromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci, - pkgCacheFile &Cache, const char * cmdline, - std::list<Modifier> const &mods, CacheSetHelper &helper); + // FIXME: This is a bloody hack removed soon. Use CacheSetHelper::PkgSelector ! + enum APT_DEPRECATED Constructor { UNKNOWN = CacheSetHelper::UNKNOWN, + REGEX = CacheSetHelper::REGEX, + TASK = CacheSetHelper::TASK, + FNMATCH = CacheSetHelper::FNMATCH }; +APT_IGNORE_DEPRECATED_PUSH + void setConstructor(Constructor const by) { ConstructedBy = (CacheSetHelper::PkgSelector)by; } +APT_IGNORE_DEPRECATED_POP + + void setConstructor(CacheSetHelper::PkgSelector const by) { ConstructedBy = by; } + CacheSetHelper::PkgSelector getConstructor() const { return ConstructedBy; } + PackageContainerInterface() : ConstructedBy(CacheSetHelper::UNKNOWN) {} + PackageContainerInterface(CacheSetHelper::PkgSelector const by) : ConstructedBy(by) {} + + APT_DEPRECATED static bool FromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { + return helper.PackageFrom(CacheSetHelper::TASK, pci, Cache, pattern); } + APT_DEPRECATED static bool FromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { + return helper.PackageFrom(CacheSetHelper::REGEX, pci, Cache, pattern); } + APT_DEPRECATED static bool FromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { + return helper.PackageFrom(CacheSetHelper::FNMATCH, pci, Cache, pattern); } + APT_DEPRECATED static bool FromGroup(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { + return helper.PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, pattern); } + APT_DEPRECATED static bool FromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { + return helper.PackageFrom(CacheSetHelper::STRING, pci, Cache, pattern); } + APT_DEPRECATED static bool FromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper) { + return helper.PackageFromCommandLine(pci, Cache, cmdline); } + + APT_DEPRECATED typedef CacheSetHelper::PkgModifier Modifier; + +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { + return helper.PackageFromName(Cache, pattern); } + APT_DEPRECATED static bool FromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci, + pkgCacheFile &Cache, const char * cmdline, + std::list<Modifier> const &mods, CacheSetHelper &helper) { + return helper.PackageFromModifierCommandLine(modID, pci, Cache, cmdline, mods); } +APT_IGNORE_DEPRECATED_POP + +private: + CacheSetHelper::PkgSelector ConstructedBy; }; /*}}}*/ template<class Container> class PackageContainer : public PackageContainerInterface {/*{{{*/ @@ -237,11 +353,23 @@ public: /*{{{*/ iterator end() { return iterator(_cont.end()); } const_iterator find(pkgCache::PkgIterator const &P) const { return const_iterator(_cont.find(P)); } - void setConstructor(Constructor const &by) { ConstructedBy = by; } - Constructor getConstructor() const { return ConstructedBy; } + PackageContainer() : PackageContainerInterface() {} + PackageContainer(CacheSetHelper::PkgSelector const &by) : PackageContainerInterface(by) {} +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED PackageContainer(Constructor const &by) : PackageContainerInterface((CacheSetHelper::PkgSelector)by) {} +APT_IGNORE_DEPRECATED_POP + + /** \brief sort all included versions with given comparer - PackageContainer() : ConstructedBy(UNKNOWN) {} - PackageContainer(Constructor const &by) : ConstructedBy(by) {} + Some containers are sorted by default, some are not and can't be, + but a few like std::vector can be sorted if need be, so this can be + specialized in later on. The default is that this will fail though. + Specifically, already sorted containers like std::set will return + false as well as there is no easy way to check that the given comparer + would sort in the same way the set is currently sorted + + \return \b true if the set was sorted, \b false if not. */ + template<class Compare> bool sort(Compare /*Comp*/) { return false; } /** \brief returns all packages in the cache who belong to the given task @@ -252,8 +380,8 @@ public: /*{{{*/ \param pattern name of the task \param helper responsible for error and message handling */ static PackageContainer FromTask(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { - PackageContainer cont(TASK); - PackageContainerInterface::FromTask(&cont, Cache, pattern, helper); + PackageContainer cont(CacheSetHelper::TASK); + helper.PackageFrom(CacheSetHelper::TASK, &cont, Cache, pattern); return cont; } static PackageContainer FromTask(pkgCacheFile &Cache, std::string const &pattern) { @@ -269,9 +397,9 @@ public: /*{{{*/ \param Cache the packages are in \param pattern regular expression for package names \param helper responsible for error and message handling */ - static PackageContainer FromRegEx(pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { - PackageContainer cont(REGEX); - PackageContainerInterface::FromRegEx(&cont, Cache, pattern, helper); + static PackageContainer FromRegEx(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { + PackageContainer cont(CacheSetHelper::REGEX); + helper.PackageFrom(CacheSetHelper::REGEX, &cont, Cache, pattern); return cont; } @@ -280,9 +408,9 @@ public: /*{{{*/ return FromRegEx(Cache, pattern, helper); } - static PackageContainer FromFnmatch(pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) { - PackageContainer cont(FNMATCH); - PackageContainerInterface::FromFnmatch(&cont, Cache, pattern, helper); + static PackageContainer FromFnmatch(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { + PackageContainer cont(CacheSetHelper::FNMATCH); + helper.PackageFrom(CacheSetHelper::FNMATCH, &cont, Cache, pattern); return cont; } static PackageContainer FromFnMatch(pkgCacheFile &Cache, std::string const &pattern) { @@ -290,18 +418,20 @@ public: /*{{{*/ return FromFnmatch(Cache, pattern, helper); } +APT_IGNORE_DEPRECATED_PUSH /** \brief returns a package specified by a string \param Cache the package is in \param pattern String the package name should be extracted from \param helper responsible for error and message handling */ - static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { - return PackageContainerInterface::FromName(Cache, pattern, helper); + APT_DEPRECATED static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { + return helper.PackageFromName(Cache, pattern); } - static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern) { + APT_DEPRECATED static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern) { CacheSetHelper helper; - return PackageContainerInterface::FromName(Cache, pattern, helper); + return FromName(Cache, pattern, helper); } +APT_IGNORE_DEPRECATED_POP /** \brief returns all packages specified by a string @@ -310,7 +440,7 @@ public: /*{{{*/ \param helper responsible for error and message handling */ static PackageContainer FromString(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) { PackageContainer cont; - PackageContainerInterface::FromString(&cont, Cache, pattern, helper); + helper.PackageFrom(CacheSetHelper::PACKAGENAME, &cont, Cache, pattern); return cont; } static PackageContainer FromString(pkgCacheFile &Cache, std::string const &pattern) { @@ -327,7 +457,7 @@ public: /*{{{*/ \param helper responsible for error and message handling */ static PackageContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper) { PackageContainer cont; - PackageContainerInterface::FromCommandLine(&cont, Cache, cmdline, helper); + helper.PackageFromCommandLine(&cont, Cache, cmdline); return cont; } static PackageContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline) { @@ -349,14 +479,14 @@ public: /*{{{*/ static std::map<unsigned short, PackageContainer> GroupedFromCommandLine( pkgCacheFile &Cache, const char **cmdline, - std::list<Modifier> const &mods, + std::list<CacheSetHelper::PkgModifier> const &mods, unsigned short const &fallback, CacheSetHelper &helper) { std::map<unsigned short, PackageContainer> pkgsets; for (const char **I = cmdline; *I != 0; ++I) { unsigned short modID = fallback; PackageContainer pkgset; - PackageContainerInterface::FromModifierCommandLine(modID, &pkgset, Cache, *I, mods, helper); + helper.PackageFromModifierCommandLine(modID, &pkgset, Cache, *I, mods); pkgsets[modID].insert(pkgset); } return pkgsets; @@ -364,22 +494,23 @@ public: /*{{{*/ static std::map<unsigned short, PackageContainer> GroupedFromCommandLine( pkgCacheFile &Cache, const char **cmdline, - std::list<Modifier> const &mods, + std::list<CacheSetHelper::PkgModifier> const &mods, unsigned short const &fallback) { CacheSetHelper helper; return GroupedFromCommandLine(Cache, cmdline, mods, fallback, helper); } /*}}}*/ -private: /*{{{*/ - Constructor ConstructedBy; - /*}}}*/ }; /*}}}*/ - +// specialisations for push_back containers: std::list & std::vector /*{{{*/ template<> template<class Cont> void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(PackageContainer<Cont> const &pkgcont) { for (typename PackageContainer<Cont>::const_iterator p = pkgcont.begin(); p != pkgcont.end(); ++p) _cont.push_back(*p); } +template<> template<class Cont> void PackageContainer<std::vector<pkgCache::PkgIterator> >::insert(PackageContainer<Cont> const &pkgcont) { + for (typename PackageContainer<Cont>::const_iterator p = pkgcont.begin(); p != pkgcont.end(); ++p) + _cont.push_back(*p); +} // these two are 'inline' as otherwise the linker has problems with seeing these untemplated // specializations again and again - but we need to see them, so that library users can use them template<> inline bool PackageContainer<std::list<pkgCache::PkgIterator> >::insert(pkgCache::PkgIterator const &P) { @@ -388,12 +519,65 @@ template<> inline bool PackageContainer<std::list<pkgCache::PkgIterator> >::inse _cont.push_back(P); return true; } +template<> inline bool PackageContainer<std::vector<pkgCache::PkgIterator> >::insert(pkgCache::PkgIterator const &P) { + if (P.end() == true) + return false; + _cont.push_back(P); + return true; +} template<> inline void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(const_iterator begin, const_iterator end) { for (const_iterator p = begin; p != end; ++p) _cont.push_back(*p); } +template<> inline void PackageContainer<std::vector<pkgCache::PkgIterator> >::insert(const_iterator begin, const_iterator end) { + for (const_iterator p = begin; p != end; ++p) + _cont.push_back(*p); +} + /*}}}*/ + +template<> template<class Compare> inline bool PackageContainer<std::vector<pkgCache::PkgIterator> >::sort(Compare Comp) { + std::sort(_cont.begin(), _cont.end(), Comp); + return true; +} + +// class PackageUniverse - pkgCache as PackageContainerInterface /*{{{*/ +/** \class PackageUniverse + + Wraps around our usual pkgCache, so that it can be stuffed into methods + expecting a PackageContainer. + + The wrapping is read-only in practice modeled by making erase and co + private methods. */ +class APT_HIDDEN PackageUniverse : public PackageContainerInterface { + pkgCache * const _cont; +public: + typedef pkgCache::PkgIterator iterator; + typedef pkgCache::PkgIterator const_iterator; + + APT_PUBLIC bool empty() const { return false; } + APT_PUBLIC size_t size() const { return _cont->Head().PackageCount; } + + APT_PUBLIC const_iterator begin() const { return _cont->PkgBegin(); } + APT_PUBLIC const_iterator end() const { return _cont->PkgEnd(); } + APT_PUBLIC iterator begin() { return _cont->PkgBegin(); } + APT_PUBLIC iterator end() { return _cont->PkgEnd(); } + + APT_PUBLIC PackageUniverse(pkgCache * const Owner) : _cont(Owner) { } + +private: + bool insert(pkgCache::PkgIterator const &) { return true; } + template<class Cont> void insert(PackageContainer<Cont> const &) { } + void insert(const_iterator, const_iterator) { } + + void clear() { } + iterator& erase(iterator &iter) { return iter; } + size_t erase(const pkgCache::PkgIterator) { return 0; } + void erase(iterator, iterator) { } +}; + /*}}}*/ typedef PackageContainer<std::set<pkgCache::PkgIterator> > PackageSet; typedef PackageContainer<std::list<pkgCache::PkgIterator> > PackageList; +typedef PackageContainer<std::vector<pkgCache::PkgIterator> > PackageVector; class VersionContainerInterface { /*{{{*/ /** \class APT::VersionContainerInterface @@ -435,45 +619,63 @@ public: virtual void clear() = 0; /** \brief specifies which version(s) will be returned if non is given */ - enum Version { - /** All versions */ - ALL, - /** Candidate and installed version */ - CANDANDINST, - /** Candidate version */ - CANDIDATE, - /** Installed version */ - INSTALLED, - /** Candidate or if non installed version */ - CANDINST, - /** Installed or if non candidate version */ - INSTCAND, - /** Newest version */ - NEWEST + enum APT_DEPRECATED Version { + ALL = CacheSetHelper::ALL, + CANDANDINST = CacheSetHelper::CANDANDINST, + CANDIDATE = CacheSetHelper::CANDIDATE, + INSTALLED = CacheSetHelper::INSTALLED, + CANDINST = CacheSetHelper::CANDINST, + INSTCAND = CacheSetHelper::INSTCAND, + NEWEST = CacheSetHelper::NEWEST }; struct Modifier { - enum Position { NONE, PREFIX, POSTFIX }; - unsigned short ID; + unsigned short const ID; const char * const Alias; - Position Pos; - Version SelectVersion; + enum Position { NONE, PREFIX, POSTFIX } const Pos; + enum CacheSetHelper::VerSelector const SelectVersion; Modifier (unsigned short const &id, const char * const alias, Position const &pos, - Version const &select) : ID(id), Alias(alias), Pos(pos), + enum CacheSetHelper::VerSelector const select) : ID(id), Alias(alias), Pos(pos), SelectVersion(select) {} +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED Modifier(unsigned short const &id, const char * const alias, Position const &pos, + Version const &select) : ID(id), Alias(alias), Pos(pos), + SelectVersion((CacheSetHelper::VerSelector)select) {} +APT_IGNORE_DEPRECATED_POP }; static bool FromCommandLine(VersionContainerInterface * const vci, pkgCacheFile &Cache, - const char **cmdline, Version const &fallback, + const char **cmdline, CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper); +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED static bool FromCommandLine(VersionContainerInterface * const vci, pkgCacheFile &Cache, + const char **cmdline, Version const &fallback, + CacheSetHelper &helper) { + return FromCommandLine(vci, Cache, cmdline, (CacheSetHelper::VerSelector)fallback, helper); + } +APT_IGNORE_DEPRECATED_POP static bool FromString(VersionContainerInterface * const vci, pkgCacheFile &Cache, - std::string pkg, Version const &fallback, CacheSetHelper &helper, + std::string pkg, CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper, bool const onlyFromName = false); +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED static bool FromString(VersionContainerInterface * const vci, pkgCacheFile &Cache, + std::string pkg, Version const &fallback, CacheSetHelper &helper, + bool const onlyFromName = false) { + return FromString(vci, Cache, pkg, (CacheSetHelper::VerSelector)fallback, helper, onlyFromName); + } +APT_IGNORE_DEPRECATED_POP static bool FromPackage(VersionContainerInterface * const vci, pkgCacheFile &Cache, - pkgCache::PkgIterator const &P, Version const &fallback, + pkgCache::PkgIterator const &P, CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper); +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED static bool FromPackage(VersionContainerInterface * const vci, pkgCacheFile &Cache, + pkgCache::PkgIterator const &P, Version const &fallback, + CacheSetHelper &helper) { + return FromPackage(vci, Cache, P, (CacheSetHelper::VerSelector)fallback, helper); + } +APT_IGNORE_DEPRECATED_POP static bool FromModifierCommandLine(unsigned short &modID, VersionContainerInterface * const vci, @@ -485,8 +687,17 @@ public: static bool FromDependency(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::DepIterator const &D, - Version const &selector, + CacheSetHelper::VerSelector const selector, CacheSetHelper &helper); +APT_IGNORE_DEPRECATED_PUSH + APT_DEPRECATED static bool FromDependency(VersionContainerInterface * const vci, + pkgCacheFile &Cache, + pkgCache::DepIterator const &D, + Version const &selector, + CacheSetHelper &helper) { + return FromDependency(vci, Cache, D, (CacheSetHelper::VerSelector)selector, helper); + } +APT_IGNORE_DEPRECATED_POP protected: /*{{{*/ @@ -568,6 +779,18 @@ public: /*{{{*/ iterator end() { return iterator(_cont.end()); } const_iterator find(pkgCache::VerIterator const &V) const { return const_iterator(_cont.find(V)); } + /** \brief sort all included versions with given comparer + + Some containers are sorted by default, some are not and can't be, + but a few like std::vector can be sorted if need be, so this can be + specialized in later on. The default is that this will fail though. + Specifically, already sorted containers like std::set will return + false as well as there is no easy way to check that the given comparer + would sort in the same way the set is currently sorted + + \return \b true if the set was sorted, \b false if not. */ + template<class Compare> bool sort(Compare /*Comp*/) { return false; } + /** \brief returns all versions specified on the commandline Get all versions from the commandline, uses given default version if @@ -577,35 +800,59 @@ public: /*{{{*/ \param fallback version specification \param helper responsible for error and message handling */ static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline, - Version const &fallback, CacheSetHelper &helper) { + CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper) { VersionContainer vercon; VersionContainerInterface::FromCommandLine(&vercon, Cache, cmdline, fallback, helper); return vercon; } static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline, - Version const &fallback) { + CacheSetHelper::VerSelector const fallback) { CacheSetHelper helper; return FromCommandLine(Cache, cmdline, fallback, helper); } static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline) { - return FromCommandLine(Cache, cmdline, CANDINST); + return FromCommandLine(Cache, cmdline, CacheSetHelper::CANDINST); } - static VersionContainer FromString(pkgCacheFile &Cache, std::string const &pkg, - Version const &fallback, CacheSetHelper &helper, - bool const onlyFromName = false) { + CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper, + bool const /*onlyFromName = false*/) { VersionContainer vercon; VersionContainerInterface::FromString(&vercon, Cache, pkg, fallback, helper); return vercon; } static VersionContainer FromString(pkgCacheFile &Cache, std::string pkg, - Version const &fallback) { + CacheSetHelper::VerSelector const fallback) { CacheSetHelper helper; return FromString(Cache, pkg, fallback, helper); } static VersionContainer FromString(pkgCacheFile &Cache, std::string pkg) { - return FromString(Cache, pkg, CANDINST); + return FromString(Cache, pkg, CacheSetHelper::CANDINST); + } +APT_IGNORE_DEPRECATED_PUSH + static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline, + Version const &fallback, CacheSetHelper &helper) { + VersionContainer vercon; + VersionContainerInterface::FromCommandLine(&vercon, Cache, cmdline, (CacheSetHelper::VerSelector)fallback, helper); + return vercon; + } + static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline, + Version const &fallback) { + CacheSetHelper helper; + return FromCommandLine(Cache, cmdline, (CacheSetHelper::VerSelector)fallback, helper); + } + static VersionContainer FromString(pkgCacheFile &Cache, std::string const &pkg, + Version const &fallback, CacheSetHelper &helper, + bool const /*onlyFromName = false*/) { + VersionContainer vercon; + VersionContainerInterface::FromString(&vercon, Cache, pkg, (CacheSetHelper::VerSelector)fallback, helper); + return vercon; + } + static VersionContainer FromString(pkgCacheFile &Cache, std::string pkg, + Version const &fallback) { + CacheSetHelper helper; + return FromString(Cache, pkg, (CacheSetHelper::VerSelector)fallback, helper); } +APT_IGNORE_DEPRECATED_POP /** \brief returns all versions specified for the package @@ -614,18 +861,31 @@ public: /*{{{*/ \param fallback the version(s) you want to get \param helper the helper used for display and error handling */ static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P, - Version const &fallback, CacheSetHelper &helper) { + CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper) { VersionContainer vercon; VersionContainerInterface::FromPackage(&vercon, Cache, P, fallback, helper); return vercon; } static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P, - Version const &fallback) { + CacheSetHelper::VerSelector const fallback) { CacheSetHelper helper; return FromPackage(Cache, P, fallback, helper); } +APT_IGNORE_DEPRECATED_PUSH + static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P, + Version const &fallback, CacheSetHelper &helper) { + VersionContainer vercon; + VersionContainerInterface::FromPackage(&vercon, Cache, P, (CacheSetHelper::VerSelector)fallback, helper); + return vercon; + } + static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P, + Version const &fallback) { + CacheSetHelper helper; + return FromPackage(Cache, P, (CacheSetHelper::VerSelector)fallback, helper); + } +APT_IGNORE_DEPRECATED_POP static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P) { - return FromPackage(Cache, P, CANDIDATE); + return FromPackage(Cache, P, CacheSetHelper::CANDIDATE); } static std::map<unsigned short, VersionContainer> GroupedFromCommandLine( @@ -654,26 +914,43 @@ public: /*{{{*/ } static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D, - Version const &selector, CacheSetHelper &helper) { + CacheSetHelper::VerSelector const selector, CacheSetHelper &helper) { VersionContainer vercon; VersionContainerInterface::FromDependency(&vercon, Cache, D, selector, helper); return vercon; } static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D, - Version const &selector) { + CacheSetHelper::VerSelector const selector) { CacheSetHelper helper; return FromPackage(Cache, D, selector, helper); } +APT_IGNORE_DEPRECATED_PUSH + static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D, + Version const &selector, CacheSetHelper &helper) { + VersionContainer vercon; + VersionContainerInterface::FromDependency(&vercon, Cache, D, (CacheSetHelper::VerSelector)selector, helper); + return vercon; + } + static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D, + Version const &selector) { + CacheSetHelper helper; + return FromPackage(Cache, D, (CacheSetHelper::VerSelector)selector, helper); + } +APT_IGNORE_DEPRECATED_POP static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D) { - return FromPackage(Cache, D, CANDIDATE); + return FromPackage(Cache, D, CacheSetHelper::CANDIDATE); } /*}}}*/ }; /*}}}*/ - +// specialisations for push_back containers: std::list & std::vector /*{{{*/ template<> template<class Cont> void VersionContainer<std::list<pkgCache::VerIterator> >::insert(VersionContainer<Cont> const &vercont) { for (typename VersionContainer<Cont>::const_iterator v = vercont.begin(); v != vercont.end(); ++v) _cont.push_back(*v); } +template<> template<class Cont> void VersionContainer<std::vector<pkgCache::VerIterator> >::insert(VersionContainer<Cont> const &vercont) { + for (typename VersionContainer<Cont>::const_iterator v = vercont.begin(); v != vercont.end(); ++v) + _cont.push_back(*v); +} // these two are 'inline' as otherwise the linker has problems with seeing these untemplated // specializations again and again - but we need to see them, so that library users can use them template<> inline bool VersionContainer<std::list<pkgCache::VerIterator> >::insert(pkgCache::VerIterator const &V) { @@ -682,11 +959,29 @@ template<> inline bool VersionContainer<std::list<pkgCache::VerIterator> >::inse _cont.push_back(V); return true; } +template<> inline bool VersionContainer<std::vector<pkgCache::VerIterator> >::insert(pkgCache::VerIterator const &V) { + if (V.end() == true) + return false; + _cont.push_back(V); + return true; +} template<> inline void VersionContainer<std::list<pkgCache::VerIterator> >::insert(const_iterator begin, const_iterator end) { for (const_iterator v = begin; v != end; ++v) _cont.push_back(*v); } +template<> inline void VersionContainer<std::vector<pkgCache::VerIterator> >::insert(const_iterator begin, const_iterator end) { + for (const_iterator v = begin; v != end; ++v) + _cont.push_back(*v); +} + /*}}}*/ + +template<> template<class Compare> inline bool VersionContainer<std::vector<pkgCache::VerIterator> >::sort(Compare Comp) { + std::sort(_cont.begin(), _cont.end(), Comp); + return true; +} + typedef VersionContainer<std::set<pkgCache::VerIterator> > VersionSet; typedef VersionContainer<std::list<pkgCache::VerIterator> > VersionList; +typedef VersionContainer<std::vector<pkgCache::VerIterator> > VersionVector; } #endif diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc index a5ad6a9ff..aaa7b82e0 100644 --- a/apt-pkg/cdrom.cc +++ b/apt-pkg/cdrom.cc @@ -822,8 +822,11 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/ // check for existence and possibly create state directory for copying string const listDir = _config->FindDir("Dir::State::lists"); string const partialListDir = listDir + "partial/"; - if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false && - CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false) + mode_t const mode = umask(S_IWGRP | S_IWOTH); + bool const creation_fail = (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false && + CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false); + umask(mode); + if (creation_fail == true) { UnmountCDROM(CDROM, NULL); return _error->Errno("cdrom", _("List directory %spartial is missing."), listDir.c_str()); @@ -913,10 +916,14 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/ return true; } /*}}}*/ -pkgUdevCdromDevices::pkgUdevCdromDevices() /*{{{*/ - : libudev_handle(NULL) +pkgUdevCdromDevices::pkgUdevCdromDevices() /*{{{*/ +: libudev_handle(NULL), udev_new(NULL), udev_enumerate_add_match_property(NULL), + udev_enumerate_scan_devices(NULL), udev_enumerate_get_list_entry(NULL), + udev_device_new_from_syspath(NULL), udev_enumerate_get_udev(NULL), + udev_list_entry_get_name(NULL), udev_device_get_devnode(NULL), + udev_enumerate_new(NULL), udev_list_entry_get_next(NULL), + udev_device_get_property_value(NULL), udev_enumerate_add_match_sysattr(NULL) { - } /*}}}*/ diff --git a/apt-pkg/clean.cc b/apt-pkg/clean.cc index 37128e9aa..6edce5b6d 100644 --- a/apt-pkg/clean.cc +++ b/apt-pkg/clean.cc @@ -131,3 +131,5 @@ bool pkgArchiveCleaner::Go(std::string Dir,pkgCache &Cache) return true; } /*}}}*/ + +APT_CONST pkgArchiveCleaner::~pkgArchiveCleaner() {} diff --git a/apt-pkg/clean.h b/apt-pkg/clean.h index 930d54a7f..466cb67a9 100644 --- a/apt-pkg/clean.h +++ b/apt-pkg/clean.h @@ -24,13 +24,13 @@ class pkgArchiveCleaner void *d; protected: - + virtual void Erase(const char * /*File*/,std::string /*Pkg*/,std::string /*Ver*/,struct stat & /*St*/) {}; - public: - + public: + bool Go(std::string Dir,pkgCache &Cache); - virtual ~pkgArchiveCleaner() {}; + virtual ~pkgArchiveCleaner(); }; #endif diff --git a/apt-pkg/contrib/cmndline.cc b/apt-pkg/contrib/cmndline.cc index 93c1f4664..ff8b09ebc 100644 --- a/apt-pkg/contrib/cmndline.cc +++ b/apt-pkg/contrib/cmndline.cc @@ -34,6 +34,9 @@ CommandLine::CommandLine(Args *AList,Configuration *Conf) : ArgList(AList), Conf(Conf), FileList(0) { } +CommandLine::CommandLine() : ArgList(NULL), Conf(NULL), FileList(0) +{ +} /*}}}*/ // CommandLine::~CommandLine - Destructor /*{{{*/ // --------------------------------------------------------------------- diff --git a/apt-pkg/contrib/cmndline.h b/apt-pkg/contrib/cmndline.h index 143df58b2..58cbaa8c3 100644 --- a/apt-pkg/contrib/cmndline.h +++ b/apt-pkg/contrib/cmndline.h @@ -91,6 +91,7 @@ class CommandLine static CommandLine::Args MakeArgs(char ShortOpt, char const *LongOpt, char const *ConfName, unsigned long Flags) APT_CONST; + CommandLine(); CommandLine(Args *AList,Configuration *Conf); ~CommandLine(); }; diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 00f6ad0f9..483d5bb1b 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -253,8 +253,11 @@ string Configuration::FindDir(const char *Name,const char *Default) const // Configuration::FindVector - Find a vector of values /*{{{*/ // --------------------------------------------------------------------- /* Returns a vector of config values under the given item */ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13) -vector<string> Configuration::FindVector(const char *Name) const { return FindVector(Name, ""); } +#if APT_PKG_ABI < 413 +vector<string> Configuration::FindVector(const char *Name) const +{ + return FindVector(Name, ""); +} #endif vector<string> Configuration::FindVector(const char *Name, std::string const &Default) const { diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h index c256139f4..8d7d51037 100644 --- a/apt-pkg/contrib/configuration.h +++ b/apt-pkg/contrib/configuration.h @@ -34,6 +34,8 @@ #include <vector> #include <iostream> +#include <apt-pkg/macros.h> + #ifndef APT_8_CLEANER_HEADERS using std::string; #endif @@ -59,7 +61,7 @@ class Configuration Item *Root; bool ToFree; - + Item *Lookup(Item *Head,const char *S,unsigned long const &Len,bool const &Create); Item *Lookup(const char *Name,const bool &Create); inline const Item *Lookup(const char *Name) const @@ -82,14 +84,16 @@ class Configuration * * \param Name of the parent node * \param Default list of values separated by commas */ +#if APT_PKG_ABI >= 413 + std::vector<std::string> FindVector(const char *Name, std::string const &Default = "") const; + std::vector<std::string> FindVector(std::string const &Name, std::string const &Default = "") const { return FindVector(Name.c_str(), Default); }; +#else std::vector<std::string> FindVector(const char *Name, std::string const &Default) const; std::vector<std::string> FindVector(std::string const &Name, std::string const &Default) const { return FindVector(Name.c_str(), Default); }; -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - std::vector<std::string> FindVector(const char *Name) const { return FindVector(Name, ""); }; -#else std::vector<std::string> FindVector(const char *Name) const; -#endif std::vector<std::string> FindVector(std::string const &Name) const { return FindVector(Name.c_str(), ""); }; +#endif + int FindI(const char *Name,int const &Default = 0) const; int FindI(std::string const &Name,int const &Default = 0) const {return FindI(Name.c_str(),Default);}; bool FindB(const char *Name,bool const &Default = false) const; @@ -129,7 +133,7 @@ class Configuration class MatchAgainstConfig { std::vector<regex_t *> patterns; - void clearPatterns(); + APT_HIDDEN void clearPatterns(); public: MatchAgainstConfig(char const * Config); diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 1ba4674e5..47033eadf 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -47,6 +47,8 @@ #include <signal.h> #include <errno.h> #include <glob.h> +#include <pwd.h> +#include <grp.h> #include <set> #include <algorithm> @@ -63,6 +65,10 @@ #include <endian.h> #include <stdint.h> +#if __gnu_linux__ +#include <sys/prctl.h> +#endif + #include <apti18n.h> /*}}}*/ @@ -656,6 +662,22 @@ string flCombine(string Dir,string File) return Dir + '/' + File; } /*}}}*/ +// flAbsPath - Return the absolute path of the filename /*{{{*/ +// --------------------------------------------------------------------- +/* */ +string flAbsPath(string File) +{ + char *p = realpath(File.c_str(), NULL); + if (p == NULL) + { + _error->Errno("realpath", "flAbsPath failed"); + return ""; + } + std::string AbsPath(p); + free(p); + return AbsPath; +} + /*}}}*/ // SetCloseExec - Set the close on exec flag /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -835,6 +857,23 @@ bool ExecWait(pid_t Pid,const char *Name,bool Reap) return true; } /*}}}*/ +// StartsWithGPGClearTextSignature - Check if a file is Pgp/GPG clearsigned /*{{{*/ +bool StartsWithGPGClearTextSignature(string const &FileName) +{ + static const char* SIGMSG = "-----BEGIN PGP SIGNED MESSAGE-----\n"; + char buffer[strlen(SIGMSG)+1]; + FILE* gpg = fopen(FileName.c_str(), "r"); + if (gpg == NULL) + return false; + + char const * const test = fgets(buffer, sizeof(buffer), gpg); + fclose(gpg); + if (test == NULL || strcmp(buffer, SIGMSG) != 0) + return false; + + return true; +} + /*}}}*/ class FileFdPrivate { /*{{{*/ public: @@ -853,7 +892,7 @@ class FileFdPrivate { /*{{{*/ bool eof; bool compressing; - LZMAFILE() : file(NULL), eof(false), compressing(false) {} + LZMAFILE() : file(NULL), eof(false), compressing(false) { buffer[0] = '\0'; } ~LZMAFILE() { if (compressing == true) { @@ -1482,7 +1521,7 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual) int err; char const * const errmsg = BZ2_bzerror(d->bz2, &err); if (err != BZ_IO_ERROR) - return FileFdError("BZ2_bzread: %s (%d: %s)", _("Read error"), err, errmsg); + return FileFdError("BZ2_bzread: %s %s (%d: %s)", FileName.c_str(), _("Read error"), err, errmsg); } #endif #ifdef HAVE_LZMA @@ -1913,7 +1952,6 @@ bool FileFd::Close() { if ((Flags & Compressed) != Compressed && iFd > 0 && close(iFd) != 0) Res &= _error->Errno("close",_("Problem closing the file %s"), FileName.c_str()); - if (d != NULL) { Res &= d->CloseDown(FileName); @@ -1993,10 +2031,7 @@ APT_DEPRECATED gzFile FileFd::gzFd() { #endif } - -// Glob - wrapper around "glob()" /*{{{*/ -// --------------------------------------------------------------------- -/* */ +// Glob - wrapper around "glob()" /*{{{*/ std::vector<std::string> Glob(std::string const &pattern, int flags) { std::vector<std::string> result; @@ -2022,8 +2057,7 @@ std::vector<std::string> Glob(std::string const &pattern, int flags) return result; } /*}}}*/ - -std::string GetTempDir() +std::string GetTempDir() /*{{{*/ { const char *tmpdir = getenv("TMPDIR"); @@ -2032,21 +2066,202 @@ std::string GetTempDir() tmpdir = P_tmpdir; #endif - // check that tmpdir is set and exists struct stat st; - if (!tmpdir || strlen(tmpdir) == 0 || stat(tmpdir, &st) != 0) + if (!tmpdir || strlen(tmpdir) == 0 || // tmpdir is set + stat(tmpdir, &st) != 0 || (st.st_mode & S_IFDIR) == 0 || // exists and is directory + access(tmpdir, R_OK | W_OK | X_OK) != 0 // current user has rwx access to directory + ) tmpdir = "/tmp"; return string(tmpdir); } + /*}}}*/ +FileFd* GetTempFile(std::string const &Prefix, bool ImmediateUnlink) /*{{{*/ +{ + char fn[512]; + FileFd *Fd = new FileFd(); + + std::string tempdir = GetTempDir(); + snprintf(fn, sizeof(fn), "%s/%s.XXXXXX", + tempdir.c_str(), Prefix.c_str()); + int fd = mkstemp(fn); + if(ImmediateUnlink) + unlink(fn); + if (fd < 0) + { + _error->Errno("GetTempFile",_("Unable to mkstemp %s"), fn); + return NULL; + } + if (!Fd->OpenDescriptor(fd, FileFd::WriteOnly, FileFd::None, true)) + { + _error->Errno("GetTempFile",_("Unable to write to %s"),fn); + return NULL; + } -bool Rename(std::string From, std::string To) + return Fd; +} + /*}}}*/ +bool Rename(std::string From, std::string To) /*{{{*/ { if (rename(From.c_str(),To.c_str()) != 0) { _error->Error(_("rename failed, %s (%s -> %s)."),strerror(errno), From.c_str(),To.c_str()); return false; - } + } return true; } + /*}}}*/ +bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode)/*{{{*/ +{ + int fd; + if (Mode != FileFd::ReadOnly && Mode != FileFd::WriteOnly) + return _error->Error("Popen supports ReadOnly (x)or WriteOnly mode only"); + + int Pipe[2] = {-1, -1}; + if(pipe(Pipe) != 0) + return _error->Errno("pipe", _("Failed to create subprocess IPC")); + + std::set<int> keep_fds; + keep_fds.insert(Pipe[0]); + keep_fds.insert(Pipe[1]); + Child = ExecFork(keep_fds); + if(Child < 0) + return _error->Errno("fork", "Failed to fork"); + if(Child == 0) + { + if(Mode == FileFd::ReadOnly) + { + close(Pipe[0]); + fd = Pipe[1]; + } + else if(Mode == FileFd::WriteOnly) + { + close(Pipe[1]); + fd = Pipe[0]; + } + + if(Mode == FileFd::ReadOnly) + { + dup2(fd, 1); + dup2(fd, 2); + } else if(Mode == FileFd::WriteOnly) + dup2(fd, 0); + + execv(Args[0], (char**)Args); + _exit(100); + } + if(Mode == FileFd::ReadOnly) + { + close(Pipe[1]); + fd = Pipe[0]; + } else if(Mode == FileFd::WriteOnly) + { + close(Pipe[0]); + fd = Pipe[1]; + } + Fd.OpenDescriptor(fd, Mode, FileFd::None, true); + + return true; +} + /*}}}*/ +bool DropPrivileges() /*{{{*/ +{ + if(_config->FindB("Debug::NoDropPrivs", false) == true) + return true; + +#if __gnu_linux__ +#if defined(PR_SET_NO_NEW_PRIVS) && ( PR_SET_NO_NEW_PRIVS != 38 ) +#error "PR_SET_NO_NEW_PRIVS is defined, but with a different value than expected!" +#endif + // see prctl(2), needs linux3.5 at runtime - magic constant to avoid it at buildtime + int ret = prctl(38, 1, 0, 0, 0); + // ignore EINVAL - kernel is too old to understand the option + if(ret < 0 && errno != EINVAL) + _error->Warning("PR_SET_NO_NEW_PRIVS failed with %i", ret); +#endif + + // empty setting disables privilege dropping - this also ensures + // backward compatibility, see bug #764506 + const std::string toUser = _config->Find("APT::Sandbox::User"); + if (toUser.empty()) + return true; + + // uid will be 0 in the end, but gid might be different anyway + uid_t const old_uid = getuid(); + gid_t const old_gid = getgid(); + + if (old_uid != 0) + return true; + + struct passwd *pw = getpwnam(toUser.c_str()); + if (pw == NULL) + return _error->Error("No user %s, can not drop rights", toUser.c_str()); + + // Do not change the order here, it might break things + if (setgroups(1, &pw->pw_gid)) + return _error->Errno("setgroups", "Failed to setgroups"); + + if (setegid(pw->pw_gid) != 0) + return _error->Errno("setegid", "Failed to setegid"); + + if (setgid(pw->pw_gid) != 0) + return _error->Errno("setgid", "Failed to setgid"); + + if (setuid(pw->pw_uid) != 0) + return _error->Errno("setuid", "Failed to setuid"); + + // the seteuid() is probably uneeded (at least thats what the linux + // man-page says about setuid(2)) but we cargo culted it anyway + if (seteuid(pw->pw_uid) != 0) + return _error->Errno("seteuid", "Failed to seteuid"); + + // Verify that the user has only a single group, and the correct one + gid_t groups[1]; + if (getgroups(1, groups) != 1) + return _error->Errno("getgroups", "Could not get new groups"); + if (groups[0] != pw->pw_gid) + return _error->Error("Could not switch group"); + + // Verify that gid, egid, uid, and euid changed + if (getgid() != pw->pw_gid) + return _error->Error("Could not switch group"); + if (getegid() != pw->pw_gid) + return _error->Error("Could not switch effective group"); + if (getuid() != pw->pw_uid) + return _error->Error("Could not switch user"); + if (geteuid() != pw->pw_uid) + return _error->Error("Could not switch effective user"); + +#ifdef HAVE_GETRESUID + // verify that the saved set-user-id was changed as well + uid_t ruid = 0; + uid_t euid = 0; + uid_t suid = 0; + if (getresuid(&ruid, &euid, &suid)) + return _error->Errno("getresuid", "Could not get saved set-user-ID"); + if (suid != pw->pw_uid) + return _error->Error("Could not switch saved set-user-ID"); +#endif + +#ifdef HAVE_GETRESGID + // verify that the saved set-group-id was changed as well + gid_t rgid = 0; + gid_t egid = 0; + gid_t sgid = 0; + if (getresgid(&rgid, &egid, &sgid)) + return _error->Errno("getresuid", "Could not get saved set-group-ID"); + if (sgid != pw->pw_gid) + return _error->Error("Could not switch saved set-group-ID"); +#endif + + // Check that uid and gid changes do not work anymore + if (pw->pw_gid != old_gid && (setgid(old_gid) != -1 || setegid(old_gid) != -1)) + return _error->Error("Could restore a gid to root, privilege dropping did not work"); + + if (pw->pw_uid != old_uid && (setuid(old_uid) != -1 || seteuid(old_uid) != -1)) + return _error->Error("Could restore a uid to root, privilege dropping did not work"); + + return true; +} + /*}}}*/ diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 667057067..a64d6cb98 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -170,6 +170,8 @@ time_t GetModificationTime(std::string const &Path); bool Rename(std::string From, std::string To); std::string GetTempDir(); +FileFd* GetTempFile(std::string const &Prefix = "", + bool ImmediateUnlink = true); /** \brief Ensure the existence of the given Path * @@ -193,6 +195,23 @@ pid_t ExecFork(std::set<int> keep_fds); void MergeKeepFdsFromConfiguration(std::set<int> &keep_fds); bool ExecWait(pid_t Pid,const char *Name,bool Reap = false); + +// check if the given file starts with a PGP cleartext signature +bool StartsWithGPGClearTextSignature(std::string const &FileName); + +/** + * \brief Drop privileges + * + * Drop the privileges to the user _apt (or the one specified in + * APT::Sandbox::User). This does not set the supplementary group + * ids up correctly, it only uses the default group. Also prevent + * the process from gaining any new privileges afterwards, at least + * on Linux. + * + * \return true on success, false on failure with _error set + */ +bool DropPrivileges(); + // File string manipulators std::string flNotDir(std::string File); std::string flNotFile(std::string File); @@ -200,7 +219,23 @@ std::string flNoLink(std::string File); std::string flExtension(std::string File); std::string flCombine(std::string Dir,std::string File); +/** \brief Takes a file path and returns the absolute path + */ +std::string flAbsPath(std::string File); + // simple c++ glob std::vector<std::string> Glob(std::string const &pattern, int flags=0); +/** \brief Popen() implementation that execv() instead of using a shell + * + * \param Args the execv style command to run + * \param FileFd is a referenz to the FileFd to use for input or output + * \param Child a reference to the integer that stores the child pid + * Note that you must call ExecWait() or similar to cleanup + * \param Mode is either FileFd::ReadOnly or FileFd::WriteOnly + * \return true on success, false on failure with _error set + */ +bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode); + + #endif diff --git a/apt-pkg/contrib/gpgv.cc b/apt-pkg/contrib/gpgv.cc index f24dd9640..9d798cca9 100644 --- a/apt-pkg/contrib/gpgv.cc +++ b/apt-pkg/contrib/gpgv.cc @@ -32,50 +32,30 @@ static char * GenerateTemporaryFileTemplate(const char *basename) /*{{{*/ /*}}}*/ // ExecGPGV - returns the command needed for verify /*{{{*/ // --------------------------------------------------------------------- -/* Generating the commandline for calling gpgv is somehow complicated as +/* Generating the commandline for calling gpg is somehow complicated as we need to add multiple keyrings and user supplied options. - Also, as gpgv has no options to enforce a certain reduced style of + Also, as gpg has no options to enforce a certain reduced style of clear-signed files (=the complete content of the file is signed and the content isn't encoded) we do a divide and conquer approach here - and split up the clear-signed file in message and signature for gpgv + and split up the clear-signed file in message and signature for gpg. + And as a cherry on the cake, we use our apt-key wrapper to do part + of the lifting in regards to merging keyrings. Fun for the whole family. */ void ExecGPGV(std::string const &File, std::string const &FileGPG, int const &statusfd, int fd[2]) { #define EINTERNAL 111 - std::string const gpgvpath = _config->Find("Dir::Bin::gpg", "/usr/bin/gpgv"); - // FIXME: remove support for deprecated APT::GPGV setting - std::string const trustedFile = _config->Find("APT::GPGV::TrustedKeyring", _config->FindFile("Dir::Etc::Trusted")); - std::string const trustedPath = _config->FindDir("Dir::Etc::TrustedParts"); + std::string const aptkey = _config->FindFile("Dir::Bin::apt-key", "/usr/bin/apt-key"); bool const Debug = _config->FindB("Debug::Acquire::gpgv", false); - if (Debug == true) - { - std::clog << "gpgv path: " << gpgvpath << std::endl; - std::clog << "Keyring file: " << trustedFile << std::endl; - std::clog << "Keyring path: " << trustedPath << std::endl; - } - - std::vector<std::string> keyrings; - if (DirectoryExists(trustedPath)) - keyrings = GetListOfFilesInDir(trustedPath, "gpg", false, true); - if (RealFileExists(trustedFile) == true) - keyrings.push_back(trustedFile); - std::vector<const char *> Args; - Args.reserve(30); - - if (keyrings.empty() == true) - { - // TRANSLATOR: %s is the trusted keyring parts directory - ioprintf(std::cerr, _("No keyring installed in %s."), - _config->FindDir("Dir::Etc::TrustedParts").c_str()); - exit(EINTERNAL); - } + Args.reserve(10); - Args.push_back(gpgvpath.c_str()); - Args.push_back("--ignore-time-conflict"); + Args.push_back(aptkey.c_str()); + Args.push_back("--quiet"); + Args.push_back("--readonly"); + Args.push_back("verify"); char statusfdstr[10]; if (statusfd != -1) @@ -85,13 +65,6 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, Args.push_back(statusfdstr); } - for (std::vector<std::string>::const_iterator K = keyrings.begin(); - K != keyrings.end(); ++K) - { - Args.push_back("--keyring"); - Args.push_back(K->c_str()); - } - Configuration::Item const *Opts; Opts = _config->Tree("Acquire::gpgv::Options"); if (Opts != 0) @@ -160,7 +133,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, if (Debug == true) { - std::clog << "Preparing to exec: " << gpgvpath; + std::clog << "Preparing to exec: "; for (std::vector<const char *>::const_iterator a = Args.begin(); *a != NULL; ++a) std::clog << " " << *a; std::clog << std::endl; @@ -168,7 +141,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, if (statusfd != -1) { - int const nullfd = open("/dev/null", O_RDONLY); + int const nullfd = open("/dev/null", O_WRONLY); close(fd[0]); // Redirect output to /dev/null; we read from the status fd if (statusfd != STDOUT_FILENO) @@ -185,7 +158,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, if (releaseSignature == DETACHED) { - execvp(gpgvpath.c_str(), (char **) &Args[0]); + execvp(Args[0], (char **) &Args[0]); ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str()); exit(EINTERNAL); } @@ -205,7 +178,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, { if (statusfd != -1) dup2(fd[1], statusfd); - execvp(gpgvpath.c_str(), (char **) &Args[0]); + execvp(Args[0], (char **) &Args[0]); ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str()); UNLINK_EXIT(EINTERNAL); } @@ -216,7 +189,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, { if (errno == EINTR) continue; - ioprintf(std::cerr, _("Waited for %s but it wasn't there"), "gpgv"); + ioprintf(std::cerr, _("Waited for %s but it wasn't there"), "apt-key"); UNLINK_EXIT(EINTERNAL); } #undef UNLINK_EXIT @@ -229,14 +202,14 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG, // check if it exit'ed normally … if (WIFEXITED(Status) == false) { - ioprintf(std::cerr, _("Sub-process %s exited unexpectedly"), "gpgv"); + ioprintf(std::cerr, _("Sub-process %s exited unexpectedly"), "apt-key"); exit(EINTERNAL); } // … and with a good exit code if (WEXITSTATUS(Status) != 0) { - ioprintf(std::cerr, _("Sub-process %s returned an error code (%u)"), "gpgv", WEXITSTATUS(Status)); + ioprintf(std::cerr, _("Sub-process %s returned an error code (%u)"), "apt-key", WEXITSTATUS(Status)); exit(WEXITSTATUS(Status)); } diff --git a/apt-pkg/contrib/hashes.cc b/apt-pkg/contrib/hashes.cc index bb11a3fca..6e7080bc9 100644 --- a/apt-pkg/contrib/hashes.cc +++ b/apt-pkg/contrib/hashes.cc @@ -29,7 +29,7 @@ const char * HashString::_SupportedHashes[] = { - "SHA512", "SHA256", "SHA1", "MD5Sum", NULL + "SHA512", "SHA256", "SHA1", "MD5Sum", "Checksum-FileSize", NULL }; HashString::HashString() @@ -111,6 +111,8 @@ std::string HashString::GetHashForFile(std::string filename) const /*{{{*/ SHA512.AddFD(Fd); fileHash = (std::string)SHA512.Result(); } + else if (strcasecmp(Type.c_str(), "Checksum-FileSize") == 0) + strprintf(fileHash, "%llu", Fd.FileSize()); Fd.Close(); return fileHash; @@ -141,11 +143,27 @@ APT_PURE bool HashString::operator!=(HashString const &other) const } /*}}}*/ +bool HashStringList::usable() const /*{{{*/ +{ + if (empty() == true) + return false; + std::string const forcedType = _config->Find("Acquire::ForceHash", ""); + if (forcedType.empty() == true) + { + // FileSize alone isn't usable + for (std::vector<HashString>::const_iterator hs = list.begin(); hs != list.end(); ++hs) + if (hs->HashType() != "Checksum-FileSize") + return true; + return false; + } + return find(forcedType) != NULL; +} + /*}}}*/ HashString const * HashStringList::find(char const * const type) const /*{{{*/ { if (type == NULL || type[0] == '\0') { - std::string forcedType = _config->Find("Acquire::ForceHash", ""); + std::string const forcedType = _config->Find("Acquire::ForceHash", ""); if (forcedType.empty() == false) return find(forcedType.c_str()); for (char const * const * t = HashString::SupportedHashes(); *t != NULL; ++t) @@ -191,11 +209,23 @@ bool HashStringList::VerifyFile(std::string filename) const /*{{{*/ HashString const * const hs = find(NULL); if (hs == NULL || hs->VerifyFile(filename) == false) return false; + HashString const * const hsf = find("Checksum-FileSize"); + if (hsf != NULL && hsf->VerifyFile(filename) == false) + return false; return true; } /*}}}*/ bool HashStringList::operator==(HashStringList const &other) const /*{{{*/ { + std::string const forcedType = _config->Find("Acquire::ForceHash", ""); + if (forcedType.empty() == false) + { + HashString const * const hs = find(forcedType); + HashString const * const ohs = other.find(forcedType); + if (hs == NULL || ohs == NULL) + return false; + return *hs == *ohs; + } short matches = 0; for (const_iterator hs = begin(); hs != end(); ++hs) { @@ -216,11 +246,32 @@ bool HashStringList::operator!=(HashStringList const &other) const } /*}}}*/ -// Hashes::AddFD - Add the contents of the FD /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool Hashes::AddFD(int const Fd,unsigned long long Size, bool const addMD5, - bool const addSHA1, bool const addSHA256, bool const addSHA512) +// PrivateHashes /*{{{*/ +class PrivateHashes { +public: + unsigned long long FileSize; + + PrivateHashes() : FileSize(0) {} +}; + /*}}}*/ +// Hashes::Add* - Add the contents of data or FD /*{{{*/ +bool Hashes::Add(const unsigned char * const Data,unsigned long long const Size, unsigned int const Hashes) +{ + bool Res = true; +APT_IGNORE_DEPRECATED_PUSH + if ((Hashes & MD5SUM) == MD5SUM) + Res &= MD5.Add(Data, Size); + if ((Hashes & SHA1SUM) == SHA1SUM) + Res &= SHA1.Add(Data, Size); + if ((Hashes & SHA256SUM) == SHA256SUM) + Res &= SHA256.Add(Data, Size); + if ((Hashes & SHA512SUM) == SHA512SUM) + Res &= SHA512.Add(Data, Size); +APT_IGNORE_DEPRECATED_POP + d->FileSize += Size; + return Res; +} +bool Hashes::AddFD(int const Fd,unsigned long long Size, unsigned int const Hashes) { unsigned char Buf[64*64]; bool const ToEOF = (Size == UntilEOF); @@ -234,19 +285,12 @@ bool Hashes::AddFD(int const Fd,unsigned long long Size, bool const addMD5, if (ToEOF && Res == 0) // EOF break; Size -= Res; - if (addMD5 == true) - MD5.Add(Buf,Res); - if (addSHA1 == true) - SHA1.Add(Buf,Res); - if (addSHA256 == true) - SHA256.Add(Buf,Res); - if (addSHA512 == true) - SHA512.Add(Buf,Res); + if (Add(Buf, Res, Hashes) == false) + return false; } return true; } -bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, bool const addMD5, - bool const addSHA1, bool const addSHA256, bool const addSHA512) +bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, unsigned int const Hashes) { unsigned char Buf[64*64]; bool const ToEOF = (Size == 0); @@ -265,15 +309,27 @@ bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, bool const addMD5, else if (a == 0) // EOF break; Size -= a; - if (addMD5 == true) - MD5.Add(Buf, a); - if (addSHA1 == true) - SHA1.Add(Buf, a); - if (addSHA256 == true) - SHA256.Add(Buf, a); - if (addSHA512 == true) - SHA512.Add(Buf, a); + if (Add(Buf, a, Hashes) == false) + return false; } return true; } /*}}}*/ +HashStringList Hashes::GetHashStringList() +{ + HashStringList hashes; +APT_IGNORE_DEPRECATED_PUSH + hashes.push_back(HashString("MD5Sum", MD5.Result().Value())); + hashes.push_back(HashString("SHA1", SHA1.Result().Value())); + hashes.push_back(HashString("SHA256", SHA256.Result().Value())); + hashes.push_back(HashString("SHA512", SHA512.Result().Value())); +APT_IGNORE_DEPRECATED_POP + std::string SizeStr; + strprintf(SizeStr, "%llu", d->FileSize); + hashes.push_back(HashString("Checksum-FileSize", SizeStr)); + return hashes; +} +APT_IGNORE_DEPRECATED_PUSH +Hashes::Hashes() { d = new PrivateHashes(); } +Hashes::~Hashes() { delete d; } +APT_IGNORE_DEPRECATED_POP diff --git a/apt-pkg/contrib/hashes.h b/apt-pkg/contrib/hashes.h index 5a4213868..154862457 100644 --- a/apt-pkg/contrib/hashes.h +++ b/apt-pkg/contrib/hashes.h @@ -53,9 +53,10 @@ class HashString HashString(); // get hash type used - std::string HashType() { return Type; }; std::string HashType() const { return Type; }; std::string HashValue() const { return Hash; }; + APT_DEPRECATED std::string HashType() { return Type; }; + APT_DEPRECATED std::string HashValue() { return Hash; }; // verify the given filename against the currently loaded hash bool VerifyFile(std::string filename) const; @@ -115,6 +116,15 @@ class HashStringList */ bool empty() const { return list.empty(); } + /** has the list at least one good entry + * + * similar to #empty, but handles forced hashes. + * + * @return if no hash is forced, same result as #empty, + * if one is forced \b true if this has is available, \b false otherwise + */ + bool usable() const; + typedef std::vector<HashString>::const_iterator const_iterator; /** iterator to the first element */ @@ -129,8 +139,10 @@ class HashStringList /** compare two HashStringList for similarity. * * Two lists are similar if at least one hashtype is in both lists - * and the hashsum matches. All hashes are checked, if one doesn't - * match false is returned regardless of how many matched before. + * and the hashsum matches. All hashes are checked by default, + * if one doesn't match false is returned regardless of how many + * matched before. If a hash is forced, only this hash is compared, + * all others are ignored. */ bool operator==(HashStringList const &other) const; bool operator!=(HashStringList const &other) const; @@ -151,32 +163,60 @@ class HashStringList std::vector<HashString> list; }; +class PrivateHashes; class Hashes { + PrivateHashes *d; + public: + /* those will disappear in the future as it is hard to add new ones this way. + * Use Add* to build the results and get them via GetHashStringList() instead */ + APT_DEPRECATED MD5Summation MD5; + APT_DEPRECATED SHA1Summation SHA1; + APT_DEPRECATED SHA256Summation SHA256; + APT_DEPRECATED SHA512Summation SHA512; - MD5Summation MD5; - SHA1Summation SHA1; - SHA256Summation SHA256; - SHA512Summation SHA512; - static const int UntilEOF = 0; - inline bool Add(const unsigned char *Data,unsigned long long Size) + bool Add(const unsigned char * const Data, unsigned long long const Size, unsigned int const Hashes = ~0); + inline bool Add(const char * const Data) + {return Add((unsigned char const * const)Data,strlen(Data));}; + inline bool Add(const unsigned char * const Beg,const unsigned char * const End) + {return Add(Beg,End-Beg);}; + + enum SupportedHashes { MD5SUM = (1 << 0), SHA1SUM = (1 << 1), SHA256SUM = (1 << 2), + SHA512SUM = (1 << 3) }; + bool AddFD(int const Fd,unsigned long long Size = 0, unsigned int const Hashes = ~0); + bool AddFD(FileFd &Fd,unsigned long long Size = 0, unsigned int const Hashes = ~0); + + HashStringList GetHashStringList(); + +APT_IGNORE_DEPRECATED_PUSH + Hashes(); + virtual ~Hashes(); +APT_IGNORE_DEPRECATED_POP + + private: + APT_HIDDEN APT_CONST inline unsigned int boolsToFlag(bool const addMD5, bool const addSHA1, bool const addSHA256, bool const addSHA512) { - return MD5.Add(Data,Size) && SHA1.Add(Data,Size) && SHA256.Add(Data,Size) && SHA512.Add(Data,Size); + unsigned int Hashes = ~0; + if (addMD5 == false) Hashes &= ~MD5SUM; + if (addSHA1 == false) Hashes &= ~SHA1SUM; + if (addSHA256 == false) Hashes &= ~SHA256SUM; + if (addSHA512 == false) Hashes &= ~SHA512SUM; + return Hashes; + } + + public: + APT_DEPRECATED bool AddFD(int const Fd, unsigned long long Size, bool const addMD5, + bool const addSHA1, bool const addSHA256, bool const addSHA512) { + return AddFD(Fd, Size, boolsToFlag(addMD5, addSHA1, addSHA256, addSHA512)); + }; + + APT_DEPRECATED bool AddFD(FileFd &Fd, unsigned long long Size, bool const addMD5, + bool const addSHA1, bool const addSHA256, bool const addSHA512) { + return AddFD(Fd, Size, boolsToFlag(addMD5, addSHA1, addSHA256, addSHA512)); }; - inline bool Add(const char *Data) {return Add((unsigned char const *)Data,strlen(Data));}; - inline bool AddFD(int const Fd,unsigned long long Size = 0) - { return AddFD(Fd, Size, true, true, true, true); }; - bool AddFD(int const Fd, unsigned long long Size, bool const addMD5, - bool const addSHA1, bool const addSHA256, bool const addSHA512); - inline bool AddFD(FileFd &Fd,unsigned long long Size = 0) - { return AddFD(Fd, Size, true, true, true, true); }; - bool AddFD(FileFd &Fd, unsigned long long Size, bool const addMD5, - bool const addSHA1, bool const addSHA256, bool const addSHA512); - inline bool Add(const unsigned char *Beg,const unsigned char *End) - {return Add(Beg,End-Beg);}; }; #endif diff --git a/apt-pkg/contrib/macros.h b/apt-pkg/contrib/macros.h index 2d6448e5e..14541d4d8 100644 --- a/apt-pkg/contrib/macros.h +++ b/apt-pkg/contrib/macros.h @@ -132,13 +132,30 @@ #endif #endif +#if __GNUC__ >= 4 + #define APT_IGNORE_DEPRECATED_PUSH \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") + #define APT_IGNORE_DEPRECATED_POP \ + _Pragma("GCC diagnostic pop") + #define APT_IGNORE_DEPRECATED(XXX) \ + APT_IGNORE_DEPRECATED_PUSH \ + XXX \ + APT_IGNORE_DEPRECATED_POP +#else + #define APT_IGNORE_DEPRECATED_PUSH + #define APT_IGNORE_DEPRECATED_POP + #define APT_IGNORE_DEPRECATED(XXX) XXX +#endif + // These lines are extracted by the makefiles and the buildsystem // Increasing MAJOR or MINOR results in the need of recompiling all // reverse-dependencies of libapt-pkg against the new SONAME. // Non-ABI-Breaks should only increase RELEASE number. // See also buildlib/libversion.mak #define APT_PKG_MAJOR 4 -#define APT_PKG_MINOR 12 +#define APT_PKG_MINOR 15 #define APT_PKG_RELEASE 0 +#define APT_PKG_ABI ((APT_PKG_MAJOR * 100) + APT_PKG_MINOR) #endif diff --git a/apt-pkg/contrib/netrc.cc b/apt-pkg/contrib/netrc.cc index feaed67c8..1e3778f45 100644 --- a/apt-pkg/contrib/netrc.cc +++ b/apt-pkg/contrib/netrc.cc @@ -152,18 +152,6 @@ static int parsenetrc_string (char *host, std::string &login, std::string &passw return retcode; } -// for some unknown reason this method is exported so keep a compatible interface for now … -int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) -{ - std::string login_string, password_string; - int const ret = parsenetrc_string(host, login_string, password_string, netrcfile); - if (ret < 0) - return ret; - strncpy(login, login_string.c_str(), LOGINSIZE - 1); - strncpy(password, password_string.c_str(), PASSWORDSIZE - 1); - return ret; -} - void maybe_add_auth (URI &Uri, string NetRCFile) { diff --git a/apt-pkg/contrib/netrc.h b/apt-pkg/contrib/netrc.h index dbeb45386..b5b56f5d4 100644 --- a/apt-pkg/contrib/netrc.h +++ b/apt-pkg/contrib/netrc.h @@ -27,9 +27,5 @@ class URI; -// FIXME: kill this export on the next ABI break - strongly doubt its in use anyway -// outside of the apt itself, its really a internal interface -APT_DEPRECATED int parsenetrc (char *host, char *login, char *password, char *filename); - void maybe_add_auth (URI &Uri, std::string NetRCFile); #endif diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 87f57a30e..0ac587a9e 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -74,6 +74,13 @@ bool Endswith(const std::string &s, const std::string &end) return (s.substr(s.size() - end.size(), s.size()) == end); } +bool Startswith(const std::string &s, const std::string &start) +{ + if (start.size() > s.size()) + return false; + return (s.substr(0, start.size()) == start); +} + } } /*}}}*/ @@ -772,86 +779,94 @@ string TimeRFC1123(time_t Date) In particular: this reads blocks from the input until it believes that it's run out of input text. Each block is terminated by a - double newline ('\n' followed by '\n'). As noted below, there is a - bug in this code: it assumes that all the blocks have been read if - it doesn't see additional text in the buffer after the last one is - parsed, which will cause it to lose blocks if the last block - coincides with the end of the buffer. + double newline ('\n' followed by '\n'). */ bool ReadMessages(int Fd, vector<string> &List) { char Buffer[64000]; - char *End = Buffer; // Represents any left-over from the previous iteration of the // parse loop. (i.e., if a message is split across the end // of the buffer, it goes here) string PartialMessage; - - while (1) - { - int Res = read(Fd,End,sizeof(Buffer) - (End-Buffer)); + + do { + int const Res = read(Fd, Buffer, sizeof(Buffer)); if (Res < 0 && errno == EINTR) continue; - - // Process is dead, this is kind of bad.. + + // process we read from has died if (Res == 0) return false; - + // No data - if (Res < 0 && errno == EAGAIN) + if (Res < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) return true; if (Res < 0) return false; - - End += Res; - - // Look for the end of the message - for (char *I = Buffer; I + 1 < End; I++) + + // extract the message(s) from the buffer + char const *Start = Buffer; + char const * const End = Buffer + Res; + + char const * NL = (char const *) memchr(Start, '\n', End - Start); + if (NL == NULL) { - if (I[1] != '\n' || - (I[0] != '\n' && strncmp(I, "\r\n\r\n", 4) != 0)) - continue; - - // Pull the message out - string Message(Buffer,I-Buffer); - PartialMessage += Message; - - // Fix up the buffer - for (; I < End && (*I == '\n' || *I == '\r'); ++I); - End -= I-Buffer; - memmove(Buffer,I,End-Buffer); - I = Buffer; - - List.push_back(PartialMessage); - PartialMessage.clear(); + // end of buffer: store what we have so far and read new data in + PartialMessage.append(Start, End - Start); + Start = End; } - if (End != Buffer) - { - // If there's text left in the buffer, store it - // in PartialMessage and throw the rest of the buffer - // away. This allows us to handle messages that - // are longer than the static buffer size. - PartialMessage += string(Buffer, End); - End = Buffer; - } else - { - // BUG ALERT: if a message block happens to end at a - // multiple of 64000 characters, this will cause it to - // terminate early, leading to a badly formed block and - // probably crashing the method. However, this is the only - // way we have to find the end of the message block. I have - // an idea of how to fix this, but it will require changes - // to the protocol (essentially to mark the beginning and - // end of the block). - // - // -- dburrows 2008-04-02 - return true; - } + ++NL; + + if (PartialMessage.empty() == false && Start < End) + { + // if we start with a new line, see if the partial message we have ended with one + // so that we properly detect records ending between two read() runs + // cases are: \n|\n , \r\n|\r\n and \r\n\r|\n + // the case \r|\n\r\n is handled by the usual double-newline handling + if ((NL - Start) == 1 || ((NL - Start) == 2 && *Start == '\r')) + { + if (APT::String::Endswith(PartialMessage, "\n") || APT::String::Endswith(PartialMessage, "\r\n\r")) + { + PartialMessage.erase(PartialMessage.find_last_not_of("\r\n") + 1); + List.push_back(PartialMessage); + PartialMessage.clear(); + while (NL < End && (*NL == '\n' || *NL == '\r')) ++NL; + Start = NL; + } + } + } + + while (Start < End) { + char const * NL2 = (char const *) memchr(NL, '\n', End - NL); + if (NL2 == NULL) + { + // end of buffer: store what we have so far and read new data in + PartialMessage.append(Start, End - Start); + break; + } + ++NL2; + + // did we find a double newline? + if ((NL2 - NL) == 1 || ((NL2 - NL) == 2 && *NL == '\r')) + { + PartialMessage.append(Start, NL2 - Start); + PartialMessage.erase(PartialMessage.find_last_not_of("\r\n") + 1); + List.push_back(PartialMessage); + PartialMessage.clear(); + while (NL2 < End && (*NL2 == '\n' || *NL2 == '\r')) ++NL2; + Start = NL2; + } + NL = NL2; + } + + // we have read at least one complete message and nothing left + if (PartialMessage.empty() == true) + return true; if (WaitFd(Fd) == false) return false; - } + } while (true); } /*}}}*/ // MonthConv - Converts a month string into a number /*{{{*/ @@ -1061,7 +1076,7 @@ bool StrToNum(const char *Str,unsigned long long &Res,unsigned Len,unsigned Base // --------------------------------------------------------------------- /* This is used in decoding the 256bit encoded fixed length fields in tar files */ -bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len) +bool Base256ToNum(const char *Str,unsigned long long &Res,unsigned int Len) { if ((Str[0] & 0x80) == 0) return false; @@ -1074,6 +1089,23 @@ bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len) } } /*}}}*/ +// Base256ToNum - Convert a fixed length binary to a number /*{{{*/ +// --------------------------------------------------------------------- +/* This is used in decoding the 256bit encoded fixed length fields in + tar files */ +bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len) +{ + unsigned long long Num; + bool rc; + + rc = Base256ToNum(Str, Num, Len); + Res = Num; + if (Res != Num) + return false; + + return rc; +} + /*}}}*/ // HexDigit - Convert a hex character into an integer /*{{{*/ // --------------------------------------------------------------------- /* Helper for Hex2Num */ @@ -1287,10 +1319,12 @@ void ioprintf(ostream &out,const char *format,...) va_list args; ssize_t size = 400; while (true) { + bool ret = false; va_start(args,format); - if (iovprintf(out, format, args, size) == true) - return; + ret = iovprintf(out, format, args, size); va_end(args); + if (ret == true) + return; } } void strprintf(string &out,const char *format,...) @@ -1299,10 +1333,12 @@ void strprintf(string &out,const char *format,...) ssize_t size = 400; std::ostringstream outstr; while (true) { + bool ret = false; va_start(args,format); - if (iovprintf(outstr, format, args, size) == true) - break; + ret = iovprintf(outstr, format, args, size); va_end(args); + if (ret == true) + break; } out = outstr.str(); } diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index 185cdc3fc..e20ddca9c 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -40,6 +40,7 @@ namespace APT { namespace String { std::string Strip(const std::string &s); bool Endswith(const std::string &s, const std::string &ending); + bool Startswith(const std::string &s, const std::string &starting); } } @@ -72,6 +73,7 @@ bool ReadMessages(int Fd, std::vector<std::string> &List); bool StrToNum(const char *Str,unsigned long &Res,unsigned Len,unsigned Base = 0); bool StrToNum(const char *Str,unsigned long long &Res,unsigned Len,unsigned Base = 0); bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len); +bool Base256ToNum(const char *Str,unsigned long long &Res,unsigned int Len); bool Hex2Num(const std::string &Str,unsigned char *Num,unsigned int Length); // input changing string split @@ -151,9 +153,9 @@ inline const char *DeNull(const char *s) {return (s == 0?"(null)":s);} class URI { void CopyFrom(const std::string &From); - + public: - + std::string Access; std::string User; std::string Password; diff --git a/apt-pkg/deb/debindexfile.cc b/apt-pkg/deb/debindexfile.cc index 5b4289e92..cecfe41a9 100644 --- a/apt-pkg/deb/debindexfile.cc +++ b/apt-pkg/deb/debindexfile.cc @@ -30,6 +30,7 @@ #include <apt-pkg/pkgcachegen.h> #include <apt-pkg/pkgrecords.h> #include <apt-pkg/srcrecords.h> +#include <apt-pkg/sptr.h> #include <stdio.h> #include <iostream> @@ -130,7 +131,7 @@ string debSourcesIndex::Info(const char *Type) const // SourcesIndex::Index* - Return the URI to the index files /*{{{*/ // --------------------------------------------------------------------- /* */ -inline string debSourcesIndex::IndexFile(const char *Type) const +string debSourcesIndex::IndexFile(const char *Type) const { string s = URItoFileName(IndexURI(Type)); @@ -264,7 +265,7 @@ string debPackagesIndex::Info(const char *Type) const // PackagesIndex::Index* - Return the URI to the index files /*{{{*/ // --------------------------------------------------------------------- /* */ -inline string debPackagesIndex::IndexFile(const char *Type) const +string debPackagesIndex::IndexFile(const char *Type) const { string s =_config->FindDir("Dir::State::lists") + URItoFileName(IndexURI(Type)); @@ -420,7 +421,7 @@ debTranslationsIndex::debTranslationsIndex(string URI,string Dist,string Section // TranslationIndex::Trans* - Return the URI to the translation files /*{{{*/ // --------------------------------------------------------------------- /* */ -inline string debTranslationsIndex::IndexFile(const char *Type) const +string debTranslationsIndex::IndexFile(const char *Type) const { string s =_config->FindDir("Dir::State::lists") + URItoFileName(IndexURI(Type)); @@ -451,19 +452,6 @@ string debTranslationsIndex::IndexURI(const char *Type) const return Res; } /*}}}*/ -// TranslationsIndex::GetIndexes - Fetch the index files /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const -{ - string const TranslationFile = string("Translation-").append(Language); - new pkgAcqIndexTrans(Owner, IndexURI(Language), - 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 @@ -634,7 +622,7 @@ bool debStatusIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const pkgCache::PkgFileIterator CFile = Gen.GetCurFile(); CFile->Size = Pkg.FileSize(); CFile->mtime = Pkg.ModificationTime(); - map_ptrloc const storage = Gen.WriteUniqString("now"); + map_stringitem_t const storage = Gen.StoreString(pkgCacheGenerator::MIXED, "now"); CFile->Archive = storage; if (Gen.MergeList(Parser) == false) @@ -683,14 +671,144 @@ APT_CONST bool debStatusIndex::Exists() const } /*}}}*/ +// debDebPkgFile - Single .deb file /*{{{*/ +// --------------------------------------------------------------------- +debDebPkgFileIndex::debDebPkgFileIndex(std::string DebFile) + : pkgIndexFile(true), DebFile(DebFile) +{ + DebFileFullPath = flAbsPath(DebFile); +} + +std::string debDebPkgFileIndex::ArchiveURI(std::string /*File*/) const +{ + return "file:" + DebFileFullPath; +} + +bool debDebPkgFileIndex::Exists() const +{ + return FileExists(DebFile); +} +bool debDebPkgFileIndex::Merge(pkgCacheGenerator& Gen, OpProgress* Prog) const +{ + if(Prog) + Prog->SubProgress(0, "Reading deb file"); + + // get the control data out of the deb file vid dpkg -I + // ... can I haz libdpkg? + Configuration::Item const *Opts = _config->Tree("DPkg::Options"); + std::string dpkg = _config->Find("Dir::Bin::dpkg","dpkg"); + std::vector<const char *> Args; + Args.push_back(dpkg.c_str()); + if (Opts != 0) + { + Opts = Opts->Child; + for (; Opts != 0; Opts = Opts->Next) + { + if (Opts->Value.empty() == true) + continue; + Args.push_back(Opts->Value.c_str()); + } + } + Args.push_back("-I"); + Args.push_back(DebFile.c_str()); + Args.push_back("control"); + Args.push_back(NULL); + FileFd PipeFd; + pid_t Child; + if(Popen((const char**)&Args[0], PipeFd, Child, FileFd::ReadOnly) == false) + return _error->Error("Popen failed"); + // FIXME: static buffer + char buf[8*1024]; + unsigned long long n = 0; + if(PipeFd.Read(buf, sizeof(buf)-1, &n) == false) + return _error->Errno("read", "Failed to read dpkg pipe"); + ExecWait(Child, "Popen"); + + // now write the control data to a tempfile + SPtr<FileFd> DebControl = GetTempFile("deb-file-" + flNotDir(DebFile)); + if(DebControl == NULL) + return false; + DebControl->Write(buf, n); + // append size of the file + FileFd Fd(DebFile, FileFd::ReadOnly); + string Size; + strprintf(Size, "Size: %llu\n", Fd.Size()); + DebControl->Write(Size.c_str(), Size.size()); + // and rewind for the listparser + DebControl->Seek(0); + + // and give it to the list parser + debDebFileParser Parser(DebControl, DebFile); + if(Gen.SelectFile(DebFile, "local", *this) == false) + return _error->Error("Problem with SelectFile %s", DebFile.c_str()); + + pkgCache::PkgFileIterator File = Gen.GetCurFile(); + File->Size = DebControl->Size(); + File->mtime = DebControl->ModificationTime(); + + if (Gen.MergeList(Parser) == false) + return _error->Error("Problem with MergeLister for %s", DebFile.c_str()); + + return true; +} +pkgCache::PkgFileIterator debDebPkgFileIndex::FindInCache(pkgCache &Cache) const +{ + pkgCache::PkgFileIterator File = Cache.FileBegin(); + for (; File.end() == false; ++File) + { + if (File.FileName() == NULL || DebFile != File.FileName()) + continue; + + return File; + } + + return File; +} +unsigned long debDebPkgFileIndex::Size() const +{ + struct stat buf; + if(stat(DebFile.c_str(), &buf) != 0) + return 0; + return buf.st_size; +} + /*}}}*/ + +// debDscFileIndex stuff +debDscFileIndex::debDscFileIndex(std::string &DscFile) + : pkgIndexFile(true), DscFile(DscFile) +{ +} + +bool debDscFileIndex::Exists() const +{ + return FileExists(DscFile); +} + +unsigned long debDscFileIndex::Size() const +{ + struct stat buf; + if(stat(DscFile.c_str(), &buf) == 0) + return buf.st_size; + return 0; +} + +// DscFileIndex::CreateSrcParser - Get a parser for the .dsc file /*{{{*/ +pkgSrcRecords::Parser *debDscFileIndex::CreateSrcParser() const +{ + if (!FileExists(DscFile)) + return NULL; + + return new debDscRecordParser(DscFile,this); +} + /*}}}*/ // Index File types for Debian /*{{{*/ -class debIFTypeSrc : public pkgIndexFile::Type +class APT_HIDDEN debIFTypeSrc : public pkgIndexFile::Type { public: debIFTypeSrc() {Label = "Debian Source Index";}; }; -class debIFTypePkg : public pkgIndexFile::Type +class APT_HIDDEN debIFTypePkg : public pkgIndexFile::Type { public: @@ -700,12 +818,12 @@ class debIFTypePkg : public pkgIndexFile::Type }; debIFTypePkg() {Label = "Debian Package Index";}; }; -class debIFTypeTrans : public debIFTypePkg +class APT_HIDDEN debIFTypeTrans : public debIFTypePkg { public: debIFTypeTrans() {Label = "Debian Translation Index";}; }; -class debIFTypeStatus : public pkgIndexFile::Type +class APT_HIDDEN debIFTypeStatus : public pkgIndexFile::Type { public: @@ -715,10 +833,42 @@ class debIFTypeStatus : public pkgIndexFile::Type }; debIFTypeStatus() {Label = "Debian dpkg status file";}; }; -static debIFTypeSrc _apt_Src; -static debIFTypePkg _apt_Pkg; -static debIFTypeTrans _apt_Trans; -static debIFTypeStatus _apt_Status; +class APT_HIDDEN debIFTypeDebPkgFile : public pkgIndexFile::Type +{ + public: + virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator File) const + { + return new debDebFileRecordParser(File.FileName(),*File.Cache()); + }; + debIFTypeDebPkgFile() {Label = "deb Package file";}; +}; +class APT_HIDDEN debIFTypeDscFile : public pkgIndexFile::Type +{ + public: + virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string DscFile) const + { + return new debDscRecordParser(DscFile, NULL); + }; + debIFTypeDscFile() {Label = "dsc File Source Index";}; +}; +class APT_HIDDEN debIFTypeDebianSourceDir : public pkgIndexFile::Type +{ + public: + virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string SourceDir) const + { + return new debDscRecordParser(SourceDir + string("/debian/control"), NULL); + }; + debIFTypeDebianSourceDir() {Label = "debian/control File Source Index";}; +}; + +APT_HIDDEN debIFTypeSrc _apt_Src; +APT_HIDDEN debIFTypePkg _apt_Pkg; +APT_HIDDEN debIFTypeTrans _apt_Trans; +APT_HIDDEN debIFTypeStatus _apt_Status; +APT_HIDDEN debIFTypeDebPkgFile _apt_DebPkgFile; +// file based pseudo indexes +APT_HIDDEN debIFTypeDscFile _apt_DscFile; +APT_HIDDEN debIFTypeDebianSourceDir _apt_DebianSourceDir; const pkgIndexFile::Type *debSourcesIndex::GetType() const { @@ -736,5 +886,23 @@ const pkgIndexFile::Type *debStatusIndex::GetType() const { return &_apt_Status; } - +const pkgIndexFile::Type *debDebPkgFileIndex::GetType() const +{ + return &_apt_DebPkgFile; +} +const pkgIndexFile::Type *debDscFileIndex::GetType() const +{ + return &_apt_DscFile; +} +const pkgIndexFile::Type *debDebianSourceDirIndex::GetType() const +{ + return &_apt_DebianSourceDir; +} /*}}}*/ + +debStatusIndex::~debStatusIndex() {} +debPackagesIndex::~debPackagesIndex() {} +debTranslationsIndex::~debTranslationsIndex() {} +debSourcesIndex::~debSourcesIndex() {} + +debDebPkgFileIndex::~debDebPkgFileIndex() {} diff --git a/apt-pkg/deb/debindexfile.h b/apt-pkg/deb/debindexfile.h index 017c69a0a..312e915f1 100644 --- a/apt-pkg/deb/debindexfile.h +++ b/apt-pkg/deb/debindexfile.h @@ -28,7 +28,7 @@ class pkgAcquire; class pkgCacheGenerator; -class debStatusIndex : public pkgIndexFile +class APT_HIDDEN debStatusIndex : public pkgIndexFile { /** \brief dpointer placeholder (for later in case we need it) */ void *d; @@ -52,10 +52,10 @@ class debStatusIndex : public pkgIndexFile virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const; debStatusIndex(std::string File); - virtual ~debStatusIndex() {}; + virtual ~debStatusIndex(); }; -class debPackagesIndex : public pkgIndexFile +class APT_HIDDEN debPackagesIndex : public pkgIndexFile { /** \brief dpointer placeholder (for later in case we need it) */ void *d; @@ -65,10 +65,10 @@ class debPackagesIndex : public pkgIndexFile std::string Section; std::string Architecture; - std::string Info(const char *Type) const; - std::string IndexFile(const char *Type) const; - std::string IndexURI(const char *Type) const; - + APT_HIDDEN std::string Info(const char *Type) const; + APT_HIDDEN std::string IndexFile(const char *Type) const; + APT_HIDDEN std::string IndexURI(const char *Type) const; + public: virtual const Type *GetType() const APT_CONST; @@ -89,10 +89,10 @@ class debPackagesIndex : public pkgIndexFile debPackagesIndex(std::string const &URI, std::string const &Dist, std::string const &Section, bool const &Trusted, std::string const &Arch = "native"); - virtual ~debPackagesIndex() {}; + virtual ~debPackagesIndex(); }; -class debTranslationsIndex : public pkgIndexFile +class APT_HIDDEN debTranslationsIndex : public pkgIndexFile { /** \brief dpointer placeholder (for later in case we need it) */ void *d; @@ -102,11 +102,11 @@ class debTranslationsIndex : public pkgIndexFile std::string Section; const char * const Language; - std::string Info(const char *Type) const; - std::string IndexFile(const char *Type) const; - std::string IndexURI(const char *Type) const; + APT_HIDDEN std::string Info(const char *Type) const; + APT_HIDDEN std::string IndexFile(const char *Type) const; + APT_HIDDEN std::string IndexURI(const char *Type) const; - inline std::string TranslationFile() const {return std::string("Translation-").append(Language);}; + APT_HIDDEN std::string TranslationFile() const {return std::string("Translation-").append(Language);}; public: @@ -114,7 +114,6 @@ class debTranslationsIndex : public pkgIndexFile // Interface for acquire virtual std::string Describe(bool Short) const; - virtual bool GetIndexes(pkgAcquire *Owner) const; // Interface for the Cache Generator virtual bool Exists() const; @@ -124,10 +123,10 @@ class debTranslationsIndex : public pkgIndexFile virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const; debTranslationsIndex(std::string URI,std::string Dist,std::string Section, char const * const Language); - virtual ~debTranslationsIndex() {}; + virtual ~debTranslationsIndex(); }; -class debSourcesIndex : public pkgIndexFile +class APT_HIDDEN debSourcesIndex : public pkgIndexFile { /** \brief dpointer placeholder (for later in case we need it) */ void *d; @@ -136,10 +135,10 @@ class debSourcesIndex : public pkgIndexFile std::string Dist; std::string Section; - std::string Info(const char *Type) const; - std::string IndexFile(const char *Type) const; - std::string IndexURI(const char *Type) const; - + APT_HIDDEN std::string Info(const char *Type) const; + APT_HIDDEN std::string IndexFile(const char *Type) const; + APT_HIDDEN std::string IndexURI(const char *Type) const; + public: virtual const Type *GetType() const APT_CONST; @@ -161,7 +160,61 @@ class debSourcesIndex : public pkgIndexFile virtual unsigned long Size() const; debSourcesIndex(std::string URI,std::string Dist,std::string Section,bool Trusted); - virtual ~debSourcesIndex() {}; + virtual ~debSourcesIndex(); +}; + +class APT_HIDDEN debDebPkgFileIndex : public pkgIndexFile +{ + private: + void *d; + std::string DebFile; + std::string DebFileFullPath; + + public: + virtual const Type *GetType() const APT_CONST; + + virtual std::string Describe(bool /*Short*/) const { + return DebFile; + } + + // Interface for the Cache Generator + virtual bool Exists() const; + virtual bool HasPackages() const { + return true; + }; + virtual unsigned long Size() const; + virtual bool Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const; + virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const; + + // Interface for acquire + virtual std::string ArchiveURI(std::string /*File*/) const; + + debDebPkgFileIndex(std::string DebFile); + virtual ~debDebPkgFileIndex(); +}; + +class APT_HIDDEN debDscFileIndex : public pkgIndexFile +{ + private: + std::string DscFile; + public: + virtual const Type *GetType() const APT_CONST; + virtual pkgSrcRecords::Parser *CreateSrcParser() const; + virtual bool Exists() const; + virtual bool HasPackages() const {return false;}; + virtual unsigned long Size() const; + virtual std::string Describe(bool /*Short*/) const { + return DscFile; + }; + + debDscFileIndex(std::string &DscFile); + virtual ~debDscFileIndex() {}; +}; + +class APT_HIDDEN debDebianSourceDirIndex : public debDscFileIndex +{ + public: + virtual const Type *GetType() const APT_CONST; }; #endif diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index 4eef66c2b..462818a03 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -58,18 +58,6 @@ debListParser::debListParser(FileFd *File, string const &Arch) : Tags(File), MultiArchEnabled = Architectures.size() > 1; } /*}}}*/ -// ListParser::UniqFindTagWrite - Find the tag and write a unq string /*{{{*/ -// --------------------------------------------------------------------- -/* */ -unsigned long debListParser::UniqFindTagWrite(const char *Tag) -{ - const char *Start; - const char *Stop; - if (Section.Find(Tag,Start,Stop) == false) - return 0; - return WriteUniqString(Start,Stop - Start); -} - /*}}}*/ // ListParser::Package - Return the package name /*{{{*/ // --------------------------------------------------------------------- /* This is to return the name of the package this section describes */ @@ -144,9 +132,69 @@ unsigned char debListParser::ParseMultiArch(bool const showErrors) /*{{{*/ /* */ bool debListParser::NewVersion(pkgCache::VerIterator &Ver) { + const char *Start; + const char *Stop; + // Parse the section - unsigned long const idxSection = UniqFindTagWrite("Section"); - Ver->Section = idxSection; + if (Section.Find("Section",Start,Stop) == true) + { + map_stringitem_t const idx = StoreString(pkgCacheGenerator::SECTION, Start, Stop - Start); + Ver->Section = idx; + } +#if APT_PKG_ABI >= 413 + // Parse the source package name + pkgCache::GrpIterator const G = Ver.ParentPkg().Group(); + Ver->SourcePkgName = G->Name; + Ver->SourceVerStr = Ver->VerStr; + if (Section.Find("Source",Start,Stop) == true) + { + const char * const Space = (const char * const) memchr(Start, ' ', Stop - Start); + pkgCache::VerIterator V; + + if (Space != NULL) + { + Stop = Space; + const char * const Open = (const char * const) memchr(Space, '(', Stop - Space); + if (likely(Open != NULL)) + { + const char * const Close = (const char * const) memchr(Open, ')', Stop - Open); + if (likely(Close != NULL)) + { + std::string const version(Open + 1, (Close - Open) - 1); + if (version != Ver.VerStr()) + { + map_stringitem_t const idx = StoreString(pkgCacheGenerator::VERSIONNUMBER, version); + Ver->SourceVerStr = idx; + } + } + } + } + + std::string const pkgname(Start, Stop - Start); + if (pkgname != G.Name()) + { + for (pkgCache::PkgIterator P = G.PackageList(); P.end() == false; P = G.NextPkg(P)) + { + for (V = P.VersionList(); V.end() == false; ++V) + { + if (pkgname == V.SourcePkgName()) + { + Ver->SourcePkgName = V->SourcePkgName; + break; + } + } + if (V.end() == false) + break; + } + if (V.end() == true) + { + map_stringitem_t const idx = StoreString(pkgCacheGenerator::PKGNAME, pkgname); + Ver->SourcePkgName = idx; + } + } + } +#endif + Ver->MultiArch = ParseMultiArch(true); // Archive Size Ver->Size = Section.FindULL("Size"); @@ -155,10 +203,8 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver) Ver->InstalledSize *= 1024; // Priority - const char *Start; - const char *Stop; if (Section.Find("Priority",Start,Stop) == true) - { + { if (GrabWord(string(Start,Stop-Start),PrioList,Ver->Priority) == false) Ver->Priority = pkgCache::State::Extra; } @@ -195,35 +241,31 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver) /* 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() +string debListParser::Description(std::string const &lang) { - string const lang = DescriptionLanguage(); if (lang.empty()) return Section.FindS("Description"); else return Section.FindS(string("Description-").append(lang).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() + /*}}}*/ +// ListParser::AvailableDescriptionLanguages /*{{{*/ +std::vector<std::string> debListParser::AvailableDescriptionLanguages() { - if (Section.FindS("Description").empty() == false) - return ""; - - std::vector<string> const lang = APT::Configuration::getLanguages(true); - for (std::vector<string>::const_iterator l = lang.begin(); - l != lang.end(); ++l) - if (Section.FindS(string("Description-").append(*l).c_str()).empty() == false) - return *l; - - return ""; + std::vector<std::string> const understood = APT::Configuration::getLanguages(); + std::vector<std::string> avail; + if (Section.Exists("Description") == true) + avail.push_back(""); + for (std::vector<std::string>::const_iterator lang = understood.begin(); lang != understood.end(); ++lang) + { + std::string const tagname = "Description-" + *lang; + if (Section.Exists(tagname.c_str()) == true) + avail.push_back(*lang); + } + return avail; } - /*}}}*/ -// ListParser::Description - Return the description_md5 MD5SumValue /*{{{*/ + /*}}}*/ +// ListParser::Description_md5 - 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 @@ -234,7 +276,7 @@ MD5SumValue debListParser::Description_md5() string const value = Section.FindS("Description-md5"); if (value.empty() == true) { - std::string const desc = Description() + "\n"; + std::string const desc = Description("") + "\n"; if (desc == "\n") return MD5SumValue(); @@ -260,12 +302,6 @@ MD5SumValue debListParser::Description_md5() bool debListParser::UsePackage(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver) { - if (Pkg->Section == 0) - { - unsigned long const idxSection = UniqFindTagWrite("Section"); - Pkg->Section = idxSection; - } - string const static myArch = _config->Find("APT::Architecture"); // Possible values are: "all", "native", "installed" and "none" // The "installed" mode is handled by ParseStatus(), See #544481 and friends. @@ -917,7 +953,7 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI, { // apt-secure does no longer download individual (per-section) Release // file. to provide Component pinning we use the section name now - map_ptrloc const storage = WriteUniqString(component); + map_stringitem_t const storage = StoreString(pkgCacheGenerator::MIXED, component); FileI->Component = storage; pkgTagFile TagFile(&File, File.Size()); @@ -926,19 +962,19 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI, return false; std::string data; - #define APT_INRELEASE(TAG, STORE) \ + #define APT_INRELEASE(TYPE, TAG, STORE) \ data = Section.FindS(TAG); \ if (data.empty() == false) \ { \ - map_ptrloc const storage = WriteUniqString(data); \ + map_stringitem_t const storage = StoreString(pkgCacheGenerator::TYPE, data); \ STORE = storage; \ } - APT_INRELEASE("Suite", FileI->Archive) - APT_INRELEASE("Component", FileI->Component) - APT_INRELEASE("Version", FileI->Version) - APT_INRELEASE("Origin", FileI->Origin) - APT_INRELEASE("Codename", FileI->Codename) - APT_INRELEASE("Label", FileI->Label) + APT_INRELEASE(MIXED, "Suite", FileI->Archive) + APT_INRELEASE(MIXED, "Component", FileI->Component) + APT_INRELEASE(VERSIONNUMBER, "Version", FileI->Version) + APT_INRELEASE(MIXED, "Origin", FileI->Origin) + APT_INRELEASE(MIXED, "Codename", FileI->Codename) + APT_INRELEASE(MIXED, "Label", FileI->Label) #undef APT_INRELEASE Section.FindFlag("NotAutomatic", FileI->Flags, pkgCache::Flag::NotAutomatic); Section.FindFlag("ButAutomaticUpgrades", FileI->Flags, pkgCache::Flag::ButAutomaticUpgrades); @@ -958,7 +994,7 @@ unsigned char debListParser::GetPrio(string Str) return Out; } /*}}}*/ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 bool debListParser::SameVersion(unsigned short const Hash, /*{{{*/ pkgCache::VerIterator const &Ver) { @@ -979,3 +1015,22 @@ bool debListParser::SameVersion(unsigned short const Hash, /*{{{*/ } /*}}}*/ #endif + + +debDebFileParser::debDebFileParser(FileFd *File, std::string const &DebFile) + : debListParser(File, ""), DebFile(DebFile) +{ +} + +bool debDebFileParser::UsePackage(pkgCache::PkgIterator &Pkg, + pkgCache::VerIterator &Ver) +{ + bool res = debListParser::UsePackage(Pkg, Ver); + // we use the full file path as a provides so that the file is found + // by its name + if(NewProvidesAllArch(Ver, DebFile, Ver.VerStr()) == false) + return false; + return res; +} + +debListParser::~debListParser() {} diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h index 3b6963211..6279d8399 100644 --- a/apt-pkg/deb/deblistparser.h +++ b/apt-pkg/deb/deblistparser.h @@ -26,7 +26,7 @@ class FileFd; -class debListParser : public pkgCacheGenerator::ListParser +class APT_HIDDEN debListParser : public pkgCacheGenerator::ListParser { public: @@ -44,22 +44,22 @@ class debListParser : public pkgCacheGenerator::ListParser protected: pkgTagFile Tags; pkgTagSection Section; - unsigned long iOffset; + map_filesize_t iOffset; std::string Arch; std::vector<std::string> Architectures; bool MultiArchEnabled; - unsigned long UniqFindTagWrite(const char *Tag); virtual bool ParseStatus(pkgCache::PkgIterator &Pkg,pkgCache::VerIterator &Ver); bool ParseDepends(pkgCache::VerIterator &Ver,const char *Tag, unsigned int Type); bool ParseProvides(pkgCache::VerIterator &Ver); bool NewProvidesAllArch(pkgCache::VerIterator &Ver, std::string const &Package, std::string const &Version); static bool GrabWord(std::string Word,WordList *List,unsigned char &Out); - + APT_HIDDEN unsigned char ParseMultiArch(bool const showErrors); + public: - static unsigned char GetPrio(std::string Str); + APT_PUBLIC static unsigned char GetPrio(std::string Str); // These all operate against the current section virtual std::string Package(); @@ -67,46 +67,54 @@ class debListParser : public pkgCacheGenerator::ListParser virtual bool ArchitectureAll(); virtual std::string Version(); virtual bool NewVersion(pkgCache::VerIterator &Ver); - virtual std::string Description(); - virtual std::string DescriptionLanguage(); + virtual std::string Description(std::string const &lang); + virtual std::vector<std::string> AvailableDescriptionLanguages(); virtual MD5SumValue Description_md5(); virtual unsigned short VersionHash(); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 virtual bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver); #endif virtual bool UsePackage(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver); - virtual unsigned long Offset() {return iOffset;}; - virtual unsigned long Size() {return Section.size();}; + virtual map_filesize_t Offset() {return iOffset;}; + virtual map_filesize_t Size() {return Section.size();}; virtual bool Step(); bool LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,FileFd &File, std::string section); - static const char *ParseDepends(const char *Start,const char *Stop, + APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop, std::string &Package,std::string &Ver,unsigned int &Op); - static const char *ParseDepends(const char *Start,const char *Stop, + APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop, std::string &Package,std::string &Ver,unsigned int &Op, bool const &ParseArchFlags); - static const char *ParseDepends(const char *Start,const char *Stop, + APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop, std::string &Package,std::string &Ver,unsigned int &Op, bool const &ParseArchFlags, bool const &StripMultiArch); - static const char *ParseDepends(const char *Start,const char *Stop, + APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop, std::string &Package,std::string &Ver,unsigned int &Op, bool const &ParseArchFlags, bool const &StripMultiArch, bool const &ParseRestrictionsList); - static const char *ConvertRelation(const char *I,unsigned int &Op); + APT_PUBLIC static const char *ConvertRelation(const char *I,unsigned int &Op); debListParser(FileFd *File, std::string const &Arch = ""); - virtual ~debListParser() {}; + virtual ~debListParser(); +}; - private: - APT_HIDDEN unsigned char ParseMultiArch(bool const showErrors); +class APT_HIDDEN debDebFileParser : public debListParser +{ + private: + std::string DebFile; + + public: + debDebFileParser(FileFd *File, std::string const &DebFile); + virtual bool UsePackage(pkgCache::PkgIterator &Pkg, + pkgCache::VerIterator &Ver); }; -class debTranslationsParser : public debListParser +class APT_HIDDEN debTranslationsParser : public debListParser { public: // a translation can never be a real package diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc index 6fd12add8..81e067424 100644 --- a/apt-pkg/deb/debmetaindex.cc +++ b/apt-pkg/deb/debmetaindex.cc @@ -78,7 +78,6 @@ string debReleaseIndex::MetaIndexURI(const char *Type) const return Res; } -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) std::string debReleaseIndex::LocalFileName() const { // see if we have a InRelease file @@ -92,7 +91,6 @@ std::string debReleaseIndex::LocalFileName() const return ""; } -#endif string debReleaseIndex::IndexURISuffix(const char *Type, string const &Section, string const &Arch) const { @@ -186,8 +184,8 @@ debReleaseIndex::~debReleaseIndex() { delete *S; } -vector <struct IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const { - vector <struct IndexTarget *>* IndexTargets = new vector <IndexTarget *>; +vector <IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const { + vector <IndexTarget *>* IndexTargets = new vector <IndexTarget *>; map<string, vector<debSectionEntry const*> >::const_iterator const src = ArchEntries.find("source"); if (src != ArchEntries.end()) { @@ -253,38 +251,44 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const { bool const tryInRelease = _config->FindB("Acquire::TryInRelease", true); + indexRecords * const iR = new indexRecords(Dist); + if (Trusted == ALWAYS_TRUSTED) + iR->SetTrusted(true); + else if (Trusted == NEVER_TRUSTED) + iR->SetTrusted(false); + // special case for --print-uris if (GetAll) { - vector <struct IndexTarget *> *targets = ComputeIndexTargets(); - for (vector <struct IndexTarget*>::const_iterator Target = targets->begin(); Target != targets->end(); ++Target) { + vector <IndexTarget *> *targets = ComputeIndexTargets(); + for (vector <IndexTarget*>::const_iterator Target = targets->begin(); Target != targets->end(); ++Target) { new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description, - (*Target)->ShortDesc, HashString()); + (*Target)->ShortDesc, HashStringList()); } delete targets; // this is normally created in pkgAcqMetaSig, but if we run // in --print-uris mode, we add it here if (tryInRelease == false) - new pkgAcqMetaIndex(Owner, MetaIndexURI("Release"), - MetaIndexInfo("Release"), "Release", - MetaIndexURI("Release.gpg"), - ComputeIndexTargets(), - new indexRecords (Dist)); + new pkgAcqMetaIndex(Owner, NULL, + MetaIndexURI("Release"), + MetaIndexInfo("Release"), "Release", + MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg", + ComputeIndexTargets(), + iR); } - if (tryInRelease == true) - new pkgAcqMetaClearSig(Owner, MetaIndexURI("InRelease"), - MetaIndexInfo("InRelease"), "InRelease", + new pkgAcqMetaClearSig(Owner, + MetaIndexURI("InRelease"), MetaIndexInfo("InRelease"), "InRelease", MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release", MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg", ComputeIndexTargets(), - new indexRecords (Dist)); + iR); else - new pkgAcqMetaSig(Owner, MetaIndexURI("Release.gpg"), - MetaIndexInfo("Release.gpg"), "Release.gpg", - MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release", - ComputeIndexTargets(), - new indexRecords (Dist)); + new pkgAcqMetaIndex(Owner, NULL, + MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release", + MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg", + ComputeIndexTargets(), + iR); return true; } @@ -388,7 +392,7 @@ debReleaseIndex::debSectionEntry::debSectionEntry (string const &Section, bool const &IsSrc): Section(Section), IsSrc(IsSrc) {} -class debSLTypeDebian : public pkgSourceList::Type +class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type { protected: @@ -471,7 +475,16 @@ class debSLTypeDebian : public pkgSourceList::Type } }; -class debSLTypeDeb : public debSLTypeDebian +debDebFileMetaIndex::debDebFileMetaIndex(std::string const &DebFile) + : metaIndex(DebFile, "local-uri", "deb-dist"), DebFile(DebFile) +{ + DebIndex = new debDebPkgFileIndex(DebFile); + Indexes = new vector<pkgIndexFile *>(); + Indexes->push_back(DebIndex); +} + + +class APT_HIDDEN debSLTypeDeb : public debSLTypeDebian { public: @@ -489,7 +502,7 @@ class debSLTypeDeb : public debSLTypeDebian } }; -class debSLTypeDebSrc : public debSLTypeDebian +class APT_HIDDEN debSLTypeDebSrc : public debSLTypeDebian { public: @@ -507,5 +520,26 @@ class debSLTypeDebSrc : public debSLTypeDebian } }; -debSLTypeDeb _apt_DebType; -debSLTypeDebSrc _apt_DebSrcType; +class APT_HIDDEN debSLTypeDebFile : public pkgSourceList::Type +{ + public: + + bool CreateItem(vector<metaIndex *> &List, string const &URI, + string const &/*Dist*/, string const &/*Section*/, + std::map<string, string> const &/*Options*/) const + { + metaIndex *mi = new debDebFileMetaIndex(URI); + List.push_back(mi); + return true; + } + + debSLTypeDebFile() + { + Name = "deb-file"; + Label = "Debian Deb File"; + } +}; + +APT_HIDDEN debSLTypeDeb _apt_DebType; +APT_HIDDEN debSLTypeDebSrc _apt_DebSrcType; +APT_HIDDEN debSLTypeDebFile _apt_DebFileType; diff --git a/apt-pkg/deb/debmetaindex.h b/apt-pkg/deb/debmetaindex.h index 2286fa8b2..94d005760 100644 --- a/apt-pkg/deb/debmetaindex.h +++ b/apt-pkg/deb/debmetaindex.h @@ -18,8 +18,10 @@ class pkgAcquire; class pkgIndexFile; +class debDebPkgFileIndex; +class IndexTarget; -class debReleaseIndex : public metaIndex { +class APT_HIDDEN debReleaseIndex : public metaIndex { public: class debSectionEntry @@ -34,7 +36,7 @@ class debReleaseIndex : public metaIndex { /** \brief dpointer placeholder (for later in case we need it) */ void *d; std::map<std::string, std::vector<debSectionEntry const*> > ArchEntries; - enum { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted; + enum APT_HIDDEN { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted; public: @@ -44,16 +46,17 @@ class debReleaseIndex : public metaIndex { virtual std::string ArchiveURI(std::string const &File) const {return URI + File;}; virtual bool GetIndexes(pkgAcquire *Owner, bool const &GetAll=false) const; - std::vector <struct IndexTarget *>* ComputeIndexTargets() const; + std::vector <IndexTarget *>* ComputeIndexTargets() const; std::string Info(const char *Type, std::string const &Section, std::string const &Arch="") const; std::string MetaIndexInfo(const char *Type) const; std::string MetaIndexFile(const char *Types) const; std::string MetaIndexURI(const char *Type) const; -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - virtual std::string LocalFileName() const; +#if APT_PKG_ABI >= 413 + virtual #endif + std::string LocalFileName() const; std::string IndexURI(const char *Type, std::string const &Section, std::string const &Arch="native") const; std::string IndexURISuffix(const char *Type, std::string const &Section, std::string const &Arch="native") const; @@ -71,4 +74,27 @@ class debReleaseIndex : public metaIndex { void PushSectionEntry(const debSectionEntry *Entry); }; +class APT_HIDDEN debDebFileMetaIndex : public metaIndex +{ + private: + std::string DebFile; + debDebPkgFileIndex *DebIndex; + public: + virtual std::string ArchiveURI(std::string const& /*File*/) const { + return DebFile; + } + virtual bool GetIndexes(pkgAcquire* /*Owner*/, const bool& /*GetAll=false*/) const { + return true; + } + virtual std::vector<pkgIndexFile *> *GetIndexFiles() { + return Indexes; + } + virtual bool IsTrusted() const { + return true; + } + debDebFileMetaIndex(std::string const &DebFile); + virtual ~debDebFileMetaIndex() {}; + +}; + #endif diff --git a/apt-pkg/deb/debrecords.cc b/apt-pkg/deb/debrecords.cc index 6063db5a8..b41aa5584 100644 --- a/apt-pkg/deb/debrecords.cc +++ b/apt-pkg/deb/debrecords.cc @@ -73,36 +73,17 @@ string debRecordParser::Homepage() return Section.FindS("Homepage"); } /*}}}*/ -// RecordParser::MD5Hash - Return the archive hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string debRecordParser::MD5Hash() +// RecordParser::Hashes - return the available archive hashes /*{{{*/ +HashStringList debRecordParser::Hashes() const { - return Section.FindS("MD5Sum"); -} - /*}}}*/ -// RecordParser::SHA1Hash - Return the archive hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string debRecordParser::SHA1Hash() -{ - return Section.FindS("SHA1"); -} - /*}}}*/ -// RecordParser::SHA256Hash - Return the archive hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string debRecordParser::SHA256Hash() -{ - return Section.FindS("SHA256"); -} - /*}}}*/ -// RecordParser::SHA512Hash - Return the archive hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string debRecordParser::SHA512Hash() -{ - return Section.FindS("SHA512"); + HashStringList hashes; + for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + { + std::string const hash = Section.FindS(*type); + if (hash.empty() == false) + hashes.push_back(HashString(*type, hash)); + } + return hashes; } /*}}}*/ // RecordParser::Maintainer - Return the maintainer email /*{{{*/ @@ -125,10 +106,12 @@ string debRecordParser::RecordField(const char *fieldName) // RecordParser::ShortDesc - Return a 1 line description /*{{{*/ // --------------------------------------------------------------------- /* */ -string debRecordParser::ShortDesc() +string debRecordParser::ShortDesc(std::string const &lang) { - string Res = LongDesc(); - string::size_type Pos = Res.find('\n'); + string const Res = LongDesc(lang); + if (Res.empty() == true) + return ""; + string::size_type const Pos = Res.find('\n'); if (Pos == string::npos) return Res; return string(Res,0,Pos); @@ -137,26 +120,44 @@ string debRecordParser::ShortDesc() // RecordParser::LongDesc - Return a longer description /*{{{*/ // --------------------------------------------------------------------- /* */ -string debRecordParser::LongDesc() -{ - string orig, dest; +string debRecordParser::LongDesc(std::string const &lang) +{ + string orig; + if (lang.empty() == true) + { + std::vector<string> const lang = APT::Configuration::getLanguages(); + for (std::vector<string>::const_iterator l = lang.begin(); + l != lang.end(); ++l) + { + std::string const tagname = "Description-" + *l; + orig = Section.FindS(tagname.c_str()); + if (orig.empty() == false) + break; + else if (*l == "en") + { + orig = Section.FindS("Description"); + if (orig.empty() == false) + break; + } + } + if (orig.empty() == true) + orig = Section.FindS("Description"); + } + else + { + std::string const tagname = "Description-" + lang; + orig = Section.FindS(tagname.c_str()); + if (orig.empty() == true && lang == "en") + orig = Section.FindS("Description"); + } - if (!Section.FindS("Description").empty()) - orig = Section.FindS("Description").c_str(); - else - { - std::vector<string> const lang = APT::Configuration::getLanguages(); - for (std::vector<string>::const_iterator l = lang.begin(); - orig.empty() && l != lang.end(); ++l) - orig = Section.FindS(string("Description-").append(*l).c_str()); - } + char const * const codeset = nl_langinfo(CODESET); + if (strcmp(codeset,"UTF-8") != 0) { + string dest; + UTF8ToCodeset(codeset, orig, &dest); + return dest; + } - char const * const codeset = nl_langinfo(CODESET); - if (strcmp(codeset,"UTF-8") != 0) { - UTF8ToCodeset(codeset, orig, &dest); - orig = dest; - } - return orig; } /*}}}*/ @@ -206,3 +207,5 @@ void debRecordParser::GetRec(const char *&Start,const char *&Stop) Section.GetSection(Start,Stop); } /*}}}*/ + +debRecordParser::~debRecordParser() {} diff --git a/apt-pkg/deb/debrecords.h b/apt-pkg/deb/debrecords.h index bdac6c90b..7091c38e6 100644 --- a/apt-pkg/deb/debrecords.h +++ b/apt-pkg/deb/debrecords.h @@ -25,35 +25,32 @@ #include <apt-pkg/indexfile.h> #endif -class debRecordParser : public pkgRecords::Parser +class APT_HIDDEN debRecordParser : public pkgRecords::Parser { /** \brief dpointer placeholder (for later in case we need it) */ void *d; - + + protected: FileFd File; pkgTagFile Tags; pkgTagSection Section; - protected: - virtual bool Jump(pkgCache::VerFileIterator const &Ver); virtual bool Jump(pkgCache::DescFileIterator const &Desc); - public: + public: // These refer to the archive file for the Version virtual std::string FileName(); - virtual std::string MD5Hash(); - virtual std::string SHA1Hash(); - virtual std::string SHA256Hash(); - virtual std::string SHA512Hash(); virtual std::string SourcePkg(); virtual std::string SourceVer(); - + + virtual HashStringList Hashes() const; + // These are some general stats about the package virtual std::string Maintainer(); - virtual std::string ShortDesc(); - virtual std::string LongDesc(); + virtual std::string ShortDesc(std::string const &lang); + virtual std::string LongDesc(std::string const &lang); virtual std::string Name(); virtual std::string Homepage(); @@ -63,7 +60,18 @@ class debRecordParser : public pkgRecords::Parser virtual void GetRec(const char *&Start,const char *&Stop); debRecordParser(std::string FileName,pkgCache &Cache); - virtual ~debRecordParser() {}; + virtual ~debRecordParser(); +}; + +// custom record parser that reads deb files directly +class APT_HIDDEN debDebFileRecordParser : public debRecordParser +{ + public: + virtual std::string FileName() { + return File.Name(); + } + debDebFileRecordParser(std::string FileName,pkgCache &Cache) + : debRecordParser(FileName, Cache) {}; }; #endif diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index 49a348dd4..ca6d09896 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -18,6 +18,8 @@ #include <apt-pkg/aptconfiguration.h> #include <apt-pkg/srcrecords.h> #include <apt-pkg/tagfile.h> +#include <apt-pkg/hashes.h> +#include <apt-pkg/gpgv.h> #include <ctype.h> #include <stdlib.h> @@ -55,12 +57,13 @@ const char **debSrcRecordParser::Binaries() char* binStartNext = strchrnul(bin, ','); char* binEnd = binStartNext - 1; for (; isspace(*binEnd) != 0; --binEnd) - binEnd = '\0'; + binEnd = 0; StaticBinList.push_back(bin); if (*binStartNext != ',') break; *binStartNext = '\0'; - for (bin = binStartNext + 1; isspace(*bin) != 0; ++bin); + for (bin = binStartNext + 1; isspace(*bin) != 0; ++bin) + ; } while (*bin != '\0'); StaticBinList.push_back(NULL); @@ -190,16 +193,8 @@ bool debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2> &List) // we have it already, store the new hash and be done if (file != List.end()) { -#if __GNUC__ >= 4 - // set for compatibility only, so warn users not us - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif if (checksumField == "Files") - file->MD5Hash = hash; -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif + APT_IGNORE_DEPRECATED(file->MD5Hash = hash;) // an error here indicates that we have two different hashes for the same file if (file->Hashes.push_back(hashString) == false) return _error->Error("Error parsing checksum in %s of source package %s", checksumField.c_str(), Package().c_str()); @@ -212,17 +207,11 @@ bool debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2> &List) F.FileSize = strtoull(size.c_str(), NULL, 10); F.Hashes.push_back(hashString); -#if __GNUC__ >= 4 - // set for compatibility only, so warn users not us - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif + APT_IGNORE_DEPRECATED_PUSH F.Size = F.FileSize; if (checksumField == "Files") F.MD5Hash = hash; -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif + APT_IGNORE_DEPRECATED_POP // Try to guess what sort of file it is we are getting. string::size_type Pos = F.Path.length()-1; @@ -264,3 +253,21 @@ debSrcRecordParser::~debSrcRecordParser() free(Buffer); } /*}}}*/ + + +debDscRecordParser::debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index) + : debSrcRecordParser(DscFile, Index) +{ + // support clear signed files + if (OpenMaybeClearSignedFile(DscFile, Fd) == false) + { + _error->Error("Failed to open %s", DscFile.c_str()); + return; + } + + // re-init to ensure the updated Fd is used + Tags.Init(&Fd); + // read the first (and only) record + Step(); + +} diff --git a/apt-pkg/deb/debsrcrecords.h b/apt-pkg/deb/debsrcrecords.h index 2a3fc86c9..cd246d624 100644 --- a/apt-pkg/deb/debsrcrecords.h +++ b/apt-pkg/deb/debsrcrecords.h @@ -21,11 +21,12 @@ class pkgIndexFile; -class debSrcRecordParser : public pkgSrcRecords::Parser +class APT_HIDDEN debSrcRecordParser : public pkgSrcRecords::Parser { /** \brief dpointer placeholder (for later in case we need it) */ void *d; + protected: FileFd Fd; pkgTagFile Tags; pkgTagSection Sect; @@ -61,4 +62,10 @@ class debSrcRecordParser : public pkgSrcRecords::Parser virtual ~debSrcRecordParser(); }; +class APT_HIDDEN debDscRecordParser : public debSrcRecordParser +{ + public: + debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index); +}; + #endif diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index 142f3a6e6..9a5da9da1 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -38,7 +38,7 @@ using std::string; debSystem debSys; -class debSystemPrivate { +class APT_HIDDEN debSystemPrivate { public: debSystemPrivate() : LockFD(-1), LockCount(0), StatusFile(0) { diff --git a/apt-pkg/deb/debsystem.h b/apt-pkg/deb/debsystem.h index a945f68fb..226cd60bf 100644 --- a/apt-pkg/deb/debsystem.h +++ b/apt-pkg/deb/debsystem.h @@ -29,7 +29,7 @@ class debSystem : public pkgSystem { // private d-pointer debSystemPrivate *d; - bool CheckUpdates(); + APT_HIDDEN bool CheckUpdates(); public: diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index e23ca466d..09bd9149f 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -203,18 +203,10 @@ pkgCache::VerIterator FindNowVersion(const pkgCache::PkgIterator &Pkg) { pkgCache::VerIterator Ver; for (Ver = Pkg.VersionList(); Ver.end() == false; ++Ver) - { - pkgCache::VerFileIterator Vf = Ver.FileList(); - pkgCache::PkgFileIterator F = Vf.File(); - for (F = Vf.File(); F.end() == false; ++F) - { - if (F && F.Archive()) - { - if (strcmp(F.Archive(), "now")) - return Ver; - } - } - } + for (pkgCache::VerFileIterator Vf = Ver.FileList(); Vf.end() == false; ++Vf) + for (pkgCache::PkgFileIterator F = Vf.File(); F.end() == false; ++F) + if (F->Archive != 0 && strcmp(F.Archive(), "now") == 0) + return Ver; return Ver; } /*}}}*/ @@ -534,7 +526,7 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) void pkgDPkgPM::DoStdin(int master) { unsigned char input_buf[256] = {0,}; - ssize_t len = read(0, input_buf, sizeof(input_buf)); + ssize_t len = read(STDIN_FILENO, input_buf, sizeof(input_buf)); if (len) FileFd::Write(master, input_buf, len); else @@ -1057,7 +1049,6 @@ void pkgDPkgPM::BuildPackagesProgressMap() ++PackagesTotal; } /*}}}*/ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13) bool pkgDPkgPM::Go(int StatusFd) { APT::Progress::PackageManager *progress = NULL; @@ -1066,9 +1057,8 @@ bool pkgDPkgPM::Go(int StatusFd) else progress = new APT::Progress::PackageManagerProgressFd(StatusFd); - return GoNoABIBreak(progress); + return Go(progress); } -#endif void pkgDPkgPM::StartPtyMagic() { @@ -1223,11 +1213,7 @@ void pkgDPkgPM::StopPtyMagic() * through to human readable (and i10n-able) * names and calculates a percentage for each step. */ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) -#else -bool pkgDPkgPM::GoNoABIBreak(APT::Progress::PackageManager *progress) -#endif { pkgPackageManager::SigINTStop = false; d->progress = progress; @@ -1716,7 +1702,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) if (apportPkg.end() == true || apportPkg->CurrentVer == 0) return; - string pkgname, reportfile, srcpkgname, pkgver, arch; + string pkgname, reportfile, pkgver, arch; string::size_type pos; FILE *report; @@ -1805,11 +1791,6 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) if (Ver.end() == true) return; pkgver = Ver.VerStr() == NULL ? "unknown" : Ver.VerStr(); - pkgRecords Recs(Cache); - pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); - srcpkgname = Parse.SourcePkg(); - if(srcpkgname.empty()) - srcpkgname = pkgname; // if the file exists already, we check: // - if it was reported already (touched by apport). @@ -1860,7 +1841,16 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) time_t now = time(NULL); fprintf(report, "Date: %s" , ctime(&now)); fprintf(report, "Package: %s %s\n", pkgname.c_str(), pkgver.c_str()); +#if APT_PKG_ABI >= 413 + fprintf(report, "SourcePackage: %s\n", Ver.SourcePkgName()); +#else + pkgRecords Recs(Cache); + pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); + std::string srcpkgname = Parse.SourcePkg(); + if(srcpkgname.empty()) + srcpkgname = pkgname; fprintf(report, "SourcePackage: %s\n", srcpkgname.c_str()); +#endif fprintf(report, "ErrorMessage:\n %s\n", errormsg); // ensure that the log is flushed diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 2c1805015..2a6e7e004 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -52,7 +52,7 @@ class pkgDPkgPM : public pkgPackageManager needs to declare a Replaces on the disappeared package. \param pkgname Name of the package that disappeared */ - void handleDisappearAction(std::string const &pkgname); + APT_HIDDEN void handleDisappearAction(std::string const &pkgname); protected: int pkgFailures; @@ -118,27 +118,14 @@ class pkgDPkgPM : public pkgPackageManager void DoTerminalPty(int master); void DoDpkgStatusFd(int statusfd); void ProcessDpkgStatusLine(char *line); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13) - void DoDpkgStatusFd(int statusfd, int /*unused*/) { - DoDpkgStatusFd(statusfd); - } - void ProcessDpkgStatusLine(int /*unused*/, char *line) { - ProcessDpkgStatusLine(line); - } -#endif - // The Actuall installation implementation virtual bool Install(PkgIterator Pkg,std::string File); virtual bool Configure(PkgIterator Pkg); virtual bool Remove(PkgIterator Pkg,bool Purge = false); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) virtual bool Go(APT::Progress::PackageManager *progress); -#else virtual bool Go(int StatusFd=-1); - bool GoNoABIBreak(APT::Progress::PackageManager *progress); -#endif virtual void Reset(); diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 16282df21..25c945ebb 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -237,9 +237,11 @@ bool pkgDepCache::writeStateFile(OpProgress * /*prog*/, bool InstalledOnly) /*{{ FileFd StateFile; string const state = _config->FindFile("Dir::State::extended_states"); + if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), flNotFile(state)) == false) + return false; // if it does not exist, create a empty one - if(!RealFileExists(state)) + if(!RealFileExists(state)) { StateFile.Open(state, FileFd::WriteAtomic); StateFile.Close(); @@ -1961,3 +1963,17 @@ bool pkgDepCache::Sweep() /*{{{*/ return true; } /*}}}*/ +// DepCache::MarkAndSweep /*{{{*/ +bool pkgDepCache::MarkAndSweep(InRootSetFunc &rootFunc) +{ + return MarkRequired(rootFunc) && Sweep(); +} +bool pkgDepCache::MarkAndSweep() +{ + std::auto_ptr<InRootSetFunc> f(GetRootSetFunc()); + if(f.get() != NULL) + return MarkAndSweep(*f.get()); + else + return false; +} + /*}}}*/ diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index bec651279..20d263c67 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -91,7 +91,7 @@ class pkgDepCache : protected pkgCache::Namespace * \param follow_suggests If \b true, suggestions of the package * will be recursively marked. */ - void MarkPackage(const pkgCache::PkgIterator &pkg, + APT_HIDDEN void MarkPackage(const pkgCache::PkgIterator &pkg, const pkgCache::VerIterator &ver, bool const &follow_recommends, bool const &follow_suggests); @@ -169,7 +169,7 @@ class pkgDepCache : protected pkgCache::Namespace bool released; /** Action groups are noncopyable. */ - ActionGroup(const ActionGroup &other); + APT_HIDDEN ActionGroup(const ActionGroup &other); public: /** \brief Create a new ActionGroup. * @@ -396,19 +396,8 @@ class pkgDepCache : protected pkgCache::Namespace * \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; - } + bool MarkAndSweep(InRootSetFunc &rootFunc); + bool MarkAndSweep(); /** \name State Manipulators */ @@ -514,7 +503,7 @@ class pkgDepCache : protected pkgCache::Namespace bool const rPurge, unsigned long const Depth, bool const FromUser); private: - bool IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg, + APT_HIDDEN bool IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg, unsigned long const Depth, bool const FromUser); }; diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index 0d0418e06..3c6a7e30f 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -95,12 +95,15 @@ bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FILE* output, void EDSP::WriteScenarioVersion(pkgDepCache &Cache, FILE* output, pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const &Ver) { + fprintf(output, "Package: %s\n", Pkg.Name()); +#if APT_PKG_ABI >= 413 + fprintf(output, "Source: %s\n", Ver.SourcePkgName()); +#else pkgRecords Recs(Cache); pkgRecords::Parser &rec = Recs.Lookup(Ver.FileList()); string srcpkg = rec.SourcePkg().empty() ? Pkg.Name() : rec.SourcePkg(); - - fprintf(output, "Package: %s\n", Pkg.Name()); fprintf(output, "Source: %s\n", srcpkg.c_str()); +#endif fprintf(output, "Architecture: %s\n", Ver.Arch()); fprintf(output, "Version: %s\n", Ver.VerStr()); if (Pkg.CurrentVer() == Ver) diff --git a/apt-pkg/edsp/edspindexfile.cc b/apt-pkg/edsp/edspindexfile.cc index 10313fd61..d00536362 100644 --- a/apt-pkg/edsp/edspindexfile.cc +++ b/apt-pkg/edsp/edspindexfile.cc @@ -56,7 +56,7 @@ bool edspIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const pkgCache::PkgFileIterator CFile = Gen.GetCurFile(); CFile->Size = Pkg.FileSize(); CFile->mtime = Pkg.ModificationTime(); - map_ptrloc const storage = Gen.WriteUniqString("edsp::scenario"); + map_stringitem_t const storage = Gen.StoreString(pkgCacheGenerator::MIXED, "edsp::scenario"); CFile->Archive = storage; if (Gen.MergeList(Parser) == false) @@ -65,7 +65,7 @@ bool edspIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const } /*}}}*/ // Index File types for APT /*{{{*/ -class edspIFType: public pkgIndexFile::Type +class APT_HIDDEN edspIFType: public pkgIndexFile::Type { public: virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator) const @@ -75,7 +75,7 @@ class edspIFType: public pkgIndexFile::Type }; edspIFType() {Label = "EDSP scenario file";}; }; -static edspIFType _apt_Universe; +APT_HIDDEN edspIFType _apt_Universe; const pkgIndexFile::Type *edspIndex::GetType() const { diff --git a/apt-pkg/edsp/edspindexfile.h b/apt-pkg/edsp/edspindexfile.h index 609a2cde4..8c18d8cbd 100644 --- a/apt-pkg/edsp/edspindexfile.h +++ b/apt-pkg/edsp/edspindexfile.h @@ -18,7 +18,7 @@ class OpProgress; class pkgCacheGenerator; -class edspIndex : public debStatusIndex +class APT_HIDDEN edspIndex : public debStatusIndex { /** \brief dpointer placeholder (for later in case we need it) */ void *d; diff --git a/apt-pkg/edsp/edsplistparser.h b/apt-pkg/edsp/edsplistparser.h index 959fb587f..86cd77606 100644 --- a/apt-pkg/edsp/edsplistparser.h +++ b/apt-pkg/edsp/edsplistparser.h @@ -25,7 +25,7 @@ class FileFd; -class edspListParser : public debListParser +class APT_HIDDEN edspListParser : public debListParser { public: virtual bool NewVersion(pkgCache::VerIterator &Ver); diff --git a/apt-pkg/edsp/edspsystem.cc b/apt-pkg/edsp/edspsystem.cc index 92edb8d77..063517421 100644 --- a/apt-pkg/edsp/edspsystem.cc +++ b/apt-pkg/edsp/edspsystem.cc @@ -26,8 +26,6 @@ #include <apti18n.h> /*}}}*/ -edspSystem edspSys; - // System::debSystem - Constructor /*{{{*/ edspSystem::edspSystem() { @@ -126,3 +124,5 @@ bool edspSystem::FindIndex(pkgCache::PkgFileIterator File, return false; } /*}}}*/ + +APT_HIDDEN edspSystem edspSys; diff --git a/apt-pkg/edsp/edspsystem.h b/apt-pkg/edsp/edspsystem.h index 65e36d714..06a63f40c 100644 --- a/apt-pkg/edsp/edspsystem.h +++ b/apt-pkg/edsp/edspsystem.h @@ -22,7 +22,7 @@ class pkgIndexFile; class pkgPackageManager; class edspIndex; -class edspSystem : public pkgSystem +class APT_HIDDEN edspSystem : public pkgSystem { /** \brief dpointer placeholder (for later in case we need it) */ void *d; @@ -45,6 +45,4 @@ class edspSystem : public pkgSystem ~edspSystem(); }; -extern edspSystem edspSys; - #endif diff --git a/apt-pkg/indexcopy.cc b/apt-pkg/indexcopy.cc index 854ba1bd7..5fa57fd8b 100644 --- a/apt-pkg/indexcopy.cc +++ b/apt-pkg/indexcopy.cc @@ -516,7 +516,7 @@ bool SigVerify::Verify(string prefix, string file, indexRecords *MetaIndex) return false; } - if (!Record->Hash.VerifyFile(prefix+file)) + if (!Record->Hashes.VerifyFile(prefix+file)) { _error->Warning(_("Hash mismatch for: %s"),file.c_str()); return false; @@ -524,8 +524,10 @@ bool SigVerify::Verify(string prefix, string file, indexRecords *MetaIndex) if(Debug == true) { - cout << "File: " << prefix+file << endl; - cout << "Expected Hash " << Record->Hash.toStr() << endl; + cout << "File: " << prefix+file << endl + << "Expected Hash " << endl; + for (HashStringList::const_iterator hs = Record->Hashes.begin(); hs != Record->Hashes.end(); ++hs) + std::cout << "\t- " << hs->toStr() << std::endl; } return true; @@ -791,3 +793,5 @@ bool TranslationsCopy::CopyTranslations(string CDROM,string Name, /*{{{*/ return true; } /*}}}*/ + +APT_CONST IndexCopy::~IndexCopy() {} diff --git a/apt-pkg/indexcopy.h b/apt-pkg/indexcopy.h index 43cdb3f0a..701beb075 100644 --- a/apt-pkg/indexcopy.h +++ b/apt-pkg/indexcopy.h @@ -53,7 +53,7 @@ class IndexCopy /*{{{*/ bool CopyPackages(std::string CDROM,std::string Name,std::vector<std::string> &List, pkgCdromStatus *log); - virtual ~IndexCopy() {}; + virtual ~IndexCopy(); }; /*}}}*/ class PackageCopy : public IndexCopy /*{{{*/ @@ -93,8 +93,8 @@ class SigVerify /*{{{*/ /** \brief dpointer placeholder (for later in case we need it) */ void *d; - bool Verify(std::string prefix,std::string file, indexRecords *records); - bool CopyMetaIndex(std::string CDROM, std::string CDName, + APT_HIDDEN bool Verify(std::string prefix,std::string file, indexRecords *records); + APT_HIDDEN bool CopyMetaIndex(std::string CDROM, std::string CDName, std::string prefix, std::string file); public: diff --git a/apt-pkg/indexfile.h b/apt-pkg/indexfile.h index b5c9ac77e..817165f08 100644 --- a/apt-pkg/indexfile.h +++ b/apt-pkg/indexfile.h @@ -59,6 +59,7 @@ class pkgIndexFile const char *Label; virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator /*File*/) const {return 0;}; + virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string /*File*/) const {return 0;}; Type(); virtual ~Type() {}; }; diff --git a/apt-pkg/indexrecords.cc b/apt-pkg/indexrecords.cc index 5353d1098..d65266f64 100644 --- a/apt-pkg/indexrecords.cc +++ b/apt-pkg/indexrecords.cc @@ -37,6 +37,11 @@ APT_PURE string indexRecords::GetSuite() const return this->Suite; } +APT_PURE bool indexRecords::GetSupportsAcquireByHash() const +{ + return this->SupportsAcquireByHash; +} + APT_PURE bool indexRecords::CheckDist(const string MaybeDist) const { return (this->Dist == MaybeDist @@ -53,7 +58,7 @@ APT_PURE time_t indexRecords::GetValidUntil() const return this->ValidUntil; } -APT_PURE const indexRecords::checkSum *indexRecords::Lookup(const string MetaKey) +APT_PURE indexRecords::checkSum *indexRecords::Lookup(const string MetaKey) { std::map<std::string, indexRecords::checkSum* >::const_iterator sum = Entries.find(MetaKey); if (sum == Entries.end()) @@ -86,12 +91,14 @@ bool indexRecords::Load(const string Filename) /*{{{*/ strprintf(ErrorText, _("No sections in Release file %s"), Filename.c_str()); return false; } + // FIXME: find better tag name + SupportsAcquireByHash = Section.FindB("Acquire-By-Hash", false); Suite = Section.FindS("Suite"); Dist = Section.FindS("Codename"); - int i; - for (i=0;HashString::SupportedHashes()[i] != NULL; i++) + bool FoundHashSum = false; + for (int i=0;HashString::SupportedHashes()[i] != NULL; i++) { if (!Section.Find(HashString::SupportedHashes()[i], Start, End)) continue; @@ -103,16 +110,24 @@ bool indexRecords::Load(const string Filename) /*{{{*/ { if (!parseSumData(Start, End, Name, Hash, Size)) return false; - indexRecords::checkSum *Sum = new indexRecords::checkSum; - Sum->MetaKeyFilename = Name; - Sum->Hash = HashString(HashString::SupportedHashes()[i],Hash); - Sum->Size = Size; - Entries[Name] = Sum; + + if (Entries.find(Name) == Entries.end()) + { + indexRecords::checkSum *Sum = new indexRecords::checkSum; + Sum->MetaKeyFilename = Name; + Sum->Size = Size; + std::string SizeStr; + strprintf(SizeStr, "%llu", Size); + Sum->Hashes.push_back(HashString("Checksum-FileSize", SizeStr)); + APT_IGNORE_DEPRECATED(Sum->Hash = HashString(HashString::SupportedHashes()[i],Hash);) + Entries[Name] = Sum; + } + Entries[Name]->Hashes.push_back(HashString(HashString::SupportedHashes()[i],Hash)); + FoundHashSum = true; } - break; } - if(HashString::SupportedHashes()[i] == NULL) + if(FoundHashSum == false) { strprintf(ErrorText, _("No Hash entry in Release file %s"), Filename.c_str()); return false; @@ -234,11 +249,44 @@ bool indexRecords::parseSumData(const char *&Start, const char *End, /*{{{*/ return true; } /*}}}*/ -indexRecords::indexRecords() + +APT_PURE bool indexRecords::IsAlwaysTrusted() const +{ + if (Trusted == ALWAYS_TRUSTED) + return true; + return false; +} +APT_PURE bool indexRecords::IsNeverTrusted() const { + if (Trusted == NEVER_TRUSTED) + return true; + return false; +} +void indexRecords::SetTrusted(bool const Trusted) +{ + if (Trusted == true) + this->Trusted = ALWAYS_TRUSTED; + else + this->Trusted = NEVER_TRUSTED; } +#if APT_PKG_ABI >= 413 +indexRecords::indexRecords(const string &ExpectedDist) : + Trusted(CHECK_TRUST), d(NULL), ExpectedDist(ExpectedDist), ValidUntil(0), + SupportsAcquireByHash(false) +{ +} +#else +indexRecords::indexRecords() : + Trusted(CHECK_TRUST), d(NULL), ExpectedDist(""), ValidUntil(0), + SupportsAcquireByHash(false) +{ +} indexRecords::indexRecords(const string ExpectedDist) : - ExpectedDist(ExpectedDist), ValidUntil(0) + Trusted(CHECK_TRUST), d(NULL), ExpectedDist(ExpectedDist), ValidUntil(0), + SupportsAcquireByHash(false) { } +#endif + +indexRecords::~indexRecords() {} diff --git a/apt-pkg/indexrecords.h b/apt-pkg/indexrecords.h index e31f889ad..35e534c12 100644 --- a/apt-pkg/indexrecords.h +++ b/apt-pkg/indexrecords.h @@ -21,45 +21,74 @@ class indexRecords { - bool parseSumData(const char *&Start, const char *End, std::string &Name, + APT_HIDDEN bool parseSumData(const char *&Start, const char *End, std::string &Name, std::string &Hash, unsigned long long &Size); public: struct checkSum; std::string ErrorText; - + + private: + enum APT_HIDDEN { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted; + // dpointer (for later) + void * d; + protected: std::string Dist; std::string Suite; std::string ExpectedDist; time_t ValidUntil; + bool SupportsAcquireByHash; std::map<std::string,checkSum *> Entries; public: - +#if APT_PKG_ABI >= 413 + indexRecords(const std::string &ExpectedDist = ""); +#else indexRecords(); indexRecords(const std::string ExpectedDist); +#endif // Lookup function - virtual const checkSum *Lookup(const std::string MetaKey); + virtual checkSum *Lookup(const std::string MetaKey); /** \brief tests if a checksum for this file is available */ bool Exists(std::string const &MetaKey) const; std::vector<std::string> MetaKeys(); virtual bool Load(std::string Filename); + virtual bool CheckDist(const std::string MaybeDist) const; + std::string GetDist() const; std::string GetSuite() const; + bool GetSupportsAcquireByHash() const; time_t GetValidUntil() const; - virtual bool CheckDist(const std::string MaybeDist) const; std::string GetExpectedDist() const; - virtual ~indexRecords(){}; + + /** \brief check if source is marked as always trusted */ + bool IsAlwaysTrusted() const; + /** \brief check if source is marked as never trusted */ + bool IsNeverTrusted() const; + + /** \brief sets an explicit trust value + * + * \b true means that the source should always be considered trusted, + * while \b false marks a source as always untrusted, even if we have + * a valid signature and everything. + */ + void SetTrusted(bool const Trusted); + + virtual ~indexRecords(); }; +APT_IGNORE_DEPRECATED_PUSH struct indexRecords::checkSum { std::string MetaKeyFilename; - HashString Hash; + HashStringList Hashes; unsigned long long Size; + + APT_DEPRECATED HashString Hash; }; +APT_IGNORE_DEPRECATED_POP #endif diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index 241628632..f756eab26 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -88,9 +88,19 @@ bool pkgInitConfig(Configuration &Cnf) Cnf.Set("Dir::Ignore-Files-Silently::", "\\.orig$"); Cnf.Set("Dir::Ignore-Files-Silently::", "\\.distUpgrade$"); + // Repository security + // FIXME: this is set to "true" for backward compatibility, once + // jessie is out we want to change this to "false" to + // improve security + Cnf.CndSet("Acquire::AllowInsecureRepositories", true); + Cnf.CndSet("Acquire::AllowDowngradeToInsecureRepositories", false); + // Default cdrom mount point Cnf.CndSet("Acquire::cdrom::mount", "/media/cdrom/"); + // The default user we drop to in the methods + Cnf.CndSet("APT::Sandbox::User", "_apt"); + bool Res = true; // Read an alternate config file diff --git a/apt-pkg/install-progress.cc b/apt-pkg/install-progress.cc index cf6c85912..5ea8bf4d0 100644 --- a/apt-pkg/install-progress.cc +++ b/apt-pkg/install-progress.cc @@ -21,6 +21,8 @@ namespace APT { namespace Progress { +PackageManager::PackageManager() : d(NULL), percentage(0.0), last_reported_progress(-1) {} +PackageManager::~PackageManager() {} /* Return a APT::Progress::PackageManager based on the global * apt configuration (i.e. APT::Status-Fd and APT::Status-deb822-Fd) diff --git a/apt-pkg/install-progress.h b/apt-pkg/install-progress.h index 5d1a20e9b..d8b4a5c82 100644 --- a/apt-pkg/install-progress.h +++ b/apt-pkg/install-progress.h @@ -26,9 +26,8 @@ namespace Progress { int last_reported_progress; public: - PackageManager() - : percentage(0.0), last_reported_progress(-1) {}; - virtual ~PackageManager() {}; + PackageManager(); + virtual ~PackageManager(); /* Global Start/Stop */ virtual void Start(int /*child_pty*/=-1) {}; @@ -120,7 +119,7 @@ namespace Progress { class PackageManagerFancy : public PackageManager { private: - static void staticSIGWINCH(int); + APT_HIDDEN static void staticSIGWINCH(int); static std::vector<PackageManagerFancy*> instances; APT_HIDDEN bool DrawStatusLine(); diff --git a/apt-pkg/metaindex.cc b/apt-pkg/metaindex.cc new file mode 100644 index 000000000..31a8ec009 --- /dev/null +++ b/apt-pkg/metaindex.cc @@ -0,0 +1,40 @@ +// Include Files /*{{{*/ +#include <apt-pkg/indexfile.h> +#include <apt-pkg/metaindex.h> + +#include <stddef.h> + +#include <string> +#include <vector> + /*}}}*/ + +#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +std::string metaIndex::LocalFileName() const { return ""; } +#else +#include <apt-pkg/debmetaindex.h> +std::string metaIndex::LocalFileName() const +{ + debReleaseIndex const * deb = dynamic_cast<debReleaseIndex const*>(this); + if (deb != NULL) + return deb->LocalFileName(); + + return ""; +} +#endif + +metaIndex::metaIndex(std::string const &URI, std::string const &Dist, + char const * const Type) +: Indexes(NULL), Type(Type), URI(URI), Dist(Dist), Trusted(false) +{ + /* nothing */ +} + +metaIndex::~metaIndex() +{ + if (Indexes == 0) + return; + for (std::vector<pkgIndexFile *>::iterator I = (*Indexes).begin(); + I != (*Indexes).end(); ++I) + delete *I; + delete Indexes; +} diff --git a/apt-pkg/metaindex.h b/apt-pkg/metaindex.h index ffabaadbf..6c3d2880b 100644 --- a/apt-pkg/metaindex.h +++ b/apt-pkg/metaindex.h @@ -40,33 +40,22 @@ class metaIndex virtual const char* GetType() const {return Type;} // interface to to query it -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - // returns the path of the local file (or "" if its not available) - virtual std::string LocalFileName() const {return "";}; +#if APT_PKG_ABI >= 413 + /** \return the path of the local file (or "" if its not available) */ + virtual std::string LocalFileName() const; +#else + std::string LocalFileName() const; #endif // Interface for acquire virtual std::string ArchiveURI(std::string const& File) const = 0; virtual bool GetIndexes(pkgAcquire *Owner, bool const &GetAll=false) const = 0; - virtual std::vector<pkgIndexFile *> *GetIndexFiles() = 0; + virtual std::vector<pkgIndexFile *> *GetIndexFiles() = 0; virtual bool IsTrusted() const = 0; - metaIndex(std::string const &URI, std::string const &Dist, - char const * const Type) - : Indexes(NULL), Type(Type), URI(URI), Dist(Dist) - { - /* nothing */ - } - - virtual ~metaIndex() - { - if (Indexes == 0) - return; - for (std::vector<pkgIndexFile *>::iterator I = (*Indexes).begin(); - I != (*Indexes).end(); ++I) - delete *I; - delete Indexes; - } + metaIndex(std::string const &URI, std::string const &Dist, + char const * const Type); + virtual ~metaIndex(); }; #endif diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index 249542c68..d137dc75a 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -28,6 +28,7 @@ #include <apt-pkg/pkgcache.h> #include <apt-pkg/cacheiterators.h> #include <apt-pkg/strutl.h> +#include <apt-pkg/install-progress.h> #include <stddef.h> #include <list> @@ -399,7 +400,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) // Check if the current version of the package is available and will satisfy this dependency if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true && List->IsFlag(DepPkg,pkgOrderList::Removed) == false && - DepPkg.State() == PkgIterator::NeedsNothing) + DepPkg.State() == PkgIterator::NeedsNothing && + (Cache[DepPkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall) { Bad = false; break; @@ -412,8 +414,13 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) if (PkgLoop == true) { if (Debug) - std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl; - Bad = false; + std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure"; + if (List->IsFlag(DepPkg,pkgOrderList::UnPacked)) + Bad = false; + else if (Debug) + std::clog << ", but it isn't unpacked yet"; + if (Debug) + std::clog << std::endl; } } @@ -425,7 +432,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) if (Bad == false) { if (Debug) - std::clog << OutputInDepth(Depth) << "Found ok dep " << D.TargetPkg() << std::endl; + std::clog << OutputInDepth(Depth) << "Found ok dep " << Start.TargetPkg() << std::endl; continue; } @@ -443,7 +450,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) // Check if the current version of the package is available and will satisfy this dependency if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true && List->IsFlag(DepPkg,pkgOrderList::Removed) == false && - DepPkg.State() == PkgIterator::NeedsNothing) + DepPkg.State() == PkgIterator::NeedsNothing && + (Cache[DepPkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall) continue; // Check if the version that is going to be installed will satisfy the dependency @@ -453,8 +461,13 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) if (PkgLoop == true) { if (Debug) - std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl; - Bad = false; + std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure"; + if (List->IsFlag(DepPkg,pkgOrderList::UnPacked)) + Bad = false; + else if (Debug) + std::clog << ", but it isn't unpacked yet"; + if (Debug) + std::clog << std::endl; } else { @@ -721,7 +734,8 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c // See if the current version is ok if (Pkg.CurrentVer() == Ver && List->IsNow(Pkg) == true && - Pkg.State() == PkgIterator::NeedsNothing) + Pkg.State() == PkgIterator::NeedsNothing && + (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall) { Bad = false; if (Debug) @@ -743,8 +757,11 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c PkgIterator DepPkg = Ver.ParentPkg(); // Not the install version - if (Cache[DepPkg].InstallVer != *I || - (Cache[DepPkg].Keep() == true && DepPkg.State() == PkgIterator::NeedsNothing)) + if (Cache[DepPkg].InstallVer != *I) + continue; + + if (Cache[DepPkg].Keep() == true && DepPkg.State() == PkgIterator::NeedsNothing && + (Cache[DepPkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall) continue; if (List->IsFlag(DepPkg,pkgOrderList::Configured)) @@ -756,6 +773,16 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c // check if it needs unpack or if if configure is enough if (List->IsFlag(DepPkg,pkgOrderList::UnPacked) == false) { + // two packages pre-depending on each other can't be handled sanely + if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop) + { + // this isn't an error as there is potential for something else to satisfy it + // (like a provides or an or-group member) + if (Debug) + clog << OutputInDepth(Depth) << "Unpack loop detected between " << DepPkg.FullName() << " and " << Pkg.FullName() << endl; + continue; + } + if (Debug) clog << OutputInDepth(Depth) << "Trying to SmartUnpack " << DepPkg.FullName() << endl; if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false) @@ -842,7 +869,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c // but if it fails ignore this failure and look for alternative ways of solving if (Debug) { - clog << OutputInDepth(Depth) << "Avoidance unpack of " << ConflictPkg.FullName() << " failed for " << End << std::endl; + clog << OutputInDepth(Depth) << "Avoidance unpack of " << ConflictPkg.FullName() << " failed for " << End << " ignoring:" << std::endl; _error->DumpErrors(std::clog); } _error->RevertToStack(); @@ -1058,7 +1085,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() // PM::DoInstallPostFork - compat /*{{{*/ // --------------------------------------------------------------------- /*}}}*/ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 pkgPackageManager::OrderResult pkgPackageManager::DoInstallPostFork(int statusFd) { @@ -1079,7 +1106,7 @@ pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager *progress) return Failed; return Res; -}; +} #else pkgPackageManager::OrderResult pkgPackageManager::DoInstallPostFork(int statusFd) @@ -1095,7 +1122,7 @@ pkgPackageManager::DoInstallPostFork(int statusFd) // PM::DoInstall - Does the installation /*{{{*/ // --------------------------------------------------------------------- /* compat */ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd) { @@ -1119,7 +1146,7 @@ pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd) // --------------------------------------------------------------------- /* This uses the filenames in FileNames and the information in the DepCache to perform the installation of packages.*/ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 pkgPackageManager::OrderResult pkgPackageManager::DoInstall(APT::Progress::PackageManager *progress) { diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h index d72790b6e..fce0ad301 100644 --- a/apt-pkg/packagemanager.h +++ b/apt-pkg/packagemanager.h @@ -44,6 +44,11 @@ class pkgDepCache; class pkgSourceList; class pkgOrderList; class pkgRecords; +namespace APT { + namespace Progress { + class PackageManager; + } +} class pkgPackageManager : protected pkgCache::Namespace @@ -91,11 +96,10 @@ class pkgPackageManager : protected pkgCache::Namespace virtual bool Install(PkgIterator /*Pkg*/,std::string /*File*/) {return false;}; virtual bool Configure(PkgIterator /*Pkg*/) {return false;}; virtual bool Remove(PkgIterator /*Pkg*/,bool /*Purge*/=false) {return false;}; -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 virtual bool Go(APT::Progress::PackageManager * /*progress*/) {return true;}; -#else - virtual bool Go(int /*statusFd*/=-1) {return true;}; #endif + virtual bool Go(int /*statusFd*/=-1) {return true;}; virtual void Reset() {}; @@ -108,8 +112,8 @@ class pkgPackageManager : protected pkgCache::Namespace bool GetArchives(pkgAcquire *Owner,pkgSourceList *Sources, pkgRecords *Recs); - // Do the installation -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) + // Do the installation +#if APT_PKG_ABI >= 413 OrderResult DoInstall(APT::Progress::PackageManager *progress); // compat APT_DEPRECATED OrderResult DoInstall(int statusFd=-1); @@ -123,7 +127,7 @@ class pkgPackageManager : protected pkgCache::Namespace Res = OrderInstall(); return Res; }; -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 // stuff that needs to be done after the fork OrderResult DoInstallPostFork(APT::Progress::PackageManager *progress); // compat diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc index d7c9656b9..b42f7e228 100644 --- a/apt-pkg/pkgcache.cc +++ b/apt-pkg/pkgcache.cc @@ -54,12 +54,8 @@ pkgCache::Header::Header() /* Whenever the structures change the major version should be bumped, whenever the generator changes the minor version should be bumped. */ - MajorVersion = 8; -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) - MinorVersion = 2; -#else - MinorVersion = 1; -#endif + MajorVersion = 10; + MinorVersion = 0; Dirty = false; HeaderSz = sizeof(pkgCache::Header); @@ -86,11 +82,13 @@ pkgCache::Header::Header() MaxDescFileSize = 0; FileList = 0; - StringList = 0; +#if APT_PKG_ABI < 413 + APT_IGNORE_DEPRECATED(StringList = 0;) +#endif VerSysName = 0; Architecture = 0; - memset(PkgHashTable,0,sizeof(PkgHashTable)); - memset(GrpHashTable,0,sizeof(GrpHashTable)); + SetArchitectures(0); + SetHashTableSize(_config->FindI("APT::Cache-HashTableSize", 10 * 1048)); memset(Pools,0,sizeof(Pools)); CacheFileSize = 0; @@ -119,6 +117,7 @@ bool pkgCache::Header::CheckSizes(Header &Against) const // Cache::pkgCache - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ +APT_IGNORE_DEPRECATED_PUSH pkgCache::pkgCache(MMap *Map, bool DoMap) : Map(*Map) { // call getArchitectures() with cached=false to ensure that the @@ -128,6 +127,7 @@ pkgCache::pkgCache(MMap *Map, bool DoMap) : Map(*Map) if (DoMap == true) ReMap(); } +APT_IGNORE_DEPRECATED_POP /*}}}*/ // Cache::ReMap - Reopen the cache file /*{{{*/ // --------------------------------------------------------------------- @@ -145,7 +145,6 @@ bool pkgCache::ReMap(bool const &Errorchecks) DescP = (Description *)Map.Data(); ProvideP = (Provides *)Map.Data(); DepP = (Dependency *)Map.Data(); - StringItemP = (StringItem *)Map.Data(); StrP = (char *)Map.Data(); if (Errorchecks == false) @@ -168,15 +167,23 @@ bool pkgCache::ReMap(bool const &Errorchecks) if (Map.Size() < HeaderP->CacheFileSize) return _error->Error(_("The package cache file is corrupted, it is too small")); + if (HeaderP->VerSysName == 0 || HeaderP->Architecture == 0 || HeaderP->GetArchitectures() == 0) + return _error->Error(_("The package cache file is corrupted")); + // Locate our VS.. - if (HeaderP->VerSysName == 0 || - (VS = pkgVersioningSystem::GetVS(StrP + HeaderP->VerSysName)) == 0) + if ((VS = pkgVersioningSystem::GetVS(StrP + HeaderP->VerSysName)) == 0) return _error->Error(_("This APT does not support the versioning system '%s'"),StrP + HeaderP->VerSysName); - // Chcek the arhcitecture - if (HeaderP->Architecture == 0 || - _config->Find("APT::Architecture") != StrP + HeaderP->Architecture) - return _error->Error(_("The package cache was built for a different architecture")); + // Check the architecture + std::vector<std::string> archs = APT::Configuration::getArchitectures(); + std::vector<std::string>::const_iterator a = archs.begin(); + std::string list = *a; + for (++a; a != archs.end(); ++a) + list.append(",").append(*a); + if (_config->Find("APT::Architecture") != StrP + HeaderP->Architecture || + list != StrP + HeaderP->GetArchitectures()) + return _error->Error(_("The package cache was built for different architectures: %s vs %s"), StrP + HeaderP->GetArchitectures(), list.c_str()); + return true; } /*}}}*/ @@ -185,20 +192,20 @@ bool pkgCache::ReMap(bool const &Errorchecks) /* This is used to generate the hash entries for the HashTable. With my package list from bo this function gets 94% table usage on a 512 item table (480 used items) */ -unsigned long pkgCache::sHash(const string &Str) const +map_id_t pkgCache::sHash(const string &Str) const { unsigned long Hash = 0; for (string::const_iterator I = Str.begin(); I != Str.end(); ++I) Hash = 41 * Hash + tolower_ascii(*I); - return Hash % _count(HeaderP->PkgHashTable); + return Hash % HeaderP->GetHashTableSize(); } -unsigned long pkgCache::sHash(const char *Str) const +map_id_t pkgCache::sHash(const char *Str) const { unsigned long Hash = tolower_ascii(*Str); for (const char *I = Str + 1; *I != 0; ++I) Hash = 41 * Hash + tolower_ascii(*I); - return Hash % _count(HeaderP->PkgHashTable); + return Hash % HeaderP->GetHashTableSize(); } /*}}}*/ // Cache::SingleArchFindPkg - Locate a package by name /*{{{*/ @@ -209,13 +216,10 @@ unsigned long pkgCache::sHash(const char *Str) const pkgCache::PkgIterator pkgCache::SingleArchFindPkg(const string &Name) { // Look at the hash bucket - Package *Pkg = PkgP + HeaderP->PkgHashTable[Hash(Name)]; + Package *Pkg = PkgP + HeaderP->PkgHashTableP()[Hash(Name)]; for (; Pkg != PkgP; Pkg = PkgP + Pkg->NextPackage) { - if (unlikely(Pkg->Name == 0)) - continue; - - int const cmp = strcasecmp(Name.c_str(), StrP + Pkg->Name); + int const cmp = strcmp(Name.c_str(), StrP + (GrpP + Pkg->Group)->Name); if (cmp == 0) return PkgIterator(*this, Pkg); else if (cmp < 0) @@ -274,12 +278,9 @@ pkgCache::GrpIterator pkgCache::FindGrp(const string &Name) { return GrpIterator(*this,0); // Look at the hash bucket for the group - Group *Grp = GrpP + HeaderP->GrpHashTable[sHash(Name)]; + Group *Grp = GrpP + HeaderP->GrpHashTableP()[sHash(Name)]; for (; Grp != GrpP; Grp = GrpP + Grp->Next) { - if (unlikely(Grp->Name == 0)) - continue; - - int const cmp = strcasecmp(Name.c_str(), StrP + Grp->Name); + int const cmp = strcmp(Name.c_str(), StrP + Grp->Name); if (cmp == 0) return GrpIterator(*this, Grp); else if (cmp < 0) @@ -356,19 +357,15 @@ pkgCache::PkgIterator pkgCache::GrpIterator::FindPkg(string Arch) const { last one we check, so we do it now. */ if (Arch == "native" || Arch == myArch || Arch == "all") { pkgCache::Package *Pkg = Owner->PkgP + S->LastPackage; - if (strcasecmp(myArch, Owner->StrP + Pkg->Arch) == 0) + if (strcmp(myArch, Owner->StrP + Pkg->Arch) == 0) return PkgIterator(*Owner, Pkg); Arch = myArch; } - /* Iterate over the list to find the matching arch - unfortunately this list includes "package noise" - (= different packages with same calculated hash), - so we need to check the name also */ + // Iterate over the list to find the matching arch for (pkgCache::Package *Pkg = PackageList(); Pkg != Owner->PkgP; Pkg = Owner->PkgP + Pkg->NextPackage) { - if (S->Name == Pkg->Name && - stringcasecmp(Arch, Owner->StrP + Pkg->Arch) == 0) + if (stringcmp(Arch, Owner->StrP + Pkg->Arch) == 0) return PkgIterator(*Owner, Pkg); if ((Owner->PkgP + S->LastPackage) == Pkg) break; @@ -428,10 +425,10 @@ void pkgCache::GrpIterator::operator ++(int) S = Owner->GrpP + S->Next; // Follow the hash table - while (S == Owner->GrpP && (HashIndex+1) < (signed)_count(Owner->HeaderP->GrpHashTable)) + while (S == Owner->GrpP && (HashIndex+1) < (signed)Owner->HeaderP->GetHashTableSize()) { HashIndex++; - S = Owner->GrpP + Owner->HeaderP->GrpHashTable[HashIndex]; + S = Owner->GrpP + Owner->HeaderP->GrpHashTableP()[HashIndex]; } } /*}}}*/ @@ -445,10 +442,10 @@ void pkgCache::PkgIterator::operator ++(int) S = Owner->PkgP + S->NextPackage; // Follow the hash table - while (S == Owner->PkgP && (HashIndex+1) < (signed)_count(Owner->HeaderP->PkgHashTable)) + while (S == Owner->PkgP && (HashIndex+1) < (signed)Owner->HeaderP->GetHashTableSize()) { HashIndex++; - S = Owner->PkgP + Owner->HeaderP->PkgHashTable[HashIndex]; + S = Owner->PkgP + Owner->HeaderP->PkgHashTableP()[HashIndex]; } } /*}}}*/ @@ -1034,7 +1031,7 @@ bool pkgCache::PrvIterator::IsMultiArchImplicit() const { pkgCache::PkgIterator const Owner = OwnerPkg(); pkgCache::PkgIterator const Parent = ParentPkg(); - if (strcmp(Owner.Arch(), Parent.Arch()) != 0 || Owner->Name == Parent->Name) + if (strcmp(Owner.Arch(), Parent.Arch()) != 0 || Owner.Group()->Name == Parent.Group()->Name) return true; return false; } diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index 5e8a9630a..2ba23c5c0 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -79,11 +79,52 @@ #include <string> #include <time.h> +#include <stdint.h> #ifndef APT_8_CLEANER_HEADERS using std::string; #endif +#if APT_PKG_ABI >= 413 +// storing file sizes of indexes, which are way below 4 GB for now +typedef uint32_t map_filesize_t; +typedef map_filesize_t should_be_map_filesize_t; +#else +typedef unsigned long map_filesize_t; +typedef unsigned int should_be_map_filesize_t; +#endif +#if APT_PKG_ABI >= 413 +// each package/group/dependency gets an id +typedef uint32_t map_id_t; +typedef map_id_t should_be_map_id_t; +#else +typedef unsigned long map_id_t; +typedef unsigned int should_be_map_id_t; +#endif +#if APT_PKG_ABI >= 413 +// some files get an id, too, but in far less absolute numbers +typedef uint16_t map_fileid_t; +typedef map_fileid_t should_be_map_fileid_t; +#else +typedef unsigned long map_fileid_t; +typedef unsigned int should_be_map_fileid_t; +#endif +#if APT_PKG_ABI >= 413 +// relative pointer from cache start +typedef uint32_t map_pointer_t; +#else +typedef unsigned int map_pointer_t; +#endif +// same as the previous, but documented to be to a string item +typedef map_pointer_t map_stringitem_t; +#if APT_PKG_ABI >= 413 +typedef uint64_t should_be_uint64_t; +typedef uint64_t should_be_uint64_small_t; +#else +typedef unsigned long long should_be_uint64_t; +typedef unsigned long should_be_uint64_small_t; +#endif + class pkgVersioningSystem; class pkgCache /*{{{*/ { @@ -138,7 +179,7 @@ class pkgCache /*{{{*/ /** \brief priority of a package version Zero is used for unparsable or absent Priority fields. */ - enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5}; + enum VerPriority {Required=1,Important=2,Standard=3,Optional=4,Extra=5}; enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4}; enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3}; enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2, @@ -158,8 +199,8 @@ class pkgCache /*{{{*/ std::string CacheFile; MMap ⤅ - unsigned long sHash(const std::string &S) const APT_PURE; - unsigned long sHash(const char *S) const APT_PURE; + map_id_t sHash(const std::string &S) const APT_PURE; + map_id_t sHash(const char *S) const APT_PURE; public: @@ -174,7 +215,7 @@ class pkgCache /*{{{*/ Description *DescP; Provides *ProvideP; Dependency *DepP; - StringItem *StringItemP; + APT_DEPRECATED StringItem *StringItemP; char *StrP; virtual bool ReMap(bool const &Errorchecks = true); @@ -183,8 +224,8 @@ class pkgCache /*{{{*/ inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();} // String hashing function (512 range) - inline unsigned long Hash(const std::string &S) const {return sHash(S);} - inline unsigned long Hash(const char *S) const {return sHash(S);} + inline map_id_t Hash(const std::string &S) const {return sHash(S);} + inline map_id_t Hash(const char *S) const {return sHash(S);} // Useful transformation things const char *Priority(unsigned char Priority); @@ -218,7 +259,7 @@ class pkgCache /*{{{*/ private: bool MultiArchEnabled; - PkgIterator SingleArchFindPkg(const std::string &Name); + APT_HIDDEN PkgIterator SingleArchFindPkg(const std::string &Name); }; /*}}}*/ // Header structure /*{{{*/ @@ -263,35 +304,36 @@ struct pkgCache::Header These indicate the number of each structure contained in the cache. PackageCount is especially useful for generating user state structures. See Package::Id for more info. */ - unsigned long GroupCount; - unsigned long PackageCount; - unsigned long VersionCount; - unsigned long DescriptionCount; - unsigned long DependsCount; - unsigned long PackageFileCount; - unsigned long VerFileCount; - unsigned long DescFileCount; - unsigned long ProvidesCount; + map_id_t GroupCount; + map_id_t PackageCount; + map_id_t VersionCount; + map_id_t DescriptionCount; + map_id_t DependsCount; + map_fileid_t PackageFileCount; + map_fileid_t VerFileCount; + map_fileid_t DescFileCount; + map_id_t ProvidesCount; /** \brief index of the first PackageFile structure The PackageFile structures are singly linked lists that represent all package files that have been merged into the cache. */ - map_ptrloc FileList; - /** \brief index of the first StringItem structure - - The cache contains a list of all the unique strings (StringItems). - The parser reads this list into memory so it can match strings - against it.*/ - map_ptrloc StringList; + map_pointer_t FileList; +#if APT_PKG_ABI < 413 + APT_DEPRECATED map_pointer_t StringList; +#endif /** \brief String representing the version system used */ - map_ptrloc VerSysName; - /** \brief Architecture(s) the cache was built against */ - map_ptrloc Architecture; + map_pointer_t VerSysName; + /** \brief native architecture the cache was built against */ + map_pointer_t Architecture; +#if APT_PKG_ABI >= 413 + /** \brief all architectures the cache was built against */ + map_pointer_t Architectures; +#endif /** \brief The maximum size of a raw entry from the original Package file */ - unsigned long MaxVerFileSize; + map_filesize_t MaxVerFileSize; /** \brief The maximum size of a raw entry from the original Translation file */ - unsigned long MaxDescFileSize; + map_filesize_t MaxDescFileSize; /** \brief The Pool structures manage the allocation pools that the generator uses @@ -302,23 +344,37 @@ struct pkgCache::Header stores this information so future additions can make use of any unused pool blocks. */ DynamicMMap::Pool Pools[9]; - + /** \brief hash tables providing rapid group/package name lookup - Each group/package name is inserted into the hash table using pkgCache::Hash(const &string) + Each group/package name is inserted into a hash table using pkgCache::Hash(const &string) By iterating over each entry in the hash table it is possible to iterate over the entire list of packages. Hash Collisions are handled with a singly linked list of packages based at the hash item. The linked list contains only packages that match the hashing function. In the PkgHashTable is it possible that multiple packages have the same name - these packages are stored as a sequence in the list. - - Beware: The Hashmethod assumes that the hash table sizes are equal */ + The size of both tables is the same. */ +#if APT_PKG_ABI >= 413 + unsigned int HashTableSize; + unsigned int GetHashTableSize() const { return HashTableSize; } + void SetHashTableSize(unsigned int const sz) { HashTableSize = sz; } + map_pointer_t GetArchitectures() const { return Architectures; } + void SetArchitectures(map_pointer_t const idx) { Architectures = idx; } +#else + // BEWARE: these tables are pretty much empty and just here for abi compat map_ptrloc PkgHashTable[2*1048]; map_ptrloc GrpHashTable[2*1048]; + unsigned int GetHashTableSize() const { return PkgHashTable[0]; } + void SetHashTableSize(unsigned int const sz) { PkgHashTable[0] = sz; } + map_pointer_t GetArchitectures() const { return PkgHashTable[1]; } + void SetArchitectures(map_pointer_t const idx) { PkgHashTable[1] = idx; } +#endif + map_pointer_t * PkgHashTableP() const { return (map_pointer_t*) (this + 1); } + map_pointer_t * GrpHashTableP() const { return PkgHashTableP() + GetHashTableSize(); } /** \brief Size of the complete cache file */ - unsigned long CacheFileSize; + should_be_uint64_small_t CacheFileSize; bool CheckSizes(Header &Against) const APT_PURE; Header(); @@ -334,17 +390,17 @@ struct pkgCache::Header struct pkgCache::Group { /** \brief Name of the group */ - map_ptrloc Name; // StringItem + map_stringitem_t Name; // Linked List /** \brief Link to the first package which belongs to the group */ - map_ptrloc FirstPackage; // Package + map_pointer_t FirstPackage; // Package /** \brief Link to the last package which belongs to the group */ - map_ptrloc LastPackage; // Package + map_pointer_t LastPackage; // Package /** \brief Link to the next Group */ - map_ptrloc Next; // Group + map_pointer_t Next; // Group /** \brief unique sequel ID */ - unsigned int ID; + should_be_map_id_t ID; }; /*}}}*/ @@ -362,10 +418,13 @@ struct pkgCache::Group */ struct pkgCache::Package { - /** \brief Name of the package */ - map_ptrloc Name; // StringItem + /** \brief Name of the package + * Note that the access method Name() will remain. It is just this data member + * deprecated as this information is already stored and available via the + * associated Group – so it is wasting precious binary cache space */ + APT_DEPRECATED map_stringitem_t Name; /** \brief Architecture of the package */ - map_ptrloc Arch; // StringItem + map_stringitem_t Arch; /** \brief Base of a singly linked list of versions Each structure represents a unique version of the package. @@ -375,24 +434,25 @@ struct pkgCache::Package versions of a package can be cleanly handled by the system. Furthermore, this linked list is guaranteed to be sorted from Highest version to lowest version with no duplicate entries. */ - map_ptrloc VersionList; // Version + map_pointer_t VersionList; // Version /** \brief index to the installed version */ - map_ptrloc CurrentVer; // Version - /** \brief indicates the deduced section - - Should be the index to the string "Unknown" or to the section - of the last parsed item. */ - map_ptrloc Section; // StringItem + map_pointer_t CurrentVer; // Version + /** \brief indicates nothing (consistently) + This field used to contain ONE section the package belongs to, + if those differs between versions it is a RANDOM one. + The Section() method tries to reproduce it, but the only sane + thing to do is use the Section field from the version! */ + APT_DEPRECATED map_ptrloc Section; // StringItem /** \brief index of the group this package belongs to */ - map_ptrloc Group; // Group the Package belongs to + map_pointer_t Group; // Group the Package belongs to // Linked list /** \brief Link to the next package in the same bucket */ - map_ptrloc NextPackage; // Package + map_pointer_t NextPackage; // Package /** \brief List of all dependencies on this package */ - map_ptrloc RevDepends; // Dependency + map_pointer_t RevDepends; // Dependency /** \brief List of all "packages" this package provide */ - map_ptrloc ProvidesList; // Provides + map_pointer_t ProvidesList; // Provides // Install/Remove/Purge etc /** \brief state that the user wishes the package to be in */ @@ -412,7 +472,7 @@ struct pkgCache::Package This allows clients to create an array of size PackageCount and use it to store state information for the package map. For instance the status file emitter uses this to track which packages have been emitted already. */ - unsigned int ID; + should_be_map_id_t ID; /** \brief some useful indicators of the package's state */ unsigned long Flags; }; @@ -426,30 +486,30 @@ struct pkgCache::Package struct pkgCache::PackageFile { /** \brief physical disk file that this PackageFile represents */ - map_ptrloc FileName; // StringItem + map_stringitem_t FileName; /** \brief the release information Please see the files document for a description of what the release information means. */ - map_ptrloc Archive; // StringItem - map_ptrloc Codename; // StringItem - map_ptrloc Component; // StringItem - map_ptrloc Version; // StringItem - map_ptrloc Origin; // StringItem - map_ptrloc Label; // StringItem - map_ptrloc Architecture; // StringItem + map_stringitem_t Archive; + map_stringitem_t Codename; + map_stringitem_t Component; + map_stringitem_t Version; + map_stringitem_t Origin; + map_stringitem_t Label; + map_stringitem_t Architecture; /** \brief The site the index file was fetched from */ - map_ptrloc Site; // StringItem + map_stringitem_t Site; /** \brief indicates what sort of index file this is @TODO enumerate at least the possible indexes */ - map_ptrloc IndexType; // StringItem + map_stringitem_t IndexType; /** \brief Size of the file Used together with the modification time as a simple check to ensure that the Packages file has not been altered since Cache generation. */ - unsigned long Size; + map_filesize_t Size; /** \brief Modification time for the file */ time_t mtime; @@ -458,9 +518,9 @@ struct pkgCache::PackageFile // Linked list /** \brief Link to the next PackageFile in the Cache */ - map_ptrloc NextFile; // PackageFile + map_pointer_t NextFile; // PackageFile /** \brief unique sequel ID */ - unsigned int ID; + should_be_map_fileid_t ID; }; /*}}}*/ // VerFile structure /*{{{*/ @@ -471,13 +531,13 @@ struct pkgCache::PackageFile struct pkgCache::VerFile { /** \brief index of the package file that this version was found in */ - map_ptrloc File; // PackageFile + map_pointer_t File; // PackageFile /** \brief next step in the linked list */ - map_ptrloc NextFile; // PkgVerFile + map_pointer_t NextFile; // PkgVerFile /** \brief position in the package file */ - map_ptrloc Offset; // File offset + should_be_map_filesize_t Offset; // File offset /** @TODO document pkgCache::VerFile::Size */ - unsigned long Size; + map_filesize_t Size; }; /*}}}*/ // DescFile structure /*{{{*/ @@ -485,13 +545,13 @@ struct pkgCache::VerFile struct pkgCache::DescFile { /** \brief index of the file that this description was found in */ - map_ptrloc File; // PackageFile + map_pointer_t File; // PackageFile /** \brief next step in the linked list */ - map_ptrloc NextFile; // PkgVerFile + map_pointer_t NextFile; // PkgVerFile /** \brief position in the file */ - map_ptrloc Offset; // File offset + should_be_map_filesize_t Offset; // File offset /** @TODO document pkgCache::DescFile::Size */ - unsigned long Size; + map_filesize_t Size; }; /*}}}*/ // Version structure /*{{{*/ @@ -503,9 +563,17 @@ struct pkgCache::DescFile struct pkgCache::Version { /** \brief complete version string */ - map_ptrloc VerStr; // StringItem + map_stringitem_t VerStr; /** \brief section this version is filled in */ - map_ptrloc Section; // StringItem + map_stringitem_t Section; +#if APT_PKG_ABI >= 413 + /** \brief source package name this version comes from + Always contains the name, even if it is the same as the binary name */ + map_stringitem_t SourcePkgName; + /** \brief source version this version comes from + Always contains the version string, even if it is the same as the binary version */ + map_stringitem_t SourceVerStr; +#endif /** \brief Multi-Arch capabilities of a package version */ enum VerMultiArch { None = 0, /*!< is the default and doesn't trigger special behaviour */ @@ -527,33 +595,33 @@ struct pkgCache::Version applies to. If FileList is 0 then this is a blank version. The structure should also have a 0 in all other fields excluding pkgCache::Version::VerStr and Possibly pkgCache::Version::NextVer. */ - map_ptrloc FileList; // VerFile + map_pointer_t FileList; // VerFile /** \brief next (lower or equal) version in the linked list */ - map_ptrloc NextVer; // Version + map_pointer_t NextVer; // Version /** \brief next description in the linked list */ - map_ptrloc DescriptionList; // Description + map_pointer_t DescriptionList; // Description /** \brief base of the dependency list */ - map_ptrloc DependsList; // Dependency + map_pointer_t DependsList; // Dependency /** \brief links to the owning package This allows reverse dependencies to determine the package */ - map_ptrloc ParentPkg; // Package + map_pointer_t ParentPkg; // Package /** \brief list of pkgCache::Provides */ - map_ptrloc ProvidesList; // Provides + map_pointer_t ProvidesList; // Provides /** \brief archive size for this version For Debian this is the size of the .deb file. */ - unsigned long long Size; // These are the .deb size + should_be_uint64_t Size; // These are the .deb size /** \brief uncompressed size for this version */ - unsigned long long InstalledSize; + should_be_uint64_t InstalledSize; /** \brief characteristic value representing this version No two packages in existence should have the same VerStr and Hash with different contents. */ unsigned short Hash; /** \brief unique sequel ID */ - unsigned int ID; + should_be_map_id_t ID; /** \brief parsed priority value */ unsigned char Priority; }; @@ -566,22 +634,22 @@ struct pkgCache::Description If the value has a 0 length then this is read using the Package file else the Translation-CODE file is used. */ - map_ptrloc language_code; // StringItem + map_stringitem_t language_code; /** \brief MD5sum of the original description Used to map Translations of a description to a version and to check that the Translation is up-to-date. */ - map_ptrloc md5sum; // StringItem + map_stringitem_t md5sum; /** @TODO document pkgCache::Description::FileList */ - map_ptrloc FileList; // DescFile + map_pointer_t FileList; // DescFile /** \brief next translation for this description */ - map_ptrloc NextDesc; // Description + map_pointer_t NextDesc; // Description /** \brief the text is a description of this package */ - map_ptrloc ParentPkg; // Package + map_pointer_t ParentPkg; // Package /** \brief unique sequel ID */ - unsigned int ID; + should_be_map_id_t ID; }; /*}}}*/ // Dependency structure /*{{{*/ @@ -594,21 +662,21 @@ struct pkgCache::Description struct pkgCache::Dependency { /** \brief string of the version the dependency is applied against */ - map_ptrloc Version; // StringItem + map_stringitem_t Version; /** \brief index of the package this depends applies to The generator will - if the package does not already exist - create a blank (no version records) package. */ - map_ptrloc Package; // Package + map_pointer_t Package; // Package /** \brief next dependency of this version */ - map_ptrloc NextDepends; // Dependency + map_pointer_t NextDepends; // Dependency /** \brief next reverse dependency of this package */ - map_ptrloc NextRevDepends; // Dependency + map_pointer_t NextRevDepends; // Dependency /** \brief version of the package which has the reverse depends */ - map_ptrloc ParentVer; // Version + map_pointer_t ParentVer; // Version /** \brief unique sequel ID */ - map_ptrloc ID; + should_be_map_id_t ID; /** \brief Dependency type - Depends, Recommends, Conflicts, etc */ unsigned char Type; /** \brief comparison operator specified on the depends line @@ -629,31 +697,23 @@ struct pkgCache::Dependency struct pkgCache::Provides { /** \brief index of the package providing this */ - map_ptrloc ParentPkg; // Package + map_pointer_t ParentPkg; // Package /** \brief index of the version this provide line applies to */ - map_ptrloc Version; // Version + map_pointer_t Version; // Version /** \brief version in the provides line (if any) This version allows dependencies to depend on specific versions of a Provides, as well as allowing Provides to override existing packages. This is experimental. Note that Debian doesn't allow versioned provides */ - map_ptrloc ProvideVersion; // StringItem + map_stringitem_t ProvideVersion; /** \brief next provides (based of package) */ - map_ptrloc NextProvides; // Provides + map_pointer_t NextProvides; // Provides /** \brief next provides (based of version) */ - map_ptrloc NextPkgProv; // Provides + map_pointer_t NextPkgProv; // Provides }; /*}}}*/ -// StringItem structure /*{{{*/ -/** \brief used for generating single instances of strings - - Some things like Section Name are are useful to have as unique tags. - It is part of a linked list based at pkgCache::Header::StringList - - All strings are simply inlined any place in the file that is natural - for the writer. The client should make no assumptions about the positioning - of strings. All StringItems should be null-terminated. */ -struct pkgCache::StringItem +// UNUSED StringItem structure /*{{{*/ +struct APT_DEPRECATED pkgCache::StringItem { /** \brief string this refers to */ map_ptrloc String; // StringItem @@ -662,7 +722,6 @@ struct pkgCache::StringItem }; /*}}}*/ - inline char const * pkgCache::NativeArch() { return StrP + HeaderP->Architecture; } diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 810f0b022..ba454f057 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -57,8 +57,7 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) : FoundFileDeps(0) { CurrentFile = 0; - memset(UniqHash,0,sizeof(UniqHash)); - + if (_error->PendingError() == true) return; @@ -73,14 +72,35 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) : // Starting header *Cache.HeaderP = pkgCache::Header(); - map_ptrloc const idxVerSysName = WriteStringInMap(_system->VS->Label); + + // make room for the hashtables for packages and groups + if (Map.RawAllocate(2 * (Cache.HeaderP->GetHashTableSize() * sizeof(map_pointer_t))) == 0) + return; + + map_stringitem_t const idxVerSysName = WriteStringInMap(_system->VS->Label); + if (unlikely(idxVerSysName == 0)) + return; Cache.HeaderP->VerSysName = idxVerSysName; - // this pointer is set in ReMap, but we need it now for WriteUniqString - Cache.StringItemP = (pkgCache::StringItem *)Map.Data(); - map_ptrloc const idxArchitecture = WriteUniqString(_config->Find("APT::Architecture")); - Cache.HeaderP->Architecture = idxArchitecture; - if (unlikely(idxVerSysName == 0 || idxArchitecture == 0)) + map_stringitem_t const idxArchitecture = StoreString(MIXED, _config->Find("APT::Architecture")); + if (unlikely(idxArchitecture == 0)) return; + Cache.HeaderP->Architecture = idxArchitecture; + + std::vector<std::string> archs = APT::Configuration::getArchitectures(); + if (archs.size() > 1) + { + std::vector<std::string>::const_iterator a = archs.begin(); + std::string list = *a; + for (++a; a != archs.end(); ++a) + list.append(",").append(*a); + map_stringitem_t const idxArchitectures = WriteStringInMap(list); + if (unlikely(idxArchitectures == 0)) + return; + Cache.HeaderP->SetArchitectures(idxArchitectures); + } + else + Cache.HeaderP->SetArchitectures(idxArchitecture); + Cache.ReMap(); } else @@ -92,9 +112,9 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) : { _error->Error(_("Cache has an incompatible versioning system")); return; - } + } } - + Cache.HeaderP->Dirty = true; Map.Sync(0,sizeof(pkgCache::Header)); } @@ -126,10 +146,6 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM CurrentFile += (pkgCache::PackageFile const * const) newMap - (pkgCache::PackageFile const * const) oldMap; - for (size_t i = 0; i < _count(UniqHash); ++i) - if (UniqHash[i] != 0) - UniqHash[i] += (pkgCache::StringItem const * const) newMap - (pkgCache::StringItem const * const) oldMap; - for (std::vector<pkgCache::GrpIterator*>::const_iterator i = Dynamic<pkgCache::GrpIterator>::toReMap.begin(); i != Dynamic<pkgCache::GrpIterator>::toReMap.end(); ++i) (*i)->ReMap(oldMap, newMap); @@ -153,27 +169,27 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM (*i)->ReMap(oldMap, newMap); } /*}}}*/ // CacheGenerator::WriteStringInMap /*{{{*/ -map_ptrloc pkgCacheGenerator::WriteStringInMap(const char *String, +map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String, const unsigned long &Len) { void const * const oldMap = Map.Data(); - map_ptrloc const index = Map.WriteString(String, Len); + map_stringitem_t const index = Map.WriteString(String, Len); if (index != 0) ReMap(oldMap, Map.Data()); return index; } /*}}}*/ // CacheGenerator::WriteStringInMap /*{{{*/ -map_ptrloc pkgCacheGenerator::WriteStringInMap(const char *String) { +map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String) { void const * const oldMap = Map.Data(); - map_ptrloc const index = Map.WriteString(String); + map_stringitem_t const index = Map.WriteString(String); if (index != 0) ReMap(oldMap, Map.Data()); return index; } /*}}}*/ -map_ptrloc pkgCacheGenerator::AllocateInMap(const unsigned long &size) {/*{{{*/ +map_pointer_t pkgCacheGenerator::AllocateInMap(const unsigned long &size) {/*{{{*/ void const * const oldMap = Map.Data(); - map_ptrloc const index = Map.Allocate(size); + map_pointer_t const index = Map.Allocate(size); if (index != 0) ReMap(oldMap, Map.Data()); return index; @@ -253,16 +269,16 @@ bool pkgCacheGenerator::MergeList(ListParser &List, } } - if (Cache.HeaderP->PackageCount >= (1ULL<<sizeof(Cache.PkgP->ID)*8)-1) + if (Cache.HeaderP->PackageCount >= std::numeric_limits<map_id_t>::max()) return _error->Error(_("Wow, you exceeded the number of package " "names this APT is capable of.")); - if (Cache.HeaderP->VersionCount >= (1ULL<<(sizeof(Cache.VerP->ID)*8))-1) + if (Cache.HeaderP->VersionCount >= std::numeric_limits<map_id_t>::max()) 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) + if (Cache.HeaderP->DescriptionCount >= std::numeric_limits<map_id_t>::max()) 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) + if (Cache.HeaderP->DependsCount >= std::numeric_limits<map_id_t>::max()) return _error->Error(_("Wow, you exceeded the number of dependencies " "this APT is capable of.")); @@ -302,10 +318,9 @@ bool pkgCacheGenerator::MergeListPackage(ListParser &List, pkgCache::PkgIterator // Find the right version to write the description MD5SumValue CurMd5 = List.Description_md5(); - if (CurMd5.Value().empty() == true || List.Description().empty() == true) + if (CurMd5.Value().empty() == true && List.Description("").empty() == true) return true; - std::string CurLang = List.DescriptionLanguage(); - + std::vector<std::string> availDesc = List.AvailableDescriptionLanguages(); for (Ver = Pkg.VersionList(); Ver.end() == false; ++Ver) { pkgCache::DescIterator VerDesc = Ver.DescriptionList(); @@ -314,31 +329,16 @@ bool pkgCacheGenerator::MergeListPackage(ListParser &List, pkgCache::PkgIterator if (VerDesc.end() == true || MD5SumValue(VerDesc.md5()) != CurMd5) continue; - // don't add a new description if we have one for the given - // md5 && language - if (IsDuplicateDescription(VerDesc, CurMd5, CurLang) == true) - continue; - - pkgCache::DescIterator Desc; - Dynamic<pkgCache::DescIterator> DynDesc(Desc); - - map_ptrloc const descindex = NewDescription(Desc, CurLang, CurMd5, VerDesc->md5sum); - if (unlikely(descindex == 0 && _error->PendingError())) - return _error->Error(_("Error occurred while processing %s (%s%d)"), - Pkg.Name(), "NewDescription", 1); - - Desc->ParentPkg = Pkg.Index(); - - // we add at the end, so that the start is constant as we need - // that to be able to efficiently share these lists - VerDesc = Ver.DescriptionList(); // old value might be invalid after ReMap - for (;VerDesc.end() == false && VerDesc->NextDesc != 0; ++VerDesc); - map_ptrloc * const LastNextDesc = (VerDesc.end() == true) ? &Ver->DescriptionList : &VerDesc->NextDesc; - *LastNextDesc = descindex; + map_stringitem_t md5idx = VerDesc->md5sum; + for (std::vector<std::string>::const_iterator CurLang = availDesc.begin(); CurLang != availDesc.end(); ++CurLang) + { + // don't add a new description if we have one for the given + // md5 && language + if (IsDuplicateDescription(VerDesc, CurMd5, *CurLang) == true) + continue; - if (NewFileDesc(Desc,List) == false) - return _error->Error(_("Error occurred while processing %s (%s%d)"), - Pkg.Name(), "NewFileDesc", 1); + AddNewDescription(List, Ver, *CurLang, CurMd5, md5idx); + } // we can stop here as all "same" versions will share the description break; @@ -353,7 +353,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator { pkgCache::VerIterator Ver = Pkg.VersionList(); Dynamic<pkgCache::VerIterator> DynVer(Ver); - map_ptrloc *LastVer = &Pkg->VersionList; + map_pointer_t *LastVer = &Pkg->VersionList; void const * oldMap = Map.Data(); unsigned short const Hash = List.VersionHash(); @@ -362,7 +362,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator /* We know the list is sorted so we use that fact in the search. Insertion of new versions is done with correct sorting */ int Res = 1; - for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++) + for (; Ver.end() == false; LastVer = &Ver->NextVer, ++Ver) { Res = Cache.VS->CmpVersion(Version,Ver.VerStr()); // Version is higher as current version - insert here @@ -398,13 +398,13 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator } // Add a new version - map_ptrloc const verindex = NewVersion(Ver, Version, Pkg.Index(), Hash, *LastVer); + map_pointer_t const verindex = NewVersion(Ver, Version, Pkg.Index(), Hash, *LastVer); if (verindex == 0 && _error->PendingError()) return _error->Error(_("Error occurred while processing %s (%s%d)"), Pkg.Name(), "NewVersion", 1); if (oldMap != Map.Data()) - LastVer += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap; + LastVer += (map_pointer_t const * const) Map.Data() - (map_pointer_t const * const) oldMap; *LastVer = verindex; if (unlikely(List.NewVersion(Ver) == false)) @@ -465,7 +465,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator D.ParentPkg().Group() == Grp) continue; - map_ptrloc *OldDepLast = NULL; + map_pointer_t *OldDepLast = NULL; pkgCache::VerIterator ConVersion = D.ParentVer(); Dynamic<pkgCache::VerIterator> DynV(ConVersion); // duplicate the Conflicts/Breaks/Replaces for :none arch @@ -486,11 +486,10 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator return true; } - /* Record the Description (it is not translated) */ + /* Record the Description(s) based on their master md5sum */ MD5SumValue CurMd5 = List.Description_md5(); - if (CurMd5.Value().empty() == true || List.Description().empty() == true) + if (CurMd5.Value().empty() == true && List.Description("").empty() == true) return true; - std::string CurLang = List.DescriptionLanguage(); /* Before we add a new description we first search in the group for a version with a description of the same MD5 - if so we reuse this @@ -501,28 +500,44 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V) { - if (IsDuplicateDescription(V.DescriptionList(), CurMd5, "") == false) + if (V->DescriptionList == 0 || MD5SumValue(V.DescriptionList().md5()) != CurMd5) continue; Ver->DescriptionList = V->DescriptionList; - return true; } } - // We haven't found reusable descriptions, so add the first description - pkgCache::DescIterator Desc = Ver.DescriptionList(); + // We haven't found reusable descriptions, so add the first description(s) + map_stringitem_t md5idx = Ver->DescriptionList == 0 ? 0 : Ver.DescriptionList()->md5sum; + std::vector<std::string> availDesc = List.AvailableDescriptionLanguages(); + for (std::vector<std::string>::const_iterator CurLang = availDesc.begin(); CurLang != availDesc.end(); ++CurLang) + if (AddNewDescription(List, Ver, *CurLang, CurMd5, md5idx) == false) + return false; + return true; +} + /*}}}*/ +bool pkgCacheGenerator::AddNewDescription(ListParser &List, pkgCache::VerIterator &Ver, std::string const &lang, MD5SumValue const &CurMd5, map_stringitem_t &md5idx) /*{{{*/ +{ + pkgCache::DescIterator Desc; Dynamic<pkgCache::DescIterator> DynDesc(Desc); - map_ptrloc const descindex = NewDescription(Desc, CurLang, CurMd5, 0); + map_pointer_t const descindex = NewDescription(Desc, lang, CurMd5, md5idx); if (unlikely(descindex == 0 && _error->PendingError())) return _error->Error(_("Error occurred while processing %s (%s%d)"), - Pkg.Name(), "NewDescription", 2); + Ver.ParentPkg().Name(), "NewDescription", 1); - Desc->ParentPkg = Pkg.Index(); - Ver->DescriptionList = descindex; + md5idx = Desc->md5sum; + Desc->ParentPkg = Ver.ParentPkg().Index(); + + // we add at the end, so that the start is constant as we need + // that to be able to efficiently share these lists + pkgCache::DescIterator VerDesc = Ver.DescriptionList(); // old value might be invalid after ReMap + for (;VerDesc.end() == false && VerDesc->NextDesc != 0; ++VerDesc); + map_pointer_t * const LastNextDesc = (VerDesc.end() == true) ? &Ver->DescriptionList : &VerDesc->NextDesc; + *LastNextDesc = descindex; if (NewFileDesc(Desc,List) == false) return _error->Error(_("Error occurred while processing %s (%s%d)"), - Pkg.Name(), "NewFileDesc", 2); + Ver.ParentPkg().Name(), "NewFileDesc", 1); return true; } @@ -589,19 +604,19 @@ bool pkgCacheGenerator::NewGroup(pkgCache::GrpIterator &Grp, const string &Name) return true; // Get a structure - map_ptrloc const Group = AllocateInMap(sizeof(pkgCache::Group)); + map_pointer_t const Group = AllocateInMap(sizeof(pkgCache::Group)); if (unlikely(Group == 0)) return false; Grp = pkgCache::GrpIterator(Cache, Cache.GrpP + Group); - map_ptrloc const idxName = WriteStringInMap(Name); + map_stringitem_t const idxName = StoreString(PKGNAME, Name); if (unlikely(idxName == 0)) return false; Grp->Name = idxName; // Insert it into the hash table unsigned long const Hash = Cache.Hash(Name); - map_ptrloc *insertAt = &Cache.HeaderP->GrpHashTable[Hash]; + map_pointer_t *insertAt = &Cache.HeaderP->GrpHashTableP()[Hash]; while (*insertAt != 0 && strcasecmp(Name.c_str(), Cache.StrP + (Cache.GrpP + *insertAt)->Name) > 0) insertAt = &(Cache.GrpP + *insertAt)->Next; Grp->Next = *insertAt; @@ -626,7 +641,7 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name return true; // Get a structure - map_ptrloc const Package = AllocateInMap(sizeof(pkgCache::Package)); + map_pointer_t const Package = AllocateInMap(sizeof(pkgCache::Package)); if (unlikely(Package == 0)) return false; Pkg = pkgCache::PkgIterator(Cache,Cache.PkgP + Package); @@ -636,9 +651,9 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name { Grp->FirstPackage = Package; // Insert it into the hash table - unsigned long const Hash = Cache.Hash(Name); - map_ptrloc *insertAt = &Cache.HeaderP->PkgHashTable[Hash]; - while (*insertAt != 0 && strcasecmp(Name.c_str(), Cache.StrP + (Cache.PkgP + *insertAt)->Name) > 0) + map_id_t const Hash = Cache.Hash(Name); + map_pointer_t *insertAt = &Cache.HeaderP->PkgHashTableP()[Hash]; + while (*insertAt != 0 && strcasecmp(Name.c_str(), Cache.StrP + (Cache.GrpP + (Cache.PkgP + *insertAt)->Group)->Name) > 0) insertAt = &(Cache.PkgP + *insertAt)->NextPackage; Pkg->NextPackage = *insertAt; *insertAt = Package; @@ -653,10 +668,10 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name Grp->LastPackage = Package; // Set the name, arch and the ID - Pkg->Name = Grp->Name; + APT_IGNORE_DEPRECATED(Pkg->Name = Grp->Name;) Pkg->Group = Grp.Index(); // all is mapped to the native architecture - map_ptrloc const idxArch = (Arch == "all") ? Cache.HeaderP->Architecture : WriteUniqString(Arch.c_str()); + map_stringitem_t const idxArch = (Arch == "all") ? Cache.HeaderP->Architecture : StoreString(MIXED, Arch); if (unlikely(idxArch == 0)) return false; Pkg->Arch = idxArch; @@ -673,14 +688,14 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::GrpIterator &G, // copy P.Arch() into a string here as a cache remap // in NewDepends() later may alter the pointer location string Arch = P.Arch() == NULL ? "" : P.Arch(); - map_ptrloc *OldDepLast = NULL; + map_pointer_t *OldDepLast = NULL; /* MultiArch handling introduces a lot of implicit Dependencies: - MultiArch: same → Co-Installable if they have the same version - All others conflict with all other group members */ bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same); pkgCache::PkgIterator D = G.PackageList(); Dynamic<pkgCache::PkgIterator> DynD(D); - map_ptrloc const VerStrIdx = V->VerStr; + map_stringitem_t const VerStrIdx = V->VerStr; for (; D.end() != true; D = G.NextPkg(D)) { if (Arch == D.Arch() || D->VersionList == 0) @@ -713,11 +728,11 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::VerIterator &V, /* MultiArch handling introduces a lot of implicit Dependencies: - MultiArch: same → Co-Installable if they have the same version - All others conflict with all other group members */ - map_ptrloc *OldDepLast = NULL; + map_pointer_t *OldDepLast = NULL; bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same); if (coInstall == true) { - map_ptrloc const VerStrIdx = V->VerStr; + map_stringitem_t const VerStrIdx = V->VerStr; // Replaces: ${self}:other ( << ${binary:Version}) NewDepends(D, V, VerStrIdx, pkgCache::Dep::Less, pkgCache::Dep::Replaces, @@ -746,15 +761,15 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver, return true; // Get a structure - map_ptrloc const VerFile = AllocateInMap(sizeof(pkgCache::VerFile)); + map_pointer_t const VerFile = AllocateInMap(sizeof(pkgCache::VerFile)); if (VerFile == 0) - return 0; + return false; pkgCache::VerFileIterator VF(Cache,Cache.VerFileP + VerFile); VF->File = CurrentFile - Cache.PkgFileP; // Link it to the end of the list - map_ptrloc *Last = &Ver->FileList; + map_pointer_t *Last = &Ver->FileList; for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; ++V) Last = &V->NextFile; VF->NextFile = *Last; @@ -772,14 +787,14 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver, // CacheGenerator::NewVersion - Create a new Version /*{{{*/ // --------------------------------------------------------------------- /* This puts a version structure in the linked list */ -unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver, +map_pointer_t pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver, const string &VerStr, - map_ptrloc const ParentPkg, - unsigned long const Hash, - unsigned long Next) + map_pointer_t const ParentPkg, + unsigned short const Hash, + map_pointer_t const Next) { // Get a structure - map_ptrloc const Version = AllocateInMap(sizeof(pkgCache::Version)); + map_pointer_t const Version = AllocateInMap(sizeof(pkgCache::Version)); if (Version == 0) return 0; @@ -814,7 +829,7 @@ unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver, } } // haven't found the version string, so create - map_ptrloc const idxVerStr = WriteStringInMap(VerStr); + map_stringitem_t const idxVerStr = StoreString(VERSIONNUMBER, VerStr); if (unlikely(idxVerStr == 0)) return 0; Ver->VerStr = idxVerStr; @@ -831,7 +846,7 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc, return true; // Get a structure - map_ptrloc const DescFile = AllocateInMap(sizeof(pkgCache::DescFile)); + map_pointer_t const DescFile = AllocateInMap(sizeof(pkgCache::DescFile)); if (DescFile == 0) return false; @@ -839,7 +854,7 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc, DF->File = CurrentFile - Cache.PkgFileP; // Link it to the end of the list - map_ptrloc *Last = &Desc->FileList; + map_pointer_t *Last = &Desc->FileList; for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; ++D) Last = &D->NextFile; @@ -858,20 +873,20 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc, // CacheGenerator::NewDescription - Create a new Description /*{{{*/ // --------------------------------------------------------------------- /* This puts a description structure in the linked list */ -map_ptrloc pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc, +map_pointer_t pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc, const string &Lang, const MD5SumValue &md5sum, - map_ptrloc idxmd5str) + map_stringitem_t const idxmd5str) { // Get a structure - map_ptrloc const Description = AllocateInMap(sizeof(pkgCache::Description)); + map_pointer_t const Description = AllocateInMap(sizeof(pkgCache::Description)); if (Description == 0) return 0; // Fill it in Desc = pkgCache::DescIterator(Cache,Cache.DescP + Description); Desc->ID = Cache.HeaderP->DescriptionCount++; - map_ptrloc const idxlanguage_code = WriteUniqString(Lang); + map_stringitem_t const idxlanguage_code = StoreString(MIXED, Lang); if (unlikely(idxlanguage_code == 0)) return 0; Desc->language_code = idxlanguage_code; @@ -880,7 +895,7 @@ map_ptrloc pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc, Desc->md5sum = idxmd5str; else { - map_ptrloc const idxmd5sum = WriteStringInMap(md5sum.Value()); + map_stringitem_t const idxmd5sum = WriteStringInMap(md5sum.Value()); if (unlikely(idxmd5sum == 0)) return 0; Desc->md5sum = idxmd5sum; @@ -898,9 +913,9 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg, string const &Version, unsigned int const &Op, unsigned int const &Type, - map_ptrloc* &OldDepLast) + map_stringitem_t* &OldDepLast) { - map_ptrloc index = 0; + map_stringitem_t index = 0; if (Version.empty() == false) { int const CmpOp = Op & 0x0F; @@ -911,25 +926,25 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg, if (index == 0) { void const * const oldMap = Map.Data(); - index = WriteStringInMap(Version); + index = StoreString(VERSIONNUMBER, Version); if (unlikely(index == 0)) return false; if (OldDepLast != 0 && oldMap != Map.Data()) - OldDepLast += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap; + OldDepLast += (map_pointer_t const * const) Map.Data() - (map_pointer_t const * const) oldMap; } } return NewDepends(Pkg, Ver, index, Op, Type, OldDepLast); } bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver, - map_ptrloc const Version, + map_pointer_t const Version, unsigned int const &Op, unsigned int const &Type, - map_ptrloc* &OldDepLast) + map_pointer_t* &OldDepLast) { void const * const oldMap = Map.Data(); // Get a structure - map_ptrloc const Dependency = AllocateInMap(sizeof(pkgCache::Dependency)); + map_pointer_t const Dependency = AllocateInMap(sizeof(pkgCache::Dependency)); if (unlikely(Dependency == 0)) return false; @@ -954,7 +969,7 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg, for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; ++D) OldDepLast = &D->NextDepends; } else if (oldMap != Map.Data()) - OldDepLast += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap; + OldDepLast += (map_pointer_t const * const) Map.Data() - (map_pointer_t const * const) oldMap; Dep->NextDepends = *OldDepLast; *OldDepLast = Dep.Index(); @@ -1019,7 +1034,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver, return true; // Get a structure - map_ptrloc const Provides = Owner->AllocateInMap(sizeof(pkgCache::Provides)); + map_pointer_t const Provides = Owner->AllocateInMap(sizeof(pkgCache::Provides)); if (unlikely(Provides == 0)) return false; Cache.HeaderP->ProvidesCount++; @@ -1031,7 +1046,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver, Prv->NextPkgProv = Ver->ProvidesList; Ver->ProvidesList = Prv.Index(); if (Version.empty() == false) { - map_ptrloc const idxProvideVersion = WriteString(Version); + map_stringitem_t const idxProvideVersion = WriteString(Version); Prv->ProvideVersion = idxProvideVersion; if (unlikely(idxProvideVersion == 0)) return false; @@ -1066,14 +1081,14 @@ bool pkgCacheGenerator::SelectFile(const string &File,const string &Site, unsigned long Flags) { // Get some space for the structure - map_ptrloc const idxFile = AllocateInMap(sizeof(*CurrentFile)); + map_pointer_t const idxFile = AllocateInMap(sizeof(*CurrentFile)); if (unlikely(idxFile == 0)) return false; CurrentFile = Cache.PkgFileP + idxFile; // Fill it in - map_ptrloc const idxFileName = WriteStringInMap(File); - map_ptrloc const idxSite = WriteUniqString(Site); + map_stringitem_t const idxFileName = WriteStringInMap(File); + map_stringitem_t const idxSite = StoreString(MIXED, Site); if (unlikely(idxFileName == 0 || idxSite == 0)) return false; CurrentFile->FileName = idxFileName; @@ -1081,7 +1096,7 @@ bool pkgCacheGenerator::SelectFile(const string &File,const string &Site, CurrentFile->NextFile = Cache.HeaderP->FileList; CurrentFile->Flags = Flags; CurrentFile->ID = Cache.HeaderP->PackageFileCount; - map_ptrloc const idxIndexType = WriteUniqString(Index.GetType()->Label); + map_stringitem_t const idxIndexType = StoreString(MIXED, Index.GetType()->Label); if (unlikely(idxIndexType == 0)) return false; CurrentFile->IndexType = idxIndexType; @@ -1098,57 +1113,27 @@ bool pkgCacheGenerator::SelectFile(const string &File,const string &Site, // --------------------------------------------------------------------- /* This is used to create handles to strings. Given the same text it always returns the same number */ -unsigned long pkgCacheGenerator::WriteUniqString(const char *S, +map_stringitem_t pkgCacheGenerator::StoreString(enum StringType const type, const char *S, unsigned int Size) { - /* We use a very small transient hash table here, this speeds up generation - by a fair amount on slower machines */ - pkgCache::StringItem *&Bucket = UniqHash[(S[0]*5 + S[1]) % _count(UniqHash)]; - if (Bucket != 0 && - stringcmp(S,S+Size,Cache.StrP + Bucket->String) == 0) - return Bucket->String; - - // Search for an insertion point - pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList; - int Res = 1; - map_ptrloc *Last = &Cache.HeaderP->StringList; - for (; I != Cache.StringItemP; Last = &I->NextItem, - I = Cache.StringItemP + I->NextItem) - { - Res = stringcmp(S,S+Size,Cache.StrP + I->String); - if (Res >= 0) - break; - } - - // Match - if (Res == 0) - { - Bucket = I; - return I->String; - } - - // Get a structure - void const * const oldMap = Map.Data(); - map_ptrloc const Item = AllocateInMap(sizeof(pkgCache::StringItem)); - if (Item == 0) - return 0; - - map_ptrloc const idxString = WriteStringInMap(S,Size); - if (unlikely(idxString == 0)) - return 0; - if (oldMap != Map.Data()) { - Last += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap; - I += (pkgCache::StringItem const * const) Map.Data() - (pkgCache::StringItem const * const) oldMap; + std::string const key(S, Size); + + std::map<std::string,map_stringitem_t> * strings; + switch(type) { + case MIXED: strings = &strMixed; break; + case PKGNAME: strings = &strPkgNames; break; + case VERSIONNUMBER: strings = &strVersions; break; + case SECTION: strings = &strSections; break; + default: _error->Fatal("Unknown enum type used for string storage of '%s'", key.c_str()); return 0; } - *Last = Item; - // Fill in the structure - pkgCache::StringItem *ItemP = Cache.StringItemP + Item; - ItemP->NextItem = I - Cache.StringItemP; - ItemP->String = idxString; + std::map<std::string,map_stringitem_t>::const_iterator const item = strings->find(key); + if (item != strings->end()) + return item->second; - Bucket = ItemP; - return ItemP->String; + map_stringitem_t const idxString = WriteStringInMap(S,Size); + strings->insert(std::make_pair(key, idxString)); + return idxString; } /*}}}*/ // CheckValidity - Check that a cache is up-to-date /*{{{*/ @@ -1258,9 +1243,9 @@ static bool CheckValidity(const string &CacheFile, // --------------------------------------------------------------------- /* Size is kind of an abstract notion that is only used for the progress meter */ -static unsigned long ComputeSize(FileIterator Start,FileIterator End) +static map_filesize_t ComputeSize(FileIterator Start,FileIterator End) { - unsigned long TotalSize = 0; + map_filesize_t TotalSize = 0; for (; Start < End; ++Start) { if ((*Start)->HasPackages() == false) @@ -1275,7 +1260,7 @@ static unsigned long ComputeSize(FileIterator Start,FileIterator End) /* */ static bool BuildCache(pkgCacheGenerator &Gen, OpProgress *Progress, - unsigned long &CurrentSize,unsigned long TotalSize, + map_filesize_t &CurrentSize,map_filesize_t TotalSize, FileIterator Start, FileIterator End) { FileIterator I; @@ -1294,7 +1279,7 @@ static bool BuildCache(pkgCacheGenerator &Gen, continue; } - unsigned long Size = (*I)->Size(); + map_filesize_t Size = (*I)->Size(); if (Progress != NULL) Progress->OverallProgress(CurrentSize,TotalSize,Size,_("Reading package lists")); CurrentSize += Size; @@ -1311,7 +1296,7 @@ static bool BuildCache(pkgCacheGenerator &Gen, CurrentSize = 0; for (I = Start; I != End; ++I) { - unsigned long Size = (*I)->Size(); + map_filesize_t Size = (*I)->Size(); if (Progress != NULL) Progress->OverallProgress(CurrentSize,TotalSize,Size,_("Collecting File Provides")); CurrentSize += Size; @@ -1325,9 +1310,9 @@ static bool BuildCache(pkgCacheGenerator &Gen, /*}}}*/ // CacheGenerator::CreateDynamicMMap - load an mmap with configuration options /*{{{*/ DynamicMMap* pkgCacheGenerator::CreateDynamicMMap(FileFd *CacheF, unsigned long Flags) { - unsigned long const MapStart = _config->FindI("APT::Cache-Start", 24*1024*1024); - unsigned long const MapGrow = _config->FindI("APT::Cache-Grow", 1*1024*1024); - unsigned long const MapLimit = _config->FindI("APT::Cache-Limit", 0); + map_filesize_t const MapStart = _config->FindI("APT::Cache-Start", 24*1024*1024); + map_filesize_t const MapGrow = _config->FindI("APT::Cache-Grow", 1*1024*1024); + map_filesize_t const MapLimit = _config->FindI("APT::Cache-Limit", 0); Flags |= MMap::Moveable; if (_config->FindB("APT::Cache-Fallback", false) == true) Flags |= MMap::Fallback; @@ -1365,7 +1350,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress Files.push_back (*j); } - unsigned long const EndOfSource = Files.size(); + map_filesize_t const EndOfSource = Files.size(); if (_system->AddStatusFiles(Files) == false) return false; @@ -1455,8 +1440,8 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress } // Lets try the source cache. - unsigned long CurrentSize = 0; - unsigned long TotalSize = 0; + map_filesize_t CurrentSize = 0; + map_filesize_t TotalSize = 0; if (CheckValidity(SrcCacheFile, List, Files.begin(), Files.begin()+EndOfSource) == true) { @@ -1464,7 +1449,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress std::clog << "srcpkgcache.bin is valid - populate MMap with it." << std::endl; // Preload the map with the source cache FileFd SCacheF(SrcCacheFile,FileFd::ReadOnly); - unsigned long const alloc = Map->RawAllocate(SCacheF.Size()); + map_pointer_t const alloc = Map->RawAllocate(SCacheF.Size()); if ((alloc == 0 && _error->PendingError()) || SCacheF.Read((unsigned char *)Map->Data() + alloc, SCacheF.Size()) == false) @@ -1551,13 +1536,13 @@ APT_DEPRECATED bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **Ou bool pkgCacheGenerator::MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap) { std::vector<pkgIndexFile *> Files; - unsigned long EndOfSource = Files.size(); + map_filesize_t EndOfSource = Files.size(); if (_system->AddStatusFiles(Files) == false) return false; SPtr<DynamicMMap> Map = CreateDynamicMMap(NULL); - unsigned long CurrentSize = 0; - unsigned long TotalSize = 0; + map_filesize_t CurrentSize = 0; + map_filesize_t TotalSize = 0; TotalSize = ComputeSize(Files.begin()+EndOfSource,Files.end()); diff --git a/apt-pkg/pkgcachegen.h b/apt-pkg/pkgcachegen.h index 1e1a71026..c4ace713d 100644 --- a/apt-pkg/pkgcachegen.h +++ b/apt-pkg/pkgcachegen.h @@ -27,21 +27,25 @@ #include <vector> #include <string> +#include <map> class FileFd; class pkgSourceList; class OpProgress; class pkgIndexFile; -class pkgCacheGenerator /*{{{*/ +class APT_HIDDEN pkgCacheGenerator /*{{{*/ { private: + APT_HIDDEN map_stringitem_t WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); }; + APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String); + APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String, const unsigned long &Len); + APT_HIDDEN map_pointer_t AllocateInMap(const unsigned long &size); - pkgCache::StringItem *UniqHash[26]; - APT_HIDDEN map_ptrloc WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); }; - APT_HIDDEN map_ptrloc WriteStringInMap(const char *String); - APT_HIDDEN map_ptrloc WriteStringInMap(const char *String, const unsigned long &Len); - APT_HIDDEN map_ptrloc AllocateInMap(const unsigned long &size); + std::map<std::string,map_stringitem_t> strMixed; + std::map<std::string,map_stringitem_t> strSections; + std::map<std::string,map_stringitem_t> strPkgNames; + std::map<std::string,map_stringitem_t> strVersions; public: @@ -78,21 +82,22 @@ class pkgCacheGenerator /*{{{*/ bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List); bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver, std::string const &Version, unsigned int const &Op, - unsigned int const &Type, map_ptrloc* &OldDepLast); + unsigned int const &Type, map_pointer_t* &OldDepLast); bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver, - map_ptrloc const Version, unsigned int const &Op, - unsigned int const &Type, map_ptrloc* &OldDepLast); - unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,unsigned long Next) APT_DEPRECATED + map_pointer_t const Version, unsigned int const &Op, + unsigned int const &Type, map_pointer_t* &OldDepLast); + map_pointer_t NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,map_pointer_t const Next) APT_DEPRECATED { return NewVersion(Ver, VerStr, 0, 0, Next); } - unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr, - map_ptrloc const ParentPkg, unsigned long const Hash, - unsigned long Next); - map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_ptrloc Next); + map_pointer_t NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr, + map_pointer_t const ParentPkg, unsigned short const Hash, + map_pointer_t const Next); + map_pointer_t NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_stringitem_t const idxmd5str); public: - unsigned long WriteUniqString(const char *S,unsigned int Size); - inline unsigned long WriteUniqString(const std::string &S) {return WriteUniqString(S.c_str(),S.length());}; + enum StringType { MIXED, PKGNAME, VERSIONNUMBER, SECTION }; + map_stringitem_t StoreString(StringType const type, const char * S, unsigned int const Size); + inline map_stringitem_t StoreString(enum StringType const type, const std::string &S) {return StoreString(type, S.c_str(),S.length());}; void DropProgress() {Progress = 0;}; bool SelectFile(const std::string &File,const std::string &Site,pkgIndexFile const &Index, @@ -106,10 +111,10 @@ class pkgCacheGenerator /*{{{*/ bool MergeFileProvides(ListParser &List); bool FinishCache(OpProgress *Progress) APT_DEPRECATED APT_CONST; - static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress, + APT_PUBLIC static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress, MMap **OutMap = 0,bool AllowMem = false); - static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap); - static DynamicMMap* CreateDynamicMMap(FileFd *CacheF, unsigned long Flags = 0); + APT_PUBLIC static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap); + APT_PUBLIC static DynamicMMap* CreateDynamicMMap(FileFd *CacheF, unsigned long Flags = 0); void ReMap(void const * const oldMap, void const * const newMap); @@ -125,27 +130,31 @@ class pkgCacheGenerator /*{{{*/ APT_HIDDEN bool AddImplicitDepends(pkgCache::GrpIterator &G, pkgCache::PkgIterator &P, pkgCache::VerIterator &V); APT_HIDDEN bool AddImplicitDepends(pkgCache::VerIterator &V, pkgCache::PkgIterator &D); + + APT_HIDDEN bool AddNewDescription(ListParser &List, pkgCache::VerIterator &Ver, + std::string const &lang, MD5SumValue const &CurMd5, map_stringitem_t &md5idx); }; /*}}}*/ // This is the abstract package list parser class. /*{{{*/ -class pkgCacheGenerator::ListParser +class APT_HIDDEN pkgCacheGenerator::ListParser { pkgCacheGenerator *Owner; friend class pkgCacheGenerator; // Some cache items pkgCache::VerIterator OldDepVer; - map_ptrloc *OldDepLast; + map_pointer_t *OldDepLast; // Flag file dependencies bool FoundFileDeps; protected: - inline unsigned long WriteUniqString(std::string S) {return Owner->WriteUniqString(S);}; - inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);}; - inline unsigned long WriteString(const std::string &S) {return Owner->WriteStringInMap(S);}; - inline unsigned long WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);}; + inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, std::string const &S) {return Owner->StoreString(type, S);}; + inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, const char *S,unsigned int Size) {return Owner->StoreString(type, S, Size);}; + + inline map_stringitem_t WriteString(const std::string &S) {return Owner->WriteStringInMap(S);}; + inline map_stringitem_t WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);}; bool NewDepends(pkgCache::VerIterator &Ver,const std::string &Package, const std::string &Arch, const std::string &Version,unsigned int Op, unsigned int Type); @@ -160,8 +169,8 @@ class pkgCacheGenerator::ListParser virtual bool ArchitectureAll() = 0; virtual std::string Version() = 0; virtual bool NewVersion(pkgCache::VerIterator &Ver) = 0; - virtual std::string Description() = 0; - virtual std::string DescriptionLanguage() = 0; + virtual std::string Description(std::string const &lang) = 0; + virtual std::vector<std::string> AvailableDescriptionLanguages() = 0; virtual MD5SumValue Description_md5() = 0; virtual unsigned short VersionHash() = 0; /** compare currently parsed version with given version @@ -169,14 +178,14 @@ class pkgCacheGenerator::ListParser * \param Hash of the currently parsed version * \param Ver to compare with */ -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 virtual #endif APT_PURE bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver); virtual bool UsePackage(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver) = 0; - virtual unsigned long Offset() = 0; - virtual unsigned long Size() = 0; + virtual map_filesize_t Offset() = 0; + virtual map_filesize_t Size() = 0; virtual bool Step() = 0; @@ -184,7 +193,7 @@ class pkgCacheGenerator::ListParser virtual bool CollectFileProvides(pkgCache &/*Cache*/, pkgCache::VerIterator &/*Ver*/) {return true;}; - ListParser() : FoundFileDeps(false) {}; + ListParser() : Owner(NULL), OldDepLast(NULL), FoundFileDeps(false) {}; virtual ~ListParser() {}; }; /*}}}*/ diff --git a/apt-pkg/pkgrecords.cc b/apt-pkg/pkgrecords.cc index c403e4dc3..859af3a09 100644 --- a/apt-pkg/pkgrecords.cc +++ b/apt-pkg/pkgrecords.cc @@ -26,7 +26,7 @@ // Records::pkgRecords - Constructor /*{{{*/ // --------------------------------------------------------------------- /* This will create the necessary structures to access the status files */ -pkgRecords::pkgRecords(pkgCache &Cache) : d(NULL), Cache(Cache), +pkgRecords::pkgRecords(pkgCache &aCache) : d(NULL), Cache(aCache), Files(Cache.HeaderP->PackageFileCount) { for (pkgCache::PkgFileIterator I = Cache.FileBegin(); diff --git a/apt-pkg/pkgrecords.h b/apt-pkg/pkgrecords.h index b5237b3a0..bcc05baba 100644 --- a/apt-pkg/pkgrecords.h +++ b/apt-pkg/pkgrecords.h @@ -18,6 +18,8 @@ #define PKGLIB_PKGRECORDS_H #include <apt-pkg/pkgcache.h> +#include <apt-pkg/hashes.h> +#include <apt-pkg/macros.h> #include <string> #include <vector> @@ -56,17 +58,46 @@ class pkgRecords::Parser /*{{{*/ // These refer to the archive file for the Version virtual std::string FileName() {return std::string();}; - virtual std::string MD5Hash() {return std::string();}; - virtual std::string SHA1Hash() {return std::string();}; - virtual std::string SHA256Hash() {return std::string();}; - virtual std::string SHA512Hash() {return std::string();}; virtual std::string SourcePkg() {return std::string();}; virtual std::string SourceVer() {return std::string();}; + /** return all known hashes in this record. + * + * For authentication proposes packages come with hashsums which + * this method is supposed to parse and return so that clients can + * choose the hash to be used. + */ + virtual HashStringList Hashes() const { return HashStringList(); }; +#if APT_PKG_ABI >= 413 + APT_DEPRECATED std::string MD5Hash() const { return GetHashFromHashes("MD5Sum"); }; + APT_DEPRECATED std::string SHA1Hash() const { return GetHashFromHashes("SHA1"); }; + APT_DEPRECATED std::string SHA256Hash() const { return GetHashFromHashes("SHA256"); }; + APT_DEPRECATED std::string SHA512Hash() const { return GetHashFromHashes("SHA512"); }; +#else + APT_DEPRECATED std::string MD5Hash() { return GetHashFromHashes("MD5Sum"); }; + APT_DEPRECATED std::string SHA1Hash() { return GetHashFromHashes("SHA1"); }; + APT_DEPRECATED std::string SHA256Hash() { return GetHashFromHashes("SHA256"); }; + APT_DEPRECATED std::string SHA512Hash() { return GetHashFromHashes("SHA512"); }; +#endif + // These are some general stats about the package virtual std::string Maintainer() {return std::string();}; - virtual std::string ShortDesc() {return std::string();}; - virtual std::string LongDesc() {return std::string();}; + /** return short description in language from record. + * + * @see #LongDesc + */ + virtual std::string ShortDesc(std::string const &/*lang*/) {return std::string();}; + /** return long description in language from record. + * + * If \b lang is empty the "best" available language will be + * returned as determined by the APT::Languages configuration. + * If a (requested) language can't be found in this record an empty + * string will be returned. + */ + virtual std::string LongDesc(std::string const &/*lang*/) {return std::string();}; + std::string ShortDesc() {return ShortDesc("");}; + std::string LongDesc() {return LongDesc("");}; + virtual std::string Name() {return std::string();}; virtual std::string Homepage() {return std::string();} @@ -77,6 +108,14 @@ class pkgRecords::Parser /*{{{*/ virtual void GetRec(const char *&Start,const char *&Stop) {Start = Stop = 0;}; virtual ~Parser() {}; + + private: + APT_HIDDEN std::string GetHashFromHashes(char const * const type) const + { + HashStringList const hashes = Hashes(); + HashString const * const hs = hashes.find(type); + return hs != NULL ? hs->HashValue() : ""; + }; }; /*}}}*/ #endif diff --git a/apt-pkg/pkgsystem.h b/apt-pkg/pkgsystem.h index 6e33c67ed..f88ffa7c8 100644 --- a/apt-pkg/pkgsystem.h +++ b/apt-pkg/pkgsystem.h @@ -85,10 +85,12 @@ class pkgSystem virtual bool AddStatusFiles(std::vector<pkgIndexFile *> &List) = 0; virtual bool FindIndex(pkgCache::PkgFileIterator File, pkgIndexFile *&Found) const = 0; - + /* Evauluate how 'right' we are for this system based on the filesystem etc.. */ - virtual signed Score(Configuration const &/*Cnf*/) {return 0;}; + virtual signed Score(Configuration const &/*Cnf*/) { + return 0; + }; pkgSystem(); virtual ~pkgSystem() {}; diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc index e37899ec6..7170e8b5b 100644 --- a/apt-pkg/sourcelist.cc +++ b/apt-pkg/sourcelist.cc @@ -119,7 +119,7 @@ bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List, std::vector<std::string> list_section = StringSplit(Section, " "); for (std::vector<std::string>::const_iterator U = list_uris.begin(); - U != list_uris.end(); U++) + U != list_uris.end(); ++U) { std::string URI = (*U); if (!FixupURI(URI)) @@ -129,10 +129,10 @@ bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List, } for (std::vector<std::string>::const_iterator I = list_dist.begin(); - I != list_dist.end(); I++) + I != list_dist.end(); ++I) { for (std::vector<std::string>::const_iterator J = list_section.begin(); - J != list_section.end(); J++) + J != list_section.end(); ++J) { if (CreateItem(List, URI, (*I), (*J), Options) == false) { @@ -408,7 +408,7 @@ int pkgSourceList::ParseFileDeb822(string File) string const types = Tags.FindS("Types"); std::vector<std::string> list_types = StringSplit(types, " "); for (std::vector<std::string>::const_iterator I = list_types.begin(); - I != list_types.end(); I++) + I != list_types.end(); ++I) { Type *Parse = Type::GetType((*I).c_str()); if (Parse == 0) diff --git a/apt-pkg/sourcelist.h b/apt-pkg/sourcelist.h index 9df0c1d74..998357509 100644 --- a/apt-pkg/sourcelist.h +++ b/apt-pkg/sourcelist.h @@ -55,12 +55,12 @@ class metaIndex; class pkgSourceList { public: - + // List of supported source list types class Type { public: - + // Global list of Items supported static Type **GlobalList; static unsigned long GlobalListLen; @@ -83,9 +83,9 @@ class pkgSourceList Type(); virtual ~Type() {}; }; - + typedef std::vector<metaIndex *>::const_iterator const_iterator; - + protected: std::vector<metaIndex *> SrcList; diff --git a/apt-pkg/srcrecords.h b/apt-pkg/srcrecords.h index dde22bd65..c931e17b7 100644 --- a/apt-pkg/srcrecords.h +++ b/apt-pkg/srcrecords.h @@ -30,11 +30,7 @@ class pkgSrcRecords { public: -#if __GNUC__ >= 4 - // ensure that con- & de-structor don't trigger this warning - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif +APT_IGNORE_DEPRECATED_PUSH // Describes a single file struct File { @@ -48,9 +44,7 @@ class pkgSrcRecords unsigned long long FileSize; HashStringList Hashes; }; -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif +APT_IGNORE_DEPRECATED_POP // Abstract parser for each source record class Parser diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc index bf865bdc4..590206f17 100644 --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@ -47,16 +47,60 @@ public: unsigned long long Size; }; +class pkgTagSectionPrivate +{ +public: + pkgTagSectionPrivate() + { + } + struct TagData { + unsigned int StartTag; + unsigned int EndTag; + unsigned int StartValue; + unsigned int NextInBucket; + + TagData(unsigned int const StartTag) : StartTag(StartTag), EndTag(0), StartValue(0), NextInBucket(0) {} + }; + std::vector<TagData> Tags; +}; + +static unsigned long AlphaHash(const char *Text, size_t Length) /*{{{*/ +{ + /* This very simple hash function for the last 8 letters gives + very good performance on the debian package files */ + if (Length > 8) + { + Text += (Length - 8); + Length = 8; + } + unsigned long Res = 0; + for (size_t i = 0; i < Length; ++i) + Res = ((unsigned long)(Text[i]) & 0xDF) ^ (Res << 1); + return Res & 0xFF; +} + /*}}}*/ + // TagFile::pkgTagFile - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long long Size) + : d(NULL) +{ + Init(pFd, Size); +} + +void pkgTagFile::Init(FileFd *pFd,unsigned long long Size) { /* The size is increased by 4 because if we start with the Size of the filename we need to try to read 1 char more to see an EOF faster, 1 char the end-pointer can be on and maybe 2 newlines need to be added to the end of the file -> 4 extra chars */ Size += 4; + if(d != NULL) + { + free(d->Buffer); + delete d; + } d = new pkgTagFilePrivate(pFd, Size); if (d->Fd.IsOpen() == false) @@ -128,18 +172,23 @@ bool pkgTagFile::Resize(unsigned long long const newSize) */ bool pkgTagFile::Step(pkgTagSection &Tag) { - while (Tag.Scan(d->Start,d->End - d->Start) == false) + if(Tag.Scan(d->Start,d->End - d->Start) == false) { - if (Fill() == false) - return false; - - if(Tag.Scan(d->Start,d->End - d->Start)) - break; + do + { + if (Fill() == false) + return false; + + if(Tag.Scan(d->Start,d->End - d->Start, false)) + break; + + if (Resize() == false) + return _error->Error(_("Unable to parse package file %s (1)"), + d->Fd.Name().c_str()); - if (Resize() == false) - return _error->Error(_("Unable to parse package file %s (1)"), - d->Fd.Name().c_str()); + } while (Tag.Scan(d->Start,d->End - d->Start, false) == false); } + d->Start += Tag.size(); d->iOffset += Tag.size(); @@ -233,7 +282,7 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long long Offset) if (Fill() == false) return false; - if (Tag.Scan(d->Start, d->End - d->Start) == false) + if (Tag.Scan(d->Start, d->End - d->Start, false) == false) return _error->Error(_("Unable to parse package file %s (2)"),d->Fd.Name().c_str()); return true; @@ -242,28 +291,64 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long long Offset) // pkgTagSection::pkgTagSection - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ +APT_IGNORE_DEPRECATED_PUSH pkgTagSection::pkgTagSection() - : Section(0), TagCount(0), d(NULL), Stop(0) + : Section(0), d(NULL), Stop(0) { + d = new pkgTagSectionPrivate(); +#if APT_PKG_ABI < 413 + TagCount = 0; memset(&Indexes, 0, sizeof(Indexes)); +#endif memset(&AlphaIndexes, 0, sizeof(AlphaIndexes)); } +APT_IGNORE_DEPRECATED_POP /*}}}*/ // TagSection::Scan - Scan for the end of the header information /*{{{*/ -// --------------------------------------------------------------------- -/* This looks for the first double new line in the data stream. - It also indexes the tags in the section. */ +#if APT_PKG_ABI < 413 bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) { + return Scan(Start, MaxLength, true); +} +#endif +bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const Restart) +{ + Section = Start; const char *End = Start + MaxLength; - Stop = Section = Start; - memset(AlphaIndexes,0,sizeof(AlphaIndexes)); + + if (Restart == false && d->Tags.empty() == false) + { + Stop = Section + d->Tags.back().StartTag; + if (End <= Stop) + return false; + Stop = (const char *)memchr(Stop,'\n',End - Stop); + if (Stop == NULL) + return false; + ++Stop; + } + else + { + Stop = Section; + if (d->Tags.empty() == false) + { + memset(&AlphaIndexes, 0, sizeof(AlphaIndexes)); + d->Tags.clear(); + } + d->Tags.reserve(0x100); + } +#if APT_PKG_ABI >= 413 + unsigned int TagCount = d->Tags.size(); +#else + APT_IGNORE_DEPRECATED(TagCount = d->Tags.size();) +#endif if (Stop == 0) return false; - TagCount = 0; - while (TagCount+1 < sizeof(Indexes)/sizeof(Indexes[0]) && Stop < End) + pkgTagSectionPrivate::TagData lastTagData(0); + lastTagData.EndTag = 0; + unsigned long lastTagHash = 0; + while (Stop < End) { TrimRecord(true,End); @@ -275,12 +360,45 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) // Start a new index and add it to the hash if (isspace(Stop[0]) == 0) { - Indexes[TagCount++] = Stop - Section; - AlphaIndexes[AlphaHash(Stop,End)] = TagCount; + // store the last found tag + if (lastTagData.EndTag != 0) + { + if (AlphaIndexes[lastTagHash] != 0) + lastTagData.NextInBucket = AlphaIndexes[lastTagHash]; + APT_IGNORE_DEPRECATED_PUSH + AlphaIndexes[lastTagHash] = TagCount; +#if APT_PKG_ABI < 413 + if (d->Tags.size() < sizeof(Indexes)/sizeof(Indexes[0])) + Indexes[d->Tags.size()] = lastTagData.StartTag; +#endif + APT_IGNORE_DEPRECATED_POP + d->Tags.push_back(lastTagData); + } + + APT_IGNORE_DEPRECATED(++TagCount;) + lastTagData = pkgTagSectionPrivate::TagData(Stop - Section); + // find the colon separating tag and value + char const * Colon = (char const *) memchr(Stop, ':', End - Stop); + if (Colon == NULL) + return false; + // find the end of the tag (which might or might not be the colon) + char const * EndTag = Colon; + --EndTag; + for (; EndTag > Stop && isspace(*EndTag) != 0; --EndTag) + ; + ++EndTag; + lastTagData.EndTag = EndTag - Section; + lastTagHash = AlphaHash(Stop, EndTag - Stop); + // find the beginning of the value + Stop = Colon + 1; + for (; isspace(*Stop) != 0; ++Stop); + if (Stop >= End) + return false; + lastTagData.StartValue = Stop - Section; } Stop = (const char *)memchr(Stop,'\n',End - Stop); - + if (Stop == 0) return false; @@ -291,7 +409,22 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) // Double newline marks the end of the record if (Stop+1 < End && Stop[1] == '\n') { - Indexes[TagCount] = Stop - Section; + if (lastTagData.EndTag != 0) + { + if (AlphaIndexes[lastTagHash] != 0) + lastTagData.NextInBucket = AlphaIndexes[lastTagHash]; + APT_IGNORE_DEPRECATED(AlphaIndexes[lastTagHash] = TagCount;) +#if APT_PKG_ABI < 413 + APT_IGNORE_DEPRECATED(Indexes[d->Tags.size()] = lastTagData.StartTag;) +#endif + d->Tags.push_back(lastTagData); + } + + pkgTagSectionPrivate::TagData const td(Stop - Section); +#if APT_PKG_ABI < 413 + APT_IGNORE_DEPRECATED(Indexes[d->Tags.size()] = td.StartTag;) +#endif + d->Tags.push_back(td); TrimRecord(false,End); return true; } @@ -320,8 +453,12 @@ void pkgTagSection::Trim() for (; Stop > Section + 2 && (Stop[-2] == '\n' || Stop[-2] == '\r'); Stop--); } /*}}}*/ -// TagSection::Exists - return True if a tag exists /*{{{*/ +// TagSection::Exists - return True if a tag exists /*{{{*/ +#if APT_PKG_ABI >= 413 +bool pkgTagSection::Exists(const char* const Tag) const +#else bool pkgTagSection::Exists(const char* const Tag) +#endif { unsigned int tmp; return Find(Tag, tmp); @@ -332,73 +469,43 @@ bool pkgTagSection::Exists(const char* const Tag) /* This searches the section for a tag that matches the given string. */ bool pkgTagSection::Find(const char *Tag,unsigned int &Pos) const { - unsigned int Length = strlen(Tag); - unsigned int I = AlphaIndexes[AlphaHash(Tag)]; - if (I == 0) + size_t const Length = strlen(Tag); + unsigned int Bucket = AlphaIndexes[AlphaHash(Tag, Length)]; + if (Bucket == 0) return false; - I--; - - for (unsigned int Counter = 0; Counter != TagCount; Counter++, - I = (I+1)%TagCount) + + for (; Bucket != 0; Bucket = d->Tags[Bucket - 1].NextInBucket) { - const char *St; - St = Section + Indexes[I]; - if (strncasecmp(Tag,St,Length) != 0) + if ((d->Tags[Bucket - 1].EndTag - d->Tags[Bucket - 1].StartTag) != Length) continue; - // Make sure the colon is in the right place - const char *C = St + Length; - for (; isspace(*C) != 0; C++); - if (*C != ':') + char const * const St = Section + d->Tags[Bucket - 1].StartTag; + if (strncasecmp(Tag,St,Length) != 0) continue; - Pos = I; + + Pos = Bucket - 1; return true; } Pos = 0; return false; } - /*}}}*/ -// TagSection::Find - Locate a tag /*{{{*/ -// --------------------------------------------------------------------- -/* This searches the section for a tag that matches the given string. */ bool pkgTagSection::Find(const char *Tag,const char *&Start, const char *&End) const { - unsigned int Length = strlen(Tag); - unsigned int I = AlphaIndexes[AlphaHash(Tag)]; - if (I == 0) + unsigned int Pos; + if (Find(Tag, Pos) == false) return false; - I--; - - for (unsigned int Counter = 0; Counter != TagCount; Counter++, - I = (I+1)%TagCount) - { - const char *St; - St = Section + Indexes[I]; - if (strncasecmp(Tag,St,Length) != 0) - continue; - - // Make sure the colon is in the right place - const char *C = St + Length; - for (; isspace(*C) != 0; C++); - if (*C != ':') - continue; - // Strip off the gunk from the start end - Start = C; - End = Section + Indexes[I+1]; - if (Start >= End) - return _error->Error("Internal parsing error"); - - for (; (isspace(*Start) != 0 || *Start == ':') && Start < End; Start++); - for (; isspace(End[-1]) != 0 && End > Start; End--); - - return true; - } - - Start = End = 0; - return false; + Start = Section + d->Tags[Pos].StartValue; + // Strip off the gunk from the end + End = Section + d->Tags[Pos + 1].StartTag; + if (unlikely(Start > End)) + return _error->Error("Internal parsing error"); + + for (; isspace(End[-1]) != 0 && End > Start; --End); + + return true; } /*}}}*/ // TagSection::FindS - Find a string /*{{{*/ @@ -461,6 +568,17 @@ unsigned long long pkgTagSection::FindULL(const char *Tag, unsigned long long co return Result; } /*}}}*/ +// TagSection::FindB - Find boolean value /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgTagSection::FindB(const char *Tag, bool const &Default) const +{ + const char *Start, *Stop; + if (Find(Tag, Start, Stop) == false) + return Default; + return StringToBool(string(Start, Stop)); +} + /*}}}*/ // TagSection::FindFlag - Locate a yes/no type flag /*{{{*/ // --------------------------------------------------------------------- /* The bits marked in Flag are masked on/off in Flags */ @@ -493,6 +611,18 @@ bool pkgTagSection::FindFlag(unsigned long &Flags, unsigned long Flag, return true; } /*}}}*/ +void pkgTagSection::Get(const char *&Start,const char *&Stop,unsigned int I) const +{ + Start = Section + d->Tags[I].StartTag; + Stop = Section + d->Tags[I+1].StartTag; +} +APT_PURE unsigned int pkgTagSection::Count() const { /*{{{*/ + if (d->Tags.empty() == true) + return 0; + // the last element is just marking the end and isn't a real one + return d->Tags.size() - 1; +} + /*}}}*/ // TFRewrite - Rewrite a control record /*{{{*/ // --------------------------------------------------------------------- /* This writes the control record to stdout rewriting it as necessary. The @@ -682,3 +812,5 @@ bool TFRewrite(FILE *Output,pkgTagSection const &Tags,const char *Order[], return true; } /*}}}*/ + +pkgTagSection::~pkgTagSection() { delete d; } diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h index d5b62e76d..d09e7046c 100644 --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@ -25,32 +25,30 @@ #include <stdio.h> #include <string> +#include <vector> +#include <list> #ifndef APT_8_CLEANER_HEADERS #include <apt-pkg/fileutl.h> #endif class FileFd; +class pkgTagSectionPrivate; class pkgTagSection { const char *Section; - // We have a limit of 256 tags per section. - unsigned int Indexes[256]; + // We have a limit of 256 tags per section with the old abi +#if APT_PKG_ABI < 413 + APT_DEPRECATED unsigned int Indexes[256]; +#endif unsigned int AlphaIndexes[0x100]; - unsigned int TagCount; - // dpointer placeholder (for later in case we need it) - void *d; +#if APT_PKG_ABI < 413 + APT_DEPRECATED unsigned int TagCount; +#endif - /* This very simple hash function for the last 8 letters gives - very good performance on the debian package files */ - inline static unsigned long AlphaHash(const char *Text, const char *End = 0) - { - unsigned long Res = 0; - for (; Text != End && *Text != ':' && *Text != 0; Text++) - Res = ((unsigned long)(*Text) & 0xDF) ^ (Res << 1); - return Res & 0xFF; - } + // dpointer placeholder (for later in case we need it) + pkgTagSectionPrivate *d; protected: const char *Stop; @@ -63,23 +61,55 @@ class pkgTagSection bool Find(const char *Tag,const char *&Start, const char *&End) const; bool Find(const char *Tag,unsigned int &Pos) const; std::string FindS(const char *Tag) const; - signed int FindI(const char *Tag,signed long Default = 0) const ; + signed int FindI(const char *Tag,signed long Default = 0) const; + bool FindB(const char *Tag, bool const &Default = false) const; unsigned long long FindULL(const char *Tag, unsigned long long const &Default = 0) const; bool FindFlag(const char *Tag,unsigned long &Flags, unsigned long Flag) const; bool static FindFlag(unsigned long &Flags, unsigned long Flag, const char* Start, const char* Stop); - bool Scan(const char *Start,unsigned long MaxLength); + + /** \brief searches the boundaries of the current section + * + * While parameter Start marks the beginning of the section, this method + * will search for the first double newline in the data stream which marks + * the end of the section. It also does a first pass over the content of + * the section parsing it as encountered for processing later on by Find + * + * @param Start is the beginning of the section + * @param MaxLength is the size of valid data in the stream pointed to by Start + * @param Restart if enabled internal state will be cleared, otherwise it is + * assumed that now more data is available in the stream and the parsing will + * start were it encountered insufficent data the last time. + * + * @return \b true if section end was found, \b false otherwise. + * Beware that internal state will be inconsistent if \b false is returned! + */ +#if APT_PKG_ABI >= 413 + APT_MUSTCHECK bool Scan(const char *Start, unsigned long MaxLength, bool const Restart = true); +#else + APT_MUSTCHECK bool Scan(const char *Start, unsigned long MaxLength, bool const Restart); + APT_MUSTCHECK bool Scan(const char *Start, unsigned long MaxLength); +#endif + inline unsigned long size() const {return Stop - Section;}; void Trim(); virtual void TrimRecord(bool BeforeRecord, const char* &End); - - inline unsigned int Count() const {return TagCount;}; + + /** \brief amount of Tags in the current section + * + * Note: if a Tag is mentioned repeatly it will be counted multiple + * times, but only the last occurrence is available via Find methods. + */ + unsigned int Count() const; +#if APT_PKG_ABI >= 413 + bool Exists(const char* const Tag) const; +#else bool Exists(const char* const Tag); - - inline void Get(const char *&Start,const char *&Stop,unsigned int I) const - {Start = Section + Indexes[I]; Stop = Section + Indexes[I+1];} - +#endif + + void Get(const char *&Start,const char *&Stop,unsigned int I) const; + inline void GetSection(const char *&Start,const char *&Stop) const { Start = Section; @@ -87,7 +117,7 @@ class pkgTagSection }; pkgTagSection(); - virtual ~pkgTagSection() {}; + virtual ~pkgTagSection(); }; class pkgTagFilePrivate; @@ -105,6 +135,8 @@ class pkgTagFile unsigned long Offset(); bool Jump(pkgTagSection &Tag,unsigned long long Offset); + void Init(FileFd *F,unsigned long long Size = 32*1024); + pkgTagFile(FileFd *F,unsigned long long Size = 32*1024); virtual ~pkgTagFile(); }; diff --git a/apt-pkg/update.cc b/apt-pkg/update.cc index 5d5b19626..2908a4820 100644 --- a/apt-pkg/update.cc +++ b/apt-pkg/update.cc @@ -27,8 +27,8 @@ bool ListUpdate(pkgAcquireStatus &Stat, pkgSourceList &List, int PulseInterval) { - pkgAcquire Fetcher; - if (Fetcher.Setup(&Stat, _config->FindDir("Dir::State::Lists")) == false) + pkgAcquire Fetcher(&Stat); + if (Fetcher.GetLock(_config->FindDir("Dir::State::Lists")) == false) return false; // Populate it with the source selection diff --git a/apt-pkg/update.h b/apt-pkg/update.h index 3835644de..e35cd14f6 100644 --- a/apt-pkg/update.h +++ b/apt-pkg/update.h @@ -11,7 +11,8 @@ #define PKGLIB_UPDATE_H class pkgAcquireStatus; - +class pkgSourceList; +class pkgAcquire; bool ListUpdate(pkgAcquireStatus &progress, pkgSourceList &List, int PulseInterval=0); bool AcquireUpdate(pkgAcquire &Fetcher, int const PulseInterval = 0, diff --git a/apt-pkg/upgrade.cc b/apt-pkg/upgrade.cc index 29b11937b..6c8721da8 100644 --- a/apt-pkg/upgrade.cc +++ b/apt-pkg/upgrade.cc @@ -24,13 +24,14 @@ The problem resolver is used to resolve the problems. */ -bool pkgDistUpgrade(pkgDepCache &Cache) +static bool pkgDistUpgrade(pkgDepCache &Cache, OpProgress * const Progress) { std::string const solver = _config->Find("APT::Solver", "internal"); - if (solver != "internal") { - OpTextProgress Prog(*_config); - return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false, &Prog); - } + if (solver != "internal") + return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false, Progress); + + if (Progress != NULL) + Progress->OverallProgress(0, 100, 1, _("Calculating upgrade")); pkgDepCache::ActionGroup group(Cache); @@ -41,12 +42,18 @@ bool pkgDistUpgrade(pkgDepCache &Cache) if (I->CurrentVer != 0) Cache.MarkInstall(I, false, 0, false); + if (Progress != NULL) + Progress->Progress(10); + /* 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, 0, false); + if (Progress != NULL) + Progress->Progress(50); + /* Now, install each essential package which is not installed (and not provided by another package in the same name group) */ std::string essential = _config->Find("pkgCacheGen::Essential", "all"); @@ -77,15 +84,24 @@ bool pkgDistUpgrade(pkgDepCache &Cache) for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I) if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) Cache.MarkInstall(I, true, 0, false); - + + if (Progress != NULL) + Progress->Progress(55); + /* 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, 0, false); + if (Progress != NULL) + Progress->Progress(65); + pkgProblemResolver Fix(&Cache); + if (Progress != NULL) + Progress->Progress(95); + // Hold back held packages. if (_config->FindB("APT::Ignore-Hold",false) == false) { @@ -98,18 +114,26 @@ bool pkgDistUpgrade(pkgDepCache &Cache) } } } - - return Fix.Resolve(); + + bool const success = Fix.Resolve(false, Progress); + if (Progress != NULL) + Progress->Done(); + return success; +} +bool pkgDistUpgrade(pkgDepCache &Cache) +{ + return pkgDistUpgrade(Cache, NULL); } /*}}}*/ // AllUpgradeNoNewPackages - Upgrade but no removals or new pkgs /*{{{*/ -static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache) +static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache, OpProgress * const Progress) { std::string const solver = _config->Find("APT::Solver", "internal"); - if (solver != "internal") { - OpTextProgress Prog(*_config); - return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog); - } + if (solver != "internal") + return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress); + + if (Progress != NULL) + Progress->OverallProgress(0, 100, 1, _("Calculating upgrade")); pkgDepCache::ActionGroup group(Cache); @@ -131,8 +155,15 @@ static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache) if (I->CurrentVer != 0 && Cache[I].InstallVer != 0) Cache.MarkInstall(I, false, 0, false); } - - return Fix.ResolveByKeep(); + + if (Progress != NULL) + Progress->Progress(50); + + // resolve remaining issues via keep + bool const success = Fix.ResolveByKeep(Progress); + if (Progress != NULL) + Progress->Done(); + return success; } /*}}}*/ // AllUpgradeWithNewInstalls - Upgrade + install new packages as needed /*{{{*/ @@ -141,13 +172,14 @@ static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache) * Upgrade as much as possible without deleting anything (useful for * stable systems) */ -static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache) +static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache, OpProgress * const Progress) { std::string const solver = _config->Find("APT::Solver", "internal"); - if (solver != "internal") { - OpTextProgress Prog(*_config); - return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog); - } + if (solver != "internal") + return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress); + + if (Progress != NULL) + Progress->OverallProgress(0, 100, 1, _("Calculating upgrade")); pkgDepCache::ActionGroup group(Cache); @@ -170,18 +202,30 @@ static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache) } } + if (Progress != NULL) + Progress->Progress(10); + // then let auto-install loose for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I) if (Cache[I].Install()) Cache.MarkInstall(I, true, 0, false); + if (Progress != NULL) + Progress->Progress(50); + // ... but it may remove stuff, we we need to clean up afterwards again for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I) if (Cache[I].Delete() == true) Cache.MarkKeep(I, false, false); + if (Progress != NULL) + Progress->Progress(60); + // resolve remaining issues via keep - return Fix.ResolveByKeep(); + bool const success = Fix.ResolveByKeep(Progress); + if (Progress != NULL) + Progress->Done(); + return success; } /*}}}*/ // AllUpgrade - Upgrade as many packages as possible /*{{{*/ @@ -189,9 +233,13 @@ static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache) /* Right now the system must be consistent before this can be called. It also will not change packages marked for install, it only tries to install packages not marked for install */ +static bool pkgAllUpgrade(pkgDepCache &Cache, OpProgress * const Progress) +{ + return pkgAllUpgradeNoNewPackages(Cache, Progress); +} bool pkgAllUpgrade(pkgDepCache &Cache) { - return pkgAllUpgradeNoNewPackages(Cache); + return pkgAllUpgrade(Cache, NULL); } /*}}}*/ // MinimizeUpgrade - Minimizes the set of packages to be upgraded /*{{{*/ @@ -239,24 +287,25 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache) return true; } /*}}}*/ -// APT::Upgrade::Upgrade - Upgrade using a specific strategy /*{{{*/ +// APT::Upgrade::Upgrade - Upgrade using a specific strategy /*{{{*/ +#if APT_PKG_ABI < 413 bool APT::Upgrade::Upgrade(pkgDepCache &Cache, int mode) { - if (mode == 0) - { - return pkgDistUpgrade(Cache); - } + return Upgrade(Cache, mode, NULL); +} +#endif +bool APT::Upgrade::Upgrade(pkgDepCache &Cache, int mode, OpProgress * const Progress) +{ +APT_IGNORE_DEPRECATED_PUSH + if (mode == ALLOW_EVERYTHING) + return pkgDistUpgrade(Cache, Progress); else if ((mode & ~FORBID_REMOVE_PACKAGES) == 0) - { - return pkgAllUpgradeWithNewPackages(Cache); - } + return pkgAllUpgradeWithNewPackages(Cache, Progress); else if ((mode & ~(FORBID_REMOVE_PACKAGES|FORBID_INSTALL_NEW_PACKAGES)) == 0) - { - return pkgAllUpgradeNoNewPackages(Cache); - } + return pkgAllUpgradeNoNewPackages(Cache, Progress); else _error->Error("pkgAllUpgrade called with unsupported mode %i", mode); - +APT_IGNORE_DEPRECATED_POP return false; } /*}}}*/ diff --git a/apt-pkg/upgrade.h b/apt-pkg/upgrade.h index aa883df10..18b6aac7b 100644 --- a/apt-pkg/upgrade.h +++ b/apt-pkg/upgrade.h @@ -10,23 +10,32 @@ #ifndef PKGLIB_UPGRADE_H #define PKGLIB_UPGRADE_H +#include <stddef.h> +#include <apt-pkg/macros.h> + class pkgDepCache; +class OpProgress; namespace APT { namespace Upgrade { // FIXME: make this "enum class UpgradeMode {" once we enable c++11 enum UpgradeMode { FORBID_REMOVE_PACKAGES = 1, - FORBID_INSTALL_NEW_PACKAGES = 2 + FORBID_INSTALL_NEW_PACKAGES = 2, + ALLOW_EVERYTHING = 0 }; +#if APT_PKG_ABI >= 413 + bool Upgrade(pkgDepCache &Cache, int UpgradeMode, OpProgress * const Progress = NULL); +#else bool Upgrade(pkgDepCache &Cache, int UpgradeMode); + bool Upgrade(pkgDepCache &Cache, int UpgradeMode, OpProgress * const Progress); +#endif } } // please use APT::Upgrade::Upgrade() instead -bool pkgDistUpgrade(pkgDepCache &Cache); -bool pkgAllUpgrade(pkgDepCache &Cache); -bool pkgMinimizeUpgrade(pkgDepCache &Cache); - +APT_DEPRECATED bool pkgDistUpgrade(pkgDepCache &Cache); +APT_DEPRECATED bool pkgAllUpgrade(pkgDepCache &Cache); +bool pkgMinimizeUpgrade(pkgDepCache &Cache); #endif diff --git a/apt-pkg/vendorlist.cc b/apt-pkg/vendorlist.cc index fb33ff17d..db5b87fc0 100644 --- a/apt-pkg/vendorlist.cc +++ b/apt-pkg/vendorlist.cc @@ -11,10 +11,8 @@ #include <apti18n.h> -#if __GNUC__ >= 4 - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif +// The whole vendor system is deprecated +APT_IGNORE_DEPRECATED_PUSH #include <apt-pkg/vendor.h> #include <apt-pkg/vendorlist.h> @@ -163,6 +161,4 @@ const Vendor* pkgVendorList::FindVendor(const std::vector<string> GPGVOutput) /* } /*}}}*/ -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif +APT_IGNORE_DEPRECATED_POP diff --git a/apt-private/acqprogress.cc b/apt-private/acqprogress.cc index 0f5b53e50..14a53eacb 100644 --- a/apt-private/acqprogress.cc +++ b/apt-private/acqprogress.cc @@ -64,8 +64,6 @@ void AcqTextStatus::IMSHit(pkgAcquire::ItemDesc &Itm) cout << '\r' << BlankLine << '\r'; cout << _("Hit ") << Itm.Description; - if (Itm.Owner->FileSize != 0) - cout << " [" << SizeToStr(Itm.Owner->FileSize) << "B]"; cout << endl; Update = true; } @@ -119,6 +117,9 @@ void AcqTextStatus::Fail(pkgAcquire::ItemDesc &Itm) if (Itm.Owner->Status == pkgAcquire::Item::StatDone) { cout << _("Ign ") << Itm.Description << endl; + if (Itm.Owner->ErrorText.empty() == false && + _config->FindB("Acquire::Progress::Ignore::ShowErrorText", false) == true) + cout << " " << Itm.Owner->ErrorText << endl; } else { @@ -142,6 +143,9 @@ void AcqTextStatus::Stop() if (Quiet <= 0) cout << '\r' << BlankLine << '\r' << flush; + if (_config->FindB("quiet::NoStatistic", false) == true) + return; + if (FetchedBytes != 0 && _error->PendingError() == false) ioprintf(cout,_("Fetched %sB in %s (%sB/s)\n"), SizeToStr(FetchedBytes).c_str(), @@ -170,7 +174,7 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner) ScreenWidth = sizeof(Buffer)-1; // Put in the percent done - sprintf(S,"%.0f%%",((CurrentBytes + CurrentItems)*100.0)/(TotalBytes+TotalItems)); + sprintf(S,"%.0f%%", Percent); bool Shown = false; for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0; @@ -201,9 +205,9 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner) S += strlen(S); // Show the short mode string - if (I->CurrentItem->Owner->Mode != 0) + if (I->CurrentItem->Owner->ActiveSubprocess.empty() == false) { - snprintf(S,End-S," %s",I->CurrentItem->Owner->Mode); + snprintf(S,End-S, " %s", I->CurrentItem->Owner->ActiveSubprocess.c_str()); S += strlen(S); } diff --git a/apt-private/private-cachefile.cc b/apt-private/private-cachefile.cc index 5e955ac39..29e665245 100644 --- a/apt-private/private-cachefile.cc +++ b/apt-private/private-cachefile.cc @@ -32,8 +32,10 @@ int CacheFile::NameComp(const void *a,const void *b) const pkgCache::Package &A = **(pkgCache::Package **)a; const pkgCache::Package &B = **(pkgCache::Package **)b; + const pkgCache::Group * const GA = SortCache->GrpP + A.Group; + const pkgCache::Group * const GB = SortCache->GrpP + B.Group; - return strcmp(SortCache->StrP + A.Name,SortCache->StrP + B.Name); + return strcmp(SortCache->StrP + GA->Name,SortCache->StrP + GB->Name); } /*}}}*/ // CacheFile::Sort - Sort by name /*{{{*/ diff --git a/apt-private/private-cachefile.h b/apt-private/private-cachefile.h index dce7e0a3a..1fddabfbd 100644 --- a/apt-private/private-cachefile.h +++ b/apt-private/private-cachefile.h @@ -6,7 +6,20 @@ #include <apt-pkg/configuration.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/macros.h> +#include <apt-pkg/sourcelist.h> +#include <apti18n.h> +// FIXME: we need to find a way to export this +class APT_PUBLIC SourceList : public pkgSourceList +{ + + public: + // Add custom metaIndex (e.g. local files) + void AddMetaIndex(metaIndex *mi) { + SrcList.push_back(mi); + } + +}; // class CacheFile - Cover class for some dependency cache functions /*{{{*/ // --------------------------------------------------------------------- @@ -28,6 +41,16 @@ class APT_PUBLIC CacheFile : public pkgCacheFile return false; return true; } + // FIXME: this can go once the "libapt-pkg" pkgSourceList has a way + // to add custom metaIndexes (or custom local files or so) + bool BuildSourceList(OpProgress */*Progress*/ = NULL) { + if (SrcList != NULL) + return true; + SrcList = new SourceList(); + if (SrcList->ReadMainList() == false) + return _error->Error(_("The list of sources could not be read.")); + return true; + } bool Open(bool WithLock = true) { OpTextProgress Prog(*_config); diff --git a/apt-private/private-cacheset.cc b/apt-private/private-cacheset.cc index eb77be274..cb68024db 100644 --- a/apt-private/private-cacheset.cc +++ b/apt-private/private-cacheset.cc @@ -60,22 +60,22 @@ bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile, if (insertCurrentVer == true) { if (P->CurrentVer != 0) - vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::INSTALLED, helper); + vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::INSTALLED, helper); } else if (insertUpgradable == true) { if(P.CurrentVer() && state.Upgradable()) - vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::CANDIDATE, helper); + vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper); } else if (insertManualInstalled == true) { if (P.CurrentVer() && ((*DepCache)[P].Flags & pkgCache::Flag::Auto) == false) - vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::CANDIDATE, helper); + vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper); } else { - if (vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::CANDIDATE, helper) == false) + if (vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper) == false) { // no candidate, this may happen for packages in // dpkg "deinstall ok config-file" state - we pick the first ver diff --git a/apt-private/private-cacheset.h b/apt-private/private-cacheset.h index ca8f4be5d..059c7637e 100644 --- a/apt-private/private-cacheset.h +++ b/apt-private/private-cacheset.h @@ -76,19 +76,16 @@ class CacheSetHelperVirtuals: public APT::CacheSetHelper { public: APT::PackageSet virtualPkgs; - virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { - virtualPkgs.insert(Pkg); - return CacheSetHelper::canNotFindCandidateVer(Cache, Pkg); + virtual pkgCache::VerIterator canNotGetVersion(enum CacheSetHelper::VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { + if (select == NEWEST || select == CANDIDATE || select == ALL) + virtualPkgs.insert(Pkg); + return CacheSetHelper::canNotGetVersion(select, Cache, Pkg); } - virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { - virtualPkgs.insert(Pkg); - return CacheSetHelper::canNotFindNewestVer(Cache, Pkg); - } - - virtual void canNotFindAllVer(APT::VersionContainerInterface * vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { - virtualPkgs.insert(Pkg); - CacheSetHelper::canNotFindAllVer(vci, Cache, Pkg); + virtual void canNotFindVersion(enum CacheSetHelper::VerSelector const select, APT::VersionContainerInterface * vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { + if (select == NEWEST || select == CANDIDATE || select == ALL) + virtualPkgs.insert(Pkg); + return CacheSetHelper::canNotFindVersion(select, vci, Cache, Pkg); } CacheSetHelperVirtuals(bool const ShowErrors = true, GlobalError::MsgType const &ErrorType = GlobalError::NOTICE) : CacheSetHelper(ShowErrors, ErrorType) {} @@ -190,7 +187,7 @@ public: } virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { - APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, APT::VersionSet::CANDIDATE); + APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, CacheSetHelper::CANDIDATE); if (verset.empty() == false) return *(verset.begin()); else if (ShowError == true) { @@ -203,7 +200,7 @@ public: virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) { if (Pkg->ProvidesList != 0) { - APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, APT::VersionSet::NEWEST); + APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, CacheSetHelper::NEWEST); if (verset.empty() == false) return *(verset.begin()); if (ShowError == true) @@ -231,7 +228,7 @@ public: } APT::VersionSet tryVirtualPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg, - APT::VersionSet::Version const &select) { + CacheSetHelper::VerSelector const select) { /* This is a pure virtual package and there is a single available candidate providing it. */ if (unlikely(Cache[Pkg].CandidateVer != 0) || Pkg->ProvidesList == 0) diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index 0b5ba5b4f..bb9a00803 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -2,12 +2,17 @@ #include <config.h> #include <apt-pkg/cmndline.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/pkgsystem.h> +#include <apt-pkg/init.h> +#include <apt-pkg/error.h> #include <apt-private/private-cmndline.h> #include <vector> #include <stdarg.h> #include <string.h> +#include <stdlib.h> #include <apti18n.h> /*}}}*/ @@ -198,6 +203,7 @@ static bool addArgumentsAPTGet(std::vector<CommandLine::Args> &Args, char const addArg(0,"only-source","APT::Get::Only-Source",0); addArg(0,"arch-only","APT::Get::Arch-Only",0); addArg(0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0); + addArg(0,"allow-insecure-repositories","Acquire::AllowInsecureRepositories",0); addArg(0,"install-recommends","APT::Install-Recommends",CommandLine::Boolean); addArg(0,"install-suggests","APT::Install-Suggests",CommandLine::Boolean); addArg(0,"fix-policy","APT::Get::Fix-Policy-Broken",0); @@ -286,3 +292,31 @@ std::vector<CommandLine::Args> getCommandArgs(char const * const Program, char c /*}}}*/ #undef CmdMatches #undef addArg +void ParseCommandLine(CommandLine &CmdL, CommandLine::Dispatch * const Cmds, CommandLine::Args * const Args,/*{{{*/ + Configuration * const * const Cnf, pkgSystem ** const Sys, int const argc, const char *argv[], bool(*ShowHelp)(CommandLine &CmdL)) +{ + CmdL = CommandLine(Args,_config); + if ((Cnf != NULL && pkgInitConfig(**Cnf) == false) || + CmdL.Parse(argc,argv) == false || + (Sys != NULL && pkgInitSystem(*_config, *Sys) == false)) + { + if (_config->FindB("version") == true) + ShowHelp(CmdL); + + _error->DumpErrors(); + exit(100); + } + + // See if the help should be shown + if (_config->FindB("help") == true || _config->FindB("version") == true) + { + ShowHelp(CmdL); + exit(0); + } + if (Cmds != NULL && CmdL.FileSize() == 0) + { + ShowHelp(CmdL); + exit(1); + } +} + /*}}}*/ diff --git a/apt-private/private-cmndline.h b/apt-private/private-cmndline.h index d0af16782..7b468456b 100644 --- a/apt-private/private-cmndline.h +++ b/apt-private/private-cmndline.h @@ -6,6 +6,12 @@ #include <vector> +class Configuration; +class pkgSystem; + APT_PUBLIC std::vector<CommandLine::Args> getCommandArgs(char const * const Program, char const * const Cmd); +APT_PUBLIC void ParseCommandLine(CommandLine &CmdL, CommandLine::Dispatch * const Cmds, CommandLine::Args * const Args, + Configuration * const * const Cnf, pkgSystem ** const Sys, int const argc, const char * argv[], + bool(*ShowHelp)(CommandLine &CmdL)); #endif diff --git a/apt-private/private-download.cc b/apt-private/private-download.cc index be7d23c31..37fae18e9 100644 --- a/apt-private/private-download.cc +++ b/apt-private/private-download.cc @@ -5,6 +5,7 @@ #include <apt-pkg/acquire-item.h> #include <apt-pkg/configuration.h> #include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> #include <apt-pkg/strutl.h> #include <apt-private/private-output.h> @@ -14,9 +15,66 @@ #include <string> #include <vector> +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#include <fcntl.h> +#include <sys/vfs.h> +#include <sys/statvfs.h> +#include <errno.h> + #include <apti18n.h> /*}}}*/ +bool CheckDropPrivsMustBeDisabled(pkgAcquire &Fetcher) /*{{{*/ +{ + // no need/possibility to drop privs + if(getuid() != 0) + return true; + + // the user does not want to drop privs + std::string SandboxUser = _config->Find("APT::Sandbox::User"); + if (SandboxUser.empty()) + return true; + + struct passwd const * const pw = getpwnam(SandboxUser.c_str()); + if (pw == NULL) + return true; + + if (seteuid(pw->pw_uid) != 0) + return _error->Errno("seteuid", "seteuid %u failed", pw->pw_uid); + + bool res = true; + // check if we can write to destfile + for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); + I != Fetcher.ItemsEnd() && res == true; ++I) + { + if ((*I)->DestFile.empty()) + continue; + // we assume that an existing (partial) file means that we have sufficient rights + if (RealFileExists((*I)->DestFile)) + continue; + int fd = open((*I)->DestFile.c_str(), O_CREAT | O_EXCL | O_RDWR, 0600); + if (fd < 0) + { + res = false; + std::string msg; + strprintf(msg, _("Can't drop privileges for downloading as file '%s' couldn't be accessed by user '%s'."), + (*I)->DestFile.c_str(), SandboxUser.c_str()); + std::cerr << "W: " << msg << std::endl; + _config->Set("APT::Sandbox::User", ""); + break; + } + unlink((*I)->DestFile.c_str()); + close(fd); + } + + if (seteuid(0) != 0) + return _error->Errno("seteuid", "seteuid %u failed", 0); + + return res; +} + /*}}}*/ // CheckAuth - check if each download comes form a trusted source /*{{{*/ bool CheckAuth(pkgAcquire& Fetcher, bool const PromptUser) { @@ -31,7 +89,7 @@ bool CheckAuth(pkgAcquire& Fetcher, bool const PromptUser) return AuthPrompt(UntrustedList, PromptUser); } -bool AuthPrompt(std::string UntrustedList, bool const PromptUser) +bool AuthPrompt(std::string const &UntrustedList, bool const PromptUser) { ShowList(c2out,_("WARNING: The following packages cannot be authenticated!"),UntrustedList,""); @@ -98,3 +156,39 @@ bool AcquireRun(pkgAcquire &Fetcher, int const PulseInterval, bool * const Failu return true; } /*}}}*/ +bool CheckFreeSpaceBeforeDownload(std::string const &Dir, unsigned long long FetchBytes)/*{{{*/ +{ + uint32_t const RAMFS_MAGIC = 0x858458f6; + /* Check for enough free space, but only if we are actually going to + download */ + if (_config->FindB("APT::Get::Print-URIs", false) == true || + _config->FindB("APT::Get::Download", true) == false) + return true; + + struct statvfs Buf; + if (statvfs(Dir.c_str(),&Buf) != 0) { + if (errno == EOVERFLOW) + return _error->WarningE("statvfs",_("Couldn't determine free space in %s"), + Dir.c_str()); + else + return _error->Errno("statvfs",_("Couldn't determine free space in %s"), + Dir.c_str()); + } + else + { + unsigned long long const FreeBlocks = _config->Find("APT::Sandbox::User").empty() ? Buf.f_bfree : Buf.f_bavail; + if (FreeBlocks < (FetchBytes / Buf.f_bsize)) + { + struct statfs Stat; + if (statfs(Dir.c_str(),&Stat) != 0 +#if HAVE_STRUCT_STATFS_F_TYPE + || Stat.f_type != RAMFS_MAGIC +#endif + ) + return _error->Error(_("You don't have enough free space in %s."), + Dir.c_str()); + } + } + return true; +} + /*}}}*/ diff --git a/apt-private/private-download.h b/apt-private/private-download.h index a90ac7eaa..0a0ac6b95 100644 --- a/apt-private/private-download.h +++ b/apt-private/private-download.h @@ -3,15 +3,21 @@ #include <apt-pkg/macros.h> +#include <string> + class pkgAcquire; +APT_PUBLIC bool CheckDropPrivsMustBeDisabled(pkgAcquire &Fetcher); + // Check if all files in the fetcher are authenticated APT_PUBLIC bool CheckAuth(pkgAcquire& Fetcher, bool const PromptUser); // show a authentication warning prompt and return true if the system // should continue -APT_PUBLIC bool AuthPrompt(std::string UntrustedList, bool const PromptUser); +APT_PUBLIC bool AuthPrompt(std::string const &UntrustedList, bool const PromptUser); APT_PUBLIC bool AcquireRun(pkgAcquire &Fetcher, int const PulseInterval, bool * const Failure, bool * const TransientNetworkFailure); +APT_PUBLIC bool CheckFreeSpaceBeforeDownload(std::string const &Dir, unsigned long long FetchBytes); + #endif diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc index e08cd8057..79a22edf4 100644 --- a/apt-private/private-install.cc +++ b/apt-private/private-install.cc @@ -20,16 +20,15 @@ #include <apt-pkg/packagemanager.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/upgrade.h> +#include <apt-pkg/install-progress.h> -#include <errno.h> #include <stdlib.h> #include <string.h> -#include <sys/statfs.h> -#include <sys/statvfs.h> #include <algorithm> #include <iostream> #include <set> #include <vector> +#include <map> #include <apt-private/acqprogress.h> #include <apt-private/private-install.h> @@ -95,7 +94,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety) { pkgSimulate PM(Cache); -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) +#if APT_PKG_ABI >= 413 APT::Progress::PackageManager *progress = APT::Progress::PackageManagerProgressFactory(); pkgPackageManager::OrderResult Res = PM.DoInstall(progress); delete progress; @@ -117,14 +116,14 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety) return false; // Create the download object - pkgAcquire Fetcher; - AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); + AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); + pkgAcquire Fetcher(&Stat); if (_config->FindB("APT::Get::Print-URIs", false) == true) { // force a hashsum for compatibility reasons _config->CndSet("Acquire::ForceHash", "md5sum"); } - else if (Fetcher.Setup(&Stat, _config->FindDir("Dir::Cache::Archives")) == false) + else if (Fetcher.GetLock(_config->FindDir("Dir::Cache::Archives")) == false) return false; // Read the source list @@ -175,33 +174,9 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety) if (_error->PendingError() == true) return false; - /* Check for enough free space, but only if we are actually going to - download */ - if (_config->FindB("APT::Get::Print-URIs") == false && - _config->FindB("APT::Get::Download",true) == true) - { - struct statvfs Buf; - std::string OutputDir = _config->FindDir("Dir::Cache::Archives"); - if (statvfs(OutputDir.c_str(),&Buf) != 0) { - if (errno == EOVERFLOW) - return _error->WarningE("statvfs",_("Couldn't determine free space in %s"), - OutputDir.c_str()); - else - return _error->Errno("statvfs",_("Couldn't determine free space in %s"), - OutputDir.c_str()); - } else if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize) - { - struct statfs Stat; - if (statfs(OutputDir.c_str(),&Stat) != 0 -#if HAVE_STRUCT_STATFS_F_TYPE - || unsigned(Stat.f_type) != RAMFS_MAGIC -#endif - ) - return _error->Error(_("You don't have enough free space in %s."), - OutputDir.c_str()); - } - } - + if (CheckFreeSpaceBeforeDownload(_config->FindDir("Dir::Cache::Archives"), (FetchBytes - FetchPBytes)) == false) + return false; + // Fail safe check if (_config->FindI("quiet",0) >= 2 || _config->FindB("APT::Get::Assume-Yes",false) == true) @@ -331,8 +306,8 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety) } _system->UnLock(); - -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13) + +#if APT_PKG_ABI >= 413 APT::Progress::PackageManager *progress = APT::Progress::PackageManagerProgressFactory(); pkgPackageManager::OrderResult Res = PM->DoInstall(progress); delete progress; @@ -558,9 +533,9 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, std::list<APT::VersionSet::Modifier> mods; mods.push_back(APT::VersionSet::Modifier(MOD_INSTALL, "+", - APT::VersionSet::Modifier::POSTFIX, APT::VersionSet::CANDIDATE)); + APT::VersionSet::Modifier::POSTFIX, APT::CacheSetHelper::CANDIDATE)); mods.push_back(APT::VersionSet::Modifier(MOD_REMOVE, "-", - APT::VersionSet::Modifier::POSTFIX, APT::VersionSet::NEWEST)); + APT::VersionSet::Modifier::POSTFIX, APT::CacheSetHelper::NEWEST)); CacheSetHelperAPTGet helper(c0out); verset = APT::VersionSet::GroupedFromCommandLine(Cache, CmdL.FileList + 1, mods, fallback, helper); @@ -617,15 +592,14 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, if (Fix != NULL) { // Call the scored problem resolver + OpTextProgress Progress(*_config); + bool const distUpgradeMode = strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0; + bool resolver_fail = false; - if (UpgradeMode == 0) - { - if (strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0) - resolver_fail = APT::Upgrade::Upgrade(Cache, 0); - else - resolver_fail = Fix->Resolve(true); - } else - resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode); + if (distUpgradeMode == true || UpgradeMode != APT::Upgrade::ALLOW_EVERYTHING) + resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode, &Progress); + else + resolver_fail = Fix->Resolve(true, &Progress); if (resolver_fail == false && Cache->BrokenCount() == 0) return false; @@ -680,10 +654,34 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, bool DoInstall(CommandLine &CmdL) { CacheFile Cache; + // first check for local pkgs and add them to the cache + for (const char **I = CmdL.FileList; *I != 0; I++) + { + if(FileExists(*I)) + { + // FIXME: make this more elegant + std::string TypeStr = flExtension(*I) + "-file"; + pkgSourceList::Type *Type = pkgSourceList::Type::GetType(TypeStr.c_str()); + if(Type != 0) + { + std::vector<metaIndex *> List; + std::map<std::string, std::string> Options; + if(Type->CreateItem(List, *I, "", "", Options)) + { + // we have our own CacheFile that gives us a SourceList + // with superpowerz + SourceList *sources = (SourceList*)Cache.GetSourceList(); + sources->AddMetaIndex(List[0]); + } + } + } + } + + // then open the cache if (Cache.OpenForInstall() == false || Cache.CheckDeps(CmdL.FileSize() != 1) == false) return false; - + std::map<unsigned short, APT::VersionSet> verset; if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset, 0)) diff --git a/apt-private/private-install.h b/apt-private/private-install.h index 8daa4a776..62276fbff 100644 --- a/apt-private/private-install.h +++ b/apt-private/private-install.h @@ -16,8 +16,6 @@ class CacheFile; class CommandLine; class pkgProblemResolver; -#define RAMFS_MAGIC 0x858458f6 - APT_PUBLIC bool DoInstall(CommandLine &Cmd); bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc index 536348640..aa3a2c24b 100644 --- a/apt-private/private-list.cc +++ b/apt-private/private-list.cc @@ -37,28 +37,20 @@ struct PackageSortAlphabetic /*{{{*/ return (l_name < r_name); } }; - /*}}}*/ -class PackageNameMatcher : public Matcher /*{{{*/ + +class PackageNameMatcher : public Matcher { -#ifdef PACKAGE_MATCHER_ABI_COMPAT -#define PackageMatcher PackageNameMatchesFnmatch -#endif public: PackageNameMatcher(const char **patterns) { for(int i=0; patterns[i] != NULL; ++i) { std::string pattern = patterns[i]; -#ifdef PACKAGE_MATCHER_ABI_COMPAT - APT::CacheFilter::PackageNameMatchesFnmatch *cachefilter = NULL; - cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern); -#else APT::CacheFilter::PackageMatcher *cachefilter = NULL; if(_config->FindB("APT::Cmd::Use-Regexp", false) == true) cachefilter = new APT::CacheFilter::PackageNameMatchesRegEx(pattern); else cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern); -#endif filters.push_back(cachefilter); } } diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc index fc76a05bc..4e18030ab 100644 --- a/apt-private/private-output.cc +++ b/apt-private/private-output.cc @@ -52,14 +52,14 @@ static void SigWinch(int) #endif } /*}}}*/ -bool InitOutput() /*{{{*/ +bool InitOutput(std::basic_streambuf<char> * const out) /*{{{*/ { if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1) _config->Set("quiet","1"); - c0out.rdbuf(cout.rdbuf()); - c1out.rdbuf(cout.rdbuf()); - c2out.rdbuf(cout.rdbuf()); + c0out.rdbuf(out); + c1out.rdbuf(out); + c2out.rdbuf(out); if (_config->FindI("quiet",0) > 0) c0out.rdbuf(devnull.rdbuf()); if (_config->FindI("quiet",0) > 1) diff --git a/apt-private/private-output.h b/apt-private/private-output.h index e0dc9bf62..d5b57adec 100644 --- a/apt-private/private-output.h +++ b/apt-private/private-output.h @@ -6,6 +6,7 @@ #include <fstream> #include <string> +#include <iostream> // forward declaration class pkgCacheFile; @@ -20,7 +21,7 @@ APT_PUBLIC extern std::ostream c2out; APT_PUBLIC extern std::ofstream devnull; APT_PUBLIC extern unsigned int ScreenWidth; -APT_PUBLIC bool InitOutput(); +APT_PUBLIC bool InitOutput(std::basic_streambuf<char> * const out = std::cout.rdbuf()); void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, pkgCache::VerIterator const &V, std::ostream &out, diff --git a/apt-private/private-show.cc b/apt-private/private-show.cc index 8ae6a6dac..289f035a6 100644 --- a/apt-private/private-show.cc +++ b/apt-private/private-show.cc @@ -141,16 +141,16 @@ bool ShowPackage(CommandLine &CmdL) /*{{{*/ { pkgCacheFile CacheFile; CacheSetHelperVirtuals helper(true, GlobalError::NOTICE); - APT::VersionList::Version const select = _config->FindB("APT::Cache::AllVersions", false) ? - APT::VersionList::ALL : APT::VersionList::CANDIDATE; + APT::CacheSetHelper::VerSelector const select = _config->FindB("APT::Cache::AllVersions", false) ? + APT::CacheSetHelper::ALL : APT::CacheSetHelper::CANDIDATE; APT::VersionList const verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper); for (APT::VersionList::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver) if (DisplayRecord(CacheFile, Ver, c1out) == false) return false; - if (select == APT::VersionList::CANDIDATE) + if (select == APT::CacheSetHelper::CANDIDATE) { - APT::VersionList const verset_all = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionList::ALL, helper); + APT::VersionList const verset_all = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::CacheSetHelper::ALL, helper); int const records = verset_all.size() - verset.size(); if (records > 0) _error->Notice(P_("There is %i additional record. Please use the '-a' switch to see it", "There are %i additional records. Please use the '-a' switch to see them.", records), records); diff --git a/apt-private/private-update.cc b/apt-private/private-update.cc index 1cf3012ed..df77ac33a 100644 --- a/apt-private/private-update.cc +++ b/apt-private/private-update.cc @@ -47,9 +47,7 @@ bool DoUpdate(CommandLine &CmdL) _config->CndSet("Acquire::ForceHash", "md5sum"); // get a fetcher - pkgAcquire Fetcher; - if (Fetcher.Setup(&Stat) == false) - return false; + pkgAcquire Fetcher(&Stat); // Populate it with the source selection and get all Indexes // (GetAll=true) diff --git a/apt-private/private-upgrade.cc b/apt-private/private-upgrade.cc index 31f067576..d13a6af49 100644 --- a/apt-private/private-upgrade.cc +++ b/apt-private/private-upgrade.cc @@ -22,10 +22,8 @@ static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags) if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false) return false; - c0out << _("Calculating upgrade... ") << std::flush; if(!DoCacheManipulationFromCommandLine(CmdL, Cache, UpgradeFlags)) return false; - c0out << _("Done") << std::endl; return InstallPackages(Cache,true); } @@ -35,7 +33,7 @@ static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags) /* Intelligent upgrader that will install and remove packages at will */ bool DoDistUpgrade(CommandLine &CmdL) { - return UpgradeHelper(CmdL, 0); + return UpgradeHelper(CmdL, APT::Upgrade::ALLOW_EVERYTHING); } /*}}}*/ bool DoUpgrade(CommandLine &CmdL) /*{{{*/ diff --git a/buildlib/config.h.in b/buildlib/config.h.in index 6b72fb393..c0fd2e8c6 100644 --- a/buildlib/config.h.in +++ b/buildlib/config.h.in @@ -28,6 +28,10 @@ /* If there is no socklen_t, define this for the netdb shim */ #undef NEED_SOCKLEN_T_DEFINE +/* We need the getresuid() function */ +#undef HAVE_GETRESUID +#undef HAVE_GETRESGID + /* Define to the size of the filesize containing structures */ #undef _FILE_OFFSET_BITS diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc index ac0d48a36..a5024c581 100644 --- a/cmdline/apt-cache.cc +++ b/cmdline/apt-cache.cc @@ -116,7 +116,7 @@ static bool ShowUnMet(pkgCache::VerIterator const &V, bool const Important) continue; // Skip conflicts and replaces - if (End.IsNegative() == true) + if (End.IsNegative() == true || End->Type == pkgCache::Dep::Replaces) continue; // Verify the or group @@ -133,7 +133,7 @@ static bool ShowUnMet(pkgCache::VerIterator const &V, bool const Important) break; } delete [] VList; - + if (Start == End) break; ++Start; @@ -191,7 +191,7 @@ static bool UnMet(CommandLine &CmdL) { CacheSetHelperVirtuals helper(true, GlobalError::NOTICE); APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, - APT::VersionList::CANDIDATE, helper); + APT::CacheSetHelper::CANDIDATE, helper); for (APT::VersionList::iterator V = verset.begin(); V != verset.end(); ++V) if (ShowUnMet(V, Important) == false) return false; @@ -264,6 +264,49 @@ static bool DumpPackage(CommandLine &CmdL) return true; } /*}}}*/ +// ShowHashTableStats - Show stats about a hashtable /*{{{*/ +// --------------------------------------------------------------------- +/* */ +static map_pointer_t PackageNext(pkgCache::Package const * const P) { return P->NextPackage; } +static map_pointer_t GroupNext(pkgCache::Group const * const G) { return G->Next; } +template<class T> +static void ShowHashTableStats(std::string Type, + T *StartP, + map_pointer_t *Hashtable, + unsigned long Size, + map_pointer_t(*Next)(T const * const)) +{ + // hashtable stats for the HashTable + unsigned long NumBuckets = Size; + unsigned long UsedBuckets = 0; + unsigned long UnusedBuckets = 0; + unsigned long LongestBucket = 0; + unsigned long ShortestBucket = NumBuckets; + unsigned long Entries = 0; + for (unsigned int i=0; i < NumBuckets; ++i) + { + T *P = StartP + Hashtable[i]; + if(P == 0 || P == StartP) + { + ++UnusedBuckets; + continue; + } + ++UsedBuckets; + unsigned long ThisBucketSize = 0; + for (; P != StartP; P = StartP + Next(P)) + ++ThisBucketSize; + Entries += ThisBucketSize; + LongestBucket = std::max(ThisBucketSize, LongestBucket); + ShortestBucket = std::min(ThisBucketSize, ShortestBucket); + } + cout << "Total buckets in " << Type << ": " << NumBuckets << std::endl; + cout << " Unused: " << UnusedBuckets << std::endl; + cout << " Used: " << UsedBuckets << std::endl; + cout << " Average entries: " << Entries/(double)NumBuckets << std::endl; + cout << " Longest: " << LongestBucket << std::endl; + cout << " Shortest: " << ShortestBucket << std::endl; +} + /*}}}*/ // Stats - Dump some nice statistics /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -335,45 +378,86 @@ static bool Stats(CommandLine &) SizeToStr(Cache->Head().DescFileCount*Cache->Head().DescFileSz) << ')' << endl; cout << _("Total Provides mappings: ") << Cache->Head().ProvidesCount << " (" << SizeToStr(Cache->Head().ProvidesCount*Cache->Head().ProvidesSz) << ')' << endl; - - // String list stats - unsigned long Size = 0; - unsigned long Count = 0; - for (pkgCache::StringItem *I = Cache->StringItemP + Cache->Head().StringList; - I!= Cache->StringItemP; I = Cache->StringItemP + I->NextItem) - { - Count++; - Size += strlen(Cache->StrP + I->String) + 1; - } - cout << _("Total globbed strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl; - unsigned long DepVerSize = 0; + // String list stats + std::set<map_stringitem_t> stritems; + for (pkgCache::GrpIterator G = Cache->GrpBegin(); G.end() == false; ++G) + stritems.insert(G->Name); for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P) { + stritems.insert(P->Arch); for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V) { + if (V->VerStr != 0) + stritems.insert(V->VerStr); + if (V->Section != 0) + stritems.insert(V->Section); +#if APT_PKG_ABI >= 413 + stritems.insert(V->SourcePkgName); + stritems.insert(V->SourceVerStr); +#endif for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; ++D) { if (D->Version != 0) - DepVerSize += strlen(D.TargetVer()) + 1; + stritems.insert(D->Version); + } + for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; ++D) + { + stritems.insert(D->md5sum); + stritems.insert(D->language_code); } } + for (pkgCache::PrvIterator Prv = P.ProvidesList(); Prv.end() == false; ++Prv) + { + if (Prv->ProvideVersion != 0) + stritems.insert(Prv->ProvideVersion); + } } - cout << _("Total dependency version space: ") << SizeToStr(DepVerSize) << endl; - + for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F != Cache->FileEnd(); ++F) + { + stritems.insert(F->FileName); + stritems.insert(F->Archive); + stritems.insert(F->Codename); + stritems.insert(F->Component); + stritems.insert(F->Version); + stritems.insert(F->Origin); + stritems.insert(F->Label); + stritems.insert(F->Architecture); + stritems.insert(F->Site); + stritems.insert(F->IndexType); + } + unsigned long Size = 0; + for (std::set<map_stringitem_t>::const_iterator i = stritems.begin(); i != stritems.end(); ++i) + Size += strlen(Cache->StrP + *i) + 1; + + cout << _("Total globbed strings: ") << stritems.size() << " (" << SizeToStr(Size) << ')' << endl; + stritems.clear(); + unsigned long Slack = 0; for (int I = 0; I != 7; I++) Slack += Cache->Head().Pools[I].ItemSize*Cache->Head().Pools[I].Count; cout << _("Total slack space: ") << SizeToStr(Slack) << endl; - + unsigned long Total = 0; - Total = Slack + Size + Cache->Head().DependsCount*Cache->Head().DependencySz + - Cache->Head().VersionCount*Cache->Head().VersionSz + - Cache->Head().PackageCount*Cache->Head().PackageSz + - Cache->Head().VerFileCount*Cache->Head().VerFileSz + - Cache->Head().ProvidesCount*Cache->Head().ProvidesSz; +#define APT_CACHESIZE(X,Y) (Cache->Head().X * Cache->Head().Y) + Total = Slack + Size + + APT_CACHESIZE(GroupCount, GroupSz) + + APT_CACHESIZE(PackageCount, PackageSz) + + APT_CACHESIZE(VersionCount, VersionSz) + + APT_CACHESIZE(DescriptionCount, DescriptionSz) + + APT_CACHESIZE(DependsCount, DependencySz) + + APT_CACHESIZE(PackageFileCount, PackageFileSz) + + APT_CACHESIZE(VerFileCount, VerFileSz) + + APT_CACHESIZE(DescFileCount, DescFileSz) + + APT_CACHESIZE(ProvidesCount, ProvidesSz) + + (2 * Cache->Head().GetHashTableSize() * sizeof(map_id_t)); cout << _("Total space accounted for: ") << SizeToStr(Total) << endl; - +#undef APT_CACHESIZE + + // hashtable stats + ShowHashTableStats<pkgCache::Package>("PkgHashTable", Cache->PkgP, Cache->Head().PkgHashTableP(), Cache->Head().GetHashTableSize(), PackageNext); + ShowHashTableStats<pkgCache::Group>("GrpHashTable", Cache->GrpP, Cache->Head().GrpHashTableP(), Cache->Head().GetHashTableSize(), GroupNext); + return true; } /*}}}*/ @@ -579,7 +663,7 @@ static bool ShowDepends(CommandLine &CmdL, bool const RevDepends) return false; CacheSetHelperVirtuals helper(false); - APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper); + APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::CacheSetHelper::CANDIDATE, helper); if (verset.empty() == true && helper.virtualPkgs.empty() == true) return _error->Error(_("No packages found")); std::vector<bool> Shown(Cache->Head().PackageCount); @@ -647,7 +731,7 @@ static bool ShowDepends(CommandLine &CmdL, bool const RevDepends) if (Recurse == true && Shown[Trg->ID] == false) { Shown[Trg->ID] = true; - verset.insert(APT::VersionSet::FromPackage(CacheFile, Trg, APT::VersionSet::CANDIDATE, helper)); + verset.insert(APT::VersionSet::FromPackage(CacheFile, Trg, APT::CacheSetHelper::CANDIDATE, helper)); } } @@ -666,7 +750,7 @@ static bool ShowDepends(CommandLine &CmdL, bool const RevDepends) if (Recurse == true && Shown[V.ParentPkg()->ID] == false) { Shown[V.ParentPkg()->ID] = true; - verset.insert(APT::VersionSet::FromPackage(CacheFile, V.ParentPkg(), APT::VersionSet::CANDIDATE, helper)); + verset.insert(APT::VersionSet::FromPackage(CacheFile, V.ParentPkg(), APT::CacheSetHelper::CANDIDATE, helper)); } } @@ -761,9 +845,9 @@ static bool XVcg(CommandLine &CmdL) // Load the list of packages from the command line into the show list APT::CacheSetHelper helper(true, GlobalError::NOTICE); - std::list<APT::PackageSet::Modifier> mods; - mods.push_back(APT::PackageSet::Modifier(0, ",", APT::PackageSet::Modifier::POSTFIX)); - mods.push_back(APT::PackageSet::Modifier(1, "^", APT::PackageSet::Modifier::POSTFIX)); + std::list<APT::CacheSetHelper::PkgModifier> mods; + mods.push_back(APT::CacheSetHelper::PkgModifier(0, ",", APT::PackageSet::Modifier::POSTFIX)); + mods.push_back(APT::CacheSetHelper::PkgModifier(1, "^", APT::PackageSet::Modifier::POSTFIX)); std::map<unsigned short, APT::PackageSet> pkgsets = APT::PackageSet::GroupedFromCommandLine(CacheFile, CmdL.FileList + 1, mods, 0, helper); @@ -973,9 +1057,9 @@ static bool Dotty(CommandLine &CmdL) // Load the list of packages from the command line into the show list APT::CacheSetHelper helper(true, GlobalError::NOTICE); - std::list<APT::PackageSet::Modifier> mods; - mods.push_back(APT::PackageSet::Modifier(0, ",", APT::PackageSet::Modifier::POSTFIX)); - mods.push_back(APT::PackageSet::Modifier(1, "^", APT::PackageSet::Modifier::POSTFIX)); + std::list<APT::CacheSetHelper::PkgModifier> mods; + mods.push_back(APT::CacheSetHelper::PkgModifier(0, ",", APT::PackageSet::Modifier::POSTFIX)); + mods.push_back(APT::CacheSetHelper::PkgModifier(1, "^", APT::PackageSet::Modifier::POSTFIX)); std::map<unsigned short, APT::PackageSet> pkgsets = APT::PackageSet::GroupedFromCommandLine(CacheFile, CmdL.FileList + 1, mods, 0, helper); @@ -1231,7 +1315,7 @@ static bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V) struct ExDescFile { pkgCache::DescFile *Df; - map_ptrloc ID; + map_id_t ID; }; // Search - Perform a search /*{{{*/ @@ -1429,8 +1513,8 @@ static bool ShowPackage(CommandLine &CmdL) { pkgCacheFile CacheFile; CacheSetHelperVirtuals helper(true, GlobalError::NOTICE); - APT::VersionList::Version const select = _config->FindB("APT::Cache::AllVersions", true) ? - APT::VersionList::ALL : APT::VersionList::CANDIDATE; + APT::CacheSetHelper::VerSelector const select = _config->FindB("APT::Cache::AllVersions", true) ? + APT::CacheSetHelper::ALL : APT::CacheSetHelper::CANDIDATE; APT::VersionList const verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper); for (APT::VersionList::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver) if (DisplayRecord(CacheFile, Ver) == false) @@ -1812,26 +1896,10 @@ int main(int argc,const char *argv[]) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(),_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - _error->DumpErrors(); - return 100; - } + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp); - // See if the help should be shown - if (_config->FindB("help") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } - - // Deal with stdout not being a tty - if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1) - _config->Set("quiet","1"); + InitOutput(); if (_config->Exists("APT::Cache::Generate") == true) _config->Set("pkgCacheFile::Generate", _config->FindB("APT::Cache::Generate", true)); diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc index 53efe65b8..327039e00 100644 --- a/cmdline/apt-cdrom.cc +++ b/cmdline/apt-cdrom.cc @@ -31,6 +31,7 @@ #include <unistd.h> #include <apt-private/private-cmndline.h> +#include <apt-private/private-output.h> #include <apti18n.h> /*}}}*/ @@ -249,24 +250,11 @@ int main(int argc,const char *argv[]) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(),_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - _error->DumpErrors(); - return 100; - } + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp); - // See if the help should be shown - if (_config->FindB("help") == true || _config->FindB("version") == true || - CmdL.FileSize() == 0) - return ShowHelp(CmdL); + InitOutput(); - // Deal with stdout not being a tty - if (isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1) - _config->Set("quiet","1"); - // Match the operation bool returned = CmdL.DispatchArg(Cmds); diff --git a/cmdline/apt-config.cc b/cmdline/apt-config.cc index 40ba468eb..e0b8a624e 100644 --- a/cmdline/apt-config.cc +++ b/cmdline/apt-config.cc @@ -115,19 +115,8 @@ int main(int argc,const char *argv[]) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(),_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - CmdL.FileSize() == 0) - return ShowHelp(CmdL); + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp); std::vector<std::string> const langs = APT::Configuration::getLanguages(true); _config->Clear("Acquire::Languages"); diff --git a/cmdline/apt-dump-solver.cc b/cmdline/apt-dump-solver.cc index 04e13bde9..f765234c5 100644 --- a/cmdline/apt-dump-solver.cc +++ b/cmdline/apt-dump-solver.cc @@ -40,6 +40,8 @@ int main(int argc,const char *argv[]) /*{{{*/ ShowHelp(); return 0; } + // we really don't need anything + DropPrivileges(); FILE* input = fdopen(STDIN_FILENO, "r"); FILE* output = fopen("/tmp/dump.edsp", "w"); diff --git a/cmdline/apt-extracttemplates.cc b/cmdline/apt-extracttemplates.cc index e4428e051..5211ee027 100644 --- a/cmdline/apt-extracttemplates.cc +++ b/cmdline/apt-extracttemplates.cc @@ -33,6 +33,8 @@ #include <apt-pkg/dirstream.h> #include <apt-pkg/mmap.h> +#include <apt-private/private-cmndline.h> + #include <iostream> #include <stdio.h> #include <string.h> @@ -52,7 +54,7 @@ pkgCache *DebFile::Cache = 0; // --------------------------------------------------------------------- /* */ DebFile::DebFile(const char *debfile) - : File(debfile, FileFd::ReadOnly), Size(0), Control(NULL), ControlLen(0), + : File(debfile, FileFd::ReadOnly), Control(NULL), ControlLen(0), DepOp(0), PreDepOp(0), Config(0), Template(0), Which(None) { } @@ -103,10 +105,12 @@ bool DebFile::DoItem(Item &I, int &Fd) if (strcmp(I.Name, "control") == 0) { delete [] Control; - Control = new char[I.Size+1]; - Control[I.Size] = 0; + Control = new char[I.Size+3]; + Control[I.Size] = '\n'; + Control[I.Size + 1] = '\n'; + Control[I.Size + 2] = '\0'; Which = IsControl; - ControlLen = I.Size; + ControlLen = I.Size + 3; // make it call the Process method below. this is so evil Fd = -2; } @@ -138,7 +142,7 @@ bool DebFile::DoItem(Item &I, int &Fd) // --------------------------------------------------------------------- /* */ bool DebFile::Process(Item &/*I*/, const unsigned char *data, - unsigned long size, unsigned long pos) + unsigned long long size, unsigned long long pos) { switch (Which) { @@ -162,9 +166,10 @@ bool DebFile::Process(Item &/*I*/, const unsigned char *data, bool DebFile::ParseInfo() { if (Control == NULL) return false; - + pkgTagSection Section; - Section.Scan(Control, ControlLen); + if (Section.Scan(Control, ControlLen) == false) + return false; Package = Section.FindS("Package"); Version = GetInstalledVer(Package); @@ -212,15 +217,15 @@ bool DebFile::ParseInfo() // ShowHelp - show a short help text /*{{{*/ // --------------------------------------------------------------------- /* */ -static int ShowHelp(void) +static bool ShowHelp(CommandLine &) { - ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION, + ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION, COMMON_ARCH,__DATE__,__TIME__); - if (_config->FindB("version") == true) - return 0; + if (_config->FindB("version") == true) + return true; - cout << + cout << _("Usage: apt-extracttemplates file1 [file2 ...]\n" "\n" "apt-extracttemplates is a tool to extract config and template info\n" @@ -231,7 +236,7 @@ static int ShowHelp(void) " -t Set the temp dir\n" " -c=? Read this configuration file\n" " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"); - return 0; + return true; } /*}}}*/ // WriteFile - write the contents of the passed string to a file /*{{{*/ @@ -353,20 +358,10 @@ int main(int argc, const char **argv) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args,_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - CmdL.FileSize() == 0) - return ShowHelp(); - + CommandLine::Dispatch Cmds[] = {{NULL, NULL}}; + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args, &_config, &_system, argc, argv, ShowHelp); + Go(CmdL); // Print any errors or warnings found during operation diff --git a/cmdline/apt-extracttemplates.h b/cmdline/apt-extracttemplates.h index 9cc3f5f25..829cdae75 100644 --- a/cmdline/apt-extracttemplates.h +++ b/cmdline/apt-extracttemplates.h @@ -20,7 +20,6 @@ class pkgCache; class DebFile : public pkgDirStream { FileFd File; - unsigned long Size; char *Control; unsigned long ControlLen; @@ -29,7 +28,7 @@ public: ~DebFile(); bool DoItem(Item &I, int &fd); bool Process(pkgDirStream::Item &I, const unsigned char *data, - unsigned long size, unsigned long pos); + unsigned long long size, unsigned long long pos); bool Go(); bool ParseInfo(); diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index a28537712..33bbdd861 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -78,10 +78,11 @@ #include <string.h> #include <sys/ioctl.h> #include <sys/stat.h> -#include <sys/statfs.h> -#include <sys/statvfs.h> #include <sys/wait.h> #include <unistd.h> +#include <pwd.h> +#include <grp.h> + #include <algorithm> #include <fstream> #include <iostream> @@ -135,28 +136,6 @@ static bool TryToInstallBuildDep(pkgCache::PkgIterator Pkg,pkgCacheFile &Cache, return true; } /*}}}*/ - - -// helper that can go wit hthe next ABI break -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13) -static std::string MetaIndexFileNameOnDisk(metaIndex *metaindex) -{ - // FIXME: this cast is the horror, the horror - debReleaseIndex *r = (debReleaseIndex*)metaindex; - - // see if we have a InRelease file - std::string PathInRelease = r->MetaIndexFile("InRelease"); - if (FileExists(PathInRelease)) - return PathInRelease; - - // and if not return the normal one - if (FileExists(PathInRelease)) - return r->MetaIndexFile("Release"); - - return ""; -} -#endif - // GetReleaseForSourceRecord - Return Suite for the given srcrecord /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -175,12 +154,8 @@ static std::string GetReleaseForSourceRecord(pkgSourceList *SrcList, { if (&CurrentIndexFile == (*IF)) { -#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13) - std::string path = MetaIndexFileNameOnDisk(*S); -#else - std::string path = (*S)->LocalFileName(); -#endif - if (path != "") + std::string const path = (*S)->LocalFileName(); + if (path != "") { indexRecords records; records.Load(path); @@ -195,7 +170,11 @@ static std::string GetReleaseForSourceRecord(pkgSourceList *SrcList, // FindSrc - Find a source record /*{{{*/ // --------------------------------------------------------------------- /* */ +#if APT_PKG_ABI >= 413 +static pkgSrcRecords::Parser *FindSrc(const char *Name, +#else static pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, +#endif pkgSrcRecords &SrcRecs,string &Src, CacheFile &CacheFile) { @@ -303,16 +282,21 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, (VF.File().Archive() != 0 && VF.File().Archive() == RelTag) || (VF.File().Codename() != 0 && VF.File().Codename() == RelTag)) { + // the Version we have is possibly fuzzy or includes binUploads, + // so we use the Version of the SourcePkg (empty if same as package) +#if APT_PKG_ABI >= 413 + Src = Ver.SourcePkgName(); + VerTag = Ver.SourceVerStr(); +#else pkgRecords::Parser &Parse = Recs.Lookup(VF); Src = Parse.SourcePkg(); // no SourcePkg name, so it is the "binary" name if (Src.empty() == true) Src = TmpSrc; - // the Version we have is possibly fuzzy or includes binUploads, - // so we use the Version of the SourcePkg (empty if same as package) VerTag = Parse.SourceVer(); if (VerTag.empty() == true) VerTag = Ver.VerStr(); +#endif break; } } @@ -343,10 +327,17 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, pkgCache::VerIterator Ver = Cache->GetCandidateVer(Pkg); if (Ver.end() == false) { +#if APT_PKG_ABI >= 413 + if (strcmp(Ver.SourcePkgName(),Ver.ParentPkg().Name()) != 0) + Src = Ver.SourcePkgName(); + if (VerTag.empty() == true && strcmp(Ver.SourceVerStr(),Ver.VerStr()) != 0) + VerTag = Ver.SourceVerStr(); +#else pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); Src = Parse.SourcePkg(); if (VerTag.empty() == true) VerTag = Parse.SourceVer(); +#endif } } } @@ -540,7 +531,7 @@ static bool DoDSelectUpgrade(CommandLine &) } // Now upgrade everything - if (pkgAllUpgrade(Cache) == false) + if (APT::Upgrade::Upgrade(Cache, APT::Upgrade::FORBID_REMOVE_PACKAGES | APT::Upgrade::FORBID_INSTALL_NEW_PACKAGES) == false) { ShowBroken(c1out,Cache,false); return _error->Error(_("Internal error, problem resolver broke stuff")); @@ -555,30 +546,26 @@ static bool DoDSelectUpgrade(CommandLine &) static bool DoClean(CommandLine &) { std::string const archivedir = _config->FindDir("Dir::Cache::archives"); - std::string const pkgcache = _config->FindFile("Dir::cache::pkgcache"); - std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache"); + std::string const listsdir = _config->FindDir("Dir::state::lists"); if (_config->FindB("APT::Get::Simulate") == true) { + std::string const pkgcache = _config->FindFile("Dir::cache::pkgcache"); + std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache"); cout << "Del " << archivedir << "* " << archivedir << "partial/*"<< endl + << "Del " << listsdir << "partial/*" << endl << "Del " << pkgcache << " " << srcpkgcache << endl; return true; } - - // Lock the archive directory - FileFd Lock; - if (_config->FindB("Debug::NoLocking",false) == false) - { - int lock_fd = GetLock(archivedir + "lock"); - if (lock_fd < 0) - return _error->Error(_("Unable to lock the download directory")); - Lock.Fd(lock_fd); - } - + pkgAcquire Fetcher; + Fetcher.GetLock(archivedir); Fetcher.Clean(archivedir); Fetcher.Clean(archivedir + "partial/"); + Fetcher.GetLock(listsdir); + Fetcher.Clean(listsdir + "partial/"); + pkgCacheFile::RemoveCaches(); return true; @@ -632,15 +619,13 @@ static bool DoDownload(CommandLine &CmdL) APT::CacheSetHelper helper(c0out); APT::VersionSet verset = APT::VersionSet::FromCommandLine(Cache, - CmdL.FileList + 1, APT::VersionSet::CANDIDATE, helper); + CmdL.FileList + 1, APT::CacheSetHelper::CANDIDATE, helper); if (verset.empty() == true) return false; AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet", 0)); - pkgAcquire Fetcher; - if (Fetcher.Setup(&Stat) == false) - return false; + pkgAcquire Fetcher(&Stat); pkgRecords Recs(Cache); pkgSourceList *SrcList = Cache.GetSourceList(); @@ -655,6 +640,8 @@ static bool DoDownload(CommandLine &CmdL) Ver != verset.end(); ++Ver, ++i) { pkgAcquire::Item *I = new pkgAcqArchive(&Fetcher, SrcList, &Recs, *Ver, storefile[i]); + if (storefile[i].empty()) + continue; std::string const filename = cwd + flNotDir(storefile[i]); storefile[i].assign(filename); I->DestFile.assign(filename); @@ -670,6 +657,9 @@ static bool DoDownload(CommandLine &CmdL) return true; } + // Disable drop-privs if "_apt" can not write to the target dir + CheckDropPrivsMustBeDisabled(Fetcher); + if (_error->PendingError() == true || CheckAuth(Fetcher, false) == false) return false; @@ -731,15 +721,16 @@ static bool DoSource(CommandLine &CmdL) pkgSourceList *List = Cache.GetSourceList(); // Create the text record parsers +#if APT_PKG_ABI < 413 pkgRecords Recs(Cache); +#endif pkgSrcRecords SrcRecs(*List); if (_error->PendingError() == true) return false; // Create the download object - AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); - pkgAcquire Fetcher; - Fetcher.SetLog(&Stat); + AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); + pkgAcquire Fetcher(&Stat); SPtrArray<DscFile> Dsc = new DscFile[CmdL.FileSize()]; @@ -760,8 +751,11 @@ static bool DoSource(CommandLine &CmdL) for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++) { string Src; +#if APT_PKG_ABI >= 413 + pkgSrcRecords::Parser *Last = FindSrc(*I,SrcRecs,Src,Cache); +#else pkgSrcRecords::Parser *Last = FindSrc(*I,Recs,SrcRecs,Src,Cache); - +#endif if (Last == 0) { return _error->Error(_("Unable to find a source package for %s"),Src.c_str()); } @@ -842,8 +836,7 @@ static bool DoSource(CommandLine &CmdL) } // see if we have a hash (Acquire::ForceHash is the only way to have none) - HashString const * const hs = I->Hashes.find(NULL); - if (hs == NULL && _config->FindB("APT::Get::AllowUnauthenticated",false) == false) + if (I->Hashes.usable() == false && _config->FindB("APT::Get::AllowUnauthenticated",false) == false) { ioprintf(c1out, "Skipping download of file '%s' as requested hashsum is not available for authentication\n", localFile.c_str()); @@ -851,43 +844,18 @@ static bool DoSource(CommandLine &CmdL) } new pkgAcqFile(&Fetcher,Last->Index().ArchiveURI(I->Path), - hs != NULL ? hs->toStr() : "", I->FileSize, - Last->Index().SourceInfo(*Last,*I),Src); + I->Hashes, I->FileSize, Last->Index().SourceInfo(*Last,*I), Src); } } - // check authentication status of the source as well - if (UntrustedList != "" && !AuthPrompt(UntrustedList, false)) - return false; - // Display statistics unsigned long long FetchBytes = Fetcher.FetchNeeded(); unsigned long long FetchPBytes = Fetcher.PartialPresent(); unsigned long long DebBytes = Fetcher.TotalNeeded(); - // Check for enough free space - struct statvfs Buf; - string OutputDir = "."; - if (statvfs(OutputDir.c_str(),&Buf) != 0) { - if (errno == EOVERFLOW) - return _error->WarningE("statvfs",_("Couldn't determine free space in %s"), - OutputDir.c_str()); - else - return _error->Errno("statvfs",_("Couldn't determine free space in %s"), - OutputDir.c_str()); - } else if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize) - { - struct statfs Stat; - if (statfs(OutputDir.c_str(),&Stat) != 0 -#if HAVE_STRUCT_STATFS_F_TYPE - || unsigned(Stat.f_type) != RAMFS_MAGIC -#endif - ) { - return _error->Error(_("You don't have enough free space in %s"), - OutputDir.c_str()); - } - } - + if (CheckFreeSpaceBeforeDownload(".", (FetchBytes - FetchPBytes)) == false) + return false; + // Number of bytes if (DebBytes != FetchBytes) //TRANSLATOR: The required space between number and unit is already included @@ -906,7 +874,7 @@ static bool DoSource(CommandLine &CmdL) ioprintf(cout,_("Fetch source %s\n"),Dsc[I].Package.c_str()); return true; } - + // Just print out the uris an exit if the --print-uris flag was used if (_config->FindB("APT::Get::Print-URIs") == true) { @@ -917,6 +885,13 @@ static bool DoSource(CommandLine &CmdL) return true; } + // Disable drop-privs if "_apt" can not write to the target dir + CheckDropPrivsMustBeDisabled(Fetcher); + + // check authentication status of the source as well + if (UntrustedList != "" && !AuthPrompt(UntrustedList, false)) + return false; + // Run it bool Failed = false; if (AcquireRun(Fetcher, 0, &Failed, NULL) == false || Failed == true) @@ -1039,17 +1014,13 @@ static bool DoBuildDep(CommandLine &CmdL) pkgSourceList *List = Cache.GetSourceList(); // Create the text record parsers +#if APT_PKG_ABI < 413 pkgRecords Recs(Cache); +#endif pkgSrcRecords SrcRecs(*List); if (_error->PendingError() == true) return false; - // Create the download object - AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); - pkgAcquire Fetcher; - if (Fetcher.Setup(&Stat) == false) - return false; - bool StripMultiArch; string hostArch = _config->Find("APT::Get::Host-Architecture"); if (hostArch.empty() == false) @@ -1066,7 +1037,39 @@ static bool DoBuildDep(CommandLine &CmdL) for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++) { string Src; - pkgSrcRecords::Parser *Last = FindSrc(*I,Recs,SrcRecs,Src,Cache); + pkgSrcRecords::Parser *Last = 0; + + // an unpacked debian source tree + using APT::String::Startswith; + if ((Startswith(*I, "./") || Startswith(*I, "/")) && + DirectoryExists(*I)) + { + ioprintf(c1out, _("Note, using directory '%s' to get the build dependencies\n"), *I); + // FIXME: how can we make this more elegant? + std::string TypeName = "debian/control File Source Index"; + pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(TypeName.c_str()); + if(Type != NULL) + Last = Type->CreateSrcPkgParser(*I); + } + // if its a local file (e.g. .dsc) use this + else if (FileExists(*I)) + { + ioprintf(c1out, _("Note, using file '%s' to get the build dependencies\n"), *I); + + // see if we can get a parser for this pkgIndexFile type + string TypeName = flExtension(*I) + " File Source Index"; + pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(TypeName.c_str()); + if(Type != NULL) + Last = Type->CreateSrcPkgParser(*I); + } else { + // normal case, search the cache for the source file +#if APT_PKG_ABI >= 413 + Last = FindSrc(*I,SrcRecs,Src,Cache); +#else + Last = FindSrc(*I,Recs,SrcRecs,Src,Cache); +#endif + } + if (Last == 0) return _error->Error(_("Unable to find a source package for %s"),Src.c_str()); @@ -1084,7 +1087,7 @@ static bool DoBuildDep(CommandLine &CmdL) } else if (Last->BuildDepends(BuildDeps, _config->FindB("APT::Get::Arch-Only", false), StripMultiArch) == false) return _error->Error(_("Unable to get build-dependency information for %s"),Src.c_str()); - + // Also ensure that build-essential packages are present Configuration::Item const *Opts = _config->Tree("APT::Build-Essential"); if (Opts) @@ -1415,21 +1418,24 @@ static bool DoBuildDep(CommandLine &CmdL) * pool/ next to the deb itself) * Example return: "pool/main/a/apt/apt_0.8.8ubuntu3" */ -static string GetChangelogPath(CacheFile &Cache, - pkgCache::PkgIterator Pkg, +static string GetChangelogPath(CacheFile &Cache, pkgCache::VerIterator Ver) { - string path; - pkgRecords Recs(Cache); pkgRecords::Parser &rec=Recs.Lookup(Ver.FileList()); - string srcpkg = rec.SourcePkg().empty() ? Pkg.Name() : rec.SourcePkg(); + string path = flNotFile(rec.FileName()); +#if APT_PKG_ABI >= 413 + path.append(Ver.SourcePkgName()); + path.append("_"); + path.append(StripEpoch(Ver.SourceVerStr())); +#else + string srcpkg = rec.SourcePkg().empty() ? Ver.ParentPkg().Name() : rec.SourcePkg(); string ver = Ver.VerStr(); // if there is a source version it always wins if (rec.SourceVer() != "") ver = rec.SourceVer(); - path = flNotFile(rec.FileName()); path += srcpkg + "_" + StripEpoch(ver); +#endif return path; } /*}}}*/ @@ -1443,7 +1449,6 @@ static string GetChangelogPath(CacheFile &Cache, * http://packages.medibuntu.org/pool/non-free/m/mplayer/mplayer_1.0~rc4~try1.dsfg1-1ubuntu1+medibuntu1.changelog */ static bool GuessThirdPartyChangelogUri(CacheFile &Cache, - pkgCache::PkgIterator Pkg, pkgCache::VerIterator Ver, string &out_uri) { @@ -1458,7 +1463,7 @@ static bool GuessThirdPartyChangelogUri(CacheFile &Cache, return false; // get archive uri for the binary deb - string path_without_dot_changelog = GetChangelogPath(Cache, Pkg, Ver); + string path_without_dot_changelog = GetChangelogPath(Cache, Ver); out_uri = index->ArchiveURI(path_without_dot_changelog + ".changelog"); // now strip away the filename and add srcpkg_srcver.changelog @@ -1476,44 +1481,45 @@ static bool DownloadChangelog(CacheFile &CacheFile, pkgAcquire &Fetcher, * GuessThirdPartyChangelogUri for details how) */ { - string path; - string descr; - string server; - string changelog_uri; - - // data structures we need - pkgCache::PkgIterator Pkg = Ver.ParentPkg(); - // make the server root configurable - server = _config->Find("Apt::Changelogs::Server", + string const server = _config->Find("Apt::Changelogs::Server", "http://packages.debian.org/changelogs"); - path = GetChangelogPath(CacheFile, Pkg, Ver); - strprintf(changelog_uri, "%s/%s/changelog", server.c_str(), path.c_str()); + string const path = GetChangelogPath(CacheFile, Ver); + string changelog_uri; + if (APT::String::Endswith(server, "/") == true) + strprintf(changelog_uri, "%s%s/changelog", server.c_str(), path.c_str()); + else + strprintf(changelog_uri, "%s/%s/changelog", server.c_str(), path.c_str()); if (_config->FindB("APT::Get::Print-URIs", false) == true) { std::cout << '\'' << changelog_uri << '\'' << std::endl; return true; } + pkgCache::PkgIterator const Pkg = Ver.ParentPkg(); + string descr; strprintf(descr, _("Changelog for %s (%s)"), Pkg.Name(), changelog_uri.c_str()); // queue it - new pkgAcqFile(&Fetcher, changelog_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile); + pkgAcquire::Item const * itm = new pkgAcqFile(&Fetcher, changelog_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile); + + // Disable drop-privs if "_apt" can not write to the target dir + CheckDropPrivsMustBeDisabled(Fetcher); // try downloading it, if that fails, try third-party-changelogs location // FIXME: Fetcher.Run() is "Continue" even if I get a 404?!? Fetcher.Run(); - if (!FileExists(targetfile)) + if (itm->Status != pkgAcquire::Item::StatDone) { string third_party_uri; - if (GuessThirdPartyChangelogUri(CacheFile, Pkg, Ver, third_party_uri)) + if (GuessThirdPartyChangelogUri(CacheFile, Ver, third_party_uri)) { strprintf(descr, _("Changelog for %s (%s)"), Pkg.Name(), third_party_uri.c_str()); - new pkgAcqFile(&Fetcher, third_party_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile); + itm = new pkgAcqFile(&Fetcher, third_party_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile); Fetcher.Run(); } } - if (FileExists(targetfile)) + if (itm->Status == pkgAcquire::Item::StatDone) return true; // error @@ -1530,7 +1536,7 @@ static bool DoChangelog(CommandLine &CmdL) APT::CacheSetHelper helper(c0out); APT::VersionList verset = APT::VersionList::FromCommandLine(Cache, - CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper); + CmdL.FileList + 1, APT::CacheSetHelper::CANDIDATE, helper); if (verset.empty() == true) return false; pkgAcquire Fetcher; @@ -1545,7 +1551,7 @@ static bool DoChangelog(CommandLine &CmdL) } AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet",0)); - Fetcher.Setup(&Stat); + Fetcher.SetLog(&Stat); bool const downOnly = _config->FindB("APT::Get::Download-Only", false); @@ -1559,6 +1565,19 @@ static bool DoChangelog(CommandLine &CmdL) tmpdir = mkdtemp(tmpname); if (tmpdir == NULL) return _error->Errno("mkdtemp", "mkdtemp failed"); + + std::string const SandboxUser = _config->Find("APT::Sandbox::User"); + if (getuid() == 0 && SandboxUser.empty() == false) // if we aren't root, we can't chown, so don't try it + { + struct passwd const * const pw = getpwnam(SandboxUser.c_str()); + struct group const * const gr = getgrnam("root"); + if (pw != NULL && gr != NULL) + { + // chown the tmp dir directory we use to the sandbox user + if(chown(tmpdir, pw->pw_uid, gr->gr_gid) != 0) + _error->WarningE("DoChangelog", "chown to %s:%s of directory %s failed", SandboxUser.c_str(), "root", tmpdir); + } + } } for (APT::VersionList::const_iterator Ver = verset.begin(); @@ -1574,7 +1593,7 @@ static bool DoChangelog(CommandLine &CmdL) { DisplayFileInPager(changelogfile); // cleanup temp file - unlink(changelogfile.c_str()); + unlink(changelogfile.c_str()); } } // clenaup tmp dir @@ -1709,26 +1728,8 @@ int main(int argc,const char *argv[]) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(),_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - if (_config->FindB("version") == true) - ShowHelp(CmdL); - - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp); // see if we are in simulate mode CheckSimulateMode(CmdL); diff --git a/cmdline/apt-helper.cc b/cmdline/apt-helper.cc index 63f70983c..a05ae90a2 100644 --- a/cmdline/apt-helper.cc +++ b/cmdline/apt-helper.cc @@ -48,9 +48,8 @@ static bool DoDownloadFile(CommandLine &CmdL) if (CmdL.FileSize() <= 2) return _error->Error(_("Must specify at least one pair url/filename")); - pkgAcquire Fetcher; AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet",0)); - Fetcher.Setup(&Stat); + pkgAcquire Fetcher(&Stat); size_t fileind = 0; std::vector<std::string> targetfiles; @@ -68,6 +67,9 @@ static bool DoDownloadFile(CommandLine &CmdL) fileind += 3; } + // Disable drop-privs if "_apt" can not write to the target dir + CheckDropPrivsMustBeDisabled(Fetcher); + bool Failed = false; if (AcquireRun(Fetcher, 0, &Failed, NULL) == false || Failed == true) return _error->Error(_("Download Failed")); @@ -117,25 +119,8 @@ int main(int argc,const char *argv[]) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(),_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - if (_config->FindB("version") == true) - ShowHelp(CmdL); - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp); InitOutput(); diff --git a/cmdline/apt-internal-solver.cc b/cmdline/apt-internal-solver.cc index 5fda7b6a0..4fabeb02f 100644 --- a/cmdline/apt-internal-solver.cc +++ b/cmdline/apt-internal-solver.cc @@ -24,7 +24,9 @@ #include <apt-pkg/depcache.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/cacheiterators.h> + #include <apt-private/private-output.h> +#include <apt-private/private-cmndline.h> #include <string.h> #include <iostream> @@ -76,19 +78,11 @@ int main(int argc,const char *argv[]) /*{{{*/ {'o',"option",0,CommandLine::ArbItem}, {0,0,0,0}}; - CommandLine CmdL(Args,_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false) { - _error->DumpErrors(); - return 2; - } + // we really don't need anything + DropPrivileges(); - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true) { - ShowHelp(CmdL); - return 1; - } + CommandLine CmdL; + ParseCommandLine(CmdL, NULL, Args, &_config, NULL, argc, argv, ShowHelp); if (CmdL.FileList[0] != 0 && strcmp(CmdL.FileList[0], "scenario") == 0) { @@ -172,10 +166,10 @@ int main(int argc,const char *argv[]) /*{{{*/ std::string failure; if (upgrade == true) { - if (pkgAllUpgrade(CacheFile) == false) + if (APT::Upgrade::Upgrade(CacheFile, APT::Upgrade::FORBID_REMOVE_PACKAGES | APT::Upgrade::FORBID_INSTALL_NEW_PACKAGES) == false) failure = "ERR_UNSOLVABLE_UPGRADE"; } else if (distUpgrade == true) { - if (pkgDistUpgrade(CacheFile) == false) + if (APT::Upgrade::Upgrade(CacheFile, APT::Upgrade::ALLOW_EVERYTHING) == false) failure = "ERR_UNSOLVABLE_DIST_UPGRADE"; } else if (Fix.Resolve() == false) failure = "ERR_UNSOLVABLE"; diff --git a/cmdline/apt-key.in b/cmdline/apt-key.in index b4e071000..cf0b9a96f 100644 --- a/cmdline/apt-key.in +++ b/cmdline/apt-key.in @@ -3,29 +3,6 @@ set -e unset GREP_OPTIONS -GPG_CMD="gpg --ignore-time-conflict --no-options --no-default-keyring" - -# gpg needs (in different versions more or less) files to function correctly, -# so we give it its own homedir and generate some valid content for it -GPGHOMEDIR="$(mktemp -d)" -CURRENTTRAP="${CURRENTTRAP} rm -rf '${GPGHOMEDIR}';" -trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM -chmod 700 "$GPGHOMEDIR" -# We don't use a secret keyring, of course, but gpg panics and -# implodes if there isn't one available - and writeable for imports -SECRETKEYRING="${GPGHOMEDIR}/secring.gpg" -touch $SECRETKEYRING -GPG_CMD="$GPG_CMD --homedir $GPGHOMEDIR" -# create the trustdb with an (empty) dummy keyring -# older gpgs required it, newer gpgs even warn that it isn't needed, -# but require it nonetheless for some commands, so we just play safe -# here for the foreseeable future and create a dummy one -$GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING >/dev/null 2>&1 -# tell gpg that it shouldn't try to maintain a trustdb file -GPG_CMD="$GPG_CMD --no-auto-check-trustdb --trust-model always" - -GPG="$GPG_CMD" - APT_DIR="/" eval $(apt-config shell APT_DIR Dir) @@ -37,22 +14,26 @@ REMOVED_KEYS='&keyring-removed-filename;' eval $(apt-config shell REMOVED_KEYS APT::Key::RemovedKeys) ARCHIVE_KEYRING_URI='&keyring-uri;' eval $(apt-config shell ARCHIVE_KEYRING_URI APT::Key::ArchiveKeyringURI) -TMP_KEYRING=${APT_DIR}/var/lib/apt/keyrings/maybe-import-keyring.gpg + +aptkey_echo() { echo "$@"; } requires_root() { if [ "$(id -u)" -ne 0 ]; then - echo >&1 "ERROR: This command can only be used by root." + echo >&2 "ERROR: This command can only be used by root." exit 1 fi } -# gpg defaults to mode 0600 for new keyrings. Create one with 0644 instead. -init_keyring() { - for path; do - if ! [ -e "$path" ]; then - touch -- "$path" - chmod 0644 -- "$path" - fi +get_fingerprints_of_keyring() { + $GPG_CMD --keyring "$1" --with-colons --fingerprint | while read publine; do + # search for a public key + if [ "${publine%%:*}" != 'pub' ]; then continue; fi + # search for the associated fingerprint (should be the very next line) + while read fprline; do + if [ "${fprline%%:*}" = 'sub' ]; then break; # should never happen + elif [ "${fprline%%:*}" != 'fpr' ]; then continue; fi + echo "$fprline" | cut -d':' -f 10 + done done } @@ -61,11 +42,11 @@ add_keys_with_verify_against_master_keyring() { MASTER=$2 if [ ! -f "$ADD_KEYRING" ]; then - echo "ERROR: '$ADD_KEYRING' not found" + echo >&2 "ERROR: '$ADD_KEYRING' not found" return - fi + fi if [ ! -f "$MASTER" ]; then - echo "ERROR: '$MASTER' not found" + echo >&2 "ERROR: '$MASTER' not found" return fi @@ -73,7 +54,7 @@ add_keys_with_verify_against_master_keyring() { # is honored. so: # all keys that are exported must have a valid signature # from a key in the $distro-master-keyring - add_keys=`$GPG_CMD --keyring $ADD_KEYRING --with-colons --list-keys | grep ^pub | cut -d: -f5` + add_keys="$(get_fingerprints_of_keyring "$ADD_KEYRING")" all_add_keys=`$GPG_CMD --keyring $ADD_KEYRING --with-colons --list-keys | grep ^[ps]ub | cut -d: -f5` master_keys=`$GPG_CMD --keyring $MASTER --with-colons --list-keys | grep ^pub | cut -d: -f5` @@ -86,24 +67,28 @@ add_keys_with_verify_against_master_keyring() { fi done done - + for add_key in $add_keys; do # export the add keyring one-by-one - rm -f $TMP_KEYRING - $GPG_CMD --keyring $ADD_KEYRING --output $TMP_KEYRING --export $add_key - # check if signed with the master key and only add in this case - ADDED=0 + local TMP_KEYRING="${GPGHOMEDIR}/tmp-keyring.gpg" + $GPG_CMD --batch --yes --keyring "$ADD_KEYRING" --output "$TMP_KEYRING" --export "$add_key" + if ! $GPG_CMD --batch --yes --keyring "$TMP_KEYRING" --import "$MASTER" > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then + cat "${GPGHOMEDIR}/gpgoutput.log" + false + fi + # check if signed with the master key and only add in this case + ADDED=0 for master_key in $master_keys; do - if $GPG_CMD --keyring $MASTER --keyring $TMP_KEYRING --check-sigs --with-colons $add_key | grep '^sig:!:' | cut -d: -f5 | grep -q $master_key; then - $GPG --import $TMP_KEYRING + if $GPG_CMD --keyring $TMP_KEYRING --check-sigs --with-colons $add_key | grep '^sig:!:' | cut -d: -f5 | grep -q $master_key; then + $GPG_CMD --batch --yes --keyring "$ADD_KEYRING" --export "$add_key" | $GPG --batch --yes --import ADDED=1 fi done if [ $ADDED = 0 ]; then echo >&2 "Key '$add_key' not added. It is not signed with a master key" fi + rm -f "${TMP_KEYRING}" done - rm -f $TMP_KEYRING } # update the current archive signing keyring from a network URI @@ -121,7 +106,6 @@ net_update() { echo >&2 "ERROR: Your distribution is not supported in net-update as no uri for the archive-keyring is set" exit 1 fi - requires_root # in theory we would need to depend on wget for this, but this feature # isn't useable in debian anyway as we have no keyring uri nor a master key if ! which wget >/dev/null 2>&1; then @@ -142,7 +126,7 @@ net_update() { fi new_mtime=$(stat -c %Y $keyring) if [ $new_mtime -ne $old_mtime ]; then - echo "Checking for new archive signing keys now" + aptkey_echo "Checking for new archive signing keys now" add_keys_with_verify_against_master_keyring $keyring $MASTER_KEYRING fi } @@ -153,7 +137,6 @@ update() { echo >&2 "Is the &keyring-package; package installed?" exit 1 fi - requires_root # add new keys from the package; @@ -166,71 +149,159 @@ update() { if [ -r "$REMOVED_KEYS" ]; then # remove no-longer supported/used keys - keys=`$GPG_CMD --keyring $REMOVED_KEYS --with-colons --list-keys | grep ^pub | cut -d: -f5` - for key in $keys; do - if $GPG --list-keys --with-colons | grep ^pub | cut -d: -f5 | grep -q $key; then - $GPG --quiet --batch --delete-key --yes ${key} - fi + get_fingerprints_of_keyring "$REMOVED_KEYS" | while read key; do + foreach_keyring_do 'remove_key_from_keyring' "$key" done else - echo "Warning: removed keys keyring $REMOVED_KEYS missing or not readable" >&2 + echo >&2 "Warning: removed keys keyring $REMOVED_KEYS missing or not readable" fi } remove_key_from_keyring() { - local GPG="$GPG_CMD --keyring $1" - # check if the key is in this keyring: the key id is in the 5 column at the end - if ! $GPG --with-colons --list-keys 2>&1 | grep -q "^pub:[^:]*:[^:]*:[^:]*:[0-9A-F]*$2:"; then - return - fi - if [ ! -w "$1" ]; then - echo >&2 "Key ${2} is in keyring ${1}, but can't be removed as it is read only." - return + local KEYRINGFILE="$1" + shift + # non-existent keyrings have by definition no keys + if [ ! -e "$KEYRINGFILE" ]; then + return fi - # check if it is the only key in the keyring and if so remove the keyring altogether - if [ '1' = "$($GPG --with-colons --list-keys | grep "^pub:[^:]*:[^:]*:[^:]*:[0-9A-F]\+:" | wc -l)" ]; then - mv -f "$1" "${1}~" # behave like gpg - return - fi - # we can't just modify pointed to files as these might be in /usr or something - local REALTARGET - if [ -L "$1" ]; then - REALTARGET="$(readlink -f "$1")" - mv -f "$1" "${1}.dpkg-tmp" - cp -a "$REALTARGET" "$1" - ls "$(dirname $1)" - fi - # delete the key from the keyring - $GPG --batch --delete-key --yes "$2" - if [ -n "$REALTARGET" ]; then - # the real backup is the old link, not the copy we made - mv -f "${1}.dpkg-tmp" "${1}~" - fi -} -remove_key() { - requires_root + local GPG="$GPG_CMD --keyring $KEYRINGFILE" + for KEY in "$@"; do + # check if the key is in this keyring: the key id is in the 5 column at the end + if ! get_fingerprints_of_keyring "$KEYRINGFILE" | grep -q "^[0-9A-F]*${KEY}$"; then + continue + fi + if [ ! -w "$KEYRINGFILE" ]; then + echo >&2 "Key ${KEY} is in keyring ${KEYRINGFILE}, but can't be removed as it is read only." + continue + fi + # check if it is the only key in the keyring and if so remove the keyring altogether + if [ '1' = "$(get_fingerprints_of_keyring "$KEYRINGFILE" | wc -l)" ]; then + mv -f "$KEYRINGFILE" "${KEYRINGFILE}~" # behave like gpg + return + fi + # we can't just modify pointed to files as these might be in /usr or something + local REALTARGET + if [ -L "$KEYRINGFILE" ]; then + REALTARGET="$(readlink -f "$KEYRINGFILE")" + mv -f "$KEYRINGFILE" "${KEYRINGFILE}.dpkg-tmp" + cp -a "$REALTARGET" "$KEYRINGFILE" + fi + # delete the key from the keyring + $GPG --batch --delete-key --yes "$KEY" + if [ -n "$REALTARGET" ]; then + # the real backup is the old link, not the copy we made + mv -f "${KEYRINGFILE}.dpkg-tmp" "${KEYRINGFILE}~" + fi + done +} - # if a --keyring was given, just remove from there - if [ -n "$FORCED_KEYRING" ]; then - remove_key_from_keyring "$FORCED_KEYRING" "$1" - else +foreach_keyring_do() { + local ACTION="$1" + shift + # if a --keyring was given, just remove from there + if [ -n "$FORCED_KEYRING" ]; then + $ACTION "$FORCED_KEYRING" "$@" + else # otherwise all known keyrings are up for inspection - local TRUSTEDFILE="/etc/apt/trusted.gpg" - eval $(apt-config shell TRUSTEDFILE Apt::GPGV::TrustedKeyring) - eval $(apt-config shell TRUSTEDFILE Dir::Etc::Trusted/f) - remove_key_from_keyring "$TRUSTEDFILE" "$1" - TRUSTEDPARTS="/etc/apt/trusted.gpg.d" + if [ -s "$TRUSTEDFILE" ]; then + $ACTION "$TRUSTEDFILE" "$@" + fi + local TRUSTEDPARTS="/etc/apt/trusted.gpg.d" eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d) if [ -d "$TRUSTEDPARTS" ]; then + # strip / suffix as gpg will double-slash in that case (#665411) + local STRIPPED_TRUSTEDPARTS="${TRUSTEDPARTS%/}" + if [ "${STRIPPED_TRUSTEDPARTS}/" = "$TRUSTEDPARTS" ]; then + TRUSTEDPARTS="$STRIPPED_TRUSTEDPARTS" + fi for trusted in $(run-parts --list "$TRUSTEDPARTS" --regex '^.*\.gpg$'); do - remove_key_from_keyring "$trusted" "$1" + if [ -s "$trusted" ]; then + $ACTION "$trusted" "$@" + fi done fi + fi +} + +run_cmd_on_keyring() { + local KEYRINGFILE="$1" + shift + # fingerprint and co will fail if key isn't in this keyring + $GPG_CMD --keyring "$KEYRINGFILE" --batch "$@" 2>/dev/null || true +} + +import_keys_from_keyring() { + local IMPORT="$1" + local KEYRINGFILE="$2" + if ! $GPG_CMD --keyring "$KEYRINGFILE" --batch --import "$IMPORT" > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then + cat "${GPGHOMEDIR}/gpgoutput.log" + false + fi +} + +merge_keys_into_keyrings() { + local KEYRINGFILE="$1" + local IMPORT="$2" + if ! $GPG_CMD --keyring "$KEYRINGFILE" --batch --import --import-options 'merge-only' "$IMPORT" > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then + cat "${GPGHOMEDIR}/gpgoutput.log" + false + fi +} + +merge_back_changes() { + if [ -n "$FORCED_KEYRING" ]; then + # if the keyring was forced merge is already done + return + fi + if [ -s "${GPGHOMEDIR}/pubring.gpg" ]; then + # merge all updated keys + foreach_keyring_do 'merge_keys_into_keyrings' "${GPGHOMEDIR}/pubring.gpg" + fi + # look for keys which were added or removed + get_fingerprints_of_keyring "${GPGHOMEDIR}/pubring.orig.gpg" > "${GPGHOMEDIR}/pubring.orig.keylst" + get_fingerprints_of_keyring "${GPGHOMEDIR}/pubring.gpg" > "${GPGHOMEDIR}/pubring.keylst" + sort "${GPGHOMEDIR}/pubring.keylst" "${GPGHOMEDIR}/pubring.orig.keylst" | uniq --unique | while read key; do + if grep -q "^${key}$" "${GPGHOMEDIR}/pubring.orig.keylst"; then + # key isn't part of new keyring, so remove + foreach_keyring_do 'remove_key_from_keyring' "$key" + elif grep -q "^${key}$" "${GPGHOMEDIR}/pubring.keylst"; then + # key is part of new keyring, so we need to import it + create_new_keyring "$TRUSTEDFILE" + if ! $GPG --batch --yes --export "$key" | $GPG_CMD --keyring "$TRUSTEDFILE" --batch --yes --import > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then + cat "${GPGHOMEDIR}/gpgoutput.log" + false + fi + else + echo >&2 "Errror: Key ${key} (dis)appeared out of nowhere" + fi + done +} + +setup_merged_keyring() { + if [ -z "$FORCED_KEYRING" ]; then + foreach_keyring_do 'import_keys_from_keyring' "${GPGHOMEDIR}/pubring.gpg" + if [ -r "${GPGHOMEDIR}/pubring.gpg" ]; then + cp -a "${GPGHOMEDIR}/pubring.gpg" "${GPGHOMEDIR}/pubring.orig.gpg" + else + touch "${GPGHOMEDIR}/pubring.gpg" "${GPGHOMEDIR}/pubring.orig.gpg" + fi + GPG="$GPG --keyring ${GPGHOMEDIR}/pubring.gpg" + else + GPG="$GPG --keyring $TRUSTEDFILE" + create_new_keyring "$TRUSTEDFILE" fi - echo "OK" } +create_new_keyring() { + # gpg defaults to mode 0600 for new keyrings. Create one with 0644 instead. + if ! [ -e "$TRUSTEDFILE" ]; then + if [ -w "$(dirname "$TRUSTEDFILE")" ]; then + touch -- "$TRUSTEDFILE" + chmod 0644 -- "$TRUSTEDFILE" + fi + fi +} usage() { echo "Usage: apt-key [--keyring file] [command] [arguments]" @@ -256,17 +327,19 @@ while [ -n "$1" ]; do shift TRUSTEDFILE="$1" FORCED_KEYRING="$1" - if [ -r "$TRUSTEDFILE" ] || [ "$2" = 'add' ] || [ "$2" = 'adv' ]; then - GPG="$GPG --keyring $TRUSTEDFILE --primary-keyring $TRUSTEDFILE" - else - echo >&2 "Error: The specified keyring »$TRUSTEDFILE« is missing or not readable" - exit 1 - fi + ;; + --secret-keyring) shift + FORCED_SECRET_KEYRING="$1" + ;; + --readonly) + merge_back_changes() { true; } ;; --fakeroot) requires_root() { true; } - shift + ;; + --quiet) + aptkey_echo() { true; } ;; --*) echo >&2 "Unknown option: $1" @@ -275,28 +348,13 @@ while [ -n "$1" ]; do *) break;; esac + shift done if [ -z "$TRUSTEDFILE" ]; then TRUSTEDFILE="/etc/apt/trusted.gpg" eval $(apt-config shell TRUSTEDFILE Apt::GPGV::TrustedKeyring) eval $(apt-config shell TRUSTEDFILE Dir::Etc::Trusted/f) - if [ -r "$TRUSTEDFILE" ]; then - GPG="$GPG --keyring $TRUSTEDFILE" - fi - GPG="$GPG --primary-keyring $TRUSTEDFILE" - TRUSTEDPARTS="/etc/apt/trusted.gpg.d" - eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d) - if [ -d "$TRUSTEDPARTS" ]; then - # strip / suffix as gpg will double-slash in that case (#665411) - STRIPPED_TRUSTEDPARTS="${TRUSTEDPARTS%/}" - if [ "${STRIPPED_TRUSTEDPARTS}/" = "$TRUSTEDPARTS" ]; then - TRUSTEDPARTS="$STRIPPED_TRUSTEDPARTS" - fi - for trusted in $(run-parts --list "$TRUSTEDPARTS" --regex '^.*\.gpg$'); do - GPG="$GPG --keyring $trusted" - done - fi fi command="$1" @@ -306,52 +364,107 @@ if [ -z "$command" ]; then fi shift -if [ "$command" != "help" ] && ! which gpg >/dev/null 2>&1; then - echo >&2 "Warning: gnupg does not seem to be installed." - echo >&2 "Warning: apt-key requires gnupg for most operations." - echo >&2 +if [ "$command" != "help" ]; then + eval $(apt-config shell GPG_EXE Apt::Key::gpgcommand) + + if [ -n "$GPG_EXE" ] && which "$GPG_EXE" >/dev/null 2>&1; then + true + elif which gpg >/dev/null 2>&1; then + GPG_EXE="gpg" + elif which gpg2 >/dev/null 2>&1; then + GPG_EXE="gpg2" + else + echo >&2 "Error: gnupg or gnupg2 do not seem to be installed," + echo >&2 "Error: but apt-key requires gnupg or gnupg2 for operation." + echo >&2 + exit 255 + fi + + GPG_CMD="$GPG_EXE --ignore-time-conflict --no-options --no-default-keyring" + + # gpg needs (in different versions more or less) files to function correctly, + # so we give it its own homedir and generate some valid content for it + if [ -n "$TMPDIR" ]; then + # tmpdir is a directory and current user has rwx access to it + # same tests as in apt-pkg/contrib/fileutl.cc GetTempDir() + if [ ! -d "$TMPDIR" ] || [ ! -r "$TMPDIR" ] || [ ! -w "$TMPDIR" ] || [ ! -x "$TMPDIR" ]; then + unset TMPDIR + fi + fi + GPGHOMEDIR="$(mktemp -d)" + CURRENTTRAP="${CURRENTTRAP} rm -rf '${GPGHOMEDIR}';" + trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM + chmod 700 "$GPGHOMEDIR" + # We don't use a secret keyring, of course, but gpg panics and + # implodes if there isn't one available - and writeable for imports + SECRETKEYRING="${GPGHOMEDIR}/secring.gpg" + touch $SECRETKEYRING + GPG_CMD="$GPG_CMD --homedir $GPGHOMEDIR" + # create the trustdb with an (empty) dummy keyring + # older gpgs required it, newer gpgs even warn that it isn't needed, + # but require it nonetheless for some commands, so we just play safe + # here for the foreseeable future and create a dummy one + $GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING >/dev/null 2>&1 + # tell gpg that it shouldn't try to maintain a trustdb file + GPG_CMD="$GPG_CMD --no-auto-check-trustdb --trust-model always" + GPG="$GPG_CMD" + + # for advanced operations, we might really need a secret keyring after all + if [ -n "$FORCED_SECRET_KEYRING" ] && [ -r "$FORCED_SECRET_KEYRING" ]; then + rm -f "$SECRETKEYRING" + cp -a "$FORCED_SECRET_KEYRING" "$SECRETKEYRING" + fi fi case "$command" in add) - requires_root - init_keyring "$TRUSTEDFILE" - $GPG --quiet --batch --import "$1" - echo "OK" + requires_root + setup_merged_keyring + $GPG --quiet --batch --import "$@" + merge_back_changes + aptkey_echo "OK" ;; del|rm|remove) - init_keyring "$TRUSTEDFILE" - remove_key "$1" + requires_root + foreach_keyring_do 'remove_key_from_keyring' "$@" + aptkey_echo "OK" ;; update) - init_keyring "$TRUSTEDFILE" + requires_root + setup_merged_keyring update + merge_back_changes ;; net-update) - init_keyring "$TRUSTEDFILE" + requires_root + setup_merged_keyring net_update + merge_back_changes ;; list) - init_keyring "$TRUSTEDFILE" - $GPG --batch --list-keys - ;; + foreach_keyring_do 'run_cmd_on_keyring' --list-keys "$@" + ;; finger*) - init_keyring "$TRUSTEDFILE" - $GPG --batch --fingerprint - ;; - export) - init_keyring "$TRUSTEDFILE" - $GPG --armor --export "$1" - ;; - exportall) - init_keyring "$TRUSTEDFILE" - $GPG --armor --export - ;; + foreach_keyring_do 'run_cmd_on_keyring' --fingerprint "$@" + ;; + export|exportall) + foreach_keyring_do 'import_keys_from_keyring' "${GPGHOMEDIR}/pubring.gpg" + $GPG_CMD --keyring "${GPGHOMEDIR}/pubring.gpg" --armor --export "$@" + ;; adv*) - init_keyring "$TRUSTEDFILE" - echo "Executing: $GPG $*" - $GPG $* - ;; + setup_merged_keyring + aptkey_echo "Executing: $GPG $*" + $GPG "$@" + merge_back_changes + ;; + verify) + setup_merged_keyring + if which gpgv >/dev/null 2>&1; then + gpgv --homedir "${GPGHOMEDIR}" --keyring "${GPGHOMEDIR}/pubring.gpg" --ignore-time-conflict "$@" + else + $GPG --verify "$@" + fi + ;; help) usage ;; diff --git a/cmdline/apt-mark.cc b/cmdline/apt-mark.cc index ed348358a..8974397c9 100644 --- a/cmdline/apt-mark.cc +++ b/cmdline/apt-mark.cc @@ -22,6 +22,7 @@ #include <apt-pkg/pkgcache.h> #include <apt-private/private-cmndline.h> +#include <apt-private/private-output.h> #include <errno.h> #include <fcntl.h> @@ -41,10 +42,6 @@ /*}}}*/ using namespace std; -ostream c0out(0); -ostream c1out(0); -ostream c2out(0); -ofstream devnull("/dev/null"); /* DoAuto - mark packages as automatically/manually installed {{{*/ static bool DoAuto(CommandLine &CmdL) { @@ -277,6 +274,70 @@ static bool DoHold(CommandLine &CmdL) return true; } + APT::PackageList keepoffset; + for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg) + { + if (Pkg->CurrentVer != 0) + continue; + keepoffset.insert(Pkg); + } + + if (keepoffset.empty() == false) + { + Args.erase(Args.begin() + BaseArgs, Args.end()); + Args.push_back("--merge-avail"); + // FIXME: supported only since 1.17.7 in dpkg + Args.push_back("-"); + Args.push_back(NULL); + + int external[2] = {-1, -1}; + if (pipe(external) != 0) + return _error->WarningE("DoHold", "Can't create IPC pipe for dpkg --merge-avail"); + + pid_t dpkgMergeAvail = ExecFork(); + if (dpkgMergeAvail == 0) + { + close(external[1]); + std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory"); + if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0 && chdir("/") != 0) + _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --merge-avail", chrootDir.c_str()); + dup2(external[0], STDIN_FILENO); + int const nullfd = open("/dev/null", O_RDONLY); + dup2(nullfd, STDOUT_FILENO); + execvp(Args[0], (char**) &Args[0]); + _error->WarningE("dpkgGo", "Can't get dpkg --merge-avail running!"); + _exit(2); + } + + FILE* dpkg = fdopen(external[1], "w"); + for (APT::PackageList::iterator Pkg = keepoffset.begin(); Pkg != keepoffset.end(); ++Pkg) + { + char const * Arch; + if (Pkg->VersionList != 0) + Arch = Pkg.VersionList().Arch(); + else + Arch = Pkg.Arch(); + fprintf(dpkg, "Package: %s\nVersion: 0~\nArchitecture: %s\nMaintainer: Dummy Example <dummy@example.org>\n" + "Description: dummy package record\n A record is needed to put a package on hold, so here it is.\n\n", Pkg.Name(), Arch); + } + fclose(dpkg); + keepoffset.clear(); + + if (dpkgMergeAvail > 0) + { + int Status = 0; + while (waitpid(dpkgMergeAvail, &Status, 0) != dpkgMergeAvail) + { + if (errno == EINTR) + continue; + _error->WarningE("dpkgGo", _("Waited for %s but it wasn't there"), "dpkg --merge-avail"); + break; + } + if (WIFEXITED(Status) == false || WEXITSTATUS(Status) != 0) + return _error->Error(_("Executing dpkg failed. Are you root?")); + } + } + Args.erase(Args.begin() + BaseArgs, Args.end()); Args.push_back("--set-selections"); Args.push_back(NULL); @@ -292,12 +353,9 @@ static bool DoHold(CommandLine &CmdL) std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory"); if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0 && chdir("/") != 0) _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --set-selections", chrootDir.c_str()); - int const nullfd = open("/dev/null", O_RDONLY); dup2(external[0], STDIN_FILENO); - dup2(nullfd, STDOUT_FILENO); - dup2(nullfd, STDERR_FILENO); execvp(Args[0], (char**) &Args[0]); - _error->WarningE("dpkgGo", "Can't detect if dpkg supports multi-arch!"); + _error->WarningE("dpkgGo", "Can't get dpkg --set-selections running!"); _exit(2); } @@ -441,39 +499,10 @@ int main(int argc,const char *argv[]) /*{{{*/ setlocale(LC_ALL,""); textdomain(PACKAGE); - // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(),_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - if (_config->FindB("version") == true) - ShowHelp(CmdL); - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } - - // Deal with stdout not being a tty - if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1) - _config->Set("quiet","1"); + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp); - // Setup the output streams - c0out.rdbuf(cout.rdbuf()); - c1out.rdbuf(cout.rdbuf()); - c2out.rdbuf(cout.rdbuf()); - if (_config->FindI("quiet",0) > 0) - c0out.rdbuf(devnull.rdbuf()); - if (_config->FindI("quiet",0) > 1) - c1out.rdbuf(devnull.rdbuf()); + InitOutput(); // Match the operation CmdL.DispatchArg(Cmds); diff --git a/cmdline/apt-sortpkgs.cc b/cmdline/apt-sortpkgs.cc index c2b11890a..9b66ad4db 100644 --- a/cmdline/apt-sortpkgs.cc +++ b/cmdline/apt-sortpkgs.cc @@ -23,6 +23,8 @@ #include <apt-pkg/fileutl.h> #include <apt-pkg/pkgsystem.h> +#include <apt-private/private-cmndline.h> + #include <vector> #include <algorithm> #include <stdio.h> @@ -142,12 +144,12 @@ static bool DoIt(string InFile) // ShowHelp - Show the help text /*{{{*/ // --------------------------------------------------------------------- /* */ -static int ShowHelp() +static bool ShowHelp(CommandLine &) { ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION, COMMON_ARCH,__DATE__,__TIME__); if (_config->FindB("version") == true) - return 0; + return true; cout << _("Usage: apt-sortpkgs [options] file1 [file2 ...]\n" @@ -161,7 +163,7 @@ static int ShowHelp() " -c=? Read this configuration file\n" " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"); - return 0; + return true; } /*}}}*/ int main(int argc,const char *argv[]) /*{{{*/ @@ -179,19 +181,9 @@ int main(int argc,const char *argv[]) /*{{{*/ textdomain(PACKAGE); // Parse the command line and initialize the package library - CommandLine CmdL(Args,_config); - if (pkgInitConfig(*_config) == false || - CmdL.Parse(argc,argv) == false || - pkgInitSystem(*_config,_system) == false) - { - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - CmdL.FileSize() == 0) - return ShowHelp(); + CommandLine::Dispatch Cmds[] = {{NULL, NULL}}; + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args, &_config, &_system, argc, argv, ShowHelp); // Match the operation for (unsigned int I = 0; I != CmdL.FileSize(); I++) diff --git a/cmdline/apt.cc b/cmdline/apt.cc index 2cfdf8e8e..056cd213f 100644 --- a/cmdline/apt.cc +++ b/cmdline/apt.cc @@ -119,15 +119,10 @@ int main(int argc, const char *argv[]) /*{{{*/ _config->CndSet("APT::Cmd::Show-Update-Stats", true); // Parse the command line and initialize the package library - CommandLine CmdL(Args.data(), _config); - if (CmdL.Parse(argc, argv) == false || - pkgInitSystem(*_config, _system) == false) - { - _error->DumpErrors(); - return 100; - } + CommandLine CmdL; + ParseCommandLine(CmdL, Cmds, Args.data(), NULL, &_system, argc, argv, ShowHelp); - if(!isatty(STDOUT_FILENO) && + if(!isatty(STDOUT_FILENO) && _config->FindB("Apt::Cmd::Disable-Script-Warning", false) == false) { std::cerr << std::endl @@ -138,15 +133,6 @@ int main(int argc, const char *argv[]) /*{{{*/ << std::endl; } - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } - // see if we are in simulate mode CheckSimulateMode(CmdL); diff --git a/cmdline/makefile b/cmdline/makefile index b7c35ddd1..816038c3b 100644 --- a/cmdline/makefile +++ b/cmdline/makefile @@ -67,15 +67,15 @@ APT_DOMAIN:=apt-utils # The apt-sortpkgs program PROGRAM=apt-sortpkgs -SLIBS = -lapt-pkg $(INTLLIBS) -LIB_MAKES = apt-pkg/makefile +SLIBS = -lapt-pkg -lapt-private $(INTLLIBS) +LIB_MAKES = apt-pkg/makefile apt-private/makefile SOURCE = apt-sortpkgs.cc include $(PROGRAM_H) # The apt-extracttemplates program PROGRAM=apt-extracttemplates -SLIBS = -lapt-pkg -lapt-inst $(INTLLIBS) -LIB_MAKES = apt-pkg/makefile apt-inst/makefile +SLIBS = -lapt-pkg -lapt-inst -lapt-private $(INTLLIBS) +LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile SOURCE = apt-extracttemplates.cc include $(PROGRAM_H) diff --git a/configure.ac b/configure.ac index d728e5e6c..06879f839 100644 --- a/configure.ac +++ b/configure.ac @@ -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) PACKAGE="apt" -PACKAGE_VERSION="1.0.9.6" +PACKAGE_VERSION="1.0.9.7" PACKAGE_MAIL="APT Development Team <deity@lists.debian.org>" AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE") AC_DEFINE_UNQUOTED(PACKAGE_VERSION,"$PACKAGE_VERSION") @@ -172,6 +172,12 @@ AC_EGREP_HEADER(h_errno, netdb.h, [AC_MSG_RESULT(normal)], [AC_MSG_ERROR("not found.")]) ]) + +dnl check for setuid checking function +AC_CHECK_FUNCS(getresuid getresgid) +AC_SUBST(HAVE_GETRESUID) +AC_SUBST(HAVE_GETRESGID) + dnl Check for doxygen AC_PATH_PROG(DOXYGEN, doxygen) diff --git a/debian/apt.postinst b/debian/apt.postinst index fd3e273bb..b0a5da7d8 100644..100755 --- a/debian/apt.postinst +++ b/debian/apt.postinst @@ -15,6 +15,19 @@ set -e case "$1" in configure) + if dpkg --compare-versions "$2" lt 1.1~exp4; then + # apt-key before 0.9.10 could leave empty keyrings around + find /etc/apt/trusted.gpg.d/ -name '*.gpg' | while read keyring; do + if ! test -s "$keyring"; then + rm -f "$keyring" + fi + done + # apt-key before 0.9.8.2 could create 0600 trusted.gpg file + if test -e /etc/apt/trusted.gpg ; then + chmod -f 0644 /etc/apt/trusted.gpg || true + fi + fi + if dpkg --compare-versions "$2" lt-nl 0.9.9.5; then # we are using tmpfiles for both rm -f /etc/apt/trustdb.gpg @@ -26,6 +39,16 @@ case "$1" in fi fi + # add unprivileged user for the apt methods + adduser --force-badname --system -home /var/empty \ + --no-create-home --quiet _apt || true + + # deal with upgrades from experimental + if dpkg --compare-versions "$2" 'eq' '1.1~exp3'; then + # libapt will setup partial/ at runtime + chown -R root:root /var/lib/apt/lists /var/cache/apt/archives || true + fi + # ensure tighter permissons on the logs, see LP: #975199 if dpkg --compare-versions "$2" lt-nl 0.9.7.7; then # ensure permissions are right diff --git a/debian/postrm b/debian/apt.postrm index ae1e18d33..ae1e18d33 100755 --- a/debian/postrm +++ b/debian/apt.postrm diff --git a/debian/changelog b/debian/changelog index 4b38ba8ba..b8954102e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,239 @@ +apt (1.1~exp8) experimental; urgency=medium + + [ Michael Vogt ] + * merge unstable upload version 1.0.9.3 + * Ensure /etc/apt/auth.conf has _apt:root owner + * Use sysconf(_SC_ARG_MAX) to find the size of Dpkg::MaxArgBytes + * Only support Translation-* that are listed in the {In,}Release file + * Call "Dequeue()" for items in AbortTransaction() to fix race + * prepare ABI for feature/socketpair + * Bump ABI to 4.15 + + [ David Kalnischkies ] + * reenable support for -s (and co) in apt-get source (Closes: 742578) + * run acquire transactions only once + * aborted reverify restores file owner and permission + * test if TMPDIR is accessible before using (Closes: 765951) + * chown finished partial files earlier + * promote filesize to a hashstring + + -- Michael Vogt <mvo@debian.org> Thu, 06 Nov 2014 10:01:21 +0100 + +apt (1.1~exp7) experimental; urgency=medium + + [ David Kalnischkies ] + * don't cleanup cdrom files in apt-get update (Closes: 765458) + * ignore Acquire::GzipIndexes for cdrom sources + + -- David Kalnischkies <david@kalnischkies.de> Wed, 15 Oct 2014 20:12:15 +0200 + +apt (1.1~exp6) experimental; urgency=medium + + [ josch ] + * implement the updated build profile spec + + [ Michael Vogt ] + * methods/rsh.cc: replace strcat with std::string (Closes: #76442) + * Add new configallowinsecurerepositories to the test framework + + [ Guillem Jover ] + * Update Status field values handling + + [ David Kalnischkies ] + * don't drop privileges if _apt has not enough rights + * check for available space, excluding root reserved blocks + + -- Michael Vogt <mvo@debian.org> Wed, 15 Oct 2014 07:47:36 +0200 + +apt (1.1~exp5) experimental; urgency=medium + + [ Michael Vogt ] + * Only rename StatError files in AbortTransaction() + * Document Acquire{MaxReleaseFileSize,AllowInsecureRepositories, + AllowDowngradeToInsecureRepositories} and + --no-allow-insecure-repositories + * Fix backward compatiblity of the new pkgAcquireMethod::DropPrivsOrDie() + * Change default of Acquire::AllowInsecureRepositories to "true" + so that this change is less disruptive, this will be switched + to "false" again after jessie + + [ David Kalnischkies ] + * remove useless pdiff filename output (Closes: 764737) + * make --allow-insecure-repositories message an error + * display a warning for unsigned repos + * trusted=yes sources are secure, we just don't know why + + -- Michael Vogt <mvo@debian.org> Mon, 13 Oct 2014 16:15:22 +0200 + +apt (1.1~exp4) experimental; urgency=medium + + [ Michael Vogt ] + * Merge sid version 1.0.9.2 + * feature/acq-trans: + - Make apt-get update more transactional by keeping all data from + a sources.list line in partial/ until all data is good and only + then move it into lists/ in one step + - add new -o Debug::Acquire::Transaction=1 debug option + * feature/expected-size: + Do not download more data in the mehotds than expected if we know + the size. For the InRelease/Release/Release.gpg add new + Acquire::MaxReleaseFileSize that defaults to 10Mb for now + * Verify the the hashes of the downloaded compressed files early + * Only load unauthenticated data into our parsers when the user + explicitly asked for it via --allow-insecure-repositories + (Acquire::AllowInsecureRepositories) + * Print warning when trying to use unauthenticated repositories + * Use /var/empty as the homedir for _apt + * Revert making pkgAcquire::Item::DescURI() "const" to not break + API + * Do not allow going from a authenticated to unauthenticated repository + * Add missing "adduser" dependency (for the new _apt user) + Thanks to Russ Allbery (Closes: #763004) + * Test if TMPDIR is a directory in apt-key and if not unset it + * add early verification for the .diff/Index download + * Bump library version to libapt-pkg4.14 + * Rework pkgAcqMeta{Index,Sig,ClearSig}::{Done,Failed]() for readability + * Ignore EINVAL from prctl(PR_SET_NO_NEW_PRIVS) (closes: 764066) + + [ David Kalnischkies ] + * deprecate Pkg->Name in favor of Grp->Name + * drop stored StringItems in favor of in-memory mappings + * de-duplicate version strings in the cache + * fix progress output for (dist-)upgrade calculation + * move PCI::From* methods into CacheSetHelper class (Closes: 686221) + * add a (hidden) --quiet option for apt-key + * only create new trusted.gpg if directory is writeable + * support (multiple) arguments properly in apt-key + * set a primary-keyring only if we have access to it + * merge fragment keyrings in apt-key to avoid hitting gpg limits + (Closes: 733028) + * use apt-key adv (+ gnupg) instead of gpgv for verify + * support gnupg2 as drop-in replacement for gnupg + * allow to specify fingerprints in 'apt-key del' + * use only one --keyring in gpg interactions + * add and use 'apt-key verify' which prefers gpgv over gpg + * remove empty keyrings in trusted.gpg.d on upgrade + * store source name and version in binary cache + * allow fetcher setup without directory creation (Closes: 762898) + * cleanup partial directory of lists in apt-get clean (Closes: #762889) + * allow options between command and -- on commandline + * update symbols file + * support parsing of all hashes for pdiff + * ensure world-readability for trusted.gpg in postinst (Closes: 647001) + * ensure partial dirs are 0700 and owned by _apt:root + * use _apt:root only for partial directories + * display errortext for all Err + * set PR_SET_NO_NEW_PRIVS also if run as non-root + + [ James McCoy ] + * ensure apt-key del handles 16-byte key ids (Closes: 754436) + + [ Kenshi Muto ] + * Japanese program translation update (Closes: 763033) + + [ Trần Ngọc Quân ] + * Set STRIP_FROM_PATH for doxygen + + [ Mert Dirik ] + * Turkish program translation update (Closes: 763379) + + [ Guillem Jover ] + * apt-get: Create the temporary downloaded changelog inside tmpdir + + [ Miroslav Kure ] + * [l10n] Updated Czech translation of apt (Closes: #764055) + + -- Michael Vogt <mvo@ubuntu.com> Wed, 08 Oct 2014 09:37:35 +0200 + +apt (1.1~exp3) experimental; urgency=medium + + [ Michael Vogt ] + * merged changes from debian/sid up to 1.0.9.1 + * Make /var/lib/apt/lists and /var/cache/apt/archives owned + by the new _apt user + * Drop Privileges in the following acquire methods: + copy, http, https, ftp, gpgv, gzip/bzip2/lzma/xz + * DropPrivs: Improvements based on feedback from error@debian.org + + [ Julian Andres Klode ] + * DropPriv: Really call seteuid and not setuid, and add more checks + * Use _apt as our unprivileged user name + * DropPrivs: Also check for saved set-user-ID and set-group-ID + * methods: Fail if we cannot drop privileges + * DropPrivs: Also check for saved set-user-ID and set-group-ID + + -- Michael Vogt <mvo@debian.org> Wed, 24 Sep 2014 22:30:09 +0200 + +apt (1.1~exp2) experimental; urgency=medium + + [ Guillem Jover ] + * Add new Base256ToNum long long overload function + * Fix ar and tar code to be LFS-safe (Closes: #742882) + + [ Michael Vogt ] + * increase libapt-inst to version 1.6 + * Only allow "apt-get build-dep path" when path starts with ./ or / + * Allow passing a full path to apt-get install /foo/bar.deb (CLoses: #752327) + * merge changes from the 1.0.6 upload + + -- Michael Vogt <mvo@debian.org> Thu, 10 Jul 2014 13:18:08 +0200 + +apt (1.1~exp1) experimental; urgency=low + + [ David Kalnischkies ] + * [API Break] change "std::string pkgAcquire::Item::DescURI()" to + "std::string pkgAcquire::Item::DescURI() const" + * [ABI-Break] increase hashtable size for packages/groups by factor 5 + * [ABI-Break] cleanup datatypes mix used in binary cache + * [internal API-Break] remove the Section member from package struct + * use 'best' hash for source authentication (LP: 1098738) + * use HashStringList in the acquire system + * deal with hashes in ftparchive more dynamic as well + * reenable pipelining via hashsum reordering support + * parse and retrieve multiple Descriptions in one record + * improve pkgTagSection scanning and parsing + * invalid cache if architecture set doesn't match (Closes: 745036) + + [ Michael Vogt ] + * add support for "apt-get build-dep foo.dsc" + * add support for "apt-get build-dep unpacked-source-dir" + * add support for "apt-get install foo_1.0_all.deb" + * make "apt-get update" progress much more accurate by loading the + sizes of the targets into the fetcher early + * Implement simple by-hash for apt update to improve reliability of + the update. Apt will try to fetch the Packages file via + /by-hash/$hash_type/$hash_value if the repo supports that. + - add APT::Acquire::$(host)::By-Hash=1 knob + - add Acquire-By-Hash=1 to Release file + * add Debug::Acquire::Progress debug option + * [ABI-Break] lp:~mvo/apt/source-hashes: + - use sha{512,256,1} for deb-src when available LP: #1098738 + * [ABI-Break] stop exporting the accidently exported parsenetrc() symbol + * [ABI-Break] remove the PACKAGE_MATCHER_ABI_COMPAT defines + * [ABI BREAK] apt-pkg/pkgcache.h: + - adjust pkgCache::State::VerPriority enum, to match reality + * test/integration/test-debsrc-hashes: + - add integration test, thanks to Daniel Hartwig + * [ABI-Break] remove the PACKAGE_MATCHER_ABI_COMPAT defines + * [ABI-Break] Pass struct IndexTarget/indexRecords to + pkgAcqIndex{,Merge}Diffs + * [internal API-Break] rename pkgCache::Package::NextPackage to + pkgCache::Package::Next + * Calculate Percent as part of pkgAcquireStatus to provide a weighted + percent for both items and bytes + * apt-pkg/contrib/macros.h: bump library version to 4.13 + * apt-private/acqprogress.cc: do not show file size on IMSHit, it wasn't + fetched + * Fix warnings from clang -Wall/clang -fsanitize=address + * add DropPrivs() and drop privileges to nobody when running the + the buildin apt and dump solvers + * lp:~mvo/apt/webserver-simulate-broken-with-fix346386: + - fix invalid InRelease file download checking and add regression + test to server broken files to the buildin test webserver + - add regression test for LP: #34638 + + -- Michael Vogt <mvo@debian.org> Thu, 19 Jun 2014 12:01:48 +0200 + apt (1.0.9.7) unstable; urgency=medium [ Tomasz Buchert ] diff --git a/debian/control b/debian/control index 0437aa737..8c3eea3f1 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ XS-Testsuite: autopkgtest Package: apt Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, ${apt:keyring}, gnupg +Depends: ${shlibs:Depends}, ${misc:Depends}, ${apt:keyring}, gnupg | gnupg2, adduser Replaces: manpages-pl (<< 20060617-3~), manpages-it (<< 2.80-4~), sun-java6-jdk (>> 0), sun-java5-jdk (>> 0), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~) Breaks: manpages-pl (<< 20060617-3~), manpages-it (<< 2.80-4~), sun-java6-jdk (>> 0), sun-java5-jdk (>> 0), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~) Conflicts: python-apt (<< 0.7.93.2~) @@ -38,12 +38,12 @@ Description: commandline package manager * apt-config as an interface to the configuration settings * apt-key as an interface to manage authentication keys -Package: libapt-pkg4.12 +Package: libapt-pkg4.15 Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Depends: ${shlibs:Depends}, ${misc:Depends} -Breaks: apt (<< 0.9.4~), libapt-inst1.5 (<< 0.9.9~) +Breaks: apt (<< 1.1~exp4), libapt-inst1.5 (<< 0.9.9~) Section: libs Description: package management runtime library This library provides the common functionality for searching and @@ -61,7 +61,7 @@ Description: package management runtime library http, rsh as well as an interface to add more transports like https (apt-transport-https) and debtorrent (apt-transport-debtorrent). -Package: libapt-inst1.5 +Package: libapt-inst1.6 Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} diff --git a/debian/gbp.conf b/debian/gbp.conf index ec6d9894e..135522d40 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -1,7 +1,7 @@ [DEFAULT] prebuild = ./prepare-release pre-export postbuild = ./prepare-release post-build -debian-branch = debian/sid +debian-branch = debian/experimental debian-tag = %(version)s export-dir = ../build-area sign-tags = True
\ No newline at end of file diff --git a/debian/libapt-inst1.5.install.in b/debian/libapt-inst1.6.install.in index 8bcce2c28..8bcce2c28 100644 --- a/debian/libapt-inst1.5.install.in +++ b/debian/libapt-inst1.6.install.in diff --git a/debian/libapt-inst1.5.symbols b/debian/libapt-inst1.6.symbols index 8ce707287..74c4665a2 100644 --- a/debian/libapt-inst1.5.symbols +++ b/debian/libapt-inst1.6.symbols @@ -1,9 +1,9 @@ -libapt-inst.so.1.5 libapt-inst1.5 #MINVER# +libapt-inst.so.1.6 libapt-inst1.6 #MINVER# * Build-Depends-Package: libapt-pkg-dev (c++)"ExtractTar::Done(bool)@Base" 0.8.0 (c++)"ExtractTar::Go(pkgDirStream&)@Base" 0.8.0 (c++)"ExtractTar::StartGzip()@Base" 0.8.0 - (c++)"ExtractTar::ExtractTar(FileFd&, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 + (c++)"ExtractTar::ExtractTar(FileFd&, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.0.5 (c++)"ExtractTar::~ExtractTar()@Base" 0.8.0 (c++)"debDebFile::GotoMember(char const*)@Base" 0.8.0 (c++)"debDebFile::CheckMember(char const*)@Base" 0.8.0 @@ -11,10 +11,10 @@ libapt-inst.so.1.5 libapt-inst1.5 #MINVER# (c++)"debDebFile::ControlExtract::~ControlExtract()@Base" 0.8.0 (c++)"debDebFile::ExtractTarMember(pkgDirStream&, char const*)@Base" 0.9.15.4 (c++)"debDebFile::ExtractArchive(pkgDirStream&)@Base" 0.8.0 - (c++)"debDebFile::MemControlExtract::TakeControl(void const*, unsigned long)@Base" 0.8.0 + (c++)"debDebFile::MemControlExtract::TakeControl(void const*, unsigned long long)@Base" 1.0.5 (c++)"debDebFile::MemControlExtract::Read(debDebFile&)@Base" 0.8.0 (c++)"debDebFile::MemControlExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0 - (c++)"debDebFile::MemControlExtract::Process(pkgDirStream::Item&, unsigned char const*, unsigned long, unsigned long)@Base" 0.8.0 + (c++)"debDebFile::MemControlExtract::Process(pkgDirStream::Item&, unsigned char const*, unsigned long long, unsigned long long)@Base" 1.0.5 (c++)"debDebFile::MemControlExtract::~MemControlExtract()@Base" 0.8.0 (c++)"debDebFile::debDebFile(FileFd&)@Base" 0.8.0 (c++)"pkgExtract::FinishedFile(pkgDirStream::Item&, int)@Base" 0.8.0 @@ -41,7 +41,7 @@ libapt-inst.so.1.5 libapt-inst1.5 #MINVER# (c++)"pkgDirStream::FinishedFile(pkgDirStream::Item&, int)@Base" 0.8.0 (c++)"pkgDirStream::Fail(pkgDirStream::Item&, int)@Base" 0.8.0 (c++)"pkgDirStream::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0 - (c++)"pkgDirStream::Process(pkgDirStream::Item&, unsigned char const*, unsigned long, unsigned long)@Base" 0.8.0 + (c++)"pkgDirStream::Process(pkgDirStream::Item&, unsigned char const*, unsigned long long, unsigned long long)@Base" 1.0.5 (c++)"pkgDirStream::~pkgDirStream()@Base" 0.8.0 (c++|optional)"pkgCache::DepIterator::operator++(int)@Base" 0.8.0 (c++|optional)"pkgCache::DepIterator::operator++()@Base" 0.8.0 diff --git a/debian/libapt-pkg4.12.install.in b/debian/libapt-pkg4.15.install.in index 56bed39d3..56bed39d3 100644 --- a/debian/libapt-pkg4.12.install.in +++ b/debian/libapt-pkg4.15.install.in diff --git a/debian/libapt-pkg4.12.symbols b/debian/libapt-pkg4.15.symbols index d481e51ed..ee7f7a66e 100644 --- a/debian/libapt-pkg4.12.symbols +++ b/debian/libapt-pkg4.15.symbols @@ -1,4 +1,4 @@ -libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# +libapt-pkg.so.4.15 libapt-pkg4.15 #MINVER# * Build-Depends-Package: libapt-pkg-dev TFRewritePackageOrder@Base 0.8.0 TFRewriteSourceOrder@Base 0.8.0 @@ -10,7 +10,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"ReadPinDir(pkgPolicy&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"RunScripts(char const*)@Base" 0.8.0 (c++)"SafeGetCWD()@Base" 0.8.0 - (c++)"parsenetrc(char*, char*, char*, char*)@Base" 0.8.0 (c++)"QuoteString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0 (c++)"ReadPinFile(pkgPolicy&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"RegexChoice(RxChoiceList*, char const**, char const**)@Base" 0.8.0 @@ -22,6 +21,7 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"StringToBool(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 0.8.0 (c++)"UnmountCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"_GetErrorObj()@Base" 0.8.0 + (c++)"Base256ToNum(char const*, unsigned long long&, unsigned int)@Base" 1.0.5 (c++)"pkgFixBroken(pkgDepCache&)@Base" 0.8.0 (c++)"DeQuoteString(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)@Base" 0.8.0 (c++)"DeQuoteString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 @@ -29,13 +29,12 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"ReadConfigDir(Configuration&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, unsigned int const&)@Base" 0.8.0 (c++)"URItoFileName(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"UTF8ToCodeset(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)@Base" 0.8.0 - (c++)"pkgAllUpgrade(pkgDepCache&)@Base" 0.8.0 (c++)"pkgInitConfig(Configuration&)@Base" 0.8.0 (c++)"pkgInitSystem(Configuration&, pkgSystem*&)@Base" 0.8.0 (c++)"safe_snprintf(char*, char*, char const*, ...)@Base" 0.8.0 (c++)"stringcasecmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char const*, char const*)@Base" 0.8.0 (c++)"stringcasecmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)@Base" 0.8.0 - (c++)"stringcasecmp(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0 +# (c++|optional=inline)"stringcasecmp(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0 (c++)"stringcasecmp(char const*, char const*, char const*, char const*)@Base" 0.8.0 (c++)"tolower_ascii(int)@Base" 0.8.0 (c++)"ParseQuoteWord(char const*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0 @@ -43,7 +42,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"TokSplitString(char, char*, char**, unsigned long)@Base" 0.8.0 (c++)"maybe_add_auth(URI&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"pkgApplyStatus(pkgDepCache&)@Base" 0.8.0 - (c++)"pkgDistUpgrade(pkgDepCache&)@Base" 0.8.0 (c++)"CheckDomainList(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"CreateDirectory(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"DirectoryExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 @@ -51,6 +49,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgPrioSortList(pkgCache&, pkgCache::Version**)@Base" 0.8.0 (c++)"pkgMakeStatusCache(pkgSourceList&, OpProgress&, MMap**, bool)@Base" 0.8.0 (c++)"pkgMinimizeUpgrade(pkgDepCache&)@Base" 0.8.0 + (c++)"pkgAllUpgrade(pkgDepCache&)@Base" 0.8.0 + (c++)"pkgDistUpgrade(pkgDepCache&)@Base" 0.8.0 (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool const&)@Base" 0.8.0 (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&)@Base" 0.8.0 (c++)"pkgMakeOnlyStatusCache(OpProgress&, DynamicMMap**)@Base" 0.8.0 @@ -78,13 +78,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"stringcmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)@Base" 0.8.0 (c++)"stringcmp(char const*, char const*, char const*, char const*)@Base" 0.8.0 (c++)"strprintf(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char const*, ...)@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::DepIterator>::toReMap@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::GrpIterator>::toReMap@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::PkgIterator>::toReMap@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::PrvIterator>::toReMap@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::VerIterator>::toReMap@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::DescIterator>::toReMap@Base" 0.8.0 - (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::PkgFileIterator>::toReMap@Base" 0.8.0 (c++)"HashString::SupportedHashes()@Base" 0.8.0 (c++)"HashString::_SupportedHashes@Base" 0.8.0 (c++)"HashString::HashString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 @@ -100,10 +93,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"SourceCopy::RewriteEntry(_IO_FILE*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"SourceCopy::Type()@Base" 0.8.0 (c++)"SourceCopy::~SourceCopy()@Base" 0.8.0 - (c++)"pkgAcqFile::Custom600Headers()@Base" 0.8.0 (c++)"pkgAcqFile::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 (c++)"pkgAcqFile::DescURI()@Base" 0.8.0 - (c++)"pkgAcqFile::HashSum()@Base" 0.8.0 (c++)"pkgAcqFile::~pkgAcqFile()@Base" 0.8.0 (c++)"pkgAcquire::WorkerStep(pkgAcquire::Worker*)@Base" 0.8.0 (c++)"pkgAcquire::FetchNeeded()@Base" 0.8.0 @@ -114,15 +105,11 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgAcquire::Add(pkgAcquire::Worker*)@Base" 0.8.0 (c++)"pkgAcquire::Run(int)@Base" 0.8.0 (c++)"pkgAcquire::Bump()@Base" 0.8.0 - (c++)"pkgAcquire::Item::Custom600Headers()@Base" 0.8.0 (c++)"pkgAcquire::Item::ReportMirrorFailure(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"pkgAcquire::Item::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 (c++)"pkgAcquire::Item::Rename(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcquire::Item::HashSum()@Base" 0.8.0 (c++)"pkgAcquire::Item::Finished()@Base" 0.8.0 - (c++)"pkgAcquire::Item::IsTrusted()@Base" 0.8.0 (c++)"pkgAcquire::Item::ShortDesc()@Base" 0.8.0 - (c++)"pkgAcquire::Item::Item(pkgAcquire*)@Base" 0.8.0 (c++)"pkgAcquire::Item::~Item()@Base" 0.8.0 (c++)"pkgAcquire::Clean(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"pkgAcquire::Queue::Bump()@Base" 0.8.0 @@ -135,7 +122,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgAcquire::Queue::Shutdown(bool)@Base" 0.8.0 (c++)"pkgAcquire::Queue::Queue(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire*)@Base" 0.8.0 (c++)"pkgAcquire::Queue::~Queue()@Base" 0.8.0 - (c++)"pkgAcquire::Setup(pkgAcquireStatus*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"pkgAcquire::Remove(pkgAcquire::Item*)@Base" 0.8.0 (c++)"pkgAcquire::Remove(pkgAcquire::Worker*)@Base" 0.8.0 (c++)"pkgAcquire::RunFds(fd_set*, fd_set*)@Base" 0.8.0 @@ -170,15 +156,10 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgRecords::Lookup(pkgCache::VerFileIterator const&)@Base" 0.8.0 (c++)"pkgRecords::Lookup(pkgCache::DescFileIterator const&)@Base" 0.8.0 (c++)"pkgRecords::Parser::Maintainer()@Base" 0.8.0 - (c++)"pkgRecords::Parser::SHA256Hash()@Base" 0.8.0 (c++)"pkgRecords::Parser::Name()@Base" 0.8.0 (c++)"pkgRecords::Parser::GetRec(char const*&, char const*&)@Base" 0.8.0 - (c++)"pkgRecords::Parser::MD5Hash()@Base" 0.8.0 (c++)"pkgRecords::Parser::FileName()@Base" 0.8.0 (c++)"pkgRecords::Parser::Homepage()@Base" 0.8.0 - (c++)"pkgRecords::Parser::LongDesc()@Base" 0.8.0 - (c++)"pkgRecords::Parser::SHA1Hash()@Base" 0.8.0 - (c++)"pkgRecords::Parser::ShortDesc()@Base" 0.8.0 (c++)"pkgRecords::Parser::SourcePkg()@Base" 0.8.0 (c++)"pkgRecords::Parser::SourceVer()@Base" 0.8.0 (c++)"pkgRecords::pkgRecords(pkgCache&)@Base" 0.8.0 @@ -221,12 +202,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"PackageCopy::RewriteEntry(_IO_FILE*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"PackageCopy::Type()@Base" 0.8.0 (c++)"PackageCopy::~PackageCopy()@Base" 0.8.0 - (c++)"pkgAcqIndex::Custom600Headers()@Base" 0.8.0 - (c++)"pkgAcqIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 - (c++)"pkgAcqIndex::DescURI()@Base" 0.8.0 - (c++)"pkgAcqIndex::HashSum()@Base" 0.8.0 - (c++)"pkgAcqIndex::pkgAcqIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashString, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcqIndex::~pkgAcqIndex()@Base" 0.8.0 (c++)"pkgDepCache::IsDeleteOk(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0 (c++)"pkgDepCache::MarkDelete(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0 (c++)"pkgDepCache::StateCache::StripEpoch(char const*)@Base" 0.8.0 @@ -236,8 +211,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgDepCache::ActionGroup::~ActionGroup()@Base" 0.8.0 (c++)"pkgDepCache::IsInstallOk(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0 (c++)"pkgDepCache::MarkInstall(pkgCache::PkgIterator const&, bool, unsigned long, bool, bool)@Base" 0.8.0 - (c++)"pkgDepCache::MarkPackage(pkgCache::PkgIterator const&, pkgCache::VerIterator const&, bool const&, bool const&)@Base" 0.8.0 - (c++)"pkgDepCache::MarkRequired(pkgDepCache::InRootSetFunc&)@Base" 0.8.0 (c++)"pkgDepCache::SetReInstall(pkgCache::PkgIterator const&, bool)@Base" 0.8.0 (c++)"pkgDepCache::VersionState(pkgCache::DepIterator, unsigned char, unsigned char, unsigned char)@Base" 0.8.0 (c++)"pkgDepCache::BuildGroupOrs(pkgCache::VerIterator const&)@Base" 0.8.0 @@ -253,7 +226,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgDepCache::MarkFollowsSuggests()@Base" 0.8.0 (c++)"pkgDepCache::MarkFollowsRecommends()@Base" 0.8.0 (c++)"pkgDepCache::Init(OpProgress*)@Base" 0.8.0 - (c++)"pkgDepCache::Sweep()@Base" 0.8.0 (c++)"pkgDepCache::Policy::IsImportantDep(pkgCache::DepIterator const&)@Base" 0.8.0 (c++)"pkgDepCache::Policy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0 (c++)"pkgDepCache::Policy::~Policy()@Base" 0.8.0 @@ -263,25 +235,20 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgDepCache::CheckDep(pkgCache::DepIterator, int, pkgCache::PkgIterator&)@Base" 0.8.0 (c++)"pkgDepCache::MarkAuto(pkgCache::PkgIterator const&, bool)@Base" 0.8.0 (c++)"pkgDepCache::MarkKeep(pkgCache::PkgIterator const&, bool, bool, unsigned long)@Base" 0.8.0 + (c++)"pkgDepCache::MarkRequired(pkgDepCache::InRootSetFunc&)@Base" 0.8.0 + (c++)"pkgDepCache::Sweep()@Base" 0.8.0 (c++)"pkgDepCache::pkgDepCache(pkgCache*, pkgDepCache::Policy*)@Base" 0.8.0 (c++)"pkgDepCache::~pkgDepCache()@Base" 0.8.0 - (c++)"pkgSimulate::ShortBreaks()@Base" 0.8.0 (c++)"pkgSimulate::Policy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0 (c++)"pkgSimulate::Policy::~Policy()@Base" 0.8.0 (c++)"pkgSimulate::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0 (c++)"pkgSimulate::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgSimulate::Describe(pkgCache::PkgIterator, std::basic_ostream<char, std::char_traits<char> >&, bool, bool)@Base" 0.8.0 (c++)"pkgSimulate::Configure(pkgCache::PkgIterator)@Base" 0.8.0 (c++)"pkgSimulate::pkgSimulate(pkgDepCache*)@Base" 0.8.0 (c++)"pkgSimulate::~pkgSimulate()@Base" 0.8.0 - (c++)"debIFTypePkg::~debIFTypePkg()@Base" 0.8.0 - (c++)"debIFTypeSrc::~debIFTypeSrc()@Base" 0.8.0 - (c++)"debSLTypeDeb::~debSLTypeDeb()@Base" 0.8.0 (c++)"indexRecords::Load(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"indexRecords::Lookup(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"indexRecords::MetaKeys()@Base" 0.8.0 - (c++)"indexRecords::indexRecords(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"indexRecords::indexRecords()@Base" 0.8.0 (c++)"indexRecords::~indexRecords()@Base" 0.8.0 (c++)"pkgAcqMethod::FetchResult::TakeHashes(Hashes&)@Base" 0.8.0 (c++)"pkgAcqMethod::FetchResult::FetchResult()@Base" 0.8.0 @@ -354,43 +321,16 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"Configuration::Configuration()@Base" 0.8.0 (c++)"Configuration::~Configuration()@Base" 0.8.0 (c++)"WeakPointable::~WeakPointable()@Base" 0.8.0 - (c++)"debListParser::NewVersion(pkgCache::VerIterator&)@Base" 0.8.0 - (c++)"debListParser::UsePackage(pkgCache::PkgIterator&, pkgCache::VerIterator&)@Base" 0.8.0 - (c++)"debListParser::Description()@Base" 0.8.0 - (c++)"debListParser::ParseStatus(pkgCache::PkgIterator&, pkgCache::VerIterator&)@Base" 0.8.0 - (c++)"debListParser::VersionHash()@Base" 0.8.0 - (c++)"debListParser::Architecture()@Base" 0.8.0 (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&)@Base" 0.8.0 - (c++)"debListParser::ParseDepends(pkgCache::VerIterator&, char const*, unsigned int)@Base" 0.8.0 - (c++)"debListParser::ParseProvides(pkgCache::VerIterator&)@Base" 0.8.0 - (c++)"debListParser::ArchitectureAll()@Base" 0.8.0 (c++)"debListParser::ConvertRelation(char const*, unsigned int&)@Base" 0.8.0 - (c++)"debListParser::Description_md5()@Base" 0.8.0 - (c++)"debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator&, FileFd&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"debListParser::UniqFindTagWrite(char const*)@Base" 0.8.0 - (c++)"debListParser::DescriptionLanguage()@Base" 0.8.0 - (c++)"debListParser::Size()@Base" 0.8.0 - (c++)"debListParser::Step()@Base" 0.8.0 - (c++)"debListParser::Offset()@Base" 0.8.0 (c++)"debListParser::GetPrio(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"debListParser::Package()@Base" 0.8.0 - (c++)"debListParser::Version()@Base" 0.8.0 - (c++)"debListParser::GrabWord(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, debListParser::WordList*, unsigned char&)@Base" 0.8.0 - (c++)"debListParser::debListParser(FileFd*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 - (c++)"debListParser::~debListParser()@Base" 0.8.0 (c++)"pkgAcqArchive::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 (c++)"pkgAcqArchive::DescURI()@Base" 0.8.0 - (c++)"pkgAcqArchive::HashSum()@Base" 0.8.0 (c++)"pkgAcqArchive::Finished()@Base" 0.8.0 - (c++)"pkgAcqArchive::IsTrusted()@Base" 0.8.0 (c++)"pkgAcqArchive::QueueNext()@Base" 0.8.0 (c++)"pkgAcqArchive::ShortDesc()@Base" 0.8.0 (c++)"pkgAcqArchive::pkgAcqArchive(pkgAcquire*, pkgSourceList*, pkgRecords*, pkgCache::VerIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0 (c++)"pkgAcqArchive::~pkgAcqArchive()@Base" 0.8.0 - (c++)"pkgAcqMetaSig::Custom600Headers()@Base" 0.8.0 - (c++)"pkgAcqMetaSig::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 - (c++)"pkgAcqMetaSig::DescURI()@Base" 0.8.0 - (c++)"pkgAcqMetaSig::~pkgAcqMetaSig()@Base" 0.8.0 (c++)"pkgSourceList::ReadAppend(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"pkgSourceList::ReadMainList()@Base" 0.8.0 (c++)"pkgSourceList::ReadSourceDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 @@ -411,7 +351,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgSrcRecords::pkgSrcRecords(pkgSourceList&)@Base" 0.8.0 (c++)"pkgSrcRecords::~pkgSrcRecords()@Base" 0.8.0 (c++)"pkgTagSection::TrimRecord(bool, char const*&)@Base" 0.8.0 - (c++)"pkgTagSection::Scan(char const*, unsigned long)@Base" 0.8.0 (c++)"pkgTagSection::Trim()@Base" 0.8.0 (c++)"pkgVendorList::CreateList(Configuration&)@Base" 0.8.0 (c++)"pkgVendorList::FindVendor(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)@Base" 0.8.0 @@ -424,51 +363,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"OpTextProgress::Update()@Base" 0.8.0 (c++)"OpTextProgress::OpTextProgress(Configuration&)@Base" 0.8.0 (c++)"OpTextProgress::~OpTextProgress()@Base" 0.8.0 - (c++)"debIFTypeTrans::~debIFTypeTrans()@Base" 0.8.0 - (c++)"debStatusIndex::debStatusIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"debStatusIndex::~debStatusIndex()@Base" 0.8.0 - (c++)"debIFTypeStatus::~debIFTypeStatus()@Base" 0.8.0 - (c++)"debRecordParser::Maintainer()@Base" 0.8.0 - (c++)"debRecordParser::SHA256Hash()@Base" 0.8.0 - (c++)"debRecordParser::Jump(pkgCache::VerFileIterator const&)@Base" 0.8.0 - (c++)"debRecordParser::Jump(pkgCache::DescFileIterator const&)@Base" 0.8.0 - (c++)"debRecordParser::Name()@Base" 0.8.0 - (c++)"debRecordParser::GetRec(char const*&, char const*&)@Base" 0.8.0 - (c++)"debRecordParser::MD5Hash()@Base" 0.8.0 - (c++)"debRecordParser::FileName()@Base" 0.8.0 - (c++)"debRecordParser::Homepage()@Base" 0.8.0 - (c++)"debRecordParser::LongDesc()@Base" 0.8.0 - (c++)"debRecordParser::SHA1Hash()@Base" 0.8.0 - (c++)"debRecordParser::ShortDesc()@Base" 0.8.0 - (c++)"debRecordParser::SourcePkg()@Base" 0.8.0 - (c++)"debRecordParser::SourceVer()@Base" 0.8.0 - (c++)"debRecordParser::debRecordParser(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgCache&)@Base" 0.8.0 - (c++)"debRecordParser::~debRecordParser()@Base" 0.8.0 - (c++)"debReleaseIndex::GetIndexFiles()@Base" 0.8.0 - (c++)"debReleaseIndex::debSectionEntry::debSectionEntry(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)@Base" 0.8.0 - (c++)"debReleaseIndex::PushSectionEntry(debReleaseIndex::debSectionEntry const*)@Base" 0.8.0 - (c++)"debReleaseIndex::PushSectionEntry(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, debReleaseIndex::debSectionEntry const*)@Base" 0.8.0 - (c++)"debReleaseIndex::PushSectionEntry(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, debReleaseIndex::debSectionEntry const*)@Base" 0.8.0 - (c++)"debReleaseIndex::debReleaseIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 - (c++)"debReleaseIndex::~debReleaseIndex()@Base" 0.8.0 - (c++)"debSLTypeDebSrc::~debSLTypeDebSrc()@Base" 0.8.0 - (c++)"debSourcesIndex::debSourcesIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0 - (c++)"debSourcesIndex::~debSourcesIndex()@Base" 0.8.0 - (c++)"pkgAcqDiffIndex::ParseDiffIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcqDiffIndex::Custom600Headers()@Base" 0.8.0 - (c++)"pkgAcqDiffIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 - (c++)"pkgAcqDiffIndex::DescURI()@Base" 0.8.0 - (c++)"pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashString)@Base" 0.8.0 - (c++)"pkgAcqDiffIndex::~pkgAcqDiffIndex()@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::QueueIndexes(bool)@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::VerifyVendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::RetrievalDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::Custom600Headers()@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::DescURI()@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::AuthDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.0 - (c++)"pkgAcqMetaIndex::~pkgAcqMetaIndex()@Base" 0.8.0 (c++)"pkgVersionMatch::ExpressionMatches(char const*, char const*)@Base" 0.8.0 (c++)"pkgVersionMatch::ExpressionMatches(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0 (c++)"pkgVersionMatch::Find(pkgCache::PkgIterator)@Base" 0.8.0 @@ -477,18 +371,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgVersionMatch::pkgVersionMatch(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgVersionMatch::MatchType)@Base" 0.8.0 (c++)"pkgVersionMatch::~pkgVersionMatch()@Base" 0.8.0 (c++)"TranslationsCopy::CopyTranslations(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, pkgCdromStatus*)@Base" 0.8.0 - (c++)"debPackagesIndex::debPackagesIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 - (c++)"debPackagesIndex::~debPackagesIndex()@Base" 0.8.0 - (c++)"pkgAcqIndexDiffs::QueueNextDiff()@Base" 0.8.0 - (c++)"pkgAcqIndexDiffs::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 - (c++)"pkgAcqIndexDiffs::Finish(bool)@Base" 0.8.0 - (c++)"pkgAcqIndexDiffs::DescURI()@Base" 0.8.0 - (c++)"pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashString, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<DiffInfo, std::allocator<DiffInfo> >)@Base" 0.8.0 - (c++)"pkgAcqIndexDiffs::~pkgAcqIndexDiffs()@Base" 0.8.0 - (c++)"pkgAcqIndexTrans::Custom600Headers()@Base" 0.8.0 - (c++)"pkgAcqIndexTrans::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0 - (c++)"pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"pkgAcqIndexTrans::~pkgAcqIndexTrans()@Base" 0.8.0 (c++)"pkgAcquireStatus::Done(pkgAcquire::ItemDesc&)@Base" 0.8.0 (c++)"pkgAcquireStatus::Fail(pkgAcquire::ItemDesc&)@Base" 0.8.0 (c++)"pkgAcquireStatus::Stop()@Base" 0.8.0 @@ -499,31 +381,9 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgAcquireStatus::pkgAcquireStatus()@Base" 0.8.0 (c++)"PreferenceSection::TrimRecord(bool, char const*&)@Base" 0.8.0 (c++)"pkgArchiveCleaner::Go(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgCache&)@Base" 0.8.0 - (c++)"pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)@Base" 0.8.0 - (c++)"pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 - (c++)"pkgCacheGenerator::ListParser::CollectFileProvides(pkgCache&, pkgCache::VerIterator&)@Base" 0.8.0 - (c++)"pkgCacheGenerator::NewFileVer(pkgCache::VerIterator&, pkgCacheGenerator::ListParser&)@Base" 0.8.0 - (c++)"pkgCacheGenerator::NewPackage(pkgCache::PkgIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 - (c++)"pkgCacheGenerator::SelectFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pkgIndexFile const&, unsigned long)@Base" 0.8.0 - (c++)"pkgCacheGenerator::FinishCache(OpProgress*)@Base" 0.8.0 - (c++)"pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator&, pkgCacheGenerator::ListParser&)@Base" 0.8.0 (c++)"pkgCacheGenerator::MakeStatusCache(pkgSourceList&, OpProgress*, MMap**, bool)@Base" 0.8.0 - (c++)"pkgCacheGenerator::WriteUniqString(char const*, unsigned int)@Base" 0.8.0 (c++)"pkgCacheGenerator::CreateDynamicMMap(FileFd*, unsigned long)@Base" 0.8.0 - (c++)"pkgCacheGenerator::MergeFileProvides(pkgCacheGenerator::ListParser&)@Base" 0.8.0 (c++)"pkgCacheGenerator::MakeOnlyStatusCache(OpProgress*, DynamicMMap**)@Base" 0.8.0 - (c++)"pkgCacheGenerator::ReMap(void const*, void const*)@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::DepIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::GrpIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::PkgIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::PrvIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::VerIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::DescIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::Dynamic<pkgCache::PkgFileIterator>::toReMap@Base" 0.8.0 - (c++)"pkgCacheGenerator::NewGroup(pkgCache::GrpIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 - (c++)"pkgCacheGenerator::MergeList(pkgCacheGenerator::ListParser&, pkgCache::VerIterator*)@Base" 0.8.0 - (c++)"pkgCacheGenerator::pkgCacheGenerator(DynamicMMap*, OpProgress*)@Base" 0.8.0 - (c++)"pkgCacheGenerator::~pkgCacheGenerator()@Base" 0.8.0 (c++)"pkgPackageManager::FixMissing()@Base" 0.8.0 (c++)"pkgPackageManager::EarlyRemove(pkgCache::PkgIterator)@Base" 0.8.0 (c++)"pkgPackageManager::GetArchives(pkgAcquire*, pkgSourceList*, pkgRecords*)@Base" 0.8.0 @@ -544,22 +404,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgPackageManager::DoInstall(int)@Base" 0.8.0 (c++)"pkgPackageManager::pkgPackageManager(pkgDepCache*)@Base" 0.8.0 (c++)"pkgPackageManager::~pkgPackageManager()@Base" 0.8.0 - (c++)"debSrcRecordParser::BuildDepends(std::vector<pkgSrcRecords::Parser::BuildDepRec, std::allocator<pkgSrcRecords::Parser::BuildDepRec> >&, bool const&, bool const&)@Base" 0.8.0 - (c++)"debSrcRecordParser::Jump(unsigned long const&)@Base" 0.8.0 - (c++)"debSrcRecordParser::Step()@Base" 0.8.0 - (c++)"debSrcRecordParser::AsStr()@Base" 0.8.0 - (c++)"debSrcRecordParser::Files(std::vector<pkgSrcRecords::File, std::allocator<pkgSrcRecords::File> >&)@Base" 0.8.0 - (c++)"debSrcRecordParser::Offset()@Base" 0.8.0 - (c++)"debSrcRecordParser::Restart()@Base" 0.8.0 - (c++)"debSrcRecordParser::Binaries()@Base" 0.8.0 - (c++)"debSrcRecordParser::~debSrcRecordParser()@Base" 0.8.0 - (c++)"pkgProblemResolver::MakeScores()@Base" 0.8.0 - (c++)"pkgProblemResolver::ResolveByKeep()@Base" 0.8.0 (c++)"pkgProblemResolver::InstallProtect()@Base" 0.8.0 (c++)"pkgProblemResolver::This@Base" 0.8.0 - (c++)"pkgProblemResolver::Resolve(bool)@Base" 0.8.0 - (c++)"pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator)@Base" 0.8.0 - (c++)"pkgProblemResolver::ScoreSort(void const*, void const*)@Base" 0.8.0 (c++)"pkgProblemResolver::pkgProblemResolver(pkgDepCache*)@Base" 0.8.0 (c++)"pkgProblemResolver::~pkgProblemResolver()@Base" 0.8.0 (c++)"debVersioningSystem::CmpFragment(char const*, char const*, char const*, char const*)@Base" 0.8.0 @@ -578,8 +424,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgVersioningSystem::TestCompatibility(pkgVersioningSystem const&)@Base" 0.8.0 (c++)"pkgVersioningSystem::GetVS(char const*)@Base" 0.8.0 (c++)"pkgVersioningSystem::pkgVersioningSystem()@Base" 0.8.0 - (c++)"debTranslationsIndex::debTranslationsIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char const*)@Base" 0.8.0 - (c++)"debTranslationsIndex::~debTranslationsIndex()@Base" 0.8.0 (c++)"APT::CacheFilter::PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"APT::CacheFilter::PackageNameMatchesRegEx::~PackageNameMatchesRegEx()@Base" 0.8.0 (c++)"APT::CacheFilter::PackageNameMatchesRegEx::operator()(pkgCache::GrpIterator const&)@Base" 0.8.0 @@ -613,7 +457,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"Vendor::CheckDist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"Vendor::Vendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Vendor::Fingerprint*, std::allocator<Vendor::Fingerprint*> >*)@Base" 0.8.0 (c++)"Vendor::~Vendor()@Base" 0.8.0 - (c++)"DiffInfo::~DiffInfo()@Base" 0.8.0 (c++)"pkgCache::CompTypeDeb(unsigned char)@Base" 0.8.0 (c++)"pkgCache::DepIterator::GlobOr(pkgCache::DepIterator&, pkgCache::DepIterator&)@Base" 0.8.0 (c++)"pkgCache::DepIterator::operator++(int)@Base" 0.8.0 @@ -636,7 +479,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgCache::VerFileIterator::operator++()@Base" 0.8.0 (c++)"pkgCache::DescFileIterator::operator++(int)@Base" 0.8.0 (c++)"pkgCache::DescFileIterator::operator++()@Base" 0.8.0 - (c++)"pkgCache::SingleArchFindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"pkgCache::ReMap(bool const&)@Base" 0.8.0 (c++)"pkgCache::Header::Header()@Base" 0.8.0 (c++)"pkgCache::DepType(unsigned char)@Base" 0.8.0 @@ -663,11 +505,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"IndexCopy::ChopDirs(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)@Base" 0.8.0 (c++)"IndexCopy::GrabFirst(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int)@Base" 0.8.0 (c++)"SigVerify::CopyAndVerify(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)@Base" 0.8.0 - (c++)"SigVerify::CopyMetaIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 - (c++)"SigVerify::Verify(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, indexRecords*)@Base" 0.8.0 (c++)"SigVerify::RunGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, int*)@Base" 0.8.0 (c++)"debSystem::Initialize(Configuration&)@Base" 0.8.0 - (c++)"debSystem::CheckUpdates()@Base" 0.8.0 (c++)"debSystem::AddStatusFiles(std::vector<pkgIndexFile*, std::allocator<pkgIndexFile*> >&)@Base" 0.8.0 (c++)"debSystem::ArchiveSupported(char const*)@Base" 0.8.0 (c++)"debSystem::Lock()@Base" 0.8.0 @@ -680,7 +519,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgDPkgPM::WriteHistoryTag(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0 (c++)"pkgDPkgPM::WriteApportReport(char const*, char const*)@Base" 0.8.0 (c++)"pkgDPkgPM::RunScriptsWithPkgs(char const*)@Base" 0.8.0 - (c++)"pkgDPkgPM::handleDisappearAction(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0 (c++)"pkgDPkgPM::Go(int)@Base" 0.8.0 (c++)"pkgDPkgPM::Reset()@Base" 0.8.0 (c++)"pkgDPkgPM::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0 @@ -710,8 +548,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"HashString::toStr() const@Base" 0.8.0 (c++)"CommandLine::FileSize() const@Base" 0.8.0 (c++)"GlobalError::empty(GlobalError::MsgType const&) const@Base" 0.8.0 - (c++)"debIFTypePkg::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0 - (c++)"debSLTypeDeb::CreateItem(std::vector<metaIndex*, std::allocator<metaIndex*> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const@Base" 0.8.0 (c++)"indexRecords::GetValidUntil() const@Base" 0.8.0 (c++)"indexRecords::GetExpectedDist() const@Base" 0.8.0 (c++)"indexRecords::Exists(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 @@ -722,12 +558,9 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgIndexFile::ArchiveInfo(pkgCache::VerIterator) const@Base" 0.8.0 (c++)"pkgIndexFile::FindInCache(pkgCache&) const@Base" 0.8.0 (c++)"pkgIndexFile::CreateSrcParser() const@Base" 0.8.0 - (c++)"pkgIndexFile::MergeFileProvides(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0 (c++)"pkgIndexFile::MergeFileProvides(pkgCacheGenerator&, OpProgress&) const@Base" 0.8.0 (c++)"pkgIndexFile::Type::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0 - (c++)"pkgIndexFile::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0 (c++)"pkgIndexFile::Merge(pkgCacheGenerator&, OpProgress&) const@Base" 0.8.0 - (c++)"Configuration::FindVector(char const*) const@Base" 0.8.0 (c++)"Configuration::MatchAgainstConfig::Match(char const*) const@Base" 0.8.0 (c++)"Configuration::Find(char const*, char const*) const@Base" 0.8.0 (c++)"Configuration::Item::FullTag(Configuration::Item const*) const@Base" 0.8.0 @@ -748,63 +581,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgTagSection::FindS(char const*) const@Base" 0.8.0 (c++)"pkgTagSection::FindULL(char const*, unsigned long long const&) const@Base" 0.8.0 (c++)"pkgTagSection::FindFlag(char const*, unsigned long&, unsigned long) const@Base" 0.8.0 - (c++)"debStatusIndex::FindInCache(pkgCache&) const@Base" 0.8.0 - (c++)"debStatusIndex::HasPackages() const@Base" 0.8.0 - (c++)"debStatusIndex::Size() const@Base" 0.8.0 - (c++)"debStatusIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0 - (c++)"debStatusIndex::Exists() const@Base" 0.8.0 - (c++)"debStatusIndex::GetType() const@Base" 0.8.0 - (c++)"debStatusIndex::Describe(bool) const@Base" 0.8.0 - (c++)"debIFTypeStatus::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0 - (c++)"debReleaseIndex::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::GetIndexes(pkgAcquire*, bool const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::MetaIndexURI(char const*) const@Base" 0.8.0 - (c++)"debReleaseIndex::MetaIndexFile(char const*) const@Base" 0.8.0 - (c++)"debReleaseIndex::MetaIndexInfo(char const*) const@Base" 0.8.0 - (c++)"debReleaseIndex::IndexURISuffix(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::SourceIndexURI(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::ComputeIndexTargets() const@Base" 0.8.0 - (c++)"debReleaseIndex::SourceIndexURISuffix(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::Info(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::IndexURI(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0 - (c++)"debReleaseIndex::IsTrusted() const@Base" 0.8.0 - (c++)"debSLTypeDebSrc::CreateItem(std::vector<metaIndex*, std::allocator<metaIndex*> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const@Base" 0.8.0 - (c++)"debSLTypeDebian::CreateItemInternal(std::vector<metaIndex*, std::allocator<metaIndex*> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const@Base" 0.8.0 - (c++)"debSourcesIndex::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0 - (c++)"debSourcesIndex::SourceInfo(pkgSrcRecords::Parser const&, pkgSrcRecords::File const&) const@Base" 0.8.0 - (c++)"debSourcesIndex::HasPackages() const@Base" 0.8.0 - (c++)"debSourcesIndex::CreateSrcParser() const@Base" 0.8.0 - (c++)"debSourcesIndex::Info(char const*) const@Base" 0.8.0 - (c++)"debSourcesIndex::Size() const@Base" 0.8.0 - (c++)"debSourcesIndex::Exists() const@Base" 0.8.0 - (c++)"debSourcesIndex::GetType() const@Base" 0.8.0 - (c++)"debSourcesIndex::Describe(bool) const@Base" 0.8.0 - (c++)"debSourcesIndex::IndexURI(char const*) const@Base" 0.8.0 - (c++)"debPackagesIndex::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0 - (c++)"debPackagesIndex::ArchiveInfo(pkgCache::VerIterator) const@Base" 0.8.0 - (c++)"debPackagesIndex::FindInCache(pkgCache&) const@Base" 0.8.0 - (c++)"debPackagesIndex::HasPackages() const@Base" 0.8.0 - (c++)"debPackagesIndex::Info(char const*) const@Base" 0.8.0 - (c++)"debPackagesIndex::Size() const@Base" 0.8.0 - (c++)"debPackagesIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0 - (c++)"debPackagesIndex::Exists() const@Base" 0.8.0 - (c++)"debPackagesIndex::GetType() const@Base" 0.8.0 - (c++)"debPackagesIndex::Describe(bool) const@Base" 0.8.0 - (c++)"debPackagesIndex::IndexURI(char const*) const@Base" 0.8.0 - (c++)"debSrcRecordParser::Maintainer() const@Base" 0.8.0 - (c++)"debSrcRecordParser::Package() const@Base" 0.8.0 - (c++)"debSrcRecordParser::Section() const@Base" 0.8.0 - (c++)"debSrcRecordParser::Version() const@Base" 0.8.0 - (c++)"debTranslationsIndex::GetIndexes(pkgAcquire*) const@Base" 0.8.0 - (c++)"debTranslationsIndex::FindInCache(pkgCache&) const@Base" 0.8.0 - (c++)"debTranslationsIndex::HasPackages() const@Base" 0.8.0 - (c++)"debTranslationsIndex::Info(char const*) const@Base" 0.8.0 - (c++)"debTranslationsIndex::Size() const@Base" 0.8.0 - (c++)"debTranslationsIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0 - (c++)"debTranslationsIndex::Exists() const@Base" 0.8.0 - (c++)"debTranslationsIndex::GetType() const@Base" 0.8.0 - (c++)"debTranslationsIndex::Describe(bool) const@Base" 0.8.0 - (c++)"debTranslationsIndex::IndexURI(char const*) const@Base" 0.8.0 (c++)"Vendor::GetVendorID() const@Base" 0.8.0 (c++)"Vendor::LookupFingerprint(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0 (c++)"pkgCache::DepIterator::AllTargets() const@Base" 0.8.0 @@ -846,43 +622,22 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"typeinfo for pkgAcquire@Base" 0.8.0 (c++)"typeinfo for DynamicMMap@Base" 0.8.0 (c++)"typeinfo for PackageCopy@Base" 0.8.0 - (c++)"typeinfo for pkgAcqIndex@Base" 0.8.0 (c++)"typeinfo for pkgDepCache@Base" 0.8.0 (c++)"typeinfo for pkgSimulate@Base" 0.8.0 - (c++)"typeinfo for debIFTypePkg@Base" 0.8.0 - (c++)"typeinfo for debIFTypeSrc@Base" 0.8.0 - (c++)"typeinfo for debSLTypeDeb@Base" 0.8.0 (c++)"typeinfo for indexRecords@Base" 0.8.0 (c++)"typeinfo for pkgAcqMethod@Base" 0.8.0 (c++)"typeinfo for pkgCacheFile@Base" 0.8.0 (c++)"typeinfo for pkgIndexFile@Base" 0.8.0 (c++)"typeinfo for WeakPointable@Base" 0.8.0 - (c++)"typeinfo for debListParser@Base" 0.8.0 (c++)"typeinfo for pkgAcqArchive@Base" 0.8.0 - (c++)"typeinfo for pkgAcqMetaSig@Base" 0.8.0 (c++)"typeinfo for pkgTagSection@Base" 0.8.0 (c++)"typeinfo for OpTextProgress@Base" 0.8.0 - (c++)"typeinfo for debIFTypeTrans@Base" 0.8.0 - (c++)"typeinfo for debStatusIndex@Base" 0.8.0 - (c++)"typeinfo for debIFTypeStatus@Base" 0.8.0 - (c++)"typeinfo for debRecordParser@Base" 0.8.0 - (c++)"typeinfo for debReleaseIndex@Base" 0.8.0 - (c++)"typeinfo for debSLTypeDebSrc@Base" 0.8.0 - (c++)"typeinfo for debSLTypeDebian@Base" 0.8.0 - (c++)"typeinfo for debSourcesIndex@Base" 0.8.0 - (c++)"typeinfo for pkgAcqDiffIndex@Base" 0.8.0 - (c++)"typeinfo for pkgAcqMetaIndex@Base" 0.8.0 - (c++)"typeinfo for debPackagesIndex@Base" 0.8.0 - (c++)"typeinfo for pkgAcqIndexDiffs@Base" 0.8.0 - (c++)"typeinfo for pkgAcqIndexTrans@Base" 0.8.0 (c++)"typeinfo for pkgAcquireStatus@Base" 0.8.0 (c++)"typeinfo for PreferenceSection@Base" 0.8.0 (c++)"typeinfo for pkgPackageManager@Base" 0.8.0 - (c++)"typeinfo for debSrcRecordParser@Base" 0.8.0 (c++)"typeinfo for debVersioningSystem@Base" 0.8.0 (c++)"typeinfo for pkgUdevCdromDevices@Base" 0.8.0 (c++)"typeinfo for pkgVersioningSystem@Base" 0.8.0 - (c++)"typeinfo for debTranslationsIndex@Base" 0.8.0 (c++)"typeinfo for MMap@Base" 0.8.0 (c++)"typeinfo for FileFd@Base" 0.8.0 (c++)"typeinfo for Vendor@Base" 0.8.0 @@ -903,7 +658,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"typeinfo for Configuration::MatchAgainstConfig@Base" 0.8.0 (c++)"typeinfo for pkgSourceList::Type@Base" 0.8.0 (c++)"typeinfo for pkgSrcRecords::Parser@Base" 0.8.0 - (c++)"typeinfo for pkgCacheGenerator::ListParser@Base" 0.8.0 (c++)"typeinfo for APT::CacheSetHelper@Base" 0.8.0 (c++)"typeinfo for pkgCache::DepIterator@Base" 0.8.0 (c++)"typeinfo for pkgCache::GrpIterator@Base" 0.8.0 @@ -930,43 +684,22 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"typeinfo name for pkgAcquire@Base" 0.8.0 (c++)"typeinfo name for DynamicMMap@Base" 0.8.0 (c++)"typeinfo name for PackageCopy@Base" 0.8.0 - (c++)"typeinfo name for pkgAcqIndex@Base" 0.8.0 (c++)"typeinfo name for pkgDepCache@Base" 0.8.0 (c++)"typeinfo name for pkgSimulate@Base" 0.8.0 - (c++)"typeinfo name for debIFTypePkg@Base" 0.8.0 - (c++)"typeinfo name for debIFTypeSrc@Base" 0.8.0 - (c++)"typeinfo name for debSLTypeDeb@Base" 0.8.0 (c++)"typeinfo name for indexRecords@Base" 0.8.0 (c++)"typeinfo name for pkgAcqMethod@Base" 0.8.0 (c++)"typeinfo name for pkgCacheFile@Base" 0.8.0 (c++)"typeinfo name for pkgIndexFile@Base" 0.8.0 (c++)"typeinfo name for WeakPointable@Base" 0.8.0 - (c++)"typeinfo name for debListParser@Base" 0.8.0 (c++)"typeinfo name for pkgAcqArchive@Base" 0.8.0 - (c++)"typeinfo name for pkgAcqMetaSig@Base" 0.8.0 (c++)"typeinfo name for pkgTagSection@Base" 0.8.0 (c++)"typeinfo name for OpTextProgress@Base" 0.8.0 - (c++)"typeinfo name for debIFTypeTrans@Base" 0.8.0 - (c++)"typeinfo name for debStatusIndex@Base" 0.8.0 - (c++)"typeinfo name for debIFTypeStatus@Base" 0.8.0 - (c++)"typeinfo name for debRecordParser@Base" 0.8.0 - (c++)"typeinfo name for debReleaseIndex@Base" 0.8.0 - (c++)"typeinfo name for debSLTypeDebSrc@Base" 0.8.0 - (c++)"typeinfo name for debSLTypeDebian@Base" 0.8.0 - (c++)"typeinfo name for debSourcesIndex@Base" 0.8.0 - (c++)"typeinfo name for pkgAcqDiffIndex@Base" 0.8.0 - (c++)"typeinfo name for pkgAcqMetaIndex@Base" 0.8.0 - (c++)"typeinfo name for debPackagesIndex@Base" 0.8.0 - (c++)"typeinfo name for pkgAcqIndexDiffs@Base" 0.8.0 - (c++)"typeinfo name for pkgAcqIndexTrans@Base" 0.8.0 (c++)"typeinfo name for pkgAcquireStatus@Base" 0.8.0 (c++)"typeinfo name for PreferenceSection@Base" 0.8.0 (c++)"typeinfo name for pkgPackageManager@Base" 0.8.0 - (c++)"typeinfo name for debSrcRecordParser@Base" 0.8.0 (c++)"typeinfo name for debVersioningSystem@Base" 0.8.0 (c++)"typeinfo name for pkgUdevCdromDevices@Base" 0.8.0 (c++)"typeinfo name for pkgVersioningSystem@Base" 0.8.0 - (c++)"typeinfo name for debTranslationsIndex@Base" 0.8.0 (c++)"typeinfo name for MMap@Base" 0.8.0 (c++)"typeinfo name for FileFd@Base" 0.8.0 (c++)"typeinfo name for Vendor@Base" 0.8.0 @@ -987,7 +720,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"typeinfo name for Configuration::MatchAgainstConfig@Base" 0.8.0 (c++)"typeinfo name for pkgSourceList::Type@Base" 0.8.0 (c++)"typeinfo name for pkgSrcRecords::Parser@Base" 0.8.0 - (c++)"typeinfo name for pkgCacheGenerator::ListParser@Base" 0.8.0 (c++)"typeinfo name for APT::CacheSetHelper@Base" 0.8.0 (c++)"typeinfo name for pkgCache::DepIterator@Base" 0.8.0 (c++)"typeinfo name for pkgCache::GrpIterator@Base" 0.8.0 @@ -1014,42 +746,21 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"vtable for pkgAcquire@Base" 0.8.0 (c++)"vtable for DynamicMMap@Base" 0.8.0 (c++)"vtable for PackageCopy@Base" 0.8.0 - (c++)"vtable for pkgAcqIndex@Base" 0.8.0 (c++)"vtable for pkgDepCache@Base" 0.8.0 (c++)"vtable for pkgSimulate@Base" 0.8.0 - (c++)"vtable for debIFTypePkg@Base" 0.8.0 - (c++)"vtable for debIFTypeSrc@Base" 0.8.0 - (c++)"vtable for debSLTypeDeb@Base" 0.8.0 (c++)"vtable for indexRecords@Base" 0.8.0 (c++)"vtable for pkgAcqMethod@Base" 0.8.0 (c++)"vtable for pkgCacheFile@Base" 0.8.0 (c++)"vtable for pkgIndexFile@Base" 0.8.0 - (c++)"vtable for debListParser@Base" 0.8.0 (c++)"vtable for pkgAcqArchive@Base" 0.8.0 - (c++)"vtable for pkgAcqMetaSig@Base" 0.8.0 (c++)"vtable for pkgTagSection@Base" 0.8.0 (c++)"vtable for OpTextProgress@Base" 0.8.0 - (c++)"vtable for debIFTypeTrans@Base" 0.8.0 - (c++)"vtable for debStatusIndex@Base" 0.8.0 - (c++)"vtable for debIFTypeStatus@Base" 0.8.0 - (c++)"vtable for debRecordParser@Base" 0.8.0 - (c++)"vtable for debReleaseIndex@Base" 0.8.0 - (c++)"vtable for debSLTypeDebSrc@Base" 0.8.0 - (c++)"vtable for debSLTypeDebian@Base" 0.8.0 - (c++)"vtable for debSourcesIndex@Base" 0.8.0 - (c++)"vtable for pkgAcqDiffIndex@Base" 0.8.0 - (c++)"vtable for pkgAcqMetaIndex@Base" 0.8.0 - (c++)"vtable for debPackagesIndex@Base" 0.8.0 - (c++)"vtable for pkgAcqIndexDiffs@Base" 0.8.0 - (c++)"vtable for pkgAcqIndexTrans@Base" 0.8.0 (c++)"vtable for pkgAcquireStatus@Base" 0.8.0 (c++)"vtable for PreferenceSection@Base" 0.8.0 (c++)"vtable for pkgPackageManager@Base" 0.8.0 - (c++)"vtable for debSrcRecordParser@Base" 0.8.0 (c++)"vtable for debVersioningSystem@Base" 0.8.0 (c++)"vtable for pkgUdevCdromDevices@Base" 0.8.0 (c++)"vtable for pkgVersioningSystem@Base" 0.8.0 - (c++)"vtable for debTranslationsIndex@Base" 0.8.0 (c++)"vtable for MMap@Base" 0.8.0 (c++)"vtable for FileFd@Base" 0.8.0 (c++)"vtable for Vendor@Base" 0.8.0 @@ -1070,7 +781,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"vtable for Configuration::MatchAgainstConfig@Base" 0.8.0 (c++)"vtable for pkgSourceList::Type@Base" 0.8.0 (c++)"vtable for pkgSrcRecords::Parser@Base" 0.8.0 - (c++)"vtable for pkgCacheGenerator::ListParser@Base" 0.8.0 (c++)"vtable for APT::CacheSetHelper@Base" 0.8.0 (c++)"vtable for pkgCache::DepIterator@Base" 0.8.0 (c++)"vtable for pkgCache::GrpIterator@Base" 0.8.0 @@ -1093,14 +803,20 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"non-virtual thunk to pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0 (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, pkgCache::DepIterator)@Base" 0.8.0 (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, pkgCache::PkgIterator)@Base" 0.8.0 - _apt_DebSrcType@Base 0.8.0 - _apt_DebType@Base 0.8.0 _config@Base 0.8.0 _system@Base 0.8.0 debSys@Base 0.8.0 debVS@Base 0.8.0 pkgLibVersion@Base 0.8.0 pkgVersion@Base 0.8.0 + (c++)"pkgAcquireStatus::~pkgAcquireStatus()@Base" 0.8.0 + (c++)"IndexCopy::~IndexCopy()@Base" 0.8.0 + (c++)"pkgIndexFile::Type::~Type()@Base" 0.8.0 + (c++)"pkgAcqBaseIndex::~pkgAcqBaseIndex()@Base" 0.8.0 + (c++)"pkgArchiveCleaner::~pkgArchiveCleaner()@Base" 0.8.0 + (c++)"typeinfo for pkgArchiveCleaner@Base" 0.8.0 + (c++)"typeinfo name for pkgArchiveCleaner@Base" 0.8.0 + (c++)"vtable for pkgArchiveCleaner@Base" 0.8.0 ### architecture specific: va_list (arch=armel armhf|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, std::__va_list&) const@Base" 0.8.15~exp1 (arch=i386 hurd-i386 kfreebsd-i386 ppc64|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, char*&) const@Base" 0.8.15~exp1 @@ -1140,7 +856,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (arch=!x32|c++)"RFC1123StrToTime(char const*, long&)@Base" 0.8.0 (arch=x32|c++)"RFC1123StrToTime(char const*, long long&)@Base" 0.8.0 ### - (c++)"Configuration::MatchAgainstConfig::clearPatterns()@Base" 0.8.1 (c++)"CreateAPTDirectoryIfNeeded(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.2 (c++)"FileFd::FileSize()@Base" 0.8.8 (c++)"Base256ToNum(char const*, unsigned long&, unsigned int)@Base" 0.8.11 @@ -1148,74 +863,22 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgDepCache::SetCandidateRelease(pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11 (c++)"RealFileExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.11 (c++)"StripEpoch(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11 - (c++)"pkgAcqIndex::Init(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11 - (c++)"pkgAcqIndex::pkgAcqIndex(pkgAcquire*, IndexTarget const*, HashString const&, indexRecords const*)@Base" 0.8.11 (c++)"pkgTagSection::FindFlag(unsigned long&, unsigned long, char const*, char const*)@Base" 0.8.11 - (c++)"pkgAcqSubIndex::ParseIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11 - (c++)"pkgAcqSubIndex::Custom600Headers()@Base" 0.8.11 - (c++)"pkgAcqSubIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.11 - (c++)"pkgAcqSubIndex::DescURI()@Base" 0.8.11 - (c++)"pkgAcqSubIndex::pkgAcqSubIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, HashString const&)@Base" 0.8.11 - (c++)"pkgAcqSubIndex::~pkgAcqSubIndex()@Base" 0.8.11 - (c++)"pkgAcqMetaClearSig::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.11 - (c++)"pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.11 - (c++)"pkgAcqMetaClearSig::~pkgAcqMetaClearSig()@Base" 0.8.11 - (c++)"pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire*, IndexTarget const*, HashString const&, indexRecords const*)@Base" 0.8.11 - (c++)"IndexTarget::IsOptional() const@Base" 0.8.11 - (c++)"IndexTarget::IsSubIndex() const@Base" 0.8.11 - (c++)"debReleaseIndex::TranslationIndexURI(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.11 - (c++)"debReleaseIndex::TranslationIndexURISuffix(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.11 - (c++)"typeinfo for pkgAcqSubIndex@Base" 0.8.11 - (c++)"typeinfo for pkgAcqMetaClearSig@Base" 0.8.11 - (c++)"typeinfo name for pkgAcqSubIndex@Base" 0.8.11 - (c++)"typeinfo name for pkgAcqMetaClearSig@Base" 0.8.11 - (c++)"vtable for pkgAcqSubIndex@Base" 0.8.11 - (c++)"vtable for pkgAcqMetaClearSig@Base" 0.8.11 (c++)"FindMountPointForDevice(char const*)@Base" 0.8.12 (c++)"pkgUdevCdromDevices::ScanForRemovable(bool)@Base" 0.8.12 (c++)"APT::Configuration::Compressor::Compressor(char const*, char const*, char const*, char const*, char const*, unsigned short)@Base" 0.8.12 (c++)"APT::Configuration::Compressor::~Compressor()@Base" 0.8.12 (c++)"APT::Configuration::getCompressors(bool)@Base" 0.8.12 (c++)"APT::Configuration::getCompressorExtensions()@Base" 0.8.12 - (c++)"APT::Configuration::setDefaultConfigurationForCompressors()@Base" 0.8.12 - (c++)"pkgAcqMetaClearSig::Custom600Headers()@Base" 0.8.13 - (c++)"debListParser::NewProvidesAllArch(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.13.2 - (c++)"pkgDepCache::IsModeChangeOk(pkgDepCache::ModeList, pkgCache::PkgIterator const&, unsigned long, bool)@Base" 0.8.13.2 (c++)"pkgCache::DepIterator::IsNegative() const@Base" 0.8.15~exp1 (c++)"Configuration::CndSet(char const*, int)@Base" 0.8.15.3 (c++)"pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator)@Base" 0.8.15.3 (c++)"DeEscapeString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.15.4 (c++)"GetModificationTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.15.6 (c++)"pkgSourceList::GetLastModifiedTime()@Base" 0.8.15.6 - (c++)"pkgCacheGenerator::NewDepends(pkgCache::PkgIterator&, pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, unsigned int const&, unsigned int*&)@Base" 0.8.15.6 (c++)"pkgCacheFile::RemoveCaches()@Base" 0.8.15.7 (c++)"pkgOrderList::VisitNode(pkgCache::PkgIterator, char const*)@Base" 0.8.15.7 ### external dependency resolver ### - (c++)"edspIFType::~edspIFType()@Base" 0.8.16~exp2 - (c++)"edspSystem::Initialize(Configuration&)@Base" 0.8.16~exp2 - (c++)"edspSystem::AddStatusFiles(std::vector<pkgIndexFile*, std::allocator<pkgIndexFile*> >&)@Base" 0.8.16~exp2 - (c++)"edspSystem::ArchiveSupported(char const*)@Base" 0.8.16~exp2 - (c++)"edspSystem::Lock()@Base" 0.8.16~exp2 - (c++)"edspSystem::Score(Configuration const&)@Base" 0.8.16~exp2 - (c++)"edspSystem::UnLock(bool)@Base" 0.8.16~exp2 - (c++)"edspSystem::edspSystem()@Base" 0.8.16~exp2 - (c++)"edspSystem::~edspSystem()@Base" 0.8.16~exp2 - (c++)"edspListParser::NewVersion(pkgCache::VerIterator&)@Base" 0.8.16~exp2 - (c++)"edspListParser::Description()@Base" 0.8.16~exp2 - (c++)"edspListParser::ParseStatus(pkgCache::PkgIterator&, pkgCache::VerIterator&)@Base" 0.8.16~exp2 - (c++)"edspListParser::VersionHash()@Base" 0.8.16~exp2 - (c++)"edspListParser::Description_md5()@Base" 0.8.16~exp2 - (c++)"edspListParser::LoadReleaseInfo(pkgCache::PkgFileIterator&, FileFd&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp2 - (c++)"edspListParser::DescriptionLanguage()@Base" 0.8.16~exp2 - (c++)"edspListParser::edspListParser(FileFd*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp2 - (c++)"edspListParser::~edspListParser()@Base" 0.8.16~exp2 - (c++)"edspIndex::edspIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp2 - (c++)"edspIndex::~edspIndex()@Base" 0.8.16~exp2 - (c++)"edspIFType::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.16~exp2 - (c++)"edspSystem::CreatePM(pkgDepCache*) const@Base" 0.8.16~exp2 - (c++)"edspSystem::FindIndex(pkgCache::PkgFileIterator, pkgIndexFile*&) const@Base" 0.8.16~exp2 - (c++)"edspIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.16~exp2 - (c++)"edspIndex::GetType() const@Base" 0.8.16~exp2 (c++)"EDSP::WriteError(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, _IO_FILE*)@Base" 0.8.16~exp2 (c++)"EDSP::ReadRequest(int, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, bool&, bool&, bool&)@Base" 0.8.16~exp2 (c++)"EDSP::ApplyRequest(std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, pkgDepCache&)@Base" 0.8.16~exp2 @@ -1230,19 +893,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"EDSP::PrioMap@Base" 0.8.16~exp2 (c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgIterator const&)@Base" 0.8.16~exp6 (c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgFileIterator const&)@Base" 0.8.16~exp6 - (c++)"typeinfo for edspIFType@Base" 0.8.16~exp2 - (c++)"typeinfo for edspSystem@Base" 0.8.16~exp2 - (c++)"typeinfo for edspListParser@Base" 0.8.16~exp2 - (c++)"typeinfo for edspIndex@Base" 0.8.16~exp2 - (c++)"typeinfo name for edspIFType@Base" 0.8.16~exp2 - (c++)"typeinfo name for edspSystem@Base" 0.8.16~exp2 - (c++)"typeinfo name for edspListParser@Base" 0.8.16~exp2 - (c++)"typeinfo name for edspIndex@Base" 0.8.16~exp2 - (c++)"vtable for edspIFType@Base" 0.8.16~exp2 - (c++)"vtable for edspSystem@Base" 0.8.16~exp2 - (c++)"vtable for edspListParser@Base" 0.8.16~exp2 - (c++)"vtable for edspIndex@Base" 0.8.16~exp2 - edspSys@Base 0.8.16~exp2 ### generalisation of checksums (with lfs) -- mostly api-compatible available (without sha512 in previous versions) (c++)"AddCRC16(unsigned short, void const*, unsigned long long)@Base" 0.8.16~exp2 (c++)"MD5Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6 @@ -1253,9 +903,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"SHA1Summation::Result()@Base" 0.8.16~exp2 (c++)"SHA256Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6 (c++)"SHA512Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6 - (c++)"debRecordParser::SHA512Hash()@Base" 0.8.16~exp2 - (c++)"pkgRecords::Parser::SHA512Hash()@Base" 0.8.16~exp6 - (c++)"Hashes::AddFD(int, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp6 (c++)"SummationImplementation::AddFD(int, unsigned long long)@Base" 0.8.16~exp6 (c++)"typeinfo for MD5Summation@Base" 0.8.16~exp6 (c++)"typeinfo for SHA1Summation@Base" 0.8.16~exp6 @@ -1281,11 +928,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"OpProgress::OverallProgress(unsigned long long, unsigned long long, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp6 (c++)"OpProgress::Progress(unsigned long long)@Base" 0.8.16~exp6 (c++)"SourceCopy::GetFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6 - (c++)"pkgAcqFile::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 - (c++)"pkgAcqFile::pkgAcqFile(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp6 (c++)"pkgAcquire::UriIterator::~UriIterator()@Base" 0.8.16~exp6 (c++)"pkgAcquire::MethodConfig::~MethodConfig()@Base" 0.8.16~exp6 - (c++)"pkgAcquire::Item::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 (c++)"pkgAcquire::Item::Start(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long)@Base" 0.8.16~exp6 (c++)"pkgRecords::Parser::RecordField(char const*)@Base" 0.8.16~exp6 (c++)"pkgTagFile::Jump(pkgTagSection&, unsigned long long)@Base" 0.8.16~exp6 @@ -1293,50 +937,29 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgTagFile::pkgTagFile(FileFd*, unsigned long long)@Base" 0.8.16~exp6 (c++)"DynamicMMap::RawAllocate(unsigned long long, unsigned long)@Base" 0.8.16~exp6 (c++)"PackageCopy::GetFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6 - (c++)"pkgAcqIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 - (c++)"indexRecords::parseSumData(char const*&, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6 - (c++)"pkgAcqArchive::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 (c++)"pkgTagSection::~pkgTagSection()@Base" 0.8.16~exp6 - (c++)"pkgAcqSubIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 - (c++)"debRecordParser::RecordField(char const*)@Base" 0.8.16~exp6 - (c++)"debReleaseIndex::SetTrusted(bool)@Base" 0.8.16~exp6 - (c++)"debReleaseIndex::debReleaseIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp6 - (c++)"pkgAcqMetaIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 - (c++)"pkgAcqIndexDiffs::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 - (c++)"pkgAcqMetaSig::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 - (c++)"pkgAcqDiffIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6 (c++)"pkgAcquireStatus::Fetched(unsigned long long, unsigned long long)@Base" 0.8.16~exp6 (c++)"PreferenceSection::~PreferenceSection()@Base" 0.8.16~exp6 - (c++)"pkgCacheGenerator::NewDescription(pkgCache::DescIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, HashSumValue<128> const&, unsigned int)@Base" 0.8.16~exp6 - (c++)"pkgProblemResolver::ResolveInternal(bool)@Base" 0.8.16~exp6 - (c++)"pkgProblemResolver::ResolveByKeepInternal()@Base" 0.8.16~exp6 (c++)"FileFd::Read(void*, unsigned long long, unsigned long long*)@Base" 0.8.16~exp6 (c++)"FileFd::Seek(unsigned long long)@Base" 0.8.16~exp6 (c++)"FileFd::Skip(unsigned long long)@Base" 0.8.16~exp6 (c++)"FileFd::Write(void const*, unsigned long long)@Base" 0.8.16~exp6 (c++)"FileFd::Truncate(unsigned long long)@Base" 0.8.16~exp6 (c++)"pkgPolicy::GetPriority(pkgCache::PkgFileIterator const&)@Base" 0.8.16~exp6 - (c++)"OptionalIndexTarget::IsOptional() const@Base" 0.8.16~exp6 (c++)"typeinfo for pkgTagFile@Base" 0.8.16~exp6 - (c++)"typeinfo for IndexTarget@Base" 0.8.16~exp6 (c++)"typeinfo for pkgSrcRecords@Base" 0.8.16~exp6 - (c++)"typeinfo for OptionalIndexTarget@Base" 0.8.16~exp6 (c++)"typeinfo for pkgAcquire::UriIterator@Base" 0.8.16~exp6 (c++)"typeinfo for pkgAcquire::MethodConfig@Base" 0.8.16~exp6 (c++)"typeinfo for pkgAcquire::Queue@Base" 0.8.16~exp6 (c++)"typeinfo for pkgAcquire::Worker@Base" 0.8.16~exp6 (c++)"typeinfo name for pkgTagFile@Base" 0.8.16~exp6 - (c++)"typeinfo name for IndexTarget@Base" 0.8.16~exp6 (c++)"typeinfo name for pkgSrcRecords@Base" 0.8.16~exp6 - (c++)"typeinfo name for OptionalIndexTarget@Base" 0.8.16~exp6 (c++)"typeinfo name for pkgAcquire::UriIterator@Base" 0.8.16~exp6 (c++)"typeinfo name for pkgAcquire::MethodConfig@Base" 0.8.16~exp6 (c++)"typeinfo name for pkgAcquire::Queue@Base" 0.8.16~exp6 (c++)"typeinfo name for pkgAcquire::Worker@Base" 0.8.16~exp6 (c++)"vtable for pkgTagFile@Base" 0.8.16~exp6 - (c++)"vtable for IndexTarget@Base" 0.8.16~exp6 (c++)"vtable for pkgSrcRecords@Base" 0.8.16~exp6 - (c++)"vtable for OptionalIndexTarget@Base" 0.8.16~exp6 (c++)"vtable for pkgAcquire::UriIterator@Base" 0.8.16~exp6 (c++)"vtable for pkgAcquire::MethodConfig@Base" 0.8.16~exp6 (c++)"vtable for pkgAcquire::Queue@Base" 0.8.16~exp6 @@ -1362,14 +985,11 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"FileFd::Open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, APT::Configuration::Compressor const&, unsigned long)@Base" 0.8.16~exp9 (c++)"FileFd::ReadLine(char*, unsigned long long)@Base" 0.8.16~exp9 (c++)"SummationImplementation::AddFD(FileFd&, unsigned long long)@Base" 0.8.16~exp9 - (c++)"Hashes::AddFD(FileFd&, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp9 (c++|optional=deprecated,previous-inline)"FileFd::gzFd()@Base" 0.8.0 ### CacheSet rework: making them real containers breaks bigtime the API (for the CacheSetHelper) (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator::getPkg() const@Base" 0.8.16~exp9 - (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::getConstructor() const@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::empty() const@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator::getPkg() const@Base" 0.8.16~exp9 - (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::getConstructor() const@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::empty() const@Base" 0.8.16~exp9 (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::empty() const@Base" 0.8.16~exp9 (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator::getVer() const@Base" 0.8.16~exp9 @@ -1382,23 +1002,12 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"APT::CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator const&, pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp9 (c++)"APT::CacheSetHelper::canNotFindCandInstVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9 (c++)"APT::CacheSetHelper::canNotFindInstCandVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::setConstructor(APT::PackageContainerInterface::Constructor const&)@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::clear()@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::insert(pkgCache::PkgIterator const&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::setConstructor(APT::PackageContainerInterface::Constructor const&)@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::clear()@Base" 0.8.16~exp9 (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::insert(pkgCache::PkgIterator const&)@Base" 0.8.16~exp9 (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::clear()@Base" 0.8.16~exp9 (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::insert(pkgCache::VerIterator const&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainerInterface::FromString(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainerInterface::FromCommandLine(APT::PackageContainerInterface*, pkgCacheFile&, char const**, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainerInterface::FromModifierCommandLine(unsigned short&, APT::PackageContainerInterface*, pkgCacheFile&, char const*, std::list<APT::PackageContainerInterface::Modifier, std::allocator<APT::PackageContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainerInterface::FromName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainerInterface::FromTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::PackageContainerInterface::FromRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::VersionContainerInterface::FromString(APT::VersionContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&, bool)@Base" 0.8.16~exp9 - (c++)"APT::VersionContainerInterface::FromPackage(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 - (c++)"APT::VersionContainerInterface::FromCommandLine(APT::VersionContainerInterface*, pkgCacheFile&, char const**, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 (c++)"APT::VersionContainerInterface::getCandidateVer(pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 (c++)"APT::VersionContainerInterface::getInstalledVer(pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 (c++)"APT::VersionContainerInterface::FromModifierCommandLine(unsigned short&, APT::VersionContainerInterface*, pkgCacheFile&, char const*, std::list<APT::VersionContainerInterface::Modifier, std::allocator<APT::VersionContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 @@ -1469,10 +1078,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"APT::Progress::PackageManagerText::~PackageManagerText()@Base" 0.9.13~exp1 (c++)"APT::Progress::PackageManagerText::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1 (c++)"APT::String::Strip(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.9.13~exp1 - (c++)"APT::Upgrade::Upgrade(pkgDepCache&, int)@Base" 0.9.13~exp1 (c++)"pkgDPkgPM::BuildPackagesProgressMap()@Base" 0.9.13~exp1 (c++)"pkgDPkgPM::DoDpkgStatusFd(int)@Base" 0.9.13~exp1 - (c++)"pkgDPkgPM::GoNoABIBreak(APT::Progress::PackageManager*)@Base" 0.9.13~exp1 (c++)"pkgDPkgPM::ProcessDpkgStatusLine(char*)@Base" 0.9.13~exp1 (c++)"pkgDPkgPM::StartPtyMagic()@Base" 0.9.13~exp1 (c++)"pkgDPkgPM::StopPtyMagic()@Base" 0.9.13~exp1 @@ -1493,27 +1100,202 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"vtable for APT::Progress::PackageManagerText@Base" 0.9.13~exp1 (c++)"APT::Progress::PackageManagerFancy::instances@Base" 0.9.14.2 (c++)"APT::Progress::PackageManagerFancy::Start(int)@Base" 0.9.14.2 - (c++)"APT::Progress::PackageManagerFancy::staticSIGWINCH(int)@Base" 0.9.14.2 (c++)"APT::Progress::PackageManager::Start(int)@Base" 0.9.14.2 -### client-side merged pdiffs - (c++)"pkgAcqIndexMergeDiffs::DescURI()@Base" 0.9.14.3~exp1 - (c++)"pkgAcqIndexMergeDiffs::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.9.14.3~exp1 - (c++)"pkgAcqIndexMergeDiffs::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.9.14.3~exp1 - (c++)"pkgAcqIndexMergeDiffs::~pkgAcqIndexMergeDiffs()@Base" 0.9.14.3~exp1 - (c++)"pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, HashString const&, DiffInfo const&, std::vector<pkgAcqIndexMergeDiffs*, std::allocator<pkgAcqIndexMergeDiffs*> > const*)@Base" 0.9.14.3~exp1 - (c++)"typeinfo for pkgAcqIndexMergeDiffs@Base" 0.9.14.3~exp1 - (c++)"typeinfo name for pkgAcqIndexMergeDiffs@Base" 0.9.14.3~exp1 - (c++)"vtable for pkgAcqIndexMergeDiffs@Base" 0.9.14.3~exp1 ### deb822 sources.list format (c++)"pkgSourceList::ParseFileDeb822(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.14.3~exp1 (c++)"pkgSourceList::ParseFileOldStyle(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.14.3~exp1 (c++)"pkgSourceList::Type::ParseStanza(std::vector<metaIndex*, std::allocator<metaIndex*> >&, pkgTagSection&, int, FileFd&)@Base" 0.9.14.3~exp1 +### install foo.deb support + (c++)"flAbsPath(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp1 + (c++)"GetTempFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 1.1~exp1 + (c++)"pkgIndexFile::Type::CreateSrcPkgParser(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 1.1~exp1 + (c++)"metaIndex::LocalFileName() const@Base" 1.1~exp1 + (c++)"metaIndex::~metaIndex()@Base" 1.1~exp1 +### CacheFilter functors + (c++)"APT::CacheFilter::ANDMatcher::AND(APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::~ANDMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ANDMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::FalseMatcher::~FalseMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::FalseMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::FalseMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::FalseMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::Matcher::~Matcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::NOTMatcher::NOTMatcher(APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::NOTMatcher::~NOTMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::NOTMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::NOTMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::NOTMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::OR(APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::~ORMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::ORMatcher::ORMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageIsNewInstall::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageIsNewInstall::~PackageIsNewInstall()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageIsNewInstall::PackageIsNewInstall(pkgCacheFile*)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageMatcher::~PackageMatcher()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::~PackageNameMatchesFnmatch()@Base" 1.1~exp4 + (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::PackageNameMatchesFnmatch(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::TrueMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::TrueMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::TrueMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheFilter::TrueMatcher::~TrueMatcher()@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::ANDMatcher@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::FalseMatcher@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::Matcher@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::NOTMatcher@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::ORMatcher@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::PackageArchitectureMatchesSpecification@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::PackageIsNewInstall@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::PackageMatcher@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::PackageNameMatchesFnmatch@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::PackageNameMatchesRegEx@Base" 1.1~exp4 + (c++)"typeinfo for APT::CacheFilter::TrueMatcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::ANDMatcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::FalseMatcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::Matcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::NOTMatcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::ORMatcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::PackageArchitectureMatchesSpecification@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::PackageIsNewInstall@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::PackageMatcher@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::PackageNameMatchesFnmatch@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::PackageNameMatchesRegEx@Base" 1.1~exp4 + (c++)"typeinfo name for APT::CacheFilter::TrueMatcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::ANDMatcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::FalseMatcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::Matcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::NOTMatcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::ORMatcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::PackageArchitectureMatchesSpecification@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::PackageIsNewInstall@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::PackageMatcher@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::PackageNameMatchesFnmatch@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::PackageNameMatchesRegEx@Base" 1.1~exp4 + (c++)"vtable for APT::CacheFilter::TrueMatcher@Base" 1.1~exp4 +### cacheset redesign (API, but not ABI compatible) +# (c++|optional=inline)"APT::PackageContainerInterface::FromCommandLine(APT::PackageContainerInterface*, pkgCacheFile&, char const**, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::PackageContainerInterface::FromModifierCommandLine(unsigned short&, APT::PackageContainerInterface*, pkgCacheFile&, char const*, std::list<APT::PackageContainerInterface::Modifier, std::allocator<APT::PackageContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::PackageContainerInterface::FromName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::PackageContainerInterface::FromTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::PackageContainerInterface::FromRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::VersionContainerInterface::FromString(APT::VersionContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&, bool)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::VersionContainerInterface::FromPackage(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++|optional=inline)"APT::VersionContainerInterface::FromCommandLine(APT::VersionContainerInterface*, pkgCacheFile&, char const**, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++)"APT::PackageContainerInterface::FromString(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9 +# (c++)"APT::PackageContainerInterface::FromGroup(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.7 +# (c++)"APT::PackageContainerInterface::FromFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.11 + (c++)"APT::CacheSetHelper::canNotFindFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::canNotFindPackage(APT::CacheSetHelper::PkgSelector, APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::canNotFindVersion(APT::CacheSetHelper::VerSelector, APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::canNotGetCandInstVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::canNotGetInstCandVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::canNotGetVersion(APT::CacheSetHelper::VerSelector, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFrom(APT::CacheSetHelper::PkgSelector, APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromCommandLine(APT::PackageContainerInterface*, pkgCacheFile&, char const**)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromModifierCommandLine(unsigned short&, APT::PackageContainerInterface*, pkgCacheFile&, char const*, std::list<APT::CacheSetHelper::PkgModifier, std::allocator<APT::CacheSetHelper::PkgModifier> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromPackageName(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromString(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::PackageFromTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::showPackageSelection(pkgCache::PkgIterator const&, APT::CacheSetHelper::PkgSelector, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::CacheSetHelper::showVersionSelection(pkgCache::PkgIterator const&, pkgCache::VerIterator const&, APT::CacheSetHelper::VerSelector, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"APT::VersionContainerInterface::FromCommandLine(APT::VersionContainerInterface*, pkgCacheFile&, char const**, APT::CacheSetHelper::VerSelector, APT::CacheSetHelper&)@Base" 1.1~exp4 + (c++)"APT::VersionContainerInterface::FromPackage(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper::VerSelector, APT::CacheSetHelper&)@Base" 1.1~exp4 + (c++)"APT::VersionContainerInterface::FromString(APT::VersionContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper::VerSelector, APT::CacheSetHelper&, bool)@Base" 1.1~exp4 +### all the hashes are belong to us +# (c++|optional=inline)"Hashes::AddFD(int, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp6 +# (c++|optional=inline)"Hashes::AddFD(FileFd&, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp9 +# (c++|optional=inline)"pkgRecords::Parser::MD5Hash()@Base" 0.8.0 +# (c++|optional=inline)"pkgRecords::Parser::SHA1Hash()@Base" 0.8.0 +# (c++|optional=inline)"pkgRecords::Parser::SHA256Hash()@Base" 0.8.0 +# (c++|optional=inline)"pkgRecords::Parser::SHA512Hash()@Base" 0.8.16~exp6 + (c++)"Hashes::AddFD(FileFd&, unsigned long long, unsigned int)@Base" 1.1~exp1 + (c++)"Hashes::AddFD(int, unsigned long long, unsigned int)@Base" 1.1~exp1 + (c++)"Hashes::Add(unsigned char const*, unsigned long long, unsigned int)@Base" 1.1~exp1 + (c++)"Hashes::GetHashStringList()@Base" 1.1~exp1 + (c++)"Hashes::Hashes()@Base" 1.1~exp1 + (c++)"Hashes::~Hashes()@Base" 1.1~exp1 + (c++)"HashStringList::find(char const*) const@Base" 1.1~exp1 + (c++)"HashStringList::operator==(HashStringList const&) const@Base" 1.1~exp1 + (c++)"HashStringList::operator!=(HashStringList const&) const@Base" 1.1~exp1 + (c++)"HashStringList::push_back(HashString const&)@Base" 1.1~exp1 + (c++)"HashStringList::supported(char const*)@Base" 1.1~exp1 + (c++)"HashStringList::usable() const@Base" 1.1~exp1 + (c++)"HashStringList::VerifyFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 1.1~exp1 + (c++)"HashString::operator==(HashString const&) const@Base" 1.1~exp1 + (c++)"HashString::operator!=(HashString const&) const@Base" 1.1~exp1 + (c++)"indexRecords::GetSupportsAcquireByHash() const@Base" 1.1~exp1 + (c++)"pkgAcqArchive::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, HashStringList const&, pkgAcquire::MethodConfig*)@Base" 1.1~exp1 + (c++)"pkgAcqArchive::IsTrusted() const@Base" 1.1~exp1 + (c++)"pkgAcqFile::Custom600Headers() const@Base" 1.1~exp1 + (c++)"pkgAcqFile::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, HashStringList const&, pkgAcquire::MethodConfig*)@Base" 1.1~exp1 + (c++)"pkgAcqFile::pkgAcqFile(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashStringList const&, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 1.1~exp1 + (c++)"pkgAcqMethod::DropPrivsOrDie()@Base" 1.1~exp1 + (c++)"pkgAcquire::Item::Custom600Headers() const@Base" 1.1~exp1 + (c++)"pkgAcquire::Item::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, HashStringList const&, pkgAcquire::MethodConfig*)@Base" 1.1~exp1 + (c++)"pkgAcquire::Item::IsTrusted() const@Base" 1.1~exp1 + (c++)"pkgRecords::Parser::Hashes() const@Base" 1.1~exp1 + (c++)"pkgRecords::Parser::LongDesc(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp1 + (c++)"pkgRecords::Parser::ShortDesc(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp1 + (c++)"typeinfo for Hashes@Base" 1.1~exp1 + (c++)"typeinfo name for Hashes@Base" 1.1~exp1 + (c++)"vtable for Hashes@Base" 1.1~exp1 + (c++)"typeinfo for pkgAcqBaseIndex@Base" 1.1~exp1 + (c++)"typeinfo name for pkgAcqBaseIndex@Base" 1.1~exp1 + (c++)"vtable for pkgAcqBaseIndex@Base" 1.1~exp1 +### more transactional update + (c++)"pkgAcqBaseIndex::VerifyHashByMetaKey(HashStringList const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::AbortTransaction()@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::Add(pkgAcquire::Item*)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::CheckAuthDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::CheckDownloadDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::CheckStopAuthentication(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::CommitTransaction()@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::GetCustom600Headers(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::QueueForSignatureVerify(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::QueueIndexes(bool)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::TransactionHasError()@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::TransactionStageCopy(pkgAcquire::Item*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::TransactionStageRemoval(pkgAcquire::Item*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::VerifyVendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcquire::GetLock(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcquire::Item::Dequeue()@Base" 1.1~exp4 + (c++)"pkgAcquire::Item::Item(pkgAcquire*, HashStringList const&, pkgAcqMetaBase*)@Base" 1.1~exp4 + (c++)"pkgAcquire::Item::QueueURI(pkgAcquire::ItemDesc&)@Base" 1.1~exp4 + (c++)"pkgAcquire::Item::SetActiveSubprocess(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgAcquire::Setup(pkgAcquireStatus*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4 + (c++)"pkgArchiveCleaner::Erase(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, stat&)@Base" 1.1~exp4 + (c++)"pkgDepCache::MarkAndSweep()@Base" 1.1~exp4 + (c++)"pkgDepCache::MarkAndSweep(pkgDepCache::InRootSetFunc&)@Base" 1.1~exp4 + (c++)"pkgAcqMetaBase::~pkgAcqMetaBase()@Base" 1.1~exp4 + (c++)"typeinfo for pkgAcqMetaBase@Base" 1.1~exp4 + (c++)"typeinfo name for pkgAcqMetaBase@Base" 1.1~exp4 + (c++)"vtable for pkgAcqMetaBase@Base" 1.1~exp4 ### mixed stuff (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp13 (c++)"pkgCache::DepIterator::IsIgnorable(pkgCache::PkgIterator const&) const@Base" 0.8.16~exp10 (c++)"pkgCache::DepIterator::IsIgnorable(pkgCache::PrvIterator const&) const@Base" 0.8.16~exp10 (c++)"FileFd::Write(int, void const*, unsigned long long)@Base" 0.8.16~exp14 - (c++)"pkgTagSection::Exists(char const*)@Base" 0.9.7.9~exp1 (c++)"_strrstrip(char*)@Base" 0.9.7.9~exp2 (c++)"SplitClearSignedFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, FileFd*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, FileFd*)@Base" 0.9.7.9~exp2 (c++)"OpenMaybeClearSignedFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, FileFd&)@Base" 0.9.7.9~exp2 @@ -1523,30 +1305,26 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"AcquireUpdate(pkgAcquire&, int, bool, bool)@Base" 0.9.3 (c++)"pkgCache::DepIterator::IsMultiArchImplicit() const@Base" 0.9.6 (c++)"pkgCache::PrvIterator::IsMultiArchImplicit() const@Base" 0.9.6 - (c++)"APT::PackageContainerInterface::FromGroup(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.7 (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.9.7 (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification()@Base" 0.9.7 (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(pkgCache::PkgIterator const&)@Base" 0.9.7 - (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(pkgCache::VerIterator const&)@Base" 0.9.7 (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(char const* const&)@Base" 0.9.7 (c++)"APT::Configuration::checkLanguage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.9.7.5 (c++)"pkgCdrom::DropTranslation(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.9.7.5 (c++)"pkgCache::DepIterator::IsSatisfied(pkgCache::PrvIterator const&) const@Base" 0.9.8 (c++)"pkgCache::DepIterator::IsSatisfied(pkgCache::VerIterator const&) const@Base" 0.9.8 - (c++)"pkgCacheGenerator::NewDepends(pkgCache::PkgIterator&, pkgCache::VerIterator&, unsigned int, unsigned int const&, unsigned int const&, unsigned int*&)@Base" 0.9.8 - (c++)"pkgCacheGenerator::NewVersion(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned long, unsigned long)@Base" 0.9.8 (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, GlobalError::Item)@Base" 0.9.9 (c++)"pkgDepCache::IsDeleteOkProtectInstallRequests(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.9.9.1 (c++)"pkgDepCache::IsInstallOkMultiArchSameVersionSynced(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.9.9.1 (c++)"pkgDPkgPM::SendPkgsInfo(_IO_FILE*, unsigned int const&)@Base" 0.9.9.1 (c++)"pkgCache::VerIterator::MultiArchType() const@Base" 0.9.9.1 + (c++)"AutoDetectProxy(URI&)@Base" 0.9.10 (c++)"CommandLine::GetCommand(CommandLine::Dispatch const*, unsigned int, char const* const*)@Base" 0.9.11 (c++)"CommandLine::MakeArgs(char, char const*, char const*, unsigned long)@Base" 0.9.11 (c++)"Configuration::Clear()@Base" 0.9.11 (c++)"Glob(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 0.9.11 (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::operator()(pkgCache::GrpIterator const&)@Base" 0.9.11 (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::operator()(pkgCache::PkgIterator const&)@Base" 0.9.11 - (c++)"APT::PackageContainerInterface::FromFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.11 (c++)"pkgTagSection::pkgTagSection()@Base" 0.9.11 (c++)"strv_length(char const**)@Base" 0.9.11 (c++)"StringSplit(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)@Base" 0.9.11.3 @@ -1564,7 +1342,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&)@Base" 0.9.16 (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&)@Base" 0.9.16 (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&, bool const&)@Base" 0.9.16 - (c++)"pkgCacheGenerator::ListParser::SameVersion(unsigned short, pkgCache::VerIterator const&)@Base" 0.9.16 (c++)"Rename(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.16 (c++)"pkgDepCache::IsInstallOkDependenciesSatisfiableByCandidates(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 1.0 (c++)"APT::Progress::PackageManagerFancy::GetTerminalSize()@Base" 1.0 @@ -1573,12 +1350,14 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"pkgCdromStatus::SetTotal(int)@Base" 1.0 (c++)"EDSP::ExecuteSolver(char const*, int*, int*, bool)@Base" 1.0.4 (c++)"pkgPackageManager::EarlyRemove(pkgCache::PkgIterator, pkgCache::DepIterator const*)@Base" 1.0.4 + (c++)"pkgSrcRecords::Step()@Base" 1.0.4 (c++)"debTranslationsParser::Architecture()@Base" 1.0.4 (c++)"debTranslationsParser::~debTranslationsParser()@Base" 1.0.4 (c++)"debTranslationsParser::Version()@Base" 1.0.4 (c++)"typeinfo for debTranslationsParser@Base" 1.0.4 (c++)"typeinfo name for debTranslationsParser@Base" 1.0.4 (c++)"vtable for debTranslationsParser@Base" 1.0.4 + (c++)"pkgDPkgPM::SetupSlavePtyMagic()@Base" 1.0.8 (c++)"HashStringList::find(char const*) const@Base" 1.0.9.4 (c++)"HashStringList::operator==(HashStringList const&) const@Base" 1.0.9.4 (c++)"HashStringList::operator!=(HashStringList const&) const@Base" 1.0.9.4 @@ -1589,6 +1368,35 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# (c++)"HashString::operator!=(HashString const&) const@Base" 1.0.9.4 (c++)"pkgSrcRecords::Parser::Files2(std::vector<pkgSrcRecords::File2, std::allocator<pkgSrcRecords::File2> >&)@Base" 1.0.9.4 (c++)"debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2, std::allocator<pkgSrcRecords::File2> >&)@Base" 1.0.9.4 + (c++)"APT::Progress::PackageManager::PackageManager()@Base" 1.1~exp1 + (c++)"pkgDPkgPM::Go(APT::Progress::PackageManager*)@Base" 1.1~exp1 + (c++)"pkgPackageManager::DoInstall(APT::Progress::PackageManager*)@Base" 1.1~exp1 + (c++)"pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager*)@Base" 1.1~exp1 + (c++)"pkgPackageManager::Go(APT::Progress::PackageManager*)@Base" 1.1~exp1 + (c++)"pkgTagFile::Init(FileFd*, unsigned long long)@Base" 1.1~exp1 + (c++)"pkgTagSection::Count() const@Base" 1.1~exp1 + (c++)"pkgTagSection::Exists(char const*) const@Base" 1.1~exp1 + (c++)"pkgTagSection::FindB(char const*, bool const&) const@Base" 1.1~exp1 + (c++)"pkgTagSection::Scan(char const*, unsigned long, bool)@Base" 1.1~exp1 + (c++)"StartsWithGPGClearTextSignature(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp1 + (c++)"Popen(char const**, FileFd&, int&, FileFd::OpenMode)@Base" 1.1~exp1 + (c++)"APT::String::Startswith(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp2 + (c++)"APT::Upgrade::Upgrade(pkgDepCache&, int, OpProgress*)@Base" 1.1~exp4 + (c++)"pkgProblemResolver::Resolve(bool, OpProgress*)@Base" 1.1~exp4 + (c++)"pkgProblemResolver::ResolveByKeep(OpProgress*)@Base" 1.1~exp4 + (c++)"pkgCache::PkgIterator::Section() const@Base" 1.1~exp4 + (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator::getPkg() const@Base" 1.1~exp4 + (c++)"typeinfo for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator@Base" 1.1~exp4 + (c++)"typeinfo name for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator@Base" 1.1~exp4 + (c++)"vtable for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator@Base" 1.1~exp4 + (c++)"DropPrivileges()@Base" 1.1~exp4 + (c++)"FileFd::FileFd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned long)@Base" 1.1~exp4 + (c++)"indexRecords::indexRecords(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp5 + (c++)"indexRecords::IsAlwaysTrusted() const@Base" 1.1~exp5 + (c++)"indexRecords::IsNeverTrusted() const@Base" 1.1~exp5 + (c++)"indexRecords::SetTrusted(bool)@Base" 1.1~exp5 + (c++)"metaIndex::metaIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 1.1~exp9 + (c++)"pkgTagSection::Get(char const*&, char const*&, unsigned int) const@Base" 1.1~exp9 ### demangle strangeness - buildd report it as MISSING and as new… (c++)"pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.0 ### gcc-4.6 artefacts @@ -1596,8 +1404,6 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# # (c++|optional=implicit)"HashString::HashString(HashString const&)@Base" 0.8.0 # (c++|optional=inline)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator std::max_element<APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, CompareProviders>(APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, CompareProviders)@Base" 0.8.0 # (c++|optional=inline)"pkgCache::VerIterator::ParentPkg() const@Base" 0.8.0 -### gcc-4.8 artefacts -# (c++|optional=implicit)"debSLTypeDebian::~debSLTypeDebian()@Base" 0.8.0 ### empty destructors included in the .h file # (c++|optional=inline)"pkgVersioningSystem::~pkgVersioningSystem()@Base" 0.8.0 # (c++|optional=inline)"pkgSystem::~pkgSystem()@Base" 0.8.0 @@ -1606,12 +1412,8 @@ libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER# # (c++|optional=inline)"pkgIndexFile::Type::~Type()@Base" 0.8.0 # (c++|optional=inline)"pkgSourceList::Type::~Type()@Base" 0.8.0 # (c++|optional=inline)"pkgIndexFile::~pkgIndexFile()@Base" 0.8.0 -# (c++|optional=inline)"pkgCacheGenerator::ListParser::~ListParser()@Base" 0.8.0 -# (c++|optional=inline)"pkgAcquireStatus::~pkgAcquireStatus()@Base" 0.8.0 # (c++|optional=inline)"metaIndex::~metaIndex()@Base" 0.8.0 -# (c++|optional=inline)"IndexCopy::~IndexCopy()@Base" 0.8.0 ### std library artefacts - (c++|regex|optional=std)"^std::vector<DiffInfo, .+@Base$" 0.8.0 (c++|regex|optional=std)"^std::vector<.+ >::(vector|push_back|erase|_[^ ]+)\(.+\)( const|)@Base$" 0.8.0 (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0 (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0 diff --git a/debian/postinst b/debian/postinst deleted file mode 100755 index 1588f5241..000000000 --- a/debian/postinst +++ /dev/null @@ -1,39 +0,0 @@ -#! /bin/sh - -# apt postinst, based liberally on James Troup's gpm postinst -# Copyright (C) 1998, Ben Gertzfield <che@debian.org> - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -set -e - -create_apt_conf () -{ - EXAMPLE_SOURCE=/usr/share/doc/apt/examples/sources.list - if [ -f $EXAMPLE_SOURCE ]; then - cp $EXAMPLE_SOURCE /etc/apt/sources.list - fi -} - -check_apt_conf () -{ - true - # this is for future expansion -} - -#DEBHELPER# - -case "$1" in - configure) - # - # If there is no /etc/apt/sources.list then create a default - # - if [ ! -f /etc/apt/sources.list ]; then - create_apt_conf - else - check_apt_conf - fi -esac diff --git a/debian/tests/control b/debian/tests/control index f7e47c5f3..0e774d4ca 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -1,3 +1,3 @@ Tests: run-tests -Restrictions: allow-stderr -Depends: @, @builddeps@, fakeroot, wget, stunnel4, db-util +Restrictions: allow-stderr +Depends: @, @builddeps@, fakeroot, wget, stunnel4, db-util, gnupg, gnupg2 diff --git a/debian/tests/run-tests b/debian/tests/run-tests index 9d7c484fc..7cc37f618 100644 --- a/debian/tests/run-tests +++ b/debian/tests/run-tests @@ -15,6 +15,7 @@ APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR=$(pwd)/build/bin \ APT_INTEGRATION_TESTS_METHODS_DIR=/usr/lib/apt/methods \ APT_INTEGRATION_TESTS_LIBEXEC_DIR=/usr/lib/apt/ \ APT_INTEGRATION_TESTS_INTERNAL_SOLVER=/usr/lib/apt/solvers/apt \ +APT_INTEGRATION_TESTS_DUMP_SOLVER=/usr/lib/apt/solvers/dump \ APT_INTEGRATION_TESTS_BUILD_DIR=/usr/bin \ APT_INTEGRATION_TESTS_LIBRARY_PATH=/dev/null/does/not/exist \ ./test/integration/run-tests diff --git a/doc/apt-get.8.xml b/doc/apt-get.8.xml index 80b3be639..a372a0d30 100644 --- a/doc/apt-get.8.xml +++ b/doc/apt-get.8.xml @@ -525,6 +525,14 @@ Configuration Item: <literal>APT::Get::AllowUnauthenticated</literal>.</para></listitem> </varlistentry> + <varlistentry><term><option>--no-allow-insecure-repositories</option></term> + <listitem><para>Forbid the update command to acquire unverifiable + data from configured sources. Apt will fail at the update command + for repositories without valid cryptographically signatures. + + Configuration Item: <literal>Acquire::AllowInsecureRepositories</literal>.</para></listitem> + </varlistentry> + <varlistentry><term><option>--show-progress</option></term> <listitem><para>Show user friendly progress information in the terminal window when packages are installed, upgraded or diff --git a/doc/apt-verbatim.ent b/doc/apt-verbatim.ent index e88d39332..dbec85790 100644 --- a/doc/apt-verbatim.ent +++ b/doc/apt-verbatim.ent @@ -225,7 +225,7 @@ "> <!-- this will be updated by 'prepare-release' --> -<!ENTITY apt-product-version "1.0.9.6"> +<!ENTITY apt-product-version "1.0.9.7"> <!-- (Code)names for various things used all over the place --> <!ENTITY oldstable-codename "wheezy"> diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml index df6c77ff0..efe986ea8 100644 --- a/doc/apt.conf.5.xml +++ b/doc/apt.conf.5.xml @@ -384,9 +384,9 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";}; <para>The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e.g. on high-latency connections. It specifies how many requests are sent in a pipeline. - Previous APT versions had a default of 10 for this setting, but the default value - is now 0 (= disabled) to avoid problems with the ever-growing amount of webservers - and proxies which choose to not conform to the HTTP/1.1 specification.</para> + APT tries to detect and workaround misbehaving webservers and proxies at runtime, but + if you know that yours does not conform to the HTTP/1.1 specification pipelining can + be disabled by setting the value to 0. It is enabled by default with the value 10.</para> <para><literal>Acquire::http::AllowRedirect</literal> controls whether APT will follow redirects, which is enabled by default.</para> @@ -586,6 +586,38 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";}; </para></listitem> </varlistentry> + <varlistentry><term><option>MaxReleaseFileSize</option></term> + <listitem><para> + The maximum file size of Release/Release.gpg/InRelease files. + The default is 10MB. + </para></listitem> + </varlistentry> + + <varlistentry><term><option>AllowInsecureRepositories</option></term> + <listitem><para> + Allow the update operation to load data files from + a repository without a trusted signature. If enabled this + option no data files will be loaded and the update + operation fails with a error for this source. The default + is false for backward compatibility. This will be changed + in the future. + </para></listitem> + </varlistentry> + + <varlistentry><term><option>AllowDowngradeToInsecureRepositories</option></term> + <listitem><para> + Allow that a repository that was previously gpg signed to become + unsigned durign a update operation. When there is no valid signature + of a perviously trusted repository apt will refuse the update. This + option can be used to override this protection. You almost certainly + never want to enable this. The default is false. + + Note that apt will still consider packages from this source + untrusted and warn about them if you try to install + them. + </para></listitem> + </varlistentry> + </variablelist> </refsect1> diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 56e7e1a80..ef1ae056d 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -34,7 +34,7 @@ APT { Host-Architecture "armel"; Arch-Only "false"; - AllowUnauthenticated "false"; + AllowUnauthenticated "false"; // packages from unauthenticated AutomaticRemove "false"; HideAutoRemove "false"; Download-Only "false"; diff --git a/doc/po/apt-doc.pot b/doc/po/apt-doc.pot index c403ad8e4..e3d3afa3c 100644 --- a/doc/po/apt-doc.pot +++ b/doc/po/apt-doc.pot @@ -665,7 +665,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 apt-ftparchive.1.xml:603 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 apt-ftparchive.1.xml:603 msgid "See Also" msgstr "" @@ -677,7 +677,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" msgstr "" @@ -1277,6 +1277,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: " +"<literal>Acquire::AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1285,12 +1294,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 msgid "" "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, " "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the " @@ -1298,7 +1307,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -2884,10 +2893,10 @@ msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial " "e.g. on high-latency connections. It specifies how many requests are sent in " -"a pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the " -"ever-growing amount of webservers and proxies which choose to not conform to " -"the HTTP/1.1 specification." +"a pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to " +"0. It is enabled by default with the value 10." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -3191,13 +3200,40 @@ msgstr "" msgid "When downloading, force to use only the IPv6 protocol." msgstr "" +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable " +"this. The default is false. Note that apt will still consider packages from " +"this source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -3209,7 +3245,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 msgid "" "<literal>Dir::Cache</literal> contains locations pertaining to local cache " "information, such as the two package caches <literal>srcpkgcache</literal> " @@ -3223,7 +3259,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -3233,7 +3269,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -3241,7 +3277,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by " "<literal>Dir::Bin</literal>. <literal>Dir::Bin::Methods</literal> specifies " @@ -3253,7 +3289,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -3266,7 +3302,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -3277,12 +3313,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -3290,7 +3326,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, " @@ -3304,40 +3340,40 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -3345,7 +3381,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -3354,7 +3390,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -3365,7 +3401,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -3374,7 +3410,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -3385,7 +3421,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</literal> " @@ -3396,26 +3432,26 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." msgstr "" #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -3430,7 +3466,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -3440,7 +3476,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -3454,7 +3490,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -3467,7 +3503,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is " @@ -3485,7 +3521,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure " "--pending</command> to let &dpkg; handle all required configurations and " @@ -3497,7 +3533,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -3508,7 +3544,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -3520,7 +3556,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -3534,12 +3570,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -3548,12 +3584,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -3564,7 +3600,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, " @@ -3572,7 +3608,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s " @@ -3580,7 +3616,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -3590,65 +3626,65 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the " "<literal>apt</literal> libraries." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -3656,52 +3692,52 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "Log all interactions with the sub-processes that actually perform downloads." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial " @@ -3711,7 +3747,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as " "keep/install/remove while the ProblemResolver does his work. Each addition " @@ -3729,45 +3765,45 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -3775,14 +3811,14 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from " "<filename>/etc/apt/vendors.list</filename>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes " "e.g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -3790,12 +3826,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 apt-ftparchive.1.xml:592 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 apt-ftparchive.1.xml:592 msgid "Examples" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -3803,7 +3839,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "" diff --git a/doc/po/de.po b/doc/po/de.po index b376bc9b7..4eb458d17 100644 --- a/doc/po/de.po +++ b/doc/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: apt-doc 1.0.8\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-28 00:20+0000\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2014-09-14 14:46+0200\n" "Last-Translator: Chris Leick <c.leick@vollbio.de>\n" "Language-Team: German <debian-l10n-german@lists.debian.org>\n" @@ -845,9 +845,9 @@ msgstr "" "new-pkgs</literal> aktiviert." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 msgid "See Also" @@ -863,7 +863,7 @@ msgstr "" "Benutzeranleitung in &guidesdir;, &apt-preferences;, das APT-Howto." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1773,10 +1773,19 @@ msgstr "" "fragen. Dies ist für Werkzeuge wie pbuilder nützlich. Konfigurationselement: " "<literal>APT::Get::AllowUnauthenticated</literal>." -# FIXME s/Item/Items/ #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +# FIXME s/Item/Items/ +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1791,13 +1800,13 @@ msgstr "" "Progress-Fancy</literal>." #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "Dateien" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 msgid "" "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, " "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the " @@ -1808,7 +1817,7 @@ msgstr "" "das APT-Howto." #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -4084,14 +4093,23 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.conf.5.xml:384 +#, fuzzy +#| msgid "" +#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used " +#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be " +#| "beneficial e.g. on high-latency connections. It specifies how many " +#| "requests are sent in a pipeline. Previous APT versions had a default of " +#| "10 for this setting, but the default value is now 0 (= disabled) to avoid " +#| "problems with the ever-growing amount of webservers and proxies which " +#| "choose to not conform to the HTTP/1.1 specification." msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" "Die Einstellung <literal>Acquire::http::Pipeline-Depth</literal> kann " "verwandt werden, um HTTP-Weiterleitung zu aktivieren (RFC 2616 Abschnitt " @@ -4558,13 +4576,40 @@ msgstr "Beim Herunterladen wird die Verwendung des IPv4-Protokolls erzwungen." msgid "When downloading, force to use only the IPv6 protocol." msgstr "Beim Herunterladen wird die Verwendung des IPv6-Protokolls erzwungen." +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "Verzeichnisse" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -4584,7 +4629,7 @@ msgstr "" "nicht mit <filename>/</filename> oder <filename>./</filename> beginnen." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 msgid "" "<literal>Dir::Cache</literal> contains locations pertaining to local cache " "information, such as the two package caches <literal>srcpkgcache</literal> " @@ -4601,15 +4646,15 @@ msgstr "" "Paketzwischenspeicher <literal>srcpkgcache</literal> und <literal>pkgcache</" "literal>, sowie den Ort, an den heruntergeladene Archive platziert werden, " "<literal>Dir::Cache::archives</literal>. Die Generierung von " -"Zwischenspeichern kann ausgeschaltet werden, indem " -"<literal>pkgcache</literal> oder <literal>srcpkgcache</literal> auf " -"<literal>\"\"</literal> wird. Dies wird den Start verlangsamen, aber " -"Plattenplatz sparen. Es ist vermutlich vorzuziehen, statt des »srcpkgcache«s " -"den »pkgcache« auszuschalten. Wie <literal>Dir::State</literal> ist das " -"Standardverzeichnis in <literal>Dir::Cache</literal> enthalten." +"Zwischenspeichern kann ausgeschaltet werden, indem <literal>pkgcache</" +"literal> oder <literal>srcpkgcache</literal> auf <literal>\"\"</literal> " +"wird. Dies wird den Start verlangsamen, aber Plattenplatz sparen. Es ist " +"vermutlich vorzuziehen, statt des »srcpkgcache«s den »pkgcache« " +"auszuschalten. Wie <literal>Dir::State</literal> ist das Standardverzeichnis " +"in <literal>Dir::Cache</literal> enthalten." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -4624,7 +4669,7 @@ msgstr "" "Konfigurationsdatei erfolgt)." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -4636,7 +4681,7 @@ msgstr "" "geladen." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -4654,7 +4699,7 @@ msgstr "" "Programms an." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -4674,7 +4719,7 @@ msgstr "" "<filename>/tmp/staging/var/lib/dpkg/status</filename> nachgesehen." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -4692,12 +4737,12 @@ msgstr "" "diese Muster verwandt werden." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "APT in DSelect" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -4708,7 +4753,7 @@ msgstr "" "<literal>DSelect</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -4731,7 +4776,7 @@ msgstr "" "vor dem Herunterladen neuer Pakete durch." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." @@ -4740,7 +4785,7 @@ msgstr "" "übermittelt, wenn es für die Installationsphase durchlaufen wird." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." @@ -4749,7 +4794,7 @@ msgstr "" "übermittelt, wenn es für die Aktualisierungsphase durchlaufen wird." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." @@ -4758,12 +4803,12 @@ msgstr "" "nachfragen, um fortzufahren. Vorgabe ist es, nur bei Fehlern nachzufragen." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "Wie APT &dpkg; aufruft" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." @@ -4772,7 +4817,7 @@ msgstr "" "stehen im Abschnitt <literal>DPkg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -4783,7 +4828,7 @@ msgstr "" "jedes Listenelement wird als einzelnes Argument an &dpkg; übermittelt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4797,7 +4842,7 @@ msgstr "" "APT abgebrochen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4816,7 +4861,7 @@ msgstr "" "übergeben." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -4829,7 +4874,7 @@ msgstr "" "Version die Architektur und den <literal>MultiArch</literal>-Schalter hinzu." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -4847,7 +4892,7 @@ msgstr "" "bietet." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -4865,7 +4910,7 @@ msgstr "" "verwendeten Dateideskriptors als eine Bestätigung." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." @@ -4874,7 +4919,7 @@ msgstr "" "die Vorgabe ist <filename>/</filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." @@ -4884,12 +4929,12 @@ msgstr "" "Programme werden erstellt." #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "Dpkd-Trigger-Benutzung (und zugehörige Optionen)" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -4916,7 +4961,7 @@ msgstr "" "Pakete konfiguriert werden." #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -4930,7 +4975,7 @@ msgstr "" "DPkg::TriggersPending \"true\";" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -4955,7 +5000,7 @@ msgstr "" "Optionenkombination wäre <placeholder type=\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -4978,7 +5023,7 @@ msgstr "" "anhängen." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -5008,7 +5053,7 @@ msgstr "" "enden könnte und möglicherweise nicht mehr startbar ist." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -5027,7 +5072,7 @@ msgstr "" "deaktivieren." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -5043,7 +5088,7 @@ msgstr "" "benötigt werden." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -5061,7 +5106,7 @@ msgstr "" "};" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -5085,12 +5130,12 @@ msgstr "" "mit ihren Vorgabewerten. <placeholder type=\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "Periodische- und Archivoptionen" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -5104,12 +5149,12 @@ msgstr "" "Dokumentation dieser Optionen zu erhalten." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "Fehlersuchoptionen" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -5127,7 +5172,7 @@ msgstr "" "könnten es sein:" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -5138,7 +5183,7 @@ msgstr "" "getroffenen Entscheidungen ein." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -5149,7 +5194,7 @@ msgstr "" "<literal>apt-get -s install</literal>) als nicht root-Anwender auszuführen." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -5161,7 +5206,7 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." @@ -5170,12 +5215,12 @@ msgstr "" "Daten in CD-ROM-IDs aus." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "Eine vollständige Liste der Fehlersuchoptionen von APT folgt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" @@ -5183,28 +5228,28 @@ msgstr "" "literal>-Quellen beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" "gibt Informationen aus, die sich auf das Herunterladen von Paketen per FTP " "beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" "gibt Informationen aus, die sich auf das Herunterladen von Paketen per HTTP " "beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" "gibt Informationen aus, die sich auf das Herunterladen von Paketen per HTTPS " "beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." @@ -5213,7 +5258,7 @@ msgstr "" "mittels <literal>gpg</literal> beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." @@ -5222,13 +5267,13 @@ msgstr "" "CD-ROMs gespeichert sind." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" "beschreibt den Prozess der Auflösung von Bauabhängigkeiten in &apt-get;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." @@ -5237,7 +5282,7 @@ msgstr "" "Bibliotheken generiert wurde." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -5248,7 +5293,7 @@ msgstr "" "ID für eine CD-ROM generiert wird." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." @@ -5258,14 +5303,14 @@ msgstr "" "gleichen Zeit laufen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" "protokolliert, wenn Elemente aus der globalen Warteschlange zum " "Herunterladen hinzugefügt oder entfernt werden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." @@ -5274,7 +5319,7 @@ msgstr "" "und kryptografischen Signaturen von heruntergeladenen Dateien beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." @@ -5283,7 +5328,7 @@ msgstr "" "Diffs und Fehler, die die Paketindexlisten-Diffs betreffen, aus." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." @@ -5293,7 +5338,7 @@ msgstr "" "werden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" @@ -5301,7 +5346,7 @@ msgstr "" "durchführen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." @@ -5311,7 +5356,7 @@ msgstr "" "beziehen." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -5327,7 +5372,7 @@ msgstr "" "literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -5360,7 +5405,7 @@ msgstr "" "dem das Paket erscheint." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." @@ -5370,7 +5415,7 @@ msgstr "" "sind, aus." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." @@ -5379,7 +5424,7 @@ msgstr "" "und alle während deren Auswertung gefundenen Fehler aus." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." @@ -5389,7 +5434,7 @@ msgstr "" "soll." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" @@ -5397,12 +5442,12 @@ msgstr "" "von &dpkg; ausgeführt werden." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "gibt die Priorität jeder Paketliste beim Start aus." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." @@ -5412,7 +5457,7 @@ msgstr "" "aufgetreten ist)." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -5424,7 +5469,7 @@ msgstr "" "Marker</literal> beschrieben." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." @@ -5433,7 +5478,7 @@ msgstr "" "filename> gelesenen Anbieter aus." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -5444,13 +5489,13 @@ msgstr "" "literal> oder <literal>APT::Update::{Pre,Post}-Invoke</literal> mit ein." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 msgid "Examples" msgstr "Beispiele" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -5460,7 +5505,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-cache;, &apt-config;, &apt-preferences;." diff --git a/doc/po/es.po b/doc/po/es.po index 24602318d..590ae4aeb 100644 --- a/doc/po/es.po +++ b/doc/po/es.po @@ -38,7 +38,7 @@ msgid "" msgstr "" "Project-Id-Version: apt 0.9.7.1\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-28 00:20+0000\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2014-07-04 01:31+0200\n" "Last-Translator: Omar Campagne <ocampagne@gmail.com>\n" "Language-Team: Debian l10n Spanish <debian-l10n-spanish@lists.debian.org>\n" @@ -909,9 +909,9 @@ msgid "" msgstr "Las líneas <literal>Archive:</literal> o <literal>Suite:</literal>" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 msgid "See Also" @@ -933,7 +933,7 @@ msgstr "" "preferences;, el Cómo de APT." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1880,6 +1880,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1888,13 +1897,13 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "Ficheros" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 #, fuzzy #| msgid "" #| "&apt-cache;, &apt-cdrom;, &dpkg;, &dselect;, &sources-list;, &apt-conf;, " @@ -1910,7 +1919,7 @@ msgstr "" "preferences;, el Cómo de APT." #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -4158,14 +4167,23 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.conf.5.xml:384 +#, fuzzy +#| msgid "" +#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used " +#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be " +#| "beneficial e.g. on high-latency connections. It specifies how many " +#| "requests are sent in a pipeline. Previous APT versions had a default of " +#| "10 for this setting, but the default value is now 0 (= disabled) to avoid " +#| "problems with the ever-growing amount of webservers and proxies which " +#| "choose to not conform to the HTTP/1.1 specification." msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" "La opción <literal>Acquire::http::Pipeline-Depth</literal> se puede utilizar " "para activar HTTP pipelining (RFC 2616 sección 8.1.2.2), que puede " @@ -4621,13 +4639,40 @@ msgstr "" msgid "When downloading, force to use only the IPv6 protocol." msgstr "" +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "Directorios" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -4648,7 +4693,7 @@ msgstr "" "filename> ó <filename>./</filename>." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 #, fuzzy #| msgid "" #| "<literal>Dir::Cache</literal> contains locations pertaining to local " @@ -4682,7 +4727,7 @@ msgstr "" "directorio predeterminado está en <literal>Dir::Cache</literal>" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -4698,7 +4743,7 @@ msgstr "" "<envar>APT_CONFIG</envar>)." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -4709,7 +4754,7 @@ msgstr "" "Al finalizar este proceso carga el fichero de configuración principal." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -4726,7 +4771,7 @@ msgstr "" "literal> especifican la ubicación de sus respectivos programas." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -4747,7 +4792,7 @@ msgstr "" "staging/var/lib/dpkg/status</filename>." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -4765,12 +4810,12 @@ msgstr "" "de expresiones regulares." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "APT con DSelect" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -4781,7 +4826,7 @@ msgstr "" "encuentran en la sección <literal>DSelect</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -4803,7 +4848,7 @@ msgstr "" "realiza esta acción antes de descargar paquetes nuevos." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." @@ -4812,7 +4857,7 @@ msgstr "" "la línea de ordenes al ejecutar la fase de instalación." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." @@ -4821,7 +4866,7 @@ msgstr "" "la línea de ordenes al ejecutar la fase de actualización." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." @@ -4831,12 +4876,12 @@ msgstr "" "preguntará en caso de error." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "Invocación de APT a dpkg" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." @@ -4845,7 +4890,7 @@ msgstr "" "se encuentran en la sección <literal>DPkg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -4856,7 +4901,7 @@ msgstr "" "introduce a &dpkg; como un sólo argumento." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4869,7 +4914,7 @@ msgstr "" "sh</filename>; en caso de fallo, APT cancela la acción." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 #, fuzzy #| msgid "" #| "This is a list of shell commands to run before invoking &dpkg;. Like " @@ -4893,7 +4938,7 @@ msgstr "" "la entrada estándar." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 #, fuzzy #| msgid "" #| "Version 2 of this protocol dumps more information, including the protocol " @@ -4915,7 +4960,7 @@ msgstr "" "literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -4926,7 +4971,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -4937,7 +4982,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." @@ -4946,7 +4991,7 @@ msgstr "" "predeterminado es <filename>/</filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." @@ -4956,12 +5001,12 @@ msgstr "" "paquetes y a producir todos los binarios." #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "Uso del disparador de dpkg (y de las opciones relacionadas)" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -4988,7 +5033,7 @@ msgstr "" "tiempo (o más) durante la configuración de todos los paquetes." #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -5002,7 +5047,7 @@ msgstr "" "DPkg::TriggersPending \"true\";" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -5026,7 +5071,7 @@ msgstr "" "type=\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -5049,7 +5094,7 @@ msgstr "" "eliminación." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -5079,7 +5124,7 @@ msgstr "" "imposibilidad de arrancar el sistema. " #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -5097,7 +5142,7 @@ msgstr "" "desactivar esta opción en todas las ejecuciones menos la última." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -5113,7 +5158,7 @@ msgstr "" "los disparadores necesarios para configurar este paquete." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -5131,7 +5176,7 @@ msgstr "" "};" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -5156,12 +5201,12 @@ msgstr "" "<placeholder type=\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "Las opciones «Periodic» y «Archives»" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -5175,12 +5220,12 @@ msgstr "" "documentación de estas opciones." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "Opciones de depuración" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -5197,7 +5242,7 @@ msgstr "" "para un usuario normal, aunque unas cuantas sí son:" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -5208,7 +5253,7 @@ msgstr "" "purge</literal>." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -5219,7 +5264,7 @@ msgstr "" "<literal>apt-get -s install</literal>) como un usuario normal." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -5231,7 +5276,7 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." @@ -5240,14 +5285,14 @@ msgstr "" "statfs en los identificadores de los discos ópticos." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "" "A continuación, se muestra la lista completa de las opciones de depuración " "de apt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" @@ -5255,26 +5300,26 @@ msgstr "" "<literal>cdrom://</literal>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" "Muestra la información relacionada con la descarga de paquetes mediante FTP." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" "Muestra la información relacionada con la descarga de paquetes mediante HTTP." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" "Muestra la información relacionada con la descarga de paquetes mediante " "HTTPS." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." @@ -5283,7 +5328,7 @@ msgstr "" "criptográficas mediante <literal>gpg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." @@ -5292,14 +5337,14 @@ msgstr "" "paquetes almacenadas en CD-ROM." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" "Describe el proceso de resolución de dependencias de compilación en &apt-" "get;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." @@ -5308,7 +5353,7 @@ msgstr "" "<literal>apt</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -5319,7 +5364,7 @@ msgstr "" "identificador de un CD-ROM." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." @@ -5329,14 +5374,14 @@ msgstr "" "a la vez." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" "Registra los elementos que se añaden o se borran de la cola de descarga " "global." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." @@ -5346,7 +5391,7 @@ msgstr "" "ficheros descargados." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." @@ -5355,7 +5400,7 @@ msgstr "" "lista de índices de paquetes, y los errores relacionados con éstos." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." @@ -5365,7 +5410,7 @@ msgstr "" "índices completos." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" @@ -5373,7 +5418,7 @@ msgstr "" "descargas." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." @@ -5382,7 +5427,7 @@ msgstr "" "de los paquetes y con la eliminación de los paquetes sin usar." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -5398,7 +5443,7 @@ msgstr "" "literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -5429,7 +5474,7 @@ msgstr "" "la sección en la que aparece el paquete." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." @@ -5438,7 +5483,7 @@ msgstr "" "invocó, con los argumentos separados por un espacio." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." @@ -5447,7 +5492,7 @@ msgstr "" "estado y cualquier error encontrado durante el análisis." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." @@ -5456,7 +5501,7 @@ msgstr "" "literal> debería entregar los paquetes a &dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" @@ -5464,12 +5509,12 @@ msgstr "" "&dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "Muestra la prioridad de cada lista de paquetes al iniciarse." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." @@ -5478,7 +5523,7 @@ msgstr "" "lo que ocurre cuando se encuentra un problema de dependencias complejo)." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -5489,7 +5534,7 @@ msgstr "" "misma que la descrita en <literal>Debug::pkgDepCache::Marker</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." @@ -5498,7 +5543,7 @@ msgstr "" "vendors.list</filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -5506,13 +5551,13 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 msgid "Examples" msgstr "Ejemplos" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -5522,7 +5567,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-cache;, &apt-config;, &apt-preferences;." diff --git a/doc/po/it.po b/doc/po/it.po index 76d428272..c8c89408c 100644 --- a/doc/po/it.po +++ b/doc/po/it.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-28 00:20+0000\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2014-07-04 00:45+0200\n" "Last-Translator: Beatrice Torracca <beatricet@libero.it>\n" "Language-Team: Italian <debian-l10n-italian@lists.debian.org>\n" @@ -872,9 +872,9 @@ msgid "" msgstr "la riga <literal>Archive:</literal> o <literal>Suite:</literal>" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 msgid "See Also" @@ -896,7 +896,7 @@ msgstr "" "l'APT Howto." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1802,6 +1802,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 +msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 #, fuzzy #| msgid "" #| "Show user friendly progress information in the terminal window when " @@ -1824,13 +1833,13 @@ msgstr "" "Progress-Fancy</literal>." #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "File" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 msgid "" "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, " "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the " @@ -1841,7 +1850,7 @@ msgstr "" "l'APT Howto." #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -4100,14 +4109,23 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.conf.5.xml:384 +#, fuzzy +#| msgid "" +#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used " +#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be " +#| "beneficial e.g. on high-latency connections. It specifies how many " +#| "requests are sent in a pipeline. Previous APT versions had a default of " +#| "10 for this setting, but the default value is now 0 (= disabled) to avoid " +#| "problems with the ever-growing amount of webservers and proxies which " +#| "choose to not conform to the HTTP/1.1 specification." msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" "L'impostazione <literal>Acquire::http::Pipeline-Depth</literal> può essere " "usata per abilitare le pipeline HTTP (RFC 2616, sezione 8.1.2.2) che possono " @@ -4566,13 +4584,40 @@ msgstr "Durante gli scaricamenti, forza l'uso del solo protocollo IPv4." msgid "When downloading, force to use only the IPv6 protocol." msgstr "Durante gli scaricamenti, forza l'uso del solo protocollo IPv6." +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "Directory" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -4592,7 +4637,7 @@ msgstr "" "<filename>/</filename> o <filename>./</filename>." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 #, fuzzy #| msgid "" #| "<literal>Dir::Cache</literal> contains locations pertaining to local " @@ -4626,7 +4671,7 @@ msgstr "" "la directory predefinita è contenuta in <literal>Dir::Cache</literal>" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -4641,7 +4686,7 @@ msgstr "" "configurazione specificato da <envar>APT_CONFIG</envar>)." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -4652,7 +4697,7 @@ msgstr "" "termine viene caricato il file di configurazione principale." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -4669,7 +4714,7 @@ msgstr "" "specificano la posizione dei rispettivi programmi." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -4690,7 +4735,7 @@ msgstr "" "staging/var/lib/dpkg/status</filename>." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -4708,12 +4753,12 @@ msgstr "" "questi modelli possono usare una sintassi con espressioni regolari." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "APT in DSelect" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -4724,7 +4769,7 @@ msgstr "" "sezione <literal>DSelect</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -4746,7 +4791,7 @@ msgstr "" "scaricare i nuovi pacchetti." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." @@ -4756,7 +4801,7 @@ msgstr "" "installazione." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." @@ -4766,7 +4811,7 @@ msgstr "" "aggiornamento." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." @@ -4776,12 +4821,12 @@ msgstr "" "solo in caso di errore." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "Come APT invoca &dpkg;" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." @@ -4790,7 +4835,7 @@ msgstr "" "&dpkg;; sono nella sezione <literal>DPkg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -4801,7 +4846,7 @@ msgstr "" "passata a &dpkg; come un singolo argomento." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4814,7 +4859,7 @@ msgstr "" "bin/sh</filename>; se qualcuno dei comandi fallisce APT terminerà annullando." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4832,7 +4877,7 @@ msgstr "" "lo standard input." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -4846,7 +4891,7 @@ msgstr "" "versione di cui viene fatto il dump." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -4863,7 +4908,7 @@ msgstr "" "l'informazione nella versione più alta per cui ha il supporto." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -4881,7 +4926,7 @@ msgstr "" "file usato per conferma." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." @@ -4890,7 +4935,7 @@ msgstr "" "valore predefinito è <filename>/</filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." @@ -4900,12 +4945,12 @@ msgstr "" "binari." #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "Uso dei trigger di dpkg (e relative opzioni)" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -4933,7 +4978,7 @@ msgstr "" "pacchetti." #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -4947,7 +4992,7 @@ msgstr "" "DPkg::TriggersPending \"true\";" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -4971,7 +5016,7 @@ msgstr "" "\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -4993,7 +5038,7 @@ msgstr "" "questa opzione anche alle chiamate per lo spacchettamento e la rimozione." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -5023,7 +5068,7 @@ msgstr "" "potrebbe finire in uno stato non configurato e potenzialmente non avviabile." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -5041,7 +5086,7 @@ msgstr "" "si può disattivare questa opzione in tutte le esecuzioni tranne l'ultima." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -5057,7 +5102,7 @@ msgstr "" "necessari per configurare il pacchetto in questione." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -5075,7 +5120,7 @@ msgstr "" "};" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -5100,12 +5145,12 @@ msgstr "" "con i loro valori predefiniti. <placeholder type=\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "Opzioni Periodic e Archives" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -5119,12 +5164,12 @@ msgstr "" "all'inizio dello script." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "Opzioni di debug" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -5142,7 +5187,7 @@ msgstr "" "esserlo:" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -5153,7 +5198,7 @@ msgstr "" "literal>." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -5164,7 +5209,7 @@ msgstr "" "install</literal>) come utente non root." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -5176,7 +5221,7 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." @@ -5185,37 +5230,37 @@ msgstr "" "negli ID dei CD-ROM." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "Segue un elenco completo delle opzioni di debug per apt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" "Stampa informazioni relative all'accesso a fonti <literal>cdrom://</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" "Stampa informazioni relative allo scaricamento dei pacchetti usando FTP." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" "Stampa informazioni relative allo scaricamento dei pacchetti usando HTTP." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" "Stampa informazioni relative allo scaricamento dei pacchetti usando HTTPS." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." @@ -5224,7 +5269,7 @@ msgstr "" "usando <literal>gpg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." @@ -5233,14 +5278,14 @@ msgstr "" "pacchetti memorizzati su CD-ROM." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" "Descrive il processo di risoluzione delle dipendenze di compilazione in &apt-" "get;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." @@ -5249,7 +5294,7 @@ msgstr "" "<literal>apt</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -5260,7 +5305,7 @@ msgstr "" "system del CD-ROM." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." @@ -5270,14 +5315,14 @@ msgstr "" "contemporaneamente." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" "Registra nel log quando vengono aggiunte o rimosse voci dalla coda globale " "degli scaricamenti." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." @@ -5286,7 +5331,7 @@ msgstr "" "codici di controllo e delle firme di cifratura dei file scaricati." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." @@ -5296,7 +5341,7 @@ msgstr "" "diff." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." @@ -5306,7 +5351,7 @@ msgstr "" "invece degli indici completi." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" @@ -5314,7 +5359,7 @@ msgstr "" "realmente gli scaricamenti." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." @@ -5323,7 +5368,7 @@ msgstr "" "installato dei pacchetti e alla rimozione dei pacchetti non utilizzati." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -5339,7 +5384,7 @@ msgstr "" "pkgProblemResolver</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -5371,7 +5416,7 @@ msgstr "" "sezione in cui compare il pacchetto." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." @@ -5380,7 +5425,7 @@ msgstr "" "gli argomenti separati da un singolo carattere di spazio." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." @@ -5389,7 +5434,7 @@ msgstr "" "di stato ed ogni errore incontrato durante la sua analisi." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." @@ -5398,7 +5443,7 @@ msgstr "" "literal> deve passare i pacchetti a &dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" @@ -5406,12 +5451,12 @@ msgstr "" "nell'invocazione di &dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "Produce in output la priorità di ogni elenco di pacchetti all'avvio." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." @@ -5421,7 +5466,7 @@ msgstr "" "dipendenze)." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -5432,7 +5477,7 @@ msgstr "" "la stessa descritta in <literal>Debug::pkgDepCache::Marker</literal>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." @@ -5441,7 +5486,7 @@ msgstr "" "filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -5449,13 +5494,13 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 msgid "Examples" msgstr "Esempi" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -5465,7 +5510,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-cache;, &apt-config;, &apt-preferences;." diff --git a/doc/po/ja.po b/doc/po/ja.po index 0a2984d96..3e0712125 100644 --- a/doc/po/ja.po +++ b/doc/po/ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: apt 1.0.6\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-28 00:20+0000\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2014-07-10 19:52+0900\n" "Last-Translator: KURASAWA Nozomu <nabetaro@debian.or.jp>\n" "Language-Team: Debian Japanese List <debian-japanese@lists.debian.org>\n" @@ -892,9 +892,9 @@ msgstr "" "literal> がデフォルトで有効になっています。" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 msgid "See Also" @@ -910,7 +910,7 @@ msgstr "" "&guidesdir; にあるAPTユーザガイド、 &apt-preferences;、 APT Howto." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1767,6 +1767,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1780,13 +1789,13 @@ msgstr "" "<literal>Dpkg::Progress-Fancy</literal>" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "ファイル" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 msgid "" "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, " "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the " @@ -1797,7 +1806,7 @@ msgstr "" "Howto" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -3948,14 +3957,23 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.conf.5.xml:384 +#, fuzzy +#| msgid "" +#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used " +#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be " +#| "beneficial e.g. on high-latency connections. It specifies how many " +#| "requests are sent in a pipeline. Previous APT versions had a default of " +#| "10 for this setting, but the default value is now 0 (= disabled) to avoid " +#| "problems with the ever-growing amount of webservers and proxies which " +#| "choose to not conform to the HTTP/1.1 specification." msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" "<literal>Acquire::http::Pipeline-Depth</literal> の設定は、例えばレイテンシの" "高い接続で有益な、HTTP パイプライン (RFC 2616 8.1.2.2 節) を有効にするのに使" @@ -4390,13 +4408,40 @@ msgstr "ダウンロード時に IPv4 プロトコルだけを使うように強 msgid "When downloading, force to use only the IPv6 protocol." msgstr "ダウンロード時に IPv6 プロトコルだけを使うように強制します。" +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "ディレクトリ" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -4415,7 +4460,7 @@ msgstr "" "サブアイテムすべてに、前に付加するデフォルトディレクトリを含んでいます。" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 msgid "" "<literal>Dir::Cache</literal> contains locations pertaining to local cache " "information, such as the two package caches <literal>srcpkgcache</literal> " @@ -4439,7 +4484,7 @@ msgstr "" "でいます。" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -4453,7 +4498,7 @@ msgstr "" "ファイルを指定された場合のみ、この設定の効果があります)" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -4464,7 +4509,7 @@ msgstr "" "します。" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -4481,7 +4526,7 @@ msgstr "" "プログラムの場所を指定します。" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -4501,7 +4546,7 @@ msgstr "" "<filename>/tmp/staging/var/lib/dpkg/status</filename> から探します。" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -4517,12 +4562,12 @@ msgstr "" "フォルト値を見ればわかる通り、このパターンには正規表現を使用できます。" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "DSelect での APT" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -4533,7 +4578,7 @@ msgstr "" "ます。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -4554,7 +4599,7 @@ msgstr "" "パッケージをダウンロードする直前に行います。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." @@ -4563,7 +4608,7 @@ msgstr "" "されます。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." @@ -4572,7 +4617,7 @@ msgstr "" "されます。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." @@ -4581,12 +4626,12 @@ msgstr "" "します。デフォルトはエラーが発生した場合のみです。" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "APT が &dpkg; を呼ぶ方法" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." @@ -4595,7 +4640,7 @@ msgstr "" "<literal>DPkg</literal> セクションにあります。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -4605,7 +4650,7 @@ msgstr "" "なければなりません。また、各リストは単一の引数として &dpkg; に渡されます。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4617,7 +4662,7 @@ msgstr "" "bin/sh</filename> を通して呼び出され、何か問題があれば APT が異常終了します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4634,7 +4679,7 @@ msgstr "" "ります。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -4647,7 +4692,7 @@ msgstr "" "<literal>MultiArch</literal> フラグが追加されています。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -4663,7 +4708,7 @@ msgstr "" "ポートしている最大のバージョンの情報を代わりに送ります。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -4680,7 +4725,7 @@ msgstr "" "ルディスクリプタの番号が収録されています。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." @@ -4689,7 +4734,7 @@ msgstr "" "<filename>/</filename> です。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." @@ -4698,12 +4743,12 @@ msgstr "" "ます。デフォルトでは署名を無効にし、全バイナリを生成します。" #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "dpkg トリガの使い方 (および関連オプション)" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -4727,7 +4772,7 @@ msgstr "" "(もしくはそれ以上) の時間 100% のままとなり、進捗レポートを壊してしまいます。" #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -4741,7 +4786,7 @@ msgstr "" "DPkg::TriggersPending \"true\";" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -4764,7 +4809,7 @@ msgstr "" "\"0\"/>" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -4784,7 +4829,7 @@ msgstr "" "在 APT は、このフラグを、展開呼び出しや削除呼び出しにも追加します。" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -4811,7 +4856,7 @@ msgstr "" "能性があるからです。" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -4828,7 +4873,7 @@ msgstr "" "では、最後以外のすべての実行で、無効にできます。" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -4843,7 +4888,7 @@ msgstr "" "ことに注意してください。" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -4861,7 +4906,7 @@ msgstr "" "};" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -4884,12 +4929,12 @@ msgstr "" "\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "Periodic オプションと Archives オプション" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -4902,12 +4947,12 @@ msgstr "" "トは、このスクリプトの先頭を参照してください。" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "デバッグオプション" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -4923,7 +4968,7 @@ msgstr "" "のオプションは興味がないでしょうが、以下のものは興味を引くかもしれません。" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -4934,7 +4979,7 @@ msgstr "" "にします。" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -4945,7 +4990,7 @@ msgstr "" "literal>) を行う場合に使用します。" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -4957,7 +5002,7 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." @@ -4966,34 +5011,34 @@ msgstr "" "ないようにします。" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "以下は apt に対するデバッグオプションのすべてです。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" "<literal>cdrom://</literal> ソースへのアクセスに関する情報を出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "FTP を用いたパッケージのダウンロードに関する情報を出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "HTTP を用いたパッケージのダウンロードに関する情報を出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "HTTPS を用いたパッケージのダウンロードに関する情報を出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." @@ -5001,7 +5046,7 @@ msgstr "" "<literal>gpg</literal> を用いた暗号署名の検証に関する情報を出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." @@ -5010,12 +5055,12 @@ msgstr "" "します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "&apt-get; での構築依存関係解決のプロセスを説明します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." @@ -5023,7 +5068,7 @@ msgstr "" "<literal>apt</literal> ライブラリが生成した、暗号化ハッシュを出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -5033,7 +5078,7 @@ msgstr "" "システムにある使用済・未使用ブロックの数からの情報を含めないようにします。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." @@ -5042,13 +5087,13 @@ msgstr "" "<quote><literal>apt-get update</literal></quote> を実行できるようになります。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" "グローバルダウンロードキューに対する項目の追加・削除の際にログを出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." @@ -5057,7 +5102,7 @@ msgstr "" "ジやエラーを出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." @@ -5066,7 +5111,7 @@ msgstr "" "します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." @@ -5075,14 +5120,14 @@ msgstr "" "リストへのパッチ適用に関する情報を出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" "実際のダウンロードを行う際の、サブプロセスとのやりとりをログに出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." @@ -5091,7 +5136,7 @@ msgstr "" "に出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -5106,7 +5151,7 @@ msgstr "" "路に対応しています。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -5135,7 +5180,7 @@ msgstr "" "ます。<literal>section</literal> はパッケージが現れるセクション名です。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." @@ -5144,7 +5189,7 @@ msgstr "" "切られます。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." @@ -5153,7 +5198,7 @@ msgstr "" "を解析中に発生したエラーを出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." @@ -5162,18 +5207,18 @@ msgstr "" "のトレースを生成します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "&dpkg; を呼び出す際に、実行手順を追跡した状態メッセージを出力します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "起動時の各パッケージの優先度を表示します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." @@ -5182,7 +5227,7 @@ msgstr "" "した場合にのみ、適用されます)。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -5193,7 +5238,7 @@ msgstr "" "説明したものと同じです。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." @@ -5202,7 +5247,7 @@ msgstr "" "します。" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -5213,13 +5258,13 @@ msgstr "" "{Pre,Post}-Invoke</literal> があります。" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 msgid "Examples" msgstr "サンプル" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -5229,7 +5274,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-cache;, &apt-config;, &apt-preferences;." diff --git a/doc/po/pl.po b/doc/po/pl.po index b0a6514b9..481d85af6 100644 --- a/doc/po/pl.po +++ b/doc/po/pl.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: apt 0.9.7.3\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-28 00:20+0000\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2014-07-04 02:13+0200\n" "Last-Translator: Robert Luberda <robert@debian.org>\n" "Language-Team: Polish <manpages-pl-list@lists.sourceforge.net>\n" @@ -868,9 +868,9 @@ msgid "" msgstr "linia <literal>Archive:</literal> lub <literal>Suite:</literal>" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 msgid "See Also" @@ -893,7 +893,7 @@ msgstr "" "&apt-preferences;, APT Howto." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1879,6 +1879,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1887,14 +1896,14 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "Pliki" # #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 #, fuzzy #| msgid "" #| "&apt-cache;, &apt-cdrom;, &dpkg;, &dselect;, &sources-list;, &apt-conf;, " @@ -1911,7 +1920,7 @@ msgstr "" # #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -3996,10 +4005,10 @@ msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -4293,13 +4302,40 @@ msgstr "" msgid "When downloading, force to use only the IPv6 protocol." msgstr "" +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -4311,7 +4347,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 msgid "" "<literal>Dir::Cache</literal> contains locations pertaining to local cache " "information, such as the two package caches <literal>srcpkgcache</literal> " @@ -4325,7 +4361,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -4335,7 +4371,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -4343,7 +4379,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -4354,7 +4390,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -4367,7 +4403,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -4378,12 +4414,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -4391,7 +4427,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -4404,40 +4440,40 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -4445,7 +4481,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4454,7 +4490,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4465,7 +4501,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -4474,7 +4510,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -4485,7 +4521,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -4496,26 +4532,26 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." msgstr "" #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -4530,7 +4566,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -4544,7 +4580,7 @@ msgstr "" "DPkg::TriggersPending \"true\";" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -4558,7 +4594,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -4571,7 +4607,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -4588,7 +4624,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -4599,7 +4635,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -4609,7 +4645,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -4627,7 +4663,7 @@ msgstr "" "};" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -4641,12 +4677,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -4655,13 +4691,13 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 #, fuzzy msgid "Debug options" msgstr "opcje" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -4672,7 +4708,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -4680,7 +4716,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -4688,7 +4724,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -4698,7 +4734,7 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 #, fuzzy msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " @@ -4708,59 +4744,59 @@ msgstr "" "in CDROM IDs." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -4768,53 +4804,53 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -4824,7 +4860,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -4842,46 +4878,46 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -4889,14 +4925,14 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -4904,13 +4940,13 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 msgid "Examples" msgstr "Przykłady" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -4918,7 +4954,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-cache;, &apt-config;, &apt-preferences;." diff --git a/doc/po/pt.po b/doc/po/pt.po index c92a2016d..3aefcc2a9 100644 --- a/doc/po/pt.po +++ b/doc/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: apt 1.0.7\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-29 11:04+0200\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2014-08-29 00:34+0100\n" "Last-Translator: Américo Monteiro <a_monteiro@gmx.com>\n" "Language-Team: Portuguese <traduz@debianpt.org>\n" @@ -889,9 +889,9 @@ msgstr "" "activado por predefinição." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 msgid "See Also" @@ -907,7 +907,7 @@ msgstr "" "utilizadores do The APT em &guidesdir;, &apt-preferences;, o Howto do APT." #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1796,6 +1796,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1809,13 +1818,13 @@ msgstr "" "Progress</literal> e <literal>Dpkg::Progress-Fancy</literal>." #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "Ficheiros" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 msgid "" "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, " "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the " @@ -1826,7 +1835,7 @@ msgstr "" "preferences;, o Howto do APT." #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -4065,14 +4074,23 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt.conf.5.xml:384 +#, fuzzy +#| msgid "" +#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used " +#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be " +#| "beneficial e.g. on high-latency connections. It specifies how many " +#| "requests are sent in a pipeline. Previous APT versions had a default of " +#| "10 for this setting, but the default value is now 0 (= disabled) to avoid " +#| "problems with the ever-growing amount of webservers and proxies which " +#| "choose to not conform to the HTTP/1.1 specification." msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" "A definição <literal>Acquire::http::Pipeline-Depth</literal> pode ser usada " "para activar o 'pipelining' de HTTP (RFC 2616 secção 8.1.2.2) a qual pode " @@ -4527,13 +4545,40 @@ msgstr "Ao descarregar, força o uso exclusivo do protocolo IPv4." msgid "When downloading, force to use only the IPv6 protocol." msgstr "Ao descarregar, força o uso exclusivo do protocolo IPv6." +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "Directórios" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -4552,7 +4597,7 @@ msgstr "" "items que não começam com <filename>/</filename> ou <filename>./</filename>." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 msgid "" "<literal>Dir::Cache</literal> contains locations pertaining to local cache " "information, such as the two package caches <literal>srcpkgcache</literal> " @@ -4575,7 +4620,7 @@ msgstr "" "literal> o directório predefinido é contido em <literal>Dir::Cache</literal>" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -4590,7 +4635,7 @@ msgstr "" "ficheiro de configuração especificado por <envar>APT_CONFIG</envar>)." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -4601,7 +4646,7 @@ msgstr "" "estar feito então é carregado o ficheiro de configuração principal." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -4619,7 +4664,7 @@ msgstr "" "respectivos programas." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -4640,7 +4685,7 @@ msgstr "" "procurado em <filename>/tmp/staging/var/lib/dpkg/status</filename>." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -4658,12 +4703,12 @@ msgstr "" "expressão regular." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "APT em DSelect" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -4674,7 +4719,7 @@ msgstr "" "<literal>DSelect</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -4696,7 +4741,7 @@ msgstr "" "pacotes." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." @@ -4705,7 +4750,7 @@ msgstr "" "comandos quando é corrido para a fase de instalação." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." @@ -4714,7 +4759,7 @@ msgstr "" "comandos quando é executado para a fase de actualização." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." @@ -4723,12 +4768,12 @@ msgstr "" "continuar. A predefinição é avisar apenas em caso de erro." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "Como o APT chama o &dpkg;" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." @@ -4737,7 +4782,7 @@ msgstr "" "&dpkg;. Estas estão na secção <literal>DPkg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -4748,7 +4793,7 @@ msgstr "" "um argumento único ao &dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4761,7 +4806,7 @@ msgstr "" "bin/sh</filename>, caso algum deles falhe, o APT irá abortar." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -4779,7 +4824,7 @@ msgstr "" "predefinição a entrada standard." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -4792,7 +4837,7 @@ msgstr "" "<literal>MultiArch</literal> a cada versão a ser despejada." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -4808,7 +4853,7 @@ msgstr "" "irá então enviar a informação na versão mais alta que suporta." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -4826,7 +4871,7 @@ msgstr "" "descritor de ficheiro usado." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." @@ -4835,7 +4880,7 @@ msgstr "" "predefinição é <filename>/</filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." @@ -4844,12 +4889,12 @@ msgstr "" "predefinição é desactivar a assinatura e produzir todos os binários." #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "Utilização trigger do dpkg (e opções relacionadas)" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -4875,7 +4920,7 @@ msgstr "" "100% enquanto na realidade está a configurar todos os pacotes." #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -4889,7 +4934,7 @@ msgstr "" "DPkg::TriggersPending \"true\";" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -4913,7 +4958,7 @@ msgstr "" "\"0\"/>" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -4935,7 +4980,7 @@ msgstr "" "chamadas unpack e remove." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -4965,7 +5010,7 @@ msgstr "" "arrancar." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -4983,7 +5028,7 @@ msgstr "" "esta opção em todas excepto na última execução." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -4999,7 +5044,7 @@ msgstr "" "configurar este pacote." #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -5017,7 +5062,7 @@ msgstr "" "};" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -5041,12 +5086,12 @@ msgstr "" "predefinidos. <placeholder type=\"literallayout\" id=\"0\"/>" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "Opções Periodic e Archives" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -5059,12 +5104,12 @@ msgstr "" "Veja o cabeçalho deste script para uma breve documentação das suas opções." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "Opções de depuração" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -5081,7 +5126,7 @@ msgstr "" "interesse para o utilizador normal, mas algumas podem ter:" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -5092,7 +5137,7 @@ msgstr "" "remove, purge</literal>." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -5103,7 +5148,7 @@ msgstr "" "<literal>apt-get -s install</literal>) como um utilizador não root." #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -5115,7 +5160,7 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." @@ -5124,12 +5169,12 @@ msgstr "" "IDs de CD-ROM." #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "Segue-se uma lista completa de opções de depuração para o apt." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" @@ -5137,25 +5182,25 @@ msgstr "" "literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" "Escreve informação relacionada com o descarregamento de pacotes usando FTP." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" "Escreve informação relacionada com o descarregamento de pacotes usando HTTP." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" "Escreve informação relacionada com o descarregamento de pacotes usando HTTPS." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." @@ -5164,7 +5209,7 @@ msgstr "" "criptográficas usando <literal>gpg</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." @@ -5173,13 +5218,13 @@ msgstr "" "armazenados em CD-ROMs." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" "Descreve os processos de resolver dependências de compilação no &apt-get;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." @@ -5188,7 +5233,7 @@ msgstr "" "<literal>apt</literal>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -5199,7 +5244,7 @@ msgstr "" "para um CD-ROM." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." @@ -5209,14 +5254,14 @@ msgstr "" "literal></quote> ao mesmo tempo." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" "Regista no log quando os items são adicionados ou removidos da fila de " "download global." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." @@ -5225,7 +5270,7 @@ msgstr "" "checksums e assinaturas criptográficas dos ficheiros descarregados." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." @@ -5235,7 +5280,7 @@ msgstr "" "pacote." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." @@ -5244,7 +5289,7 @@ msgstr "" "do apt quando se descarrega diffs de índice em vez de índices completos." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" @@ -5252,7 +5297,7 @@ msgstr "" "downloads." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." @@ -5261,7 +5306,7 @@ msgstr "" "de pacotes e com a remoção de pacotes não utilizados." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -5276,7 +5321,7 @@ msgstr "" "literal>; veja <literal>Debug::pkgProblemResolver</literal> para isso." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -5307,7 +5352,7 @@ msgstr "" "pacote aparece." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." @@ -5317,7 +5362,7 @@ msgstr "" "único." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." @@ -5326,7 +5371,7 @@ msgstr "" "estado e quaisquer erros encontrados enquanto os analisa." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." @@ -5335,7 +5380,7 @@ msgstr "" "literal> deve passar os pacotes ao &dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" @@ -5343,12 +5388,12 @@ msgstr "" "&dpkg;." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "Escreve a prioridade da cada lista de pacote no arranque." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." @@ -5357,7 +5402,7 @@ msgstr "" "acontece quando é encontrado um problema de dependências complexo)." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -5368,7 +5413,7 @@ msgstr "" "mesma que é descrita em <literal>Debug::pkgDepCache::Marker</literal>" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." @@ -5377,7 +5422,7 @@ msgstr "" "vendors.list</filename>." #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -5388,13 +5433,13 @@ msgstr "" "literal> ou <literal>APT::Update::{Pre,Post}-Invoke</literal>." #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 msgid "Examples" msgstr "Exemplos" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -5404,7 +5449,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-cache;, &apt-config;, &apt-preferences;." diff --git a/doc/po/pt_BR.po b/doc/po/pt_BR.po index d28c1e633..88b479e75 100644 --- a/doc/po/pt_BR.po +++ b/doc/po/pt_BR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: apt\n" "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n" -"POT-Creation-Date: 2014-08-28 00:20+0000\n" +"POT-Creation-Date: 2014-11-06 09:45+0100\n" "PO-Revision-Date: 2004-09-20 17:02+0000\n" "Last-Translator: André Luís Lopes <andrelop@debian.org>\n" "Language-Team: <debian-l10n-portuguese@lists.debian.org>\n" @@ -663,9 +663,9 @@ msgid "" msgstr "a linha <literal>Archive:</literal>" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 +#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 -#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 +#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 #: apt-ftparchive.1.xml:603 #, fuzzy @@ -680,7 +680,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 +#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607 msgid "Diagnostics" @@ -1274,6 +1274,15 @@ msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> #: apt-get.8.xml:529 msgid "" +"Forbid the update command to acquire unverifiable data from configured " +"sources. Apt will fail at the update command for repositories without valid " +"cryptographically signatures. Configuration Item: <literal>Acquire::" +"AllowInsecureRepositories</literal>." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt-get.8.xml:537 +msgid "" "Show user friendly progress information in the terminal window when packages " "are installed, upgraded or removed. For a machine parsable version of this " "data see README.progress-reporting in the apt doc directory. Configuration " @@ -1282,13 +1291,13 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 -#: apt.conf.5.xml:1216 apt_preferences.5.xml:694 +#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 +#: apt.conf.5.xml:1248 apt_preferences.5.xml:694 msgid "Files" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:553 +#: apt-get.8.xml:561 msgid "" "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, " "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the " @@ -1296,7 +1305,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt-get.8.xml:559 +#: apt-get.8.xml:567 msgid "" "<command>apt-get</command> returns zero on normal operation, decimal 100 on " "error." @@ -2892,10 +2901,10 @@ msgid "" "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to " "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e." "g. on high-latency connections. It specifies how many requests are sent in a " -"pipeline. Previous APT versions had a default of 10 for this setting, but " -"the default value is now 0 (= disabled) to avoid problems with the ever-" -"growing amount of webservers and proxies which choose to not conform to the " -"HTTP/1.1 specification." +"pipeline. APT tries to detect and workaround misbehaving webservers and " +"proxies at runtime, but if you know that yours does not conform to the " +"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. " +"It is enabled by default with the value 10." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> @@ -3189,13 +3198,40 @@ msgstr "" msgid "When downloading, force to use only the IPv6 protocol." msgstr "" +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:591 +msgid "" +"The maximum file size of Release/Release.gpg/InRelease files. The default " +"is 10MB." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:598 +msgid "" +"Allow the update operation to load data files from a repository without a " +"trusted signature. If enabled this option no data files will be loaded and " +"the update operation fails with a error for this source. The default is " +"false for backward compatibility. This will be changed in the future." +msgstr "" + +#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> +#: apt.conf.5.xml:609 +msgid "" +"Allow that a repository that was previously gpg signed to become unsigned " +"durign a update operation. When there is no valid signature of a perviously " +"trusted repository apt will refuse the update. This option can be used to " +"override this protection. You almost certainly never want to enable this. " +"The default is false. Note that apt will still consider packages from this " +"source untrusted and warn about them if you try to install them." +msgstr "" + #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:592 +#: apt.conf.5.xml:624 msgid "Directories" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:594 +#: apt.conf.5.xml:626 msgid "" "The <literal>Dir::State</literal> section has directories that pertain to " "local state information. <literal>lists</literal> is the directory to place " @@ -3207,7 +3243,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:601 +#: apt.conf.5.xml:633 msgid "" "<literal>Dir::Cache</literal> contains locations pertaining to local cache " "information, such as the two package caches <literal>srcpkgcache</literal> " @@ -3221,7 +3257,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:611 +#: apt.conf.5.xml:643 msgid "" "<literal>Dir::Etc</literal> contains the location of configuration files, " "<literal>sourcelist</literal> gives the location of the sourcelist and " @@ -3231,7 +3267,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:617 +#: apt.conf.5.xml:649 msgid "" "The <literal>Dir::Parts</literal> setting reads in all the config fragments " "in lexical order from the directory specified. After this is done then the " @@ -3239,7 +3275,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:621 +#: apt.conf.5.xml:653 msgid "" "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::" "Bin::Methods</literal> specifies the location of the method handlers and " @@ -3250,7 +3286,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:629 +#: apt.conf.5.xml:661 msgid "" "The configuration item <literal>RootDir</literal> has a special meaning. If " "set, all paths in <literal>Dir::</literal> will be relative to " @@ -3263,7 +3299,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:642 +#: apt.conf.5.xml:674 msgid "" "The <literal>Ignore-Files-Silently</literal> list can be used to specify " "which files APT should silently ignore while parsing the files in the " @@ -3274,12 +3310,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:651 +#: apt.conf.5.xml:683 msgid "APT in DSelect" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:653 +#: apt.conf.5.xml:685 msgid "" "When APT is used as a &dselect; method several configuration directives " "control the default behavior. These are in the <literal>DSelect</literal> " @@ -3287,7 +3323,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:658 +#: apt.conf.5.xml:690 msgid "" "Cache Clean mode; this value may be one of <literal>always</literal>, " "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</" @@ -3300,40 +3336,40 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:672 +#: apt.conf.5.xml:704 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the install phase." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:677 +#: apt.conf.5.xml:709 msgid "" "The contents of this variable are passed to &apt-get; as command line " "options when it is run for the update phase." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:682 +#: apt.conf.5.xml:714 msgid "" "If true the [U]pdate operation in &dselect; will always prompt to continue. " "The default is to prompt only on error." msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:688 +#: apt.conf.5.xml:720 msgid "How APT calls &dpkg;" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:689 +#: apt.conf.5.xml:721 msgid "" "Several configuration directives control how APT invokes &dpkg;. These are " "in the <literal>DPkg</literal> section." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:694 +#: apt.conf.5.xml:726 msgid "" "This is a list of options to pass to &dpkg;. The options must be specified " "using the list notation and each list item is passed as a single argument to " @@ -3341,7 +3377,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:700 +#: apt.conf.5.xml:732 msgid "" "This is a list of shell commands to run before/after invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -3350,7 +3386,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:707 +#: apt.conf.5.xml:739 msgid "" "This is a list of shell commands to run before invoking &dpkg;. Like " "<literal>options</literal> this must be specified in list notation. The " @@ -3361,7 +3397,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:714 +#: apt.conf.5.xml:746 msgid "" "Version 2 of this protocol dumps more information, including the protocol " "version, the APT configuration space and the packages, files and versions " @@ -3370,7 +3406,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:719 +#: apt.conf.5.xml:751 msgid "" "The version of the protocol to be used for the command " "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting " @@ -3381,7 +3417,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:726 +#: apt.conf.5.xml:758 msgid "" "The file descriptor to be used to send the information can be requested with " "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</" @@ -3392,26 +3428,26 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:736 +#: apt.conf.5.xml:768 msgid "" "APT chdirs to this directory before invoking &dpkg;, the default is " "<filename>/</filename>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:741 +#: apt.conf.5.xml:773 msgid "" "These options are passed to &dpkg-buildpackage; when compiling packages; the " "default is to disable signing and produce all binaries." msgstr "" #. type: Content of: <refentry><refsect1><refsect2><title> -#: apt.conf.5.xml:746 +#: apt.conf.5.xml:778 msgid "dpkg trigger usage (and related options)" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:747 +#: apt.conf.5.xml:779 msgid "" "APT can call &dpkg; in such a way as to let it make aggressive use of " "triggers over multiple calls of &dpkg;. Without further options &dpkg; will " @@ -3426,7 +3462,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para><literallayout> -#: apt.conf.5.xml:762 +#: apt.conf.5.xml:794 #, no-wrap msgid "" "DPkg::NoTriggers \"true\";\n" @@ -3436,7 +3472,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><para> -#: apt.conf.5.xml:756 +#: apt.conf.5.xml:788 msgid "" "Note that it is not guaranteed that APT will support these options or that " "these options will not cause (big) trouble in the future. If you have " @@ -3450,7 +3486,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:769 +#: apt.conf.5.xml:801 msgid "" "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending " "call). See &dpkg; if you are interested in what this actually means. In " @@ -3463,7 +3499,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:777 +#: apt.conf.5.xml:809 msgid "" "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" " "and \"<literal>no</literal>\". The default value is \"<literal>all</literal>" @@ -3480,7 +3516,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:792 +#: apt.conf.5.xml:824 msgid "" "If this option is set APT will call <command>dpkg --configure --pending</" "command> to let &dpkg; handle all required configurations and triggers. This " @@ -3491,7 +3527,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:799 +#: apt.conf.5.xml:831 msgid "" "Useful for the <literal>smart</literal> configuration as a package which has " "pending triggers is not considered as <literal>installed</literal>, and " @@ -3501,7 +3537,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout> -#: apt.conf.5.xml:812 +#: apt.conf.5.xml:844 #, no-wrap msgid "" "OrderList::Score {\n" @@ -3513,7 +3549,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:805 +#: apt.conf.5.xml:837 msgid "" "Essential packages (and their dependencies) should be configured immediately " "after unpacking. It is a good idea to do this quite early in the upgrade " @@ -3527,12 +3563,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:825 +#: apt.conf.5.xml:857 msgid "Periodic and Archives options" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:826 +#: apt.conf.5.xml:858 msgid "" "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups " "of options configure behavior of apt periodic updates, which is done by the " @@ -3541,12 +3577,12 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:834 +#: apt.conf.5.xml:866 msgid "Debug options" msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:836 +#: apt.conf.5.xml:868 msgid "" "Enabling options in the <literal>Debug::</literal> section will cause " "debugging information to be sent to the standard error stream of the program " @@ -3557,7 +3593,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:847 +#: apt.conf.5.xml:879 msgid "" "<literal>Debug::pkgProblemResolver</literal> enables output about the " "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</" @@ -3565,7 +3601,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:855 +#: apt.conf.5.xml:887 msgid "" "<literal>Debug::NoLocking</literal> disables all file locking. This can be " "used to run some operations (for instance, <literal>apt-get -s install</" @@ -3573,7 +3609,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:864 +#: apt.conf.5.xml:896 msgid "" "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each " "time that <literal>apt</literal> invokes &dpkg;." @@ -3583,66 +3619,66 @@ msgstr "" #. motivating example, except I haven't a clue why you'd want #. to do this. #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para> -#: apt.conf.5.xml:872 +#: apt.conf.5.xml:904 msgid "" "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data " "in CD-ROM IDs." msgstr "" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:882 +#: apt.conf.5.xml:914 msgid "A full list of debugging options to apt follows." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:891 +#: apt.conf.5.xml:923 msgid "" "Print information related to accessing <literal>cdrom://</literal> sources." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:902 +#: apt.conf.5.xml:934 msgid "Print information related to downloading packages using FTP." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:913 +#: apt.conf.5.xml:945 msgid "Print information related to downloading packages using HTTP." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:924 +#: apt.conf.5.xml:956 msgid "Print information related to downloading packages using HTTPS." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:935 +#: apt.conf.5.xml:967 msgid "" "Print information related to verifying cryptographic signatures using " "<literal>gpg</literal>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:946 +#: apt.conf.5.xml:978 msgid "" "Output information about the process of accessing collections of packages " "stored on CD-ROMs." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:956 +#: apt.conf.5.xml:988 msgid "Describes the process of resolving build-dependencies in &apt-get;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:966 +#: apt.conf.5.xml:998 msgid "" "Output each cryptographic hash that is generated by the <literal>apt</" "literal> libraries." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:976 +#: apt.conf.5.xml:1008 msgid "" "Do not include information from <literal>statfs</literal>, namely the number " "of used and free blocks on the CD-ROM filesystem, when generating an ID for " @@ -3650,53 +3686,53 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:987 +#: apt.conf.5.xml:1019 msgid "" "Disable all file locking. For instance, this will allow two instances of " "<quote><literal>apt-get update</literal></quote> to run at the same time." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:999 +#: apt.conf.5.xml:1031 msgid "Log when items are added to or removed from the global download queue." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1009 +#: apt.conf.5.xml:1041 msgid "" "Output status messages and errors related to verifying checksums and " "cryptographic signatures of downloaded files." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1019 +#: apt.conf.5.xml:1051 msgid "" "Output information about downloading and applying package index list diffs, " "and errors relating to package index list diffs." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1031 +#: apt.conf.5.xml:1063 msgid "" "Output information related to patching apt package lists when downloading " "index diffs instead of full indices." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1042 +#: apt.conf.5.xml:1074 msgid "" "Log all interactions with the sub-processes that actually perform downloads." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1053 +#: apt.conf.5.xml:1085 msgid "" "Log events related to the automatically-installed status of packages and to " "the removal of unused packages." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1063 +#: apt.conf.5.xml:1095 msgid "" "Generate debug messages describing which packages are being automatically " "installed to resolve dependencies. This corresponds to the initial auto-" @@ -3706,7 +3742,7 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1077 +#: apt.conf.5.xml:1109 msgid "" "Generate debug messages describing which packages are marked as keep/install/" "remove while the ProblemResolver does his work. Each addition or deletion " @@ -3724,46 +3760,46 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1098 +#: apt.conf.5.xml:1130 msgid "" "When invoking &dpkg;, output the precise command line with which it is being " "invoked, with arguments separated by a single space character." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1109 +#: apt.conf.5.xml:1141 msgid "" "Output all the data received from &dpkg; on the status file descriptor and " "any errors encountered while parsing it." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1120 +#: apt.conf.5.xml:1152 msgid "" "Generate a trace of the algorithm that decides the order in which " "<literal>apt</literal> should pass packages to &dpkg;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1132 +#: apt.conf.5.xml:1164 msgid "" "Output status messages tracing the steps performed when invoking &dpkg;." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1143 +#: apt.conf.5.xml:1175 msgid "Output the priority of each package list on startup." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1153 +#: apt.conf.5.xml:1185 msgid "" "Trace the execution of the dependency resolver (this applies only to what " "happens when a complex dependency problem is encountered)." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1164 +#: apt.conf.5.xml:1196 msgid "" "Display a list of all installed packages with their calculated score used by " "the pkgProblemResolver. The description of the package is the same as " @@ -3771,14 +3807,14 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1176 +#: apt.conf.5.xml:1208 msgid "" "Print information about the vendors read from <filename>/etc/apt/vendors." "list</filename>." msgstr "" #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para> -#: apt.conf.5.xml:1186 +#: apt.conf.5.xml:1218 msgid "" "Display the external commands that are called by apt hooks. This includes e." "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or " @@ -3786,14 +3822,14 @@ msgid "" msgstr "" #. type: Content of: <refentry><refsect1><title> -#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 +#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 #: apt-ftparchive.1.xml:592 #, fuzzy msgid "Examples" msgstr "Exemplos" #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1211 +#: apt.conf.5.xml:1243 msgid "" "&configureindex; is a configuration file showing example values for all " "possible options." @@ -3801,7 +3837,7 @@ msgstr "" #. ? reading apt.conf #. type: Content of: <refentry><refsect1><para> -#: apt.conf.5.xml:1223 +#: apt.conf.5.xml:1255 #, fuzzy msgid "&apt-cache;, &apt-config;, &apt-preferences;." msgstr "&apt-get; &apt-cache; &apt-conf; &sources-list;" diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc index ebf99a8f8..adf1b6d73 100644 --- a/ftparchive/apt-ftparchive.cc +++ b/ftparchive/apt-ftparchive.cc @@ -19,6 +19,9 @@ #include <apt-pkg/init.h> #include <apt-pkg/fileutl.h> +#include <apt-private/private-cmndline.h> +#include <apt-private/private-output.h> + #include <algorithm> #include <climits> #include <sys/time.h> @@ -40,11 +43,7 @@ #include <apti18n.h> /*}}}*/ -using namespace std; -ostream c0out(0); -ostream c1out(0); -ostream c2out(0); -ofstream devnull("/dev/null"); +using namespace std; unsigned Quiet = 0; // struct PackageMap - List of all package files in the config file /*{{{*/ @@ -1060,31 +1059,12 @@ int main(int argc, const char *argv[]) // Parse the command line and initialize the package library CommandLine CmdL(Args,_config); - if (pkgInitConfig(*_config) == false || CmdL.Parse(argc,argv) == false) - { - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } - - // Setup the output streams - c0out.rdbuf(clog.rdbuf()); - c1out.rdbuf(clog.rdbuf()); - c2out.rdbuf(clog.rdbuf()); + ParseCommandLine(CmdL, Cmds, Args, &_config, NULL, argc, argv, ShowHelp); + + _config->CndSet("quiet",0); Quiet = _config->FindI("quiet",0); - if (Quiet > 0) - c0out.rdbuf(devnull.rdbuf()); - if (Quiet > 1) - c1out.rdbuf(devnull.rdbuf()); - + InitOutput(clog.rdbuf()); + // Match the operation CmdL.DispatchArg(Cmds); diff --git a/ftparchive/cachedb.cc b/ftparchive/cachedb.cc index c73a64fb7..1dc268594 100644 --- a/ftparchive/cachedb.cc +++ b/ftparchive/cachedb.cc @@ -21,29 +21,31 @@ #include <apt-pkg/fileutl.h> #include <apt-pkg/debfile.h> #include <apt-pkg/gpgv.h> +#include <apt-pkg/hashes.h> #include <netinet/in.h> // htonl, etc #include <ctype.h> #include <stddef.h> #include <sys/stat.h> +#include <strings.h> #include "cachedb.h" #include <apti18n.h> /*}}}*/ -CacheDB::CacheDB(std::string const &DB) +CacheDB::CacheDB(std::string const &DB) : Dbp(0), Fd(NULL), DebFile(0) { TmpKey[0]='\0'; ReadyDB(DB); -}; +} CacheDB::~CacheDB() { ReadyDB(); delete DebFile; -}; +} // CacheDB::ReadyDB - Ready the DB2 /*{{{*/ // --------------------------------------------------------------------- @@ -268,15 +270,10 @@ bool CacheDB::GetCurStat() /*}}}*/ // CacheDB::GetFileInfo - Get all the info about the file /*{{{*/ // --------------------------------------------------------------------- -bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl, - bool const &DoContents, - bool const &GenContentsOnly, - bool const &DoSource, - bool const &DoMD5, bool const &DoSHA1, - bool const &DoSHA256, bool const &DoSHA512, +bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl, bool const &DoContents, + bool const &GenContentsOnly, bool const DoSource, unsigned int const DoHashes, bool const &checkMtime) { - bool result = true; this->FileName = FileName; if (GetCurStat() == false) @@ -284,31 +281,28 @@ bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl, OldStat = CurStat; if (GetFileStat(checkMtime) == false) - return false; + return false; /* if mtime changed, update CurStat from disk */ if (checkMtime == true && OldStat.mtime != CurStat.mtime) CurStat.Flags = FlSize; Stats.Bytes += CurStat.FileSize; - Stats.Packages++; + ++Stats.Packages; if ((DoControl && LoadControl() == false) - || (DoContents && LoadContents(GenContentsOnly) == false) - || (DoSource && LoadSource() == false) - || (DoMD5 && GetMD5(false) == false) - || (DoSHA1 && GetSHA1(false) == false) - || (DoSHA256 && GetSHA256(false) == false) - || (DoSHA512 && GetSHA512(false) == false) ) + || (DoContents && LoadContents(GenContentsOnly) == false) + || (DoSource && LoadSource() == false) + || (DoHashes != 0 && GetHashes(false, DoHashes) == false) + ) { - result = false; + return false; } - - return result; + + return true; } /*}}}*/ - -bool CacheDB::LoadSource() +bool CacheDB::LoadSource() /*{{{*/ { // Try to read the control information out of the DB. if ((CurStat.Flags & FlSource) == FlSource) @@ -338,7 +332,7 @@ bool CacheDB::LoadSource() return true; } - + /*}}}*/ // CacheDB::LoadControl - Load Control information /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -407,7 +401,7 @@ bool CacheDB::LoadContents(bool const &GenOnly) return true; } /*}}}*/ - +// CacheDB::GetHashes - Get the hashs /*{{{*/ static std::string bytes2hex(uint8_t *bytes, size_t length) { char buf[3]; std::string space; @@ -437,125 +431,63 @@ static void hex2bytes(uint8_t *bytes, const char *hex, int length) { bytes++; } } - -// CacheDB::GetMD5 - Get the MD5 hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool CacheDB::GetMD5(bool const &GenOnly) +bool CacheDB::GetHashes(bool const GenOnly, unsigned int const DoHashes) { - // Try to read the control information out of the DB. - if ((CurStat.Flags & FlMD5) == FlMD5) - { - if (GenOnly == true) - return true; - - MD5Res = bytes2hex(CurStat.MD5, sizeof(CurStat.MD5)); - return true; - } - - Stats.MD5Bytes += CurStat.FileSize; - - if (OpenFile() == false) - return false; + unsigned int FlHashes = DoHashes & (Hashes::MD5SUM | Hashes::SHA1SUM | Hashes::SHA256SUM | Hashes::SHA512SUM); + HashesList.clear(); - MD5Summation MD5; - if (Fd->Seek(0) == false || MD5.AddFD(*Fd, CurStat.FileSize) == false) - return false; - - MD5Res = MD5.Result(); - hex2bytes(CurStat.MD5, MD5Res.data(), sizeof(CurStat.MD5)); - CurStat.Flags |= FlMD5; - return true; -} - /*}}}*/ -// CacheDB::GetSHA1 - Get the SHA1 hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool CacheDB::GetSHA1(bool const &GenOnly) -{ - // Try to read the control information out of the DB. - if ((CurStat.Flags & FlSHA1) == FlSHA1) + if (FlHashes != 0) { - if (GenOnly == true) - return true; + if (OpenFile() == false) + return false; - SHA1Res = bytes2hex(CurStat.SHA1, sizeof(CurStat.SHA1)); - return true; - } - - Stats.SHA1Bytes += CurStat.FileSize; - - if (OpenFile() == false) - return false; + Hashes hashes; + if (Fd->Seek(0) == false || hashes.AddFD(*Fd, CurStat.FileSize, FlHashes) == false) + return false; - SHA1Summation SHA1; - if (Fd->Seek(0) == false || SHA1.AddFD(*Fd, CurStat.FileSize) == false) - return false; - - SHA1Res = SHA1.Result(); - hex2bytes(CurStat.SHA1, SHA1Res.data(), sizeof(CurStat.SHA1)); - CurStat.Flags |= FlSHA1; - return true; -} - /*}}}*/ -// CacheDB::GetSHA256 - Get the SHA256 hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool CacheDB::GetSHA256(bool const &GenOnly) -{ - // Try to read the control information out of the DB. - if ((CurStat.Flags & FlSHA256) == FlSHA256) - { - if (GenOnly == true) - return true; - - SHA256Res = bytes2hex(CurStat.SHA256, sizeof(CurStat.SHA256)); - return true; + HashStringList hl = hashes.GetHashStringList(); + for (HashStringList::const_iterator hs = hl.begin(); hs != hl.end(); ++hs) + { + HashesList.push_back(*hs); + if (strcasecmp(hs->HashType().c_str(), "SHA512") == 0) + { + Stats.SHA512Bytes += CurStat.FileSize; + hex2bytes(CurStat.SHA512, hs->HashValue().data(), sizeof(CurStat.SHA512)); + CurStat.Flags |= FlSHA512; + } + else if (strcasecmp(hs->HashType().c_str(), "SHA256") == 0) + { + Stats.SHA256Bytes += CurStat.FileSize; + hex2bytes(CurStat.SHA256, hs->HashValue().data(), sizeof(CurStat.SHA256)); + CurStat.Flags |= FlSHA256; + } + else if (strcasecmp(hs->HashType().c_str(), "SHA1") == 0) + { + Stats.SHA1Bytes += CurStat.FileSize; + hex2bytes(CurStat.SHA1, hs->HashValue().data(), sizeof(CurStat.SHA1)); + CurStat.Flags |= FlSHA1; + } + else if (strcasecmp(hs->HashType().c_str(), "MD5Sum") == 0) + { + Stats.MD5Bytes += CurStat.FileSize; + hex2bytes(CurStat.MD5, hs->HashValue().data(), sizeof(CurStat.MD5)); + CurStat.Flags |= FlMD5; + } + else if (strcasecmp(hs->HashType().c_str(), "Checksum-FileSize") == 0) + { + // we store it in a different field already + } + else + return _error->Error("Got unknown unrequested hashtype %s", hs->HashType().c_str()); + } } - - Stats.SHA256Bytes += CurStat.FileSize; - - if (OpenFile() == false) - return false; - - SHA256Summation SHA256; - if (Fd->Seek(0) == false || SHA256.AddFD(*Fd, CurStat.FileSize) == false) - return false; - - SHA256Res = SHA256.Result(); - hex2bytes(CurStat.SHA256, SHA256Res.data(), sizeof(CurStat.SHA256)); - CurStat.Flags |= FlSHA256; - return true; -} - /*}}}*/ -// CacheDB::GetSHA256 - Get the SHA256 hash /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool CacheDB::GetSHA512(bool const &GenOnly) -{ - // Try to read the control information out of the DB. - if ((CurStat.Flags & FlSHA512) == FlSHA512) - { - if (GenOnly == true) - return true; - - SHA512Res = bytes2hex(CurStat.SHA512, sizeof(CurStat.SHA512)); + if (GenOnly == true) return true; - } - - Stats.SHA512Bytes += CurStat.FileSize; - - if (OpenFile() == false) - return false; - SHA512Summation SHA512; - if (Fd->Seek(0) == false || SHA512.AddFD(*Fd, CurStat.FileSize) == false) - return false; - - SHA512Res = SHA512.Result(); - hex2bytes(CurStat.SHA512, SHA512Res.data(), sizeof(CurStat.SHA512)); - CurStat.Flags |= FlSHA512; - return true; + return HashesList.push_back(HashString("MD5Sum", bytes2hex(CurStat.MD5, sizeof(CurStat.MD5)))) && + HashesList.push_back(HashString("SHA1", bytes2hex(CurStat.SHA1, sizeof(CurStat.SHA1)))) && + HashesList.push_back(HashString("SHA256", bytes2hex(CurStat.SHA256, sizeof(CurStat.SHA256)))) && + HashesList.push_back(HashString("SHA512", bytes2hex(CurStat.SHA512, sizeof(CurStat.SHA512)))); } /*}}}*/ // CacheDB::Finish - Write back the cache structure /*{{{*/ diff --git a/ftparchive/cachedb.h b/ftparchive/cachedb.h index 29d710d2c..613963f6f 100644 --- a/ftparchive/cachedb.h +++ b/ftparchive/cachedb.h @@ -12,6 +12,7 @@ #ifndef CACHEDB_H #define CACHEDB_H +#include <apt-pkg/hashes.h> #include <apt-pkg/debfile.h> #include <db.h> @@ -94,15 +95,12 @@ class CacheDB bool LoadControl(); bool LoadContents(bool const &GenOnly); bool LoadSource(); - bool GetMD5(bool const &GenOnly); - bool GetSHA1(bool const &GenOnly); - bool GetSHA256(bool const &GenOnly); - bool GetSHA512(bool const &GenOnly); - + bool GetHashes(bool const GenOnly, unsigned int const DoHashes); + // Stat info stored in the DB, Fixed types since it is written to disk. enum FlagList {FlControl = (1<<0),FlMD5=(1<<1),FlContents=(1<<2), - FlSize=(1<<3), FlSHA1=(1<<4), FlSHA256=(1<<5), - FlSHA512=(1<<6), FlSource=(1<<7), + FlSize=(1<<3), FlSHA1=(1<<4), FlSHA256=(1<<5), + FlSHA512=(1<<6), FlSource=(1<<7) }; // the on-disk format changed (FileSize increased to 64bit) in @@ -142,12 +140,8 @@ class CacheDB debDebFile::MemControlExtract Control; ContentsExtract Contents; DscExtract Dsc; + HashStringList HashesList; - std::string MD5Res; - std::string SHA1Res; - std::string SHA256Res; - std::string SHA512Res; - // Runtime statistics struct Stats { @@ -183,16 +177,13 @@ class CacheDB bool SetFile(std::string const &FileName,struct stat St,FileFd *Fd); // terrible old overloaded interface - bool GetFileInfo(std::string const &FileName, - bool const &DoControl, - bool const &DoContents, - bool const &GenContentsOnly, - bool const &DoSource, - bool const &DoMD5, - bool const &DoSHA1, - bool const &DoSHA256, - bool const &DoSHA512, - bool const &checkMtime = false); + bool GetFileInfo(std::string const &FileName, + bool const &DoControl, + bool const &DoContents, + bool const &GenContentsOnly, + bool const DoSource, + unsigned int const DoHashes, + bool const &checkMtime = false); bool Finish(); diff --git a/ftparchive/contents.cc b/ftparchive/contents.cc index 91dd2b8bd..8c4181eda 100644 --- a/ftparchive/contents.cc +++ b/ftparchive/contents.cc @@ -302,17 +302,17 @@ void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf) DoPrint(Out,Top->BTreeRight,Buf); } /*}}}*/ -// ContentsExtract Constructor /*{{{*/ +// ContentsExtract Constructor /*{{{*/ ContentsExtract::ContentsExtract() - : Data(0), MaxSize(0), CurSize(0) + : Data(0), MaxSize(0), CurSize(0) { -}; +} /*}}}*/ -// ContentsExtract Destructor /*{{{*/ +// ContentsExtract Destructor /*{{{*/ ContentsExtract::~ContentsExtract() { free(Data); -}; +} /*}}}*/ // ContentsExtract::Read - Read the archive /*{{{*/ // --------------------------------------------------------------------- diff --git a/ftparchive/makefile b/ftparchive/makefile index d1ffe182a..e67272e1e 100644 --- a/ftparchive/makefile +++ b/ftparchive/makefile @@ -9,8 +9,8 @@ include ../buildlib/defaults.mak ifdef BDBLIB APT_DOMAIN:=apt-utils PROGRAM=apt-ftparchive -SLIBS = -lapt-pkg -lapt-inst $(BDBLIB) $(INTLLIBS) -LIB_MAKES = apt-pkg/makefile apt-inst/makefile +SLIBS = -lapt-pkg -lapt-inst -lapt-private $(BDBLIB) $(INTLLIBS) +LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile SOURCE = apt-ftparchive.cc cachedb.cc writer.cc contents.cc override.cc \ multicompress.cc sources.cc include $(PROGRAM_H) diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 0f6cc177b..a63d8846b 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -54,29 +54,42 @@ FTWScanner *FTWScanner::Owner; // SetTFRewriteData - Helper for setting rewrite lists /*{{{*/ // --------------------------------------------------------------------- /* */ -inline void SetTFRewriteData(struct TFRewriteData &tfrd, - const char *tag, +static inline TFRewriteData SetTFRewriteData(const char *tag, const char *rewrite, const char *newtag = 0) { - tfrd.Tag = tag; - tfrd.Rewrite = rewrite; - tfrd.NewTag = newtag; + TFRewriteData tfrd; + tfrd.Tag = tag; + tfrd.Rewrite = rewrite; + tfrd.NewTag = newtag; + return tfrd; +} + /*}}}*/ +// ConfigToDoHashes - which hashes to generate /*{{{*/ +static void SingleConfigToDoHashes(unsigned int &DoHashes, std::string const &Conf, unsigned int const Flag) +{ + if (_config->FindB(Conf, true) == true) + DoHashes |= Flag; + else + DoHashes &= ~Flag; +} +static void ConfigToDoHashes(unsigned int &DoHashes, std::string const &Conf) +{ + SingleConfigToDoHashes(DoHashes, Conf + "::MD5", Hashes::MD5SUM); + SingleConfigToDoHashes(DoHashes, Conf + "::SHA1", Hashes::SHA1SUM); + SingleConfigToDoHashes(DoHashes, Conf + "::SHA256", Hashes::SHA256SUM); + SingleConfigToDoHashes(DoHashes, Conf + "::SHA512", Hashes::SHA512SUM); } /*}}}*/ // FTWScanner::FTWScanner - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -FTWScanner::FTWScanner(string const &Arch): Arch(Arch) +FTWScanner::FTWScanner(string const &Arch): Arch(Arch), DoHashes(~0) { ErrorPrinted = false; NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true); - - DoMD5 = _config->FindB("APT::FTPArchive::MD5",true); - DoSHA1 = _config->FindB("APT::FTPArchive::SHA1",true); - DoSHA256 = _config->FindB("APT::FTPArchive::SHA256",true); - DoSHA512 = _config->FindB("APT::FTPArchive::SHA512",true); + ConfigToDoHashes(DoHashes, "APT::FTPArchive"); } /*}}}*/ // FTWScanner::Scanner - FTW Scanner /*{{{*/ @@ -327,10 +340,7 @@ PackagesWriter::PackagesWriter(string const &DB,string const &Overrides,string c DeLinkLimit = 0; // Process the command line options - DoMD5 = _config->FindB("APT::FTPArchive::Packages::MD5",DoMD5); - DoSHA1 = _config->FindB("APT::FTPArchive::Packages::SHA1",DoSHA1); - DoSHA256 = _config->FindB("APT::FTPArchive::Packages::SHA256",DoSHA256); - DoSHA512 = _config->FindB("APT::FTPArchive::Packages::SHA512",DoSHA512); + ConfigToDoHashes(DoHashes, "APT::FTPArchive::Packages"); DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false); DoContents = _config->FindB("APT::FTPArchive::Contents",true); NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false); @@ -385,12 +395,12 @@ bool FTWScanner::SetExts(string const &Vals) bool PackagesWriter::DoPackage(string FileName) { // Pull all the data we need form the DB - if (Db.GetFileInfo(FileName, - true, /* DoControl */ - DoContents, - true, /* GenContentsOnly */ - false, /* DoSource */ - DoMD5, DoSHA1, DoSHA256, DoSHA512, DoAlwaysStat) == false) + if (Db.GetFileInfo(FileName, + true, /* DoControl */ + DoContents, + true, /* GenContentsOnly */ + false, /* DoSource */ + DoHashes, DoAlwaysStat) == false) { return false; } @@ -454,30 +464,29 @@ bool PackagesWriter::DoPackage(string FileName) } // This lists all the changes to the fields we are going to make. - // (7 hardcoded + maintainer + suggests + end marker) - TFRewriteData Changes[6+2+OverItem->FieldOverride.size()+1+1]; - - unsigned int End = 0; - SetTFRewriteData(Changes[End++], "Size", Size); - if (DoMD5 == true) - SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str()); - if (DoSHA1 == true) - SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str()); - if (DoSHA256 == true) - SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str()); - if (DoSHA512 == true) - SetTFRewriteData(Changes[End++], "SHA512", Db.SHA512Res.c_str()); - SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str()); - SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str()); - SetTFRewriteData(Changes[End++], "Status", 0); - SetTFRewriteData(Changes[End++], "Optional", 0); + std::vector<TFRewriteData> Changes; + + Changes.push_back(SetTFRewriteData("Size", Size)); + for (HashStringList::const_iterator hs = Db.HashesList.begin(); hs != Db.HashesList.end(); ++hs) + { + if (hs->HashType() == "MD5Sum") + Changes.push_back(SetTFRewriteData("MD5sum", hs->HashValue().c_str())); + else if (hs->HashType() == "Checksum-FileSize") + continue; + else + Changes.push_back(SetTFRewriteData(hs->HashType().c_str(), hs->HashValue().c_str())); + } + Changes.push_back(SetTFRewriteData("Filename", NewFileName.c_str())); + Changes.push_back(SetTFRewriteData("Priority", OverItem->Priority.c_str())); + Changes.push_back(SetTFRewriteData("Status", 0)); + Changes.push_back(SetTFRewriteData("Optional", 0)); string DescriptionMd5; if (LongDescription == false) { MD5Summation descmd5; descmd5.Add(desc.c_str()); DescriptionMd5 = descmd5.Result().Value(); - SetTFRewriteData(Changes[End++], "Description-md5", DescriptionMd5.c_str()); + Changes.push_back(SetTFRewriteData("Description-md5", DescriptionMd5.c_str())); if (TransWriter != NULL) TransWriter->DoPackage(Package, desc, DescriptionMd5); } @@ -492,12 +501,12 @@ bool PackagesWriter::DoPackage(string FileName) NewLine(1); ioprintf(c1out, _(" %s maintainer is %s not %s\n"), Package.c_str(), Tags.FindS("Maintainer").c_str(), OverItem->OldMaint.c_str()); - } + } } - + if (NewMaint.empty() == false) - SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str()); - + Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str())); + /* Get rid of the Optional tag. This is an ugly, ugly, ugly hack that dpkg-scanpackages does. Well sort of. dpkg-scanpackages just does renaming but dpkg does this append bit. So we do the append bit, at least that way the @@ -508,17 +517,17 @@ bool PackagesWriter::DoPackage(string FileName) { if (Tags.FindS("Suggests").empty() == false) OptionalStr = Tags.FindS("Suggests") + ", " + OptionalStr; - SetTFRewriteData(Changes[End++], "Suggests", OptionalStr.c_str()); + Changes.push_back(SetTFRewriteData("Suggests", OptionalStr.c_str())); } - for (map<string,string>::const_iterator I = OverItem->FieldOverride.begin(); + for (map<string,string>::const_iterator I = OverItem->FieldOverride.begin(); I != OverItem->FieldOverride.end(); ++I) - SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str()); + Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str())); - SetTFRewriteData(Changes[End++], 0, 0); + Changes.push_back(SetTFRewriteData( 0, 0)); // Rewrite and store the fields. - if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes) == false) + if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes.data()) == false) return false; fprintf(Output,"\n"); @@ -589,10 +598,7 @@ SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string c BufSize = 0; // Process the command line options - DoMD5 = _config->FindB("APT::FTPArchive::Sources::MD5",DoMD5); - DoSHA1 = _config->FindB("APT::FTPArchive::Sources::SHA1",DoSHA1); - DoSHA256 = _config->FindB("APT::FTPArchive::Sources::SHA256",DoSHA256); - DoSHA512 = _config->FindB("APT::FTPArchive::Sources::SHA512",DoSHA512); + ConfigToDoHashes(DoHashes, "APT::FTPArchive::Sources"); NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false); DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false); @@ -614,17 +620,25 @@ SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string c } /*}}}*/ // SourcesWriter::DoPackage - Process a single package /*{{{*/ -// --------------------------------------------------------------------- -/* */ +static std::ostream& addDscHash(std::ostream &out, unsigned int const DoHashes, + Hashes::SupportedHashes const DoIt, pkgTagSection &Tags, char const * const FieldName, + HashString const * const Hash, unsigned long long Size, std::string FileName) +{ + if ((DoHashes & DoIt) != DoIt || Tags.Exists(FieldName) == false || Hash == NULL) + return out; + out << "\n " << Hash->HashValue() << " " << Size << " " << FileName + << "\n " << Tags.FindS(FieldName); + return out; +} bool SourcesWriter::DoPackage(string FileName) { // Pull all the data we need form the DB if (Db.GetFileInfo(FileName, - false, /* DoControl */ - false, /* DoContents */ - false, /* GenContentsOnly */ - true, /* DoSource */ - DoMD5, DoSHA1, DoSHA256, DoSHA512, DoAlwaysStat) == false) + false, /* DoControl */ + false, /* DoContents */ + false, /* GenContentsOnly */ + true, /* DoSource */ + DoHashes, DoAlwaysStat) == false) { return false; } @@ -704,29 +718,19 @@ bool SourcesWriter::DoPackage(string FileName) *SOverItem = *OverItem; } } - + // Add the dsc to the files hash list string const strippedName = flNotDir(FileName); std::ostringstream ostreamFiles; - if (DoMD5 == true && Tags.Exists("Files")) - ostreamFiles << "\n " << Db.MD5Res.c_str() << " " << St.st_size << " " - << strippedName << "\n " << Tags.FindS("Files"); + addDscHash(ostreamFiles, DoHashes, Hashes::MD5SUM, Tags, "Files", Db.HashesList.find("MD5Sum"), St.st_size, strippedName); string const Files = ostreamFiles.str(); std::ostringstream ostreamSha1; - if (DoSHA1 == true && Tags.Exists("Checksums-Sha1")) - ostreamSha1 << "\n " << string(Db.SHA1Res.c_str()) << " " << St.st_size << " " - << strippedName << "\n " << Tags.FindS("Checksums-Sha1"); - + addDscHash(ostreamSha1, DoHashes, Hashes::SHA1SUM, Tags, "Checksums-Sha1", Db.HashesList.find("SHA1"), St.st_size, strippedName); std::ostringstream ostreamSha256; - if (DoSHA256 == true && Tags.Exists("Checksums-Sha256")) - ostreamSha256 << "\n " << string(Db.SHA256Res.c_str()) << " " << St.st_size << " " - << strippedName << "\n " << Tags.FindS("Checksums-Sha256"); - + addDscHash(ostreamSha256, DoHashes, Hashes::SHA256SUM, Tags, "Checksums-Sha256", Db.HashesList.find("SHA256"), St.st_size, strippedName); std::ostringstream ostreamSha512; - if (DoSHA512 == true && Tags.Exists("Checksums-Sha512")) - ostreamSha512 << "\n " << string(Db.SHA512Res.c_str()) << " " << St.st_size << " " - << strippedName << "\n " << Tags.FindS("Checksums-Sha512"); + addDscHash(ostreamSha512, DoHashes, Hashes::SHA512SUM, Tags, "Checksums-Sha512", Db.HashesList.find("SHA512"), St.st_size, strippedName); // Strip the DirStrip prefix from the FileName and add the PathPrefix string NewFileName; @@ -758,35 +762,54 @@ bool SourcesWriter::DoPackage(string FileName) string OriginalPath = Directory + ParseJnk; // Add missing hashes to source files - if ((DoSHA1 == true && !Tags.Exists("Checksums-Sha1")) || - (DoSHA256 == true && !Tags.Exists("Checksums-Sha256")) || - (DoSHA512 == true && !Tags.Exists("Checksums-Sha512"))) + if (((DoHashes & Hashes::SHA1SUM) == Hashes::SHA1SUM && !Tags.Exists("Checksums-Sha1")) || + ((DoHashes & Hashes::SHA256SUM) == Hashes::SHA256SUM && !Tags.Exists("Checksums-Sha256")) || + ((DoHashes & Hashes::SHA512SUM) == Hashes::SHA512SUM && !Tags.Exists("Checksums-Sha512"))) { - if (Db.GetFileInfo(OriginalPath, + if (Db.GetFileInfo(OriginalPath, false, /* DoControl */ false, /* DoContents */ false, /* GenContentsOnly */ false, /* DoSource */ - DoMD5, DoSHA1, DoSHA256, DoSHA512, + DoHashes, DoAlwaysStat) == false) { return _error->Error("Error getting file info"); } - if (DoSHA1 == true && !Tags.Exists("Checksums-Sha1")) - ostreamSha1 << "\n " << string(Db.SHA1Res) << " " - << Db.GetFileSize() << " " << ParseJnk; - - if (DoSHA256 == true && !Tags.Exists("Checksums-Sha256")) - ostreamSha256 << "\n " << string(Db.SHA256Res) << " " - << Db.GetFileSize() << " " << ParseJnk; - - if (DoSHA512 == true && !Tags.Exists("Checksums-Sha512")) - ostreamSha512 << "\n " << string(Db.SHA512Res) << " " - << Db.GetFileSize() << " " << ParseJnk; + for (HashStringList::const_iterator hs = Db.HashesList.begin(); hs != Db.HashesList.end(); ++hs) + { + if (hs->HashType() == "MD5Sum" || hs->HashType() == "Checksum-FileSize") + continue; + char const * fieldname; + std::ostream * out; + if (hs->HashType() == "SHA1") + { + fieldname = "Checksums-Sha1"; + out = &ostreamSha1; + } + else if (hs->HashType() == "SHA256") + { + fieldname = "Checksums-Sha256"; + out = &ostreamSha256; + } + else if (hs->HashType() == "SHA512") + { + fieldname = "Checksums-Sha512"; + out = &ostreamSha512; + } + else + { + _error->Warning("Ignoring unknown Checksumtype %s in SourcesWriter::DoPackages", hs->HashType().c_str()); + continue; + } + if (Tags.Exists(fieldname) == true) + continue; + (*out) << "\n " << hs->HashValue() << " " << Db.GetFileSize() << " " << ParseJnk; + } - // write back the GetFileInfo() stats data - Db.Finish(); + // write back the GetFileInfo() stats data + Db.Finish(); } // Perform the delinking operation @@ -812,22 +835,21 @@ bool SourcesWriter::DoPackage(string FileName) // This lists all the changes to the fields we are going to make. // (5 hardcoded + checksums + maintainer + end marker) - TFRewriteData Changes[5+2+1+SOverItem->FieldOverride.size()+1]; + std::vector<TFRewriteData> Changes; - unsigned int End = 0; - SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package"); + Changes.push_back(SetTFRewriteData("Source",Package.c_str(),"Package")); if (Files.empty() == false) - SetTFRewriteData(Changes[End++],"Files",Files.c_str()); + Changes.push_back(SetTFRewriteData("Files",Files.c_str())); if (ChecksumsSha1.empty() == false) - SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str()); + Changes.push_back(SetTFRewriteData("Checksums-Sha1",ChecksumsSha1.c_str())); if (ChecksumsSha256.empty() == false) - SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str()); + Changes.push_back(SetTFRewriteData("Checksums-Sha256",ChecksumsSha256.c_str())); if (ChecksumsSha512.empty() == false) - SetTFRewriteData(Changes[End++],"Checksums-Sha512",ChecksumsSha512.c_str()); + Changes.push_back(SetTFRewriteData("Checksums-Sha512",ChecksumsSha512.c_str())); if (Directory != "./") - SetTFRewriteData(Changes[End++],"Directory",Directory.c_str()); - SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str()); - SetTFRewriteData(Changes[End++],"Status",0); + Changes.push_back(SetTFRewriteData("Directory",Directory.c_str())); + Changes.push_back(SetTFRewriteData("Priority",BestPrio.c_str())); + Changes.push_back(SetTFRewriteData("Status",0)); // Rewrite the maintainer field if necessary bool MaintFailed; @@ -842,16 +864,16 @@ bool SourcesWriter::DoPackage(string FileName) } } if (NewMaint.empty() == false) - SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str()); + Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str())); for (map<string,string>::const_iterator I = SOverItem->FieldOverride.begin(); I != SOverItem->FieldOverride.end(); ++I) - SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str()); + Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str())); - SetTFRewriteData(Changes[End++], 0, 0); + Changes.push_back(SetTFRewriteData(0, 0)); // Rewrite and store the fields. - if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes) == false) + if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes.data()) == false) return false; fprintf(Output,"\n"); @@ -878,15 +900,13 @@ ContentsWriter::ContentsWriter(string const &DB, string const &Arch) : determine what the package name is. */ bool ContentsWriter::DoPackage(string FileName, string Package) { - if (!Db.GetFileInfo(FileName, - Package.empty(), /* DoControl */ - true, /* DoContents */ - false, /* GenContentsOnly */ - false, /* DoSource */ - false, /* DoMD5 */ - false, /* DoSHA1 */ - false, /* DoSHA256 */ - false)) /* DoSHA512 */ + if (!Db.GetFileInfo(FileName, + Package.empty(), /* DoControl */ + true, /* DoContents */ + false, /* GenContentsOnly */ + false, /* DoSource */ + 0, /* DoHashes */ + false /* checkMtime */)) { return false; } @@ -1022,9 +1042,7 @@ ReleaseWriter::ReleaseWriter(string const &/*DB*/) fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str()); } - DoMD5 = _config->FindB("APT::FTPArchive::Release::MD5",DoMD5); - DoSHA1 = _config->FindB("APT::FTPArchive::Release::SHA1",DoSHA1); - DoSHA256 = _config->FindB("APT::FTPArchive::Release::SHA256",DoSHA256); + ConfigToDoHashes(DoHashes, "APT::FTPArchive::Release"); } /*}}}*/ // ReleaseWriter::DoPackage - Process a single package /*{{{*/ @@ -1058,15 +1076,8 @@ bool ReleaseWriter::DoPackage(string FileName) CheckSums[NewFileName].size = fd.Size(); Hashes hs; - hs.AddFD(fd, 0, DoMD5, DoSHA1, DoSHA256, DoSHA512); - if (DoMD5 == true) - CheckSums[NewFileName].MD5 = hs.MD5.Result(); - if (DoSHA1 == true) - CheckSums[NewFileName].SHA1 = hs.SHA1.Result(); - if (DoSHA256 == true) - CheckSums[NewFileName].SHA256 = hs.SHA256.Result(); - if (DoSHA512 == true) - CheckSums[NewFileName].SHA512 = hs.SHA512.Result(); + hs.AddFD(fd, 0, DoHashes); + CheckSums[NewFileName].Hashes = hs.GetHashStringList(); fd.Close(); return true; @@ -1075,54 +1086,29 @@ bool ReleaseWriter::DoPackage(string FileName) /*}}}*/ // ReleaseWriter::Finish - Output the checksums /*{{{*/ // --------------------------------------------------------------------- -void ReleaseWriter::Finish() +static void printChecksumTypeRecord(FILE * const Output, char const * const Type, map<string, ReleaseWriter::CheckSum> const &CheckSums) { - if (DoMD5 == true) - { - fprintf(Output, "MD5Sum:\n"); - for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); ++I) - { - fprintf(Output, " %s %16llu %s\n", - (*I).second.MD5.c_str(), - (*I).second.size, - (*I).first.c_str()); - } - } - if (DoSHA1 == true) - { - fprintf(Output, "SHA1:\n"); - for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); ++I) - { - fprintf(Output, " %s %16llu %s\n", - (*I).second.SHA1.c_str(), - (*I).second.size, - (*I).first.c_str()); - } - } - if (DoSHA256 == true) - { - fprintf(Output, "SHA256:\n"); - for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin(); + fprintf(Output, "%s:\n", Type); + for(map<string,ReleaseWriter::CheckSum>::const_iterator I = CheckSums.begin(); I != CheckSums.end(); ++I) { + HashString const * const hs = I->second.Hashes.find(Type); + if (hs == NULL) + continue; fprintf(Output, " %s %16llu %s\n", - (*I).second.SHA256.c_str(), + hs->HashValue().c_str(), (*I).second.size, (*I).first.c_str()); } - } - - fprintf(Output, "SHA512:\n"); - for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); - ++I) - { - fprintf(Output, " %s %16llu %s\n", - (*I).second.SHA512.c_str(), - (*I).second.size, - (*I).first.c_str()); - } - +} +void ReleaseWriter::Finish() +{ + if ((DoHashes & Hashes::MD5SUM) == Hashes::MD5SUM) + printChecksumTypeRecord(Output, "MD5Sum", CheckSums); + if ((DoHashes & Hashes::SHA1SUM) == Hashes::SHA1SUM) + printChecksumTypeRecord(Output, "SHA1", CheckSums); + if ((DoHashes & Hashes::SHA256SUM) == Hashes::SHA256SUM) + printChecksumTypeRecord(Output, "SHA256", CheckSums); + if ((DoHashes & Hashes::SHA512SUM) == Hashes::SHA512SUM) + printChecksumTypeRecord(Output, "SHA512", CheckSums); } diff --git a/ftparchive/writer.h b/ftparchive/writer.h index d8a10e0bb..226996475 100644 --- a/ftparchive/writer.h +++ b/ftparchive/writer.h @@ -13,6 +13,8 @@ #ifndef WRITER_H #define WRITER_H +#include <apt-pkg/hashes.h> + #include <string> #include <stdio.h> #include <iostream> @@ -61,10 +63,7 @@ class FTWScanner } public: - bool DoMD5; - bool DoSHA1; - bool DoSHA256; - bool DoSHA512; + unsigned int DoHashes; unsigned long DeLinkLimit; string InternalPrefix; @@ -197,17 +196,14 @@ public: string PathPrefix; string DirStrip; -protected: struct CheckSum { - string MD5; - string SHA1; - string SHA256; - string SHA512; + HashStringList Hashes; // Limited by FileFd::Size() unsigned long long size; ~CheckSum() {}; }; +protected: map<string,struct CheckSum> CheckSums; }; diff --git a/methods/copy.cc b/methods/copy.cc index 40f8f85ec..a23c0316c 100644 --- a/methods/copy.cc +++ b/methods/copy.cc @@ -67,6 +67,14 @@ bool CopyMethod::Fetch(FetchItem *Itm) Res.LastModified = Buf.st_mtime; Res.IMSHit = false; URIStart(Res); + + // when the files are identical, just compute the hashes + if(File == Itm->DestFile) + { + CalculateHashes(Res); + URIDone(Res); + return true; + } // just calc the hashes if the source and destination are identical if (File == Itm->DestFile) @@ -116,5 +124,6 @@ int main() setlocale(LC_ALL, ""); CopyMethod Mth; + return Mth.Run(); } diff --git a/methods/ftp.cc b/methods/ftp.cc index 66787a7be..0504e5872 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -75,9 +75,10 @@ time_t FtpMethod::FailTime = 0; // FTPConn::FTPConn - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1), +FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1), DataListenFd(-1), ServerName(Srv), - ForceExtended(false), TryPassive(true) + ForceExtended(false), TryPassive(true), + PeerAddrLen(0), ServerAddrLen(0) { Debug = _config->FindB("Debug::Acquire::Ftp",false); PasvAddr = 0; @@ -848,7 +849,8 @@ bool FTPConn::Finalize() /* This opens a data connection, sends REST and RETR and then transfers the file over. */ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume, - Hashes &Hash,bool &Missing) + Hashes &Hash,bool &Missing, unsigned long long MaximumSize, + pkgAcqMethod *Owner) { Missing = false; if (CreateDataFd() == false) @@ -921,7 +923,14 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume, { Close(); return false; - } + } + + if (MaximumSize > 0 && To.Tell() > MaximumSize) + { + Owner->SetFailReason("MaximumSizeExceeded"); + return _error->Error("Writing more data than expected (%llu > %llu)", + To.Tell(), MaximumSize); + } } // All done @@ -979,6 +988,10 @@ bool FtpMethod::Configuration(string Message) return false; TimeOut = _config->FindI("Acquire::Ftp::Timeout",TimeOut); + + // no more active ftp, sorry + DropPrivsOrDie(); + return true; } /*}}}*/ @@ -1062,7 +1075,7 @@ bool FtpMethod::Fetch(FetchItem *Itm) FailFd = Fd.Fd(); bool Missing; - if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing) == false) + if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize,this) == false) { Fd.Close(); @@ -1131,6 +1144,6 @@ int main(int, const char *argv[]) } FtpMethod Mth; - + return Mth.Run(); } diff --git a/methods/ftp.h b/methods/ftp.h index dd92f0086..2efd28ec6 100644 --- a/methods/ftp.h +++ b/methods/ftp.h @@ -62,7 +62,8 @@ class FTPConn bool Size(const char *Path,unsigned long long &Size); bool ModTime(const char *Path, time_t &Time); bool Get(const char *Path,FileFd &To,unsigned long long Resume, - Hashes &MD5,bool &Missing); + Hashes &MD5,bool &Missing, unsigned long long MaximumSize, + pkgAcqMethod *Owner); FTPConn(URI Srv); ~FTPConn(); diff --git a/methods/gpgv.cc b/methods/gpgv.cc index ae521a2ed..41f138be6 100644 --- a/methods/gpgv.cc +++ b/methods/gpgv.cc @@ -5,6 +5,7 @@ #include <apt-pkg/error.h> #include <apt-pkg/gpgv.h> #include <apt-pkg/strutl.h> +#include <apt-pkg/fileutl.h> #include <ctype.h> #include <errno.h> @@ -43,12 +44,22 @@ class GPGVMethod : public pkgAcqMethod protected: virtual bool Fetch(FetchItem *Itm); - + virtual bool Configuration(string Message); public: GPGVMethod() : pkgAcqMethod("1.0",SingleInstance | SendConfig) {}; }; +bool GPGVMethod::Configuration(string Message) +{ + if (pkgAcqMethod::Configuration(Message) == false) + return false; + + DropPrivsOrDie(); + + return true; +} + string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, vector<string> &GoodSigners, vector<string> &BadSigners, @@ -74,34 +85,13 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, FILE *pipein = fdopen(fd[0], "r"); - // Loop over the output of gpgv, and check the signatures. - size_t buffersize = 64; - char *buffer = (char *) malloc(buffersize); - size_t bufferoff = 0; + // Loop over the output of apt-key (which really is gnupg), and check the signatures. + size_t buffersize = 0; + char *buffer = NULL; while (1) { - int c; - - // Read a line. Sigh. - while ((c = getc(pipein)) != EOF && c != '\n') - { - if (bufferoff == buffersize) - { - char* newBuffer = (char *) realloc(buffer, buffersize *= 2); - if (newBuffer == NULL) - { - free(buffer); - return "Couldn't allocate a buffer big enough for reading"; - } - buffer = newBuffer; - } - *(buffer+bufferoff) = c; - bufferoff++; - } - if (bufferoff == 0 && c == EOF) - break; - *(buffer+bufferoff) = '\0'; - bufferoff = 0; + if (getline(&buffer, &buffersize, pipein) == -1) + break; if (Debug == true) std::clog << "Read: " << buffer << std::endl; @@ -115,7 +105,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, std::clog << "Got BADSIG! " << std::endl; BadSigners.push_back(string(buffer+sizeof(GNUPGPREFIX))); } - + if (strncmp(buffer, GNUPGNOPUBKEY, sizeof(GNUPGNOPUBKEY)-1) == 0) { if (Debug == true) @@ -159,7 +149,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, waitpid(pid, &status, 0); if (Debug == true) { - std::clog << "gpgv exited\n"; + ioprintf(std::clog, "gpgv exited with status %i\n", WEXITSTATUS(status)); } if (WEXITSTATUS(status) == 0) @@ -171,7 +161,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, else if (WEXITSTATUS(status) == 1) return _("At least one invalid signature was encountered."); else if (WEXITSTATUS(status) == 111) - return _("Could not execute 'gpgv' to verify signature (is gpgv installed?)"); + return _("Could not execute 'apt-key' to verify signature (is gnupg installed?)"); else if (WEXITSTATUS(status) == 112) { // acquire system checks for "NODATA" to generate GPG errors (the others are only warnings) @@ -181,7 +171,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, return errmsg; } else - return _("Unknown error executing gpgv"); + return _("Unknown error executing apt-key"); } bool GPGVMethod::Fetch(FetchItem *Itm) @@ -199,7 +189,7 @@ bool GPGVMethod::Fetch(FetchItem *Itm) Res.Filename = Itm->DestFile; URIStart(Res); - // Run gpgv on file, extract contents and get the key ID of the signer + // Run apt-key on file, extract contents and get the key ID of the signer string msg = VerifyGetSigners(Path.c_str(), Itm->DestFile.c_str(), GoodSigners, BadSigners, WorthlessSigners, NoPubKeySigners); @@ -251,7 +241,7 @@ bool GPGVMethod::Fetch(FetchItem *Itm) if (_config->FindB("Debug::Acquire::gpgv", false)) { - std::clog << "gpgv succeeded\n"; + std::clog << "apt-key succeeded\n"; } return true; @@ -261,7 +251,7 @@ bool GPGVMethod::Fetch(FetchItem *Itm) int main() { setlocale(LC_ALL, ""); - + GPGVMethod Mth; return Mth.Run(); diff --git a/methods/gzip.cc b/methods/gzip.cc index df3f8828f..387c05f2e 100644 --- a/methods/gzip.cc +++ b/methods/gzip.cc @@ -33,12 +33,22 @@ const char *Prog; class GzipMethod : public pkgAcqMethod { virtual bool Fetch(FetchItem *Itm); + virtual bool Configuration(std::string Message); public: GzipMethod() : pkgAcqMethod("1.1",SingleInstance | SendConfig) {}; }; +bool GzipMethod::Configuration(std::string Message) +{ + if (pkgAcqMethod::Configuration(Message) == false) + return false; + + DropPrivsOrDie(); + + return true; +} // GzipMethod::Fetch - Decompress the passed URI /*{{{*/ // --------------------------------------------------------------------- @@ -139,5 +149,6 @@ int main(int, char *argv[]) ++Prog; GzipMethod Mth; + return Mth.Run(); } diff --git a/methods/http.cc b/methods/http.cc index 1b996db98..ad1347d36 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -64,7 +64,8 @@ const unsigned int CircleBuf::BW_HZ=10; // CircleBuf::CircleBuf - Circular input buffer /*{{{*/ // --------------------------------------------------------------------- /* */ -CircleBuf::CircleBuf(unsigned long long Size) : Size(Size), Hash(0) +CircleBuf::CircleBuf(unsigned long long Size) + : Size(Size), Hash(0), TotalWriten(0) { Buf = new unsigned char[Size]; Reset(); @@ -80,6 +81,7 @@ void CircleBuf::Reset() InP = 0; OutP = 0; StrPos = 0; + TotalWriten = 0; MaxGet = (unsigned long long)-1; OutQueue = string(); if (Hash != 0) @@ -217,6 +219,8 @@ bool CircleBuf::Write(int Fd) return false; } + + TotalWriten += Res; if (Hash != 0) Hash->Add(Buf + (OutP%Size),Res); @@ -653,6 +657,13 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File) return _error->Errno("write",_("Error writing to output file")); } + if (MaximumSize > 0 && File && File->Tell() > MaximumSize) + { + Owner->SetFailReason("MaximumSizeExceeded"); + return _error->Error("Writing more data than expected (%llu > %llu)", + File->Tell(), MaximumSize); + } + // Handle commands from APT if (FD_ISSET(STDIN_FILENO,&rfds)) { @@ -761,6 +772,8 @@ bool HttpMethod::Configuration(string Message) if (ServerMethod::Configuration(Message) == false) return false; + DropPrivsOrDie(); + AllowRedirect = _config->FindB("Acquire::http::AllowRedirect",true); PipelineDepth = _config->FindI("Acquire::http::Pipeline-Depth", PipelineDepth); diff --git a/methods/http.h b/methods/http.h index 1df9fa07d..40a88a7be 100644 --- a/methods/http.h +++ b/methods/http.h @@ -63,6 +63,8 @@ class CircleBuf public: Hashes *Hash; + // total amount of data that got written so far + unsigned long long TotalWriten; // Read data in bool Read(int Fd); @@ -81,8 +83,8 @@ class CircleBuf bool ReadSpace() const {return Size - (InP - OutP) > 0;}; bool WriteSpace() const {return InP - OutP > 0;}; - // Dump everything void Reset(); + // Dump everything void Stats(); CircleBuf(unsigned long long Size); diff --git a/methods/http_main.cc b/methods/http_main.cc index 3b346a514..cd52c42e8 100644 --- a/methods/http_main.cc +++ b/methods/http_main.cc @@ -1,5 +1,6 @@ #include <config.h> - +#include <apt-pkg/fileutl.h> +#include <apt-pkg/error.h> #include <signal.h> #include "http.h" @@ -13,5 +14,6 @@ int main() signal(SIGPIPE, SIG_IGN); HttpMethod Mth; + return Mth.Loop(); } diff --git a/methods/https.cc b/methods/https.cc index 3a5981b58..37a8ff5fd 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -37,6 +37,16 @@ /*}}}*/ using namespace std; +bool HttpsMethod::Configuration(std::string Message) +{ + if (pkgAcqMethod::Configuration(Message) == false) + return false; + + DropPrivsOrDie(); + + return true; +} + size_t HttpsMethod::parse_header(void *buffer, size_t size, size_t nmemb, void *userp) { @@ -85,21 +95,33 @@ HttpsMethod::write_data(void *buffer, size_t size, size_t nmemb, void *userp) if (me->Server->JunkSize != 0) return buffer_size; - if (me->ReceivedData == false) + if (me->Server->ReceivedData == false) { me->URIStart(me->Res); - me->ReceivedData = true; + me->Server->ReceivedData = true; } if(me->File->Write(buffer, buffer_size) != true) - return false; + return 0; + + if(me->Queue->MaximumSize > 0) + { + unsigned long long const TotalWritten = me->File->Tell(); + if (TotalWritten > me->Queue->MaximumSize) + { + me->SetFailReason("MaximumSizeExceeded"); + _error->Error("Writing more data than expected (%llu > %llu)", + TotalWritten, me->Queue->MaximumSize); + return 0; + } + } return buffer_size; } int HttpsMethod::progress_callback(void *clientp, double dltotal, double /*dlnow*/, - double /*ultotal*/, double /*ulnow*/) + double /*ultotal*/, double /*ulnow*/) { HttpsMethod *me = (HttpsMethod *)clientp; if(dltotal > 0 && me->Res.Size == 0) { @@ -112,6 +134,7 @@ HttpsMethod::progress_callback(void *clientp, double dltotal, double /*dlnow*/, HttpsServerState::HttpsServerState(URI Srv,HttpsMethod * /*Owner*/) : ServerState(Srv, NULL) { TimeOut = _config->FindI("Acquire::https::Timeout",TimeOut); + ReceivedData = false; Reset(); } /*}}}*/ @@ -179,11 +202,10 @@ void HttpsMethod::SetupProxy() /*{{{*/ bool HttpsMethod::Fetch(FetchItem *Itm) { struct stat SBuf; - struct curl_slist *headers=NULL; + struct curl_slist *headers=NULL; char curl_errorstr[CURL_ERROR_SIZE]; URI Uri = Itm->Uri; string remotehost = Uri.Host; - ReceivedData = false; // TODO: // - http::Pipeline-Depth diff --git a/methods/https.h b/methods/https.h index 411b71440..6917a6ff6 100644 --- a/methods/https.h +++ b/methods/https.h @@ -50,6 +50,8 @@ class HttpsServerState : public ServerState HttpsServerState(URI Srv, HttpsMethod *Owner); virtual ~HttpsServerState() {Close();}; + + bool ReceivedData; }; class HttpsMethod : public pkgAcqMethod @@ -58,22 +60,22 @@ class HttpsMethod : public pkgAcqMethod static const int DL_MIN_SPEED = 10; virtual bool Fetch(FetchItem *); + virtual bool Configuration(std::string Message); + static size_t parse_header(void *buffer, size_t size, size_t nmemb, void *userp); 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); + static int progress_callback(void *clientp, double dltotal, double dlnow, + double ultotal, double ulnow); void SetupProxy(); CURL *curl; FetchResult Res; HttpsServerState *Server; - bool ReceivedData; public: FileFd *File; - - HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig), File(NULL) + + HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig), Server(NULL), File(NULL) { - File = 0; curl = curl_easy_init(); }; diff --git a/methods/rred.cc b/methods/rred.cc index cabb3c456..774b58a40 100644 --- a/methods/rred.cc +++ b/methods/rred.cc @@ -150,11 +150,11 @@ class FileChanges { std::list<struct Change>::iterator where; size_t pos; // line number is as far left of iterator as possible - bool pos_is_okay(void) + bool pos_is_okay(void) const { #ifdef POSDEBUG size_t cpos = 0; - std::list<struct Change>::iterator x; + std::list<struct Change>::const_iterator x; for (x = changes.begin(); x != where; ++x) { assert(x != changes.end()); cpos += x->offset + x->add_cnt; diff --git a/methods/server.cc b/methods/server.cc index e321e0230..c17f27f73 100644 --- a/methods/server.cc +++ b/methods/server.cc @@ -328,10 +328,10 @@ ServerMethod::DealWithHeaders(FetchResult &Res) failure */ if (Server->Result < 200 || Server->Result >= 300) { - char err[255]; - snprintf(err,sizeof(err)-1,"HttpError%i",Server->Result); + std::string err; + strprintf(err, "HttpError%u", Server->Result); SetFailReason(err); - _error->Error("%u %s",Server->Result,Server->Code); + _error->Error("%u %s", Server->Result, Server->Code); if (Server->HaveContent == true) return ERROR_WITH_CONTENT_PAGE; return ERROR_UNRECOVERABLE; @@ -397,9 +397,16 @@ bool ServerMethod::Fetch(FetchItem *) for (FetchItem *I = Queue; I != 0 && Depth < (signed)PipelineDepth; I = I->Next, Depth++) { - // If pipelining is disabled, we only queue 1 request - if (Server->Pipeline == false && Depth >= 0) - break; + if (Depth >= 0) + { + // If pipelining is disabled, we only queue 1 request + if (Server->Pipeline == false) + break; + // if we have no hashes, do at most one such request + // as we can't fixup pipeling misbehaviors otherwise + else if (I->ExpectedHashes.usable() == false) + break; + } // Make sure we stick with the same server if (Server->Comp(I->Uri) == false) @@ -529,6 +536,13 @@ int ServerMethod::Loop() // Run the data bool Result = true; + + // ensure we don't fetch too much + // we could do "Server->MaximumSize = Queue->MaximumSize" here + // but that would break the clever pipeline messup detection + // so instead we use the size of the biggest item in the queue + Server->MaximumSize = FindMaximumObjectSizeInQueue(); + if (Server->HaveContent) Result = Server->RunData(File); @@ -551,7 +565,38 @@ int ServerMethod::Loop() // Send status to APT if (Result == true) { - Res.TakeHashes(*Server->GetHashes()); + Hashes * const resultHashes = Server->GetHashes(); + HashStringList const hashList = resultHashes->GetHashStringList(); + if (PipelineDepth != 0 && Queue->ExpectedHashes.usable() == true && Queue->ExpectedHashes != hashList) + { + // we did not get the expected hash… mhhh: + // could it be that server/proxy messed up pipelining? + FetchItem * BeforeI = Queue; + for (FetchItem *I = Queue->Next; I != 0 && I != QueueBack; I = I->Next) + { + if (I->ExpectedHashes.usable() == true && I->ExpectedHashes == hashList) + { + // yes, he did! Disable pipelining and rewrite queue + if (Server->Pipeline == true) + { + // FIXME: fake a warning message as we have no proper way of communicating here + std::string out; + strprintf(out, _("Automatically disabled %s due to incorrect response from server/proxy. (man 5 apt.conf)"), "Acquire::http::PipelineDepth"); + std::cerr << "W: " << out << std::endl; + Server->Pipeline = false; + // we keep the PipelineDepth value so that the rest of the queue can be fixed up as well + } + Rename(Res.Filename, I->DestFile); + Res.Filename = I->DestFile; + BeforeI->Next = I->Next; + I->Next = Queue; + Queue = I; + break; + } + BeforeI = I; + } + } + Res.TakeHashes(*resultHashes); URIDone(Res); } else @@ -571,7 +616,10 @@ int ServerMethod::Loop() QueueBack = Queue; } else + { + Server->Close(); Fail(true); + } } break; } @@ -666,3 +714,13 @@ int ServerMethod::Loop() return 0; } /*}}}*/ + /*{{{*/ +unsigned long long +ServerMethod::FindMaximumObjectSizeInQueue() const +{ + unsigned long long MaxSizeInQueue = 0; + for (FetchItem *I = Queue; I != 0 && I != QueueBack; I = I->Next) + MaxSizeInQueue = std::max(MaxSizeInQueue, I->MaximumSize); + return MaxSizeInQueue; +} + /*}}}*/ diff --git a/methods/server.h b/methods/server.h index 1b81e3549..b974ec89a 100644 --- a/methods/server.h +++ b/methods/server.h @@ -50,6 +50,8 @@ struct ServerState URI Proxy; unsigned long TimeOut; + unsigned long long MaximumSize; + protected: ServerMethod *Owner; @@ -74,7 +76,7 @@ struct ServerState bool Comp(URI Other) const {return Other.Host == ServerName.Host && Other.Port == ServerName.Port;}; virtual void Reset() {Major = 0; Minor = 0; Result = 0; Code[0] = '\0'; Size = 0; JunkSize = 0; StartPos = 0; Encoding = Closes; time(&Date); HaveContent = false; - State = Header; Persistent = false; Pipeline = true;}; + State = Header; Persistent = false; Pipeline = true; MaximumSize = 0;}; virtual bool WriteResponse(std::string const &Data) = 0; /** \brief Transfer the data from the socket */ @@ -105,6 +107,10 @@ class ServerMethod : public pkgAcqMethod unsigned long PipelineDepth; bool AllowRedirect; + // Find the biggest item in the fetch queue for the checking of the maximum + // size + unsigned long long FindMaximumObjectSizeInQueue() const APT_PURE; + public: bool Debug; @@ -141,7 +147,7 @@ class ServerMethod : public pkgAcqMethod virtual ServerState * CreateServerState(URI uri) = 0; virtual void RotateDNS() = 0; - ServerMethod(const char *Ver,unsigned long Flags = 0) : pkgAcqMethod(Ver, Flags), Server(NULL), File(NULL), PipelineDepth(0), AllowRedirect(false), Debug(false) {}; + ServerMethod(const char *Ver,unsigned long Flags = 0) : pkgAcqMethod(Ver, Flags), Server(NULL), File(NULL), PipelineDepth(10), AllowRedirect(false), Debug(false) {}; virtual ~ServerMethod() {}; }; diff --git a/po/ChangeLog b/po/ChangeLog deleted file mode 100644 index 373ef4ca6..000000000 --- a/po/ChangeLog +++ /dev/null @@ -1,1077 +0,0 @@ -2009-09-26 Christian Perrier <bubulle@debian.org> - - * LINGUAS: re-disabled Hebrew translation on translator's request. - -2009-06-05 Jordi Mallach <jordi@debian.org> - - * ca.po: Updated to 539t - -2009-06-04 Milo Casagrande <milo@ubuntu.com> - - * it.po: Updated to 539t - -2009-06-01 Deng Xiyue <manphiz-guest@users.alioth.debian.org> - - * zh_CN.po: Updated to 539t - -2009-05-21 Marcos <marcos.alvarez.costales@gmail.com> - - * ast.po: Updated to 539t - -2009-04-28 Ivan Masár <helix84@centrum.sk> - - * sk.po: Updated to 539t - -2009-04-23 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 545 strings. - Formerly complete PO files are now 539t1f6u - * fr.po: updated to 545t. - -2009-03-19 Ivan Masár <helix84@centrum.sk> - - * sk.po: Updated to 539t - -2009-03-04 Daniel Nylander <po@danielnylander.se> - - * sv.po: Updated to 539t - -2009-02-23 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 539 strings. - Formerly complete PO files are now 538t1u - * fr.po: updated to 539t. - -2009-02-01 Hans Fredrik Nordhaug <hans@nordhaug.priv.no> - - * nb.po: updated to 539t. - -2009-01-27 Damyan Ivanov <dmn@debian.org> - - * bg.po: updated to 539t. - -2008-12-11 Christian Perrier <bubulle@debian.org> - - * fr.po: fix spelling error to "défectueux" - -2009-01-04 Tetralet <tetralet@gmail.com> - - * zh_TW.po: Added as 538t1u. - -2008-12-22 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: updated to 539t. - -2008-12-22 Jordi Mallach <jordi@debian.org> - - * ca.po: updated to 539t. - -2008-12-19 Marcelino Villarino <mvillarino@gmail.com> - - * gl.po: updated to 539t. - -2008-12-12 Tapio Lehtonen <tale@debian.org> - - * fi.po: updated to 539t. - -2008-12-06 Christian Perrier <bubulle@debian.org> - - * fr.po: dropped awful use of first person - -2008-11-23 Artem Bondarenko <artem.brz@gmail.com> - - * uk.po: updated to 477t55f7u - -2008-11-23 Sampada Nakhare <sampadanakhare@gmail.com> - - * mr.po: updated to 539t - -2008-11-21 Yuri Kozlov <kozlov.y@gmail.com> - - * ru.po: Update to 539t - -2008-11-18 Piarres Beobide <pi@beobide.net> - - * eu.po: updated to 539t. - -2008-11-17 Felipe Augusto van de Wiel (faw) <faw@debian.org> - - * pt_BR.po: updated to 539t. - -2008-11-17 Hans Fredrik Nordhaug <hans@nordhaug.priv.no> - - * nb.po: updated to 539t. - -2008-11-17 Miroslav Kure <kurem@upcase.inf.upol.cz> - - * cs.po: updated to 539t. - -2008-11-17 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: Updated to 539t - -2008-11-16 Javier Fernandez-Sanguino <jfs@debian.org> - - * es.po: updated to 539t - -2008-11-15 Deng Xiyue <manphiz-guest@users.alioth.debian.org> - - * zh_CN.po: updated to 539t. - -2008-11-15 Eddy Petrișor <eddy.petrisor@gmail.com> - - * ro.po: updated to 539t. - -2008-11-15 Javier Fernandez-Sanguino <jfs@debian.org> - - * es.po: updated to 536t3f2u - -2008-11-14 Holger Wansing <linux@wansing-online.de> - - * de.po: Updated to 539t - -2008-11-14 Wiktor Wandachowicz <siryes@gmail.com> - - * pl.po: Updated to 539t - -2008-11-14 Neil Williams <linux@codehelp.co.uk> - - * en_GB.po: Updated to 539t - -2008-11-14 Samuele Giovanni Tonon <samu@debian.org> - - * it.po: Updated to 539t - -2008-11-14 Jordi Mallach <jordi@debian.org> - - * ca.po: Updated to 539t - -2008-11-14 Changwoo Ryu <cwryu@debian.org> - - * ko.po: Updated to 539t - -2008-11-14 Kenshi Muto <kmuto@debian.org> - - * ja.po: Updated to 539t - -2008-11-14 Daniel Nylander <po@danielnylander.se> - - * sv.po: Updated to 539t - -2008-11-14 Ivan Masár <helix84@centrum.sk> - - * sk.po: Updated to 539t - -2008-11-13 Damyan Ivanov <dmn@debian.org> - - * bg.po: Updated to 538t1f - -2008-11-13 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 538 strings. - Formerly complete PO files are now 538t1f - * French translation re-completed - -2008-11-09 Theppitak Karoonboonyanan <thep@linux.thai.net> - - * th.po: updated to 540t. - -2008-11-06 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 540 strings. - Formerly complete PO files are now 538t1f1u - -2008-09-19 Jordi Mallach <jordi@debian.org> - - * ca.po: Update to 538t - -2008-09-16 Wiktor Wandachowicz <siryes@gmail.com> - - * pl.po: Update to 538t - -2008-09-16 Yuri Kozlov <kozlov.y@gmail.com> - - * ru.po: Update to 538t - -2008-09-12 Emmanuel Galatoulas <galaxico@quad-nrg.net> - - * el.po: Update to 538t - -2008-09-10 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: Updated to 538t - -2008-09-05 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: updated to 538t. - -2008-09-01 Hans Fredrik Nordhaug <hans@nordhaug.priv.no> - - * nb.po: updated to 538t. - -2008-08-31 Miroslav Kure <kurem@upcase.inf.upol.cz> - - * cs.po: updated to 538t. - -2008-08-28 Piarres Beobide <pi@beobide.net> - - * eu.po: updated to 538t. - -2008-08-26 Felipe Augusto van de Wiel (faw) <faw@debian.org> - - * pt_BR.po: updated to 538t. - -2008-08-18 Deng Xiyue <manphiz-guest@users.alioth.debian.org> - - * zh_CN.po: updated to 538t. - -2008-08-07 Serafeim Zanikolas <serzan@hellug.gr> - - * el.po: updated to 534t3f1u. - -2008-08-02 Gintautas Miliauskas <gintas@akl.lt> - - * lt.po: updated to 300t4f234u. - -2008-08-01 Kenshi Muto <kmuto@debian.org> - - * ja.po: updated to 538t. - -2008-07-28 Eddy Petrisor <eddy.petrisor@gmail.com> - - * ro.po: updated to 538t. - -2008-07-28 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: updated to 538t. - -2008-07-27 Ivan Masár <helix84@centrum.sk> - - * sk.po: Updated to 538t - -2008-07-26 Damyan Ivanov <dmn@debian.org> - - * bg.po: Updated to 538t - -2008-07-26 Christian Perrier <bubulle@debian.org> - - * fr.po: Updated to 538t - -2008-07-25 Michael Vogt <mvo@debian.org> - - * Update all PO files and apt-all.pot. 538 strings. - Formerly complete PO files are now 536t1f1u - -2008-07-21 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: Updated to 536t - -2008-07-19 Changwoo Ryu <cwryu@debian.org> - - * ko.po: Updated to 536t - -2008-07-12 Holger Wansing <linux@wansing-online.de> - - * de.po: corrected. - -2008-06-29 Asho Yeh <asho@debian.org.tw> - - * zh_TW.po: Updated to 536t - -2008-06-27 Eddy Petrisor <eddy.petrisor@gmail.com> - - * ro.po: updated to 536t. - -2008-05-14 Hans Fr. Nordhaug <hans@nordhaug.priv.no> - - * nb.po: updated to 536t. - -2008-05-11 SZERVÁC Attila <sas@321.hu> - - * hu.po: updated to 536t. - -2008-05-11 Felipe Augusto van de Wiel (faw) <faw@debian.org> - - * pt_BR.po: updated to 536t. - -2008-05-08 Erdal Ronahi <erdal dot ronahi at gmail dot com> - - * ku.po: updated to 136t25f343u - -2008-05-08 Bart Cornelis <cobaco@skolelinux.no> - - * nl.po: updated to 536t. - -2008-05-07 Jens Seidel <jensseidel@users.sf.net> - - * de.po: updated to 536t. - -2008-05-07 Peter Karlsson <peterk@debian.org> - - * sv.po: updated to 536t. - -2008-05-07 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: updated to 536t. - -2008-05-07 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: updated to 536t. - -2008-05-07 Yuri Kozlov <kozlov.y@gmail.com> - - * ru.po: updated to 536t. - -2008-05-07 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: updated to 536t. - -2008-05-06 Peter Mann <Peter.Mann@tuke.sk> - - * sk.po: updated to 536t. - -2008-05-06 Miroslav Kure <kurem@upcase.inf.upol.cz> - - * cs.po: updated to 536t. - -2008-05-06 Kenshi Muto <kmuto@debian.org> - - * ja.po: updated to 536t. - -2008-05-05 Piarres Beobide <pi@beobide.net> - - * eu.po: updated to 536t. - -2008-05-05 Sunjae Park <darehanl@gmail.com> - - * ko.po: updated to 536t. - -2008-05-05 Tapio Lehtonen <tale@debian.org> - - * fi.po: updated to 536t. - -2008-05-04 Damyan Ivanov <dmn@debiian.org> - - * bg.po: updated to 536t. - -2008-05-04 Samuele Giovanni Tonon <samu@debian.org> - - * it.po: updated to 536t. - -2008-05-04 Wiktor Wandachowicz <siryes@gmail.com> - - * pl.po: updated to 536t. - -2008-05-04 Theppitak Karoonboonyanan <thep@linux.thai.net> - - * th.po: updated to 536t. - -2008-05-04 Christian Perrier <bubulle@debian.org> - - * fr.po: updated to 536t. - -2008-05-04 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 536 strings. - Formerly complete PO files are now 535t1u (new string - from dselect/install. See #322470 - -2008-05-04 Deng Xiyue <manphiz-guest@users.alioth.debian.org> - - * zh_CN.po: updated to 535t. Closes: #473360 - -2008-05-03 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: updated to 535t. Closes: #479008 - -2008-04-19 Jacobo Tarrío <jtarrio@debian.org> - - * gl.po: updated to 536t. - -2008-04-16 Damyan Ivanov <dmn@debian.org> - - * bg.po: updated to 536t. - -2008-04-16 Christian Perrier <bubulle@debian.org> - - * fr.po: updated to 536t. - -2008-03-19 Ivan Masár <helix84@centrum.sk> - - * sk.po: updated to 536t. - -2008-03-06 Wiktor Wandachowicz <siryes@gmail.com>\ - - * pl.po: updated to 536t. - -2008-02-28 Peter Karlsson <peterk@debian.org> - - * sv.po: updated to 536t. - -2008-02-21 Jens Seidel <jensseidel@users.sf.net> - - * de.po: updated to 536t. Closes: #466842 - -2008-02-16 Deng Xiyue <manphiz-guest@users.alioth.debian.org> - - * zh_CN.po: updated to 536t. Closes: #465866 - -2008-02-13 Sunjae Park <darehanl@gmail.com> - - * ko.po: updated to 529t7f. Closes: #448430 - -2008-02-07 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: updated to 536t. Closes: #464575 - -2008-01-19 Christian Perrier <bubulle@debian.org> - - * Preventive unfuzzy files for a message aimed at fixing #452640 - -2008-01-19 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: updated to 536t. Closes: #461468 - -2008-01-17 Piarres Beobide <pi@beobide.net> - - * eu.po: updated to 536t. Closes: #461166 - -2008-01-13 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 536 strings. - Formerly complete PO files are now 534t2f but were - unfuzzied - -2008-01-04 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: updated to 536t. Closes: #459013 - -2008-01-02 Hans Fredrik Nordhaug <hans@nordhaug.priv.no> - - * nb.po: Updated to 536t. Closes: #457917 - -2007-12-29 Deng Xiyue <manphiz-guest@users.alioth.debian.org> - - * zh_CN.po: Updated to 536t. Closes: #458039 - -2007-12-18 Kenshi Muto <kmuto@debian.org> - - * ja.po: Updated to 536t. Closes: #456909 - -2007-12-17 Christian Perrier <bubulle@debian.org> - - * fr.po: completed to 536t. - -2007-12-17 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 536 strings. - Formerly complete PO files are now 530t6f - -2007-12-15 Christian Perrier <bubulle@debian.org> - - * fr.po: completed to 542t. - -2007-12-15 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 542 strings. - Formerly complete PO files are now 536t6f - -2007-12-01 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: updated to 536t. - -2007-11-27 Piarres Beobide <pi@beobide.net> - - * eu.po: updated to 536t. - -2007-11-01 Christian Perrier <bubulle@debian.org> - - * *.po: preventive unfuzzy after removal of an extra space - in a message "Stored label: %s\n" - -2007-10-30 Peter Karlsson <peterk@debian.org> - - * sv.po: updated to 536t. - -2007-10-29 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: updated to 536t. Closes: #448497 - -2007-10-29 Sunjae Park <darehanl@gmail.com> - - * ko.po: Updated to 536t. Closes: #448430 - -2007-10-28 Christian Perrier <bubulle@debian.org> - - * Add a bunch of languages that were not listed in LINGUAS: - Arabic, Dzongkha, Khmer, Marathi, Nepali, Thai - -2007-10-28 Christian Perrier <bubulle@debian.org> - - * fr.po: completed to 536t. - -2007-10-28 Christian Perrier <bubulle@debian.org> - - * Update all PO files and apt-all.pot. 536 strings. - Formerly complete PO files are now 532t3f1u - -2007-10-14 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: updated to 535t. Closes: #446626 - -2007-10-12 Peter Karlsson <peterk@debian.org> - - * sv.po: updated to 535t. - -2007-09-17 Theppitak Karoonboonyanan <thep@linux.thai.net> - - * th.po: added with 535t. Closes: #442833 - -2007-09-07 Claus Hindsgaul <claus.hindsgaul@gmail.com> - - * da.po: completed to 532t3f. Closes: #441102 - -2007-09-03 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: completed to 535t. Closes: #440611 - -2007-08-07 Piarres Beobide <pi@beobide.net> - - * eu.po: completed to 535t. Closes: #436425 - -2007-08-04 Christian Perrier <bubulle@debian.org> - - * fr.po: completed to 535t. - -2007-08-04 Christian Perrier <bubulle@debian.org> - - * Update all PO and the POT. Gives 529t6f for formerly - complete translations - -2007-07-11 Piarres Beobide <pi@beobide.net> - - * eu.po: completed to 532t. Closes: #423766 - -2007-07-06 Christian Perrier <bubulle@debian.org> - - * Update all PO and the POT. Gives 529t3f for formerly - complete translations - * Unfuzzy formerly complete translations (es, fr, gl, vi) - -2007-06-21 Javier Fernandez-Sanguino <jfs@debian.org> - - * es.po: completed to 532t, again. Closes: #429935 - -2007-06-21 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: completed to 532t, again. Closes: #429899 - -2007-06-19 Jacobo Tarrío <jtarrio@debian.org> - - * gl.po: completed to 532t. Closes: #429506 - -2007-06-13 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: completed to 532t. Closes: #428672 - -2007-06-12 Christian Perrier <bubulle@debian.org> - - * Update all PO and the POT. Gives 514t14f4u for formerly - complete translations - * fr.po: completed to 532t - -2007-06-12 Christian Perrier <bubulle@debian.org> - - * ku.po, uk.po, LINGUAS: reintegrate those translations - which disappeared from the BZR repositories - -2007-06-01 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: Updated to 515t. Closes: #426976 - -2007-05-13 Piarres Beobide <pi@beobide.net> - - * eu.po: Updated to 515t. Closes: #423766 - -2007-05-10 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: 515t. Closes: #423111 - -2007-05-08 Christian Perrier <bubulle@debian.org> - - * fr.po: Updated by Christian Perrier - -2007-05-08 Christian Perrier <bubulle@debian.org> - - * Update all PO and the POT. Gives 513t2f for formerly - complete translations - -2007-04-01 priti Patil <prithisd@gmail.com> - - * mr.po: New Marathi translation - Closes: #416806 - -2007-03-31 Kov Chai <tchaikov@sjtu.org> - - * zh_CN.po: Updated by Kov Chai - Closes: #416822 - -2007-03-29 eric pareja <xenos@upm.edu.ph> - - * tl.po: Updated by Eric Pareja - Closes: #416638 - -2007-02-28 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: Updated by Jacobo Tarrio - Closes: #412828 - -2007-02-03 Claus Hindsgaul <claus.hindsgaul@gmail.com> - - * da.po: Updated by Claus Hindsgaul - Closes: #409483 - -2007-01-29 Christian Perrier <bubulle@debian.org> - - * fr.po: Remove a non-breakable space for usability - issues. Closes: #408877 - -2006-12-12 Yuri Kozlov <kozlov.y@gmail.com> - - * ru.po: Updated Russian translation. Closes: #405476 - -2006-12-12 Christian Perrier <bubulle@debian.org> - - * *.po: Unfuzzy after upstream typo corrections - -2006-12-12 Eugeniy Meshcheryakov <eugen@debian.org> - - * uk.po: Updated Ukrainian translation: 495t16f3u - -2006-11-04 Artem Bondarenko <artem.brz@gmail.com> - - * uk.po: New Ukrainian translation: 483t28f3u - -2006-11-02 Emmanuel Galatoulas <galas@tee.gr> - - * el.po: Update to 503t9f2u - -2006-10-24 Michael Piefel <piefel@debian.org> - - * de.po: Updates and corrections. - -2006-10-22 Jordi Mallach <jordi@debian.org> - - * ca.po: Updated to 514t - -2006-10-22 Bart Cornelis <cobaco@linux.be> - - * be.po: Updated to 514t - -2006-10-21 Samuele Giovanni Tonon <samu@debian.org> - - * it.po: Updated to 514t - -2006-10-21 SZERVÁC Attila <sas@321.hu> - - * hu.po: Updated to 514t - -2006-10-21 Asho Yeh <asho@debian.org.tw> - - * zh_TW.po: Updated to 514t - -2006-10-21 Ossama M. Khayat <okhayat@yahoo.com> - - * ar.po: Updated to 293t221u. - -2006-10-16 Yuri Kozlov <kozlov.y@gmail.com> - - * ru.po: Updated to 514t. Closes: #392466 - -2006-10-16 Hans Fredrik Nordhaug <hans@nordhaug.priv.no> - - * nb.po: Updated to 514t. Closes: #392466 - -2006-10-15 Rui Az. <astronomy@mail.pt> - - * pt.po: Updated to 514t. Closes: #393199 - -2006-10-14 Christian Perrier <bubulle@debian.org> - - * fr.po: One spelling error corrected: s/accèder/accéder - -2006-10-13 Khoem Sokhem <khoemsokhem@khmeros.info> - - * km.po: Updated to 514t. - -2006-10-13 Sunjae Park <darehanl@gmail.com> - - * ko.po: Updated to 514t. - -2006-10-12 Yavor Doganov <yavor@doganov.org> - - * bg.po: Updated to 514t. - -2006-10-12 Michael Piefel <piefel@debian.org> - - * de.po: Updated to 514t. - -2006-10-12 Neil Williams <linux@codehelp.co.uk> - - * en_GB.po: Updated to 514t. - -2006-10-08 Javier Fernández-Sanguino Peña <jfs@computer.org> - - * es.po: Updated to 514t. Closes: #391661 - -2006-10-06 Claus Hindsgaul <claus.hindsgaul@gmail.com> - - * da.po: Updated to 514t. Closes: #391424 - -2006-10-04 Miroslav Kure <kurem@upcase.inf.upol.cz> - - * cs.po: Updated. Closes: #391064 - -2006-09-29 Tapio Lehtonen <tale@debian.org> - - * fi.po: Updated to 514t. Closes: #390149 - -2006-09-27 Piarres Beobide <pi@beobide.net> - - * eu.po: Updated to 514t. Closes: #389725 - -2006-09-21 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: Updated to 514t. Closes: #388555 - -2006-09-20 Sorin Batariuc <sorin@bonbon.net> - - * ro.po: Updated to 514t. Closes: #388402 - -2006-09-18 Kinley Tshering <gasepkuenden2k3@hotmail.com> - - * dz.po: Updated to 514t. Closes: #388184 - -2006-09-17 Davide Viti <zinosat@tiscali.it> - - * it.po: Fixed typos. Closes: #387812 - -2006-09-17 Erdal Ronahi <erdal.ronahi@gmail.com> - - * ku.po: New kurdish translation. Closes: #387766 - 71t40f403u - -2006-09-10 Peter Mann <Peter.Mann@tuke.sk> - - * sk.po: Updated to 514t. Closes: #386851 - -2006-09-08 Christian Perrier <bubulle@debian.org> - - * LINGUAS: re-enabled Hebrew translation on translator's request. - -2006-09-08 Kenshi Muto <kmuto@debian.org> - - * ja.po: Updated to 514t. Closes: #386537 - -2006-09-06 Jacobo Tarrio <jtarrio@debian.org> - - * gl.po: Updated to 514t. Closes: #386397 - -2006-09-02 Christian Perrier <bubulle@debian.org> - - * fr.po: Updated to 516t. - -2006-09-02 Christian Perrier <bubulle@debian.org> - - * fr.po: Updated to 516t. - -2006-08-20 Christian Perrier <bubulle@debian.org> - - * Update all PO and the POT. Gives 512t3f1uf for formerly - complete translations - -2006-08-13 Tapio Lehtonen <tale@debian.org> - - * fi.po: Updated to 512t. Closes: #382702 - -2006-07-19 Sunjae Park <darehanl@gmail.com> - - * ko.po: Updated to 512t. Closes: #378901 - -2006-07-02 SZERVAC Attila <sas@321.hu> - - * hu.po: Updated to 512t. Closes: #376330 - -2006-07-01 Leang Chumsoben <soben@khmeros.info> - - * km.po: New Khmer translation: 506t6f. Closes: #375068 - -2006-07-01 Shiva Pokharel <pokharelshiva@hotmail.com> - - * ne.po: New Nepali translation: 512t. Closes: #373729 - -2006-07-01 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: Updated to 512t. Closes: #368038 - -2006-07-01 Christian Perrier <bubulle@debian.org> - - * zh_TW.po: Remove an extra %s in one string. Closes: #370551 - -2006-07-01 Kinley Tshering <gasepkuenden2k3@hotmail.com> - - * dz.po: New Dzongkha translation: 512t - -2006-06-25 Sorin Batariuc <sorin@bonbon.net> - - * ro.po: Updated to 512t - -2006-06-21 Piarres Beobide <pi@beobide.net> - - * eu.po: Updated - -2006-06-07 Piarres Beobide <pi@beobide.net> - - * eu.po: Updated - -2006-05-29 Peter Mann <Peter.Mann@tuke.sk> - - * sk.po: Completed to 512t - -2006-05-28 Piarres Beobide <pi@beobide.net> - - * eu.po: Completed to 512t - -2006-05-17 Christian Perrier <bubulle@debian.org> - - * fr.po: Completed to 512t - -2006-05-17 Daniel Nylander <yeager@lidkoping.net> - - * sv.po: Completed to 512t - -2006-05-16 Christian Perrier <bubulle@debian.org> - - * Update all PO and the POT. Gives 506t6f for formerly - complete translations - -2006-04-01 Yavor Doganov <yavor@doganov.org> - - * bg.po: Added, complete to 512t. Closes: #360262 - -2006-03-16 eric pareja <xenos@upm.edu.ph> - - * tl.po: Completed to 512t. Closes: #357215 - -2006-03-13 Sorin Batariuc <sorin@bonbon.net> - - * ro.po: Completed to 512t. Closes: #355897 - -2006-03-12 Miguel Figueiredo <elmig@debianpt.org> - - * pt.po: Completed to 512t. Closes: #355798 - -2006-02-14 Carlos Z.F. Liu <carlosliu@users.sourceforge.net> - - * zh_CN.po: Completed to 512t. Closes: #353936 - -2006-02-14 Samuele Giovanni Tonon <samu@debian.org> - - * it.po: Completed to 512t. Closes: #352803 - -2006-02-13 Andre Luis Lopes <andrelop@debian.org> - - * ca.po: Completed to 512t. Closes: #352419 - -2006-02-06 Jordi Mallach <jordi@debian.org> - - * ca.po: Completed to 512t. Closes: #351592 - -2006-01-30 Piarres Beobide <pi@beobide.net> - - * eu.po: Completed to 512t. Closes: #350483 - -2006-01-24 Kenshi Muto <kmuto@debian.org> - - * ja.po: Completed to 512t. Closes: #349806 - -2006-01-23 Bartosz Fenski aka fEnIo <fenio@debian.org> - - * pl.po: Completed to 512t. Closes: #349514 - -2006-01-23 Peter Mann <Peter.Mann@tuke.sk> - - * sk.po: Completed to 512t. Closes: #349474 - -2006-01-23 Jacobo Tarrio <jtarrio@trasno.net> - - * gl.po: Completed to 512 strings - Closes: #349407 - -2006-01-22 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: Completed to 512 strings - -2006-01-21 Daniel Nylander <yeager@lidkoping.net> - - * sv.po: Completed to 512 strings - Closes: #349210 - -2006-01-21 Yuri Kozlov <kozlov.y@gmail.com> - - * ru.po: Completed to 512 strings - Closes: #349154 - -2006-01-21 Claus Hindsgaul <claus_h@image.dk> - - * da.po: Completed to 512 strings - Closes: #349084 - -2006-01-20 Christian Perrier <bubulle@debian.org> - - * fr.po: Completed to 512 strings - * LINGUAS: Add Welsh - -2006-01-20 Christian Perrier <bubulle@debian.org> - - * *.po: Updated from sources (512 strings) - -2006-01-20 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: Completed to 511 strings - Closes: #348968 - -2006-01-18 Konstantinos Margaritis <markos@debian.org> - - * el.po: Completed to 511 strings - Closes: #344642 - -2005-11-07 Claus Hindsgaul <claus_h@image.dk> - - * da.po: Completed to 511 strings - Closes: #348574 - -2005-11-16 Andrew Deason <adeason@tjhsst.edu> - - * en_GB.po: Minor errors correction - -2005-11-12 Ruben Porras <nahoo82@telefonica.net> - - * es.po: Updated to 510t1f - Closes: #348158 - -2005-11-12 Jacobo Tarrio <jacobo@tarrio.org> - - * gl.po: Completed to 511 strings - Closes: #347729 - -2006-01-10 Samuele Giovanni Tonon <samu@mclink.it> - - * it.po: Yet another update - Closes: #347435 - -2006-01-09 Jonas Koelker <jonaskoelker@users.sourceforge.net> - - * en_GB.po, de.po: fix spaces errors in "Ign " translations - Closes: #347258 - -2006-01-09 Thomas Huriaux <thomas.huriaux@gmail.com> - - * makefile: make update-po a pre-requisite of clean target so - that POT and PO files are always up-to-date - -2006-01-08 Daniel Nylander <yeager@lidkoping.net> - - * sv.po: Completed to 511t. Closes: #346450 - -2006-01-06 Peter Mann <Peter.Mann@tuke.sk> - - * sk.po: Completed to 511t. Closes: #346369 - -2006-01-06 Christian Perrier <bubulle@debian.org> - - * *.po: Updated from sources (511 strings) - * fr.po: Completed to 511t - -2006-01-01 Samuele Giovanni Tonon <samu@mclink.it> - - * it.po: Completed to 510t - -2006-01-01 Neil Williams <linux@codehelp.co.uk> - - * en_GB.po: Completed to 510t - -2005-12-30 Miroslav Kure <kurem@upcase.inf.upol.cz> - - * cs.po: Completed to 510t - -2005-12-25 Ming Hua <minghua@rice.edu> - - * zh_CN.po: Completed to 510t - -2005-12-25 Konstantinos Margaritis <markos@debian.org> - - * el.po: Updated to 510t - -2005-12-19 Clytie Siddall <clytie@riverland.net.au> - - * vi.po: Updated to 383t93f34u - -2005-12-19 eric pareja <xenos@upm.edu.ph> - - * tl.po: Completed to 510 strings - Closes: #344306 - -2005-12-19 Daniel Nylander <yeager@lidkoping.net> - - * sv.po: Completed to 510 strings - Closes: #344056 - -2005-11-29 Christian Perrier <bubulle@debian.org> - - * LINGUAS: disabled Hebrew translation. Closes: #313283 - -2005-12-05 Piarres Beobide <pi@beobide.net> - - * eu.po: Completed to 510 strings - Closes: #342091 - -2005-11-29 Christian Perrier <bubulle@debian.org> - - * fr.po: Completed to 510 strings - * *.po : Synced with the POT files - -2005-11-14 Kov Tchai <tchaikov@sjtu.edu.cn> - - * zh_CN.po: Completed to 510 strings - Definitely Closes: #338267 - -2005-11-13 Kov Tchai <tchaikov@sjtu.edu.cn> - - * zh_CN.po: Completed to 507 strings - Closes: #338267 - -2005-11-09 Jacobo Tarrio <jacobo@tarrio.org> - - * gl.po: Completed to 510 strings - Closes: #338356 - -2005-11-08 Piarres Beobide <pi@beobide.net> - - * eu.po: Completed to 510 strings - Closes: #338101 - -2005-11-07 Claus Hindsgaul <claus_h@image.dk> - - * da.po: Completed to 510 strings - Closes: #337949 - -2005-11-04 Eric Pareja <xenos@upm.edu.ph> - - * tl.po: Completed to 510 strings - Closes: #337306 - -2005-11-04 Christian Perrier <bubulle@debian.org> - - * Changelog: added to better track down fixed issues - diff --git a/po/apt-all.pot b/po/apt-all.pot index 3822dd9db..4e91a8e33 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -901,7 +901,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -913,7 +913,7 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" +msgid "Unknown error executing apt-key" msgstr "" #: methods/gpgv.cc:217 methods/gpgv.cc:224 @@ -1515,7 +1515,7 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " +msgid "Calculating upgrade" msgstr "" #: apt-private/private-upgrade.cc:28 @@ -2344,12 +2344,7 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" +msgid "Unable to parse package file %s (%d)" msgstr "" #: apt-pkg/indexrecords.cc:78 @@ -914,7 +914,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -926,7 +926,7 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" +msgid "Unknown error executing apt-key" msgstr "" #: methods/gpgv.cc:217 methods/gpgv.cc:224 @@ -1541,8 +1541,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "حساب الترقية..." +msgid "Calculating upgrade" +msgstr "حساب الترقية" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2380,12 +2380,7 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" +msgid "Unable to parse package file %s (%d)" msgstr "" #: apt-pkg/indexrecords.cc:78 @@ -1021,8 +1021,8 @@ msgid "At least one invalid signature was encountered." msgstr "Atopóse polo menos una robla mala." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Nun pudo executase 'gpgv' pa verificar la robla (¿ta instaláu gpgv?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Nun pudo executase 'apt-key' pa verificar la robla (¿ta instaláu gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1033,8 +1033,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Fallu desconocíu al executar gpgv" +msgid "Unknown error executing apt-key" +msgstr "Fallu desconocíu al executar apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1669,8 +1669,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calculando l'anovamientu... " +msgid "Calculating upgrade" +msgstr "Calculando l'anovamientu" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2536,13 +2536,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Nun se pudo tratar el ficheru de paquetes %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Nun se pudo tratar el ficheru de paquetes %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Nun se pudo tratar el ficheru de paquetes %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1051,10 +1051,10 @@ msgid "At least one invalid signature was encountered." msgstr "Намерен е поне един невалиден подпис." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Неуспех при изпълнение на „gpgv“ за проверка на подписа (инсталиран ли е " -"gpgv?)" +"Неуспех при изпълнение на „apt-key“ за проверка на подписа (инсталиран ли е " +"gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1065,8 +1065,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Неизвестна грешка при изпълнението на gpgv" +msgid "Unknown error executing apt-key" +msgstr "Неизвестна грешка при изпълнението на apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1706,8 +1706,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Изчисляване на актуализацията..." +msgid "Calculating upgrade" +msgstr "Изчисляване на актуализацията" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2581,13 +2581,8 @@ msgstr "Изпълняване на външна програма за удов #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Неуспех при анализирането на пакетен файл %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Неуспех при анализирането на пакетен файл %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Неуспех при анализирането на пакетен файл %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -920,7 +920,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -932,7 +932,7 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" +msgid "Unknown error executing apt-key" msgstr "" #: methods/gpgv.cc:217 methods/gpgv.cc:224 @@ -1541,8 +1541,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Računam nadogradnju..." +msgid "Calculating upgrade" +msgstr "Računam nadogradnju" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2375,12 +2375,7 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" +msgid "Unable to parse package file %s (%d)" msgstr "" #: apt-pkg/indexrecords.cc:78 @@ -1034,10 +1034,10 @@ msgid "At least one invalid signature was encountered." msgstr "S'ha trobat almenys una signatura invàlida." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"No s'ha pogut executar el «gpgv» per a verificar la signatura (està " -"instaŀlat el gpgv?)" +"No s'ha pogut executar el «apt-key» per a verificar la signatura (està " +"instaŀlat el gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1048,8 +1048,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "S'ha produït un error desconegut en executar el gpgv" +msgid "Unknown error executing apt-key" +msgstr "S'ha produït un error desconegut en executar el apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1694,8 +1694,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "S'està calculant l'actualització… " +msgid "Calculating upgrade" +msgstr "S'està calculant l'actualització" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2576,13 +2576,8 @@ msgstr "Executa un resoledor extern" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "No es pot analitzar el fitxer del paquet %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "No es pot analitzar el fitxer del paquet %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "No es pot analitzar el fitxer del paquet %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1062,8 +1062,8 @@ msgid "At least one invalid signature was encountered." msgstr "Byl zaznamenán nejméně jeden neplatný podpis. " #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Nelze spustit „gpgv“ pro ověření podpisu (je gpgv nainstalováno?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Nelze spustit „apt-key“ pro ověření podpisu (je gnupg nainstalováno?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1076,8 +1076,8 @@ msgstr "" "ověření?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Neznámá chyba při spouštění gpgv" +msgid "Unknown error executing apt-key" +msgstr "Neznámá chyba při spouštění apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1720,8 +1720,8 @@ msgid "Full Text Search" msgstr "Fulltextové hledání" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Propočítává se aktualizace… " +msgid "Calculating upgrade" +msgstr "Propočítává se aktualizace" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2579,13 +2579,8 @@ msgstr "Spuštění externího řešitele" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Nelze zpracovat soubor %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Nelze zpracovat soubor %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Nelze zpracovat soubor %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1042,7 +1042,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1054,7 +1054,7 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" +msgid "Unknown error executing apt-key" msgstr "" #: methods/gpgv.cc:217 methods/gpgv.cc:224 @@ -1694,8 +1694,8 @@ msgstr "" #: apt-private/private-upgrade.cc:25 #, fuzzy -msgid "Calculating upgrade... " -msgstr "Yn Cyfrifo'r Uwchraddiad... " +msgid "Calculating upgrade" +msgstr "Yn Cyfrifo'r Uwchraddiad" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2575,16 +2575,10 @@ msgstr "" msgid "Execute external solver" msgstr "" -# FIXME: number? #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Ni ellir gramadegu ffeil becynnau %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Ni ellir gramadegu ffeil becynnau %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Ni ellir gramadegu ffeil becynnau %s (%d)" # FIXME: number? #: apt-pkg/indexrecords.cc:78 @@ -1075,9 +1075,9 @@ msgid "At least one invalid signature was encountered." msgstr "Stødte på mindst én ugyldig signatur." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Kunne ikke køre »gpgv« for at verificere signaturen (er gpgv installeret?)" +"Kunne ikke køre »apt-key« for at verificere signaturen (er gnupg installeret?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1090,8 +1090,8 @@ msgstr "" "autentificering?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Ukendt fejl ved kørsel af gpgv" +msgid "Unknown error executing apt-key" +msgstr "Ukendt fejl ved kørsel af apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1734,8 +1734,8 @@ msgid "Full Text Search" msgstr "Fuldtekst-søgning" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Beregner opgraderingen ... " +msgid "Calculating upgrade" +msgstr "Beregner opgraderingen" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2602,13 +2602,8 @@ msgstr "Kør ekstern problemløser" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Kunne ikke tolke pakkefilen %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Kunne ikke tolke pakkefilen %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Kunne ikke tolke pakkefilen %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1113,9 +1113,9 @@ msgid "At least one invalid signature was encountered." msgstr "Mindestens eine ungültige Signatur wurde entdeckt." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"»gpgv« konnte zur Überprüfung der Signatur nicht ausgeführt werden (ist gpgv " +"»apt-key« konnte zur Überprüfung der Signatur nicht ausgeführt werden (ist gnupg " "installiert?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1129,8 +1129,8 @@ msgstr "" "das Netzwerk eine Authentifizierung?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Unbekannter Fehler beim Ausführen von gpgv" +msgid "Unknown error executing apt-key" +msgstr "Unbekannter Fehler beim Ausführen von apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1796,8 +1796,8 @@ msgid "Full Text Search" msgstr "Volltextsuche" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Paketaktualisierung (Upgrade) wird berechnet... " +msgid "Calculating upgrade" +msgstr "Paketaktualisierung (Upgrade) wird berechnet" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2689,13 +2689,8 @@ msgstr "Externen Problemlöser ausführen" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Paketdatei %s konnte nicht verarbeitet werden (1)." - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Paketdatei %s konnte nicht verarbeitet werden (2)." +msgid "Unable to parse package file %s (%d)" +msgstr "Paketdatei %s konnte nicht verarbeitet werden (%d)." #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1016,9 +1016,9 @@ msgstr "ཉུང་མཐའ་རང་ནུས་མེད་ཀྱི་མ #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"མིང་རྟགས་བདེན་སྦྱོར་འབད་ནི་ལུ་'%s'འདི་ལག་ལེན་འཐབ་མ་ཚུགས། (gpgv་དེ་ཁཞི་བཙུགས་འབད་ཡོདཔ་ཨིན་ན།?)" +"མིང་རྟགས་བདེན་སྦྱོར་འབད་ནི་ལུ་'%s'འདི་ལག་ལེན་འཐབ་མ་ཚུགས། (gnupg་དེ་ཁཞི་བཙུགས་འབད་ཡོདཔ་ཨིན་ན།?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1029,8 +1029,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "gpgv་ལག་ལེན་འཐབ་ནི་ལུ་མ་ཤེས་པའི་འཛོལ་བ་།" +msgid "Unknown error executing apt-key" +msgstr "apt-key་ལག་ལེན་འཐབ་ནི་ལུ་མ་ཤེས་པའི་འཛོལ་བ་།" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1659,8 +1659,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "ཡར་བསྐྱེད་རྩིས་བཏོན་དོ་... " +msgid "Calculating upgrade" +msgstr "ཡར་བསྐྱེད་རྩིས་བཏོན་དོ་" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2522,13 +2522,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "%s (༡་)་ཐུམ་སྒྲིལ་ཡིག་སྣོད་འདི་མིང་དཔྱད་འབད་མ་ཚུགས།" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "%s (༢་)་ཐུམ་སྒྲིལ་ཡིག་སྣོད་འདི་མིང་དཔྱད་འབད་མ་ཚུགས།" +msgid "Unable to parse package file %s (%d)" +msgstr "%s (%d)་ཐུམ་སྒྲིལ་ཡིག་སྣོད་འདི་མིང་དཔྱད་འབད་མ་ཚུགས།" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1028,10 +1028,10 @@ msgstr "Βρέθηκε τουλάχιστον μια μη έγκυρη υπογ #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" "Αδυναμία εκτέλεσης του '%s' για την επαλήθευση της υπογραφής (είναι " -"εγκατεστημένο το gpgv;)" +"εγκατεστημένο το gnupg;)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1042,8 +1042,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Άγνωστο σφάλμα κατά την εκτέλεση του gpgv" +msgid "Unknown error executing apt-key" +msgstr "Άγνωστο σφάλμα κατά την εκτέλεση του apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1681,8 +1681,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Υπολογισμός της αναβάθμισης... " +msgid "Calculating upgrade" +msgstr "Υπολογισμός της αναβάθμισης" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2549,13 +2549,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Αδύνατη η ανάλυση του αρχείου πακέτου %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Αδύνατη η ανάλυση του αρχείου πακέτου %s (2)" +msgid "Unable to parse package file %s (%s)" +msgstr "Αδύνατη η ανάλυση του αρχείου πακέτου %s (%s)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1148,9 +1148,9 @@ msgid "At least one invalid signature was encountered." msgstr "Se encontró al menos una firma inválida." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"No se pudo ejecutar «gpgv» para verificar la firma (¿está instalado gpgv?)" +"No se pudo ejecutar «apt-key» para verificar la firma (¿está instalado gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1163,8 +1163,8 @@ msgstr "" "autenticación?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Error desconocido ejecutando «gpgv»" +msgid "Unknown error executing apt-key" +msgstr "Error desconocido ejecutando «apt-key»" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1805,8 +1805,8 @@ msgid "Full Text Search" msgstr "Buscar en todo el texto" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calculando la actualización... " +msgid "Calculating upgrade" +msgstr "Calculando la actualización" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2687,13 +2687,8 @@ msgstr "Ejecutar solucionador externo" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "No se pudo tratar el archivo de paquetes %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "No se pudo tratar el archivo de paquetes %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "No se pudo tratar el archivo de paquetes %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1017,8 +1017,8 @@ msgstr "Beintza sinadura baliogabe bat aurkitu da." #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Ezin da %s abiarazi sinadura egiaztatzeko (gpgv instalaturik al dago?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Ezin da %s abiarazi sinadura egiaztatzeko (gnupg instalaturik al dago?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1029,8 +1029,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Errore ezezaguna gpgv exekutatzean" +msgid "Unknown error executing apt-key" +msgstr "Errore ezezaguna apt-key exekutatzean" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1663,8 +1663,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Berriketak kalkulatzen... " +msgid "Calculating upgrade" +msgstr "Berriketak kalkulatzen" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2520,13 +2520,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Ezin da %s pakete fitxategia analizatu (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Ezin da %s pakete fitxategia analizatu (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Ezin da %s pakete fitxategia analizatu (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1008,9 +1008,9 @@ msgstr "LÖytyi ainakin yksi kelvoton allekirjoitus." #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Ei käynnistynyt \"%s\" allekirjoitusta tarkistamaan (onko gpgv asennettu?)" +"Ei käynnistynyt \"%s\" allekirjoitusta tarkistamaan (onko gnupg asennettu?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1021,8 +1021,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Tapahtui tuntematon virhe suoritettaessa gpgv" +msgid "Unknown error executing apt-key" +msgstr "Tapahtui tuntematon virhe suoritettaessa apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1655,8 +1655,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Käsitellään päivitystä ... " +msgid "Calculating upgrade" +msgstr "Käsitellään päivitystä" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2514,13 +2514,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Pakettitiedostoa %s (1) ei voi jäsentää" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Pakettitiedostoa %s (2) ei voi jäsentää" +msgid "Unable to parse package file %s (%d)" +msgstr "Pakettitiedostoa %s ei voi jäsentää (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1088,10 +1088,10 @@ msgid "At least one invalid signature was encountered." msgstr "Au moins une signature non valable a été rencontrée." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Impossible d'exécuter « gpgv » pour contrôler la signature (veuillez " -"vérifier si gpgv est installé)." +"Impossible d'exécuter « apt-key » pour contrôler la signature (veuillez " +"vérifier si gnupg est installé)." #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1104,8 +1104,8 @@ msgstr "" "Peut-être le réseau nécessite-t-il une authentification." #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Erreur inconnue à l'exécution de gpgv" +msgid "Unknown error executing apt-key" +msgstr "Erreur inconnue à l'exécution de apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1760,8 +1760,8 @@ msgid "Full Text Search" msgstr "Recherche en texte intégral" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calcul de la mise à jour... " +msgid "Calculating upgrade" +msgstr "Calcul de la mise à jour" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2657,13 +2657,8 @@ msgstr "Exécution du solveur externe" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Impossible de traiter le fichier %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Impossible de traiter le fichier %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Impossible de traiter le fichier %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1032,10 +1032,10 @@ msgid "At least one invalid signature was encountered." msgstr "Atopouse polo menos unha sinatura incorrecta." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Non é posíbel executar «gpgv» para verificar a sinatura (Está instalado " -"gpgv?)" +"Non é posíbel executar «apt-key» para verificar a sinatura (Está instalado " +"gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1046,8 +1046,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Produciuse un erro descoñecido ao executar gpgv" +msgid "Unknown error executing apt-key" +msgstr "Produciuse un erro descoñecido ao executar apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1692,8 +1692,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calculando a anovación... " +msgid "Calculating upgrade" +msgstr "Calculando a anovación" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2566,13 +2566,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Non é posíbel analizar o ficheiro de paquetes %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Non é posíbel analizar o ficheiro de paquetes %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Non é posíbel analizar o ficheiro de paquetes %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1006,7 +1006,7 @@ msgid "Recommended packages:" msgstr "" #: cmdline/apt-get.cc:1965 -msgid "Calculating upgrade... " +msgid "Calculating upgrade" msgstr "" #: cmdline/apt-get.cc:1968 methods/ftp.cc:708 methods/connect.cc:112 @@ -1810,11 +1810,11 @@ msgstr "" #: methods/gpgv.cc:232 #, c-format -msgid "Could not execute '%s' to verify signature (is gpgv installed?)" +msgid "Could not execute '%s' to verify signature (is gnupg installed?)" msgstr "" #: methods/gpgv.cc:237 -msgid "Unknown error executing gpgv" +msgid "Unknown error executing apt-key" msgstr "" #: methods/gpgv.cc:271 methods/gpgv.cc:278 @@ -2259,12 +2259,7 @@ msgstr "כשלון בפענוח %s" #: apt-pkg/tagfile.cc:102 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "" - -#: apt-pkg/tagfile.cc:189 -#, c-format -msgid "Unable to parse package file %s (2)" +msgid "Unable to parse package file %s (%d)" msgstr "" #: apt-pkg/sourcelist.cc:90 @@ -1050,9 +1050,9 @@ msgid "At least one invalid signature was encountered." msgstr "Legalább egy aláírás érvénytelen." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Nem indítható el a „gpgv” az aláírás ellenőrzéséhez (telepítve van a gpgv?)" +"Nem indítható el a „apt-key” az aláírás ellenőrzéséhez (telepítve van a gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1063,8 +1063,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Ismeretlen gpgv futtatási hiba" +msgid "Unknown error executing apt-key" +msgstr "Ismeretlen apt-key futtatási hiba" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1699,8 +1699,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Frissítés kiszámítása... " +msgid "Calculating upgrade" +msgstr "Frissítés kiszámítása" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2568,13 +2568,8 @@ msgstr "Külső solver végrehajtása" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Nem lehet a(z) %s csomagfájlt feldolgozni (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Nem lehet a(z) %s csomagfájlt feldolgozni (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Nem lehet a(z) %s csomagfájlt feldolgozni (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1093,9 +1093,9 @@ msgid "At least one invalid signature was encountered." msgstr "È stata trovata almeno una firma non valida." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Impossibile eseguire \"gpgv\" per verificare la firma (forse gpgv non è " +"Impossibile eseguire \"apt-key\" per verificare la firma (forse gnupg non è " "installato)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1109,8 +1109,8 @@ msgstr "" "richiede autenticazione?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Errore sconosciuto durante l'esecuzione di gpgv" +msgid "Unknown error executing apt-key" +msgstr "Errore sconosciuto durante l'esecuzione di apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1758,8 +1758,8 @@ msgid "Full Text Search" msgstr "Ricerca sul testo" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calcolo dell'aggiornamento... " +msgid "Calculating upgrade" +msgstr "Calcolo dell'aggiornamento" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2647,13 +2647,8 @@ msgstr "Esecuzione solver esterno" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Impossibile analizzare il file di pacchetto %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Impossibile analizzare il file di pacchetto %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Impossibile analizzare il file di pacchetto %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1084,9 +1084,9 @@ msgid "At least one invalid signature was encountered." msgstr "少なくとも 1 つの不正な署名が発見されました。" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"署名を検証するための 'gpgv' の実行ができませんでした (gpgv はインストールされ" +"署名を検証するための 'apt-key' の実行ができませんでした (gnupg はインストールされ" "ていますか?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1100,8 +1100,8 @@ msgstr "" "が必要?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "gpgv の実行中に未知のエラーが発生" +msgid "Unknown error executing apt-key" +msgstr "apt-key の実行中に未知のエラーが発生" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1736,8 +1736,8 @@ msgid "Full Text Search" msgstr "全文検索" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "アップグレードパッケージを検出しています ... " +msgid "Calculating upgrade" +msgstr "アップグレードパッケージを検出しています" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2610,13 +2610,8 @@ msgstr "外部ソルバを実行" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "パッケージファイル %s を解釈することができません (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "パッケージファイル %s を解釈することができません (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "パッケージファイル %s を解釈することができません (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1005,8 +1005,8 @@ msgstr "បានជួបប្រទះហត្ថលេខ #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "មិនអាចប្រតិបត្តិ '%s' ដើម្បីផ្ទៀងផ្ទាត់ហត្ថលេខា (តើ gpgv ត្រូវបានដំឡើងឬនៅ ?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "មិនអាចប្រតិបត្តិ '%s' ដើម្បីផ្ទៀងផ្ទាត់ហត្ថលេខា (តើ gnupg ត្រូវបានដំឡើងឬនៅ ?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1017,8 +1017,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "មិនស្គាល់កំហុស ក្នុងការប្រតិបត្តិ gpgv" +msgid "Unknown error executing apt-key" +msgstr "មិនស្គាល់កំហុស ក្នុងការប្រតិបត្តិ apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1638,8 +1638,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "កំពុងគណនាការធ្វើឲ្យប្រសើរ... " +msgid "Calculating upgrade" +msgstr "កំពុងគណនាការធ្វើឲ្យប្រសើរ" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2489,13 +2489,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "មិនអាចញែកឯកសារកញ្ចប់ %s (1) បានឡើយ" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "មិនអាចញែកឯកសារកញ្ចប់ %s (2) បានឡើយ" +msgid "Unable to parse package file %s (%d)" +msgstr "មិនអាចញែកឯកសារកញ្ចប់ %s (%d) បានឡើយ" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1011,9 +1011,9 @@ msgid "At least one invalid signature was encountered." msgstr "최소한 하나 이상의 서명이 잘못되었습니다." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"서명을 확인하는 'gpgv' 프로그램을 실행할 수 없습니다. (gpgv를 설치했습니까?)" +"서명을 확인하는 'apt-key' 프로그램을 실행할 수 없습니다. (gnupg를 설치했습니까?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1024,8 +1024,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "gpgv 실행 도중 알 수 없는 오류 발생" +msgid "Unknown error executing apt-key" +msgstr "apt-key 실행 도중 알 수 없는 오류 발생" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1651,8 +1651,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "업그레이드를 계산하는 중입니다... " +msgid "Calculating upgrade" +msgstr "업그레이드를 계산하는 중입니다" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2507,13 +2507,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "패키지 파일 %s 파일을 파싱할 수 없습니다 (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "패키지 파일 %s 파일을 파싱할 수 없습니다 (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "패키지 파일 %s 파일을 파싱할 수 없습니다 (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -923,7 +923,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -935,8 +935,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Di xebitandina gpgv de çewtiya nenas" +msgid "Unknown error executing apt-key" +msgstr "Di xebitandina apt-key de çewtiya nenas" #: methods/gpgv.cc:217 methods/gpgv.cc:224 #, fuzzy @@ -1544,8 +1544,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Bilindkirin tê hesibandin..." +msgid "Calculating upgrade" +msgstr "Bilindkirin tê hesibandin" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2378,12 +2378,7 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, fuzzy, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Pakêt nehate dîtin %s" - -#: apt-pkg/tagfile.cc:237 -#, fuzzy, c-format -msgid "Unable to parse package file %s (2)" +msgid "Unable to parse package file %s (%d)" msgstr "Pakêt nehate dîtin %s" #: apt-pkg/indexrecords.cc:78 @@ -928,7 +928,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -940,8 +940,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Nežinoma klaida kviečiant gpgv" +msgid "Unknown error executing apt-key" +msgstr "Nežinoma klaida kviečiant apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1563,8 +1563,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Skaičiuojami atnaujinimai... " +msgid "Calculating upgrade" +msgstr "Skaičiuojami atnaujinimai" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2409,12 +2409,7 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" +msgid "Unable to parse package file %s (%d)" msgstr "" #: apt-pkg/indexrecords.cc:78 @@ -1002,9 +1002,9 @@ msgstr "किमान एक अवैध सही सापडली." #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"सहीची खात्री करण्यासाठी '%s' कार्यान्वित करू शकत नाही (gpgv संस्थापित केले आहे का?)" +"सहीची खात्री करण्यासाठी '%s' कार्यान्वित करू शकत नाही (gnupg संस्थापित केले आहे का?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1015,8 +1015,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "gpgv कार्यान्वित होत असताना अपरिचित त्रुटी" +msgid "Unknown error executing apt-key" +msgstr "apt-key कार्यान्वित होत असताना अपरिचित त्रुटी" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1642,8 +1642,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "पुढिल आवृत्तीची गणती करीत आहे..." +msgid "Calculating upgrade" +msgstr "पुढिल आवृत्तीची गणती करीत आहे" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2501,13 +2501,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "%s (1) पॅकेज फाईल पार्स करण्यात असमर्थ" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "%s (२) पॅकेज फाईल पार्स करण्यात असमर्थ" +msgid "Unable to parse package file %s (%d)" +msgstr "%s पॅकेज फाईल पार्स करण्यात असमर्थ (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1017,9 +1017,9 @@ msgid "At least one invalid signature was encountered." msgstr "Minst en ugyldig signatur ble funnet." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Klarte ikke kjøre «gpgv» for å verifisere signaturen (er gpgv installert?)" +"Klarte ikke kjøre «apt-key» for å verifisere signaturen (er gnupg installert?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1030,8 +1030,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Ukjent feil ved kjøring av gpgv" +msgid "Unknown error executing apt-key" +msgstr "Ukjent feil ved kjøring av apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1669,8 +1669,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Beregner oppgradering... " +msgid "Calculating upgrade" +msgstr "Beregner oppgradering" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2530,13 +2530,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Klarer ikke å fortolke pakkefila %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Klarer ikke å fortolke pakkefila %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Klarer ikke å fortolke pakkefila %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1003,8 +1003,8 @@ msgstr "कम्तिमा एउटा अवैध हस्ताक्ष #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "हस्ताक्षर रूजू गर्न '%s' कार्यन्वयन गर्न सकिएन (के gpgv स्थापना भयो?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "हस्ताक्षर रूजू गर्न '%s' कार्यन्वयन गर्न सकिएन (के gnupg स्थापना भयो?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1015,8 +1015,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "gpgv कार्यन्वयन गर्दा अज्ञात त्रुटि" +msgid "Unknown error executing apt-key" +msgstr "apt-key कार्यन्वयन गर्दा अज्ञात त्रुटि" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1638,8 +1638,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "स्तर वृद्धि गणना गरिदैछ..." +msgid "Calculating upgrade" +msgstr "स्तर वृद्धि गणना गरिदैछ" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2492,13 +2492,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "प्याकेज फाइल पद वर्णन गर्न असक्षम %s (१)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "प्याकेज फाइल पद वर्णन गर्न असक्षम %s (२)" +msgid "Unable to parse package file %s (%d)" +msgstr "प्याकेज फाइल पद वर्णन गर्न असक्षम %s (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1095,9 +1095,9 @@ msgid "At least one invalid signature was encountered." msgstr "Er is tenminste één ongeldige ondertekening gevonden." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Kon 'gpgv' niet uitvoeren om ondertekening te verifiëren (is gpgv " +"Kon 'apt-key' niet uitvoeren om ondertekening te verifiëren (is gnupg " "geïnstalleerd?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1111,8 +1111,8 @@ msgstr "" "het netwerk authenticatie?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Onbekende fout bij het uitvoeren van gpgv" +msgid "Unknown error executing apt-key" +msgstr "Onbekende fout bij het uitvoeren van apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1762,8 +1762,8 @@ msgid "Full Text Search" msgstr "Volledige tekst doorzoeken" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Opwaardering wordt doorgerekend... " +msgid "Calculating upgrade" +msgstr "Opwaardering wordt doorgerekend" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2653,13 +2653,8 @@ msgstr "Externe oplosser uitvoeren" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Kon pakketbestand %s niet ontleden (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Kon pakketbestand %s niet ontleden (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Kon pakketbestand %s niet ontleden (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1012,7 +1012,7 @@ msgid "At least one invalid signature was encountered." msgstr "" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1024,7 +1024,7 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" +msgid "Unknown error executing apt-key" msgstr "" #: methods/gpgv.cc:217 methods/gpgv.cc:224 @@ -1654,8 +1654,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Reknar ut oppgradering ... " +msgid "Calculating upgrade" +msgstr "Reknar ut oppgradering" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2512,13 +2512,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Klarte ikkje tolka pakkefila %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Klarte ikkje tolka pakkefila %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Klarte ikkje tolka pakkefila %s (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1060,9 +1060,9 @@ msgid "At least one invalid signature was encountered." msgstr "Napotkano przynajmniej jeden nieprawidłowy podpis." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Nie udało się uruchomić gpgv by zweryfikować podpis (czy gpgv jest " +"Nie udało się uruchomić apt-key by zweryfikować podpis (czy gnupg jest " "zainstalowane?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1074,8 +1074,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Nieznany błąd podczas uruchamiania gpgv" +msgid "Unknown error executing apt-key" +msgstr "Nieznany błąd podczas uruchamiania apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1734,8 +1734,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Obliczanie aktualizacji..." +msgid "Calculating upgrade" +msgstr "Obliczanie aktualizacji" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2608,13 +2608,8 @@ msgstr "Wykonywanie zewnętrznego mechanizmu rozwiązywania zależności" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Nie udało się zanalizować pliku pakietu %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Nie udało się zanalizować pliku pakietu %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Nie udało się zanalizować pliku pakietu %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1050,9 +1050,9 @@ msgid "At least one invalid signature was encountered." msgstr "Pelo menos uma assinatura inválida foi encontrada." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Não foi possível executar 'gpgv' para verificar a assinatura (o gpgv está " +"Não foi possível executar 'apt-key' para verificar a assinatura (o gnupg está " "instalado?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1064,8 +1064,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Erro desconhecido ao executar gpgv" +msgid "Unknown error executing apt-key" +msgstr "Erro desconhecido ao executar apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1704,8 +1704,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "A calcular a actualização... " +msgid "Calculating upgrade" +msgstr "A calcular a actualização" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2591,13 +2591,8 @@ msgstr "Executar resolvedor externo" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Não foi possível fazer parse ao ficheiro do pacote %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Não foi possível fazer parse ao ficheiro de pacote %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Não foi possível fazer parse ao ficheiro do pacote %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format diff --git a/po/pt_BR.po b/po/pt_BR.po index f50171edc..96bbf0a65 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1023,9 +1023,9 @@ msgstr "Ao menos uma assinatura inválida foi encontrada." #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Não foi possível executar '%s' para verificar a assinatura (o gpgv está " +"Não foi possível executar '%s' para verificar a assinatura (o gnupg está " "instalado?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' @@ -1037,8 +1037,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Erro desconhecido executando gpgv" +msgid "Unknown error executing apt-key" +msgstr "Erro desconhecido executando apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1673,8 +1673,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calculando atualização... " +msgid "Calculating upgrade" +msgstr "Calculando atualização" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2546,13 +2546,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Impossível analisar arquivo de pacote %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Impossível analisar arquivo de pacote %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Impossível analisar arquivo de pacote %s (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1024,9 +1024,9 @@ msgstr "Cel puțin o semnătură nevalidă a fost întâlnită." #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Nu s-a putut executa „%s” pentru verificarea semnăturii (gpgv este instalat?)" +"Nu s-a putut executa „%s” pentru verificarea semnăturii (gnupg este instalat?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1037,8 +1037,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Eroare necunoscută în timp ce se execută gpgv" +msgid "Unknown error executing apt-key" +msgstr "Eroare necunoscută în timp ce se execută apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1680,8 +1680,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Calculez înnoirea... " +msgid "Calculating upgrade" +msgstr "Calculez înnoirea" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2554,13 +2554,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Nu s-a putut analiza fișierul pachet %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Nu s-a putut analiza fișierul pachet %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Nu s-a putut analiza fișierul pachet %s (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1059,8 +1059,8 @@ msgid "At least one invalid signature was encountered." msgstr "Найдена как минимум одна неправильная подпись." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Не удалось выполнить «gpgv» для проверки подписи (gpgv установлена?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Не удалось выполнить «apt-key» для проверки подписи (gnupg установлена?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1071,8 +1071,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Неизвестная ошибка при выполнении gpgv" +msgid "Unknown error executing apt-key" +msgstr "Неизвестная ошибка при выполнении apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1727,8 +1727,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Расчёт обновлений…" +msgid "Calculating upgrade" +msgstr "Расчёт обновлений" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2600,13 +2600,8 @@ msgstr "Запустить внешний решатель" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Невозможно разобрать содержимое пакета %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Невозможно разобрать содержимое пакета %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Невозможно разобрать содержимое пакета %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1039,8 +1039,8 @@ msgid "At least one invalid signature was encountered." msgstr "Bola zistená aspoň jedna nesprávna signatúra." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Nedá sa spustiť „gpgv“ kvôli overeniu podpisu (je nainštalované gpgv?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Nedá sa spustiť „apt-key“ kvôli overeniu podpisu (je nainštalované gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1051,8 +1051,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Neznáma chyba pri spustení gpgv" +msgid "Unknown error executing apt-key" +msgstr "Neznáma chyba pri spustení apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1701,8 +1701,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Prepočítava sa aktualizácia... " +msgid "Calculating upgrade" +msgstr "Prepočítava sa aktualizácia" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2563,13 +2563,8 @@ msgstr "Spustiť externého riešiteľa" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Súbor %s sa nedá spracovať (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Súbor %s sa nedá spracovať (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Súbor %s sa nedá spracovať (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1036,8 +1036,8 @@ msgid "At least one invalid signature was encountered." msgstr "Najden je bil vsaj en neveljaven podpis." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Ni mogoče izvesti 'gpgv' za preverjanje podpisa (je gpgv nameščen?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Ni mogoče izvesti 'apt-key' za preverjanje podpisa (je gnupg nameščen?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1048,8 +1048,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Neznana napaka med izvajanjem gpgv" +msgid "Unknown error executing apt-key" +msgstr "Neznana napaka med izvajanjem apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1702,8 +1702,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Preračunavanje nadgradnje ... " +msgid "Calculating upgrade" +msgstr "Preračunavanje nadgradnje" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2567,13 +2567,8 @@ msgstr "Izvedi zunanji reševalnik" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Ni mogoče razčleniti datoteke paketa %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Ni mogoče razčleniti datoteke paketa %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Ni mogoče razčleniti datoteke paketa %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1025,9 +1025,9 @@ msgid "At least one invalid signature was encountered." msgstr "Minst en ogiltig signatur träffades på." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Kunde inte köra \"gpgv\" för att verifiera signatur (är gpgv installerad?)" +"Kunde inte köra \"apt-key\" för att verifiera signatur (är gnupg installerad?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1038,8 +1038,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Okänt fel vid körning av gpgv" +msgid "Unknown error executing apt-key" +msgstr "Okänt fel vid körning av apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1681,8 +1681,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Beräknar uppgradering... " +msgid "Calculating upgrade" +msgstr "Beräknar uppgradering" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2556,13 +2556,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Kunde inte tolka paketfilen %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Kunde inte tolka paketfilen %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Kunde inte tolka paketfilen %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1052,8 +1052,8 @@ msgid "At least one invalid signature was encountered." msgstr "พบลายเซ็นที่ใช้การไม่ได้อย่างน้อยหนึ่งรายการ" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "ไม่สามารถเรียก 'gpgv' เพื่อตรวจสอบลายเซ็น (ได้ติดตั้ง gpgv ไว้หรือไม่?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "ไม่สามารถเรียก 'apt-key' เพื่อตรวจสอบลายเซ็น (ได้ติดตั้ง gnupg ไว้หรือไม่?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1066,8 +1066,8 @@ msgstr "" "'%s' (เครือข่ายต้องยืนยันตัวบุคคลหรือไม่?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะเรียก gpgv" +msgid "Unknown error executing apt-key" +msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะเรียก apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1682,8 +1682,8 @@ msgid "Full Text Search" msgstr "ค้นทั่วทั้งเนื้อความ" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "กำลังคำนวณการปรับรุ่น... " +msgid "Calculating upgrade" +msgstr "กำลังคำนวณการปรับรุ่น" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2532,13 +2532,8 @@ msgstr "เรียกกลไกการแก้ปัญหาภายน #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "ไม่สามารถแจงแฟ้มแพกเกจ %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "ไม่สามารถแจงแฟ้มแพกเกจ %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "ไม่สามารถแจงแฟ้มแพกเกจ %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1018,9 +1018,9 @@ msgstr "Hindi kukulang sa isang hindi tanggap na lagda ang na-enkwentro." #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Hindi maitakbo ang '%s' upang maberipika ang lagda (nakaluklok ba ang gpgv?)" +"Hindi maitakbo ang '%s' upang maberipika ang lagda (nakaluklok ba ang gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1031,8 +1031,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Hindi kilalang error sa pag-execute ng gpgv" +msgid "Unknown error executing apt-key" +msgstr "Hindi kilalang error sa pag-execute ng apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1663,8 +1663,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Sinusuri ang pag-upgrade... " +msgid "Calculating upgrade" +msgstr "Sinusuri ang pag-upgrade" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2533,13 +2533,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Hindi ma-parse ang talaksang pakete %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Hindi ma-parse ang talaksang pakete %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Hindi ma-parse ang talaksang pakete %s (%d)" #: apt-pkg/indexrecords.cc:78 #, fuzzy, c-format @@ -1077,8 +1077,8 @@ msgid "At least one invalid signature was encountered." msgstr "En az bir geçersiz imza ile karşılaşıldı." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "İmza doğrulama için 'gpgv' çalıştırılamadı (gpgv kurulu mu?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "İmza doğrulama için 'apt-key' çalıştırılamadı (gnupg kurulu mu?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1091,8 +1091,8 @@ msgstr "" "gerektiriyor mu?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "gpgv çalıştırılırken bilinmeyen hata" +msgid "Unknown error executing apt-key" +msgstr "apt-key çalıştırılırken bilinmeyen hata" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1739,8 +1739,8 @@ msgid "Full Text Search" msgstr "Tam Metin Arama" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Yükseltme hesaplanıyor... " +msgid "Calculating upgrade" +msgstr "Yükseltme hesaplanıyor" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2607,13 +2607,8 @@ msgstr "Harici çözücüyü çalıştır" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Paket dosyası %s ayrıştırılamadı (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Paket dosyası %s ayrıştırılamadı (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Paket dosyası %s ayrıştırılamadı (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1057,8 +1057,8 @@ msgid "At least one invalid signature was encountered." msgstr "Знайдено як мінімум один невірний підпис." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "Неможливо виконати 'gpgv' для перевірки підпису (чи встановлено gpgv?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "Неможливо виконати 'apt-key' для перевірки підпису (чи встановлено gnupg?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1069,8 +1069,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Невідома помилка виконання gpgv" +msgid "Unknown error executing apt-key" +msgstr "Невідома помилка виконання apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1722,8 +1722,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Обчислення оновлень... " +msgid "Calculating upgrade" +msgstr "Обчислення оновлень" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2600,13 +2600,8 @@ msgstr "Виконати зовнішній розв'язувач" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Неможливо проаналізувати файл пакунку %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Неможливо проаналізувати файл пакунку %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Неможливо проаналізувати файл пакунку %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format @@ -1092,9 +1092,9 @@ msgid "At least one invalid signature was encountered." msgstr "Gặp ít nhất một chữ ký không hợp lệ." #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" msgstr "" -"Không thể thực hiện “gpgv” để thẩm tra chữ ký (gpgv đã được cài đặt chưa?)" +"Không thể thực hiện “apt-key” để thẩm tra chữ ký (gnupg đã được cài đặt chưa?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1107,8 +1107,8 @@ msgstr "" "không?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "Gặp lỗi không rõ khi thực hiện gpgv" +msgid "Unknown error executing apt-key" +msgstr "Gặp lỗi không rõ khi thực hiện apt-key" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1737,8 +1737,8 @@ msgid "Full Text Search" msgstr "Tìm kiếm toàn văn" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "Đang tính toán nâng cấp... " +msgid "Calculating upgrade" +msgstr "Đang tính toán nâng cấp" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2605,13 +2605,8 @@ msgstr "Thi hành bộ phân giải từ bên ngoài" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "Không thể phân tích tập tin gói %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "Không thể phân tích tập tin gói %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "Không thể phân tích tập tin gói %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format diff --git a/po/zh_CN.po b/po/zh_CN.po index 5022016b2..661d8f92c 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -1056,8 +1056,8 @@ msgid "At least one invalid signature was encountered." msgstr "至少发现一个无效的签名。" #: methods/gpgv.cc:174 -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "无法运行 gpgv 以验证签名(您安装了 gpgv 吗?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "无法运行 apt-key 以验证签名(您安装了 gnupg 吗?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1068,8 +1068,8 @@ msgid "" msgstr "明文签署文件不可用,结果为‘%s’(您的网络需要认证吗?)" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "运行 gpgv 时发生未知错误" +msgid "Unknown error executing apt-key" +msgstr "运行 apt-key 时发生未知错误" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1679,8 +1679,8 @@ msgid "Full Text Search" msgstr "全文搜索" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "正在对升级进行计算... " +msgid "Calculating upgrade" +msgstr "正在对升级进行计算" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2532,13 +2532,8 @@ msgstr "执行外部solver" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "无法解析软件包文件 %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "无法解析软件包文件 %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "无法解析软件包文件 %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format diff --git a/po/zh_TW.po b/po/zh_TW.po index b24011151..c9a134b62 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -999,8 +999,8 @@ msgstr "至少發現一個無效的簽章。" #: methods/gpgv.cc:174 #, fuzzy -msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)" -msgstr "無法執行 '%s' 來驗證簽章(gpgv 是否安裝了?)" +msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)" +msgstr "無法執行 '%s' 來驗證簽章(gnupg 是否安裝了?)" #. TRANSLATORS: %s is a single techy word like 'NODATA' #: methods/gpgv.cc:180 @@ -1011,8 +1011,8 @@ msgid "" msgstr "" #: methods/gpgv.cc:184 -msgid "Unknown error executing gpgv" -msgstr "在執行 gpgv 時發生未知的錯誤" +msgid "Unknown error executing apt-key" +msgstr "在執行 apt-key 時發生未知的錯誤" #: methods/gpgv.cc:217 methods/gpgv.cc:224 msgid "The following signatures were invalid:\n" @@ -1632,8 +1632,8 @@ msgid "Full Text Search" msgstr "" #: apt-private/private-upgrade.cc:25 -msgid "Calculating upgrade... " -msgstr "籌備升級中... " +msgid "Calculating upgrade" +msgstr "籌備升級中" #: apt-private/private-upgrade.cc:28 msgid "Done" @@ -2477,13 +2477,8 @@ msgstr "" #: apt-pkg/tagfile.cc:140 #, c-format -msgid "Unable to parse package file %s (1)" -msgstr "無法辨識套件檔 %s (1)" - -#: apt-pkg/tagfile.cc:237 -#, c-format -msgid "Unable to parse package file %s (2)" -msgstr "無法辨識套件檔 %s (2)" +msgid "Unable to parse package file %s (%d)" +msgstr "無法辨識套件檔 %s (%d)" #: apt-pkg/indexrecords.cc:78 #, c-format diff --git a/prepare-release b/prepare-release index e61266eef..67f4638d6 100755 --- a/prepare-release +++ b/prepare-release @@ -130,8 +130,8 @@ elif [ "$1" = 'coverage' ]; then LCOVRC='--rc geninfo_checksum=1 --rc lcov_branch_coverage=1' mkdir "$DIR" lcov --no-external --directory . --capture --initial --output-file "${DIR}/apt.coverage.init" ${LCOVRC} - make test - ./test/integration/run-tests -q + make test || true + ./test/integration/run-tests -q || true lcov --no-external --directory . --capture --output-file "${DIR}/apt.coverage.run" ${LCOVRC} lcov -a "${DIR}/apt.coverage.init" -a "${DIR}/apt.coverage.run" -o "${DIR}/apt.coverage.total" ${LCOVRC} cp "${DIR}/apt.coverage.total" "${DIR}/apt.coverage.fixed" diff --git a/test/integration/framework b/test/integration/framework index 70ad381e9..5f13df1c0 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -23,30 +23,43 @@ if [ "$MSGCOLOR" != 'NO' ]; then CCMD="\033[1;35m" # pink fi -msgdie() { printf "${CERROR}E: $1${CNORMAL}\n" >&2; exit 1; } -msgwarn() { printf "${CWARNING}W: $1${CNORMAL}\n" >&2; } -msgmsg() { printf "${CMSG}$1${CNORMAL}\n"; } -msginfo() { printf "${CINFO}I: $1${CNORMAL}\n"; } -msgdebug() { printf "${CDEBUG}D: $1${CNORMAL}\n"; } -msgdone() { printf "${CDONE}DONE${CNORMAL}\n"; } -msgnwarn() { printf "${CWARNING}W: $1${CNORMAL}" >&2; } -msgnmsg() { printf "${CMSG}$1${CNORMAL}"; } -msgninfo() { printf "${CINFO}I: $1${CNORMAL}"; } -msgndebug() { printf "${CDEBUG}D: $1${CNORMAL}"; } -msgtest() { - while [ -n "$1" ]; do - printf "${CINFO}$1${CCMD} " - printf -- "$(echo "$2" | sed -e 's#^apt\([cgfs]\)#apt-\1#')${CINFO} " +msgprintf() { + local START="$1" + local MIDDLE="$2" + local END="$3" + shift 3 + if [ -n "$1" ]; then + printf "$START " "$1" shift - if [ -n "$1" ]; then shift; else break; fi - done - printf "…${CNORMAL} " -} + while [ -n "$1" ]; do + printf "$MIDDLE " "$(echo "$1" | sed -e 's#^apt\([cfghs]\)#apt-\1#')" + shift + done + fi + printf "${END}" +} +msgdie() { msgprintf "${CERROR}E: %s" '%s' "${CNORMAL}\n" "$@" >&2; exit 1; } +msgwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}\n" "$@" >&2; } +msgmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}\n" "$@"; } +msginfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}\n" "$@"; } +msgdebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}\n" "$@"; } +msgdone() { msgprintf "${CDONE}DONE" '%s' "${CNORMAL}\n" "$@"; } +msgnwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}" "$@" >&2; } +msgnmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}" "$@"; } +msgninfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}" "$@"; } +msgndebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}" "$@"; } +msgtest() { msgprintf "${CINFO}%s" "${CCMD}%s${CINFO}" "…${CNORMAL} " "$@"; } msgpass() { printf "${CPASS}PASS${CNORMAL}\n"; } -msgskip() { printf "${CWARNING}SKIP${CNORMAL}\n" >&2; } +msgskip() { + if [ $# -gt 0 ]; then printf "${CWARNING}SKIP: $*${CNORMAL}\n" >&2; + else printf "${CWARNING}SKIP${CNORMAL}\n" >&2; fi +} msgfail() { if [ $# -gt 0 ]; then printf "${CFAIL}FAIL: $*${CNORMAL}\n" >&2; else printf "${CFAIL}FAIL${CNORMAL}\n" >&2; fi + if [ -n "$APT_DEBUG_TESTS" ]; then + $SHELL + fi EXIT_CODE=$((EXIT_CODE+1)); } @@ -64,12 +77,6 @@ if [ $MSGLEVEL -le 2 ]; then msgnmsg() { true; } msgtest() { true; } msgpass() { printf " ${CPASS}P${CNORMAL}"; } - msgskip() { printf " ${CWARNING}S${CNORMAL}" >&2; } - if [ -n "$CFAIL" ]; then - msgfail() { printf " ${CFAIL}FAIL${CNORMAL}" >&2; EXIT_CODE=$((EXIT_CODE+1)); } - else - msgfail() { printf " ###FAILED###" >&2; EXIT_CODE=$((EXIT_CODE+1)); } - fi fi if [ $MSGLEVEL -le 3 ]; then msginfo() { true; } @@ -105,7 +112,7 @@ runapt() { sh|aptitude|*/*|command) ;; *) CMD="${BUILDDIRECTORY}/$CMD";; esac - MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${BUILDDIRECTORY} $CMD "$@" + MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${LIBRARYPATH} $CMD "$@" } aptconfig() { runapt apt-config "$@"; } aptcache() { runapt apt-cache "$@"; } @@ -121,26 +128,18 @@ aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; } aptitude() { runapt aptitude "$@"; } aptextracttemplates() { runapt apt-extracttemplates "$@"; } aptinternalsolver() { runapt "${APTINTERNALSOLVER}" "$@"; } +aptdumpsolver() { runapt "${APTDUMPSOLVER}" "$@"; } dpkg() { - command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@" + "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" "$@" } dpkgcheckbuilddeps() { command dpkg-checkbuilddeps --admindir=${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg "$@" } gdb() { - echo "gdb: run »$*«" - CMD="$1" + local CMD="$1" shift - - APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${LIBRARYPATH} command gdb ${BUILDDIRECTORY}/$CMD --args ${BUILDDIRECTORY}/$CMD "$@" -} -gpg() { - # see apt-key for the whole trickery. Setup is done in setupenvironment - command gpg --ignore-time-conflict --no-options --no-default-keyring \ - --homedir "${TMPWORKINGDIRECTORY}/gnupghome" \ - --no-auto-check-trustdb --trust-model always \ - "$@" + runapt command gdb --quiet -ex run "${BUILDDIRECTORY}/$CMD" --args "${BUILDDIRECTORY}/$CMD" "$@" } exitwithstatus() { @@ -172,10 +171,23 @@ addtrap() { } setupenvironment() { + # privilege dropping and testing doesn't work if /tmp isn't world-writeable (as e.g. with libpam-tmpdir) + if [ -n "$TMPDIR" ] && [ "$(id -u)" = '0' ] && [ "$(stat --format '%a' "$TMPDIR")" != '1777' ]; then + unset TMPDIR + fi TMPWORKINGDIRECTORY=$(mktemp -d) - TESTDIRECTORY=$(readlink -f $(dirname $0)) + addtrap "cd /; rm -rf $TMPWORKINGDIRECTORY;" msgninfo "Preparing environment for ${CCMD}$(basename $0)${CINFO} in ${TMPWORKINGDIRECTORY}… " + mkdir -m 700 "${TMPWORKINGDIRECTORY}/downloaded" + if [ "$(id -u)" = '0' ]; then + # relax permissions so that running as root with user switching works + umask 022 + chmod 711 "$TMPWORKINGDIRECTORY" + chown _apt:root "${TMPWORKINGDIRECTORY}/downloaded" + fi + + TESTDIRECTORY=$(readlink -f $(dirname $0)) # allow overriding the default BUILDDIR location BUILDDIRECTORY=${APT_INTEGRATION_TESTS_BUILD_DIR:-"${TESTDIRECTORY}/../../build/bin"} LIBRARYPATH=${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}"} @@ -183,15 +195,15 @@ setupenvironment() { APTHELPERBINDIR=${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"} APTWEBSERVERBINDIR=${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}"} APTINTERNALSOLVER=${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/apt-internal-solver"} + APTDUMPSOLVER=${APT_INTEGRATION_TESTS_DUMP_SOLVER:-"${BUILDDIRECTORY}/apt-dump-solver"} test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first" # ----- - addtrap "cd /; rm -rf $TMPWORKINGDIRECTORY;" cd $TMPWORKINGDIRECTORY mkdir rootdir aptarchive keys cd rootdir mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d - mkdir -p var/cache var/lib/apt var/log tmp + mkdir -p usr/bin var/cache var/lib var/log tmp mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers touch var/lib/dpkg/available mkdir -p usr/lib/apt @@ -219,41 +231,74 @@ setupenvironment() { cp "${TESTDIRECTORY}/${SOURCESSFILE}" aptarchive/Sources fi cp $(find $TESTDIRECTORY -name '*.pub' -o -name '*.sec') keys/ + chmod 644 $(find keys -name '*.pub' -o -name '*.sec') ln -s ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf - echo "Debug::NoLocking \"true\";" >> aptconfig.conf echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf echo "Dir::Bin::Methods \"${METHODSDIR}\";" >> aptconfig.conf - echo "Dir::Bin::dpkg \"fakeroot\";" >> aptconfig.conf - echo "DPKG::options:: \"dpkg\";" >> aptconfig.conf - echo "DPKG::options:: \"--root=${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf - echo "DPKG::options:: \"--force-not-root\";" >> aptconfig.conf - echo "DPKG::options:: \"--force-bad-path\";" >> aptconfig.conf + # store apt-key were we can access it, even if we run it as a different user + # destroys coverage reporting though, so just do it for root for now + if [ "$(id -u)" = '0' ]; then + cp "${BUILDDIRECTORY}/apt-key" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/" + chmod o+rx "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key" + echo "Dir::Bin::apt-key \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key\";" >> aptconfig.conf + else + echo "Dir::Bin::apt-key \"${BUILDDIRECTORY}/apt-key\";" >> aptconfig.conf + fi + + cat << EOF > "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" +#!/bin/sh +set -e +if [ -r "${TMPWORKINGDIRECTORY}/noopchroot.so" ]; then + if [ -n "\$LD_PRELOAD" ]; then + export LD_PRELOAD="${TMPWORKINGDIRECTORY}/noopchroot.so \${LD_PRELOAD}" + else + export LD_PRELOAD="${TMPWORKINGDIRECTORY}/noopchroot.so" + fi +fi +exec fakeroot dpkg --root="${TMPWORKINGDIRECTORY}/rootdir" \\ + --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log \\ + --force-not-root --force-bad-path "\$@" +EOF + chmod +x "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" + echo "Dir::Bin::dpkg \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg\";" > rootdir/etc/apt/apt.conf.d/99dpkg + if ! command dpkg --assert-multi-arch >/dev/null 2>&1; then echo "DPKG::options:: \"--force-architecture\";" >> aptconfig.conf # Added to test multiarch before dpkg is ready for it… fi - echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf echo 'quiet::NoUpdate "true";' >> aptconfig.conf - echo "Acquire::https::CaInfo \"${TESTDIR}/apt.pem\";" > rootdir/etc/apt/apt.conf.d/99https - echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary + echo 'quiet::NoStatistic "true";' >> aptconfig.conf + # too distracting for users, but helpful to detect changes + echo 'Acquire::Progress::Ignore::ShowErrorText "true";' >> aptconfig.conf + # in testcases, it can appear as if localhost has a rotation setup, + # hide this as we can't really deal with it properly + echo 'Acquire::Failure::ShowIP "false";' >> aptconfig.conf + + cp "${TESTDIRECTORY}/apt.pem" "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem" + if [ "$(id -u)" = '0' ]; then + chown _apt:root "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem" + fi + echo "Acquire::https::CaInfo \"${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem\";" > rootdir/etc/apt/apt.conf.d/99https + echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary configcompression '.' 'gz' #'bz2' 'lzma' 'xz' - # gpg needs a trustdb to function, but it can't be invalid (not even empty) - # see also apt-key where this trickery comes from: - local TRUSTDBDIR="${TMPWORKINGDIRECTORY}/gnupghome" - mkdir "$TRUSTDBDIR" - chmod 700 "$TRUSTDBDIR" - # We also don't use a secret keyring, of course, but gpg panics and - # implodes if there isn't one available - and writeable for imports - local SECRETKEYRING="${TRUSTDBDIR}/secring.gpg" - touch $SECRETKEYRING - # now create the trustdb with an (empty) dummy keyring - # newer gpg versions are fine without it, but play it safe for now - gpg --quiet --check-trustdb --secret-keyring $SECRETKEYRING --keyring $SECRETKEYRING >/dev/null 2>&1 + # create some files in /tmp and look at user/group to get what this means + TEST_DEFAULT_USER="$USER" + if [ "$(uname)" = 'GNU/kFreeBSD' ]; then + TEST_DEFAULT_GROUP='root' + else + TEST_DEFAULT_GROUP="$USER" + fi + + # Acquire::AllowInsecureRepositories=false is not yet the default + # but we want it to be the default soon + configallowinsecurerepositories "false"; # cleanup the environment a bit - export PATH="${PATH}:/usr/local/sbin:/usr/sbin:/sbin" + # prefer our apt binaries over the system apt binaries + export PATH="${BUILDDIRECTORY}:${PATH}:/usr/local/sbin:/usr/sbin:/sbin" export LC_ALL=C.UTF-8 unset LANGUAGE APT_CONFIG unset GREP_OPTIONS DEB_BUILD_PROFILES @@ -275,7 +320,7 @@ getarchitecture() { } getarchitectures() { - echo "$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')" + aptconfig dump --no-empty --format '%v%n' APT::Architecture APT::Architectures | sort -u | tr '\n' ' ' } getarchitecturesfromcommalist() { @@ -355,22 +400,15 @@ int execvp(const char *file, char *const argv[]) { char newfile[strlen(chrootdir) + strlen(file)]; strcpy(newfile, chrootdir); strcat(newfile, file); + char const * const baseadmindir = "/var/lib/dpkg"; + char admindir[strlen(chrootdir) + strlen(baseadmindir)]; + strcpy(admindir, chrootdir); + strcat(admindir, baseadmindir); + setenv("DPKG_ADMINDIR", admindir, 1); return func_execvp(newfile, argv); } EOF testsuccess --nomsg gcc -fPIC -shared -o noopchroot.so noopchroot.c -ldl - - mkdir -p "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/" - DPKG="${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" - echo "#!/bin/sh -if [ -n \"\$LD_PRELOAD\" ]; then - export LD_PRELOAD=\"${TMPWORKINGDIRECTORY}/noopchroot.so \${LD_PRELOAD}\" -else - export LD_PRELOAD=\"${TMPWORKINGDIRECTORY}/noopchroot.so\" -fi -dpkg \"\$@\"" > $DPKG - chmod +x $DPKG - sed -ie "s|^DPKG::options:: \"dpkg\";\$|DPKG::options:: \"$DPKG\";|" aptconfig.conf } configallowinsecurerepositories() { @@ -534,8 +572,8 @@ Package: $NAME" >> ${BUILDDIR}/debian/control | while read SRC; do echo "pool/${SRC}" >> ${BUILDDIR}/../${RELEASE}.${DISTSECTION}.srclist # if expr match "${SRC}" '.*\.dsc' >/dev/null 2>&1; then -# gpg --yes --secret-keyring ./keys/joesixpack.sec \ -# --keyring ./keys/joesixpack.pub --default-key 'Joe Sixpack' \ +# aptkey --keyring ./keys/joesixpack.pub --secret-keyring ./keys/joesixpack.sec --quiet --readonly \ +# adv --yes --default-key 'Joe Sixpack' \ # --clearsign -o "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC" # mv "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC" # fi @@ -602,12 +640,8 @@ buildaptarchive() { createaptftparchiveconfig() { local COMPRESSORS="$(cut -d' ' -f 1 ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf | tr '\n' ' ')" - COMPRESSORS="${COMPRESSORS%* }" - local ARCHS="$(find pool/ -name '*.deb' | grep -oE '_[a-z0-9-]+\.deb$' | sort | uniq | sed -e '/^_all.deb$/ d' -e 's#^_\([a-z0-9-]*\)\.deb$#\1#' | tr '\n' ' ')" - if [ -z "$ARCHS" ]; then - # the pool is empty, so we will operate on faked packages - let us use the configured archs - ARCHS="$(getarchitectures)" - fi + local COMPRESSORS="${COMPRESSORS%* }" + local ARCHS="$(getarchitectures)" echo -n 'Dir { ArchiveDir "' >> ftparchive.conf echo -n $(readlink -f .) >> ftparchive.conf @@ -679,40 +713,52 @@ buildaptftparchivedirectorystructure() { } insertpackage() { - local RELEASE="$1" + local RELEASES="$1" local NAME="$2" local ARCH="$3" local VERSION="$4" local DEPENDENCIES="$5" local PRIORITY="${6:-optional}" - local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE} + local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASES} If you find such a package installed on your system, something went horribly wrong! They are autogenerated und used only by testcases and surf no other propose…"}" local ARCHS="" - for arch in $(getarchitecturesfromcommalist "$ARCH"); do - if [ "$arch" = 'all' -o "$arch" = 'none' ]; then - ARCHS="$(getarchitectures)" - else - ARCHS="$arch" + for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do + if [ "$RELEASE" = 'installed' ]; then + insertinstalledpackage "$2" "$3" "$4" "$5" "$6" "$7" + continue fi - for BUILDARCH in $ARCHS; do - local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}" - mkdir -p $PPATH aptarchive/dists/${RELEASE}/main/source - touch aptarchive/dists/${RELEASE}/main/source/Sources - local FILE="${PPATH}/Packages" - echo "Package: $NAME + for arch in $(getarchitecturesfromcommalist "$ARCH"); do + if [ "$arch" = 'all' -o "$arch" = 'none' ]; then + ARCHS="$(getarchitectures)" + else + ARCHS="$arch" + fi + for BUILDARCH in $ARCHS; do + local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}" + mkdir -p $PPATH + local FILE="${PPATH}/Packages" + echo "Package: $NAME Priority: $PRIORITY Section: other Installed-Size: 42 Maintainer: Joe Sixpack <joe@example.org>" >> $FILE - test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE - echo "Version: $VERSION + test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE + echo "Version: $VERSION Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb" >> $FILE - test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE - echo "Description: $DESCRIPTION" >> $FILE - echo >> $FILE + test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE + echo "Description: $(printf '%s' "$DESCRIPTION" | head -n 1)" >> $FILE + echo "Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)" >> $FILE + echo >> $FILE + done done + mkdir -p aptarchive/dists/${RELEASE}/main/source aptarchive/dists/${RELEASE}/main/i18n + touch aptarchive/dists/${RELEASE}/main/source/Sources + echo "Package: $NAME +Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1) +Description-en: $DESCRIPTION +" >> aptarchive/dists/${RELEASE}/main/i18n/Translation-en done } @@ -783,12 +829,12 @@ buildaptarchivefromincoming() { testsuccess aptftparchive generate ftparchive.conf cd - > /dev/null msgdone "info" - generatereleasefiles + generatereleasefiles "$@" } buildaptarchivefromfiles() { msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on prebuild files…" - find aptarchive -name 'Packages' -o -name 'Sources' | while read line; do + find aptarchive -name 'Packages' -o -name 'Sources' -o -name 'Translation-*' | while read line; do msgninfo "\t${line} file… " compressfile "$line" "$1" msgdone "info" @@ -898,24 +944,29 @@ setupflataptarchive() { } setupaptarchive() { - buildaptarchive + local NOUPDATE=0 + if [ "$1" = '--no-update' ]; then + NOUPDATE=1 + shift + fi + buildaptarchive "$@" if [ -e aptarchive/dists ]; then setupdistsaptarchive else setupflataptarchive fi - signreleasefiles - if [ "$1" != '--no-update' ]; then - msgninfo "\tSync APT's cache with the archive… " - aptget update -qq - msgdone "info" + signreleasefiles 'Joe Sixpack' + if [ "1" != "$NOUPDATE" ]; then + testsuccess aptget update -o Debug::pkgAcquire::Worker=true -o Debug::Acquire::gpgv=true fi } signreleasefiles() { local SIGNER="${1:-Joe Sixpack}" - local GPG="gpg --batch --yes" - msgninfo "\tSign archive with $SIGNER key… " + local REPODIR="${2:-aptarchive}" + local KEY="keys/$(echo "$SIGNER" | tr 'A-Z' 'a-z' | sed 's# ##g')" + local GPG="aptkey --quiet --keyring ${KEY}.pub --secret-keyring ${KEY}.sec --readonly adv --batch --yes" + msgninfo "\tSign archive with $SIGNER key $KEY… " local REXKEY='keys/rexexpired' local SECEXPIREBAK="${REXKEY}.sec.bak" local PUBEXPIREBAK="${REXKEY}.pub.bak" @@ -931,18 +982,15 @@ signreleasefiles() { cp $SECUNEXPIRED ${REXKEY}.sec cp $PUBUNEXPIRED ${REXKEY}.pub else - printf "expire\n1w\nsave\n" | $GPG --keyring ${REXKEY}.pub --secret-keyring ${REXKEY}.sec --command-fd 0 --edit-key "${SIGNER}" >/dev/null 2>&1 || true + if ! printf "expire\n1w\nsave\n" | $GPG --default-key "$SIGNER" --command-fd 0 --edit-key "${SIGNER}" >setexpire.gpg 2>&1; then + cat setexpire.gpg + exit 1 + fi cp ${REXKEY}.sec $SECUNEXPIRED cp ${REXKEY}.pub $PUBUNEXPIRED fi fi - for KEY in $(find keys/ -name '*.sec'); do - GPG="$GPG --secret-keyring $KEY" - done - for KEY in $(find keys/ -name '*.pub'); do - GPG="$GPG --keyring $KEY" - done - for RELEASE in $(find aptarchive/ -name Release); do + for RELEASE in $(find ${REPODIR}/ -name Release); do $GPG --default-key "$SIGNER" --armor --detach-sign --sign --output ${RELEASE}.gpg ${RELEASE} local INRELEASE="$(echo "${RELEASE}" | sed 's#/Release$#/InRelease#')" $GPG --default-key "$SIGNER" --clearsign --output $INRELEASE $RELEASE @@ -957,23 +1005,35 @@ signreleasefiles() { } webserverconfig() { - msgtest "Set webserver config option '${1}' to" "$2" + local NOCHECK=false + if [ "$1" = '--no-check' ]; then + NOCHECK=true + shift + fi local DOWNLOG='rootdir/tmp/download-testfile.log' - local STATUS='rootdir/tmp/webserverconfig.status' + local STATUS='downloaded/webserverconfig.status' rm -f "$STATUS" "$DOWNLOG" - if downloadfile "http://localhost:8080/_config/set/${1}/${2}" "$STATUS" > "$DOWNLOG"; then + local URI + if [ -n "$2" ]; then + msgtest "Set webserver config option '${1}' to" "$2" + URI="http://localhost:8080/_config/set/${1}/${2}" + else + msgtest 'Clear webserver config option' "${1}" + URI="http://localhost:8080/_config/clear/${1}" + fi + if downloadfile "$URI" "$STATUS" > "$DOWNLOG"; then msgpass else - cat "$DOWNLOG" "$STATUS" + cat "$DOWNLOG" "$STATUS" || true msgfail fi - testwebserverlaststatuscode '200' + $NOCHECK || testwebserverlaststatuscode '200' } rewritesourceslist() { local APTARCHIVE="file://$(readlink -f "${TMPWORKINGDIRECTORY}/aptarchive")" for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do - sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#http://localhost:8080/#${1}#" -e "s#http://localhost:4433/#${1}#" + sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#http://localhost:8080/#${1}#" -e "s#https://localhost:4433/#${1}#" done } @@ -1024,7 +1084,7 @@ changetohttpswebserver() { changetowebserver --no-rewrite "$@" fi echo "pid = ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid -cert = ${TESTDIRECTORY}/apt.pem +cert = ${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem output = /dev/null [https] @@ -1060,7 +1120,7 @@ acquire::cdrom::autodetect 0;" > rootdir/etc/apt/apt.conf.d/00cdrom mv "${CD}" "${CD}-unmounted" # we don't want the disk to be modifiable addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/media/cdrom/dists/ $PWD/rootdir/media/cdrom-unmounted/dists/ || true;" - chmod -R -w rootdir/media/cdrom-unmounted/dists + chmod -R 555 rootdir/media/cdrom-unmounted/dists } downloadfile() { @@ -1068,7 +1128,7 @@ downloadfile() { apthelper -o Debug::Acquire::${PROTO}=1 -o Debug::pkgAcquire::Worker=1 \ download-file "$1" "$2" 2>&1 || true # only if the file exists the download was successful - if [ -e "$2" ]; then + if [ -r "$2" ]; then return 0 else return 1 @@ -1076,7 +1136,7 @@ downloadfile() { } checkdiff() { - local DIFFTEXT="$(command diff -u "$@" | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')" + local DIFFTEXT="$(command diff -u "$@" 2>&1 | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')" if [ -n "$DIFFTEXT" ]; then echo >&2 echo >&2 "$DIFFTEXT" @@ -1100,12 +1160,14 @@ testfileequal() { testempty() { msgtest "Test for no output of" "$*" local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile" - if $* >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then + if "$@" >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then msgpass else + echo cat $COMPAREFILE msgfail fi + aptautotest 'testempty' "$@" } testequal() { @@ -1123,6 +1185,7 @@ testequal() { msgtest "$MSG" "$*" fi "$@" 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail + aptautotest 'testequal' "$@" } testequalor2() { @@ -1133,7 +1196,7 @@ testequalor2() { echo "$2" > $COMPAREFILE2 shift 2 msgtest "Test for equality OR of" "$*" - $* >$COMPAREAGAINST 2>&1 || true + "$@" >$COMPAREAGAINST 2>&1 || true if checkdiff $COMPAREFILE1 $COMPAREAGAINST >/dev/null 2>&1 || \ checkdiff $COMPAREFILE2 $COMPAREAGAINST >/dev/null 2>&1 then @@ -1145,6 +1208,7 @@ testequalor2() { checkdiff $COMPAREFILE2 $COMPAREAGAINST || true msgfail fi + aptautotest 'testequalor2' "$@" } testshowvirtual() { @@ -1213,6 +1277,36 @@ testmarkedauto() { aptmark showauto 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail } +msgfailoutput() { + local MSG="$1" + local OUTPUT="$2" + shift 2 + echo >&2 + if [ "$1" = 'grep' ]; then + while [ -n "$2" ]; do shift; done + echo "#### Complete file: $1 ####" + cat >&2 "$1" || true + echo '#### grep output ####' + elif [ "$1" = 'test' ]; then + # doesn't support ! or non-file flags + msgfailoutputstatfile() { + local FILEFLAGS='^-[bcdefgGhkLOprsStuwx]$' + if expr match "$1" "$FILEFLAGS" >/dev/null; then + echo "#### stat(2) of file: $2 ####" + stat "$2" || true + fi + } + msgfailoutputstatfile "$2" "$3" + while [ -n "$5" ] && [ "$4" = '-o' -o "$4" = '-a' ]; do + shift 3 + msgfailoutputstatfile "$2" "$3" + done + echo '#### test output ####' + fi + cat >&2 $OUTPUT + msgfail "$MSG" +} + testsuccess() { if [ "$1" = '--nomsg' ]; then shift @@ -1221,14 +1315,52 @@ testsuccess() { fi local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" if "$@" >${OUTPUT} 2>&1; then - msgpass + if expr match "$1" '^apt.*' >/dev/null; then + if grep -q -E ' runtime error: ' "$OUTPUT"; then + msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@" + elif grep -q -E '^[WE]: ' "$OUTPUT"; then + msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@" + else + msgpass + fi + else + msgpass + fi else + local EXITCODE=$? + msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@" + fi + aptautotest 'testsuccess' "$@" +} +testwarning() { + if [ "$1" = '--nomsg' ]; then + shift + else + msgtest 'Test for successful execution with warnings of' "$*" + fi + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" + if "$@" >${OUTPUT} 2>&1; then + if expr match "$1" '^apt.*' >/dev/null; then + if grep -q -E ' runtime error: ' "$OUTPUT"; then + msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@" + elif grep -q -E '^E: ' "$OUTPUT"; then + msgfailoutput 'successful run, but output contains errors' "$OUTPUT" "$@" + elif ! grep -q -E '^W: ' "$OUTPUT"; then + msgfailoutput 'successful run, but output contains no warnings' "$OUTPUT" "$@" + else + msgpass + fi + else + msgpass + fi + else + local EXITCODE=$? echo >&2 cat >&2 $OUTPUT - msgfail + msgfail "exitcode $EXITCODE" fi + aptautotest 'testwarning' "$@" } - testfailure() { if [ "$1" = '--nomsg' ]; then shift @@ -1236,22 +1368,48 @@ testfailure() { msgtest 'Test for failure in execution of' "$*" fi local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output" - if $@ >${OUTPUT} 2>&1; then - echo >&2 - cat >&2 $OUTPUT - msgfail + if "$@" >${OUTPUT} 2>&1; then + local EXITCODE=$? + msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@" else + local EXITCODE=$? + if expr match "$1" '^apt.*' >/dev/null; then + if grep -q -E ' runtime error: ' "$OUTPUT"; then + msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@" + elif ! grep -q -E '^E: ' "$OUTPUT"; then + msgfailoutput "run failed with exitcode ${EXITCODE}, but with no errors" "$OUTPUT" "$@" + else + msgpass + fi + else + msgpass + fi + fi + aptautotest 'testfailure' "$@" +} + +testfilestats() { + msgtest "Test that file $1 has $2 $3" "$4" + if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then msgpass + else + echo >&2 + ls -ld >&2 "$1" + echo -n >&2 "stat(1) reports for $2: " + stat --format "$2" "$1" + msgfail fi } +testaccessrights() { + testfilestats "$1" '%a' '=' "$2" +} testwebserverlaststatuscode() { local DOWNLOG='rootdir/tmp/webserverstatus-testfile.log' - local STATUS='rootdir/tmp/webserverstatus-statusfile.log' + local STATUS='downloaded/webserverstatus-statusfile.log' rm -f "$DOWNLOG" "$STATUS" msgtest 'Test last status code from the webserver was' "$1" - downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" - if [ "$(cat "$STATUS")" = "$1" ]; then + if downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then msgpass else echo >&2 @@ -1271,3 +1429,79 @@ pause() { local IGNORE read IGNORE } + +listcurrentlistsdirectory() { + find rootdir/var/lib/apt/lists -maxdepth 1 -type d | while read line; do + stat --format '%U:%G:%a:%n' "$line" + done + find rootdir/var/lib/apt/lists -maxdepth 1 \! -type d | while read line; do + stat --format '%U:%G:%a:%s:%y:%n' "$line" + done +} + +### convinience hacks ### +mkdir() { + # creating some directories by hand is a tedious task, so make it look simple + if [ "$*" = '-p rootdir/var/lib/apt/lists' ] || [ "$*" = "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" ] || + [ "$*" = '-p rootdir/var/lib/apt/lists/partial' ] || [ "$*" = "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" ]; then + # only the last directory created by mkdir is effected by the -m ! + command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt" + command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" + command mkdir -m 700 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" + touch "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/lock" + if [ "$(id -u)" = '0' ]; then + chown _apt:root "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" + fi + else + command mkdir "$@" + fi +} + +### The following tests are run by most test methods automatically to check +### general things about commands executed without writing the test every time. + +aptautotest() { + local TESTCALL="$1" + local CMD="$2" + local FIRSTOPT="$3" + local AUTOTEST="aptautotest_$(basename "$CMD" | tr -d '-')_$(echo "$FIRSTOPT" | tr -d '-')" + if command -v $AUTOTEST >/dev/null; then + shift 3 + # save and restore the *.output files from other tests + # as we might otherwise override them in these automatic tests + rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-before + mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-before + mkdir ${TMPWORKINGDIRECTORY}/rootdir/tmp + $AUTOTEST "$TESTCALL" "$@" + rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest + mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest + mv ${TMPWORKINGDIRECTORY}/rootdir/tmp-before ${TMPWORKINGDIRECTORY}/rootdir/tmp + fi +} + +aptautotest_aptget_update() { + if ! test -d "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"; then return; fi + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:755" + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:755" + # all copied files are properly chmodded + for file in $(find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" -maxdepth 1 -type f ! -name 'lock'); do + testfilestats "$file" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" + done +} +aptautotest_apt_update() { aptautotest_aptget_update "$@"; } + +testaptautotestnodpkgwarning() { + local TESTCALL="$1" + while [ -n "$2" ]; do + if [ "$2" = '-s' ]; then return; fi + shift + done + testfailure grep '^dpkg: warning:.*ignor.*' "${TMPWORKINGDIRECTORY}/rootdir/tmp-before/${TESTCALL}.output" +} + +aptautotest_aptget_install() { testaptautotestnodpkgwarning "$@"; } +aptautotest_aptget_remove() { testaptautotestnodpkgwarning "$@"; } +aptautotest_aptget_purge() { testaptautotestnodpkgwarning "$@"; } +aptautotest_apt_install() { testaptautotestnodpkgwarning "$@"; } +aptautotest_apt_remove() { testaptautotestnodpkgwarning "$@"; } +aptautotest_apt_purge() { testaptautotestnodpkgwarning "$@"; } diff --git a/test/integration/run-tests b/test/integration/run-tests index c39a2ac68..6c6a37611 100755 --- a/test/integration/run-tests +++ b/test/integration/run-tests @@ -46,7 +46,11 @@ for testcase in $(run-parts --list $DIR | grep '/test-'); do if ! ${testcase}; then FAIL=$((FAIL+1)) FAILED_TESTS="$FAILED_TESTS $(basename $testcase)" - echo >&2 "$(basename $testcase) ... FAIL" + if [ "$MSGLEVEL" -le 2 ]; then + printf >&2 "\n${CHIGH}Running $(basename $testcase) -> FAILED${CRESET}" + else + echo >&2 "${CHIGH}Running $(basename $testcase) -> FAILED${CRESET}" + fi else PASS=$((PASS+1)) fi diff --git a/test/integration/skip-aptwebserver b/test/integration/skip-aptwebserver new file mode 100755 index 000000000..0622941ce --- /dev/null +++ b/test/integration/skip-aptwebserver @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'apt' 'all' '1.0' 'stable' + +setupaptarchive +changetowebserver + +rm -rf rootdir/var/lib/apt/lists +aptget update -qq +testequal 'Hit http://localhost stable InRelease +Hit http://localhost stable/main Sources +Hit http://localhost stable/main amd64 Packages +Hit http://localhost stable/main Translation-en +Reading package lists...' aptget update + +mv rootdir/var/lib/apt/lists/localhost* rootdir/var/lib/apt/lists/partial +aptget update + diff --git a/test/integration/test-00-commands-have-help b/test/integration/test-00-commands-have-help new file mode 100755 index 000000000..bbd1475eb --- /dev/null +++ b/test/integration/test-00-commands-have-help @@ -0,0 +1,63 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'amd64' + +# this test does double duty: The obvious is checking for --help and co, +# but it also checks if the binary can find all methods in the library. +# The later is quite handy for manual testing of non-abibreaking changes +export LD_BIND_NOW=1 + +checkversionmessage() { + testsuccess grep '^apt .* compiled on ' ${1}-help.output +} + +checkhelpmessage() { + checkversionmessage "$1" + testsuccess grep '^Usage:' ${1}-help.output +} + +checkoptions() { + testsuccess $1 --help + cp -f rootdir/tmp/testsuccess.output ${1}-help.output + checkhelpmessage "$1" + + testsuccess $1 --version + cp -f rootdir/tmp/testsuccess.output ${1}-help.output + checkversionmessage "$1" +} + +for CMD in 'apt-cache' 'apt-cdrom' 'apt-config' \ + 'apt-extracttemplates' 'apt-get' 'apt-helper' \ + 'apt-mark' 'apt-sortpkgs' 'apt' 'apt-ftparchive'; do + cmd="$(echo "$CMD" | tr -d '-')" + msgtest 'Test for failure with no parameters calling' "$CMD" + if $cmd > ${cmd}-help.output 2>&1; then + echo + cat ${cmd}-help.output + msgfail 'zero exit' + else + msgpass + fi + checkhelpmessage "$cmd" + checkoptions "$cmd" +done + +for CMD in 'apt-dump-solver' 'apt-internal-solver'; do + checkoptions "$(echo "$CMD" | tr -d '-')" +done + +# in times of need, we all look for super cow to save the day +testsuccess aptget moo +testsuccess aptget moo -q=2 +testsuccess aptget moo moo +testsuccess aptget moo moo -q=2 +testsuccess aptget moo moo --color +testsuccess aptget moo moo moo +testsuccess aptget moo moo moo -q=2 +testsuccess aptget moo moo moo moo +testsuccess aptget moo moo moo moo -q=2 diff --git a/test/integration/test-allow-scores-for-all-dependency-types b/test/integration/test-allow-scores-for-all-dependency-types index d60cb8daf..e1d805ce9 100755 --- a/test/integration/test-allow-scores-for-all-dependency-types +++ b/test/integration/test-allow-scores-for-all-dependency-types @@ -44,6 +44,7 @@ insertinstalledpackage 'libdb-dev' 'amd64' '5.1.7' 'Depends: libdb5.1-dev' insertinstalledpackage 'libdb5.1-dev' 'amd64' '5.1.29-7' testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: libdb5.1-dev The following NEW packages will be installed: @@ -58,6 +59,7 @@ Conf libdb5.3-dev (5.3.28-3 unversioned [amd64]) Conf libdb-dev (5.3.0 unversioned [amd64])' aptget dist-upgrade -st unversioned testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: libdb5.1-dev The following NEW packages will be installed: @@ -76,21 +78,25 @@ insertinstalledpackage 'foo' 'amd64' '1' insertinstalledpackage 'bar' 'amd64' '1' testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: bar foo 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st unversioned testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: bar foo 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st versioned testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: bar foo 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st multipleno testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: foo The following packages will be upgraded: @@ -155,6 +161,7 @@ insertinstalledpackage 'login' 'amd64' '1' 'Essential: yes' insertinstalledpackage 'libaudit0' 'amd64' '1' testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: gdm3 libaudit0 The following NEW packages will be installed: diff --git a/test/integration/test-apt-by-hash-update b/test/integration/test-apt-by-hash-update new file mode 100755 index 000000000..d9d0b146f --- /dev/null +++ b/test/integration/test-apt-by-hash-update @@ -0,0 +1,49 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'foo' 'all' '1.0' + +setupaptarchive --no-update + +APTARCHIVE=$(readlink -f ./aptarchive) + +# make Packages *only* accessable by-hash for this test +mkdir -p aptarchive/dists/unstable/main/binary-i386/by-hash/SHA512 +(cd aptarchive/dists/unstable/main/binary-i386/by-hash/SHA512 && + mv ../../Packages* . && + ln -s Packages.gz $(sha512sum Packages.gz|cut -f1 -d' ') ) + +# add sources +mkdir -p aptarchive/dists/unstable/main/source/by-hash/SHA512 +(cd aptarchive/dists/unstable/main/source/by-hash/SHA512 && + ln -s ../../Sources.gz $(sha512sum ../../Sources.gz|cut -f1 -d' ') +) + +# we moved the Packages file away, normal update won't work +testfailure aptget upate + +# ensure we do not know about "foo" +testequal "Reading package lists... +Building dependency tree... +E: Unable to locate package foo" aptget install -q -s foo + +# ensure we can apt-get update by hash +testsuccess aptget update -o APT::Acquire::By-Hash=1 -o Acquire::Languages=none + +# ensure it works +testequal "Inst foo (1.0 unstable [all]) +Conf foo (1.0 unstable [all])" aptget install -qq -s foo + +# add magic string to Release file ... +MAGIC="Acquire-By-Hash: true" +sed -i "s#Suite: unstable#Suite: unstable\n$MAGIC#" aptarchive/dists/unstable/Release +signreleasefiles +# ... and verify that it fetches by hash now +testsuccess aptget update -o Acquire::Languages=none + diff --git a/test/integration/test-apt-cache b/test/integration/test-apt-cache new file mode 100755 index 000000000..f47c0e08b --- /dev/null +++ b/test/integration/test-apt-cache @@ -0,0 +1,124 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'amd64' 'i386' + +DESCR='Some description + That has multiple lines' +insertpackage 'unstable' 'fancy' 'all' '1' +insertpackage 'unstable,installed' 'foo' 'all' '1' 'Depends: bar +Conflicts: foobar +Recommends: cool (>= 2) | cooler (<< 5)' "$DESCR" +insertpackage 'unstable' 'bar' 'all' '1' 'Depends: bar +Breaks: foo (<< 1) +Replaces: foo (<< 1)' "$DESCR" + +setupaptarchive + +# dpkg is installed by our framework +testdpkginstalled 'dpkg' +testempty aptcache unmet dpkg + +# FIXME: Find some usecase for unmet as it seems kinda useless/broken +#testsuccess aptcache unmet +#testsuccess aptcache unmet foo + +# not too useful to test, but makes coverage green… +testsuccess aptcache stats +cp rootdir/tmp/testsuccess.output stats.output +testsuccess test -s stats.output +testsuccess aptcache xvcg foo +cp rootdir/tmp/testsuccess.output xvcg.output +testsuccess test -s xvcg.output +testsuccess aptcache dotty foo +cp rootdir/tmp/testsuccess.output dotty.output +testsuccess test -s dotty.output +# for this, even the sourcecode says it is useless (expect debugging) +testsuccess aptcache dump +cp rootdir/tmp/testsuccess.output dump.output +testsuccess test -s dump.output + +testequal 'dpkg +bar +fancy +foo' aptcache pkgnames +testequal 'bar' aptcache pkgnames bar +testequal 'fancy +foo' aptcache pkgnames f + +testequal " foo | 1 | file:$(readlink -f .)/aptarchive/ unstable/main amd64 Packages" aptcache madison foo + +### depends + +testequal 'foo + Depends: bar + |Recommends: <cool> + Recommends: <cooler> + Conflicts: <foobar> + Conflicts: <foobar:i386>' aptcache depends foo +testequal 'foo + Depends: bar + Recommends: <cool> + Conflicts: <foobar> + Conflicts: <foobar:i386>' aptcache depends foo -o APT::Cache::ShowOnlyFirstOr=1 +testequal 'foo + Depends: bar + |Recommends: <cool> (>= 2) + Recommends: <cooler> (<< 5) + Conflicts: <foobar> + Conflicts: <foobar:i386>' aptcache depends foo -o APT::Cache::ShowVersion=1 +testequal 'foo + Depends: bar + Conflicts: <foobar> + Conflicts: <foobar:i386>' aptcache depends foo --no-recommends +testequal 'foo + Depends: bar' aptcache depends foo --important +testequal 'foo + Conflicts: <foobar> + Conflicts: <foobar:i386>' aptcache depends foo --important --no-depends --conflicts +testequal 'foo + Depends: bar + |Recommends: <cool> + Recommends: <cooler> + Conflicts: <foobar> + Conflicts: <foobar:i386> +bar + Depends: bar + Breaks: foo + Breaks: <foo:i386> + Replaces: foo + Replaces: <foo:i386> +<cool> +<cooler> +<foobar> +<foobar:i386> +<foo:i386>' aptcache depends foo --recurse +testequal 'foo + Depends: bar +bar + Depends: bar + Replaces: foo + Replaces: <foo:i386> +<foo:i386>' aptcache depends foo --recurse --important --replaces + +## rdpends + +testequal 'foo +Reverse Depends: + bar + bar' aptcache rdepends foo +testequal 'foo +Reverse Depends: + Replaces: bar + Breaks: bar' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 +testequal 'foo +Reverse Depends: + Replaces: bar (<< 1) + Breaks: bar (<< 1)' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 -o APT::Cache::ShowVersion=1 +testequal 'foo +Reverse Depends: + Breaks: bar (<< 1)' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 -o APT::Cache::ShowVersion=1 --important --breaks diff --git a/test/integration/test-apt-cdrom b/test/integration/test-apt-cdrom index 44eccb7bf..7f4b3c257 100755 --- a/test/integration/test-apt-cdrom +++ b/test/integration/test-apt-cdrom @@ -21,7 +21,7 @@ echo 'Description-de: automatisch generiertes Testpaket testing=0.8.15/stable ' >> Translation-de compressfile Translation-de rm -f Translation-en Translation-de -chmod -R -w . +chmod -R 555 . cd - > /dev/null aptcdromlog() { @@ -29,7 +29,7 @@ aptcdromlog() { test ! -e rootdir/media/cdrom || echo "CD-ROM is mounted, but shouldn't be!" test -e rootdir/media/cdrom-unmounted || echo "Unmounted CD-ROM doesn't exist, but it should!" aptcdrom "$@" -o quiet=1 >rootdir/tmp/apt-cdrom.log 2>&1 </dev/null - sed -e '/gpgv/ d' -e '/^Identifying/ d' -e '/Reading / d' rootdir/tmp/apt-cdrom.log + sed -e '/gpgv\?: Signature made/ d' -e '/gpgv\?: Good signature/ d' -e '/^Identifying/ d' -e '/Reading / d' rootdir/tmp/apt-cdrom.log test ! -e rootdir/media/cdrom || echo "CD-ROM is mounted, but shouldn't be!" test -e rootdir/media/cdrom-unmounted || echo "Unmounted CD-ROM doesn't exist, but it should!" } @@ -99,6 +99,7 @@ Conf testing:i386 (0.8.15 stable [i386])' aptget install testing:i386 -s testsuccess aptget purge testing:i386 -y testdpkgnotinstalled testing:i386 + cd downloaded rm -f testing_0.8.15_amd64.deb testsuccess aptget download testing testsuccess test -s testing_0.8.15_amd64.deb @@ -108,6 +109,7 @@ Conf testing:i386 (0.8.15 stable [i386])' aptget install testing:i386 -s testsuccess aptget source testing --dsc-only -d testsuccess test -s testing_0.8.15.dsc rm -f testing_0.8.15.dsc + cd - >/dev/null } testcdromusage @@ -123,7 +125,6 @@ $CDROM_POST" aptcdromlog add msgtest 'Test for the german description translation of' 'testing' aptcache show testing -o Acquire::Languages=de | grep -q '^Description-de: ' && msgpass || msgfail rm -rf rootdir/var/lib/apt/lists -mkdir -p rootdir/var/lib/apt/lists/partial testequal "$CDROM_PRE Found 2 package indexes, 1 source indexes, 1 translation indexes and 1 signatures $CDROM_POST" aptcdromlog add @@ -142,3 +143,8 @@ testcdromusage testsuccess aptget update testfileequal rootdir/tmp/testsuccess.output 'Reading package lists...' testcdromusage + +msgmsg 'Check that nothing touched our' 'CD-ROM' +for file in $(find rootdir/media/cdrom-unmounted/dists); do + testfilestats "$file" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:555" +done diff --git a/test/integration/test-apt-cli-search b/test/integration/test-apt-cli-search index 8f009d57c..1a28ba4da 100755 --- a/test/integration/test-apt-cli-search +++ b/test/integration/test-apt-cli-search @@ -25,6 +25,9 @@ setupaptarchive APTARCHIVE=$(readlink -f ./aptarchive) +testequal 'E: You must give at least one search pattern' aptcache search +testequal 'E: You must give at least one search pattern' apt search + # with OP progress testequal "Sorting... Full Text Search... diff --git a/test/integration/test-apt-cli-show b/test/integration/test-apt-cli-show index 4c8e134d6..930e591e0 100755 --- a/test/integration/test-apt-cli-show +++ b/test/integration/test-apt-cli-show @@ -36,3 +36,14 @@ APT-Sources: file:$APTARCHIVE/ unstable/main i386 Packages Description: Some description That has multiple lines " apt show foo + +# this is the default, but disabled by the testcases +testsuccess apt show foo -o Apt::Cmd::Disable-Script-Warning=0 +cp rootdir/tmp/testsuccess.output aptshow.output +testsuccess grep '^WARNING: ' aptshow.output + +if [ "$(id -u)" != '0' ]; then + testsuccess apt install foo -s -o APT::Get::Show-User-Simulation-Note=1 + cp rootdir/tmp/testsuccess.output aptshow.output + testsuccess grep '^NOTE: ' aptshow.output +fi diff --git a/test/integration/test-apt-cli-update b/test/integration/test-apt-cli-update index 8237bf03f..83cc94b93 100755 --- a/test/integration/test-apt-cli-update +++ b/test/integration/test-apt-cli-update @@ -8,10 +8,17 @@ setupenvironment configarchitecture "i386" insertpackage 'unstable' 'foo' 'all' '2.0' +cp rootdir/var/lib/dpkg/status dpkg.status insertinstalledpackage 'foo' 'all' '1.0' -setupaptarchive +setupaptarchive --no-update APTARCHIVE=$(readlink -f ./aptarchive) +testequal 'E: The update command takes no arguments' apt update -q arguments + testequal "1 package can be upgraded. Run 'apt list --upgradable' to see it." apt update -q + +cp dpkg.status rootdir/var/lib/dpkg/status +insertinstalledpackage 'foo' 'all' '2.0' +testequal 'All packages are up to date.' apt update -q diff --git a/test/integration/test-apt-config b/test/integration/test-apt-config new file mode 100755 index 000000000..2f2ff9d38 --- /dev/null +++ b/test/integration/test-apt-config @@ -0,0 +1,36 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'amd64' + +testsuccess aptconfig dump +testequal 'APT::Architecture "amd64";' aptconfig dump APT::Architecture +testempty aptconfig dump config::which::does::not::exist + +testequal 'APT::Architectures ""; +APT::Architectures:: "amd64";' aptconfig dump APT::Architectures +testequal 'APT::Architectures:: "amd64";' aptconfig dump --no-empty APT::Architectures +testequal 'amd64' aptconfig dump --no-empty --format='%v%n' APT::Architectures + +testempty aptconfig shell +testequal 'E: Arguments not in pairs' aptconfig shell APT::Architecture +testempty aptconfig shell APT::Architecture ARCH # incorrect order +testequal "ARCH='amd64'" aptconfig shell ARCH APT::Architecture + +ROOTDIR="$(readlink -f rootdir)" +testequal "CONFIG='apt.conf'" aptconfig shell CONFIG Dir::Etc::main +testequal "CONFIG='${ROOTDIR}/etc/apt/apt.conf'" aptconfig shell CONFIG Dir::Etc::main/f +testequal "CONFIG='etc/apt/'" aptconfig shell CONFIG Dir::Etc +testequal "CONFIG='${ROOTDIR}/etc/apt/'" aptconfig shell CONFIG Dir::Etc/ # old style +testequal "CONFIG='${ROOTDIR}/etc/apt/'" aptconfig shell CONFIG Dir::Etc/d + +testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles +export DEB_BUILD_PROFILES='nodoc stage1' +testequal 'nodoc +stage1' aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles +unset DEB_BUILD_PROFILES +testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles diff --git a/test/integration/test-apt-download-progress b/test/integration/test-apt-download-progress index 0a9020bec..b2c9effe6 100755 --- a/test/integration/test-apt-download-progress +++ b/test/integration/test-apt-download-progress @@ -13,12 +13,11 @@ changetohttpswebserver assertprogress() { T="$1" testsuccess grep "dlstatus:1:0:Retrieving file 1 of 1" "$T" - if ! egrep -q "dlstatus:1:[0-9]{1,2}\.(.*):Retrieving file 1 of 1" "$T"; then + if ! egrep -q "dlstatus:1:[1-9][0-9](\..*)?:Retrieving file 1 of 1" "$T"; then cat "$T" msgfail "Failed to detect download progress" fi testsuccess grep "dlstatus:1:100:Retrieving file 1 of 1" "$T" - #cat $T } # we need to ensure the file is reasonable big so that apt has a chance to @@ -28,15 +27,13 @@ TESTFILE=testfile.big testsuccess dd if=/dev/zero of=./aptarchive/$TESTFILE bs=800k count=1 msgtest 'download progress works via' 'http' -printf '\n' exec 3> apt-progress.log -testsuccess apthelper download-file "http://localhost:8080/$TESTFILE" http-$TESTFILE -o APT::Status-Fd=3 -o Acquire::http::Dl-Limit=800 +testsuccess --nomsg apthelper download-file "http://localhost:8080/$TESTFILE" http-$TESTFILE -o APT::Status-Fd=3 -o Acquire::http::Dl-Limit=800 assertprogress apt-progress.log msgtest 'download progress works via' 'https' -printf '\n' exec 3> apt-progress.log -testsuccess apthelper download-file "https://localhost:4433/$TESTFILE" https-$TESTFILE -o APT::Status-Fd=3 -o Acquire::https::Dl-Limit=800 +testsuccess --nomsg apthelper download-file "https://localhost:4433/$TESTFILE" https-$TESTFILE -o APT::Status-Fd=3 -o Acquire::https::Dl-Limit=800 assertprogress apt-progress.log # cleanup diff --git a/test/integration/test-apt-extracttemplates b/test/integration/test-apt-extracttemplates index ae2cc8bc2..276862464 100755 --- a/test/integration/test-apt-extracttemplates +++ b/test/integration/test-apt-extracttemplates @@ -8,38 +8,63 @@ setupenvironment configarchitecture 'amd64' # apt-extracttemplates needs this -insertinstalledpackage 'debconf' 'amd64' '1.5' insertinstalledpackage 'pkg-with-template' 'amd64' '1.0' # build a simple package that contains a config and a tempalte mkdir -p DEBIAN -TEMPLATE_STR="Template: foo/bar -Type: string -Description: Some bar var -" -echo "$TEMPLATE_STR" > DEBIAN/templates - CONFIG_STR="#!/bin/sh random shell stuff " echo "$CONFIG_STR" > DEBIAN/config -buildsimplenativepackage 'pkg-with-template' 'amd64' '0.8.15' 'stable' '' 'pkg with template' '' '' './DEBIAN' +testrun() { + local TEMPLATE_STR='Template: foo/bar +Type: string +Description: Some bar var +' + echo "$TEMPLATE_STR" > DEBIAN/templates + buildsimplenativepackage "$1" 'amd64' '0.8.15' 'stable' "$2" 'pkg with template' '' '' './DEBIAN' + + cp dpkg.status rootdir/var/lib/dpkg/status + insertinstalledpackage 'debconf' 'amd64' '3' + + # ensure we get the right stuff out of the file + rm -rf extracttemplates-out rootdir/var/cache/apt + mkdir extracttemplates-out + testsuccess aptextracttemplates -t ./extracttemplates-out incoming/${1}*.deb + OUT='rootdir/tmp/testsuccess.output' + testequal "$1" cut -f1 -d' ' $OUT + if [ -n "$2" ]; then + testequal '' cut -f2 -d' ' $OUT + else + testequal '1.0' cut -f2 -d' ' $OUT + fi + TEMPLATE=$(cut -f3 -d' ' $OUT) + testfileequal "$TEMPLATE" "$TEMPLATE_STR" + CONFIG=$(cut -f4 -d' ' $OUT) + testfileequal "$CONFIG" "$CONFIG_STR" -# ensure we get the right stuff out of the file -mkdir extracttemplates-out -OUT="$(aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template*.deb)" + # ensure that the format of the output string has the right number of dots + for s in "$CONFIG" "$TEMPLATE"; do + NR_DOTS=$(basename "$s" | tr -c -d '.') + testequal '..' echo $NR_DOTS + done -PKG=$(printf "$OUT" | cut -f1 -d' ') -INSTALLED_VER=$(printf "$OUT" | cut -f2 -d' ') -TEMPLATE=$(printf "$OUT" | cut -f3 -d' ') -CONFIG=$(printf "$OUT" | cut -f4 -d' ') + if [ -n "$2" ]; then + rm -rf extracttemplates-out rootdir/var/cache/apt + mkdir extracttemplates-out + cp dpkg.status rootdir/var/lib/dpkg/status + insertinstalledpackage 'debconf' 'amd64' '1' + testempty aptextracttemplates -t ./extracttemplates-out incoming/${1}*.deb + fi +} -testequal "$CONFIG_STR" cat $CONFIG -testequal "$TEMPLATE_STR" cat $TEMPLATE +cp rootdir/var/lib/dpkg/status dpkg.status +testrun 'pkg-with-template' '' +testrun 'pkg-with-template-depends' 'Depends: debconf (>= 2)' +testrun 'pkg-with-template-predepends' 'Pre-Depends: debconf (>= 2)' -# ensure that the format of the output string has the right number of dots -for s in "$CONFIG" "$TEMPLATE"; do - NR_DOTS=$(basename "$s" | tr -c -d .) - testequal ".." echo $NR_DOTS -done +# test with no debconf installed +cp dpkg.status rootdir/var/lib/dpkg/status +testfailure aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template-depends*.deb +testfileequal 'rootdir/tmp/testfailure.output' 'E: Cannot get debconf version. Is debconf installed?' diff --git a/test/integration/test-apt-ftparchive-cachedb b/test/integration/test-apt-ftparchive-cachedb index 0e1986bcd..866e5a469 100755 --- a/test/integration/test-apt-ftparchive-cachedb +++ b/test/integration/test-apt-ftparchive-cachedb @@ -69,32 +69,38 @@ buildsimplenativepackage 'foo' 'i386' '1' 'test' mv incoming/* aptarchive/pool/main/ # generate (empty cachedb) -aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt +testsuccess aptftparchive generate ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt ensure_correct_packages_file ensure_correct_contents_file -testequal " Misses in Cache: 2 - dists/test/Contents-i386: New 402 B Misses in Cache: 0" grep Misses stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' ' Misses in Cache: 2 + dists/test/Contents-i386: New 402 B Misses in Cache: 0' # generate again -aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt +testsuccess aptftparchive generate ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt ensure_correct_packages_file ensure_correct_contents_file -testequal " Misses in Cache: 0 - dists/test/Contents-i386: Misses in Cache: 0" grep Misses stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' ' Misses in Cache: 0 + dists/test/Contents-i386: Misses in Cache: 0' # and again (with removing the Packages file) rm -f ./aptarchive/dists/test/main/binary-i386/* rm -f ./aptarchive/dists/test/Contents-i386 -aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt +testsuccess aptftparchive generate ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt ensure_correct_packages_file ensure_correct_contents_file -testequal " Misses in Cache: 0 - dists/test/Contents-i386: New 402 B Misses in Cache: 0" grep Misses stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' ' Misses in Cache: 0 + dists/test/Contents-i386: New 402 B Misses in Cache: 0' # and clean rm -rf aptarchive/pool/main/* -testequal "packages-main-i386.db" aptftparchive clean ftparchive.conf -aptftparchive clean ftparchive.conf -o Debug::APT::FTPArchive::Clean=1 > clean-out.txt 2>&1 +testequal "packages-main-i386.db" aptftparchive clean ftparchive.conf -q=0 +testsuccess aptftparchive clean ftparchive.conf -q=0 -o Debug::APT::FTPArchive::Clean=1 +cp rootdir/tmp/testsuccess.output clean-out.txt testequal "0 Number of unique keys in the tree" grep unique clean-out.txt testequal "packages-main-i386.db" grep packages-main-i386.db clean-out.txt - diff --git a/test/integration/test-apt-ftparchive-src-cachedb b/test/integration/test-apt-ftparchive-src-cachedb index 0ac4d558f..28321e3c5 100755 --- a/test/integration/test-apt-ftparchive-src-cachedb +++ b/test/integration/test-apt-ftparchive-src-cachedb @@ -106,28 +106,22 @@ mkdir -p aptarchive/dists/test/main/source/ mkdir aptarchive-overrides mkdir aptarchive-cache - - -# generate with --db option -(cd aptarchive && aptftparchive --db ./test.db sources pool/main/ \ - -o APT::FTPArchive::ShowCacheMisses=1 \ - > dists/test/main/source/Sources \ - 2> stats-out.txt - testequal " Misses in Cache: 2" grep Misses stats-out.txt -) +msgtest 'generate with --db option' +cd aptarchive +aptftparchive --db ./test.db sources pool/main/ -q=0 -o APT::FTPArchive::ShowCacheMisses=1 > dists/test/main/source/Sources 2>stats-out.txt && msgpass || msgfail +testsuccess grep Misses stats-out.txt +testfileequal '../rootdir/tmp/testsuccess.output' ' Misses in Cache: 2' +cd .. assert_correct_sources_file -# generate with --db option (again to ensure its in the cache) -(cd aptarchive && aptftparchive --db ./test.db sources pool/main/ \ - -o APT::FTPArchive::ShowCacheMisses=1 \ - > dists/test/main/source/Sources \ - 2> stats-out.txt - testequal " Misses in Cache: 0" grep Misses stats-out.txt -) +msgtest 'generate with --db option (again to ensure its in the cache)' +cd aptarchive +aptftparchive --db ./test.db sources pool/main/ -q=0 -o APT::FTPArchive::ShowCacheMisses=1 > dists/test/main/source/Sources 2>stats-out.txt && msgpass || msgfail +testsuccess grep Misses stats-out.txt +testfileequal '../rootdir/tmp/testsuccess.output' ' Misses in Cache: 0' +cd .. assert_correct_sources_file - - # get ready for the "apt-ftparchive generate" command cat > apt-ftparchive.conf <<"EOF" Dir { @@ -159,31 +153,38 @@ Tree "dists/test" { }; EOF -# generate (empty cachedb) -aptftparchive generate apt-ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt -testequal " Misses in Cache: 2" grep Misses stats-out.txt +msgtest 'generate (empty cachedb)' +testsuccess aptftparchive generate apt-ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal rootdir/tmp/testsuccess.output ' Misses in Cache: 2' assert_correct_sources_file - -# generate again out of the cache +msgtest 'generate again out of the cache' rm -f ./aptarchive/dists/test/main/source/Sources -aptftparchive generate apt-ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt -testequal " Misses in Cache: 0" grep Misses stats-out.txt +testsuccess aptftparchive generate apt-ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal rootdir/tmp/testsuccess.output ' Misses in Cache: 0' assert_correct_sources_file - - # generate invalid files mkdir aptarchive/pool/invalid printf "meep" > aptarchive/pool/invalid/invalid_1.0.dsc testequal " +E: Could not find a record in the DSC 'aptarchive/pool/invalid/invalid_1.0.dsc'" aptftparchive sources aptarchive/pool/invalid +rm -f aptarchive/pool/invalid/invalid_1.0.dsc + +printf "meep: yes" > aptarchive/pool/invalid/invalid_1.0.dsc +testequal " E: Could not find a Source entry in the DSC 'aptarchive/pool/invalid/invalid_1.0.dsc'" aptftparchive sources aptarchive/pool/invalid rm -f aptarchive/pool/invalid/invalid_1.0.dsc # ensure clean works rm -f aptarchive/pool/main/* -aptftparchive clean apt-ftparchive.conf -o Debug::APT::FTPArchive::Clean=1 > clean-out.txt 2>&1 -testequal "0 Number of unique keys in the tree" grep unique clean-out.txt -testequal "sources-main.db" grep sources-main.db clean-out.txt - - +testsuccess aptftparchive clean apt-ftparchive.conf -q=0 -o Debug::APT::FTPArchive::Clean=1 +cp rootdir/tmp/testsuccess.output clean-out.txt +testsuccess grep unique clean-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' "0 Number of unique keys in the tree" +testsuccess grep sources-main.db clean-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' "sources-main.db" diff --git a/test/integration/test-apt-get-build-dep b/test/integration/test-apt-get-build-dep new file mode 100755 index 000000000..87ec6e54d --- /dev/null +++ b/test/integration/test-apt-get-build-dep @@ -0,0 +1,129 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +buildsimplenativepackage 'debhelper' 'i386' '7' 'stable' +buildsimplenativepackage 'build-essential' 'i386' '1' 'stable' + +setupaptarchive +cat > 2vcard_0.5-3.dsc <<EOF +Format: 1.0 +Source: 2vcard +Binary: 2vcard +Architecture: all +Version: 0.5-3 +Maintainer: Martin Albisetti <argentina@gmail.com> +Uploaders: Marcela Tiznado <mlt@debian.org> +Standards-Version: 3.8.0 +Build-Depends: debhelper (>= 5.0.37) +Checksums-Sha1: + b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz + 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz +Checksums-Sha256: + efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz + 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz +Files: + f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz + 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz +EOF + +testequal "Reading package lists... +Building dependency tree... +Note, using file '2vcard_0.5-3.dsc' to get the build dependencies +The following NEW packages will be installed: + build-essential debhelper +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep -s 2vcard_0.5-3.dsc + +cat > 2vcard_0.5-3.dsc <<EOF +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +Format: 1.0 +Source: 2vcard +Binary: 2vcard +Architecture: all +Version: 0.5-3 +Maintainer: Martin Albisetti <argentina@gmail.com> +Uploaders: Marcela Tiznado <mlt@debian.org> +Standards-Version: 3.8.0 +Build-Depends: debhelper (>= 5.0.37) +Checksums-Sha1: + b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz + 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz +Checksums-Sha256: + efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz + 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz +Files: + f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz + 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEARECAAYFAkijKhsACgkQsrBfRdYmq7aA2gCfaOW9riTYVQMx5ajKQVAcctlC +z2UAn1oXgTai6opwhVfkxrlmJ+iRxzuc +=4eRd +-----END PGP SIGNATURE----- +EOF + +testequal "Reading package lists... +Building dependency tree... +Note, using file '2vcard_0.5-3.dsc' to get the build dependencies +The following NEW packages will be installed: + build-essential debhelper +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep --simulate 2vcard_0.5-3.dsc + + +# unpacked source dir +mkdir -p foo-1.0/debian +cat > foo-1.0/debian/control <<'EOF' +Source: apturl +Section: admin +Priority: optional +Maintainer: Michael Vogt <mvo@ubuntu.com> +Build-Depends: debhelper (>= 7) +X-Python3-Version: >= 3.2 +Standards-Version: 3.9.3 + +Package: apturl-common +Architecture: any +Depends: ${python3:Depends}, + ${shlibs:Depends}, + ${misc:Depends}, + python3-apt, + python3-update-manager +Replaces: apturl (<< 0.3.6ubuntu2) +Description: install packages using the apt protocol - common data + AptUrl is a simple graphical application that takes an URL (which follows the + apt-protocol) as a command line option, parses it and carries out the + operations that the URL describes (that is, it asks the user if he wants the + indicated packages to be installed and if the answer is positive does so for + him). + . + This package contains the common data shared between the frontends. + +EOF + +testequal "Reading package lists... +Building dependency tree... +Note, using directory './foo-1.0' to get the build dependencies +The following NEW packages will be installed: + build-essential debhelper +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep --simulate ./foo-1.0 diff --git a/test/integration/test-apt-get-changelog b/test/integration/test-apt-get-changelog index 4ee113482..01f2bd393 100755 --- a/test/integration/test-apt-get-changelog +++ b/test/integration/test-apt-get-changelog @@ -13,26 +13,36 @@ setupaptarchive --no-update changetowebserver testsuccess aptget update +# simulate normal user with non-existent root-owned directories +rm -rf rootdir/var/cache/apt/archives/ +mkdir rootdir/var/cache/apt/archives/ +addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/var/cache/apt/archives || true;" +chmod -R -w rootdir/var/cache/apt/archives + echo 'Apt::Changelogs::Server "http://localhost:8080/";' > rootdir/etc/apt/apt.conf.d/changelog.conf -testequal "'http://localhost:8080//pool/apt_1.0/changelog'" aptget changelog apt --print-uris +testequal "'http://localhost:8080/pool/apt_1.0/changelog'" aptget changelog apt --print-uris + +testequal "'http://localhost:8080/pool/apt_1.0/changelog' +'http://localhost:8080/pool/apt_1.0/changelog'" aptget changelog apt apt --print-uris -testequal "'http://localhost:8080//pool/apt_1.0/changelog' -'http://localhost:8080//pool/apt_1.0/changelog'" aptget changelog apt apt --print-uris +cd downloaded -aptget changelog apt -qq > apt.changelog -testfileequal 'apt.changelog' "$(cat aptarchive/pool/apt_1.0/changelog)" -rm apt.changelog +testsuccess aptget changelog apt -qq +testfileequal '../rootdir/tmp/testsuccess.output' "$(cat ../aptarchive/pool/apt_1.0/changelog)" testsuccess aptget changelog apt -d -testfileequal 'apt.changelog' "$(cat aptarchive/pool/apt_1.0/changelog)" -rm apt.changelog aptarchive/pool/apt_1.0/changelog +testfileequal 'apt.changelog' "$(cat ../aptarchive/pool/apt_1.0/changelog)" +testfilestats 'apt.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +rm -f apt.changelog ../aptarchive/pool/apt_1.0/changelog -testequal "$(cat aptarchive/pool/apt_1.0.changelog)" aptget changelog apt \ +testequal "$(cat ../aptarchive/pool/apt_1.0.changelog)" aptget changelog apt \ -qq -o APT::Changelogs::Server='http://not-on-the-main-server:8080/' testsuccess aptget changelog apt -d -testfileequal 'apt.changelog' "$(cat aptarchive/pool/apt_1.0.changelog)" -rm apt.changelog aptarchive/pool/apt_1.0.changelog +testfileequal 'apt.changelog' "$(cat ../aptarchive/pool/apt_1.0.changelog)" +testfilestats 'apt.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +rm -f apt.changelog ../aptarchive/pool/apt_1.0.changelog -testequal 'E: changelog download failed' aptget changelog apt -qq -o APT::Changelogs::Server='http://not-on-the-main-server:8080/' +testequal 'E: changelog download failed' aptget changelog apt -qq -d -o APT::Changelogs::Server='http://not-on-the-main-server:8080/' +testfailure test -e apt.changelog diff --git a/test/integration/test-apt-get-clean b/test/integration/test-apt-get-clean new file mode 100755 index 000000000..457bff9d3 --- /dev/null +++ b/test/integration/test-apt-get-clean @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'amd64' + +insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'unstable' 'foo' 'all' '2' +insertinstalledpackage 'foo' 'all' '3' + +setupaptarchive + +# nothing to do always works +testsuccess aptget clean + +# generate some dirt and clean it up +touch rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en +mkdir -p rootdir/var/cache/apt/archives +touch rootdir/var/cache/apt/archives/foo_1_all.deb +touch rootdir/var/cache/apt/archives/foo_2_all.deb +touch rootdir/var/cache/apt/archives/foo_3_all.deb +touch rootdir/var/cache/apt/archives/foo_4_all.deb + +testsuccess aptget clean + +testfailure test -e rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en +testfailure test -e rootdir/var/cache/apt/archives/foo_1_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_2_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_3_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_4_all.deb + + diff --git a/test/integration/test-apt-get-download b/test/integration/test-apt-get-download index be3144e1f..6503bbd1c 100755 --- a/test/integration/test-apt-get-download +++ b/test/integration/test-apt-get-download @@ -11,7 +11,26 @@ buildsimplenativepackage 'apt' 'all' '1.0' 'stable' buildsimplenativepackage 'apt' 'all' '2.0' 'unstable' insertinstalledpackage 'vrms' 'all' '1.0' -setupaptarchive +OLD_UMASK="$(umask)" +umask 0027 +setupaptarchive --no-update +umask "$OLD_UMASK" + +# directories should be readable by everyone +find aptarchive/dists -type d | while read dir; do + chmod o+rx "$dir" +done +# apt-ftparchive knows how to chmod files +find aptarchive/dists -name '*Packages*' -type f | while read file; do + testaccessrights "$file" '644' + chmod 640 "$file" +done +# created by the framework without special care +find aptarchive/dists -name '*Release*' -type f | while read file; do + testaccessrights "$file" '640' +done + +testsuccess aptget update testdownload() { local APT="$2" @@ -20,18 +39,34 @@ testdownload() { fi msgtest "Test download of package file $1 with" "$APT" testsuccess --nomsg aptget download ${APT} - testsuccess test -f $1 - rm $1 + testsuccess test -f "$1" + rm -f "$1" } +# normal case as "root" +OLDPWD="$(pwd)" +cd downloaded +testdownload apt_2.0_all.deb apt +cd "$OLDPWD" + +# simulate normal user with non-existent root-owned directories +rm -rf rootdir/var/cache/apt/archives/ +mkdir rootdir/var/cache/apt/archives/ +addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/var/cache/apt/archives || true;" +chmod -R -w rootdir/var/cache/apt/archives + +OLDPWD="$(pwd)" +cd downloaded + # normal case(es) testdownload apt_1.0_all.deb apt stable testdownload apt_2.0_all.deb apt -DEBFILE="$(readlink -f aptarchive)/pool/apt_2.0_all.deb" +DEBFILE="$(readlink -f ../aptarchive)/pool/apt_2.0_all.deb" testequal "'file://${DEBFILE}' apt_2.0_all.deb $(stat -c%s $DEBFILE) SHA512:$(sha512sum $DEBFILE | cut -d' ' -f 1)" aptget download apt --print-uris # deb:677887 +testequal "E: Can't find a source to download version '1.0' of 'vrms:i386'" aptget download vrms --print-uris testequal "E: Can't find a source to download version '1.0' of 'vrms:i386'" aptget download vrms # deb:736962 @@ -45,3 +80,21 @@ rm -f apt_1.0_all.deb apt_2.0_all.deb testsuccess aptget download apt apt apt/unstable apt=2.0 testsuccess test -s apt_2.0_all.deb +# restore "root" rights +cd "$OLDPWD" +chmod -f -R +w $PWD/rootdir/var/cache/apt/archives +rm -rf rootdir/var/cache/apt/archives/ + +# file: debs aren't copied to archives, so change to http which obviously are +changetowebserver +testsuccess aptget update + +# test with already stored deb +testsuccess aptget install -d apt +testsuccess test -s rootdir/var/cache/apt/archives/apt_2.0_all.deb +testaccessrights 'aptarchive/pool/apt_2.0_all.deb' '644' +mv aptarchive/pool/apt_2.0_all.deb aptarchive/pool/apt_2.0_all.deb.gone +cd downloaded +testdownload apt_2.0_all.deb apt +cd "$OLDPWD" +mv aptarchive/pool/apt_2.0_all.deb.gone aptarchive/pool/apt_2.0_all.deb diff --git a/test/integration/test-apt-get-install-deb b/test/integration/test-apt-get-install-deb new file mode 100755 index 000000000..f2e5229cd --- /dev/null +++ b/test/integration/test-apt-get-install-deb @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +# regression test for #754904 +testequal 'E: Unable to locate package /dev/null' aptget install -qq /dev/null + +# and ensure we fail for invalid debs +cat > foo.deb <<EOF +I'm not a deb, I'm a teapot. +EOF +testfailure aptget install ./foo.deb +testsuccess grep '^E: Sub-process Popen returned an error code' rootdir/tmp/testfailure.output +testequal 'E: Encountered a section with no Package: header +E: Problem with MergeLister for ./foo.deb +E: The package lists or status file could not be parsed or opened.' tail -n 3 rootdir/tmp/testfailure.output + +# fakeroot is currently not found, framwork needs updating +buildsimplenativepackage 'foo' 'all' '1.0' +testdpkgnotinstalled 'foo' +testsuccess aptget install ./incoming/foo_1.0_all.deb +testdpkginstalled 'foo' diff --git a/test/integration/test-apt-get-source-authenticated b/test/integration/test-apt-get-source-authenticated index 2cee13923..685bc566b 100755 --- a/test/integration/test-apt-get-source-authenticated +++ b/test/integration/test-apt-get-source-authenticated @@ -21,11 +21,13 @@ APTARCHIVE=$(readlink -f ./aptarchive) rm -f $APTARCHIVE/dists/unstable/*Release* # update without authenticated InRelease file -testsuccess aptget update +testwarning aptget update --allow-insecure-repositories # this all should fail testfailure aptget install -y foo +cd downloaded testfailure aptget source foo - +testfailure test -e foo_2.0.dsc # allow overriding the warning -testsuccess aptget source --allow-unauthenticated foo +testsuccess aptget source --allow-unauthenticated foo -o Debug::pkgAcquire::Worker=1 +testsuccess test -s foo_2.0.dsc -a -L foo_2.0.dsc diff --git a/test/integration/test-apt-get-update-unauth-warning b/test/integration/test-apt-get-update-unauth-warning new file mode 100755 index 000000000..80c51152d --- /dev/null +++ b/test/integration/test-apt-get-update-unauth-warning @@ -0,0 +1,44 @@ +#!/bin/sh +# +# ensure we print warnings for unauthenticated repositories +# +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +# a "normal" package with source and binary +buildsimplenativepackage 'foo' 'all' '2.0' + +setupaptarchive --no-update + +APTARCHIVE=$(readlink -f ./aptarchive) +rm -f $APTARCHIVE/dists/unstable/*Release* + +# update without authenticated files leads to warning +testequal "Ign file: unstable InRelease + File not found +Err file: unstable Release + File not found +W: The repository 'file: unstable Release' does not have a Release file. This is deprecated, please contact the owner of the repository. +E: Use --allow-insecure-repositories to force the update" aptget update --no-allow-insecure-repositories + +# no package foo +testequal 'Listing...' apt list foo +testequal 'lock +partial' ls rootdir/var/lib/apt/lists + +# allow override +testequal "Ign file: unstable InRelease + File not found +Ign file: unstable Release + File not found +Reading package lists... +W: The repository 'file: unstable Release' does not have a Release file. This is deprecated, please contact the owner of the repository." aptget update --allow-insecure-repositories +# ensure we can not install the package +testequal "WARNING: The following packages cannot be authenticated! + foo +E: There are problems and -y was used without --force-yes" aptget install -qq -y foo diff --git a/test/integration/test-apt-get-upgrade b/test/integration/test-apt-get-upgrade index 23446299c..d042e4fb7 100755 --- a/test/integration/test-apt-get-upgrade +++ b/test/integration/test-apt-get-upgrade @@ -8,29 +8,25 @@ setupenvironment configarchitecture "i386" # simple case -insertpackage 'stable' 'upgrade-simple' 'all' '1.0' +insertpackage 'stable,installed' 'upgrade-simple' 'all' '1.0' insertpackage 'unstable' 'upgrade-simple' 'all' '2.0' -insertinstalledpackage 'upgrade-simple' 'all' '1.0' # upgrade with a new dependency -insertpackage 'stable' 'upgrade-with-new-dep' 'all' '1.0' +insertpackage 'stable,installed' 'upgrade-with-new-dep' 'all' '1.0' insertpackage 'unstable' 'upgrade-with-new-dep' 'all' '2.0' 'Depends: new-dep' insertpackage 'stable' 'new-dep' 'all' '1.0' -insertinstalledpackage 'upgrade-with-new-dep' 'all' '1.0' # upgrade with conflict and a new pkg with higher priority than conflict -insertpackage 'stable' 'upgrade-with-conflict' 'all' '1.0' +insertpackage 'stable,installed' 'upgrade-with-conflict' 'all' '1.0' insertpackage 'unstable' 'upgrade-with-conflict' 'all' '2.0' 'Conflicts: conflicting-dep' 'standard' -insertpackage 'stable' 'conflicting-dep' 'all' '1.0' -insertinstalledpackage 'upgrade-with-conflict' 'all' '1.0' -insertinstalledpackage 'conflicting-dep' 'all' '1.0' - +insertpackage 'stable,installed' 'conflicting-dep' 'all' '1.0' setupaptarchive # Test if normal upgrade works as expected testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: upgrade-with-conflict upgrade-with-new-dep The following packages will be upgraded: @@ -42,6 +38,7 @@ Conf upgrade-simple (2.0 unstable [all])' aptget -s upgrade # Test if apt-get upgrade --with-new-pkgs works testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following NEW packages will be installed: new-dep The following packages have been kept back: @@ -59,6 +56,7 @@ Conf upgrade-with-new-dep (2.0 unstable [all])' aptget -s upgrade --with-new-pkg # Test if apt-get dist-upgrade works testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: conflicting-dep The following NEW packages will be installed: diff --git a/test/integration/test-apt-helper b/test/integration/test-apt-helper index 31e471677..ff5d506b5 100755 --- a/test/integration/test-apt-helper +++ b/test/integration/test-apt-helper @@ -5,7 +5,7 @@ TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework setupenvironment -configarchitecture "i386" +configarchitecture 'i386' changetohttpswebserver @@ -54,7 +54,7 @@ echo "http://some-proxy" EOF chmod 755 apt-proxy-detect echo "Acquire::http::Proxy-Auto-Detect \"$(pwd)/apt-proxy-detect\";" > rootdir/etc/apt/apt.conf.d/02proxy-detect - + testequal "Using proxy 'http://some-proxy' for URL 'http://www.example.com/'" apthelper auto-detect-proxy http://www.example.com @@ -65,13 +65,15 @@ echo "https://https-proxy" EOF chmod 755 apt-proxy-detect echo "Acquire::https::Proxy-Auto-Detect \"$(pwd)/apt-proxy-detect\";" > rootdir/etc/apt/apt.conf.d/02proxy-detect - - testequal "Using proxy 'https://https-proxy' for URL 'https://ssl.example.com/'" apthelper auto-detect-proxy https://ssl.example.com - - + testequal "Using proxy 'https://https-proxy' for URL 'https://ssl.example.com/'" apthelper auto-detect-proxy https://ssl.example.com } test_apt_helper_download test_apt_helper_detect_proxy +# test failure modes +testequal 'E: Invalid operation download' apthelper download +testequal 'E: Must specify at least one pair url/filename' apthelper download-file +testequal 'E: Must specify at least one pair url/filename' apthelper download-file http://example.org/ +testequal 'E: Need one URL as argument' apthelper auto-detect-proxy diff --git a/test/integration/test-apt-key b/test/integration/test-apt-key index 47230cb55..b6b7b7909 100755 --- a/test/integration/test-apt-key +++ b/test/integration/test-apt-key @@ -7,107 +7,177 @@ TESTDIR=$(readlink -f $(dirname $0)) setupenvironment configarchitecture 'amd64' -msgtest 'Check that paths in list output are not' 'double-slashed' -aptkey list 2>&1 | grep -q '//' && msgfail || msgpass +# start from a clean plate again +cleanplate() { + rm -rf rootdir/etc/apt/trusted.gpg.d/ rootdir/etc/apt/trusted.gpg + mkdir rootdir/etc/apt/trusted.gpg.d/ +} -msgtest 'Check that paths in finger output are not' 'double-slashed' -aptkey finger 2>&1 | grep -q '//' && msgfail || msgpass +testaptkeys() { + if ! aptkey list | grep '^pub' > aptkey.list; then + echo -n > aptkey.list + fi + testequal "$1" cat ./aptkey.list +} echo 'APT::Key::ArchiveKeyring "./keys/joesixpack.pub"; APT::Key::RemovedKeys "./keys/rexexpired.pub";' > rootdir/etc/apt/apt.conf.d/aptkey.conf -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/DBAC8DAE 2010-08-18' +testrun() { + cleanplate + ln -sf ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testequal 'gpg: key DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed + msgtest 'Check that paths in list output are not' 'double-slashed' + aptkey list 2>&1 | grep -q '//' && msgfail || msgpass + + msgtest 'Check that paths in finger output are not' 'double-slashed' + aptkey finger 2>&1 | grep -q '//' && msgfail || msgpass + + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18' + + testequal 'gpg: key DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed gpg: Total number processed: 1 gpg: unchanged: 1' aptkey --fakeroot update -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/DBAC8DAE 2010-08-18' + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18' -testsuccess aptkey --fakeroot add ./keys/rexexpired.pub + testfailure test -e rootdir/etc/apt/trusted.gpg + testsuccess aptkey --fakeroot add ./keys/rexexpired.pub + msgtest 'Check if trusted.gpg is created with permissions set to' '0644' + if [ "$(stat -c '%a' rootdir/etc/apt/trusted.gpg )" = '644' ]; then + msgpass + else + msgfail + fi -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/27CE74F9 2013-07-12 [expired: 2013-07-13] + testaptkeys 'pub 2048R/27CE74F9 2013-07-12 [expired: 2013-07-13] pub 2048R/DBAC8DAE 2010-08-18' -msgtest 'Execute update again to trigger removal of' 'Rex Expired key' -testsuccess --nomsg aptkey --fakeroot update - -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/DBAC8DAE 2010-08-18' - -msgtest "Try to remove a key which exists, but isn't in the" 'forced keyring' -testsuccess --nomsg aptkey --fakeroot --keyring rootdir/etc/apt/trusted.gpg del DBAC8DAE + msgtest 'Check that Sixpack key can be' 'exported' + aptkey export 'Sixpack' > aptkey.export + aptkey --keyring rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg exportall > aptkey.exportall + testsuccess --nomsg cmp aptkey.export aptkey.exportall + testsuccess test -s aptkey.export + testsuccess test -s aptkey.exportall + + msgtest 'Execute update again to trigger removal of' 'Rex Expired key' + testsuccess --nomsg aptkey --fakeroot update + + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18' + + msgtest "Try to remove a key which exists, but isn't in the" 'forced keyring' + testsuccess --nomsg aptkey --fakeroot --keyring rootdir/etc/apt/trusted.gpg del DBAC8DAE + + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18' + + testsuccess aptkey --fakeroot del DBAC8DAE + testempty aptkey list + + msgtest 'Test key removal with' 'single key in real file' + cleanplate + cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess --nomsg aptkey --fakeroot del DBAC8DAE + testempty aptkey list + testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ + + msgtest 'Test key removal with' 'long key ID' + cleanplate + cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess --nomsg aptkey --fakeroot del 5A90D141DBAC8DAE + testempty aptkey list + testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ + + msgtest 'Test key removal with' 'fingerprint' + cleanplate + cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess --nomsg aptkey --fakeroot del 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE + testempty aptkey list + testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ + + msgtest 'Test key removal with' 'single key in softlink' + cleanplate + ln -s $(readlink -f ./keys/joesixpack.pub) rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess --nomsg aptkey --fakeroot del DBAC8DAE + testempty aptkey list + testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess test -L rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ + + cleanplate + testsuccess aptkey --fakeroot add ./keys/joesixpack.pub + testsuccess aptkey --fakeroot add ./keys/marvinparanoid.pub + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/528144E2 2011-01-16' + cp -a rootdir/etc/apt/trusted.gpg keys/testcase-multikey.pub # store for reuse + + msgtest 'Test key removal with' 'multi key in real file' + cleanplate + cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg + testsuccess --nomsg aptkey --fakeroot del DBAC8DAE + testaptkeys 'pub 2048R/528144E2 2011-01-16' + testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ + + msgtest 'Test key removal with' 'multi key in softlink' + cleanplate + ln -s $(readlink -f ./keys/testcase-multikey.pub) rootdir/etc/apt/trusted.gpg.d/multikey.gpg + testsuccess --nomsg aptkey --fakeroot del DBAC8DAE + testaptkeys 'pub 2048R/528144E2 2011-01-16' + testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ + testfailure test -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg + testsuccess test -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ + + msgtest 'Test key removal with' 'multiple files including key' + cleanplate + cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg + testsuccess --nomsg aptkey --fakeroot del DBAC8DAE + testaptkeys 'pub 2048R/528144E2 2011-01-16' + testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ + testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ + + cleanplate + cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/528144E2 2011-01-16' + msgtest 'Test merge-back of' 'added keys' + testsuccess --nomsg aptkey adv --batch --yes --import keys/rexexpired.pub + testaptkeys 'pub 2048R/27CE74F9 2013-07-12 [expired: 2013-07-13] +pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/528144E2 2011-01-16' -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/DBAC8DAE 2010-08-18' + msgtest 'Test merge-back of' 'removed keys' + testsuccess --nomsg aptkey adv --batch --yes --delete-keys 27CE74F9 + testaptkeys 'pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/DBAC8DAE 2010-08-18 +pub 2048R/528144E2 2011-01-16' -testsuccess aptkey --fakeroot del DBAC8DAE -testempty aptkey list + msgtest 'Test merge-back of' 'removed duplicate keys' + testsuccess --nomsg aptkey adv --batch --yes --delete-keys DBAC8DAE + testaptkeys 'pub 2048R/528144E2 2011-01-16' +} -# start from a clean plate again -cleanplate() { - rm -rf rootdir/etc/apt/trusted.gpg.d/ rootdir/etc/apt/trusted.gpg - mkdir rootdir/etc/apt/trusted.gpg.d/ +setupgpgcommand() { + echo "APT::Key::GPGCommand \"$1\";" > rootdir/etc/apt/apt.conf.d/00gpgcmd + msgtest 'Test that apt-key uses for the following tests command' "$1" + aptkey adv --version >aptkey.version 2>&1 + if grep -q "^Executing: $1 --" aptkey.version; then + msgpass + else + cat aptkey.version + msgfail + fi } -msgtest 'Test key removal with' 'single key in real file' -cleanplate -cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testsuccess --nomsg aptkey --fakeroot del DBAC8DAE -testempty aptkey list -testsuccess test ! -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ - -msgtest 'Test key removal with' 'single key in softlink' -cleanplate -ln -s $(readlink -f ./keys/joesixpack.pub) rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testsuccess --nomsg aptkey --fakeroot del DBAC8DAE -testempty aptkey list -testsuccess test ! -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testsuccess test -L rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ - -cleanplate -testsuccess aptkey --fakeroot add ./keys/joesixpack.pub -testsuccess aptkey --fakeroot add ./keys/marvinparanoid.pub -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/DBAC8DAE 2010-08-18 -pub 2048R/528144E2 2011-01-16' -cp -a rootdir/etc/apt/trusted.gpg keys/testcase-multikey.pub # store for reuse - -msgtest 'Test key removal with' 'multi key in real file' -cleanplate -cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg -testsuccess --nomsg aptkey --fakeroot del DBAC8DAE -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/528144E2 2011-01-16' -testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ - -msgtest 'Test key removal with' 'multi key in softlink' -cleanplate -ln -s $(readlink -f ./keys/testcase-multikey.pub) rootdir/etc/apt/trusted.gpg.d/multikey.gpg -testsuccess --nomsg aptkey --fakeroot del DBAC8DAE -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/528144E2 2011-01-16' -testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ -testsuccess test ! -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg -testsuccess test -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ - -msgtest 'Test key removal with' 'multiple files including key' -cleanplate -cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg -testsuccess --nomsg aptkey --fakeroot del DBAC8DAE -aptkey list | grep '^pub' > aptkey.list -testfileequal ./aptkey.list 'pub 2048R/528144E2 2011-01-16' -testsuccess test ! -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~ -testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~ - -msgtest 'Test key removal with' '8 byte key ID' -cleanplate -cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg -testsuccess --nomsg aptkey --fakeroot del 5A90D141DBAC8DAE -testempty aptkey list +# run with default (whatever this is) +testrun +# run with … +setupgpgcommand 'gpg' +testrun +setupgpgcommand 'gpg2' +testrun diff --git a/test/integration/test-apt-key-net-update b/test/integration/test-apt-key-net-update index 4b38cd9b5..b3c118555 100755 --- a/test/integration/test-apt-key-net-update +++ b/test/integration/test-apt-key-net-update @@ -28,6 +28,9 @@ gpg: key F68C85A3: public key "Test Automatic Archive Signing Key <ftpmaster@exa gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)' aptkey --fakeroot net-update +aptkey list | grep '^pub' > aptkey.list +testfileequal ./aptkey.list 'pub 1024R/F68C85A3 2013-12-19 +pub 2048R/DBAC8DAE 2010-08-18' # now try a different one # setup archive-keyring @@ -38,6 +41,8 @@ echo 'APT::Key::Net-Update-Enabled "1";' >> ./aptconfig.conf # test against the "real" webserver testequal "Checking for new archive signing keys now -Key 'E8525D47528144E2' not added. It is not signed with a master key" aptkey --fakeroot net-update - +Key 'DE66AECA9151AFA1877EC31DE8525D47528144E2' not added. It is not signed with a master key" aptkey --fakeroot net-update +aptkey list | grep '^pub' > aptkey.list +testfileequal ./aptkey.list 'pub 1024R/F68C85A3 2013-12-19 +pub 2048R/DBAC8DAE 2010-08-18' diff --git a/test/integration/test-apt-mark b/test/integration/test-apt-mark new file mode 100755 index 000000000..5a3ae4b2f --- /dev/null +++ b/test/integration/test-apt-mark @@ -0,0 +1,101 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable' 'bar' 'amd64,i386' '1' +insertpackage 'unstable' 'uninstalled' 'all' '1' +insertpackage 'unstable' 'uninstalled-native' 'amd64' '1' + +insertinstalledpackage 'foo' 'all' '1' +insertinstalledpackage 'bar' 'amd64' '1' + +setupaptarchive + +# dpkg is "installed" by our test framework +testdpkginstalled dpkg + +testnoautopkg() { + testempty aptmark showauto + testempty aptcache showauto + testequal 'bar +dpkg +foo' aptmark showmanual + testequal 'bar +foo' aptmark showmanual bar foo uninstalled +} +testfooisauto() { + testequal 'foo' aptmark showauto + testequal 'foo' aptcache showauto + testequal 'foo' aptmark showauto foo + testequal 'foo' aptcache showauto foo + testequal 'bar +dpkg' aptmark showmanual + testequal 'bar' aptmark showmanual bar +} +testmarkonpkgasauto() { + testsuccess $1 $2 foo + testfooisauto + testsuccess $1 $2 foo + testfooisauto + + testsuccess $1 $3 foo + testnoautopkg + testsuccess $1 $3 foo + testnoautopkg +} + +testequal 'E: No packages found' aptmark auto +testequal 'E: No packages found' aptmark manual + +testnoautopkg +testmarkonpkgasauto 'aptmark' 'auto' 'manual' +testmarkonpkgasauto 'aptmark' 'markauto' 'unmarkauto' +testmarkonpkgasauto 'aptget' 'markauto' 'unmarkauto' + +testnoholdpkg() { + testempty aptmark showhold + testempty aptmark showholds # typical "typo" + testempty aptmark showhold dpkg + testempty aptmark showholds dpkg +} +testpkgonhold() { + testequal "$1" aptmark showhold + testequal "$1" aptmark showholds + testequal "$1" aptmark showhold $1 + testequal "$1" aptmark showholds $1 +} +testmarkonepkgashold() { + testsuccess aptmark hold $1 + testpkgonhold $1 + testsuccess aptmark hold $1 + testpkgonhold $1 + testsuccess aptmark unhold $1 + testnoholdpkg + testsuccess aptmark unhold $1 + testnoholdpkg +} + +testequal 'E: No packages found' aptmark hold +testequal 'E: No packages found' aptmark unhold + +testnoholdpkg +testmarkonepkgashold 'foo' +testmarkonepkgashold 'bar' + +msgtest 'dpkg supports --merge-avail via' 'stdin' +if dpkg --merge-avail - < /dev/null >/dev/null 2>&1; then + msgpass +else + msgskip 'dpkg version too old' + exit 0 +fi + +testmarkonepkgashold 'uninstalled' +testmarkonepkgashold 'uninstalled-native' + +testequal 'uninstalled set on hold.' aptmark hold uninstalled +testequal 'uninstalled-native set on hold.' aptmark hold uninstalled-native diff --git a/test/integration/test-apt-progress-fd b/test/integration/test-apt-progress-fd index 68cc0439c..90e6ef7e4 100755 --- a/test/integration/test-apt-progress-fd +++ b/test/integration/test-apt-progress-fd @@ -16,7 +16,7 @@ setupaptarchive exec 3> apt-progress.log testsuccess aptget install testing=0.1 -y -o APT::Status-Fd=3 testequal "dlstatus:1:0:Retrieving file 1 of 1 -dlstatus:1:0:Retrieving file 1 of 1 +dlstatus:1:20:Retrieving file 1 of 1 pmstatus:dpkg-exec:0:Running dpkg pmstatus:testing:0:Installing testing (amd64) pmstatus:testing:16.6667:Preparing testing (amd64) @@ -32,7 +32,7 @@ pmstatus:dpkg-exec:83.3333:Running dpkg" cat apt-progress.log exec 3> apt-progress.log testsuccess aptget install testing=0.8.15 -y -o APT::Status-Fd=3 testequal "dlstatus:1:0:Retrieving file 1 of 1 -dlstatus:1:0:Retrieving file 1 of 1 +dlstatus:1:20:Retrieving file 1 of 1 pmstatus:dpkg-exec:0:Running dpkg pmstatus:testing:0:Installing testing (amd64) pmstatus:testing:16.6667:Preparing testing (amd64) @@ -48,7 +48,7 @@ pmstatus:dpkg-exec:83.3333:Running dpkg" cat apt-progress.log exec 3> apt-progress.log testsuccess aptget install testing=0.8.15 --reinstall -y -o APT::Status-Fd=3 testequal "dlstatus:1:0:Retrieving file 1 of 1 -dlstatus:1:0:Retrieving file 1 of 1 +dlstatus:1:20:Retrieving file 1 of 1 pmstatus:dpkg-exec:0:Running dpkg pmstatus:testing:0:Installing testing (amd64) pmstatus:testing:16.6667:Preparing testing (amd64) @@ -76,7 +76,7 @@ testsuccess aptget install testing2:i386 -y -o APT::Status-Fd=3 # and compare testequal "dlstatus:1:0:Retrieving file 1 of 1 -dlstatus:1:0:Retrieving file 1 of 1 +dlstatus:1:20:Retrieving file 1 of 1 pmstatus:dpkg-exec:0:Running dpkg pmstatus:testing2:0:Installing testing2 (i386) pmstatus:testing2:16.6667:Preparing testing2 (i386) diff --git a/test/integration/test-apt-sources-deb822 b/test/integration/test-apt-sources-deb822 index 5f54b7531..d8b2334ad 100755 --- a/test/integration/test-apt-sources-deb822 +++ b/test/integration/test-apt-sources-deb822 @@ -23,14 +23,14 @@ Description: summay msgtest 'Test sources.list' 'old style' echo "deb http://ftp.debian.org/debian stable main" > $SOURCES -testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 " aptget update --print-uris msgtest 'Test sources.list' 'simple deb822' echo "$BASE" > $SOURCES -testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 " aptget update --print-uris @@ -39,29 +39,29 @@ msgtest 'Test deb822 with' 'two entries' echo "$BASE" > $SOURCES echo "" >> $SOURCES echo "$BASE" | sed s/stable/unstable/ >> $SOURCES -testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 -'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 : +'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/unstable/InRelease' ftp.debian.org_debian_dists_unstable_InRelease 0 " aptget update --print-uris # two suite entries msgtest 'Test deb822 with' 'two Suite entries' echo "$BASE" | sed -e "s/stable/stable unstable/" > $SOURCES -testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 -'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 : +'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/unstable/InRelease' ftp.debian.org_debian_dists_unstable_InRelease 0 " aptget update --print-uris msgtest 'Test deb822' 'architecture option' echo "$BASE" > $SOURCES echo "Architectures: amd64 armel" >> $SOURCES -testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-amd64/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-amd64_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/binary-armel/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-armel_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-amd64/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-armel/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-armel_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 " aptget update --print-uris @@ -85,19 +85,19 @@ testempty aptget update --print-uris # multiple URIs msgtest 'Test deb822 sources.list file which has' 'Multiple URIs work' echo "$BASE" | sed -e 's#http://ftp.debian.org/debian#http://ftp.debian.org/debian http://ftp.de.debian.org/debian#' > $SOURCES -testequal --nomsg "'http://ftp.de.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.de.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.de.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.de.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.de.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.de.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.de.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.de.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.de.debian.org/debian/dists/stable/InRelease' ftp.de.debian.org_debian_dists_stable_InRelease 0 -'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 " aptget update --print-uris # multiple Type in one field msgtest 'Test deb822 sources.list file which has' 'Multiple Types work' echo "$BASE" | sed -e 's#Types: deb#Types: deb deb-src#' > $SOURCES -testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/source/Sources.bz2' ftp.debian.org_debian_dists_stable_main_source_Sources 0 : -'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : -'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/source/Sources.bz2' ftp.debian.org_debian_dists_stable_main_source_Sources 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 " aptget update --print-uris # a Suite @@ -107,6 +107,6 @@ Types: deb URIs: http://emacs.naquadah.org Suites: stable/ EOF -testequal --nomsg "'http://emacs.naquadah.org/stable/Packages.bz2' emacs.naquadah.org_stable_Packages 0 : -'http://emacs.naquadah.org/stable/en.bz2' emacs.naquadah.org_stable_en 0 : +testequal --nomsg "'http://emacs.naquadah.org/stable/Packages.bz2' emacs.naquadah.org_stable_Packages 0 +'http://emacs.naquadah.org/stable/en.bz2' emacs.naquadah.org_stable_en 0 'http://emacs.naquadah.org/stable/InRelease' emacs.naquadah.org_stable_InRelease 0 " aptget update --print-uris diff --git a/test/integration/test-apt-update-expected-size b/test/integration/test-apt-update-expected-size new file mode 100755 index 000000000..045217a77 --- /dev/null +++ b/test/integration/test-apt-update-expected-size @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'apt' 'all' '1.0' + +setupaptarchive --no-update +changetowebserver + +# normal update works fine +testsuccess aptget update + +# make InRelease really big to trigger fallback +mv aptarchive/dists/unstable/InRelease aptarchive/dists/unstable/InRelease.good +dd if=/dev/zero of=aptarchive/dists/unstable/InRelease bs=1M count=2 2>/dev/null +touch -d '+1hour' aptarchive/dists/unstable/InRelease +testsuccess aptget update -o Apt::Get::List-Cleanup=0 -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0 +msgtest 'Check that the max write warning is triggered' +if grep -q "Writing more data than expected" rootdir/tmp/testsuccess.output; then + msgpass +else + cat rootdir/tmp/testsuccess.output + msgfail +fi +# ensure the failed InRelease file got renamed +testsuccess ls rootdir/var/lib/apt/lists/partial/*InRelease.FAILED +mv aptarchive/dists/unstable/InRelease.good aptarchive/dists/unstable/InRelease + + +# append junk at the end of the Packages.gz/Packages +SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)" +find aptarchive -name 'Packages*' | while read pkg; do + echo "1234567890" >> "$pkg" +done +NEW_SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)" +rm -f rootdir/var/lib/apt/lists/localhost* +testequal "W: Failed to fetch http://localhost:8080/dists/unstable/main/binary-i386/Packages Writing more data than expected ($NEW_SIZE > $SIZE) + +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq diff --git a/test/integration/test-apt-update-file b/test/integration/test-apt-update-file index fbcd473cc..1ecf9a38a 100755 --- a/test/integration/test-apt-update-file +++ b/test/integration/test-apt-update-file @@ -10,27 +10,26 @@ TESTDIR=$(readlink -f $(dirname $0)) setupenvironment configarchitecture "amd64" -configcompression 'bz2' 'gz' +configcompression 'bz2' 'gz' -insertpackage 'unstable' 'foo' 'all' '1.0' +insertpackage 'unstable' 'foo' 'all' '1' +insertsource 'unstable' 'foo' 'all' '1' -umask 022 setupaptarchive --no-update # ensure the archive is not writable +addtrap 'prefix' 'chmod 750 aptarchive/dists/unstable/main/binary-amd64;' chmod 550 aptarchive/dists/unstable/main/binary-amd64 -testsuccess aptget update -qq -testsuccess aptget update -qq -aptget update -qq -o Debug::pkgAcquire::Auth=1 2> output.log +testsuccess aptget update +testsuccess aptget update -o Debug::pkgAcquire::Auth=1 +cp -a rootdir/tmp/testsuccess.output rootdir/tmp/update.output -# ensure that the hash of the uncompressed file was verified even on a local -# ims hit +# ensure that the hash of the uncompressed file was verified even on a local ims hit canary="SHA512:$(bzcat aptarchive/dists/unstable/main/binary-amd64/Packages.bz2 | sha512sum |cut -f1 -d' ')" -grep -q "RecivedHash: $canary" output.log +testsuccess grep -- "$canary" rootdir/tmp/update.output # foo is still available testsuccess aptget install -s foo - -# the cleanup should still work -chmod 750 aptarchive/dists/unstable/main/binary-amd64 +testsuccess aptcache showsrc foo +testsuccess aptget source foo --print-uris diff --git a/test/integration/test-apt-update-filesize-mismatch b/test/integration/test-apt-update-filesize-mismatch new file mode 100755 index 000000000..f78b83b5f --- /dev/null +++ b/test/integration/test-apt-update-filesize-mismatch @@ -0,0 +1,50 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' +configcompression 'gz' + +insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'testing' 'foo2' 'all' '1' +insertsource 'testing' 'foo' 'all' '1' +insertsource 'testing' 'foo2' 'all' '1' + +setupaptarchive --no-update +changetowebserver + +find aptarchive \( -name 'Packages' -o -name 'Sources' -o -name 'Translation-en' \) -delete +for release in $(find aptarchive -name 'Release'); do + cp "$release" "${release}.backup" +done + +testsuccess aptget update +testsuccess aptcache show foo +testsuccess aptget install foo -s + +for get in $(sed -n 's#^GET /\([^ ]\+\.gz\) HTTP.\+$#\1#p' aptarchive/webserver.log); do + for ext in '' '.gz'; do + COMPRESSFILE="$get" + get="${get}${ext}" + FILE="$(basename "$get" '.gz')" + msgmsg 'Test filesize mismatch with file' "$FILE" + rm -rf rootdir/var/lib/apt/lists + + for release in $(find aptarchive -name 'Release'); do + SIZE="$(awk "/$FILE\$/ { print \$2; exit }" "${release}.backup")" + sed "s# $SIZE # $(($SIZE + 111)) #" "${release}.backup" > "$release" + done + signreleasefiles + + testfailure aptget update -o Debug::pkgAcquire::Worker=1 + cp rootdir/tmp/testfailure.output rootdir/tmp/update.output + testsuccess grep -E "$(basename -s '.gz' "$COMPRESSFILE").*Hash Sum mismatch" rootdir/tmp/update.output + testfailure aptcache show foo + testfailure aptget install foo -s + + testfailure aptcache show bar + testfailure aptget install bar -s + done +done diff --git a/test/integration/test-apt-update-hashsum-mismatch b/test/integration/test-apt-update-hashsum-mismatch new file mode 100755 index 000000000..c2c5b3887 --- /dev/null +++ b/test/integration/test-apt-update-hashsum-mismatch @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' +configcompression 'gz' + +insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'testing' 'foo2' 'all' '1' +insertsource 'testing' 'foo' 'all' '1' +insertsource 'testing' 'foo2' 'all' '1' + +setupaptarchive --no-update +changetowebserver + +echo 'Package: bar +Maintainer: Doctor Evil <evil@example.com> +Description: come to the dark side +' > aptarchive/DoctorEvil +compressfile aptarchive/DoctorEvil + +find aptarchive \( -name 'Packages' -o -name 'Sources' -o -name 'Translation-en' \) -delete + +testsuccess aptget update +testsuccess aptcache show foo +testsuccess aptget install foo -s + +for get in $(sed -n 's#^GET /\([^ ]\+\.gz\) HTTP.\+$#\1#p' aptarchive/webserver.log); do + msgmsg 'Test hashsum mismatch with file' "$get" + rm -rf rootdir/var/lib/apt/lists + webserverconfig 'aptwebserver::overwrite' '' + webserverconfig "aptwebserver::overwrite::$(printf '%s' "${get}" | sed 's#/#%2F#g' )::filename" '%2FDoctorEvil.gz' + + testfailure aptget update + cp rootdir/tmp/testfailure.output rootdir/tmp/update.output + testsuccess grep -E "$(basename -s '.gz' "$get").*Hash Sum mismatch" rootdir/tmp/update.output + testfailure aptcache show foo + testfailure aptget install foo -s + + testfailure aptcache show bar + testfailure aptget install bar -s +done diff --git a/test/integration/test-apt-update-ims b/test/integration/test-apt-update-ims new file mode 100755 index 000000000..0fa882d78 --- /dev/null +++ b/test/integration/test-apt-update-ims @@ -0,0 +1,90 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable' + +setupaptarchive --no-update +changetowebserver + +runtest() { + configallowinsecurerepositories "${1:-false}" + + rm -f rootdir/var/lib/apt/lists/localhost* + + if [ "$1" = 'true' ]; then + testwarning aptget update + else + testsuccess aptget update + fi + + # ensure no leftovers in partial + testfailure ls "rootdir/var/lib/apt/lists/partial/*" + + # check that I-M-S header is kept in redirections + testequal "$EXPECT" aptget update -o Debug::pkgAcquire::Worker=0 -o Debug::Acquire::http=0 + + # ensure that we still do a hash check on ims hit + msgtest 'Test I-M-S' 'reverify' + aptget update -o Debug::pkgAcquire::Auth=1 2>&1 | grep -A2 'ReceivedHash:' | grep -q -- '- SHA' && msgpass || msgfail + + # ensure no leftovers in partial + testfailure ls "rootdir/var/lib/apt/lists/partial/*" +} + +msgmsg "InRelease" +EXPECT="Hit http://localhost:8080 unstable InRelease +Hit http://localhost:8080 unstable/main Sources +Hit http://localhost:8080 unstable/main amd64 Packages +Hit http://localhost:8080 unstable/main Translation-en +Reading package lists..." +# with InRelease +runtest + +# with gzip +echo "Acquire::GzipIndexes "1";" > rootdir/etc/apt/apt.conf.d/02compressindex +runtest + +msgmsg "Release/Release.gpg" +# with Release/Release.gpg +EXPECT="Ign http://localhost:8080 unstable InRelease + 404 Not Found +Hit http://localhost:8080 unstable Release +Hit http://localhost:8080 unstable Release.gpg +Hit http://localhost:8080 unstable/main Sources +Hit http://localhost:8080 unstable/main amd64 Packages +Hit http://localhost:8080 unstable/main Translation-en +Reading package lists..." + +find aptarchive -name 'InRelease' -delete + +echo "Acquire::GzipIndexes "0";" > rootdir/etc/apt/apt.conf.d/02compressindex +runtest + +echo "Acquire::GzipIndexes "1";" > rootdir/etc/apt/apt.conf.d/02compressindex +runtest + +# no Release.gpg or InRelease +msgmsg "Release only" +EXPECT="Ign http://localhost:8080 unstable InRelease + 404 Not Found +Hit http://localhost:8080 unstable Release +Ign http://localhost:8080 unstable Release.gpg + 404 Not Found +Hit http://localhost:8080 unstable/main Sources +Hit http://localhost:8080 unstable/main amd64 Packages +Hit http://localhost:8080 unstable/main Translation-en +Reading package lists... +W: The data from 'http://localhost:8080 unstable Release.gpg' is not signed. Packages from that repository can not be authenticated." + +find aptarchive -name 'Release.gpg' -delete + +echo "Acquire::GzipIndexes "0";" > rootdir/etc/apt/apt.conf.d/02compressindex +runtest "true" + +echo "Acquire::GzipIndexes "1";" > rootdir/etc/apt/apt.conf.d/02compressindex +runtest "true" diff --git a/test/integration/test-apt-update-nofallback b/test/integration/test-apt-update-nofallback new file mode 100755 index 000000000..e82a976a6 --- /dev/null +++ b/test/integration/test-apt-update-nofallback @@ -0,0 +1,247 @@ +#!/bin/sh +# +# ensure we never fallback from a signed to a unsigned repo +# +# hash checks are done in +# +set -e + +simulate_mitm_and_inject_evil_package() +{ + rm -f $APTARCHIVE/dists/unstable/InRelease + rm -f $APTARCHIVE/dists/unstable/Release.gpg + inject_evil_package +} + +inject_evil_package() +{ + cat > $APTARCHIVE/dists/unstable/main/binary-i386/Packages <<EOF +Package: evil +Installed-Size: 29 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Version: 1.0 +Filename: pool/evil_1.0_all.deb +Size: 1270 +Description: an autogenerated evil package +EOF + # avoid ims hit + touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages +} + +assert_update_is_refused_and_last_good_state_used() +{ + testequal "E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update -qq + + assert_repo_is_intact +} + +assert_repo_is_intact() +{ + testequal "foo/unstable 2.0 all" apt list -q + testsuccess aptget install -y -s foo + testfailure aptget install -y evil + testsuccess aptget source foo --print-uris + + LISTDIR=rootdir/var/lib/apt/lists + if ! ( ls $LISTDIR/*InRelease >/dev/null 2>&1 || + ls $LISTDIR/*Release.gpg >/dev/null 2>&1 ); then + echo "Can not find InRelease/Release.gpg in $(ls $LISTDIR)" + msgfail + fi +} + +setupaptarchive_with_lists_clean() +{ + setupaptarchive --no-update + rm -rf rootdir/var/lib/apt/lists +} + +test_from_inrelease_to_unsigned() +{ + # setup archive with InRelease file + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + simulate_mitm_and_inject_evil_package + assert_update_is_refused_and_last_good_state_used + testfileequal lists.before "$(listcurrentlistsdirectory)" +} + +test_from_release_gpg_to_unsigned() +{ + # setup archive with Release/Release.gpg (but no InRelease) + setupaptarchive_with_lists_clean + rm $APTARCHIVE/dists/unstable/InRelease + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + simulate_mitm_and_inject_evil_package + assert_update_is_refused_and_last_good_state_used + testfileequal lists.before "$(listcurrentlistsdirectory)" +} + +test_from_inrelease_to_unsigned_with_override() +{ + # setup archive with InRelease file + setupaptarchive_with_lists_clean + # FIXME: is not what the server reported 4104 4106 + testsuccess aptget update #-o Debug::pkgAcquire::Worker=1 + + # simulate moving to a unsigned but otherwise valid repo + simulate_mitm_and_inject_evil_package + generatereleasefiles + + # and ensure we can update to it (with enough force) + testwarning aptget update --allow-insecure-repositories \ + -o Acquire::AllowDowngradeToInsecureRepositories=1 + # but that the individual packages are still considered untrusted + testequal "WARNING: The following packages cannot be authenticated! + evil +E: There are problems and -y was used without --force-yes" aptget install -qq -y evil +} + +test_cve_2012_0214() +{ + # see https://bugs.launchpad.net/ubuntu/+source/apt/+bug/947108 + # + # it was possible to MITM the download so that InRelease/Release.gpg + # are not delivered (404) and a altered Release file was send + # + # apt left the old InRelease file in /var/lib/apt/lists and downloaded + # the unauthenticated Release file too giving the false impression that + # Release was authenticated + # + # Note that this is pretty much impossible nowdays because: + # a) InRelease is left as is, not split to InRelease/Release as it was + # in the old days + # b) we refuse to go from signed->unsigned + # + # Still worth having a regression test the simulates the condition + + # setup archive with InRelease + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # do what CVE-2012-0214 did + rm $APTARCHIVE/dists/unstable/InRelease + rm $APTARCHIVE/dists/unstable/Release.gpg + inject_evil_package + # build valid Release file + aptftparchive -qq release ./aptarchive > aptarchive/dists/unstable/Release + + assert_update_is_refused_and_last_good_state_used + testfileequal lists.before "$(listcurrentlistsdirectory)" + + # ensure there is no _Release file downloaded + testfailure ls rootdir/var/lib/apt/lists/*_Release +} + +test_subvert_inrelease() +{ + # setup archive with InRelease + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # replace InRelease with something else + mv $APTARCHIVE/dists/unstable/Release $APTARCHIVE/dists/unstable/InRelease + + testequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease Does not start with a cleartext signature + +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + # ensure we keep the repo + testfileequal lists.before "$(listcurrentlistsdirectory)" + assert_repo_is_intact +} + +test_inrelease_to_invalid_inrelease() +{ + # setup archive with InRelease + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # now remove InRelease and subvert Release do no longer verify + sed -i 's/Codename.*/Codename: evil!'/ $APTARCHIVE/dists/unstable/InRelease + inject_evil_package + + testequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable InRelease: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> + +W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> + +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + # ensure we keep the repo + testfailure grep 'evil' rootdir/var/lib/apt/lists/*InRelease + testfileequal lists.before "$(listcurrentlistsdirectory)" + assert_repo_is_intact +} + +test_release_gpg_to_invalid_release_release_gpg() +{ + # setup archive with InRelease + setupaptarchive_with_lists_clean + rm $APTARCHIVE/dists/unstable/InRelease + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # now subvert Release do no longer verify + echo "Some evil data" >> $APTARCHIVE/dists/unstable/Release + inject_evil_package + + testequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable Release.gpg: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> + +W: Failed to fetch file:${APTARCHIVE}/dists/unstable/Release.gpg The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> + +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfailure grep 'evil' rootdir/var/lib/apt/lists/*Release + testfileequal lists.before "$(listcurrentlistsdirectory)" + assert_repo_is_intact +} + + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +# a "normal" package with source and binary +buildsimplenativepackage 'foo' 'all' '2.0' + +# setup the archive and ensure we have a single package that installs fine +setupaptarchive +APTARCHIVE=$(readlink -f ./aptarchive) +assert_repo_is_intact + +# test the various cases where a repo may go from signed->unsigned +msgmsg "test_from_inrelease_to_unsigned" +test_from_inrelease_to_unsigned + +msgmsg "test_from_release_gpg_to_unsigned" +test_from_release_gpg_to_unsigned + +# ensure we do not regress on CVE-2012-0214 +msgmsg "test_cve_2012_0214" +test_cve_2012_0214 + +# ensure InRelase can not be subverted +msgmsg "test_subvert_inrelease" +test_subvert_inrelease + +# ensure we revert to last good state if InRelease does not verify +msgmsg "test_inrelease_to_invalid_inrelease" +test_inrelease_to_invalid_inrelease + +# ensure we revert to last good state if Release/Release.gpg does not verify +msgmsg "test_release_gpg_to_invalid_release_release_gpg" +test_release_gpg_to_invalid_release_release_gpg + +# ensure we can override the downgrade error +msgmsg "test_from_inrelease_to_unsigned_with_override" +test_from_inrelease_to_unsigned_with_override diff --git a/test/integration/test-apt-update-rollback b/test/integration/test-apt-update-rollback new file mode 100755 index 000000000..9efc194a0 --- /dev/null +++ b/test/integration/test-apt-update-rollback @@ -0,0 +1,203 @@ +#!/bin/sh +# +# test that apt-get update is transactional +# +set -e + +avoid_ims_hit() { + touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages* + touch -d '+1hour' aptarchive/dists/unstable/main/source/Sources* + touch -d '+1hour' aptarchive/dists/unstable/*Release* + + touch -d '-1hour' rootdir/var/lib/apt/lists/* +} + +create_fresh_archive() +{ + rm -rf aptarchive/* + rm -f rootdir/var/lib/apt/lists/_* rootdir/var/lib/apt/lists/partial/* + + insertpackage 'unstable' 'old' 'all' '1.0' + + setupaptarchive --no-update +} + +add_new_package() { + insertpackage "unstable" "new" "all" "1.0" + insertsource "unstable" "new" "all" "1.0" + + setupaptarchive --no-update "$@" +} + +break_repository_sources_index() { + printf 'xxx' > $APTARCHIVE/dists/unstable/main/source/Sources + compressfile "$APTARCHIVE/dists/unstable/main/source/Sources" "$@" +} + +start_with_good_inrelease() { + create_fresh_archive + testsuccess aptget update + listcurrentlistsdirectory > lists.before + testequal "old/unstable 1.0 all" apt list -q +} + +test_inrelease_to_new_inrelease() { + msgmsg 'Test InRelease to new InRelease works fine' + start_with_good_inrelease + + add_new_package '+1hour' + testsuccess aptget update -o Debug::Acquire::Transaction=1 + testequal "new/unstable 1.0 all +old/unstable 1.0 all" apt list -q +} + +test_inrelease_to_broken_hash_reverts_all() { + msgmsg 'Test InRelease to broken InRelease reverts everything' + start_with_good_inrelease + + add_new_package '+1hour' + # break the Sources file + break_repository_sources_index '+1hour' + + # test the error condition + testequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources Hash Sum mismatch + +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + # ensure that the Packages file is also rolled back + testfileequal lists.before "$(listcurrentlistsdirectory)" + testequal "E: Unable to locate package new" aptget install new -s -qq +} + +test_inrelease_to_valid_release() { + msgmsg 'Test InRelease to valid Release' + start_with_good_inrelease + + add_new_package '+1hour' + # switch to a unsigned repo now + rm $APTARCHIVE/dists/unstable/InRelease + rm $APTARCHIVE/dists/unstable/Release.gpg + + # update fails + testequal "E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update -qq + + # test that security downgrade was not successful + testfileequal lists.before "$(listcurrentlistsdirectory)" + testsuccess aptget install old -s + testfailure aptget install new -s + testsuccess ls $ROOTDIR/var/lib/apt/lists/*_InRelease + testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release +} + +test_inrelease_to_release_reverts_all() { + msgmsg 'Test InRelease to broken Release reverts everything' + start_with_good_inrelease + + # switch to a unsigned repo now + add_new_package '+1hour' + rm $APTARCHIVE/dists/unstable/InRelease + rm $APTARCHIVE/dists/unstable/Release.gpg + + # break it + break_repository_sources_index '+1hour' + + # ensure error + testequal "E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update -qq # -o Debug::acquire::transaction=1 + + # ensure that the Packages file is also rolled back + testfileequal lists.before "$(listcurrentlistsdirectory)" + testsuccess aptget install old -s + testfailure aptget install new -s + testsuccess ls $ROOTDIR/var/lib/apt/lists/*_InRelease + testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release +} + +test_unauthenticated_to_invalid_inrelease() { + msgmsg 'Test UnAuthenticated to invalid InRelease reverts everything' + create_fresh_archive + rm $APTARCHIVE/dists/unstable/InRelease + rm $APTARCHIVE/dists/unstable/Release.gpg + + testwarning aptget update --allow-insecure-repositories + listcurrentlistsdirectory > lists.before + testequal "WARNING: The following packages cannot be authenticated! + old +E: There are problems and -y was used without --force-yes" aptget install -qq -y old + + # go to authenticated but not correct + add_new_package '+1hour' + break_repository_sources_index '+1hour' + + testequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources Hash Sum mismatch + +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfileequal lists.before "$(listcurrentlistsdirectory)" + testfailure ls rootdir/var/lib/apt/lists/*_InRelease + testequal "WARNING: The following packages cannot be authenticated! + old +E: There are problems and -y was used without --force-yes" aptget install -qq -y old +} + +test_inrelease_to_unauth_inrelease() { + msgmsg 'Test InRelease to InRelease without good sig' + start_with_good_inrelease + + signreleasefiles 'Marvin Paranoid' + + testequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2 + +W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2 + +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfileequal lists.before "$(listcurrentlistsdirectory)" + testsuccess ls rootdir/var/lib/apt/lists/*_InRelease +} + +test_inrelease_to_broken_gzip() { + msgmsg "Test InRelease to broken gzip" + start_with_good_inrelease + + # append junk at the end of the compressed file + echo "lala" >> $APTARCHIVE/dists/unstable/main/source/Sources.gz + touch -d '+2min' $APTARCHIVE/dists/unstable/main/source/Sources.gz + # remove uncompressed file to avoid fallback + rm $APTARCHIVE/dists/unstable/main/source/Sources + + testfailure aptget update + testfileequal lists.before "$(listcurrentlistsdirectory)" +} + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +# setup the archive and ensure we have a single package that installs fine +setupaptarchive +APTARCHIVE=$(readlink -f ./aptarchive) +ROOTDIR=${TMPWORKINGDIRECTORY}/rootdir +APTARCHIVE_LISTS="$(echo $APTARCHIVE | tr "/" "_" )" + +# test the following cases: +# - InRelease -> broken InRelease revert to previous state +# - empty lists dir and broken remote leaves nothing on the system +# - InRelease -> hashsum mismatch for one file reverts all files to previous state +# - Release/Release.gpg -> hashsum mismatch +# - InRelease -> Release with hashsum mismatch revert entire state and kills Release +# - Release -> InRelease with broken Sig/Hash removes InRelease +# going from Release/Release.gpg -> InRelease and vice versa +# - unauthenticated -> invalid InRelease + +# stuff to do: +# - ims-hit +# - gzip-index tests + +test_inrelease_to_new_inrelease +test_inrelease_to_broken_hash_reverts_all +test_inrelease_to_valid_release +test_inrelease_to_release_reverts_all +test_unauthenticated_to_invalid_inrelease +test_inrelease_to_unauth_inrelease +test_inrelease_to_broken_gzip diff --git a/test/integration/test-apt-update-stale b/test/integration/test-apt-update-stale index 780ff79af..277aa5b09 100755 --- a/test/integration/test-apt-update-stale +++ b/test/integration/test-apt-update-stale @@ -14,9 +14,12 @@ configarchitecture "i386" insertpackage 'unstable' 'foo' 'all' '1.0' -setupaptarchive +setupaptarchive --no-update changetowebserver -aptget update -qq + +echo "Acquire::Languages \"none\";" > rootdir/etc/apt/apt.conf.d/00nolanguages +testsuccess aptget update +listcurrentlistsdirectory > lists.before # insert new version mkdir aptarchive/dists/unstable/main/binary-i386/saved @@ -24,23 +27,19 @@ cp -p aptarchive/dists/unstable/main/binary-i386/Packages* \ aptarchive/dists/unstable/main/binary-i386/saved insertpackage 'unstable' 'foo' 'all' '2.0' -# not using compressfile for compat with older apt releases -gzip -c aptarchive/dists/unstable/main/binary-i386/Packages > \ - aptarchive/dists/unstable/main/binary-i386/Packages.gz -generatereleasefiles -signreleasefiles - +compressfile aptarchive/dists/unstable/main/binary-i386/Packages # ensure that we do not get a I-M-S hit for the Release file -touch -d "+1hour" aptarchive/dists/unstable/*Release* + +generatereleasefiles '+1hour' +signreleasefiles # but now only deliver the previous Packages file instead of the new one # (simulating a stale attack) cp -p aptarchive/dists/unstable/main/binary-i386/saved/Packages* \ aptarchive/dists/unstable/main/binary-i386/ -# ensure this raises a error +# ensure this raises an error testequal "W: Failed to fetch http://localhost:8080/dists/unstable/main/binary-i386/Packages Hash Sum mismatch E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq - - +testfileequal lists.before "$(listcurrentlistsdirectory)" diff --git a/test/integration/test-apt-update-transactions b/test/integration/test-apt-update-transactions new file mode 100755 index 000000000..b325733ac --- /dev/null +++ b/test/integration/test-apt-update-transactions @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +# ensure that an update will only succeed entirely or not at all + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'foo' 'all' '1.0' +insertsource 'unstable' 'foo' 'all' '1.0' + +setupaptarchive --no-update + +breakfile() { + mv "$1" "${1}.bak" + cat > "$1" <<EOF +Package: bar +EOF + compressfile "$1" +} +restorefile() { + mv "${1}.bak" "$1" +} + +testrun() { + # produce an unsigned repository + find aptarchive \( -name 'Release.gpg' -o -name 'InRelease' \) -delete + testfailure aptget update --no-allow-insecure-repositories + testfileequal "$1" "$(listcurrentlistsdirectory)" + + # signed but broken + signreleasefiles + + breakfile aptarchive/dists/unstable/main/binary-i386/Packages + testfailure aptget update + testfileequal "$1" "$(listcurrentlistsdirectory)" + restorefile aptarchive/dists/unstable/main/binary-i386/Packages + + breakfile aptarchive/dists/unstable/main/source/Sources + testfailure aptget update + testfileequal "$1" "$(listcurrentlistsdirectory)" + restorefile aptarchive/dists/unstable/main/source/Sources +} + +testsetup() { + msgmsg 'Test with no initial data over' "$1" + rm -rf rootdir/var/lib/apt/lists + mkdir -p rootdir/var/lib/apt/lists/partial + listcurrentlistsdirectory > listsdir.lst + testrun 'listsdir.lst' + + msgmsg 'Test with initial data over' "$1" + testsuccess aptget update + listcurrentlistsdirectory > listsdir.lst + testrun 'listsdir.lst' +} + +testsetup 'file' +changetowebserver +testsetup 'http' + diff --git a/test/integration/test-apt-update-unauth b/test/integration/test-apt-update-unauth index 13487603c..7347f7d10 100755 --- a/test/integration/test-apt-update-unauth +++ b/test/integration/test-apt-update-unauth @@ -8,32 +8,61 @@ set -e TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework +umask 022 + setupenvironment configarchitecture "i386" insertpackage 'unstable' 'foo' 'all' '1.0' insertsource 'unstable' 'foo' 'all' '1.0' -setupaptarchive +setupaptarchive --no-update changetowebserver +# FIXME: +# - also check the unauth -> auth success case, i.e. that all files are +# reverified runtest() { # start unauthenticated - find rootdir/var/lib/apt/lists/ -type f | xargs rm -f - rm -f aptarchive/dists/unstable/*Release* - aptget update -qq + rm -rf rootdir/var/lib/apt/lists/ + find aptarchive/ -name '*Release*' -delete + + testwarning aptget update --allow-insecure-repositories # become authenticated generatereleasefiles signreleasefiles - # and ensure we do download the data again - msgtest "Check that the data is check when going to authenticated" - if aptget update |grep -q Hit; then - msgfail - else + # move uncompressed away + mv aptarchive/dists/unstable/main/binary-i386/Packages \ + aptarchive/dists/unstable/main/binary-i386/Packages.uncompressed + + # and ensure we re-check the downloaded data + + # change the local packages file + PKGS=$(ls rootdir/var/lib/apt/lists/*Packages*) + echo "meep" > $PKGS + listcurrentlistsdirectory > lists.before + + # update and ensure all is reverted on the hashsum failure + testfailure aptget update -o Debug::Acquire::Transaction=0 -o Debug::pkgAcquire::Auth=1 -o Debug::pkgAcquire::worker=0 -o Debug::acquire::http=0 + + # ensure we have before what we have after + msgtest 'Check rollback on going from' 'unauth -> auth' + listcurrentlistsdirectory > lists.after + if cmp lists.before lists.after; then msgpass + else + echo >&2 '### Output of previous apt-get update ###' + cat >&2 rootdir/tmp/testfailure.output + echo >&2 '### Changes in the lists-directory: ###' + diff -u >&2 lists.before lists.after + msgfail fi + + # move uncompressed back for release file + mv aptarchive/dists/unstable/main/binary-i386/Packages.uncompressed \ + aptarchive/dists/unstable/main/binary-i386/Packages } for COMPRESSEDINDEXES in 'false' 'true'; do @@ -43,6 +72,5 @@ for COMPRESSEDINDEXES in 'false' 'true'; do else msgmsg 'Run tests with GzipIndexes disabled' fi - - runtest + runtest done diff --git a/test/integration/test-authentication-basic b/test/integration/test-authentication-basic new file mode 100755 index 000000000..7e74726be --- /dev/null +++ b/test/integration/test-authentication-basic @@ -0,0 +1,106 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'foo' 'all' '1' +setupaptarchive --no-update + +changetohttpswebserver --authorization="$(printf '%s' 'star:hunter2' | base64 )" + +echo 'See, when YOU type hunter2, it shows to us as *******' > aptarchive/bash + +testauthfailure() { + testfailure apthelper download-file "${1}/bash" ./downloaded/bash + # crappy test, but http and https output are wastely different… + testsuccess grep 401 rootdir/tmp/testfailure.output + testfailure test -s ./downloaded/bash +} + +testauthsuccess() { + testsuccess apthelper download-file "${1}/bash" ./downloaded/bash + testfileequal ./downloaded/bash "$(cat aptarchive/bash)" + testfilestats ./downloaded/bash '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" + rm -f ./downloaded/bash + + # lets see if got/retains acceptable permissions + if [ -n "$AUTHCONF" ]; then + if [ "$(id -u)" = '0' ]; then + testfilestats "$AUTHCONF" '%U:%G:%a' '=' "_apt:root:600" + else + testfilestats "$AUTHCONF" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:600" + fi + fi + + rm -rf rootdir/var/lib/apt/lists + testsuccess aptget update + testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Conf foo (1 unstable [all])' aptget install foo -s +} + +authfile() { + local AUTHCONF='rootdir/etc/apt/auth.conf' + rm -f "$AUTHCONF" + printf '%s' "$1" > "$AUTHCONF" + chmod 600 "$AUTHCONF" +} + +runtest() { + # unauthorized fails + authfile '' + testauthfailure "$1" + + # good auth + authfile 'machine localhost +login star +password hunter2' + testauthsuccess "$1" + + # bad auth + authfile 'machine localhost +login anonymous +password hunter2' + testauthfailure "$1" + + # 2 stanzas: unmatching + good auth + authfile 'machine debian.org +login debian +password jessie + +machine localhost +login star +password hunter2' + testauthsuccess "$1" +} + +msgmsg 'server basic auth' +rewritesourceslist 'http://localhost:8080' +runtest 'http://localhost:8080' +rewritesourceslist 'https://localhost:4433' +runtest 'https://localhost:4433' +rewritesourceslist 'http://localhost:8080' + +msgmsg 'proxy to server basic auth' +webserverconfig 'aptwebserver::request::absolute' 'uri' +export http_proxy='http://localhost:8080' +runtest 'http://localhost:8080' +unset http_proxy + +msgmsg 'proxy basic auth to server basic auth' +webserverconfig 'aptwebserver::proxy-authorization' "$(printf 'moon:deer2' | base64)" +export http_proxy='http://moon:deer2@localhost:8080' +runtest 'http://localhost:8080' + +msgmsg 'proxy basic auth to server' +authfile '' +webserverconfig 'aptwebserver::authorization' '' +testauthsuccess 'http://localhost:8080' diff --git a/test/integration/test-bug-254770-segfault-if-cache-not-buildable b/test/integration/test-bug-254770-segfault-if-cache-not-buildable index 59102ddc9..6ae8944b2 100755 --- a/test/integration/test-bug-254770-segfault-if-cache-not-buildable +++ b/test/integration/test-bug-254770-segfault-if-cache-not-buildable @@ -3,17 +3,25 @@ set -e TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework + +msgtest 'Test run as' 'non-root' +if [ "$(id -u)" = '0' ]; then + msgskip 'root has by definition no problems accessing files' + exit 0 +else + msgpass +fi + setupenvironment configarchitecture "i386" setupaptarchive -CURRENTTRAP="chmod a+x rootdir/var/lib/dpkg; $CURRENTTRAP" -trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM +addtrap 'prefix' 'chmod a+x rootdir/var/lib/dpkg;' chmod a-x rootdir/var/lib/dpkg testsegfault() { msgtest "No segfault in" "$*" - local TEST="$($* 2>&1 | grep -v 'E:')" + local TEST="$("$@" 2>&1 | grep -v 'E:')" if [ -z "$TEST" ]; then msgpass else diff --git a/test/integration/test-bug-507998-dist-upgrade-recommends b/test/integration/test-bug-507998-dist-upgrade-recommends index 513421a94..f3b4e04fb 100755 --- a/test/integration/test-bug-507998-dist-upgrade-recommends +++ b/test/integration/test-bug-507998-dist-upgrade-recommends @@ -16,6 +16,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: tshark wireshark-common 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/integration/test-bug-591882-conkeror b/test/integration/test-bug-591882-conkeror index e1c0b42d1..891ddb8b7 100755 --- a/test/integration/test-bug-591882-conkeror +++ b/test/integration/test-bug-591882-conkeror @@ -9,6 +9,7 @@ setupaptarchive UPGRADEFAIL="Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: conkeror libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9 The following NEW packages will be installed: @@ -40,6 +41,7 @@ E: Trivial Only specified but this is not a trivial operation." UPGRADESUCCESS="Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9 The following NEW packages will be installed: diff --git a/test/integration/test-bug-595691-empty-and-broken-archive-files b/test/integration/test-bug-595691-empty-and-broken-archive-files index aea340203..bca07268c 100755 --- a/test/integration/test-bug-595691-empty-and-broken-archive-files +++ b/test/integration/test-bug-595691-empty-and-broken-archive-files @@ -13,7 +13,7 @@ setupflataptarchive testaptgetupdate() { rm -rf rootdir/var/lib/apt aptget update 2>> testaptgetupdate.diff >> testaptgetupdate.diff || true - sed -i -e '/^Fetched / d' -e '/Ign / d' -e '/Release/ d' -e 's#Get:[0-9]\+ #Get: #' -e 's#\[[0-9]* [kMGTPY]*B\]#\[\]#' testaptgetupdate.diff + sed -i -e '/Ign /,+1d' -e '/Release/ d' -e 's#Get:[0-9]\+ #Get: #' -e 's#\[[0-9]* [kMGTPY]*B\]#\[\]#' testaptgetupdate.diff GIVEN="$1" shift msgtest "Test for correctness of" "apt-get update with $*" @@ -73,16 +73,6 @@ E: Some index files failed to download. They have been ignored, or old ones used testoverhttp() { forcecompressor "$1" - createemptyfile 'en' - testaptgetupdate "Get: http://localhost:8080 Packages [] -Get: http://localhost:8080 Translation-en -Reading package lists..." "empty file en.$COMPRESS over http" - - createemptyarchive 'en' - testaptgetupdate "Get: http://localhost:8080 Packages [] -Get: http://localhost:8080 Translation-en [] -Reading package lists..." "empty archive en.$COMPRESS over http" - createemptyarchive 'Packages' testaptgetupdate "Get: http://localhost:8080 Packages [] Reading package lists..." "empty archive Packages.$COMPRESS over http" diff --git a/test/integration/test-bug-596498-trusted-unsigned-repo b/test/integration/test-bug-596498-trusted-unsigned-repo index 06c9c8285..1e5e75b0e 100755 --- a/test/integration/test-bug-596498-trusted-unsigned-repo +++ b/test/integration/test-bug-596498-trusted-unsigned-repo @@ -12,7 +12,7 @@ setupaptarchive aptgetupdate() { rm -rf rootdir/var/lib/apt/ rootdir/var/cache/apt/*.bin - aptget update -qq + ${1:-testwarning} aptget update --allow-insecure-repositories } PKGTEXT="$(aptget install cool --assume-no -d | head -n 7)" @@ -25,7 +25,7 @@ testequal "$PKGTEXT Download complete and in download only mode" aptget install cool --assume-no -d --allow-unauthenticated sed -i -e 's#deb#deb [trusted=no]#' $DEBFILE -aptgetupdate +aptgetupdate 'testsuccess' testequal "$PKGTEXT WARNING: The following packages cannot be authenticated! diff --git a/test/integration/test-bug-604401-files-are-directories b/test/integration/test-bug-604401-files-are-directories index e6913edcf..fe0ccc783 100755 --- a/test/integration/test-bug-604401-files-are-directories +++ b/test/integration/test-bug-604401-files-are-directories @@ -57,7 +57,7 @@ echo 'Package: apt Pin: release a=now Pin-Value: 1000' > rootdir/etc/apt/good-link.pref ln -s rootdir/etc/apt/good-link.pref rootdir/etc/apt/preferences -test -n "$(aptcache policy | grep 1000)" && msgfail || msgpass +test -n "$(aptcache policy | grep '1000 ')" && msgfail || msgpass rm rootdir/etc/apt/preferences msgtest "Broken link instead of a file as preferences ignored" diff --git a/test/integration/test-bug-605394-versioned-or-groups b/test/integration/test-bug-605394-versioned-or-groups index 0f09d2927..bb72d59e3 100755 --- a/test/integration/test-bug-605394-versioned-or-groups +++ b/test/integration/test-bug-605394-versioned-or-groups @@ -9,6 +9,7 @@ setupaptarchive testequal "Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: php5 php5-cgi 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/integration/test-bug-612099-multiarch-conflicts b/test/integration/test-bug-612099-multiarch-conflicts index 20dc3a7e5..c32600037 100755 --- a/test/integration/test-bug-612099-multiarch-conflicts +++ b/test/integration/test-bug-612099-multiarch-conflicts @@ -70,6 +70,7 @@ Conf foobar (1.0 stable [i386])' aptget install foobar/stable libc6 -st testing testequal 'Reading package lists... Building dependency tree... Reading state information... +Calculating upgrade... The following packages will be upgraded: libc6 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. @@ -168,6 +169,7 @@ Conf libc6-same:amd64 (1.0 stable [amd64])' aptget install libc6-same:amd64 -s - testequal 'Reading package lists... Building dependency tree... Reading state information... +Calculating upgrade... The following packages will be upgraded: libc6-same 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted b/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted index f93510fd7..582e1bf5e 100755 --- a/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted +++ b/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted @@ -24,15 +24,19 @@ testfilemissing() { testrun() { rm -rf rootdir/var/lib/apt - testsuccess aptget update + cd downloaded if [ "$1" = 'trusted' ]; then + testsuccess aptget update + testsuccess aptget download cool testfileexists 'cool_1.0_i386.deb' testsuccess aptget download cool --allow-unauthenticated testfileexists 'cool_1.0_i386.deb' else + testwarning aptget update --allow-insecure-repositories + testfailure aptget download cool testfilemissing 'cool_1.0_i386.deb' @@ -40,18 +44,19 @@ testrun() { testfileexists 'cool_1.0_i386.deb' fi - mv aptarchive/pool/cool_1.0_i386.deb aptarchive/pool/cool_1.0_i386.deb.bak - echo 'this is not a good package' > aptarchive/pool/cool_1.0_i386.deb + mv ../aptarchive/pool/cool_1.0_i386.deb ../aptarchive/pool/cool_1.0_i386.deb.bak + echo 'this is not a good package' > ../aptarchive/pool/cool_1.0_i386.deb testfailure aptget download cool testfilemissing cool_1.0_i386.deb testfailure aptget download cool --allow-unauthenticated # unauthenticated doesn't mean unchecked testfilemissing cool_1.0_i386.deb - rm -f aptarchive/pool/cool_1.0_i386.deb - mv aptarchive/pool/cool_1.0_i386.deb.bak aptarchive/pool/cool_1.0_i386.deb + rm -f ../aptarchive/pool/cool_1.0_i386.deb + mv ../aptarchive/pool/cool_1.0_i386.deb.bak ../aptarchive/pool/cool_1.0_i386.deb testsuccess aptget download cool --allow-unauthenticated testfileexists 'cool_1.0_i386.deb' + cd - >/dev/null } testrun 'trusted' diff --git a/test/integration/test-bug-624218-Translation-file-handling b/test/integration/test-bug-624218-Translation-file-handling index d3c5b08ac..652386892 100755 --- a/test/integration/test-bug-624218-Translation-file-handling +++ b/test/integration/test-bug-624218-Translation-file-handling @@ -8,86 +8,101 @@ configarchitecture 'i386' buildsimplenativepackage 'coolstuff' 'all' '1.0' 'unstable' -setupaptarchive +setupaptarchive --no-update changetowebserver - rm -rf rootdir/var/lib/apt/lists translationslisted() { msgtest 'No download of non-existent locals' "$1" - LC_ALL="" aptget update -o Acquire::Languages=en | grep -q -e 'Translation-[^e][^n] ' && msgfail || msgpass + export LC_ALL="" + testsuccess --nomsg aptget update -o Acquire::Languages=en + testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of existent locals' "$1" - LC_ALL="" aptget update | grep -q -e 'Translation-en ' && msgpass || msgfail + testsuccess --nomsg aptget update + cp rootdir/tmp/testsuccess.output testsuccess.output + testsuccess grep -q -e 'Translation-en ' testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of en in LC_ALL=C' "$1" - LC_ALL=C aptget update | grep -q -e 'Translation-en ' && msgpass || msgfail + export LC_ALL=C + testsuccess --nomsg aptget update + cp rootdir/tmp/testsuccess.output testsuccess.output + testsuccess grep -q -e 'Translation-en ' testsuccess.output rm -rf rootdir/var/lib/apt/lists + unset LC_ALL msgtest 'Download of en as forced language' "$1" - aptget update -o Acquire::Languages=en | grep -q -e 'Translation-en ' && msgpass || msgfail + testsuccess --nomsg aptget update -o Acquire::Languages=en + cp rootdir/tmp/testsuccess.output testsuccess.output + testsuccess grep -q -e 'Translation-en ' testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of nothing else in forced language' "$1" - aptget update -o Acquire::Languages=en | grep -q -e 'Translation-[^e][^n] ' && msgfail || msgpass + testsuccess --nomsg aptget update -o Acquire::Languages=en + testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download no Translation- if forced language is non-existent' "$1" - aptget update -o Acquire::Languages=ast_DE | grep -q -e 'Translation-' && msgfail || msgpass + testsuccess --nomsg aptget update -o Acquire::Languages=ast_DE + testfailure grep -q -e 'Translation-' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of nothing if none is forced' "$1" - aptget update -o Acquire::Languages=none | grep -q -e 'Translation' && msgfail || msgpass + testsuccess --nomsg aptget update -o Acquire::Languages=none + testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists } translationslisted 'with full Index' - -# only compressed files available (as it happens on CD-ROM) -sed -i '/i18n\/Translation-[^.]*$/ d' $(find aptarchive -name 'Release') -signreleasefiles - -translationslisted 'with partial Index' - - -# no records at all about Translation files (fallback to guessing) -sed -i '/i18n\/Translation-.*$/ d' $(find aptarchive -name 'Release') -signreleasefiles +# No Release file at all, so no records about Translation files +# (fallback to guessing) +find aptarchive \( -name 'Release' -o -name 'InRelease' \) -delete +configallowinsecurerepositories "true"; msgtest 'Download of en as forced language' 'without Index' -aptget update -o Acquire::Languages=en | grep -q -e 'Translation-en ' && msgpass || msgfail +testwarning --nomsg aptget update -o Acquire::Languages=en +cp rootdir/tmp/testsuccess.output testsuccess.output +testsuccess grep -q -e 'Translation-en ' testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of nothing else in forced language' 'without Index' -aptget update -o Acquire::Languages=en | grep -q -e 'Translation-[^e][^n] ' && msgfail || msgpass +testwarning --nomsg aptget update -o Acquire::Languages=en +testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of ast_DE as forced language' 'without Index' -aptget update -o Acquire::Languages=ast_DE | grep -q -e 'Translation-ast_DE$' && msgpass || msgfail +testwarning --nomsg aptget update -o Acquire::Languages=ast_DE +cp rootdir/tmp/testsuccess.output testsuccess.output +testsuccess grep -q -e 'Translation-ast_DE$' testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of nothing else in forced language' 'without Index' -aptget update -o Acquire::Languages=ast_DE | grep -q -e 'Translation-[^a][^s]' && msgfail || msgpass +testwarning --nomsg aptget update -o Acquire::Languages=ast_DE +testfailure grep -q -e 'Translation-[^a][^s]' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists msgtest 'Download of nothing if none is forced' 'without Index' -aptget update -o Acquire::Languages=none | grep -q -e 'Translation' && msgfail || msgpass +testwarning --nomsg aptget update -o Acquire::Languages=none +testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists mkdir -p rootdir/var/lib/apt/lists touch rootdir/var/lib/apt/lists/localhost:8080_dists_unstable_main_i18n_Translation-ast_DE msgtest 'Download of builtin files' 'without Index' -aptget update | grep -q -e 'Translation-ast_DE' && msgpass || msgfail +testwarning --nomsg aptget update +cp rootdir/tmp/testsuccess.output testsuccess.output +testsuccess grep -q -e 'Translation-ast_DE' testsuccess.output rm -rf rootdir/var/lib/apt/lists mkdir -p rootdir/var/lib/apt/lists touch rootdir/var/lib/apt/lists/localhost:8080_dists_unstable_main_i18n_Translation-ast_DE msgtest 'Download of nothing (even builtin) if none is forced' 'without Index' -aptget update -o Acquire::Languages=none | grep -q -e 'Translation' && msgfail || msgpass +testwarning --nomsg aptget update -o Acquire::Languages=none +testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output rm -rf rootdir/var/lib/apt/lists diff --git a/test/integration/test-bug-64141-install-dependencies-for-on-hold b/test/integration/test-bug-64141-install-dependencies-for-on-hold index 9a9e7be10..9e6c223a8 100755 --- a/test/integration/test-bug-64141-install-dependencies-for-on-hold +++ b/test/integration/test-bug-64141-install-dependencies-for-on-hold @@ -21,6 +21,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: oldcrap The following NEW packages will be installed: @@ -35,6 +36,7 @@ testsuccess aptmark hold apt testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: apt The following packages will be upgraded: diff --git a/test/integration/test-bug-657695-resolver-breaks-on-virtuals b/test/integration/test-bug-657695-resolver-breaks-on-virtuals index e9b27cfcd..1b92a04fe 100755 --- a/test/integration/test-bug-657695-resolver-breaks-on-virtuals +++ b/test/integration/test-bug-657695-resolver-breaks-on-virtuals @@ -18,6 +18,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: xserver-xorg-video-driver1 xserver-xorg-video-driver10 xserver-xorg-video-driver11 xserver-xorg-video-driver12 diff --git a/test/integration/test-bug-673536-pre-depends-breaks-loop b/test/integration/test-bug-673536-pre-depends-breaks-loop index 21bd5e065..eb47553dc 100755 --- a/test/integration/test-bug-673536-pre-depends-breaks-loop +++ b/test/integration/test-bug-673536-pre-depends-breaks-loop @@ -24,12 +24,11 @@ testloopbreak() { cp -a dpkg.status.backup rootdir/var/lib/dpkg/status rm -f rootdir/var/lib/apt/extended_states - - testsuccess aptget install advanced=1 -y -t "$1" -o Debug::pkgPackageManager=1 + testsuccess aptget install advanced=1 -y -t "$1" testdpkginstalled advanced testdpkgnotinstalled basic common - testsuccess aptget dist-upgrade -y -t "$1" -o Debug::pkgPackageManager=1 + testsuccess aptget dist-upgrade -y -t "$1" testdpkginstalled advanced basic common } diff --git a/test/integration/test-bug-675449-essential-are-protected b/test/integration/test-bug-675449-essential-are-protected index 7d8cc3484..2a27c62b1 100755 --- a/test/integration/test-bug-675449-essential-are-protected +++ b/test/integration/test-bug-675449-essential-are-protected @@ -69,6 +69,7 @@ Purg pkg-none-foreign:i386 [1]' aptget purge pkg-none-foreign:i386 -s testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following NEW packages will be installed: pkg-depends-new:i386 pkg-none-new The following packages will be upgraded: diff --git a/test/integration/test-bug-680041-apt-mark-holds-correctly b/test/integration/test-bug-680041-apt-mark-holds-correctly index 2e5e39c8e..3f40c23dc 100755 --- a/test/integration/test-bug-680041-apt-mark-holds-correctly +++ b/test/integration/test-bug-680041-apt-mark-holds-correctly @@ -19,6 +19,7 @@ runtests() { testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: pkgall pkgarch 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. @@ -30,6 +31,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgr testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: pkgarch The following packages will be upgraded: @@ -43,6 +45,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgr testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: pkgall pkgarch 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. @@ -54,6 +57,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgr testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: pkgall The following packages will be upgraded: diff --git a/test/integration/test-bug-683786-build-dep-on-virtual-packages b/test/integration/test-bug-683786-build-dep-on-virtual-packages index 879d6a3bc..65862c572 100755 --- a/test/integration/test-bug-683786-build-dep-on-virtual-packages +++ b/test/integration/test-bug-683786-build-dep-on-virtual-packages @@ -38,8 +38,8 @@ Building dependency tree... The following NEW packages will be installed: po-debconf 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. -Inst po-debconf (1 unstable, unstable [all]) -Conf po-debconf (1 unstable, unstable [all])' aptget build-dep dash -s +Inst po-debconf (1 unstable [all]) +Conf po-debconf (1 unstable [all])' aptget build-dep dash -s testequal 'Reading package lists... Building dependency tree... diff --git a/test/integration/test-bug-686346-package-missing-architecture b/test/integration/test-bug-686346-package-missing-architecture index dc51861ab..8024f81da 100755 --- a/test/integration/test-bug-686346-package-missing-architecture +++ b/test/integration/test-bug-686346-package-missing-architecture @@ -53,6 +53,7 @@ testnopackage pkge:* # this difference seems so important that it has to be maintained … testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade -s # pkgd has no update with an architecture diff --git a/test/integration/test-bug-712435-missing-descriptions b/test/integration/test-bug-712435-missing-descriptions index 53ecbbeb3..7a3518745 100755 --- a/test/integration/test-bug-712435-missing-descriptions +++ b/test/integration/test-bug-712435-missing-descriptions @@ -87,13 +87,10 @@ $DESCRIPTION Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " aptcache show apt-normal -# displaying the translated Description would be equally valid, -# but we assume only one description is in a Packages file and -# so we prefer "Description" over "Description-*" currently. for variant in 'below' 'middle' 'top'; do testequal "Package: apt-both-$variant $PACKAGESTANZA -$DESCRIPTION +$TRANSDESCRIPTION Description-md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb " aptcache show apt-both-$variant done @@ -122,7 +119,7 @@ X-Some-Flag: yes testequal "Package: apt-intermixed2 $PACKAGESTANZA -$DESCRIPTION +$TRANSDESCRIPTION Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa X-Some-Flag: yes X-Foo-Flag: Something with a Description @@ -131,7 +128,7 @@ X-Bar-Flag: no testequal "Package: apt-intermixed3 $PACKAGESTANZA -$DESCRIPTION +$TRANSDESCRIPTION Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa X-Some-Flag: yes X-Foo-Flag: Something with a Description diff --git a/test/integration/test-bug-717891-abolute-uris-for-proxies b/test/integration/test-bug-717891-abolute-uris-for-proxies index ac1d6ec11..54a616686 100755 --- a/test/integration/test-bug-717891-abolute-uris-for-proxies +++ b/test/integration/test-bug-717891-abolute-uris-for-proxies @@ -12,7 +12,7 @@ setupaptarchive changetowebserver --request-absolute='uri' msgtest 'Check that absolute paths are' 'not accepted' -testfailure --nomsg aptget update +testfailure --nomsg aptget update --allow-insecure-repositories echo 'Acquire::http::Proxy "http://localhost:8080";' > rootdir/etc/apt/apt.conf.d/99proxy diff --git a/test/integration/test-bug-722207-print-uris-even-if-very-quiet b/test/integration/test-bug-722207-print-uris-even-if-very-quiet index f2d95da19..9a5685703 100755 --- a/test/integration/test-bug-722207-print-uris-even-if-very-quiet +++ b/test/integration/test-bug-722207-print-uris-even-if-very-quiet @@ -16,10 +16,10 @@ setupaptarchive APTARCHIVE=$(readlink -f ./aptarchive) -testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget upgrade -qq --print-uris -testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget dist-upgrade -qq --print-uris -testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget install apt -qq --print-uris -testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget download apt -qq --print-uris +testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget upgrade -qq --print-uris +testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget dist-upgrade -qq --print-uris +testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget install apt -qq --print-uris +testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget download apt -qq --print-uris testequal "'file://${APTARCHIVE}/apt_2.dsc' apt_2.dsc 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e 'file://${APTARCHIVE}/apt_2.tar.gz' apt_2.tar.gz 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e" aptget source apt -qq --print-uris testequal "'http://packages.debian.org/changelogs/pool/main/apt/apt_2/changelog'" aptget changelog apt -qq --print-uris diff --git a/test/integration/test-bug-728500-tempdir b/test/integration/test-bug-728500-tempdir index 0451fc1ed..37e5a013e 100755 --- a/test/integration/test-bug-728500-tempdir +++ b/test/integration/test-bug-728500-tempdir @@ -17,7 +17,7 @@ msgtest 'Test apt-get update with incorrect' 'TMPDIR' OUTPUT=$(mktemp) addtrap "rm $OUTPUT;" export TMPDIR=/does-not-exists -if aptget update >${OUTPUT} 2>&1; then +if aptget update -o Debug::Acquire::gpg=1 >${OUTPUT} 2>&1; then msgpass else echo @@ -27,3 +27,4 @@ fi unset TMPDIR testequal 'coolstuff' aptcache pkgnames +testsuccess ls rootdir/var/lib/apt/lists/*InRelease diff --git a/test/integration/test-bug-733028-gpg-resource-limit b/test/integration/test-bug-733028-gpg-resource-limit new file mode 100755 index 000000000..7040856b3 --- /dev/null +++ b/test/integration/test-bug-733028-gpg-resource-limit @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'foobar' 'all' '1' + +setupaptarchive --no-update + +for i in $(seq 1 50); do + touch rootdir/etc/apt/trusted.gpg.d/emptykey-${i}.gpg +done + +aptkey list | grep '^pub' > aptkey.list +testfileequal ./aptkey.list 'pub 2048R/DBAC8DAE 2010-08-18' + +testsuccess aptget update +msgtest 'Test for no gpg errors/warnings in' 'apt-get update' +if grep -iq 'GPG' rootdir/tmp/testsuccess.output; then + cat rootdir/tmp/testsuccess.output + msgfail +else + msgpass +fi diff --git a/test/integration/test-bug-735967-lib32-to-i386-unavailable b/test/integration/test-bug-735967-lib32-to-i386-unavailable index e9f3bf96d..826931fe4 100755 --- a/test/integration/test-bug-735967-lib32-to-i386-unavailable +++ b/test/integration/test-bug-735967-lib32-to-i386-unavailable @@ -33,6 +33,7 @@ testsuccess aptget update testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: lib32nss-mdns The following packages will be upgraded: @@ -60,6 +61,7 @@ testsuccess aptget update testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following NEW packages will be installed: libnss-mdns:i386 libnss-mdns-i386:i386 The following packages will be upgraded: diff --git a/test/integration/test-bug-738785-switch-protocol b/test/integration/test-bug-738785-switch-protocol index 1e5748eae..0f458e099 100755 --- a/test/integration/test-bug-738785-switch-protocol +++ b/test/integration/test-bug-738785-switch-protocol @@ -25,6 +25,7 @@ downloadfile 'http://localhost:8080/pool/apt_1.0/changelog' changelog >/dev/null echo 'Apt::Changelogs::Server "http://localhost:8080/redirectme";' > rootdir/etc/apt/apt.conf.d/changelog.conf testequal "'http://localhost:8080/redirectme/pool/apt_1.0/changelog'" aptget changelog apt --print-uris +cd downloaded testsuccess aptget changelog apt -d testsuccess test -s apt.changelog rm -f apt.changelog @@ -32,6 +33,7 @@ rm -f apt.changelog testsuccess aptget download apt testsuccess test -s apt_1.0_all.deb rm apt_1.0_all.deb +cd - >/dev/null testsuccess aptget install apt -y testdpkginstalled 'apt' @@ -49,9 +51,11 @@ rm https cd - >/dev/null echo "Dir::Bin::Methods \"${COPYMETHODS}\";" >> aptconfig.conf -testequal "E: The method driver $(pwd)/rootdir/usr/lib/apt/methods/https could not be found. +cd downloaded +testequal "E: The method driver $(readlink -f './../')/rootdir/usr/lib/apt/methods/https could not be found. N: Is the package apt-transport-https installed?" aptget download apt -q=0 -testsuccess test ! -e apt_1.0_all.deb +testfailure test -e apt_1.0_all.deb +cd - >/dev/null # revert to all methods rm -rf rootdir/$COPYMETHODS @@ -60,4 +64,4 @@ mv rootdir/${COPYMETHODS}.bak rootdir/${COPYMETHODS} # check that downgrades from https to http are not allowed webserverconfig 'aptwebserver::support::http' 'true' sed -i -e 's#:8080/redirectme#:4433/downgrademe#' -e 's# http:# https:#' rootdir/etc/apt/sources.list.d/* -testfailure aptget update +testfailure aptget update --allow-insecure-repositories diff --git a/test/integration/test-bug-740843-versioned-up-down-breaks b/test/integration/test-bug-740843-versioned-up-down-breaks index cb035a71f..9426ffad1 100755 --- a/test/integration/test-bug-740843-versioned-up-down-breaks +++ b/test/integration/test-bug-740843-versioned-up-down-breaks @@ -24,6 +24,7 @@ setupaptarchive testequalor2 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: foo-driver libfoo libfoo:i386 libgl1-foo-glx libgl1-foo-glx:i386 5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. @@ -38,6 +39,7 @@ Conf libgl1-foo-glx:i386 (2 stable [i386]) Conf libgl1-foo-glx (2 stable [amd64]) Conf foo-driver (2 stable [amd64])' 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: foo-driver libfoo libfoo:i386 libgl1-foo-glx libgl1-foo-glx:i386 5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/integration/test-bug-745036-new-foreign-invalidates-cache b/test/integration/test-bug-745036-new-foreign-invalidates-cache new file mode 100755 index 000000000..2b7ee06ad --- /dev/null +++ b/test/integration/test-bug-745036-new-foreign-invalidates-cache @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable,installed' 'cool-foo' 'amd64' '1.0' 'Depends: foo' +insertpackage 'unstable,installed' 'foo' 'amd64' '1.0' 'Multi-Arch: foreign' + +setupaptarchive + +testsuccess aptget check -s + +configarchitecture 'amd64' 'i386' +testequal 'E: The package cache was built for different architectures: amd64 vs amd64,i386' aptget check -s -o pkgCacheFile::Generate=false + +testsuccess aptget check -s + +insertinstalledpackage 'awesome-foo' 'i386' '1.0' 'Depends: foo' + +testsuccess aptget check -s + +testsuccess aptget update --no-download + +testsuccess aptget check -s diff --git a/test/integration/test-bug-753297-upgradable b/test/integration/test-bug-753297-upgradable index 068704b3e..01395a095 100755 --- a/test/integration/test-bug-753297-upgradable +++ b/test/integration/test-bug-753297-upgradable @@ -16,8 +16,7 @@ Pin: release unstable Pin-Priority: 1 EOF -insertinstalledpackage 'foo' 'all' '1' -insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'testing,installed' 'foo' 'all' '1' insertpackage 'testing-updates' 'foo' 'all' '2' insertpackage 'unstable' 'foo' 'all' '3' diff --git a/test/integration/test-bug-758153-versioned-provides-support b/test/integration/test-bug-758153-versioned-provides-support index 2904ae5a1..21f9123c9 100755 --- a/test/integration/test-bug-758153-versioned-provides-support +++ b/test/integration/test-bug-758153-versioned-provides-support @@ -28,6 +28,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: webapp webserver 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/integration/test-bug-770291-reinstall b/test/integration/test-bug-770291-reinstall new file mode 100755 index 000000000..ea1f57ede --- /dev/null +++ b/test/integration/test-bug-770291-reinstall @@ -0,0 +1,98 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable,installed' 'libc6' 'i386' '1' +insertpackage 'unstable,installed' 'libselinux1' 'i386' '1' + +cp rootdir/var/lib/dpkg/status dpkg.status + +insertpackage 'unstable,installed' 'init' 'i386' '1' 'Depends: systemd-sysv +Essential: yes' +insertpackage 'unstable,installed' 'systemd-sysv' 'i386' '215-5+b1' 'Depends: systemd (= 215-5+b1) +Pre-Depends: systemd' +# fun fact: we need these two pre-depends to get systemd ordered before systemd-sysv as +# many pre-depends mean: do early (as they are a pain, so get them out of the way early) +insertpackage 'unstable,installed' 'systemd' 'i386' '215-5+b1' 'Pre-Depends: libc6, libselinux1' + +# depends loop +insertpackage 'unstable,installed' 'dependsA' 'i386' '1' 'Depends: dependsB +Essential: yes' +insertpackage 'unstable,installed' 'dependsB' 'i386' '1' 'Depends: dependsA +Essential: yes' + +# pre-depends loop +insertpackage 'unstable,installed' 'predependsA' 'i386' '1' 'Pre-Depends: predependsB +Essential: yes' +insertpackage 'unstable,installed' 'predependsB' 'i386' '1' 'Pre-Depends: predependsA +Essential: yes' + +# pre-depends-to-depends loop +insertpackage 'unstable,installed' 'predependsdependsA' 'i386' '1' 'Pre-Depends: predependsdependsB +Essential: yes' +insertpackage 'unstable,installed' 'predependsdependsB' 'i386' '1' 'Depends: predependsdependsA +Essential: yes' + +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded. +Inst systemd [215-5+b1] (215-5+b1 unstable [i386]) +Conf systemd (215-5+b1 unstable [i386]) +Inst systemd-sysv [215-5+b1] (215-5+b1 unstable [i386]) +Conf systemd-sysv (215-5+b1 unstable [i386])' aptget install --reinstall systemd systemd-sysv -s + +testequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded. +Inst dependsA [1] (1 unstable [i386]) +Inst dependsB [1] (1 unstable [i386]) +Conf dependsB (1 unstable [i386]) +Conf dependsA (1 unstable [i386])' aptget install --reinstall dependsA dependsB -s + +# there is a chance dpkg can actually do these, BUT this depends on the maintainerscripts (not) present +# which is very very risky to depend on (and apt doesn't know about that anyhow). +testfailure aptget install --reinstall predependsA predependsB -s -o Debug::pkgPackageManager=1 +testequal "E: Couldn't configure predependsA:i386, probably a dependency cycle." tail -n1 rootdir/tmp/testfailure.output + +# FIXME: the error message is a catch all here, not like the one above +testfailure aptget install --reinstall predependsdependsA predependsdependsB -s -o Debug::pkgPackageManager=1 +testequal "E: Could not configure 'predependsdependsB:i386'. " tail -n1 rootdir/tmp/testfailure.output + + +msgmsg 'While we are at it, lets try these loops without reinstall as well' +cp dpkg.status rootdir/var/lib/dpkg/status + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + systemd systemd-sysv +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst systemd (215-5+b1 unstable [i386]) +Conf systemd (215-5+b1 unstable [i386]) +Inst systemd-sysv (215-5+b1 unstable [i386]) +Conf systemd-sysv (215-5+b1 unstable [i386])' aptget install systemd systemd-sysv -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + dependsA dependsB +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst dependsA (1 unstable [i386]) [] +Inst dependsB (1 unstable [i386]) +Conf dependsB (1 unstable [i386]) +Conf dependsA (1 unstable [i386])' aptget install dependsA dependsB -s + +# there is a chance dpkg can actually do these, BUT this depends on the maintainerscripts (not) present +# which is very very risky to depend on (and apt doesn't know about that anyhow). +testfailure aptget install predependsA predependsB -s -o Debug::pkgPackageManager=1 +testequal "E: Couldn't configure predependsA:i386, probably a dependency cycle." tail -n1 rootdir/tmp/testfailure.output + +# FIXME: the error message is a catch all here, not like the one above +testfailure aptget install predependsdependsA predependsdependsB -s -o Debug::pkgPackageManager=1 +testequal "E: Could not configure 'predependsdependsB:i386'. " tail -n1 rootdir/tmp/testfailure.output diff --git a/test/integration/test-compressed-indexes b/test/integration/test-compressed-indexes index 805ed5964..92e7c0e84 100755 --- a/test/integration/test-compressed-indexes +++ b/test/integration/test-compressed-indexes @@ -39,10 +39,10 @@ testrun() { test -e rootdir/var/lib/apt/lists/*_Translation-en.${COMPRESS} || F=1 # there is no point in trying pdiff if we have compressed indexes # as we can't patch compressed files (well, we can, but what is the point?) - ! test -e rootdir/var/lib/apt/lists/*.IndexDiff || F=1 + ! test -e rootdir/var/lib/apt/lists/*diff_Index || F=1 else # clear the faked pdiff indexes so the glob below works - rm -f rootdir/var/lib/apt/lists/*.IndexDiff + rm -f rootdir/var/lib/apt/lists/*diff_Index test -e rootdir/var/lib/apt/lists/*_Packages || F=1 test -e rootdir/var/lib/apt/lists/*_Sources || F=1 test -e rootdir/var/lib/apt/lists/*_Translation-en || F=1 @@ -51,15 +51,18 @@ testrun() { ! test -e rootdir/var/lib/apt/lists/*_Translation-en.* || F=1 fi if [ -n "$F" ]; then + cat rootdir/tmp/testsuccess.output ls -laR rootdir/var/lib/apt/lists/ msgfail else msgpass fi msgtest 'Check if package is downloadable' + cd downloaded testsuccess --nomsg aptget download testpkg msgtest '\tdeb file is present'; testsuccess --nomsg test -f testpkg_1.0_i386.deb rm testpkg_1.0_i386.deb + cd - >/dev/null testequal 'Reading package lists... Building dependency tree... The following NEW packages will be installed: @@ -78,17 +81,20 @@ Conf testpkg (1.0 unstable [i386])' aptget install testpkg -s testequal "$GOODSHOWSRC" aptcache showsrc testpkg aptget clean msgtest 'Check if the source is aptgetable' + cd downloaded testsuccess --nomsg aptget source testpkg - msgtest '\tdsc file is present'; testsuccess --nomsg test -f testpkg_1.0.dsc - msgtest '\tdirectory is present'; testsuccess --nomsg test -d testpkg-1.0 + testsuccess test -s testpkg_1.0.dsc + testsuccess test -d testpkg-1.0 rm -rf testpkg-1.0* + cd - >/dev/null testequal "$(aptcache show testpkg -o Acquire::Languages=none) " aptcache dumpavail } echo 'Debug::pkgAcquire::worker "true"; debug::pkgAcquire::Auth "true"; -Debug::pkgAcquire::Diffs "true";' > rootdir/etc/apt/apt.conf.d/99debugconf +Debug::pkgAcquire::Diffs "true"; +Debug::Acquire::http "true";' > rootdir/etc/apt/apt.conf.d/99debugconf testovermethod() { forcecompressor $2 @@ -97,23 +103,28 @@ testovermethod() { rm -rf rootdir/var/lib/apt/lists echo "Acquire::GzipIndexes \"${INDEX}\";" > rootdir/etc/apt/apt.conf.d/02compressindex local INDCOMP - if [ "$INDEX" = 'false' ]; then + if [ "$INDEX" = 'false' -o "$1" = 'cdrom' ]; then INDCOMP='uncompressed' else INDCOMP='compressed' fi + msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX" + if [ "${1}" = 'cdrom' ]; then + testsuccess aptcdrom add </dev/null + fi testsuccess aptget update - msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes" testrun "$INDCOMP" - testsuccess aptget update -o Acquire::Pdiffs=1 - msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes (update unchanged with pdiffs)" - testrun "$INDCOMP" + if [ "${1}" != 'cdrom' ]; then + testsuccess aptget update -o Acquire::Pdiffs=1 + msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX (update unchanged with pdiffs)" + testrun "$INDCOMP" - testsuccess aptget update -o Acquire::Pdiffs=0 - msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes (update unchanged without pdiffs)" - testrun "$INDCOMP" + testsuccess aptget update -o Acquire::Pdiffs=0 + msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX (update unchanged without pdiffs)" + testrun "$INDCOMP" + fi rm rootdir/etc/apt/apt.conf.d/02compressindex done @@ -142,3 +153,12 @@ test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Instal testequal "$GOODPOLICY" aptcache policy testpkg for COMPRESSOR in 'gzip' 'bzip2' 'lzma' 'xz'; do testovermethod 'http' $COMPRESSOR; done + +changetocdrom 'Debian APT Testdisk 0.8.15' +rm -rf rootdir/var/lib/apt/lists +testsuccess aptcdrom add </dev/null +GOODPOLICY="$(aptcache policy testpkg)" +test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 cdrom://' | wc -l) -eq 4 || msgdie 'policy is broken' +testequal "$GOODPOLICY" aptcache policy testpkg + +for COMPRESSOR in 'gzip' 'bzip2' 'lzma' 'xz'; do testovermethod 'cdrom' $COMPRESSOR; done diff --git a/test/integration/test-conflicts-loop b/test/integration/test-conflicts-loop index a2c411aaf..81731dfe4 100755 --- a/test/integration/test-conflicts-loop +++ b/test/integration/test-conflicts-loop @@ -17,6 +17,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib 3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. @@ -29,4 +30,4 @@ Conf openjdk-6-jre (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) Inst openjdk-6-jre-headless [6b16-1.8-0ubuntu1] (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) Conf openjdk-6-jre-headless (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386])' aptget dist-upgrade -s -o APT::Immediate-Configure-All=true -testsuccess aptget dist-upgrade -s -o Debug::pkgPackageManager=1 +testsuccess aptget dist-upgrade -s diff --git a/test/integration/test-cve-2013-1051-InRelease-parsing b/test/integration/test-cve-2013-1051-InRelease-parsing index 41b27f691..8f9803991 100755 --- a/test/integration/test-cve-2013-1051-InRelease-parsing +++ b/test/integration/test-cve-2013-1051-InRelease-parsing @@ -42,7 +42,7 @@ touch -d '+1hour' aptarchive/dists/stable/InRelease # ensure the update fails # useful for debugging to add "-o Debug::pkgAcquire::auth=true" msgtest 'apt-get update for should fail with the modified' 'InRelease' -aptget update 2>&1 | grep -q 'Hash Sum mismatch' > /dev/null && msgpass || msgfail +aptget update 2>&1 | grep -E -q '(Writing more data than expected|Hash Sum mismatch)' > /dev/null && msgpass || msgfail # ensure there is no package testequal 'Reading package lists... diff --git a/test/integration/test-essential-force-loopbreak b/test/integration/test-essential-force-loopbreak index ac8fc6d28..1493430d8 100755 --- a/test/integration/test-essential-force-loopbreak +++ b/test/integration/test-essential-force-loopbreak @@ -37,13 +37,13 @@ The following packages will be upgraded: E: This installation run will require temporarily removing the essential package sysvinit:$(getarchitecture 'native') 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. E: Internal Error, Could not early remove sysvinit:$(dpkg --print-architecture) (2)" aptget install systemd-sysv -t "$1" -s # ensure that really nothing happens - testfailure aptget install systemd-sysv -y -t "$1" -o Debug::pkgPackageManager=1 + testfailure aptget install systemd-sysv -y -t "$1" testdpkginstalled 'sysvinit' testdpkgnotinstalled 'systemd-sysv' # with enough force however … cp -a dpkg.status.backup rootdir/var/lib/dpkg/status - testsuccess aptget install systemd-sysv -y -t "$1" -o Debug::pkgPackageManager=1 -o APT::Force-LoopBreak=1 + testsuccess aptget install systemd-sysv -y -t "$1" -o APT::Force-LoopBreak=1 testdpkginstalled 'sysvinit' 'systemd-sysv' } diff --git a/test/integration/test-external-dependency-solver-protocol b/test/integration/test-external-dependency-solver-protocol index 07d2441b6..fd68578c5 100755 --- a/test/integration/test-external-dependency-solver-protocol +++ b/test/integration/test-external-dependency-solver-protocol @@ -12,7 +12,10 @@ insertinstalledpackage 'stuff' 'all' '1' insertpackage 'unstable' 'cool' 'all' '2' 'Multi-Arch: foreign' insertpackage 'unstable' 'stuff' 'all' '2' 'Multi-Arch: foreign' insertpackage 'unstable' 'coolstuff' 'i386,amd64' '2' 'Depends: cool, stuff' -insertpackage 'unstable' 'awesome' 'all' '2' 'Multi-Arch: foreign' +insertpackage 'unstable' 'awesome' 'all' '2' 'Multi-Arch: foreign +Conflicts: badstuff' +insertpackage 'unstable' 'badstuff' 'all' '2' 'Multi-Arch: foreign +Conflicts: awesome' insertpackage 'unstable' 'awesomecoolstuff' 'i386' '2' 'Depends: coolstuff, awesome' insertpackage 'experimental' 'cool' 'all' '3' 'Multi-Arch: foreign' @@ -44,6 +47,14 @@ The following NEW packages will be installed: Inst coolstuff (3 experimental [amd64]) Conf coolstuff (3 experimental [amd64])' aptget install --solver apt coolstuff -s +testequal 'Reading package lists... +Building dependency tree... +Execute external solver... +The following packages will be REMOVED: + cool* +0 upgraded, 0 newly installed, 1 to remove and 1 not upgraded. +Purg cool [1]' aptget purge --solver apt cool -s + testsuccess aptget install awesomecoolstuff:i386 -s testsuccess aptget install --solver apt awesomecoolstuff:i386 -s @@ -57,9 +68,13 @@ testsuccess aptget dist-upgrade -s --solver apt testsuccess aptget upgrade -s testsuccess aptget upgrade -s --solver apt +testfailure aptget install awesome badstuff -s +testfailure aptget install awesome badstuff -s --solver apt +testsuccess grep 'ERR_UNSOLVABLE' rootdir/tmp/testfailure.output + configarchitecture 'armel' msgtest 'Test direct calling is okay for' 'apt-internal-solver' -cat /tmp/dump.edsp | aptinternalsolver > solver.result 2>&1 || true +cat /tmp/dump.edsp | aptinternalsolver -q=0 > solver.result 2>&1 || true if [ "$(tail -n2 solver.result | head -n1 )" = "Message: Done" ]; then msgpass else @@ -69,3 +84,16 @@ fi rm -f /tmp/dump.edsp testfailure aptget install --solver apt awesomecoolstuff:i386 -s + +testsuccess aptinternalsolver scenario +testequal 'Package: stuff +Source: stuff +Architecture: all +Version: 1 +Installed: yes +APT-ID: 2 +Priority: optional +Section: other +APT-Pin: 100 +APT-Candidate: yes +' aptinternalsolver scenario stuff diff --git a/test/integration/test-hashsum-verification b/test/integration/test-hashsum-verification index 2a400dcb4..5f88110b3 100755 --- a/test/integration/test-hashsum-verification +++ b/test/integration/test-hashsum-verification @@ -70,9 +70,13 @@ runtest() { rm -rf rootdir/var/lib/apt/lists rm aptarchive/InRelease aptarchive/Release.gpg msgtest 'unsigned apt-get update gets the expected hashsum mismatch' - aptget update 2>&1 | grep "Hash Sum mismatch" > /dev/null && msgpass || msgfail - - + aptget update --allow-insecure-repositories >output.log 2>&1 || true + if grep -q "Hash Sum mismatch" output.log; then + msgpass + else + cat output.log + msgfail + fi } for COMPRESSEDINDEXES in 'false' 'true'; do diff --git a/test/integration/test-http-pipeline-messup b/test/integration/test-http-pipeline-messup new file mode 100755 index 000000000..dda8ef7eb --- /dev/null +++ b/test/integration/test-http-pipeline-messup @@ -0,0 +1,47 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +# try a little harder to create a size mismatch +buildsimplenativepackage 'pkga' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none' +buildsimplenativepackage 'pkgb' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none' +buildsimplenativepackage 'pkgc' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none' +buildsimplenativepackage 'pkgd' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none' + +setupaptarchive --no-update + +# simulate (and be a predictable) pipeline mess-up by the server/proxy +changetowebserver \ + -o 'aptwebserver::overwrite::.*pkga.*::filename=/pool/pkgd_1.0_all.deb' \ + -o 'aptwebserver::overwrite::.*pkgc.*::filename=/pool/pkgb_1.0_all.deb' \ + -o 'aptwebserver::overwrite::.*pkgb.*::filename=/pool/pkgc_1.0_all.deb' \ + -o 'aptwebserver::overwrite::.*pkgd.*::filename=/pool/pkga_1.0_all.deb' + +echo 'Debug::Acquire::http "true"; +Debug::pkgAcquire::Worker "true";' > rootdir/etc/apt/apt.conf.d/99debug + +testsuccess aptget update + +# messup is bigger than pipeline: checks if fixup isn't trying to hard +testfailure aptget download pkga pkgb pkgc pkgd -o Acquire::http::Pipeline-Depth=2 +testfailure test -f pkga_1.0_all.deb + +# ensure that pipeling is enabled for rest of this test +echo 'Acquire::http::Pipeline-Depth 10;' > rootdir/etc/apt/apt.conf.d/99enable-pipeline + +# the output is a bit strange: it looks like it has downloaded pkga 4 times +testwarning aptget download pkga pkgb pkgc pkgd +for pkg in 'pkga' 'pkgb' 'pkgc' 'pkgd'; do + testsuccess test -f ${pkg}_1.0_all.deb + testsuccess cmp incoming/${pkg}_1.0_all.deb ${pkg}_1.0_all.deb + rm -f ${pkg}_1.0_all.deb +done + +# while hashes will pass (as none are available), sizes will not match, so failure +# checks that no hashes means that pipeline depth is ignored as we can't fixup +testfailure aptget download pkga pkgb pkgc pkgd --allow-unauthenticated -o Acquire::ForceHash=ROT26 diff --git a/test/integration/test-kernel-helper-autoremove b/test/integration/test-kernel-helper-autoremove index c51caa758..1524ed4c7 100755 --- a/test/integration/test-kernel-helper-autoremove +++ b/test/integration/test-kernel-helper-autoremove @@ -9,7 +9,7 @@ configarchitecture 'amd64' # the executed script would use the installed apt-config, # which is outside of our control msgtest 'Check that the installed apt-config supports' '--no-empty' -if apt-config dump --no-empty >/dev/null 2>&1; then +if /usr/bin/apt-config dump --no-empty >/dev/null 2>&1; then msgpass else msgskip @@ -26,13 +26,6 @@ insertinstalledpackage 'linux-headers-1000000-1-generic' 'amd64' '100.0.0-1' testsuccess aptmark auto "$CURRENTKERNEL" 'linux-image-1.0.0-2-generic' 'linux-image-100.0.0-1-generic' 'linux-headers-1000000-1-generic' -cat > ./fake-dpkg <<EOF -#!/bin/sh -exec $(aptconfig dump --no-empty --format='%v ' 'DPKG::options') "\$@" -EOF -chmod +x ./fake-dpkg -echo 'Dir::Bin::dpkg "./fake-dpkg";' > rootdir/etc/apt/apt.conf.d/99fakedpkg - # install fake-dpkg into it catfail() { echo >&2 diff --git a/test/integration/test-partial-file-support b/test/integration/test-partial-file-support index 160d451b6..b6b305d25 100755 --- a/test/integration/test-partial-file-support +++ b/test/integration/test-partial-file-support @@ -72,7 +72,7 @@ cp -a ${TESTDIR}/framework $TESTFILE cp -a ${TESTDIR}/framework "${TESTFILE}2" followuprequest() { - local DOWN='./testfile' + local DOWN='./downloaded/testfile' copysource $TESTFILE 1M $DOWN testdownloadfile 'completely downloaded file' "${1}/testfile" "$DOWN" '=' @@ -90,17 +90,18 @@ followuprequest() { testrun() { webserverconfig 'aptwebserver::support::range' 'true' + local DOWN='./downloaded/testfile' - copysource $TESTFILE 0 ./testfile - testdownloadfile 'no data' "${1}/testfile" './testfile' '=' + copysource $TESTFILE 0 $DOWN + testdownloadfile 'no data' "${1}/testfile" "$DOWN" '=' testwebserverlaststatuscode '200' "$DOWNLOADLOG" - copysource $TESTFILE 20 ./testfile - testdownloadfile 'valid partial data' "${1}/testfile" './testfile' '=' + copysource $TESTFILE 20 $DOWN + testdownloadfile 'valid partial data' "${1}/testfile" "$DOWN" '=' testwebserverlaststatuscode '206' "$DOWNLOADLOG" - copysource /dev/zero 20 ./testfile - testdownloadfile 'invalid partial data' "${1}/testfile" './testfile' '!=' + copysource /dev/zero 20 $DOWN + testdownloadfile 'invalid partial data' "${1}/testfile" "$DOWN" '!=' testwebserverlaststatuscode '206' "$DOWNLOADLOG" webserverconfig 'aptwebserver::closeOnError' 'false' @@ -109,19 +110,19 @@ testrun() { followuprequest "$1" webserverconfig 'aptwebserver::closeOnError' 'false' - copysource /dev/zero 1M ./testfile - testdownloadfile 'too-big partial file' "${1}/testfile" './testfile' '=' + copysource /dev/zero 1M $DOWN + testdownloadfile 'too-big partial file' "${1}/testfile" "$DOWN" '=' testwebserverlaststatuscode '200' "$DOWNLOADLOG" - copysource /dev/zero 20 ./testfile - touch ./testfile - testdownloadfile 'old data' "${1}/testfile" './testfile' '=' + copysource /dev/zero 20 $DOWN + touch $DOWN + testdownloadfile 'old data' "${1}/testfile" "$DOWN" '=' testwebserverlaststatuscode '200' "$DOWNLOADLOG" webserverconfig 'aptwebserver::support::range' 'false' - copysource $TESTFILE 20 ./testfile - testdownloadfile 'no server support' "${1}/testfile" './testfile' '=' + copysource $TESTFILE 20 $DOWN + testdownloadfile 'no server support' "${1}/testfile" "$DOWN" '=' testwebserverlaststatuscode '200' "$DOWNLOADLOG" } diff --git a/test/integration/test-pdiff-usage b/test/integration/test-pdiff-usage index afe1ad443..d773dcd66 100755 --- a/test/integration/test-pdiff-usage +++ b/test/integration/test-pdiff-usage @@ -13,12 +13,6 @@ changetowebserver PKGFILE="${TESTDIR}/$(echo "$(basename $0)" | sed 's#^test-#Packages-#')" -echo '#!/bin/sh -touch merge-was-used -/usr/bin/diffindex-rred "$@"' > extrred -chmod +x extrred -echo 'Dir::Bin::rred "./extrred";' > rootdir/etc/apt/apt.conf.d/99rred - wasmergeused() { msgtest 'Test for successful execution of' "$*" local OUTPUT=$(mktemp) @@ -82,8 +76,15 @@ SHA1-History: 9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28 $(sha1sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) SHA1-Patches: - 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28 - $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX + 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28 + $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE) +SHA256-Current: $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX generatereleasefiles '+1hour' signreleasefiles find aptarchive -name 'Packages*' -type f -delete @@ -93,7 +94,7 @@ SHA1-Patches: " aptcache show apt newstuff msgmsg "Testcase: index is already up-to-date: $*" - find rootdir/var/lib/apt/lists -name '*.IndexDiff' -type f -delete + find rootdir/var/lib/apt/lists -name '*diff_Index' -type f -delete testsuccess aptget update "$@" testequal "$(cat ${PKGFILE}-new) " aptcache show apt newstuff @@ -125,9 +126,18 @@ SHA1-History: $(sha1sum ${PKGFILE} | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}) $(basename ${PATCHFILE}) $(sha1sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) $(basename ${PATCHFILE2}) SHA1-Patches: - 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28 + 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28 $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE) - $(sha1sum ${PATCHFILE2} | cut -d' ' -f 1) $(stat -c%s ${PATCHFILE2}) $(basename ${PATCHFILE2})" > $PATCHINDEX + $(sha1sum ${PATCHFILE2} | cut -d' ' -f 1) $(stat -c%s ${PATCHFILE2}) $(basename ${PATCHFILE2}) +SHA256-Current: $(sha256sum aptarchive/Packages | cut -d' ' -f 1) $(stat -c%s aptarchive/Packages) +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) + $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) $(basename ${PATCHFILE2}) +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE) + $(sha256sum ${PATCHFILE2} | cut -d' ' -f 1) $(stat -c%s ${PATCHFILE2}) $(basename ${PATCHFILE2})" > $PATCHINDEX generatereleasefiles '+2hour' signreleasefiles cp -a aptarchive/Packages Packages-future @@ -153,8 +163,15 @@ SHA1-History: 9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28 $(sha1sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) SHA1-Patches: - 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28 - $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX + 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28 + $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE) +SHA256-Current: $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX echo 'I am Mallory and I change files' >> $PATCHFILE cat $PATCHFILE | gzip > ${PATCHFILE}.gz generatereleasefiles '+1hour' @@ -163,11 +180,59 @@ SHA1-Patches: testnopackage oldstuff testequal "$(cat ${PKGFILE}-new) " aptcache show apt newstuff + + msgmsg "Testcase: pdiff patch bigger than index itself: $*" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + cp ${PKGFILE}-new aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e ${PKGFILE} ${PKGFILE}-new > ${PATCHFILE} || true + cat $PATCHFILE | gzip > ${PATCHFILE}.gz + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA1-Current: $(sha1sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) +SHA1-History: + 9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28 + $(sha1sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) +SHA1-Patches: + 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28 + $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE)000 $(basename $PATCHFILE) +SHA256-Current: $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE) +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE)000 $(basename $PATCHFILE)" > $PATCHINDEX + generatereleasefiles '+1hour' + signreleasefiles + #find aptarchive -name 'Packages*' -type f -delete + testsuccess aptget update -o Debug::pkgAcquire::Diffs=1 "$@" + cp -f rootdir/tmp/testsuccess.output rootdir/tmp/aptgetupdate.output + testsuccess grep 'bytes (Limit is' rootdir/tmp/aptgetupdate.output + testnopackage oldstuff + testequal "$(cat ${PKGFILE}-new) +" aptcache show apt newstuff } echo 'Debug::pkgAcquire::Diffs "true"; +Debug::Acquire::Transaction "true"; Debug::pkgAcquire::rred "true";' > rootdir/etc/apt/apt.conf.d/rreddebug.conf testrun -o Acquire::PDiffs::Merge=0 -o APT::Get::List-Cleanup=1 testrun -o Acquire::PDiffs::Merge=1 -o APT::Get::List-Cleanup=1 testrun -o Acquire::PDiffs::Merge=0 -o APT::Get::List-Cleanup=0 testrun -o Acquire::PDiffs::Merge=1 -o APT::Get::List-Cleanup=0 + +sha256sum() { + echo '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b -' +} +testrun -o Acquire::PDiffs::Merge=0 -o Acquire::ForceHash=SHA1 +testrun -o Acquire::PDiffs::Merge=1 -o Acquire::ForceHash=SHA1 + +unset -f sha256sum +sha1sum() { + echo 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc -' +} +testrun -o Acquire::PDiffs::Merge=0 -o Acquire::ForceHash=SHA256 +testrun -o Acquire::PDiffs::Merge=1 -o Acquire::ForceHash=SHA256 diff --git a/test/integration/test-pin-non-existent-package b/test/integration/test-pin-non-existent-package index 35de22115..c567e5285 100755 --- a/test/integration/test-pin-non-existent-package +++ b/test/integration/test-pin-non-existent-package @@ -26,6 +26,7 @@ testcandidate rapt '0.8.15' testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist -q=0 testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only echo 'Package: rapt @@ -36,6 +37,7 @@ testcandidate rapt '(none)' testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist -q=0 testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only echo ' @@ -55,6 +57,7 @@ testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only echo 'Package: arch:amd64 diff --git a/test/integration/test-policy-pinning b/test/integration/test-policy-pinning index 8eb4bcbad..c08a2f103 100755 --- a/test/integration/test-policy-pinning +++ b/test/integration/test-policy-pinning @@ -28,7 +28,7 @@ Pinned packages:" aptcache policy $* aptgetupdate() { # just to be sure that no old files are used rm -rf rootdir/var/lib/apt - if aptget update -qq 2>&1 | grep '^E: '; then + if aptget update --allow-insecure-repositories -qq 2>&1 | grep '^E: '; then msgwarn 'apt-get update failed with an error' fi } @@ -36,6 +36,7 @@ aptgetupdate() { ### not signed archive aptgetupdate + testequalpolicy 100 500 testequalpolicy 990 500 -t now diff --git a/test/integration/test-prevent-markinstall-multiarch-same-versionscrew b/test/integration/test-prevent-markinstall-multiarch-same-versionscrew index d647856cb..db97687ce 100755 --- a/test/integration/test-prevent-markinstall-multiarch-same-versionscrew +++ b/test/integration/test-prevent-markinstall-multiarch-same-versionscrew @@ -9,20 +9,17 @@ configarchitecture 'amd64' 'i386' 'armel' insertpackage 'stable' 'allarchs' 'all' '1' insertpackage 'unstable' 'allarchs' 'all' '2' -insertinstalledpackage 'fine' 'i386,amd64' '1' 'Multi-Arch: same' -insertpackage 'stable' 'fine' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'stable,installed' 'fine' 'i386,amd64' '1' 'Multi-Arch: same' insertpackage 'unstable' 'fine' 'amd64,i386' '2' 'Multi-Arch: same' insertinstalledpackage 'fine-installed' 'i386,amd64' '1' 'Multi-Arch: same' insertpackage 'stable' 'fine-installed' 'i386,amd64,armel' '1' 'Multi-Arch: same' insertpackage 'unstable' 'fine-installed' 'i386,amd64' '2' 'Multi-Arch: same' -insertinstalledpackage 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same' -insertpackage 'stable' 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'stable,installed' 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same' insertpackage 'unstable' 'out-of-sync-native' 'amd64' '2' 'Multi-Arch: same' -insertinstalledpackage 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same' -insertpackage 'stable' 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'stable,installed' 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same' insertpackage 'unstable' 'out-of-sync-foreign' 'i386' '2' 'Multi-Arch: same' insertinstalledpackage 'out-of-sync-gone-native' 'i386,amd64' '1' 'Multi-Arch: same' @@ -43,6 +40,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: out-of-sync-gone-foreign:i386 out-of-sync-gone-native The following packages have been kept back: diff --git a/test/integration/test-provides-gone-with-upgrade b/test/integration/test-provides-gone-with-upgrade index 70384ce29..3b4bc2d04 100755 --- a/test/integration/test-provides-gone-with-upgrade +++ b/test/integration/test-provides-gone-with-upgrade @@ -15,6 +15,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following NEW packages will be installed: libapt-pkg4.10 The following packages will be upgraded: diff --git a/test/integration/test-releasefile-valid-until b/test/integration/test-releasefile-valid-until index e673d5f71..0d9a91254 100755 --- a/test/integration/test-releasefile-valid-until +++ b/test/integration/test-releasefile-valid-until @@ -12,84 +12,38 @@ getlabelfromsuite() { echo -n 'Testcases' } +setupaptarchive --no-update -setupaptarchive - -setupreleasefile() { +runtest() { + local MSG="$1" + msgtest "$1" "$2" rm -rf rootdir/var/lib/apt/lists aptget clean - generatereleasefiles "$1" "$2" + generatereleasefiles "$3" "$4" signreleasefiles -} - -aptgetupdate() { - if aptget update $* 2>&1 | grep -q 'is expired'; then - return 1 + shift 4 + if expr match "$MSG" '.*accepted.*' >/dev/null; then + testsuccess --nomsg aptget update "$@" + testfailure grep -q 'is expired' rootdir/tmp/testsuccess.output else - return 0 + testfailure --nomsg aptget update "$@" + testsuccess grep -q 'is expired' rootdir/tmp/testfailure.output fi } -setupreleasefile -msgtest 'Release file is accepted as it has' 'no Until' -testsuccess --nomsg aptgetupdate - -setupreleasefile -msgtest 'Release file is accepted as it has' 'no Until and good Max-Valid' -testsuccess --nomsg aptgetupdate -o Acquire::Max-ValidTime=3600 - -setupreleasefile 'now - 2 days' -msgtest 'Release file is rejected as it has' 'no Until, but bad Max-Valid' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=3600 - -setupreleasefile 'now - 3 days' 'now + 1 day' -msgtest 'Release file is accepted as it has' 'good Until' -testsuccess --nomsg aptgetupdate - -setupreleasefile 'now - 7 days' 'now - 4 days' -msgtest 'Release file is rejected as it has' 'bad Until' -testfailure --nomsg aptgetupdate - -setupreleasefile 'now - 7 days' 'now - 4 days' -msgtest 'Release file is rejected as it has' 'bad Until (ignore good Max-Valid)' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=1209600 - -setupreleasefile 'now - 7 days' 'now - 4 days' -msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until)' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=86400 - -setupreleasefile 'now - 7 days' 'now + 4 days' -msgtest 'Release file is rejected as it has' 'bad Max-Valid (good Until)' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=86400 - -setupreleasefile 'now - 7 days' 'now + 4 days' -msgtest 'Release file is accepted as it has' 'good labeled Max-Valid' -testsuccess --nomsg aptgetupdate -o Acquire::Max-ValidTime=86400 -o Acquire::Max-ValidTime::Testcases=1209600 - -setupreleasefile 'now - 7 days' 'now + 4 days' -msgtest 'Release file is rejected as it has' 'bad labeled Max-Valid' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=1209600 -o Acquire::Max-ValidTime::Testcases=86400 - -setupreleasefile 'now - 7 days' 'now + 1 days' -msgtest 'Release file is accepted as it has' 'good Until (good Min-Valid, no Max-Valid)' -testsuccess --nomsg aptgetupdate -o Acquire::Min-ValidTime=1209600 - -setupreleasefile 'now - 7 days' 'now - 4 days' -msgtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, no Max-Valid)' -testsuccess --nomsg aptgetupdate -o Acquire::Min-ValidTime=1209600 - -setupreleasefile 'now - 7 days' 'now - 2 days' -msgtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, good Max-Valid) <' -testsuccess --nomsg aptgetupdate -o Acquire::Min-ValidTime=1209600 -o Acquire::Max-ValidTime=2419200 - -setupreleasefile 'now - 7 days' 'now - 2 days' -msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, good Min-Valid) >' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=2419200 - -setupreleasefile 'now - 7 days' 'now - 2 days' -msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) <' -testfailure --nomsg aptgetupdate -o Acquire::Min-ValidTime=12096 -o Acquire::Max-ValidTime=241920 - -setupreleasefile 'now - 7 days' 'now - 2 days' -msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) >' -testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=241920 +runtest 'Release file is accepted as it has' 'no Until' '' '' +runtest 'Release file is accepted as it has' 'no Until and good Max-Valid' '' '' -o Acquire::Max-ValidTime=3600 +runtest 'Release file is rejected as it has' 'no Until, but bad Max-Valid' 'now - 2 days' '' -o Acquire::Max-ValidTime=3600 +runtest 'Release file is accepted as it has' 'good Until' 'now - 3 days' 'now + 1 day' +runtest 'Release file is rejected as it has' 'bad Until' 'now - 7 days' 'now - 4 days' +runtest 'Release file is rejected as it has' 'bad Until (ignore good Max-Valid)' 'now - 7 days' 'now - 4 days' -o Acquire::Max-ValidTime=1209600 +runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until)' 'now - 7 days' 'now - 4 days' -o Acquire::Max-ValidTime=86400 +runtest 'Release file is rejected as it has' 'bad Max-Valid (good Until)' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=86400 +runtest 'Release file is accepted as it has' 'good labeled Max-Valid' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=86400 -o Acquire::Max-ValidTime::Testcases=1209600 +runtest 'Release file is rejected as it has' 'bad labeled Max-Valid' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=1209600 -o Acquire::Max-ValidTime::Testcases=86400 +runtest 'Release file is accepted as it has' 'good Until (good Min-Valid, no Max-Valid)' 'now - 7 days' 'now + 1 days' -o Acquire::Min-ValidTime=1209600 +runtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, no Max-Valid)' 'now - 7 days' 'now - 4 days' -o Acquire::Min-ValidTime=1209600 +runtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, good Max-Valid) <' 'now - 7 days' 'now - 2 days' -o Acquire::Min-ValidTime=1209600 -o Acquire::Max-ValidTime=2419200 +runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, good Min-Valid) >' 'now - 7 days' 'now - 2 days' -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=2419200 +runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) <' 'now - 7 days' 'now - 2 days' -o Acquire::Min-ValidTime=12096 -o Acquire::Max-ValidTime=241920 +runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) >' 'now - 7 days' 'now - 2 days' -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=241920 diff --git a/test/integration/test-releasefile-verification b/test/integration/test-releasefile-verification index e558b83e8..3765a4b1f 100755 --- a/test/integration/test-releasefile-verification +++ b/test/integration/test-releasefile-verification @@ -235,10 +235,21 @@ runtest2() { " aptcache show apt failaptnew } -runtest2 +# diable some protection by default and ensure we still do the verification +# correctly +cat > rootdir/etc/apt/apt.conf.d/weaken-security <<EOF +Acquire::AllowInsecureRepositories "1"; +Acquire::AllowDowngradeToInsecureRepositories "1"; +EOF + +msgmsg "Runing base test" +runtest2 DELETEFILE="InRelease" +msgmsg "Running test with deletion of $DELETEFILE" runtest + DELETEFILE="Release.gpg" +msgmsg "Running test with deletion of $DELETEFILE" runtest diff --git a/test/integration/test-resolve-by-keep-new-recommends b/test/integration/test-resolve-by-keep-new-recommends index 8134b76aa..6b1772877 100755 --- a/test/integration/test-resolve-by-keep-new-recommends +++ b/test/integration/test-resolve-by-keep-new-recommends @@ -13,6 +13,7 @@ setupaptarchive UPGRADE_KEEP="Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: foo 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded." diff --git a/test/integration/test-sourceslist-trusted-options b/test/integration/test-sourceslist-trusted-options new file mode 100755 index 000000000..55d4e0233 --- /dev/null +++ b/test/integration/test-sourceslist-trusted-options @@ -0,0 +1,201 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'foo' 'amd64' '1' 'stable' +buildsimplenativepackage 'foo' 'amd64' '2' 'testing' + +setupaptarchive --no-update + +APTARCHIVE=$(readlink -f ./aptarchive) + +everythingsucceeds() { + testequal 'Listing... +foo/testing 2 amd64 +foo/stable 1 amd64 +' apt list foo -a + + cd downloaded + rm -f foo_1_amd64.deb foo_2_amd64.deb + testsuccess aptget download foo "$@" + testsuccess test -s foo_1_amd64.deb -o -s foo_2_amd64.deb + + rm -f foo_1.dsc foo_2.dsc + testsuccess aptget source foo --dsc-only -d "$@" + testsuccess test -s foo_1.dsc -o -s foo_2.dsc + cd - >/dev/null +} + +everythingfails() { + testequal 'Listing... +foo/testing 2 amd64 +foo/stable 1 amd64 +' apt list foo -a + + local WARNING='WARNING: The following packages cannot be authenticated! + foo +E: Some packages could not be authenticated' + + cd downloaded + rm -f foo_1_amd64.deb foo_2_amd64.deb + testfailure aptget download foo "$@" + testequal "$WARNING" tail -n 3 ../rootdir/tmp/testfailure.output + testfailure test -s foo_1_amd64.deb -o -s foo_2_amd64.deb + + rm -f foo_1.dsc foo_2.dsc + testfailure aptget source foo --dsc-only -d "$@" + testequal "$WARNING" tail -n 3 ../rootdir/tmp/testfailure.output + testfailure test -s foo_1.dsc -o -s foo_2.dsc + cd - >/dev/null +} + +cp -a rootdir/etc/apt/sources.list.d/ rootdir/etc/apt/sources.list.d.bak/ +echo 'Debug::Acquire::Transaction "true"; +Debug::pkgAcquire::Worker "true";' > rootdir/etc/apt/apt.conf.d/00debugging + +aptgetupdate() { + rm -rf rootdir/var/lib/apt/lists + # note that insecure with trusted=yes are allowed + # as the trusted=yes indicates that security is provided by + # something above the understanding of apt + ${1:-testsuccess} aptget update --no-allow-insecure-repositories +} + +insecureaptgetupdate() { + rm -rf rootdir/var/lib/apt/lists + testfailure aptget update --no-allow-insecure-repositories + rm -rf rootdir/var/lib/apt/lists + testwarning aptget update --allow-insecure-repositories +} + +msgmsg 'Test without trusted option and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +aptgetupdate +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +# we want the warnings on the actions, but for 'update' everything is fine +aptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +find aptarchive/dists/stable \( -name 'InRelease' -o -name 'Release.gpg' \) -delete + +msgmsg 'Test without trusted option and good and unsigned sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingsucceeds +everythingfails -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good and unsigned sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate 'testwarning' +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good and unsigned sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +signreleasefiles 'Marvin Paranoid' 'aptarchive/dists/stable' + +msgmsg 'Test without trusted option and good and unknown sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingsucceeds +everythingfails -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good and unknown sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate 'testwarning' +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good and unknown sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +signreleasefiles 'Rex Expired' 'aptarchive/dists/stable' +cp -a keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + +msgmsg 'Test without trusted option and good and expired sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingsucceeds +everythingfails -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good and expired sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate 'testwarning' +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good and expired sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +# same as the one further above, but this time testing is unsigned +find aptarchive/ \( -name 'InRelease' -o -name 'Release.gpg' \) -delete +signreleasefiles 'Joe Sixpack' 'aptarchive/dists/stable' + +msgmsg 'Test without trusted option and unsigned and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingfails +everythingsucceeds -t stable +everythingfails -t testing + +msgmsg 'Test with trusted=yes option and unsigned and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate 'testwarning' +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and unsigned and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing diff --git a/test/integration/test-suggest-installed-multiarch-silbing b/test/integration/test-suggest-installed-multiarch-silbing index d55d250aa..89640a30c 100755 --- a/test/integration/test-suggest-installed-multiarch-silbing +++ b/test/integration/test-suggest-installed-multiarch-silbing @@ -9,8 +9,7 @@ configarchitecture 'amd64' 'i386' 'armel' insertinstalledpackage 'foo' 'i386' '1' insertpackage 'unstable' 'foo' 'amd64,i386' '1' -insertinstalledpackage 'foo2' 'i386' '1' -insertpackage 'unstable' 'foo2' 'i386' '1' +insertpackage 'unstable,installed' 'foo2' 'i386' '1' insertinstalledpackage 'foo3' 'amd64' '1' insertpackage 'unstable' 'foo3' 'amd64,i386' '1' diff --git a/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum b/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum index 9bdc81264..574183b0a 100755 --- a/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum +++ b/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum @@ -14,8 +14,8 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Files: - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-ok_1.0.dsc - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-ok_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-ok_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-ok_1.0.tar.gz Package: pkg-sha256-ok Binary: pkg-sha256-ok @@ -23,14 +23,14 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Files: - d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-ok_1.0.dsc - d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-ok_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-sha256-ok_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-ok_1.0.tar.gz Checksums-Sha1: - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-ok_1.0.dsc - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-ok_1.0.tar.gz + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-ok_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-ok_1.0.tar.gz Checksums-Sha256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-ok_1.0.dsc - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-ok_1.0.tar.gz + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-sha256-ok_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-sha256-ok_1.0.tar.gz Package: pkg-sha256-bad Binary: pkg-sha256-bad @@ -38,14 +38,14 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Files: - d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-bad_1.0.dsc - d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-bad_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-sha256-bad_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-bad_1.0.tar.gz Checksums-Sha1: - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-bad_1.0.dsc - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-bad_1.0.tar.gz + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-bad_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-bad_1.0.tar.gz Checksums-Sha256: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-sha256-bad_1.0.dsc - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-sha256-bad_1.0.tar.gz + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-sha256-bad_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-sha256-bad_1.0.tar.gz Package: pkg-no-md5 Binary: pkg-no-md5 @@ -53,11 +53,11 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Checksums-Sha1: - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-no-md5_1.0.dsc - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-no-md5_1.0.tar.gz + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-no-md5_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-no-md5_1.0.tar.gz Checksums-Sha256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-no-md5_1.0.dsc - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-no-md5_1.0.tar.gz + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-no-md5_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-no-md5_1.0.tar.gz Package: pkg-mixed-ok Binary: pkg-mixed-ok @@ -65,9 +65,9 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Checksums-Sha1: - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-mixed-ok_1.0.tar.gz + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-mixed-ok_1.0.tar.gz Checksums-Sha256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-mixed-ok_1.0.dsc + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-mixed-ok_1.0.dsc Package: pkg-mixed-sha1-bad Binary: pkg-mixed-sha1-bad @@ -75,9 +75,9 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Checksums-Sha1: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-mixed-sha1-bad_1.0.dsc + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-mixed-sha1-bad_1.0.dsc Checksums-Sha256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-mixed-sha1-bad_1.0.tar.gz + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-mixed-sha1-bad_1.0.tar.gz Package: pkg-mixed-sha2-bad Binary: pkg-mixed-sha2-bad @@ -85,9 +85,9 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Checksums-Sha1: - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-mixed-sha2-bad_1.0.dsc + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-mixed-sha2-bad_1.0.dsc Checksums-Sha256: - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-mixed-sha2-bad_1.0.tar.gz + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-mixed-sha2-bad_1.0.tar.gz Package: pkg-md5-disagree Binary: pkg-md5-disagree @@ -95,10 +95,10 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Files: - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-disagree_1.0.dsc - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-disagree_1.0.tar.gz - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-md5-disagree_1.0.dsc - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-md5-disagree_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-disagree_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-disagree_1.0.tar.gz + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-md5-disagree_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-md5-disagree_1.0.tar.gz Package: pkg-md5-agree Binary: pkg-md5-agree @@ -106,10 +106,10 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Files: - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.dsc - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.tar.gz - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.tar.gz - d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.dsc + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-agree_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-agree_1.0.tar.gz + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-agree_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-agree_1.0.dsc Package: pkg-sha256-disagree Binary: pkg-sha256-disagree @@ -117,36 +117,39 @@ Version: 1.0 Maintainer: Joe Sixpack <joe@example.org> Architecture: all Files: - d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-disagree_1.0.dsc - d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-disagree_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-sha256-disagree_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-disagree_1.0.tar.gz Checksums-Sha1: - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-disagree_1.0.dsc - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-disagree_1.0.tar.gz + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-disagree_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-disagree_1.0.tar.gz Checksums-Sha256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-disagree_1.0.dsc - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-disagree_1.0.tar.gz - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-sha256-disagree_1.0.dsc - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-sha256-disagree_1.0.tar.gz + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-sha256-disagree_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-sha256-disagree_1.0.tar.gz + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-sha256-disagree_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-sha256-disagree_1.0.tar.gz EOF # create fetchable files for x in 'pkg-md5-ok' 'pkg-sha256-ok' 'pkg-sha256-bad' 'pkg-no-md5' \ 'pkg-mixed-ok' 'pkg-mixed-sha1-bad' 'pkg-mixed-sha2-bad' \ 'pkg-md5-agree' 'pkg-md5-disagree' 'pkg-sha256-disagree'; do - touch aptarchive/${x}_1.0.dsc aptarchive/${x}_1.0.tar.gz + echo -n 'dsc' > aptarchive/${x}_1.0.dsc + echo -n 'tar' > aptarchive/${x}_1.0.tar.gz done setupaptarchive changetowebserver testsuccess aptget update +cd downloaded + testok() { rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz testequal "Reading package lists... Building dependency tree... -Need to get 0 B of source archives. -Get:1 http://localhost:8080/ $1 1.0 (dsc) -Get:2 http://localhost:8080/ $1 1.0 (tar) +Need to get 6 B of source archives. +Get:1 http://localhost:8080/ $1 1.0 (dsc) [3 B] +Get:2 http://localhost:8080/ $1 1.0 (tar) [3 B] Download complete and in download only mode" aptget source -d "$@" msgtest 'Files were successfully downloaded for' "$1" testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz @@ -154,7 +157,8 @@ Download complete and in download only mode" aptget source -d "$@" } testkeep() { - touch ${1}_1.0.dsc ${1}_1.0.tar.gz + echo -n 'dsc' > ${1}_1.0.dsc + echo -n 'tar' > ${1}_1.0.tar.gz testequal "Reading package lists... Building dependency tree... Skipping already downloaded file '${1}_1.0.dsc' @@ -170,9 +174,9 @@ testmismatch() { rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz testequal "Reading package lists... Building dependency tree... -Need to get 0 B of source archives. -Get:1 http://localhost:8080/ $1 1.0 (dsc) -Get:2 http://localhost:8080/ $1 1.0 (tar) +Need to get 6 B of source archives. +Get:1 http://localhost:8080/ $1 1.0 (dsc) [3 B] +Get:2 http://localhost:8080/ $1 1.0 (tar) [3 B] E: Failed to fetch http://localhost:8080/${1}_1.0.dsc Hash Sum mismatch E: Failed to fetch http://localhost:8080/${1}_1.0.tar.gz Hash Sum mismatch @@ -194,9 +198,9 @@ Download complete and in download only mode" aptget source -d "$@" -o Acquire::F rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz testequal "Reading package lists... Building dependency tree... -Need to get 0 B of source archives. -Get:1 http://localhost:8080/ $1 1.0 (dsc) -Get:2 http://localhost:8080/ $1 1.0 (tar) +Need to get 6 B of source archives. +Get:1 http://localhost:8080/ $1 1.0 (dsc) [3 B] +Get:2 http://localhost:8080/ $1 1.0 (tar) [3 B] Download complete and in download only mode" aptget source --allow-unauthenticated -d "$@" -o Acquire::ForceHash=ROT26 msgtest 'Files were downloaded unauthenticated as user allowed it' "$1" testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz @@ -231,9 +235,9 @@ testfailure --nomsg test -e pkg-no-md5_1.0.dsc -a -e pkg-no-md5_1.0.tar.gz testok pkg-mixed-ok testequal 'Reading package lists... Building dependency tree... -Need to get 0 B of source archives. -Get:1 http://localhost:8080/ pkg-mixed-sha1-bad 1.0 (tar) -Get:2 http://localhost:8080/ pkg-mixed-sha1-bad 1.0 (dsc) +Need to get 6 B of source archives. +Get:1 http://localhost:8080/ pkg-mixed-sha1-bad 1.0 (tar) [3 B] +Get:2 http://localhost:8080/ pkg-mixed-sha1-bad 1.0 (dsc) [3 B] E: Failed to fetch http://localhost:8080/pkg-mixed-sha1-bad_1.0.dsc Hash Sum mismatch E: Failed to fetch some archives.' aptget source -d pkg-mixed-sha1-bad @@ -241,9 +245,9 @@ msgtest 'Only tar file is downloaded as the dsc has hashsum mismatch' 'pkg-mixed testsuccess --nomsg test ! -e pkg-mixed-sha1-bad_1.0.dsc -a -e pkg-mixed-sha1-bad_1.0.tar.gz testequal 'Reading package lists... Building dependency tree... -Need to get 0 B of source archives. -Get:1 http://localhost:8080/ pkg-mixed-sha2-bad 1.0 (tar) -Get:2 http://localhost:8080/ pkg-mixed-sha2-bad 1.0 (dsc) +Need to get 6 B of source archives. +Get:1 http://localhost:8080/ pkg-mixed-sha2-bad 1.0 (tar) [3 B] +Get:2 http://localhost:8080/ pkg-mixed-sha2-bad 1.0 (dsc) [3 B] E: Failed to fetch http://localhost:8080/pkg-mixed-sha2-bad_1.0.tar.gz Hash Sum mismatch E: Failed to fetch some archives.' aptget source -d pkg-mixed-sha2-bad diff --git a/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard b/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard index 2f2d384e1..45f70a898 100755 --- a/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard +++ b/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard @@ -27,6 +27,7 @@ setupaptarchive # discourage keeping obsolete high-priority packages … testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be REMOVED: not-downloadable The following packages will be upgraded: @@ -43,6 +44,7 @@ done testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages have been kept back: upgradable 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.' aptget -s dist-upgrade diff --git a/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall b/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall index a773660d2..ea516fc12 100755 --- a/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall +++ b/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall @@ -21,6 +21,7 @@ if downloadfile http://localhost:8080/holygrail ./knights-talking >/dev/null; th else msgfail fi + testfileequal knights-talking 'ni ni ni' ensure_n_canary_strings_in_dir() { @@ -35,19 +36,20 @@ ensure_n_canary_strings_in_dir() { LISTS='rootdir/var/lib/apt/lists' rm -rf rootdir/var/lib/apt/lists -msgtest 'Got expected NODATA failure in' 'apt-get update' -aptget update -qq 2>&1 | grep -q 'E: GPG error.*NODATA' && msgpass || msgfail +msgtest 'Got expected failure message' 'apt-get update' +aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0 -testequal 'partial' ls $LISTS +testequal 'lock +partial' ls $LISTS # and again with pre-existing files with "valid data" which should remain for f in Release Release.gpg main_binary-amd64_Packages main_source_Sources; do echo 'peng neee-wom' > $LISTS/localhost:8080_dists_stable_${f} done -msgtest 'Got expected NODATA failure in' 'apt-get update' -aptget update -qq 2>&1 | grep -q 'E: GPG error.*NODATA' && msgpass || msgfail +msgtest 'Got expected failure message in' 'apt-get update' +aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail ensure_n_canary_strings_in_dir $LISTS 'peng neee-wom' 4 ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0 @@ -56,7 +58,7 @@ ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0 echo 'peng neee-wom' > $LISTS/localhost:8080_dists_stable_InRelease rm -f $LISTS/localhost:8080_dists_stable_Release $LISTS/localhost:8080_dists_stable_Release.gpg msgtest 'excpected failure of' 'apt-get update' -aptget update -qq 2>&1 | grep -q 'E: GPG error.*NODATA' && msgpass || msgfail +aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail ensure_n_canary_strings_in_dir $LISTS 'peng neee-wom' 3 ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0 diff --git a/test/integration/test-ubuntu-bug-761175-remove-purge b/test/integration/test-ubuntu-bug-761175-remove-purge index 14648e9b8..0b5a91246 100755 --- a/test/integration/test-ubuntu-bug-761175-remove-purge +++ b/test/integration/test-ubuntu-bug-761175-remove-purge @@ -4,33 +4,53 @@ set -e TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework setupenvironment -configarchitecture 'native' - -setupsimplenativepackage 'compiz-core' 'native' '1.0' 'unstable' -BUILDDIR='incoming/compiz-core-1.0' -mkdir -p ${BUILDDIR}/debian/compiz-core/etc -echo 'foo=bar;' > ${BUILDDIR}/compiz.conf -echo 'compiz.conf /etc/compiz.conf' >> ${BUILDDIR}/debian/install -buildpackage "$BUILDDIR" 'unstable' 'main' 'native' -rm -rf "$BUILDDIR" +configarchitecture 'amd64' 'i386' + +buildcompizpkg() { + setupsimplenativepackage "compiz-core-$1" "$2" "$3" "$4" + BUILDDIR="incoming/compiz-core-$1-$3" + mkdir -p ${BUILDDIR}/debian/compiz-core/etc + echo 'foo=bar;' > ${BUILDDIR}/compiz.conf + echo 'compiz.conf /etc/compiz.conf' >> ${BUILDDIR}/debian/install + buildpackage "$BUILDDIR" "$4" 'main' "$2" + rm -rf "$BUILDDIR" +} +buildcompizpkg 'native' 'all' '1.0' 'stable' +buildcompizpkg 'all' 'native' '1.0' 'stable' +buildcompizpkg 'native' 'native' '2.0' 'unstable' +buildcompizpkg 'all' 'all' '2.0' 'unstable' setupaptarchive +runtests() { + testdpkgnotinstalled compiz-core-$1 + testsuccess aptget install compiz-core-$1 -t "${2:-unstable}" + testdpkginstalled compiz-core-$1 -testdpkgnotinstalled compiz-core -testsuccess aptget install compiz-core -testdpkginstalled compiz-core - -testsuccess aptget remove compiz-core -y -testdpkgnotinstalled compiz-core - -msgtest 'Check that conffiles are still around for' 'compiz-core' -dpkg -l compiz-core | grep -q '^rc' && msgpass || msgfail + testsuccess aptget remove compiz-core-$1 -y + testdpkgnotinstalled compiz-core-$1 + testdpkgstatus 'rc' '1' "compiz-core-$1" -testequal 'Reading package lists... + testequal "Reading package lists... Building dependency tree... Reading state information... The following packages will be REMOVED: - compiz-core* + compiz-core-$1* 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. -Purg compiz-core' aptget purge compiz-core -s +Purg compiz-core-$1" aptget purge compiz-core-$1 -s + testsuccess aptget purge compiz-core-$1 -y + testequal "dpkg-query: no packages found matching compiz-core-$1" dpkg -l compiz-core-$1 +} + +msgmsg 'Test in multi arch environment' +runtests 'native' +runtests 'all' +runtests 'native' 'stable' +runtests 'all' 'stable' + +msgmsg 'Test in single arch environment' +configarchitecture 'amd64' +runtests 'native' +runtests 'all' +runtests 'native' 'stable' +runtests 'all' 'stable' diff --git a/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only index 50ca2bf57..09315868b 100755 --- a/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only +++ b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only @@ -28,12 +28,10 @@ MD5Sum: done msgtest 'The unsigned garbage before signed block is' 'ignored' -testsuccess --nomsg aptget update +aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail ROOTDIR="$(readlink -f .)" testequal "Package files: 100 ${ROOTDIR}/rootdir/var/lib/dpkg/status release a=now - 500 file:${ROOTDIR}/aptarchive/ unstable/main i386 Packages - release a=unstable,n=sid,c=main Pinned packages:" aptcache policy diff --git a/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering b/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering index 462acad00..d2b6b9bad 100755 --- a/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering +++ b/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering @@ -14,6 +14,7 @@ setupaptarchive testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: custom 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages b/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages index c1d454f88..409d1212c 100755 --- a/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages +++ b/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages @@ -28,6 +28,7 @@ setupaptarchive testequalor2 'Reading package lists... Building dependency tree... +Calculating upgrade... The following NEW packages will be installed: ure The following packages will be upgraded: @@ -44,6 +45,7 @@ Conf libreoffice-core (4 sid [amd64]) Conf libreoffice-style-galaxy (4 sid [amd64]) Conf libreoffice (4 sid [amd64])' 'Reading package lists... Building dependency tree... +Calculating upgrade... The following NEW packages will be installed: ure The following packages will be upgraded: diff --git a/test/integration/test-xorg-break-providers b/test/integration/test-xorg-break-providers index 139d2c915..0be57d979 100755 --- a/test/integration/test-xorg-break-providers +++ b/test/integration/test-xorg-break-providers @@ -26,6 +26,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget install x testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: xserver-xorg-core xserver-xorg-video-intel 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. @@ -35,6 +36,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget upgrade - testequal 'Reading package lists... Building dependency tree... +Calculating upgrade... The following packages will be upgraded: xserver-xorg-core xserver-xorg-video-intel 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. diff --git a/test/interactive-helper/aptwebserver.cc b/test/interactive-helper/aptwebserver.cc index cd52da692..3403bbdd2 100644 --- a/test/interactive-helper/aptwebserver.cc +++ b/test/interactive-helper/aptwebserver.cc @@ -417,22 +417,87 @@ static bool parseFirstLine(int const client, std::string const &request,/*{{{*/ // Proxies require absolute uris, so this is a simple proxy-fake option std::string const absolute = _config->Find("aptwebserver::request::absolute", "uri,path"); - if (strncmp(host.c_str(), filename.c_str(), host.length()) == 0) + if (strncmp(host.c_str(), filename.c_str(), host.length()) == 0 && APT::String::Startswith(filename, "/_config/") == false) { if (absolute.find("uri") == std::string::npos) { sendError(client, 400, request, sendContent, "Request is absoluteURI, but configured to not accept that", headers); return false; } + // strip the host from the request to make it an absolute path filename.erase(0, host.length()); + + std::string const authConf = _config->Find("aptwebserver::proxy-authorization", ""); + std::string auth = LookupTag(request, "Proxy-Authorization", ""); + if (authConf.empty() != auth.empty()) + { + if (auth.empty()) + sendError(client, 407, request, sendContent, "Proxy requires authentication", headers); + else + sendError(client, 407, request, sendContent, "Client wants to authenticate to proxy, but proxy doesn't need it", headers); + return false; + } + if (authConf.empty() == false) + { + char const * const basic = "Basic "; + if (strncmp(auth.c_str(), basic, strlen(basic)) == 0) + { + auth.erase(0, strlen(basic)); + if (auth != authConf) + { + sendError(client, 407, request, sendContent, "Proxy-Authentication doesn't match", headers); + return false; + } + } + else + { + std::list<std::string> headers; + headers.push_back("Proxy-Authenticate: Basic"); + sendError(client, 407, request, sendContent, "Unsupported Proxy-Authentication Scheme", headers); + return false; + } + } } - else if (absolute.find("path") == std::string::npos) + else if (absolute.find("path") == std::string::npos && APT::String::Startswith(filename, "/_config/") == false) { sendError(client, 400, request, sendContent, "Request is absolutePath, but configured to not accept that", headers); return false; } + if (APT::String::Startswith(filename, "/_config/") == false) + { + std::string const authConf = _config->Find("aptwebserver::authorization", ""); + std::string auth = LookupTag(request, "Authorization", ""); + if (authConf.empty() != auth.empty()) + { + if (auth.empty()) + sendError(client, 401, request, sendContent, "Server requires authentication", headers); + else + sendError(client, 401, request, sendContent, "Client wants to authenticate to server, but server doesn't need it", headers); + return false; + } + if (authConf.empty() == false) + { + char const * const basic = "Basic "; + if (strncmp(auth.c_str(), basic, strlen(basic)) == 0) + { + auth.erase(0, strlen(basic)); + if (auth != authConf) + { + sendError(client, 401, request, sendContent, "Authentication doesn't match", headers); + return false; + } + } + else + { + headers.push_back("WWW-Authenticate: Basic"); + sendError(client, 401, request, sendContent, "Unsupported Authentication Scheme", headers); + return false; + } + } + } + size_t paramspos = filename.find('?'); if (paramspos != std::string::npos) { @@ -489,6 +554,8 @@ static bool handleOnTheFlyReconfiguration(int const client, std::string const &r std::vector<std::string> parts, std::list<std::string> &headers) { size_t const pcount = parts.size(); + for (size_t i = 0; i < pcount; ++i) + parts[i] = DeQuoteString(parts[i]); if (pcount == 4 && parts[1] == "set") { _config->Set(parts[2], parts[3]); @@ -707,6 +774,8 @@ int main(int const argc, const char * argv[]) CommandLine::Args Args[] = { {0, "port", "aptwebserver::port", CommandLine::HasArg}, {0, "request-absolute", "aptwebserver::request::absolute", CommandLine::HasArg}, + {0, "authorization", "aptwebserver::authorization", CommandLine::HasArg}, + {0, "proxy-authorization", "aptwebserver::proxy-authorization", CommandLine::HasArg}, {'c',"config-file",0,CommandLine::ConfigFile}, {'o',"option",0,CommandLine::ArbItem}, {0,0,0,0} @@ -792,7 +861,8 @@ int main(int const argc, const char * argv[]) std::clog << "Serving ANY file on port: " << port << std::endl; - int const slaves = _config->FindB("aptwebserver::slaves", SOMAXCONN); + int const slaves = _config->FindI("aptwebserver::slaves", SOMAXCONN); + std::cerr << "SLAVES: " << slaves << std::endl; listen(sock, slaves); /*}}}*/ diff --git a/test/interactive-helper/makefile b/test/interactive-helper/makefile index 8dc014b98..4633b78ce 100644 --- a/test/interactive-helper/makefile +++ b/test/interactive-helper/makefile @@ -39,7 +39,7 @@ include $(PROGRAM_H) #SOURCE = rpmver.cc #include $(PROGRAM_H) -# Program for testing udevcdrom +# very simple webserver for APT testing PROGRAM=aptwebserver SLIBS = -lapt-pkg -lpthread LIB_MAKES = apt-pkg/makefile diff --git a/test/libapt/cdrom_test.cc b/test/libapt/cdrom_test.cc index 5cf3b353c..7257eaf1b 100644 --- a/test/libapt/cdrom_test.cc +++ b/test/libapt/cdrom_test.cc @@ -109,6 +109,7 @@ TEST(CDROMTest, FindMountPointForDevice) EXPECT_EQ("/boot/efi", FindMountPointForDevice("/dev/sda1")); EXPECT_EQ("/tmp", FindMountPointForDevice("tmpfs")); - unlink(tempfile); + if (tempfile != NULL) + unlink(tempfile); free(tempfile); } diff --git a/test/libapt/fileutl_test.cc b/test/libapt/fileutl_test.cc index 643c02297..a2c303768 100644 --- a/test/libapt/fileutl_test.cc +++ b/test/libapt/fileutl_test.cc @@ -53,11 +53,16 @@ static void TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission // ensure the memory is as predictably messed up #define APT_INIT_READBACK \ char readback[20]; \ - memset(readback, 'D', sizeof(readback)/sizeof(readback[0])); \ + memset(readback, 'D', sizeof(readback)*sizeof(readback[0])); \ readback[19] = '\0'; #define EXPECT_N_STR(expect, actual) \ EXPECT_EQ(0, strncmp(expect, actual, strlen(expect))); - + { + APT_INIT_READBACK + char const * const expect = "DDDDDDDDDDDDDDDDDDD"; + EXPECT_STREQ(expect,readback); + EXPECT_N_STR(expect, readback); + } { APT_INIT_READBACK char const * const expect = "This"; @@ -217,10 +222,79 @@ TEST(FileUtlTest, GetTempDir) setenv("TMPDIR", "/not-there-no-really-not", 1); EXPECT_EQ("/tmp", GetTempDir()); + // here but not accessible for non-roots setenv("TMPDIR", "/usr", 1); - EXPECT_EQ("/usr", GetTempDir()); + EXPECT_EQ("/tmp", GetTempDir()); + + // files are no good for tmpdirs, too + setenv("TMPDIR", "/dev/null", 1); + EXPECT_EQ("/tmp", GetTempDir()); + + setenv("TMPDIR", "/var/tmp", 1); + EXPECT_EQ("/var/tmp", GetTempDir()); unsetenv("TMPDIR"); if (old_tmpdir.empty() == false) setenv("TMPDIR", old_tmpdir.c_str(), 1); } +TEST(FileUtlTest, Popen) +{ + FileFd Fd; + pid_t Child; + char buf[1024]; + std::string s; + unsigned long long n = 0; + std::vector<std::string> OpenFds; + + // count Fds to ensure we don't have a resource leak + if(FileExists("/proc/self/fd")) + OpenFds = Glob("/proc/self/fd/*"); + + // output something + const char* Args[10] = {"/bin/echo", "meepmeep", NULL}; + EXPECT_TRUE(Popen(Args, Fd, Child, FileFd::ReadOnly)); + EXPECT_TRUE(Fd.Read(buf, sizeof(buf)-1, &n)); + buf[n] = 0; + EXPECT_NE(n, 0); + EXPECT_STREQ(buf, "meepmeep\n"); + + // wait for the child to exit and cleanup + EXPECT_TRUE(ExecWait(Child, "PopenRead")); + EXPECT_TRUE(Fd.Close()); + + // ensure that after a close all is good again + if(FileExists("/proc/self/fd")) + EXPECT_EQ(Glob("/proc/self/fd/*").size(), OpenFds.size()); + + // ReadWrite is not supported + _error->PushToStack(); + EXPECT_FALSE(Popen(Args, Fd, Child, FileFd::ReadWrite)); + EXPECT_FALSE(Fd.IsOpen()); + EXPECT_FALSE(Fd.Failed()); + EXPECT_TRUE(_error->PendingError()); + _error->RevertToStack(); + + // write something + Args[0] = "/bin/bash"; + Args[1] = "-c"; + Args[2] = "read"; + Args[3] = NULL; + EXPECT_TRUE(Popen(Args, Fd, Child, FileFd::WriteOnly)); + s = "\n"; + EXPECT_TRUE(Fd.Write(s.c_str(), s.length())); + EXPECT_TRUE(Fd.Close()); + EXPECT_FALSE(Fd.IsOpen()); + EXPECT_FALSE(Fd.Failed()); + EXPECT_TRUE(ExecWait(Child, "PopenWrite")); +} +TEST(FileUtlTest, flAbsPath) +{ + std::string cwd = SafeGetCWD(); + int res = chdir("/bin/"); + EXPECT_EQ(res, 0); + std::string p = flAbsPath("ls"); + EXPECT_EQ(p, "/bin/ls"); + + res = chdir(cwd.c_str()); + EXPECT_EQ(res, 0); +} diff --git a/test/libapt/hashsums_test.cc b/test/libapt/hashsums_test.cc index ac7d41582..a19a0befd 100644 --- a/test/libapt/hashsums_test.cc +++ b/test/libapt/hashsums_test.cc @@ -1,5 +1,6 @@ #include <config.h> +#include <apt-pkg/configuration.h> #include <apt-pkg/md5.h> #include <apt-pkg/sha1.h> #include <apt-pkg/sha2.h> @@ -162,24 +163,34 @@ TEST(HashSumsTest, FileBased) FileFd fd(__FILE__, FileFd::ReadOnly); EXPECT_TRUE(fd.IsOpen()); + std::string FileSize; + strprintf(FileSize, "%llu", fd.FileSize()); { Hashes hashes; hashes.AddFD(fd.Fd()); - EXPECT_EQ(md5.Value(), hashes.MD5.Result().Value()); - EXPECT_EQ(sha1.Value(), hashes.SHA1.Result().Value()); - EXPECT_EQ(sha256.Value(), hashes.SHA256.Result().Value()); - EXPECT_EQ(sha512.Value(), hashes.SHA512.Result().Value()); + HashStringList list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(5, list.size()); + EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue()); + EXPECT_EQ(sha1.Value(), list.find("SHA1")->HashValue()); + EXPECT_EQ(sha256.Value(), list.find("SHA256")->HashValue()); + EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue()); + EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue()); } - unsigned long sz = fd.FileSize(); + unsigned long long sz = fd.FileSize(); fd.Seek(0); { Hashes hashes; hashes.AddFD(fd.Fd(), sz); - EXPECT_EQ(md5.Value(), hashes.MD5.Result().Value()); - EXPECT_EQ(sha1.Value(), hashes.SHA1.Result().Value()); - EXPECT_EQ(sha256.Value(), hashes.SHA256.Result().Value()); - EXPECT_EQ(sha512.Value(), hashes.SHA512.Result().Value()); + HashStringList list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(5, list.size()); + EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue()); + EXPECT_EQ(sha1.Value(), list.find("SHA1")->HashValue()); + EXPECT_EQ(sha256.Value(), list.find("SHA256")->HashValue()); + EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue()); + EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue()); } fd.Seek(0); { @@ -260,3 +271,74 @@ TEST(HashSumsTest, FileBased) EXPECT_FALSE(similar == hashes); EXPECT_TRUE(similar != hashes); } +TEST(HashSumsTest, HashStringList) +{ + _config->Clear("Acquire::ForceHash"); + + HashStringList list; + EXPECT_TRUE(list.empty()); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(0, list.size()); + EXPECT_EQ(NULL, list.find(NULL)); + EXPECT_EQ(NULL, list.find("")); + EXPECT_EQ(NULL, list.find("MD5Sum")); + + // empty lists aren't equal + HashStringList list2; + EXPECT_FALSE(list == list2); + EXPECT_TRUE(list != list2); + + // some hashes don't really contribute to usability + list.push_back(HashString("Checksum-FileSize", "29")); + EXPECT_FALSE(list.empty()); + EXPECT_FALSE(list.usable()); + + Hashes hashes; + hashes.Add("The quick brown fox jumps over the lazy dog"); + list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_TRUE(list.usable()); + EXPECT_EQ(5, list.size()); + EXPECT_TRUE(NULL != list.find(NULL)); + EXPECT_TRUE(NULL != list.find("")); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("Checksum-FileSize")); + EXPECT_TRUE(NULL == list.find("ROT26")); + + _config->Set("Acquire::ForceHash", "MD5Sum"); + EXPECT_FALSE(list.empty()); + EXPECT_TRUE(list.usable()); + EXPECT_EQ(5, list.size()); + EXPECT_TRUE(NULL != list.find(NULL)); + EXPECT_TRUE(NULL != list.find("")); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("Checksum-FileSize")); + EXPECT_TRUE(NULL == list.find("ROT26")); + + _config->Set("Acquire::ForceHash", "ROT26"); + EXPECT_FALSE(list.empty()); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(5, list.size()); + EXPECT_TRUE(NULL == list.find(NULL)); + EXPECT_TRUE(NULL == list.find("")); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("Checksum-FileSize")); + EXPECT_TRUE(NULL == list.find("ROT26")); + + _config->Clear("Acquire::ForceHash"); + + list2.push_back(*list.find("MD5Sum")); + EXPECT_TRUE(list == list2); + EXPECT_FALSE(list != list2); + + // introduce a mismatch to the list + list2.push_back(HashString("SHA1", "cacecbd74968bc90ea3342767e6b94f46ddbcafc")); + EXPECT_FALSE(list == list2); + EXPECT_TRUE(list != list2); + + _config->Set("Acquire::ForceHash", "MD5Sum"); + EXPECT_TRUE(list == list2); + EXPECT_FALSE(list != list2); + + _config->Clear("Acquire::ForceHash"); +} diff --git a/test/libapt/sourcelist_test.cc b/test/libapt/sourcelist_test.cc index eb2d76c43..747ab4957 100644 --- a/test/libapt/sourcelist_test.cc +++ b/test/libapt/sourcelist_test.cc @@ -20,7 +20,7 @@ class SourceList : public pkgSourceList { TEST(SourceListTest,ParseFileDeb822) { FileFd fd; - char * tempfile; + char * tempfile = NULL; createTemporaryFile("parsefiledeb822", fd, &tempfile, "Types: deb\n" "URIs: http://ftp.debian.org/debian\n" diff --git a/test/libapt/strutil_test.cc b/test/libapt/strutil_test.cc index 194c9c074..9bc3c76fd 100644 --- a/test/libapt/strutil_test.cc +++ b/test/libapt/strutil_test.cc @@ -1,10 +1,13 @@ #include <config.h> #include <apt-pkg/strutl.h> +#include <apt-pkg/fileutl.h> #include <string> #include <vector> #include <gtest/gtest.h> +#include "file-helpers.h" + TEST(StrUtilTest,DeEscapeString) { // nothing special @@ -85,6 +88,15 @@ TEST(StrUtilTest,EndsWith) EXPECT_FALSE(Endswith("abcd", "x")); EXPECT_FALSE(Endswith("abcd", "abcndefg")); } +TEST(StrUtilTest,StartsWith) +{ + using APT::String::Startswith; + EXPECT_TRUE(Startswith("abcd", "a")); + EXPECT_TRUE(Startswith("abcd", "ab")); + EXPECT_TRUE(Startswith("abcd", "abcd")); + EXPECT_FALSE(Startswith("abcd", "x")); + EXPECT_FALSE(Startswith("abcd", "abcndefg")); +} TEST(StrUtilTest,SubstVar) { EXPECT_EQ("", SubstVar("", "fails", "passes")); @@ -120,3 +132,84 @@ TEST(StrUtilTest,SubstVar) EXPECT_EQ(" bb a bb a bb a bb ", SubstVar(" aaa a aaa a aaa a aaa ", "aaa", "bb")); } +TEST(StrUtilTest,Base64Encode) +{ + EXPECT_EQ("QWxhZGRpbjpvcGVuIHNlc2FtZQ==", Base64Encode("Aladdin:open sesame")); + EXPECT_EQ("cGxlYXN1cmUu", Base64Encode("pleasure.")); + EXPECT_EQ("bGVhc3VyZS4=", Base64Encode("leasure.")); + EXPECT_EQ("ZWFzdXJlLg==", Base64Encode("easure.")); + EXPECT_EQ("YXN1cmUu", Base64Encode("asure.")); + EXPECT_EQ("c3VyZS4=", Base64Encode("sure.")); + EXPECT_EQ("dXJlLg==", Base64Encode("ure.")); + EXPECT_EQ("cmUu", Base64Encode("re.")); + EXPECT_EQ("ZS4=", Base64Encode("e.")); + EXPECT_EQ("Lg==", Base64Encode(".")); + EXPECT_EQ("", Base64Encode("")); +} +void ReadMessagesTestWithNewLine(char const * const nl, char const * const ab) +{ + SCOPED_TRACE(SubstVar(SubstVar(nl, "\n", "n"), "\r", "r") + " # " + ab); + FileFd fd; + std::string pkgA = "Package: pkgA\n" + "Version: 1\n" + "Size: 100\n" + "Description: aaa\n" + " aaa"; + std::string pkgB = "Package: pkgB\n" + "Version: 1\n" + "Flag: no\n" + "Description: bbb"; + std::string pkgC = "Package: pkgC\n" + "Version: 2\n" + "Flag: yes\n" + "Description:\n" + " ccc"; + + createTemporaryFile("readmessage", fd, NULL, (pkgA + nl + pkgB + nl + pkgC + nl).c_str()); + std::vector<std::string> list; + EXPECT_TRUE(ReadMessages(fd.Fd(), list)); + EXPECT_EQ(3, list.size()); + EXPECT_EQ(pkgA, list[0]); + EXPECT_EQ(pkgB, list[1]); + EXPECT_EQ(pkgC, list[2]); + + size_t const msgsize = 63990; + createTemporaryFile("readmessage", fd, NULL, NULL); + for (size_t j = 0; j < msgsize; ++j) + fd.Write(ab, strlen(ab)); + for (size_t i = 0; i < 21; ++i) + { + std::string msg; + strprintf(msg, "msgsize=%zu i=%zu", msgsize, i); + SCOPED_TRACE(msg); + fd.Seek((msgsize + (i - 1)) * strlen(ab)); + fd.Write(ab, strlen(ab)); + fd.Write(nl, strlen(nl)); + fd.Seek(0); + list.clear(); + EXPECT_TRUE(ReadMessages(fd.Fd(), list)); + EXPECT_EQ(1, list.size()); + EXPECT_EQ((msgsize + i) * strlen(ab), list[0].length()); + EXPECT_EQ(std::string::npos, list[0].find_first_not_of(ab)); + } + + list.clear(); + fd.Write(pkgA.c_str(), pkgA.length()); + fd.Write(nl, strlen(nl)); + fd.Seek(0); + EXPECT_TRUE(ReadMessages(fd.Fd(), list)); + EXPECT_EQ(2, list.size()); + EXPECT_EQ((msgsize + 20) * strlen(ab), list[0].length()); + EXPECT_EQ(std::string::npos, list[0].find_first_not_of(ab)); + EXPECT_EQ(pkgA, list[1]); + + + fd.Close(); +} +TEST(StrUtilTest,ReadMessages) +{ + ReadMessagesTestWithNewLine("\n\n", "a"); + ReadMessagesTestWithNewLine("\r\n\r\n", "a"); + ReadMessagesTestWithNewLine("\n\n", "ab"); + ReadMessagesTestWithNewLine("\r\n\r\n", "ab"); +} diff --git a/test/libapt/tagfile_test.cc b/test/libapt/tagfile_test.cc index 1bac75b55..df618ea16 100644 --- a/test/libapt/tagfile_test.cc +++ b/test/libapt/tagfile_test.cc @@ -7,6 +7,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <sstream> #include <gtest/gtest.h> @@ -34,3 +35,181 @@ TEST(TagFileTest,SingleField) // There is only one section in this tag file EXPECT_FALSE(tfile.Step(section)); } + +TEST(TagFileTest,MultipleSections) +{ + FileFd fd; + createTemporaryFile("bigsection", fd, NULL, "Package: pkgA\n" + "Version: 1\n" + "Size: 100\n" + "Description: aaa\n" + " aaa\n" + "\n" + "Package: pkgB\n" + "Version: 1\n" + "Flag: no\n" + "Description: bbb\n" + "\n" + "Package: pkgC\n" + "Version: 2\n" + "Flag: yes\n" + "Description:\n" + " ccc\n" + ); + + pkgTagFile tfile(&fd); + pkgTagSection section; + EXPECT_FALSE(section.Exists("Version")); + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_EQ(4, section.Count()); + EXPECT_TRUE(section.Exists("Version")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("Size")); + EXPECT_FALSE(section.Exists("Flag")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("pkgA", section.FindS("Package")); + EXPECT_EQ("1", section.FindS("Version")); + EXPECT_EQ(1, section.FindULL("Version")); + EXPECT_EQ(100, section.FindULL("Size")); + unsigned long Flags = 1; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(1, Flags); + Flags = 0; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(0, Flags); + EXPECT_EQ("aaa\n aaa", section.FindS("Description")); + + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_EQ(4, section.Count()); + EXPECT_TRUE(section.Exists("Version")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("Size")); + EXPECT_TRUE(section.Exists("Flag")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("pkgB", section.FindS("Package")); + EXPECT_EQ("1", section.FindS("Version")); + EXPECT_EQ(1, section.FindULL("Version")); + EXPECT_EQ(0, section.FindULL("Size")); + Flags = 1; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(0, Flags); + Flags = 0; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(0, Flags); + EXPECT_EQ("bbb", section.FindS("Description")); + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_EQ(4, section.Count()); + EXPECT_TRUE(section.Exists("Version")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("Size")); + EXPECT_TRUE(section.Exists("Flag")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("pkgC", section.FindS("Package")); + EXPECT_EQ("2", section.FindS("Version")); + EXPECT_EQ(2, section.FindULL("Version")); + Flags = 0; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(1, Flags); + Flags = 1; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(1, Flags); + EXPECT_EQ("ccc", section.FindS("Description")); + + // There is no section left in this tag file + EXPECT_FALSE(tfile.Step(section)); +} + +TEST(TagFileTest,BigSection) +{ + size_t const count = 500; + std::stringstream content; + for (size_t i = 0; i < count; ++i) + content << "Field-" << i << ": " << (2000 + i) << std::endl; + + FileFd fd; + createTemporaryFile("bigsection", fd, NULL, content.str().c_str()); + + pkgTagFile tfile(&fd); + pkgTagSection section; + EXPECT_TRUE(tfile.Step(section)); + + EXPECT_EQ(count, section.Count()); + for (size_t i = 0; i < count; ++i) + { + std::stringstream name; + name << "Field-" << i; + EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist"; + EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str())); + } + + // There is only one section in this tag file + EXPECT_FALSE(tfile.Step(section)); +} + +TEST(TagFileTest, PickedUpFromPreviousCall) +{ + size_t const count = 500; + std::stringstream contentstream; + for (size_t i = 0; i < count; ++i) + contentstream << "Field-" << i << ": " << (2000 + i) << std::endl; + contentstream << std::endl << std::endl; + std::string content = contentstream.str(); + + pkgTagSection section; + EXPECT_FALSE(section.Scan(content.c_str(), content.size()/2)); + EXPECT_NE(0, section.Count()); + EXPECT_NE(count, section.Count()); + EXPECT_TRUE(section.Scan(content.c_str(), content.size(), false)); + EXPECT_EQ(count, section.Count()); + + for (size_t i = 0; i < count; ++i) + { + std::stringstream name; + name << "Field-" << i; + EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist"; + EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str())); + } +} + +TEST(TagFileTest, SpacesEverywhere) +{ + std::string content = + "Package: pkgA\n" + "Package: pkgB\n" + "NoSpaces:yes\n" + "TagSpaces\t :yes\n" + "ValueSpaces: \tyes\n" + "BothSpaces \t:\t yes\n" + "TrailingSpaces: yes\t \n" + "Naming Space: yes\n" + "Naming Spaces: yes\n" + "Package : pkgC \n" + "Multi-Colon::yes:\n" + "\n\n"; + + pkgTagSection section; + EXPECT_TRUE(section.Scan(content.c_str(), content.size())); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("NoSpaces")); + EXPECT_TRUE(section.Exists("TagSpaces")); + EXPECT_TRUE(section.Exists("ValueSpaces")); + EXPECT_TRUE(section.Exists("BothSpaces")); + EXPECT_TRUE(section.Exists("TrailingSpaces")); + EXPECT_TRUE(section.Exists("Naming Space")); + EXPECT_TRUE(section.Exists("Naming Spaces")); + EXPECT_TRUE(section.Exists("Multi-Colon")); + EXPECT_EQ("pkgC", section.FindS("Package")); + EXPECT_EQ("yes", section.FindS("NoSpaces")); + EXPECT_EQ("yes", section.FindS("TagSpaces")); + EXPECT_EQ("yes", section.FindS("ValueSpaces")); + EXPECT_EQ("yes", section.FindS("BothSpaces")); + EXPECT_EQ("yes", section.FindS("TrailingSpaces")); + EXPECT_EQ("yes", section.FindS("Naming Space")); + EXPECT_EQ("yes", section.FindS("Naming Spaces")); + EXPECT_EQ(":yes:", section.FindS("Multi-Colon")); + // overridden values are still present, but not really accessible + EXPECT_EQ(11, section.Count()); +} |