|
|
@@ -108,12 +108,12 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
|
|
|
while (List.Step() == true)
|
|
|
{
|
|
|
// Get a pointer to the package structure
|
|
|
- string PackageName = List.Package();
|
|
|
+ string const PackageName = List.Package();
|
|
|
if (PackageName.empty() == true)
|
|
|
return false;
|
|
|
-
|
|
|
+
|
|
|
pkgCache::PkgIterator Pkg;
|
|
|
- if (NewPackage(Pkg,PackageName) == false)
|
|
|
+ if (NewPackage(Pkg, PackageName, List.Architecture()) == false)
|
|
|
return _error->Error(_("Error occurred while processing %s (NewPackage)"),PackageName.c_str());
|
|
|
Counter++;
|
|
|
if (Counter % 100 == 0 && Progress != 0)
|
|
|
@@ -323,33 +323,71 @@ bool pkgCacheGenerator::MergeFileProvides(ListParser &List)
|
|
|
return true;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
+// CacheGenerator::NewGroup - Add a new group /*{{{*/
|
|
|
+// ---------------------------------------------------------------------
|
|
|
+/* This creates a new group structure and adds it to the hash table */
|
|
|
+bool pkgCacheGenerator::NewGroup(pkgCache::GrpIterator &Grp, const string &Name) {
|
|
|
+ Grp = Cache.FindGrp(Name);
|
|
|
+ if (Grp.end() == false)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ // Get a structure
|
|
|
+ unsigned long const Group = Map.Allocate(sizeof(pkgCache::Group));
|
|
|
+ if (unlikely(Group == 0))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ Grp = pkgCache::GrpIterator(Cache, Cache.GrpP + Group);
|
|
|
+ Grp->Name = Map.WriteString(Name);
|
|
|
+ if (unlikely(Grp->Name == 0))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // Insert it into the hash table
|
|
|
+ unsigned long const Hash = Cache.Hash(Name);
|
|
|
+ Grp->Next = Cache.HeaderP->GrpHashTable[Hash];
|
|
|
+ Cache.HeaderP->GrpHashTable[Hash] = Group;
|
|
|
+
|
|
|
+ Cache.HeaderP->GroupCount++;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+ /*}}}*/
|
|
|
// CacheGenerator::NewPackage - Add a new package /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* This creates a new package structure and adds it to the hash table */
|
|
|
-bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name)
|
|
|
-{
|
|
|
- Pkg = Cache.FindPkg(Name);
|
|
|
- if (Pkg.end() == false)
|
|
|
- return true;
|
|
|
+bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name,
|
|
|
+ const string &Arch) {
|
|
|
+ pkgCache::GrpIterator Grp;
|
|
|
+ if (unlikely(NewGroup(Grp, Name) == false))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ Pkg = Grp.FindPkg(Arch);
|
|
|
+ if (Pkg.end() == false)
|
|
|
+ return true;
|
|
|
|
|
|
// Get a structure
|
|
|
- unsigned long Package = Map.Allocate(sizeof(pkgCache::Package));
|
|
|
- if (Package == 0)
|
|
|
+ unsigned long const Package = Map.Allocate(sizeof(pkgCache::Package));
|
|
|
+ if (unlikely(Package == 0))
|
|
|
return false;
|
|
|
-
|
|
|
Pkg = pkgCache::PkgIterator(Cache,Cache.PkgP + Package);
|
|
|
-
|
|
|
+
|
|
|
// Insert it into the hash table
|
|
|
- unsigned long Hash = Cache.Hash(Name);
|
|
|
- Pkg->NextPackage = Cache.HeaderP->HashTable[Hash];
|
|
|
- Cache.HeaderP->HashTable[Hash] = Package;
|
|
|
-
|
|
|
- // Set the name and the ID
|
|
|
- Pkg->Name = Map.WriteString(Name);
|
|
|
- if (Pkg->Name == 0)
|
|
|
+ unsigned long const Hash = Cache.Hash(Name);
|
|
|
+ Pkg->NextPackage = Cache.HeaderP->PkgHashTable[Hash];
|
|
|
+ Cache.HeaderP->PkgHashTable[Hash] = Package;
|
|
|
+
|
|
|
+ // remember the packages in the group
|
|
|
+ Grp->FirstPackage = Package;
|
|
|
+ if (Grp->LastPackage == 0)
|
|
|
+ Grp->LastPackage = Package;
|
|
|
+
|
|
|
+ // Set the name, arch and the ID
|
|
|
+ Pkg->Name = Grp->Name;
|
|
|
+ Pkg->Group = Grp.Index();
|
|
|
+ Pkg->Arch = WriteUniqString(Arch.c_str());
|
|
|
+ if (unlikely(Pkg->Arch == 0))
|
|
|
return false;
|
|
|
Pkg->ID = Cache.HeaderP->PackageCount++;
|
|
|
-
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
@@ -474,6 +512,7 @@ map_ptrloc pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
|
|
|
version and to the package that it is pointing to. */
|
|
|
bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
|
|
|
const string &PackageName,
|
|
|
+ const string &Arch,
|
|
|
const string &Version,
|
|
|
unsigned int Op,
|
|
|
unsigned int Type)
|
|
|
@@ -481,8 +520,8 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
|
|
|
pkgCache &Cache = Owner->Cache;
|
|
|
|
|
|
// Get a structure
|
|
|
- unsigned long Dependency = Owner->Map.Allocate(sizeof(pkgCache::Dependency));
|
|
|
- if (Dependency == 0)
|
|
|
+ unsigned long const Dependency = Owner->Map.Allocate(sizeof(pkgCache::Dependency));
|
|
|
+ if (unlikely(Dependency == 0))
|
|
|
return false;
|
|
|
|
|
|
// Fill it in
|
|
|
@@ -492,11 +531,17 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
|
|
|
Dep->CompareOp = Op;
|
|
|
Dep->ID = Cache.HeaderP->DependsCount++;
|
|
|
|
|
|
- // Locate the target package
|
|
|
- pkgCache::PkgIterator Pkg;
|
|
|
- if (Owner->NewPackage(Pkg,PackageName) == false)
|
|
|
+ pkgCache::GrpIterator Grp;
|
|
|
+ if (unlikely(Owner->NewGroup(Grp, PackageName) == false))
|
|
|
return false;
|
|
|
-
|
|
|
+
|
|
|
+ // Locate the target package
|
|
|
+ pkgCache::PkgIterator Pkg = Grp.FindPkg(Arch);
|
|
|
+ if (Pkg.end() == true) {
|
|
|
+ if (unlikely(Owner->NewPackage(Pkg, PackageName, Arch) == false))
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
// Probe the reverse dependency list for a version string that matches
|
|
|
if (Version.empty() == false)
|
|
|
{
|
|
|
@@ -504,7 +549,7 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
|
|
|
if (I->Version != 0 && I.TargetVer() == Version)
|
|
|
Dep->Version = I->Version;*/
|
|
|
if (Dep->Version == 0)
|
|
|
- if ((Dep->Version = WriteString(Version)) == 0)
|
|
|
+ if (unlikely((Dep->Version = WriteString(Version)) == 0))
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -524,7 +569,7 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
|
|
|
}
|
|
|
|
|
|
// Is it a file dependency?
|
|
|
- if (PackageName[0] == '/')
|
|
|
+ if (unlikely(PackageName[0] == '/'))
|
|
|
FoundFileDeps = true;
|
|
|
|
|
|
Dep->NextDepends = *OldDepLast;
|
|
|
@@ -544,12 +589,12 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
|
|
|
pkgCache &Cache = Owner->Cache;
|
|
|
|
|
|
// We do not add self referencing provides
|
|
|
- if (Ver.ParentPkg().Name() == PackageName)
|
|
|
+ if (unlikely(Ver.ParentPkg().Name() == PackageName))
|
|
|
return true;
|
|
|
|
|
|
// Get a structure
|
|
|
- unsigned long Provides = Owner->Map.Allocate(sizeof(pkgCache::Provides));
|
|
|
- if (Provides == 0)
|
|
|
+ unsigned long const Provides = Owner->Map.Allocate(sizeof(pkgCache::Provides));
|
|
|
+ if (unlikely(Provides == 0))
|
|
|
return false;
|
|
|
Cache.HeaderP->ProvidesCount++;
|
|
|
|
|
|
@@ -558,12 +603,12 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
|
|
|
Prv->Version = Ver.Index();
|
|
|
Prv->NextPkgProv = Ver->ProvidesList;
|
|
|
Ver->ProvidesList = Prv.Index();
|
|
|
- if (Version.empty() == false && (Prv->ProvideVersion = WriteString(Version)) == 0)
|
|
|
+ if (Version.empty() == false && unlikely((Prv->ProvideVersion = WriteString(Version)) == 0))
|
|
|
return false;
|
|
|
|
|
|
// Locate the target package
|
|
|
pkgCache::PkgIterator Pkg;
|
|
|
- if (Owner->NewPackage(Pkg,PackageName) == false)
|
|
|
+ if (unlikely(Owner->NewPackage(Pkg,PackageName,string(Ver.Arch())) == false))
|
|
|
return false;
|
|
|
|
|
|
// Link it to the package
|