|
|
@@ -105,6 +105,9 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM
|
|
|
if (oldMap == newMap)
|
|
|
return;
|
|
|
|
|
|
+ if (_config->FindB("Debug::pkgCacheGen", false))
|
|
|
+ std::clog << "Remaping from " << oldMap << " to " << newMap << std::endl;
|
|
|
+
|
|
|
Cache.ReMap(false);
|
|
|
|
|
|
CurrentFile += (pkgCache::PackageFile*) newMap - (pkgCache::PackageFile*) oldMap;
|
|
|
@@ -633,7 +636,9 @@ bool pkgCacheGenerator::FinishCache(OpProgress *Progress)
|
|
|
Dynamic<pkgCache::VerIterator> DynV(V);
|
|
|
for (; V.end() != true; V++)
|
|
|
{
|
|
|
- char const * const Arch = P.Arch();
|
|
|
+ // 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;
|
|
|
/* MultiArch handling introduces a lot of implicit Dependencies:
|
|
|
- MultiArch: same → Co-Installable if they have the same version
|
|
|
@@ -684,7 +689,7 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
|
|
|
string const &Version,
|
|
|
unsigned int const &Op,
|
|
|
unsigned int const &Type,
|
|
|
- map_ptrloc *OldDepLast)
|
|
|
+ map_ptrloc* &OldDepLast)
|
|
|
{
|
|
|
void const * const oldMap = Map.Data();
|
|
|
// Get a structure
|
|
|
@@ -915,8 +920,11 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S,
|
|
|
/* This just verifies that each file in the list of index files exists,
|
|
|
has matching attributes with the cache and the cache does not have
|
|
|
any extra files. */
|
|
|
-static bool CheckValidity(const string &CacheFile, FileIterator Start,
|
|
|
- FileIterator End,MMap **OutMap = 0)
|
|
|
+static bool CheckValidity(const string &CacheFile,
|
|
|
+ pkgSourceList &List,
|
|
|
+ FileIterator Start,
|
|
|
+ FileIterator End,
|
|
|
+ MMap **OutMap = 0)
|
|
|
{
|
|
|
bool const Debug = _config->FindB("Debug::pkgCacheGen", false);
|
|
|
// No file, certainly invalid
|
|
|
@@ -927,6 +935,13 @@ static bool CheckValidity(const string &CacheFile, FileIterator Start,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ if (List.GetLastModifiedTime() < GetModificationTime(CacheFile))
|
|
|
+ {
|
|
|
+ if (Debug == true)
|
|
|
+ std::clog << "sources.list is newer than the cache" << std::endl;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
// Map it
|
|
|
FileFd CacheF(CacheFile,FileFd::ReadOnly);
|
|
|
SPtr<MMap> Map = new MMap(CacheF,0);
|
|
|
@@ -1152,7 +1167,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
|
|
|
Progress->OverallProgress(0,1,1,_("Reading package lists"));
|
|
|
|
|
|
// Cache is OK, Fin.
|
|
|
- if (CheckValidity(CacheFile,Files.begin(),Files.end(),OutMap) == true)
|
|
|
+ if (CheckValidity(CacheFile, List, Files.begin(),Files.end(),OutMap) == true)
|
|
|
{
|
|
|
if (Progress != NULL)
|
|
|
Progress->OverallProgress(1,1,1,_("Reading package lists"));
|
|
|
@@ -1205,7 +1220,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
|
|
|
// Lets try the source cache.
|
|
|
unsigned long CurrentSize = 0;
|
|
|
unsigned long TotalSize = 0;
|
|
|
- if (CheckValidity(SrcCacheFile,Files.begin(),
|
|
|
+ if (CheckValidity(SrcCacheFile, List, Files.begin(),
|
|
|
Files.begin()+EndOfSource) == true)
|
|
|
{
|
|
|
if (Debug == true)
|