From 8d87641558a7e0ee53b03e325614532aa686e01b Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 25 Jul 2010 19:51:53 +0200 Subject: - prefer non-virtual packages in FindPreferredPkg (Closes: #590041) * test/integration/*: - add with bug#590041 testcase a small test "framework" --- test/integration/framework | 170 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 test/integration/framework (limited to 'test/integration/framework') diff --git a/test/integration/framework b/test/integration/framework new file mode 100644 index 000000000..97dce1e19 --- /dev/null +++ b/test/integration/framework @@ -0,0 +1,170 @@ +#!/bin/sh -- # no runable script, just for vi + +# we all like colorful messages +CERROR="" # red +CWARNING="" # yellow +CMSG="" # green +CINFO="" # light blue +CDEBUG="" # blue +CNORMAL="" # default system console color +CDONE="" # green +CPASS="" # green +CFAIL="" # red +CCMD="" # pink + +msgdie() { echo "${CERROR}E: $1${CNORMAL}" >&2; exit 1; } +msgwarn() { echo "${CWARNING}W: $1${CNORMAL}" >&2; } +msgmsg() { echo "${CMSG}$1${CNORMAL}" >&2; } +msginfo() { echo "${CINFO}I: $1${CNORMAL}" >&2; } +msgdebug() { echo "${CDEBUG}D: $1${CNORMAL}" >&2; } +msgdone() { echo "${CDONE}DONE${CNORMAL}" >&2; } +msgnwarn() { echo -n "${CWARNING}W: $1${CNORMAL}" >&2; } +msgnmsg() { echo -n "${CMSG}$1${CNORMAL}" >&2; } +msgninfo() { echo -n "${CINFO}I: $1${CNORMAL}" >&2; } +msgndebug() { echo -n "${CDEBUG}D: $1${CNORMAL}" >&2; } +msgtest() { echo -n "${CINFO}$1 ${CCMD}$(echo "$2" | sed -e 's/^aptc/apt-c/' -e 's/^aptg/apt-g/' -e 's/^aptf/apt-f/')${CINFO} …${CNORMAL} " >&2; } +msgpass() { echo "${CPASS}PASS${CNORMAL}" >&2; } +msgskip() { echo "${CWARNING}SKIP${CNORMAL}" >&2; } +msgfail() { echo "${CFAIL}FAIL${CNORMAL}" >&2; } + +# enable / disable Debugging +msginfo() { true; } +msgdebug() { true; } +msgninfo() { true; } +msgndebug() { true; } +msgdone() { if [ "$1" = "debug" -o "$1" = "info" ]; then true; else echo "${CDONE}DONE${CNORMAL}" >&2; fi } + +runapt() { + msgdebug "Executing: ${CCMD}$*${CDEBUG} " + APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$* +} +aptconfig() { runapt apt-config $*; } +aptcache() { runapt apt-cache $*; } +aptget() { runapt apt-get $*; } +aptftparchive() { runapt apt-ftparchive $*; } + +setupenvironment() { + local TMPWORKINGDIRECTORY=$(mktemp -d) + msgninfo "Preparing environment for ${CCMD}$0${CINFO} in ${TMPWORKINGDIRECTORY}… " + BUILDDIRECTORY=$(readlink -f $(dirname $0)/../../build/bin) + test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first" + local OLDWORKINGDIRECTORY=$(pwd) + trap "cd /; rm -rf $TMPWORKINGDIRECTORY; cd $OLDWORKINGDIRECTORY" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM + cd $TMPWORKINGDIRECTORY + mkdir rootdir aptarchive + cd rootdir + mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d var/cache var/lib/dpkg + mkdir -p var/cache/apt/archives/partial var/lib/apt/lists/partial + touch var/lib/dpkg/status + mkdir -p usr/lib/apt + ln -s ${BUILDDIRECTORY}/methods usr/lib/apt/methods + cd .. + echo "RootDir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf + echo "Debug::NoLocking \"true\";" >> aptconfig.conf + echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf + export LC_ALL=C + msgdone "info" +} + +configarchitecture() { + local CONFFILE=rootdir/etc/apt/apt.conf.d/01multiarch.conf + echo "APT::Architecture \"$1\";" > $CONFFILE + shift + while [ -n "$1" ]; do + echo "APT::Architectures:: \"$1\";" >> $CONFFILE + shift + done +} + +buildflataptarchive() { + msginfo "Build APT archive for ${CCMD}$0${CINFO}…" + cd aptarchive + APTARCHIVE=$(readlink -f .) + if [ -f Packages ]; then + msgninfo "\tPackages file… " + cat Packages | gzip > Packages.gz + cat Packages | bzip2 > Packages.bz2 + cat Packages | lzma > Packages.lzma + msgdone "info" + fi + if [ -f Sources ]; then + msgninfo "\tSources file… " + cat Sources | gzip > Sources.gz + cat Sources | bzip2 > Sources.bz2 + cat Sources | lzma > Sources.lzma + msgdone "info" + fi + cd .. + aptftparchive release . > Release +} + +setupflataptarchive() { + buildflataptarchive + APTARCHIVE=$(readlink -f ./aptarchive) + if [ -f ${APTARCHIVE}/Packages ]; then + msgninfo "\tadd deb sources.list line… " + echo "deb file://$APTARCHIVE /" > rootdir/etc/apt/sources.list.d/apt-test-archive-deb.list + msgdone "info" + else + rm -f rootdir/etc/apt/sources.list.d/apt-test-archive-deb.list + fi + if [ -f ${APTARCHIVE}/Sources ]; then + msgninfo "\tadd deb-src sources.list line… " + echo "deb-src file://$APTARCHIVE /" > rootdir/etc/apt/sources.list.d/apt-test-archive-deb-src.list + msgdone "info" + else + rm -f rootdir/etc/apt/sources.list.d/apt-test-archive-deb-src.list + fi + aptget update -qq +} + +diff() { + local DIFFTEXT="$($(which diff) -u $* | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')" + if [ -n "$DIFFTEXT" ]; then + echo + echo "$DIFFTEXT" + return 1 + else + return 0 + fi +} + +testequal() { + local COMPAREFILE=$(mktemp) + echo "$1" > $COMPAREFILE + shift + msgtest "Test for equality of" "$*" + $* 2>&1 | diff $COMPAREFILE - && msgpass || msgfail +} + +testshowvirtual() { + local VIRTUAL="E: Can't select versions from package '$1' as it purely virtual" + local PACKAGE="$1" + shift + while [ -n "$1" ]; do + VIRTUAL="${VIRTUAL} +E: Can't select versions from package '$1' as it purely virtual" + PACKAGE="${PACKAGE} $1" + shift + done + msgtest "Test for virtual packages" "apt-cache show $PACKAGE" + VIRTUAL="${VIRTUAL} +E: No packages found" + local COMPAREFILE=$(mktemp) + local ARCH=$(dpkg-architecture -qDEB_HOST_ARCH_CPU) + eval `apt-config shell ARCH APT::Architecture` + echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' > $COMPAREFILE + aptcache show $PACKAGE 2>&1 | diff $COMPAREFILE - && msgpass || msgfail +} + +testnopackage() { + msgtest "Test for non-existent packages" "apt-cache show $*" + local SHOWPKG="$(aptcache show $* 2>&1 | grep '^Package: ')" + if [ -n "$SHOWPKG" ]; then + echo + echo "$SHOWPKG" + msgfail + return 1 + fi + msgpass +} -- cgit v1.2.3-70-g09d2 From 8f8169ac464249c8a2b35b13f9c5278d4c9e5a46 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Wed, 28 Jul 2010 21:47:42 +0200 Subject: auto-install Packages and status file of the testcase --- test/integration/framework | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'test/integration/framework') diff --git a/test/integration/framework b/test/integration/framework index 97dce1e19..7e0d4b902 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -45,8 +45,9 @@ aptftparchive() { runapt apt-ftparchive $*; } setupenvironment() { local TMPWORKINGDIRECTORY=$(mktemp -d) + local TESTDIR=$(readlink -f $(dirname $0)) msgninfo "Preparing environment for ${CCMD}$0${CINFO} in ${TMPWORKINGDIRECTORY}… " - BUILDDIRECTORY=$(readlink -f $(dirname $0)/../../build/bin) + BUILDDIRECTORY="${TESTDIR}/../../build/bin" test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first" local OLDWORKINGDIRECTORY=$(pwd) trap "cd /; rm -rf $TMPWORKINGDIRECTORY; cd $OLDWORKINGDIRECTORY" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM @@ -55,10 +56,21 @@ setupenvironment() { cd rootdir mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d var/cache var/lib/dpkg mkdir -p var/cache/apt/archives/partial var/lib/apt/lists/partial - touch var/lib/dpkg/status + local STATUSFILE=$(echo "$(basename $0)" | sed 's/^test-/status-/') + if [ -f "${TESTDIR}/${STATUSFILE}" ]; then + cp "${TESTDIR}/${STATUSFILE}" var/lib/dpkg/status + else + touch var/lib/dpkg/status + fi mkdir -p usr/lib/apt ln -s ${BUILDDIRECTORY}/methods usr/lib/apt/methods cd .. + local PACKAGESFILE=$(echo "$(basename $0)" | sed 's/^test-/Packages-/') + if [ -f "${TESTDIR}/${PACKAGESFILE}" ]; then + cp "${TESTDIR}/${PACKAGESFILE}" aptarchive/Packages + else + touch var/lib/dpkg/status + fi echo "RootDir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf echo "Debug::NoLocking \"true\";" >> aptconfig.conf echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf -- cgit v1.2.3-70-g09d2 From 685625bd308f62a382aaf61f1621a18b9441edfd Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 29 Jul 2010 12:26:26 +0200 Subject: configure also the replacement before remove by adding Immediate flag --- apt-pkg/orderlist.cc | 2 + debian/changelog | 3 +- ...g-590438-broken-provides-thanks-to-remove-order | 32 ++++++++++ test/integration/framework | 16 +++++ ...g-590438-broken-provides-thanks-to-remove-order | 69 +++++++++++++++++----- 5 files changed, 106 insertions(+), 16 deletions(-) (limited to 'test/integration/framework') diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc index cb55147c3..602b63d3b 100644 --- a/apt-pkg/orderlist.cc +++ b/apt-pkg/orderlist.cc @@ -936,6 +936,7 @@ bool pkgOrderList::DepRemove(DepIterator D) Cache[P].InstallVer != 0 && VisitNode(P) == true) { + Flag(P, Immediate); tryFixDeps = false; break; } @@ -970,6 +971,7 @@ bool pkgOrderList::DepRemove(DepIterator D) IsFlag(F.TargetPkg(), InList) == false || VisitNode(F.TargetPkg()) == false) continue; + Flag(F.TargetPkg(), Immediate); tryFixDeps = false; break; } diff --git a/debian/changelog b/debian/changelog index 86b154dab..b836aaab8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,8 +17,9 @@ apt (0.7.26~exp11) experimental; urgency=low * apt-pkg/orderlist.cc: - try to install another or-group member in DepRemove before breaking the or group (Closes: #590438) + - configure also the replacement before remove by adding Immediate flag - -- David Kalnischkies Wed, 28 Jul 2010 21:41:35 +0200 + -- David Kalnischkies Thu, 29 Jul 2010 12:24:49 +0200 apt (0.7.26~exp10) experimental; urgency=low diff --git a/test/integration/Packages-bug-590438-broken-provides-thanks-to-remove-order b/test/integration/Packages-bug-590438-broken-provides-thanks-to-remove-order index 16bf008f6..75a769e1a 100644 --- a/test/integration/Packages-bug-590438-broken-provides-thanks-to-remove-order +++ b/test/integration/Packages-bug-590438-broken-provides-thanks-to-remove-order @@ -33,3 +33,35 @@ SHA256: a2337dfe1cc82aeae46f2c722e5cc7be9ecefdea4aaf13f540cfe70bd8b1d627 Description-de: GNU awk, eine Mustererkennungs- und Verarbeitungssprache Homepage: http://www.gnu.org/software/gawk/ Tag: devel::interpreter, implemented-in::c, interface::commandline, role::program, scope::utility, suite::gnu, use::filtering, use::scanning, works-with::text + +Package: gawk2 +Priority: optional +Section: interpreters +Installed-Size: 2084 +Maintainer: Arthur Loiret +Architecture: i386 +Version: 1:3.1.7.dfsg-5 +Provides: awk +Pre-Depends: libc6 (>= 2.3) +Depends: coolstuff +Filename: pool/main/g/gawk/gawk_3.1.7.dfsg-5_i386.deb +Size: 766008 +MD5sum: 6459a02cfc1b9eafb3c0415e4ff4e252 +SHA1: ac033488dae4b7e8167d610e490319c047edf7e4 +SHA256: a2337dfe1cc82aeae46f2c722e5cc7be9ecefdea4aaf13f540cfe70bd8b1d627 +Description-de: GNU awk, eine Mustererkennungs- und Verarbeitungssprache +Homepage: http://www.gnu.org/software/gawk/ +Tag: devel::interpreter, implemented-in::c, interface::commandline, role::program, scope::utility, suite::gnu, use::filtering, use::scanning, works-with::text + +Package: coolstuff +Priority: optional +Section: cool +Installed-Size: 10 +Maintainer: David Kalnischkies +Architecture: all +Version: 1-1 +Filename: pool/main/c/coolstuff/coolstuff_1-1_all.deb +Size: 7608 +MD5sum: 6459aa2efc139eafb323ac3f4f5aeb22 +Description: We all need cool stuff + diff --git a/test/integration/framework b/test/integration/framework index 7e0d4b902..7b323fdb5 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -149,6 +149,22 @@ testequal() { $* 2>&1 | diff $COMPAREFILE - && msgpass || msgfail } +testequalor2() { + local COMPAREFILE1=$(mktemp) + local COMPAREFILE2=$(mktemp) + local COMPAREAGAINST=$(mktemp) + echo "$1" > $COMPAREFILE1 + echo "$2" > $COMPAREFILE2 + shift 2 + msgtest "Test for equality OR of" "$*" + $* 2>&1 1> $COMPAREAGAINST + (diff $COMPAREFILE1 $COMPAREAGAINST 1> /dev/null || + diff $COMPAREFILE2 $COMPAREAGAINST 1> /dev/null) && msgpass || + ( echo "\n${CINFO}Diff against OR 1${CNORMAL}" "$(diff $COMPAREFILE1 $COMPAREAGAINST)" \ + "\n${CINFO}Diff against OR 2${CNORMAL}" "$(diff $COMPAREFILE2 $COMPAREAGAINST)" && + msgfail ) +} + testshowvirtual() { local VIRTUAL="E: Can't select versions from package '$1' as it purely virtual" local PACKAGE="$1" diff --git a/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order b/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order index bb10c4f73..17ce50295 100755 --- a/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order +++ b/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order @@ -24,7 +24,7 @@ Size: 73986 MD5sum: 8489687ce10e656babd467c9ee389349 Description-de: Verschiedene Dateien für das Basis-System von Debian" -predependstest() { +predependsgawk() { # rm rootdir/var/cache/apt/*.bin cp $TESTDIR/$(echo "$(basename $0)" | sed 's/test-/status-/') rootdir/var/lib/dpkg/status echo "$pkgbasefile @@ -35,25 +35,64 @@ Conf gawk (1:3.1.7.dfsg-5 localhost [i386]) Remv mawk [1.3.3-15]" aptget install gawk mawk- -sqq -o PreDepends=$(echo "$1" | sed 's/ //g') } -predependstest "gawk | mawk" -predependstest "mawk | gawk" +predependsgawk "gawk | mawk" +predependsgawk "mawk | gawk" -predependstest "aawk | mawk | gawk" -predependstest "aawk | gawk | mawk" +predependsgawk "aawk | mawk | gawk" +predependsgawk "aawk | gawk | mawk" -predependstest "gawk | awk" -predependstest "aawk | gawk | awk" +predependsgawk "gawk | awk" +predependsgawk "aawk | gawk | awk" -predependstest "mawk | awk" +predependsgawk "mawk | awk" -predependstest "awk | gawk" -predependstest "awk | gawk | aawk" +predependsgawk "awk | gawk" +predependsgawk "awk | gawk | aawk" -predependstest "awk | mawk" +predependsgawk "awk | mawk" -predependstest "aawk | awk" -predependstest "awk | aawk" +predependsgawk "aawk | awk" +predependsgawk "awk | aawk" -predependstest "awk" +predependsgawk "awk" -# aptget install gawk mawk- -sqq -o Debug::pkgOrderList=1 #-o Debug::pkgPackageManager=1 +predependsgawk2() { +# rm rootdir/var/cache/apt/*.bin + cp $TESTDIR/$(echo "$(basename $0)" | sed 's/test-/status-/') rootdir/var/lib/dpkg/status + echo "$pkgbasefile +Pre-Depends: $1 +" >> rootdir/var/lib/dpkg/status + testequalor2 "Inst coolstuff (1-1 localhost [all]) +Conf coolstuff (1-1 localhost [all]) +Inst gawk2 (1:3.1.7.dfsg-5 localhost [i386]) +Conf gawk2 (1:3.1.7.dfsg-5 localhost [i386]) +Remv mawk [1.3.3-15]" "Inst coolstuff (1-1 localhost [all]) +Inst gawk2 (1:3.1.7.dfsg-5 localhost [i386]) +Conf coolstuff (1-1 localhost [all]) +Conf gawk2 (1:3.1.7.dfsg-5 localhost [i386]) +Remv mawk [1.3.3-15]" aptget install gawk2 mawk- -sqq -o PreDepends=$(echo "$1" | sed 's/ //g') +} + +predependsgawk2 "gawk2 | mawk" +predependsgawk2 "mawk | gawk2" + +predependsgawk2 "aawk | mawk | gawk2" +predependsgawk2 "aawk | gawk2 | mawk" + +predependsgawk2 "gawk2 | awk" +predependsgawk2 "aawk | gawk2 | awk" + +predependsgawk2 "mawk | awk" + +predependsgawk2 "awk | gawk2" +predependsgawk2 "awk | gawk2 | aawk" + +predependsgawk2 "awk | mawk" + +predependsgawk2 "aawk | awk" +predependsgawk2 "awk | aawk" + +predependsgawk2 "awk" + + +# aptget install gawk2 mawk- -s #-o Debug::pkgOrderList=1 #-o Debug::pkgPackageManager=1 -- cgit v1.2.3-70-g09d2 From 8e86786b2f0002a7512f97d0f9b5ef3e4794e26e Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 29 Jul 2010 15:09:18 +0200 Subject: remove the temporary compare files we create --- test/integration/framework | 3 +++ 1 file changed, 3 insertions(+) (limited to 'test/integration/framework') diff --git a/test/integration/framework b/test/integration/framework index 7b323fdb5..b4e9302e8 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -147,6 +147,7 @@ testequal() { shift msgtest "Test for equality of" "$*" $* 2>&1 | diff $COMPAREFILE - && msgpass || msgfail + rm $COMPAREFILE } testequalor2() { @@ -163,6 +164,7 @@ testequalor2() { ( echo "\n${CINFO}Diff against OR 1${CNORMAL}" "$(diff $COMPAREFILE1 $COMPAREAGAINST)" \ "\n${CINFO}Diff against OR 2${CNORMAL}" "$(diff $COMPAREFILE2 $COMPAREAGAINST)" && msgfail ) + rm $COMPAREFILE1 $COMPAREFILE2 $COMPAREAGAINST } testshowvirtual() { @@ -183,6 +185,7 @@ E: No packages found" eval `apt-config shell ARCH APT::Architecture` echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' > $COMPAREFILE aptcache show $PACKAGE 2>&1 | diff $COMPAREFILE - && msgpass || msgfail + rm $COMPAREFILE } testnopackage() { -- cgit v1.2.3-70-g09d2