From cef094c2ec8214b2783a2ac3aa70cf835381eae1 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 9 Jul 2012 17:42:25 +0200 Subject: * apt-pkg/deb/deblistparser.cc: - negative dependencies need to apply to all architectures, but those with a specific architecture only apply to this one --- apt-pkg/deb/deblistparser.cc | 3 +- debian/changelog | 3 + .../test-specific-architecture-dependencies | 182 +++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100755 test/integration/test-specific-architecture-dependencies diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index e93e51af3..12c6ab4c9 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -635,7 +635,8 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver, return _error->Error("Problem parsing dependency %s",Tag); size_t const found = Package.rfind(':'); - if (MultiArchEnabled == true && + // If negative is unspecific it needs to apply on all architectures + if (MultiArchEnabled == true && found == string::npos && (Type == pkgCache::Dep::Conflicts || Type == pkgCache::Dep::DpkgBreaks || Type == pkgCache::Dep::Replaces)) diff --git a/debian/changelog b/debian/changelog index e0692a40e..634b37253 100644 --- a/debian/changelog +++ b/debian/changelog @@ -25,6 +25,9 @@ apt (0.9.7.2) UNRELEASED; urgency=low * apt-pkg/clean.cc: - run autoclean against pkg:arch and not always against pkg:native as this removes valid cache entries (Closes: #679371) + * apt-pkg/deb/deblistparser.cc: + - negative dependencies need to apply to all architectures, + but those with a specific architecture only apply to this one -- David Kalnischkies Sun, 01 Jul 2012 08:20:57 +0200 diff --git a/test/integration/test-specific-architecture-dependencies b/test/integration/test-specific-architecture-dependencies new file mode 100755 index 000000000..078a84654 --- /dev/null +++ b/test/integration/test-specific-architecture-dependencies @@ -0,0 +1,182 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable' 'libc6' 'amd64,i386' '1' 'Multi-Arch: same' +insertinstalledpackage 'libold' 'amd64,i386' '1' 'Multi-Arch: same' +insertinstalledpackage 'provider' 'amd64' '1' 'Provides: foo' + +insertpackage 'unstable' 'pre-depender' 'all' '1' 'Pre-Depends: libc6:i386' +insertpackage 'unstable' 'depender' 'all' '1' 'Depends: libc6:i386' + +insertpackage 'unstable' 'breaker' 'all' '1' 'Breaks: libold (<< 2)' +insertpackage 'unstable' 'breaker-x32' 'amd64' '1' 'Breaks: libold:i386 (<< 2)' +insertpackage 'unstable' 'breaker-x64' 'i386' '1' 'Breaks: libold:amd64 (<< 2)' +# conflicts with no effect +insertpackage 'unstable' 'oldconflictor' 'all' '1' 'Conflicts: libold (<< 0)' +insertpackage 'unstable' 'oldconflictor-x32' 'amd64' '1' 'Conflicts: libold:i386 (<< 0)' +insertpackage 'unstable' 'oldconflictor-x64' 'i386' '1' 'Conflicts: libold:amd64 (<< 0)' + +insertpackage 'unstable' 'foo-depender' 'i386,amd64' '1' 'Depends: foo' +insertpackage 'unstable' 'foo-foreign-depender' 'i386' '1' 'Depends: foo:amd64' + +insertpackage 'unstable' 'foo-conflictor' 'i386,amd64' '1' 'Conflicts: foo' +insertpackage 'unstable' 'foo-foreign-conflictor' 'i386' '1' 'Conflicts: foo:amd64' +insertpackage 'unstable' 'foo-no-conflictor' 'i386' '1' 'Conflicts: foo:i386' + +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + libc6:i386 +The following NEW packages will be installed: + libc6:i386 pre-depender +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6:i386 (1 unstable [i386]) +Conf libc6:i386 (1 unstable [i386]) +Inst pre-depender (1 unstable [all]) +Conf pre-depender (1 unstable [all])' aptget install pre-depender -s + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + libc6:i386 +The following NEW packages will be installed: + depender libc6:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6:i386 (1 unstable [i386]) +Inst depender (1 unstable [all]) +Conf libc6:i386 (1 unstable [i386]) +Conf depender (1 unstable [all])' aptget install depender -s + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold libold:i386 +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] +Inst breaker (1 unstable [all]) +Conf breaker (1 unstable [all])' aptget install breaker -s + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold:i386 +The following NEW packages will be installed: + breaker-x32 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libold:i386 [1] +Inst breaker-x32 (1 unstable [amd64]) +Conf breaker-x32 (1 unstable [amd64])' aptget install breaker-x32 -s + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold +The following NEW packages will be installed: + breaker-x64:i386 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libold [1] +Inst breaker-x64:i386 (1 unstable [i386]) +Conf breaker-x64:i386 (1 unstable [i386])' aptget install breaker-x64 -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + oldconflictor +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst oldconflictor (1 unstable [all]) +Conf oldconflictor (1 unstable [all])' aptget install oldconflictor -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + oldconflictor-x32 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst oldconflictor-x32 (1 unstable [amd64]) +Conf oldconflictor-x32 (1 unstable [amd64])' aptget install oldconflictor-x32 -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + oldconflictor-x64:i386 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst oldconflictor-x64:i386 (1 unstable [i386]) +Conf oldconflictor-x64:i386 (1 unstable [i386])' aptget install oldconflictor-x64 -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-depender +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo-depender (1 unstable [amd64]) +Conf foo-depender (1 unstable [amd64])' aptget install foo-depender -s + +testequal 'Reading package lists... +Building dependency tree... +Some packages could not be installed. This may mean that you have +requested an impossible situation or if you are using the unstable +distribution that some required packages have not yet been created +or been moved out of Incoming. +The following information may help to resolve the situation: + +The following packages have unmet dependencies: + foo-depender:i386 : Depends: foo:i386 but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget install foo-depender:i386 -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-foreign-depender:i386 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo-foreign-depender:i386 (1 unstable [i386]) +Conf foo-foreign-depender:i386 (1 unstable [i386])' aptget install foo-foreign-depender:i386 -s + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + provider +The following NEW packages will be installed: + foo-conflictor +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv provider [1] +Inst foo-conflictor (1 unstable [amd64]) +Conf foo-conflictor (1 unstable [amd64])' aptget install foo-conflictor -s + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + provider +The following NEW packages will be installed: + foo-conflictor:i386 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv provider [1] +Inst foo-conflictor:i386 (1 unstable [i386]) +Conf foo-conflictor:i386 (1 unstable [i386])' aptget install foo-conflictor:i386 -s + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + provider +The following NEW packages will be installed: + foo-foreign-conflictor:i386 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv provider [1] +Inst foo-foreign-conflictor:i386 (1 unstable [i386]) +Conf foo-foreign-conflictor:i386 (1 unstable [i386])' aptget install foo-foreign-conflictor:i386 -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-no-conflictor:i386 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo-no-conflictor:i386 (1 unstable [i386]) +Conf foo-no-conflictor:i386 (1 unstable [i386])' aptget install foo-no-conflictor:i386 -s -- cgit v1.2.3