mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d
mkdir -p usr/bin var/cache var/lib var/log tmp
mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers
+ mkdir -p usr/lib/apt/solvers usr/lib/apt/planners
touch var/lib/dpkg/available
- mkdir -p usr/lib/apt
ln -s "${METHODSDIR}" usr/lib/apt/methods
- if [ "$BUILDDIRECTORY" = "$LIBRARYPATH" ]; then
- mkdir -p usr/lib/apt/solvers usr/lib/apt/planners
- ln -s "${BUILDDIRECTORY}/apt-dump-solver" usr/lib/apt/solvers/dump
- ln -s "${BUILDDIRECTORY}/apt-dump-solver" usr/lib/apt/planners/dump
- ln -s "${BUILDDIRECTORY}/apt-internal-solver" usr/lib/apt/solvers/apt
- ln -s "${BUILDDIRECTORY}/apt-internal-planner" usr/lib/apt/planners/apt
- echo "Dir::Bin::Solvers \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/solvers\";" >> ../aptconfig.conf
- echo "Dir::Bin::Planners \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/planners\";" >> ../aptconfig.conf
- fi
+ ln -s "${APTDUMPSOLVER}" usr/lib/apt/solvers/dump
+ ln -s "${APTDUMPSOLVER}" usr/lib/apt/planners/dump
+ ln -s "${APTINTERNALSOLVER}" usr/lib/apt/solvers/apt
+ ln -s "${APTINTERNALPLANNER}" usr/lib/apt/planners/apt
+ echo "Dir::Bin::Solvers \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/solvers\";" >> ../aptconfig.conf
+ echo "Dir::Bin::Planners \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/planners\";" >> ../aptconfig.conf
# use the autoremove from the BUILDDIRECTORY if its there, otherwise
# system
if [ -e "${BUILDDIRECTORY}/../../debian/apt.conf.autoremove" ]; then
ln -s "${TMPWORKINGDIRECTORY}/keys/joesixpack.pub" rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf
- echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf
echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf
echo "Dir::Bin::Methods \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/methods\";" >> aptconfig.conf
# either store apt-key were we can access it, even if we run it as a different user
rm -f rootdir/etc/apt/apt.conf.d/00foreigndpkg
if command dpkg --assert-multi-arch >/dev/null 2>&1 ; then
local ARCHS="$(getarchitectures)"
- if echo "$ARCHS" | grep -E -q '[^ ]+ [^ ]+'; then
- DPKGARCH="$(dpkg --print-architecture)"
- for ARCH in ${ARCHS}; do
- if [ "${ARCH}" != "${DPKGARCH}" ]; then
- if ! dpkg --add-architecture ${ARCH} >/dev/null 2>&1; then
- # old-style used e.g. in Ubuntu-P – and as it seems travis
- echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
- echo "DPKG::options:: \"${ARCH}\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
- fi
+ local DPKGARCH="$(dpkg --print-architecture)"
+ # this ensures that even if multi-arch isn't active in the view
+ # of apt, given that dpkg can't be told which arch is native
+ # the arch apt treats as native might be foreign for dpkg
+ for ARCH in ${ARCHS}; do
+ if [ "${ARCH}" != "${DPKGARCH}" ]; then
+ if ! dpkg --add-architecture ${ARCH} >/dev/null 2>&1; then
+ # old-style used e.g. in Ubuntu-P – and as it seems travis
+ echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
+ echo "DPKG::options:: \"${ARCH}\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
fi
- done
+ fi
+ done
+ # if multi-arch make sure dpkg can detect itself as capable of it
+ if echo "$ARCHS" | grep -E -q '[^ ]+ [^ ]+'; then
if [ "0" = "$(dpkg -l dpkg 2> /dev/null | grep '^i' | wc -l)" ]; then
# dpkg doesn't really check the version as long as it is fully installed,
# but just to be sure we choose one above the required version
read IGNORE
}
+logcurrentarchivedirectory() {
+ find "${TMPWORKINGDIRECTORY}/aptarchive/dists" -type f | while read line; do
+ stat --format '%U:%G:%a:%n' "$line"
+ done | sort > "${TMPWORKINGDIRECTORY}/rootdir/var/log/aptgetupdate.before.lst"
+}
listcurrentlistsdirectory() {
{
find rootdir/var/lib/apt/lists -maxdepth 1 -type d | while read line; do
### general things about commands executed without writing the test every time.
aptautotest() {
+ if [ $# -lt 3 ]; then return; fi
local TESTCALL="$1"
local CMD="$2"
local FIRSTOPT="$3"
+ shift 2
+ for i in "$@"; do
+ if ! expr match "$i" '^-' >/dev/null 2>&1; then
+ FIRSTOPT="$i"
+ break
+ fi
+ done
+ shift
local AUTOTEST="aptautotest_$(echo "${CMD##*/}_${FIRSTOPT}" | tr -d -c 'A-za-z0-9')"
if command -v $AUTOTEST >/dev/null; then
- shift 3
# save and restore the *.output files from other tests
# as we might otherwise override them in these automatic tests
rm -rf "${TMPWORKINGDIRECTORY}/rootdir/tmp-before"
# failure cases can retain partial files and such
testempty find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" -mindepth 1 ! \( -name 'lock' -o -name '*.FAILED' \)
fi
+ if [ -s "${TMPWORKINGDIRECTORY}/rootdir/var/log/aptgetupdate.before.lst" ]; then
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/var/log/aptgetupdate.before.lst" \
+ "$(find "${TMPWORKINGDIRECTORY}/aptarchive/dists" -type f | while read line; do stat --format '%U:%G:%a:%n' "$line"; done | sort)"
+ fi
}
aptautotest_apt_update() { aptautotest_aptget_update "$@"; }
aptautotest_aptcdrom_add() { aptautotest_aptget_update "$@"; }
aptautotest_apt_install() { testaptautotestnodpkgwarning "$@"; }
aptautotest_apt_remove() { testaptautotestnodpkgwarning "$@"; }
aptautotest_apt_purge() { testaptautotestnodpkgwarning "$@"; }
+
+testaptmarknodefaultsections() {
+ testfailure grep '^Auto-Installed: 0$' "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/extended_states"
+}
+aptautotest_aptmark_auto() { testaptmarknodefaultsections "$@"; }
+aptautotest_aptmark_manual() { testaptmarknodefaultsections "$@"; }
+aptautotest_aptget_markauto() { testaptmarknodefaultsections "$@"; }
+aptautotest_aptget_markmanual() { testaptmarknodefaultsections "$@"; }