From 4541554303b200955019aa477da3db9a9997ac77 Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:59:18 +0000 Subject: Gustavo Niemeyer stuff for RPM file depends Author: jgg Date: 2002-07-08 03:13:30 GMT Gustavo Niemeyer stuff for RPM file depends --- apt-pkg/indexfile.h | 3 +- apt-pkg/pkgcachegen.cc | 91 +++++++++++++++++++++++++++++++++++++++++++++----- apt-pkg/pkgcachegen.h | 16 ++++++++- 3 files changed, 99 insertions(+), 11 deletions(-) diff --git a/apt-pkg/indexfile.h b/apt-pkg/indexfile.h index be91eb453..1904fddea 100644 --- a/apt-pkg/indexfile.h +++ b/apt-pkg/indexfile.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: indexfile.h,v 1.5 2001/05/07 04:24:08 jgg Exp $ +// $Id: indexfile.h,v 1.6 2002/07/08 03:13:30 jgg Exp $ /* ###################################################################### Index File - Abstraction for an index of archive/source file. @@ -74,6 +74,7 @@ class pkgIndexFile virtual bool HasPackages() const = 0; virtual unsigned long Size() const = 0; virtual bool Merge(pkgCacheGenerator &/*Gen*/,OpProgress &/*Prog*/) const {return false;}; + virtual bool MergeFileProvides(pkgCacheGenerator &/*Gen*/,OpProgress &/*Prog*/) const {return true;}; virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const; virtual ~pkgIndexFile() {}; diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 581df11f4..c01f3b35d 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.51 2002/04/26 05:35:57 jgg Exp $ +// $Id: pkgcachegen.cc,v 1.52 2002/07/08 03:13:30 jgg Exp $ /* ###################################################################### Package Cache Generator - Generator for the cache structure. @@ -42,7 +42,8 @@ typedef vector::iterator FileIterator; // --------------------------------------------------------------------- /* We set the diry flag and make sure that is written to the disk */ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) : - Map(*pMap), Cache(pMap,false), Progress(Prog) + Map(*pMap), Cache(pMap,false), Progress(Prog), + FoundFileDeps(0) { CurrentFile = 0; memset(UniqHash,0,sizeof(UniqHash)); @@ -157,6 +158,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List, if (OutVer != 0) { *OutVer = Ver; + FoundFileDeps |= List.HasFileDeps(); return true; } @@ -194,10 +196,13 @@ bool pkgCacheGenerator::MergeList(ListParser &List, if (OutVer != 0) { *OutVer = Ver; + FoundFileDeps |= List.HasFileDeps(); return true; } } + FoundFileDeps |= List.HasFileDeps(); + if (Cache.HeaderP->PackageCount >= (1ULL<ID)*8)-1) return _error->Error(_("Wow, you exceeded the number of package " "names this APT is capable of.")); @@ -210,6 +215,54 @@ bool pkgCacheGenerator::MergeList(ListParser &List, return true; } /*}}}*/ +// CacheGenerator::MergeFileProvides - Merge file provides /*{{{*/ +// --------------------------------------------------------------------- +/* If we found any file depends while parsing the main list we need to + resolve them. Since it is undesired to load the entire list of files + into the cache as virtual packages we do a two stage effort. MergeList + identifies the file depends and this creates Provdies for them by + re-parsing all the indexs. */ +bool pkgCacheGenerator::MergeFileProvides(ListParser &List) +{ + List.Owner = this; + + unsigned int Counter = 0; + while (List.Step() == true) + { + string PackageName = List.Package(); + if (PackageName.empty() == true) + return false; + string Version = List.Version(); + if (Version.empty() == true) + continue; + + pkgCache::PkgIterator Pkg = Cache.FindPkg(PackageName); + if (Pkg.end() == true) + return _error->Error(_("Error occured while processing %s (FindPkg)"), + PackageName.c_str()); + Counter++; + if (Counter % 100 == 0 && Progress != 0) + Progress->Progress(List.Offset()); + + unsigned long Hash = List.VersionHash(); + pkgCache::VerIterator Ver = Pkg.VersionList(); + for (; Ver.end() == false; Ver++) + { + if (Ver->Hash == Hash && Version.c_str() == Ver.VerStr()) + { + if (List.CollectFileProvides(Cache,Ver) == false) + return _error->Error(_("Error occured while processing %s (CollectFileProvides)"),PackageName.c_str()); + break; + } + } + + if (Ver.end() == true) + _error->Warning(_("Package %s %s was not found while processing file dependencies"),PackageName.c_str(),Version.c_str()); + } + + return true; +} + /*}}}*/ // CacheGenerator::NewPackage - Add a new package /*{{{*/ // --------------------------------------------------------------------- /* This creates a new package structure and adds it to the hash table */ @@ -350,6 +403,10 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver, OldDepLast = &D->NextDepends; OldDepVer = Ver; } + + // Is it a file dependency? + if (PackageName[0] == '/') + FoundFileDeps = true; Dep->NextDepends = *OldDepLast; *OldDepLast = Dep.Index(); @@ -566,28 +623,44 @@ static bool BuildCache(pkgCacheGenerator &Gen, unsigned long &CurrentSize,unsigned long TotalSize, FileIterator Start, FileIterator End) { - for (; Start != End; Start++) + FileIterator I; + for (I = Start; I != End; I++) { - if ((*Start)->HasPackages() == false) + if ((*I)->HasPackages() == false) continue; - if ((*Start)->Exists() == false) + if ((*I)->Exists() == false) continue; - if ((*Start)->FindInCache(Gen.GetCache()).end() == false) + if ((*I)->FindInCache(Gen.GetCache()).end() == false) { _error->Warning("Duplicate sources.list entry %s", - (*Start)->Describe().c_str()); + (*I)->Describe().c_str()); continue; } - unsigned long Size = (*Start)->Size(); + unsigned long Size = (*I)->Size(); Progress.OverallProgress(CurrentSize,TotalSize,Size,_("Reading Package Lists")); CurrentSize += Size; - if ((*Start)->Merge(Gen,Progress) == false) + if ((*I)->Merge(Gen,Progress) == false) return false; } + + if (Gen.HasFileDeps() == true) + { + Progress.Done(); + TotalSize = ComputeSize(Start, End); + CurrentSize = 0; + for (I = Start; I != End; I++) + { + unsigned long Size = (*I)->Size(); + Progress.OverallProgress(CurrentSize,TotalSize,Size,_("Collecting File Provides")); + CurrentSize += Size; + if ((*I)->MergeFileProvides(Gen,Progress) == false) + return false; + } + } return true; } diff --git a/apt-pkg/pkgcachegen.h b/apt-pkg/pkgcachegen.h index 7a8c784ff..7d0920629 100644 --- a/apt-pkg/pkgcachegen.h +++ b/apt-pkg/pkgcachegen.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgcachegen.h,v 1.18 2001/02/20 07:03:17 jgg Exp $ +// $Id: pkgcachegen.h,v 1.19 2002/07/08 03:13:30 jgg Exp $ /* ###################################################################### Package Cache Generator - Generator for the cache structure. @@ -49,6 +49,9 @@ class pkgCacheGenerator string PkgFileName; pkgCache::PackageFile *CurrentFile; + + // Flag file dependencies + bool FoundFileDeps; bool NewPackage(pkgCache::PkgIterator &Pkg,string Pkg); bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List); @@ -66,6 +69,9 @@ class pkgCacheGenerator inline pkgCache &GetCache() {return Cache;}; inline pkgCache::PkgFileIterator GetCurFile() {return pkgCache::PkgFileIterator(Cache,CurrentFile);}; + + bool HasFileDeps() {return FoundFileDeps;}; + bool MergeFileProvides(ListParser &List); pkgCacheGenerator(DynamicMMap *Map,OpProgress *Progress); ~pkgCacheGenerator(); @@ -80,6 +86,9 @@ class pkgCacheGenerator::ListParser // Some cache items pkgCache::VerIterator OldDepVer; map_ptrloc *OldDepLast; + + // Flag file dependencies + bool FoundFileDeps; protected: @@ -106,6 +115,11 @@ class pkgCacheGenerator::ListParser virtual bool Step() = 0; + inline bool HasFileDeps() {return FoundFileDeps;}; + virtual bool CollectFileProvides(pkgCache &Cache, + pkgCache::VerIterator Ver) {return true;}; + + ListParser() : FoundFileDeps(false) {}; virtual ~ListParser() {}; }; -- cgit v1.2.3