X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/1a3a14ac63b0c4f18de53a7bddcf79d20a5e814f..422a2eba84361a8dfd84b549c13037512779c572:/apt-pkg/indexfile.cc diff --git a/apt-pkg/indexfile.cc b/apt-pkg/indexfile.cc index b81893260..934943205 100644 --- a/apt-pkg/indexfile.cc +++ b/apt-pkg/indexfile.cc @@ -19,10 +19,12 @@ #include #include #include +#include #include +#include #include -#include +#include #include @@ -65,8 +67,11 @@ pkgIndexFile::pkgIndexFile(bool const Trusted) : /*{{{*/ } /*}}}*/ // IndexFile::ArchiveInfo - Stub /*{{{*/ -std::string pkgIndexFile::ArchiveInfo(pkgCache::VerIterator const &/*Ver*/) const +std::string pkgIndexFile::ArchiveInfo(pkgCache::VerIterator const &Ver) const { + debDebPkgFileIndex const * const debfile = dynamic_cast(this); + if (debfile != nullptr) + return debfile->ArchiveInfo_impl(Ver); return std::string(); } /*}}}*/ @@ -84,19 +89,12 @@ std::string pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const &/*Record*/, } /*}}}*/ // IndexFile::TranslationsAvailable - Check if will use Translation /*{{{*/ -// --------------------------------------------------------------------- -/* */ bool pkgIndexFile::TranslationsAvailable() { return (APT::Configuration::getLanguages().empty() != true); } /*}}}*/ // IndexFile::CheckLanguageCode - Check the Language Code /*{{{*/ -// --------------------------------------------------------------------- -/* No intern need for this method anymore as the check for correctness - is already done in getLanguages(). Note also that this check is - rather bad (doesn't take three character like ast into account). - TODO: Remove method with next API break */ -APT_DEPRECATED bool pkgIndexFile::CheckLanguageCode(const char * const Lang) +bool pkgIndexFile::CheckLanguageCode(const char * const Lang) { if (strlen(Lang) == 2 || (strlen(Lang) == 5 && Lang[2] == '_')) return true; @@ -108,14 +106,12 @@ APT_DEPRECATED bool pkgIndexFile::CheckLanguageCode(const char * const Lang) } /*}}}*/ // IndexFile::LanguageCode - Return the Language Code /*{{{*/ -// --------------------------------------------------------------------- -/* As we have now possibly more than one LanguageCode this method is - supersided by a) private classmembers or b) getLanguages(). - TODO: Remove method with next API break */ -APT_DEPRECATED std::string pkgIndexFile::LanguageCode() { +std::string pkgIndexFile::LanguageCode() { +APT_IGNORE_DEPRECATED_PUSH if (TranslationsAvailable() == false) return ""; return APT::Configuration::getLanguages()[0]; +APT_IGNORE_DEPRECATED_POP } /*}}}*/ @@ -141,14 +137,30 @@ std::string IndexTarget::Option(OptionKeys const EnumKey) const /*{{{*/ APT_CASE(ARCHITECTURE); APT_CASE(BASE_URI); APT_CASE(REPO_URI); + APT_CASE(IDENTIFIER); APT_CASE(TARGET_OF); APT_CASE(CREATED_BY); + APT_CASE(FALLBACK_OF); APT_CASE(PDIFFS); + APT_CASE(DEFAULTENABLED); + APT_CASE(COMPRESSIONTYPES); + APT_CASE(SOURCESENTRY); + APT_CASE(BY_HASH); + APT_CASE(KEEPCOMPRESSEDAS); + APT_CASE(ALLOW_INSECURE); + APT_CASE(ALLOW_WEAK); + APT_CASE(ALLOW_DOWNGRADE_TO_INSECURE); #undef APT_CASE - case FILENAME: return _config->FindDir("Dir::State::lists") + URItoFileName(URI); + case FILENAME: + { + auto const M = Options.find("FILENAME"); + if (M == Options.end()) + return _config->FindDir("Dir::State::lists") + URItoFileName(URI); + return M->second; + } case EXISTING_FILENAME: std::string const filename = Option(FILENAME); - std::vector const types = APT::Configuration::getCompressionTypes(); + std::vector const types = VectorizeString(Option(COMPRESSIONTYPES), ' '); for (std::vector::const_iterator t = types.begin(); t != types.end(); ++t) { if (t->empty()) @@ -167,7 +179,7 @@ std::string IndexTarget::Option(OptionKeys const EnumKey) const /*{{{*/ /*}}}*/ bool IndexTarget::OptionBool(OptionKeys const EnumKey) const /*{{{*/ { - return StringToBool(Option(EnumKey)); + return StringToBool(Option(EnumKey), false); } /*}}}*/ std::string IndexTarget::Format(std::string format) const /*{{{*/ @@ -208,7 +220,7 @@ std::string pkgDebianIndexTargetFile::IndexFileName() const /*{{{*/ if (FileExists(s)) return s; - std::vector types = APT::Configuration::getCompressionTypes(); + std::vector const types = VectorizeString(Target.Option(IndexTarget::COMPRESSIONTYPES), ' '); for (std::vector::const_iterator t = types.begin(); t != types.end(); ++t) { std::string p = s + '.' + *t; @@ -263,9 +275,15 @@ std::string pkgDebianIndexTargetFile::GetProgressDescription() const return Target.Description; } -pkgDebianIndexRealFile::pkgDebianIndexRealFile(std::string const &File, bool const Trusted) :/*{{{*/ - pkgDebianIndexFile(Trusted), d(NULL), File(flAbsPath(File)) +pkgDebianIndexRealFile::pkgDebianIndexRealFile(std::string const &pFile, bool const Trusted) :/*{{{*/ + pkgDebianIndexFile(Trusted), d(NULL) { + if (pFile.empty()) + ; + else if (pFile == "/nonexistent/stdin") + File = pFile; + else + File = flAbsPath(pFile); } /*}}}*/ // IndexRealFile::Size - Return the size of the index /*{{{*/ @@ -303,7 +321,7 @@ std::string pkgDebianIndexRealFile::GetProgressDescription() const } bool pkgDebianIndexRealFile::OpenListFile(FileFd &Pkg, std::string const &FileName)/*{{{*/ { - if (Pkg.Open(FileName, FileFd::ReadOnly, FileFd::None) == false) + if (Pkg.Open(FileName, FileFd::ReadOnly, FileFd::Extension) == false) return _error->Error("Problem opening %s",FileName.c_str()); return true; } @@ -318,12 +336,18 @@ pkgDebianIndexFile::~pkgDebianIndexFile() pkgCacheListParser * pkgDebianIndexFile::CreateListParser(FileFd &Pkg) { if (Pkg.IsOpen() == false) - return NULL; + return nullptr; _error->PushToStack(); pkgCacheListParser * const Parser = new debListParser(&Pkg); bool const newError = _error->PendingError(); _error->MergeWithStack(); - return newError ? NULL : Parser; + if (newError) + { + delete Parser; + return nullptr; + } + else + return Parser; } bool pkgDebianIndexFile::Merge(pkgCacheGenerator &Gen,OpProgress * const Prog) { @@ -334,6 +358,7 @@ bool pkgDebianIndexFile::Merge(pkgCacheGenerator &Gen,OpProgress * const Prog) _error->PushToStack(); std::unique_ptr Parser(CreateListParser(Pkg)); bool const newError = _error->PendingError(); + _error->MergeWithStack(); if (newError == false && Parser == nullptr) return true; if (Parser == NULL)