Browse Source

always create pkg at the time pkg:arch is created

To resolve dependencies like "pkg:arch" we create a package with the
name "pkg:arch" and the architecture "any". We create these packages
only if a dependency needs it as these kind of dependencies aren't that
common. This commit ensured that in the even this architecture specific
dependency is the only relation this package has we still create the
underlying package to have them available in provides resolution.
tags/debian/1.2.2
David Kalnischkies 5 years ago
parent
commit
530302ef25
3 changed files with 41 additions and 21 deletions
  1. +29
    -16
      apt-pkg/pkgcachegen.cc
  2. +10
    -3
      test/integration/test-apt-cache
  3. +2
    -2
      test/integration/test-specific-architecture-dependencies

+ 29
- 16
apt-pkg/pkgcachegen.cc View File

@@ -660,31 +660,44 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg, StringView Name,
if (Arch == "any")
{
size_t const found = Name.find(':');
StringView const NameA = Name.substr(0, found);
StringView ArchA = Name.substr(found + 1);
pkgCache::PkgIterator PkgA = Cache.FindPkg(NameA, ArchA);
if (PkgA.end() == false)
if (ArchA != "any")
{
// ArchA is used inside the loop which might remap (NameA is not used)
Dynamic<StringView> DynArchA(ArchA);
StringView NameA = Name.substr(0, found);
pkgCache::PkgIterator PkgA = Cache.FindPkg(NameA, ArchA);
Dynamic<pkgCache::PkgIterator> DynPkgA(PkgA);
pkgCache::PrvIterator Prv = PkgA.ProvidesList();
for (; Prv.end() == false; ++Prv)
if (PkgA.end())
{
if (Prv.IsMultiArchImplicit())
continue;
pkgCache::VerIterator V = Prv.OwnerVer();
if (ArchA != V.ParentPkg().Arch())
continue;
if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
Dynamic<StringView> DynNameA(NameA);
if (NewPackage(PkgA, NameA, ArchA) == false)
return false;
}
pkgCache::VerIterator V = PkgA.VersionList();
Dynamic<pkgCache::VerIterator> DynV(V);
for (; V.end() == false; ++V)
if (unlikely(PkgA.end()))
return _error->Fatal("NewPackage was successful for %s:%s,"
"but the package doesn't exist anyhow!",
NameA.to_string().c_str(), ArchA.to_string().c_str());
else
{
if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
return false;
pkgCache::PrvIterator Prv = PkgA.ProvidesList();
for (; Prv.end() == false; ++Prv)
{
if (Prv.IsMultiArchImplicit())
continue;
pkgCache::VerIterator V = Prv.OwnerVer();
if (ArchA != V.ParentPkg().Arch())
continue;
if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
return false;
}
pkgCache::VerIterator V = PkgA.VersionList();
Dynamic<pkgCache::VerIterator> DynV(V);
for (; V.end() == false; ++V)
{
if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
return false;
}
}
}
}


+ 10
- 3
test/integration/test-apt-cache View File

@@ -120,9 +120,12 @@ bar
Depends: bar
Breaks: foo
Replaces: foo
Breaks: <foo:i386>
Replaces: <foo:i386>
<foobar>
<cool>
<cooler>' aptcache depends foo --recurse --implicit
<cooler>
<foo:i386>' aptcache depends foo --recurse --implicit
testsuccessequal 'foo
Depends: bar
bar
@@ -132,7 +135,9 @@ testsuccessequal 'foo
Depends: bar
bar
Depends: bar
Replaces: foo' aptcache depends foo --recurse --important --replaces --implicit
Replaces: foo
Replaces: <foo:i386>
<foo:i386>' aptcache depends foo --recurse --important --replaces --implicit
testsuccessequal 'bar
Depends: bar
Breaks: foo
@@ -140,7 +145,9 @@ testsuccessequal 'bar
testsuccessequal 'bar
Depends: bar
Breaks: foo
Replaces: foo' aptcache depends bar --implicit
Replaces: foo
Breaks: <foo:i386>
Replaces: <foo:i386>' aptcache depends bar --implicit

testsuccessequal 'specific
Depends: <bar:i386>


+ 2
- 2
test/integration/test-specific-architecture-dependencies View File

@@ -108,12 +108,12 @@ Conf depender-x64:i386 (1 unstable [i386])' aptget install depender-x64:i386 -s
testequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
libold libold:i386
libold:i386 libold
The following NEW packages will be installed:
breaker
0 upgraded, 1 newly installed, 2 to remove and 0 not upgraded.
Remv libold [1]
Remv libold:i386 [1]
Remv libold [1]
Inst breaker (1 unstable [all])
Conf breaker (1 unstable [all])' aptget install breaker -s



Loading…
Cancel
Save