summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/cachefile.cc55
-rw-r--r--apt-pkg/cachefile.h3
-rw-r--r--apt-pkg/deb/debindexfile.cc33
-rw-r--r--apt-pkg/deb/debindexfile.h19
-rw-r--r--apt-pkg/indexfile.cc4
-rw-r--r--apt-pkg/pkgcachegen.cc2
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)
{