#!/bin/sh set -e TESTDIR="$(readlink -f "$(dirname "$0")")" . "$TESTDIR/framework" setupenvironment allowremovemanual configarchitecture 'amd64' 'i386' insertpackage 'unstable' 'foo' 'amd64,i386' '1' 'Multi-Arch: allowed' insertpackage 'unstable' 'needsfoo' 'amd64,i386' '1' 'Depends: foo' insertpackage 'unstable' 'needsfooany' 'amd64,i386' '1' 'Depends: foo:any' insertpackage 'unstable' 'needsfoover1' 'amd64,i386' '1' 'Depends: foo:any (>= 1)' insertpackage 'unstable' 'needsfoover2' 'amd64,i386' '1' 'Depends: foo:any (>= 2)' insertpackage 'unstable' 'hatesfoo' 'amd64' '1' 'Conflicts: foo' insertpackage 'unstable' 'hatesfooany' 'amd64' '1' 'Conflicts: foo:any' # this makes no senseā€¦? insertpackage 'unstable' 'hatesfoonative' 'amd64' '1' 'Conflicts: foo:amd64' insertpackage 'unstable' 'coolfoo' 'amd64' '1' 'Multi-Arch:allowed Provides: coolbar' insertpackage 'unstable' 'coolfoover' 'amd64' '1' 'Multi-Arch:allowed Provides: coolbar (= 2)' insertpackage 'unstable' 'needscoolfoo' 'amd64,i386' '1' 'Depends: coolfoo, coolbar' insertpackage 'unstable' 'needscoolfooany' 'amd64,i386' '1' 'Depends: coolfoo:any, coolbar:any' insertpackage 'unstable' 'needscoolfoover0' 'amd64' '1' 'Depends: coolfoo:any (>= 1), coolbar:any' insertpackage 'unstable' 'needscoolfoover1' 'amd64' '1' 'Depends: coolfoo:any (>= 1), coolbar:any (>= 1)' insertpackage 'unstable' 'needscoolfoover2' 'amd64' '1' 'Depends: coolfoo:any (>= 2), coolbar:any (>= 1)' insertpackage 'unstable' 'needscoolfoover3' 'amd64' '1' 'Depends: coolfoo:any (>= 2), coolbar:any (>= 3)' setupaptarchive BADPREFIX='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: ' solveableinsinglearch0() { testsuccessequal 'Reading package lists... Building dependency tree... The following additional packages will be installed: foo The following NEW packages will be installed: foo needsfoo 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo (1 unstable [amd64]) Inst needsfoo (1 unstable [amd64]) Conf foo (1 unstable [amd64]) Conf needsfoo (1 unstable [amd64])' aptget install needsfoo -s } solveableinsinglearch0 testsuccessequal 'Reading package lists... Building dependency tree... The following additional packages will be installed: foo:i386 The following NEW packages will be installed: foo:i386 needsfoo:i386 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo:i386 (1 unstable [i386]) Inst needsfoo:i386 (1 unstable [i386]) Conf foo:i386 (1 unstable [i386]) Conf needsfoo:i386 (1 unstable [i386])' aptget install needsfoo:i386 -s # FIXME: same problem, but two different unmet dependency messages depending on install order testfailuremsg "E: Conflict: -> needsfoo:i386=1 but foo:amd64=1 -> not foo:i386=1 -> not needsfoo:i386=1" aptget install needsfoo:i386 foo:amd64 -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: foo : Conflicts: foo:i386 but 1 is to be installed foo:i386 : Conflicts: foo but 1 is to be installed E: Unable to correct problems, you have held broken packages." aptget install needsfoo:i386 foo:amd64 -s --solver internal testfailuremsg "E: Conflict: -> needsfoo:i386=1 but foo:amd64=1 -> not foo:i386=1 -> not needsfoo:i386=1" aptget install foo:amd64 needsfoo:i386 -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: needsfoo:i386 : Depends: foo:i386 but it is not installable E: Unable to correct problems, you have held broken packages." aptget install foo:amd64 needsfoo:i386 -s --solver internal testfailuremsg "E: Conflict: -> needsfoo:amd64=1 but foo:i386=1 -> not foo:amd64=1 -> not needsfoo:amd64=1" aptget install needsfoo foo:i386 -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: foo : Conflicts: foo:i386 but 1 is to be installed foo:i386 : Conflicts: foo but 1 is to be installed E: Unable to correct problems, you have held broken packages." aptget install needsfoo foo:i386 -s --solver internal solveableinsinglearch1() { testsuccessequal "Reading package lists... Building dependency tree... The following additional packages will be installed: foo The following NEW packages will be installed: foo $1 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo (1 unstable [amd64]) Inst $1 (1 unstable [amd64]) Conf foo (1 unstable [amd64]) Conf $1 (1 unstable [amd64])" aptget install $1 -s } testneedsfooallgood() { solveableinsinglearch1 $1 testsuccessequal "Reading package lists... Building dependency tree... The following additional packages will be installed: foo The following NEW packages will be installed: foo $1:i386 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo (1 unstable [amd64]) Inst $1:i386 (1 unstable [i386]) Conf foo (1 unstable [amd64]) Conf $1:i386 (1 unstable [i386])" aptget install $1:i386 -s testsuccessequal "Reading package lists... Building dependency tree... The following NEW packages will be installed: foo:i386 $1:i386 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo:i386 (1 unstable [i386]) Inst $1:i386 (1 unstable [i386]) Conf foo:i386 (1 unstable [i386]) Conf $1:i386 (1 unstable [i386])" aptget install $1:i386 foo:i386 -s testsuccessequal "Reading package lists... Building dependency tree... The following NEW packages will be installed: foo:i386 $1 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo:i386 (1 unstable [i386]) Inst $1 (1 unstable [amd64]) Conf foo:i386 (1 unstable [i386]) Conf $1 (1 unstable [amd64])" aptget install $1 foo:i386 -s } testneedsfooallgood 'needsfooany' testneedsfooallgood 'needsfoover1' if [ "$APT_SOLVER" = "3.0" ]; then NEEDSFOO2NATIVE="$BADPREFIX The following packages have unmet dependencies: needsfoover2 : Depends: foo:any (>= 2) E: Unsatisfiable dependency group needsfoover2:amd64=1 -> foo:any:any" NEEDSFOO2FOREIGN="$BADPREFIX The following packages have unmet dependencies: needsfoover2:i386 : Depends: foo:any (>= 2) E: Unsatisfiable dependency group needsfoover2:i386=1 -> foo:any:any" else NEEDSFOO2NATIVE="$BADPREFIX The following packages have unmet dependencies: needsfoover2 : Depends: foo:any (>= 2) E: Unable to correct problems, you have held broken packages." NEEDSFOO2FOREIGN="$BADPREFIX The following packages have unmet dependencies: needsfoover2:i386 : Depends: foo:any (>= 2) E: Unable to correct problems, you have held broken packages." fi testfailureequal "$NEEDSFOO2NATIVE" aptget install needsfoover2 -s testfailureequal "$NEEDSFOO2FOREIGN" aptget install needsfoover2:i386 -s testfailureequal "$NEEDSFOO2FOREIGN" aptget install needsfoover2:i386 foo:i386 -s testfailureequal "$NEEDSFOO2NATIVE" aptget install needsfoover2 foo:i386 -s solveableinsinglearch2() { testfailuremsg 'E: Conflict: hatesfoo:amd64=1 -> not foo:amd64=1 but foo:amd64=1' aptget install foo hatesfoo -s --solver 3.0 testfailuremsg 'E: Conflict: hatesfooany:amd64=1 -> not foo:amd64=1 but foo:amd64=1' aptget install foo hatesfooany -s --solver 3.0 testfailuremsg 'E: Conflict: hatesfoonative:amd64=1 -> not foo:amd64=1 but foo:amd64=1' aptget install foo hatesfoonative -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: hatesfoo : Conflicts: foo but 1 is to be installed E: Unable to correct problems, you have held broken packages." aptget install foo hatesfoo -s --solver internal # the message differs slightly between single and multiarch testfailuremsg 'E: Unable to correct problems, you have held broken packages.' aptget install foo hatesfooany -s --solver internal testfailureequal "$BADPREFIX The following packages have unmet dependencies: hatesfoonative : Conflicts: foo:amd64 E: Unable to correct problems, you have held broken packages." aptget install foo hatesfoonative -s --solver internal } solveableinsinglearch2 testfailuremsg "E: Conflict: hatesfoo:amd64=1 -> not foo:i386=1 but foo:i386=1" aptget install foo:i386 hatesfoo -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: hatesfoo : Conflicts: foo:i386 but 1 is to be installed E: Unable to correct problems, you have held broken packages." aptget install foo:i386 hatesfoo -s --solver internal testfailuremsg "E: Conflict: hatesfooany:amd64=1 -> not foo:i386=1 but foo:i386=1" aptget install foo:i386 hatesfooany -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: hatesfooany : Conflicts: foo:any E: Unable to correct problems, you have held broken packages." aptget install foo:i386 hatesfooany -s --solver internal testsuccessequal 'Reading package lists... Building dependency tree... The following NEW packages will be installed: foo:i386 hatesfoonative 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst foo:i386 (1 unstable [i386]) Inst hatesfoonative (1 unstable [amd64]) Conf foo:i386 (1 unstable [i386]) Conf hatesfoonative (1 unstable [amd64])' aptget install foo:i386 hatesfoonative -s testfailuremsg "E: Unsatisfiable dependency group needscoolfoo:i386=1 -> coolfoo:i386" aptget install needscoolfoo:i386 -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: needscoolfoo:i386 : Depends: coolfoo:i386 but it is not installable Depends: coolbar:i386 but it is not installable E: Unable to correct problems, you have held broken packages." aptget install needscoolfoo:i386 -s --solver internal solveneedscoolfooanyin() { local NEEDSCOOL='needscoolfooany' if [ "$1" != 'amd64' ]; then NEEDSCOOL="${NEEDSCOOL}:$1"; fi testsuccessequal "Reading package lists... Building dependency tree... The following additional packages will be installed: coolfoo The following NEW packages will be installed: coolfoo $NEEDSCOOL 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst coolfoo (1 unstable [amd64]) Inst $NEEDSCOOL (1 unstable [$1]) Conf coolfoo (1 unstable [amd64]) Conf $NEEDSCOOL (1 unstable [$1])" aptget install $NEEDSCOOL -s } solveneedscoolfooanyin 'i386' solveableinsinglearch3() { testsuccessequal "Reading package lists... Building dependency tree... The following additional packages will be installed: coolfoo The following NEW packages will be installed: coolfoo needscoolfoo 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst coolfoo (1 unstable [amd64]) Inst needscoolfoo (1 unstable [amd64]) Conf coolfoo (1 unstable [amd64]) Conf needscoolfoo (1 unstable [amd64])" aptget install needscoolfoo -s testsuccessequal "Reading package lists... Building dependency tree... The following additional packages will be installed: coolfoo The following NEW packages will be installed: coolfoo coolfoover needscoolfoo 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Inst coolfoo (1 unstable [amd64]) Inst coolfoover (1 unstable [amd64]) Inst needscoolfoo (1 unstable [amd64]) Conf coolfoo (1 unstable [amd64]) Conf coolfoover (1 unstable [amd64]) Conf needscoolfoo (1 unstable [amd64])" aptget install needscoolfoo coolfoover -s solveneedscoolfooanyin 'amd64' testsuccessequal 'Reading package lists... Building dependency tree... The following additional packages will be installed: coolfoo The following NEW packages will be installed: coolfoo needscoolfoover0 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Inst coolfoo (1 unstable [amd64]) Inst needscoolfoover0 (1 unstable [amd64]) Conf coolfoo (1 unstable [amd64]) Conf needscoolfoover0 (1 unstable [amd64])' aptget install needscoolfoover0 -s testsuccessequal 'Reading package lists... Building dependency tree... The following additional packages will be installed: coolfoo coolfoover The following NEW packages will be installed: coolfoo coolfoover needscoolfoover1 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Inst coolfoo (1 unstable [amd64]) Inst coolfoover (1 unstable [amd64]) Inst needscoolfoover1 (1 unstable [amd64]) Conf coolfoo (1 unstable [amd64]) Conf coolfoover (1 unstable [amd64]) Conf needscoolfoover1 (1 unstable [amd64])' aptget install needscoolfoover1 -s testfailuremsg "E: Unsatisfiable dependency group needscoolfoover2:amd64=1 -> coolfoo:any:any" aptget install needscoolfoover2 -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: needscoolfoover2 : Depends: coolfoo:any (>= 2) E: Unable to correct problems, you have held broken packages." aptget install needscoolfoover2 -s --solver internal testfailuremsg "E: Unsatisfiable dependency group needscoolfoover3:amd64=1 -> coolfoo:any:any" aptget install needscoolfoover3 -s --solver 3.0 testfailureequal "$BADPREFIX The following packages have unmet dependencies: needscoolfoover3 : Depends: coolfoo:any (>= 2) Depends: coolbar:any (>= 3) E: Unable to correct problems, you have held broken packages." aptget install needscoolfoover3 -s --solver internal } solveableinsinglearch3 msgmsg 'switch to single architecture' configarchitecture 'amd64' solveableinsinglearch0 testfailureequal 'Reading package lists... Building dependency tree... E: Unable to locate package needsfoo:i386' aptget install needsfoo:i386 -s solveableinsinglearch1 'needsfooany' solveableinsinglearch1 'needsfoover1' testfailureequal "$NEEDSFOO2NATIVE" aptget install needsfoover2 -s solveableinsinglearch2 solveableinsinglearch3 testempty dpkg -C 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' insertinstalledpackage 'bar-needer' 'armel' '1.0' 'Depends: coolbar' insertinstalledpackage 'bar-any-needer' 'armel' '1.0' 'Depends: coolbar:any' insertinstalledpackage 'bar-armel-needer' 'armel' '1.0' 'Depends: coolbar:armel' testsuccess aptget check 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: bar-armel-needer:armel bar-needer:armel coolfoo:armel The following NEW packages will be installed: coolfoo needscoolfoover0 0 upgraded, 2 newly installed, 3 to remove and 0 not upgraded. Remv bar-armel-needer:armel [1.0] Remv bar-needer:armel [1.0] Remv coolfoo:armel [1] [bar-any-needer:armel ] Inst coolfoo (1 unstable [amd64]) Inst needscoolfoover0 (1 unstable [amd64]) Conf coolfoo (1 unstable [amd64]) Conf needscoolfoover0 (1 unstable [amd64])' aptget install needscoolfoover0 -s