summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/deb/deblistparser.cc20
-rwxr-xr-xtest/integration/test-multiarch-allowed49
-rwxr-xr-xtest/integration/test-multiarch-foreign35
3 files changed, 96 insertions, 8 deletions
diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc
index 6a802b39f..602e96e26 100644
--- a/apt-pkg/deb/deblistparser.cc
+++ b/apt-pkg/deb/deblistparser.cc
@@ -824,13 +824,13 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
/* */
bool debListParser::ParseProvides(pkgCache::VerIterator &Ver)
{
+ string const Arch = Ver.Arch();
const char *Start;
const char *Stop;
if (Section.Find("Provides",Start,Stop) == true)
{
string Package;
string Version;
- string const Arch = Ver.Arch();
unsigned int Op;
while (1)
@@ -847,8 +847,9 @@ bool debListParser::ParseProvides(pkgCache::VerIterator &Ver)
if (NewProvides(Ver, Package, OtherArch, Version, pkgCache::Flag::ArchSpecific) == false)
return false;
} else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign) {
- if (NewProvidesAllArch(Ver, Package, Version, 0) == false)
- return false;
+ if (APT::Configuration::checkArchitecture(Arch))
+ if (NewProvidesAllArch(Ver, Package, Version, 0) == false)
+ return false;
} else {
if (NewProvides(Ver, Package, Arch, Version, 0) == false)
return false;
@@ -859,13 +860,16 @@ bool debListParser::ParseProvides(pkgCache::VerIterator &Ver)
}
}
- if ((Ver->MultiArch & pkgCache::Version::Allowed) == pkgCache::Version::Allowed)
+ if (APT::Configuration::checkArchitecture(Arch))
{
- string const Package = string(Ver.ParentPkg().Name()).append(":").append("any");
- return NewProvides(Ver, Package, "any", Ver.VerStr(), pkgCache::Flag::MultiArchImplicit);
+ if ((Ver->MultiArch & pkgCache::Version::Allowed) == pkgCache::Version::Allowed)
+ {
+ string const Package = string(Ver.ParentPkg().Name()).append(":").append("any");
+ return NewProvides(Ver, Package, "any", Ver.VerStr(), pkgCache::Flag::MultiArchImplicit);
+ }
+ else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign)
+ return NewProvidesAllArch(Ver, Ver.ParentPkg().Name(), Ver.VerStr(), pkgCache::Flag::MultiArchImplicit);
}
- else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign)
- return NewProvidesAllArch(Ver, Ver.ParentPkg().Name(), Ver.VerStr(), pkgCache::Flag::MultiArchImplicit);
return true;
}
diff --git a/test/integration/test-multiarch-allowed b/test/integration/test-multiarch-allowed
index f050c1fd9..5a8b5eb7d 100755
--- a/test/integration/test-multiarch-allowed
+++ b/test/integration/test-multiarch-allowed
@@ -242,3 +242,52 @@ solveableinsinglearch1 'needsfoover1'
testfailureequal "$NEEDSFOO2NATIVE" aptget install needsfoover2 -s
solveableinsinglearch2
solveableinsinglearch3
+
+msgmsg 'multi-arch with barbarian archs'
+configarchitecture 'amd64' 'i386'
+insertinstalledpackage 'foo' 'armel' '1' 'Multi-Arch: allowed'
+insertinstalledpackage 'coolfoo' 'armel' '1' 'Multi-Arch:allowed
+Provides: coolbar'
+
+testsuccessequal 'Reading package lists...
+Building dependency tree...
+The following additional packages will be installed:
+ foo
+The following packages will be REMOVED:
+ foo:armel
+The following NEW packages will be installed:
+ foo needsfooany
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv foo:armel [1]
+Inst foo (1 unstable [amd64])
+Inst needsfooany (1 unstable [amd64])
+Conf foo (1 unstable [amd64])
+Conf needsfooany (1 unstable [amd64])' aptget install needsfooany -s
+testsuccessequal 'Reading package lists...
+Building dependency tree...
+The following additional packages will be installed:
+ foo
+The following packages will be REMOVED:
+ foo:armel
+The following NEW packages will be installed:
+ foo needsfooany:i386
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv foo:armel [1]
+Inst foo (1 unstable [amd64])
+Inst needsfooany:i386 (1 unstable [i386])
+Conf foo (1 unstable [amd64])
+Conf needsfooany:i386 (1 unstable [i386])' aptget install needsfooany:i386 -s
+testsuccessequal 'Reading package lists...
+Building dependency tree...
+The following additional packages will be installed:
+ coolfoo
+The following packages will be REMOVED:
+ coolfoo:armel
+The following NEW packages will be installed:
+ coolfoo needscoolfoover0
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv coolfoo:armel [1]
+Inst coolfoo (1 unstable [amd64])
+Inst needscoolfoover0 (1 unstable [amd64])
+Conf coolfoo (1 unstable [amd64])
+Conf needscoolfoover0 (1 unstable [amd64])' aptget install needscoolfoover0 -s
diff --git a/test/integration/test-multiarch-foreign b/test/integration/test-multiarch-foreign
index 58e5b462a..854f441fb 100755
--- a/test/integration/test-multiarch-foreign
+++ b/test/integration/test-multiarch-foreign
@@ -240,3 +240,38 @@ msgmsg 'switch to single architecture'
configarchitecture 'amd64'
satisfiable_in_singlearch
+
+msgmsg 'switch to multi-arch with barbarian architecture'
+
+insertinstalledpackage 'foo' 'armhf' '1.0' 'Multi-Arch: foreign'
+insertinstalledpackage 'bar' 'armhf' '1.0' 'Provides: bar-provider
+Multi-Arch: foreign'
+
+testsuccessequal 'Reading package lists...
+Building dependency tree...
+The following additional packages will be installed:
+ foo
+The following packages will be REMOVED:
+ foo:armhf
+The following NEW packages will be installed:
+ cool-foo foo
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv foo:armhf [1.0]
+Inst foo (1.0 unstable [amd64])
+Inst cool-foo (1.0 unstable [amd64])
+Conf foo (1.0 unstable [amd64])
+Conf cool-foo (1.0 unstable [amd64])' aptget install cool-foo -s
+testsuccessequal 'Reading package lists...
+Building dependency tree...
+The following additional packages will be installed:
+ bar
+The following packages will be REMOVED:
+ bar:armhf
+The following NEW packages will be installed:
+ bar cool-bar
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv bar:armhf [1.0]
+Inst bar (1.0 unstable [amd64])
+Inst cool-bar (1.0 unstable [amd64])
+Conf bar (1.0 unstable [amd64])
+Conf cool-bar (1.0 unstable [amd64])' aptget install cool-bar -s