diff options
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/cachefile.cc | 55 | ||||
-rw-r--r-- | apt-pkg/cachefile.h | 3 | ||||
-rw-r--r-- | apt-pkg/deb/debindexfile.cc | 33 | ||||
-rw-r--r-- | apt-pkg/deb/debindexfile.h | 19 | ||||
-rw-r--r-- | apt-pkg/indexfile.cc | 4 | ||||
-rw-r--r-- | apt-pkg/pkgcachegen.cc | 2 |
6 files changed, 114 insertions, 2 deletions
diff --git a/apt-pkg/cachefile.cc b/apt-pkg/cachefile.cc index 92a3b201b..3e3540bbd 100644 --- a/apt-pkg/cachefile.cc +++ b/apt-pkg/cachefile.cc @@ -26,6 +26,7 @@ #include <apt-pkg/depcache.h> #include <apt-pkg/mmap.h> #include <apt-pkg/pkgcache.h> +#include <apt-pkg/indexfile.h> #include <string.h> #include <unistd.h> @@ -186,6 +187,60 @@ bool pkgCacheFile::Open(OpProgress *Progress, bool WithLock) return true; } /*}}}*/ +bool pkgCacheFile::AddIndexFile(pkgIndexFile * const File) /*{{{*/ +{ + if (SrcList == NULL) + if (BuildSourceList() == false) + return false; + SrcList->AddVolatileFile(File); + + if (Cache == nullptr || File->HasPackages() == false || File->Exists() == false) + return true; + + if (File->FindInCache(*Cache).end() == false) + return _error->Warning("Duplicate sources.list entry %s", + File->Describe().c_str()); + + if (ExternOwner == false) + { + delete DCache; + delete Cache; + } + delete Policy; + DCache = NULL; + Policy = NULL; + Cache = NULL; + + if (ExternOwner == false) + { + // a dynamic mmap means that we have build at least parts of the cache + // in memory – which we might or might not have written to disk. + // Throwing away would therefore be a very costly operation we want to avoid + DynamicMMap * dynmmap = dynamic_cast<DynamicMMap*>(Map); + if (dynmmap != nullptr) + { + { + pkgCacheGenerator Gen(dynmmap, nullptr); + if (File->Merge(Gen, nullptr) == false) + return false; + } + Cache = new pkgCache(Map); + return _error->PendingError() == false; + } + else + { + delete Map; + Map = NULL; + } + } + else + { + ExternOwner = false; + Map = NULL; + } + return true; +} + /*}}}*/ // CacheFile::RemoveCaches - remove all cache files from disk /*{{{*/ // --------------------------------------------------------------------- /* */ diff --git a/apt-pkg/cachefile.h b/apt-pkg/cachefile.h index df724ff45..e23f37675 100644 --- a/apt-pkg/cachefile.h +++ b/apt-pkg/cachefile.h @@ -32,6 +32,7 @@ class MMap; class pkgPolicy; class pkgSourceList; +class pkgIndexFile; class OpProgress; class pkgCacheFile @@ -74,6 +75,8 @@ class pkgCacheFile static void RemoveCaches(); void Close(); + bool AddIndexFile(pkgIndexFile * const File); + inline pkgCache* GetPkgCache() { BuildCaches(NULL, false); return Cache; }; inline pkgDepCache* GetDepCache() { BuildDepCache(); return DCache; }; inline pkgPolicy* GetPolicy() { BuildPolicy(); return Policy; }; diff --git a/apt-pkg/deb/debindexfile.cc b/apt-pkg/deb/debindexfile.cc index c11efd0ae..84dabc06b 100644 --- a/apt-pkg/deb/debindexfile.cc +++ b/apt-pkg/deb/debindexfile.cc @@ -297,6 +297,39 @@ std::string debDebianSourceDirIndex::GetComponent() const return "local-control"; } /*}}}*/ +// String Package Index - a string of Packages file content /*{{{*/ +std::string debStringPackageIndex::GetArchitecture() const +{ + return std::string(); +} +std::string debStringPackageIndex::GetComponent() const +{ + return "apt-tmp-index"; +} +uint8_t debStringPackageIndex::GetIndexFlags() const +{ + return pkgCache::Flag::NotSource; +} +const pkgIndexFile::Type *debStringPackageIndex::GetType() const +{ + return pkgIndexFile::Type::GetType("Debian Package Index"); +} +debStringPackageIndex::debStringPackageIndex(std::string const &content) : + pkgDebianIndexRealFile("", false), d(NULL) +{ + char fn[1024]; + std::string const tempdir = GetTempDir(); + snprintf(fn, sizeof(fn), "%s/%s.XXXXXX", tempdir.c_str(), "apt-tmp-index"); + int const fd = mkstemp(fn); + File = fn; + FileFd::Write(fd, content.data(), content.length()); + close(fd); +} +debStringPackageIndex::~debStringPackageIndex() +{ + RemoveFile("~debStringPackageIndex", File); +} + /*}}}*/ // Index File types for Debian /*{{{*/ class APT_HIDDEN debIFTypeSrc : public pkgIndexFile::Type diff --git a/apt-pkg/deb/debindexfile.h b/apt-pkg/deb/debindexfile.h index 890141dff..3652f631c 100644 --- a/apt-pkg/deb/debindexfile.h +++ b/apt-pkg/deb/debindexfile.h @@ -176,4 +176,23 @@ public: virtual const Type *GetType() const APT_OVERRIDE APT_CONST; }; +class debStringPackageIndex : public pkgDebianIndexRealFile +{ + void * const d; +protected: + virtual std::string GetArchitecture() const APT_OVERRIDE; + virtual std::string GetComponent() const APT_OVERRIDE; + virtual uint8_t GetIndexFlags() const APT_OVERRIDE; + +public: + virtual const Type *GetType() const APT_OVERRIDE APT_CONST; + + // Interface for the Cache Generator + virtual bool HasPackages() const APT_OVERRIDE {return true;}; + // Abort if the file does not exist. + virtual bool Exists() const APT_OVERRIDE {return true;}; + + debStringPackageIndex(std::string const &content); + virtual ~debStringPackageIndex(); +}; #endif diff --git a/apt-pkg/indexfile.cc b/apt-pkg/indexfile.cc index dfd482c04..657cdfb36 100644 --- a/apt-pkg/indexfile.cc +++ b/apt-pkg/indexfile.cc @@ -267,7 +267,9 @@ std::string pkgDebianIndexTargetFile::GetProgressDescription() const pkgDebianIndexRealFile::pkgDebianIndexRealFile(std::string const &pFile, bool const Trusted) :/*{{{*/ pkgDebianIndexFile(Trusted), d(NULL) { - if (pFile == "/nonexistent/stdin") + if (pFile.empty()) + ; + else if (pFile == "/nonexistent/stdin") File = pFile; else File = flAbsPath(pFile); diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 0dbac3df8..120b0c414 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -1735,7 +1735,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress } if (Debug == true) - std::clog << "Caches done. Now bring in the volatile files (if any)" << std::endl; + std::clog << "Caches done. " << (volatile_fine ? "No volatile files, so we are done here." : "Now bring in the volatile files") << std::endl; if (volatile_fine == false) { |