X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/8ce4327bc0d3f2695b936391c856cc80de6c0d83..30e1eab53324523297a24c18819b27aba7ce1fb4:/apt-pkg/pkgcachegen.cc diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index c3bf1cf36..bbf245b00 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgcachegen.cc,v 1.14 1998/08/26 04:52:23 jgg Exp $ +// $Id: pkgcachegen.cc,v 1.23 1998/11/13 04:23:33 jgg Exp $ /* ###################################################################### Package Cache Generator - Generator for the cache structure. @@ -70,6 +70,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List) { List.Owner = this; + int Counter = 0; while (List.Step() == true) { // Get a pointer to the package structure @@ -77,7 +78,9 @@ bool pkgCacheGenerator::MergeList(ListParser &List) pkgCache::PkgIterator Pkg; if (NewPackage(Pkg,PackageName) == false) return _error->Error("Error occured while processing %s (NewPackage)",PackageName.c_str()); - Progress.Progress(List.Offset()); + Counter++; + if (Counter % 100 == 0) + Progress.Progress(List.Offset()); /* Get a pointer to the version structure. We know the list is sorted so we use that fact in the search. Insertion of new versions is @@ -91,7 +94,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List) } pkgCache::VerIterator Ver = Pkg.VersionList(); - unsigned long *Last = &Pkg->VersionList; + __apt_ptrloc *Last = &Pkg->VersionList; int Res = 1; for (; Ver.end() == false; Last = &Ver->NextVer, Ver++) { @@ -173,8 +176,14 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver, pkgCache::VerFileIterator VF(Cache,Cache.VerFileP + VerFile); VF->File = CurrentFile - Cache.PkgFileP; - VF->NextFile = Ver->FileList; - Ver->FileList = VF.Index(); + + // Link it to the end of the list + __apt_ptrloc *Last = &Ver->FileList; + for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; V++) + Last = &V->NextFile; + VF->NextFile = *Last; + *Last = VF.Index(); + VF->Offset = List.Offset(); VF->Size = List.Size(); if (Cache.HeaderP->MaxVerFileSize < VF->Size) @@ -251,7 +260,7 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver, Pkg->RevDepends = Dep.Index(); // Link it to the version (at the end of the list) - unsigned long *Last = &Ver->DependsList; + __apt_ptrloc *Last = &Ver->DependsList; for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++) Last = &D->NextDepends; Dep->NextDepends = *Last; @@ -320,6 +329,7 @@ bool pkgCacheGenerator::SelectFile(string File,unsigned long Flags) CurrentFile->mtime = Buf.st_mtime; CurrentFile->NextFile = Cache.HeaderP->FileList; CurrentFile->Flags = Flags; + CurrentFile->ID = Cache.HeaderP->PackageFileCount; PkgFileName = File; Cache.HeaderP->FileList = CurrentFile - Cache.PkgFileP; Cache.HeaderP->PackageFileCount++; @@ -341,7 +351,7 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S, // Search for an insertion point pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList; int Res = 1; - unsigned long *Last = &Cache.HeaderP->StringList; + __apt_ptrloc *Last = &Cache.HeaderP->StringList; for (; I != Cache.StringItemP; Last = &I->NextItem, I = Cache.StringItemP + I->NextItem) { @@ -379,10 +389,25 @@ bool pkgSrcCacheCheck(pkgSourceList &List) { if (_error->PendingError() == true) return false; - - // Open the source package cache - string CacheFile = _config->FindDir("Dir::Cache::srcpkgcache"); + + string CacheFile = _config->FindFile("Dir::Cache::srcpkgcache"); string ListDir = _config->FindDir("Dir::State::lists"); + + // Count the number of missing files + int Missing = 0; + for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++) + { + string File = ListDir + URItoFileName(I->PackagesURI()); + struct stat Buf; + if (stat(File.c_str(),&Buf) != 0) + { + _error->WarningE("stat","Couldn't stat source package list '%s' (%s)", + I->PackagesInfo().c_str(),File.c_str()); + Missing++; + } + } + + // Open the source package cache if (FileExists(CacheFile) == false) return false; @@ -394,7 +419,7 @@ bool pkgSrcCacheCheck(pkgSourceList &List) } MMap Map(CacheF,MMap::Public | MMap::ReadOnly); - if (_error->PendingError() == true) + if (_error->PendingError() == true || Map.Size() == 0) { _error->Discard(); return false; @@ -406,9 +431,9 @@ bool pkgSrcCacheCheck(pkgSourceList &List) _error->Discard(); return false; } - + // They are certianly out of sync - if (Cache.Head().PackageFileCount != List.size()) + if (Cache.Head().PackageFileCount != List.size() - Missing) return false; for (pkgCache::PkgFileIterator F(Cache); F.end() == false; F++) @@ -455,7 +480,7 @@ bool pkgPkgCacheCheck(string CacheFile) } MMap Map(CacheF,MMap::Public | MMap::ReadOnly); - if (_error->PendingError() == true) + if (_error->PendingError() == true || Map.Size() == 0) { _error->Discard(); return false; @@ -468,10 +493,31 @@ bool pkgPkgCacheCheck(string CacheFile) return false; } + // Status files that must be in the cache + string Status[3]; + Status[0] = _config->FindFile("Dir::State::xstatus"); + Status[1]= _config->FindFile("Dir::State::userstatus"); + Status[2] = _config->FindFile("Dir::State::status"); + // Cheack each file for (pkgCache::PkgFileIterator F(Cache); F.end() == false; F++) + { if (F.IsOk() == false) return false; + + // See if this is one of the status files + for (int I = 0; I != 3; I++) + if (F.FileName() == Status[I]) + Status[I] = string(); + } + + // Make sure all the status files are loaded. + for (int I = 0; I != 3; I++) + { + if (Status[I].empty() == false && FileExists(Status[I]) == true) + return false; + } + return true; } /*}}}*/ @@ -481,9 +527,9 @@ bool pkgPkgCacheCheck(string CacheFile) static bool pkgAddSourcesSize(unsigned long &TotalSize) { // Grab the file names - string xstatus = _config->FindDir("Dir::State::xstatus"); - string userstatus = _config->FindDir("Dir::State::userstatus"); - string status = _config->FindDir("Dir::State::status"); + string xstatus = _config->FindFile("Dir::State::xstatus"); + string userstatus = _config->FindFile("Dir::State::userstatus"); + string status = _config->FindFile("Dir::State::status"); // Grab the sizes struct stat Buf; @@ -506,9 +552,9 @@ static bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen, { // Grab the file names string Status[3]; - Status[0] = _config->FindDir("Dir::State::xstatus"); - Status[1]= _config->FindDir("Dir::State::userstatus"); - Status[2] = _config->FindDir("Dir::State::status"); + Status[0] = _config->FindFile("Dir::State::xstatus"); + Status[1]= _config->FindFile("Dir::State::userstatus"); + Status[2] = _config->FindFile("Dir::State::status"); for (int I = 0; I != 3; I++) { @@ -544,16 +590,15 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) { Progress.OverallProgress(0,1,1,"Reading Package Lists"); - string CacheFile = _config->FindDir("Dir::Cache::pkgcache"); + string CacheFile = _config->FindFile("Dir::Cache::pkgcache"); bool SrcOk = pkgSrcCacheCheck(List); - bool PkgOk = pkgPkgCacheCheck(CacheFile); + bool PkgOk = SrcOk && pkgPkgCacheCheck(CacheFile); // Rebuild the source and package caches if (SrcOk == false) { - string SCacheFile = _config->FindDir("Dir::Cache::srcpkgcache"); + string SCacheFile = _config->FindFile("Dir::Cache::srcpkgcache"); string ListDir = _config->FindDir("Dir::State::lists"); - FileFd SCacheF(SCacheFile,FileFd::WriteEmpty); FileFd CacheF(CacheFile,FileFd::WriteEmpty); DynamicMMap Map(CacheF,MMap::Public); @@ -569,7 +614,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) { string File = ListDir + URItoFileName(I->PackagesURI()); if (stat(File.c_str(),&Buf) != 0) - return _error->Errno("stat","Couldn't stat source package list %s",File.c_str()); + continue; TotalSize += Buf.st_size; } @@ -581,6 +626,10 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++) { string File = ListDir + URItoFileName(I->PackagesURI()); + + if (stat(File.c_str(),&Buf) != 0) + continue; + FileFd Pkg(File,FileFd::ReadOnly); debListParser Parser(Pkg); Progress.OverallProgress(CurrentSize,TotalSize,Pkg.Size(),"Reading Package Lists"); @@ -613,7 +662,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) } // We use the source cache to generate the package cache - string SCacheFile = _config->FindDir("Dir::Cache::srcpkgcache"); + string SCacheFile = _config->FindFile("Dir::Cache::srcpkgcache"); FileFd SCacheF(SCacheFile,FileFd::ReadOnly); FileFd CacheF(CacheFile,FileFd::WriteEmpty);