269 lines
12 KiB
Bash
Executable file
269 lines
12 KiB
Bash
Executable file
#!/bin/sh
|
|
set -e
|
|
|
|
TESTDIR="$(readlink -f "$(dirname "$0")")"
|
|
. "$TESTDIR/framework"
|
|
|
|
setupenvironment
|
|
allowremovemanual
|
|
configarchitecture 'amd64' 'i386'
|
|
|
|
# regression test for #754904
|
|
cat > foo.rpm <<EOF
|
|
I'm not a deb, I'm a teapot.
|
|
EOF
|
|
for exe in apt aptget; do
|
|
for cmd in install remove purge upgrade full-upgrade; do
|
|
testfailureequal 'E: Unsupported file /dev/null given on commandline' $exe $cmd -qq /dev/null
|
|
testfailureequal 'E: Unsupported file ./foo.rpm given on commandline' $exe $cmd -qq ./foo.rpm
|
|
done
|
|
done
|
|
|
|
# and ensure we fail for invalid debs
|
|
mv foo.rpm foo.deb
|
|
for exe in apt aptget; do
|
|
for cmd in install remove purge upgrade full-upgrade; do
|
|
testfailuremsg "E: Invalid archive signature
|
|
E: Internal error, could not locate member control.tar{.zst,.lz4,.gz,.xz,.bz2,.lzma,}
|
|
E: Could not read meta data from ${TMPWORKINGDIRECTORY}/foo.deb
|
|
E: The package lists or status file could not be parsed or opened." $exe $cmd ./foo.deb
|
|
done
|
|
done
|
|
|
|
buildsimplenativepackage 'foo' 'i386,amd64' '1.0'
|
|
|
|
testfailuremsg "E: Unable to satisfy dependencies. Reached two conflicting decisions:
|
|
1. foo:amd64 is not selected for install because:
|
|
1. foo:i386=1.0 is selected for install
|
|
2. foo:amd64 Conflicts foo:i386
|
|
2. foo:amd64=1.0 is selected for install" aptget install ./incoming/foo_1.0_i386.deb ./incoming/foo_1.0_amd64.deb -s --solver 3.0
|
|
testfailureequal "Reading package lists...
|
|
Building dependency tree...
|
|
Note, selecting 'foo:i386' instead of './incoming/foo_1.0_i386.deb'
|
|
Note, selecting 'foo' instead of './incoming/foo_1.0_amd64.deb'
|
|
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:i386 : Conflicts: foo but 1.0 is to be installed
|
|
foo : Conflicts: foo:i386 but 1.0 is to be installed
|
|
E: Unable to correct problems, you have held broken packages." aptget install ./incoming/foo_1.0_i386.deb ./incoming/foo_1.0_amd64.deb -s --solver internal
|
|
|
|
testsuccess apt show foo --with-source ./incoming/foo_1.0_amd64.deb
|
|
testequal 'Package: foo
|
|
Version: 1.0' grep -e '^Package:' -e '^Version:' -e '^Architecture:' rootdir/tmp/testsuccess.output
|
|
testsuccess apt show ./incoming/foo_1.0_amd64.deb
|
|
testequal 'Package: foo
|
|
Version: 1.0' grep -e '^Package:' -e '^Version:' -e '^Architecture:' rootdir/tmp/testsuccess.output
|
|
testsuccess apt show foo:i386 ./incoming/foo_1.0_amd64.deb --with-source ./incoming/foo_1.0_i386.deb
|
|
testequal 'Package: foo:i386
|
|
Version: 1.0
|
|
Package: foo
|
|
Version: 1.0' grep -e '^Package:' -e '^Version:' -e '^Architecture:' rootdir/tmp/testsuccess.output
|
|
|
|
testsuccess aptcache show foo --with-source ./incoming/foo_1.0_amd64.deb
|
|
testequal 'Package: foo
|
|
Version: 1.0
|
|
Architecture: amd64' grep -e '^Package:' -e '^Version:' -e '^Architecture:' rootdir/tmp/testsuccess.output
|
|
testsuccess aptcache show ./incoming/foo_1.0_amd64.deb
|
|
testequal 'Package: foo
|
|
Version: 1.0
|
|
Architecture: amd64' grep -e '^Package:' -e '^Version:' -e '^Architecture:' rootdir/tmp/testsuccess.output
|
|
testsuccess aptcache show foo:i386 ./incoming/foo_1.0_amd64.deb --with-source ./incoming/foo_1.0_i386.deb
|
|
testequal 'Package: foo
|
|
Version: 1.0
|
|
Architecture: i386
|
|
Package: foo
|
|
Version: 1.0
|
|
Architecture: amd64' grep -e '^Package:' -e '^Version:' -e '^Architecture:' rootdir/tmp/testsuccess.output
|
|
|
|
testsuccessequal 'Sorting...
|
|
Full Text Search...
|
|
foo/local-deb 1.0 amd64
|
|
an autogenerated dummy foo=1.0/unstable
|
|
' apt search foo --with-source ./incoming/foo_1.0_amd64.deb
|
|
testsuccessequal 'foo - an autogenerated dummy foo=1.0/unstable' aptcache search foo --with-source ./incoming/foo_1.0_amd64.deb
|
|
|
|
testdpkgnotinstalled 'foo' 'foo:i386'
|
|
testsuccess aptget install ./incoming/foo_1.0_i386.deb -o Debug::pkgCacheGen=1
|
|
testdpkginstalled 'foo:i386'
|
|
testfailure aptget install incoming/foo_1.0_i386.deb -o Debug::pkgCacheGen=1
|
|
cd downloaded
|
|
testsuccess aptget install "$(readlink -f ../incoming/foo_1.0_i386.deb)" -o Debug::pkgCacheGen=1 -y --reinstall
|
|
testfailure grep 'is already the newest version' ../rootdir/tmp/testsuccess.output
|
|
testsuccess aptget install ../incoming/foo_1.0_i386.deb -o Debug::pkgCacheGen=1 -y --reinstall
|
|
testfailure grep 'is already the newest version' ../rootdir/tmp/testsuccess.output
|
|
cd ..
|
|
|
|
testsuccessequal "Reading package lists...
|
|
Building dependency tree...
|
|
Reading state information...
|
|
Note, selecting 'foo' instead of './incoming/foo_1.0_amd64.deb'
|
|
The following packages will be REMOVED:
|
|
foo:i386
|
|
The following NEW packages will be installed:
|
|
foo
|
|
0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded.
|
|
Remv foo:i386 [1.0]
|
|
Inst foo (1.0 local-deb [amd64])
|
|
Conf foo (1.0 local-deb [amd64])" aptget install ./incoming/foo_1.0_amd64.deb -s
|
|
|
|
testsuccessequal 'Reading package lists...
|
|
Building dependency tree...
|
|
Reading state information...
|
|
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget install --with-source ./incoming/foo_1.0_amd64.deb -s
|
|
|
|
testsuccessequal 'Reading package lists...
|
|
Building dependency tree...
|
|
Reading state information...
|
|
The following packages will be REMOVED:
|
|
foo:i386
|
|
The following NEW packages will be installed:
|
|
foo
|
|
0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded.
|
|
Remv foo:i386 [1.0]
|
|
Inst foo (1.0 local-deb [amd64])
|
|
Conf foo (1.0 local-deb [amd64])' aptget install --with-source ./incoming/foo_1.0_amd64.deb foo -s
|
|
|
|
# Check that installing the local deb works if it is not the candidate
|
|
echo "Package: foo
|
|
Pin: version 1.0
|
|
Pin-Priority: -1" > rootdir/etc/apt/preferences
|
|
|
|
testsuccessequal "Reading package lists...
|
|
Building dependency tree...
|
|
Reading state information...
|
|
Note, selecting 'foo' instead of './incoming/foo_1.0_amd64.deb'
|
|
The following packages will be REMOVED:
|
|
foo:i386
|
|
The following NEW packages will be installed:
|
|
foo
|
|
0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded.
|
|
Remv foo:i386 [1.0]
|
|
Inst foo (1.0 local-deb [amd64])
|
|
Conf foo (1.0 local-deb [amd64])" aptget install ./incoming/foo_1.0_amd64.deb -s
|
|
|
|
createpkg() {
|
|
local PKG="pkg-$1"
|
|
mkdir -p ./incoming/$PKG/DEBIAN
|
|
if [ -n "$2" ]; then
|
|
echo -n "$2" >> ./incoming/$PKG/DEBIAN/control
|
|
fi
|
|
echo "Package: $PKG
|
|
Version: 0
|
|
Priority: extra
|
|
Maintainer: No Body <no@example.org>
|
|
Architecture: all
|
|
Depends: foo:i386
|
|
Description: test package" >> ./incoming/$PKG/DEBIAN/control
|
|
if [ -n "$3" ]; then
|
|
echo -n "$3" >> ./incoming/$PKG/DEBIAN/control
|
|
fi
|
|
testsuccess dpkg-deb --build ./incoming/$PKG/ ./incoming
|
|
#dpkg-deb -I ./incoming/${PKG}_0_all.deb control
|
|
}
|
|
createpkg 'as-it-should-be'
|
|
createpkg 'leading-newline' '
|
|
|
|
'
|
|
createpkg 'trailing-newline' '' '
|
|
'
|
|
createpkg 'double-trailing-newline' '' '
|
|
|
|
'
|
|
createpkg 'last-line-parse' '' 'Pre-Depends: pkg-as-it-should-be
|
|
'
|
|
|
|
echo 'Package: /pkg-/
|
|
Pin: release a=experimental
|
|
Pin-Priority: 501' > rootdir/etc/apt/preferences.d/pinit
|
|
|
|
testfailuremsg 'E: Unable to satisfy dependencies. Reached two conflicting decisions:
|
|
1. pkg-last-line-parse:amd64=0 is selected for install
|
|
2. pkg-last-line-parse:amd64 PreDepends pkg-as-it-should-be
|
|
but none of the choices are installable:
|
|
[no choices]' aptget install -q=0 ./incoming/pkg-last-line-parse_0_all.deb --solver 3.0
|
|
testfailuremsg 'E: Unable to correct problems, you have held broken packages.' aptget install -q=0 ./incoming/pkg-last-line-parse_0_all.deb --solver internal
|
|
testsuccess aptget install ./incoming/pkg-as-it-should-be_0_all.deb
|
|
testsuccess aptget install ./incoming/pkg-last-line-parse_0_all.deb
|
|
testsuccess aptget install "$(readlink -f ./incoming/pkg-leading-newline_0_all.deb)"
|
|
testsuccess aptget install ./incoming/pkg-trailing-newline_0_all.deb
|
|
testsuccess aptget install ./incoming/pkg-double-trailing-newline_0_all.deb
|
|
|
|
testempty apt clean
|
|
if [ "$(id -u)" = '0' ]; then
|
|
# see if permission dropping is checked before usage
|
|
chmod 711 ./incoming
|
|
testsuccess aptget install -y ./incoming/pkg-as-it-should-be_0_all.deb --reinstall
|
|
testfailure grep 'is already the newest version' rootdir/tmp/testsuccess.output
|
|
chmod 710 ./incoming
|
|
testsuccesswithnotice aptget install -y ./incoming/pkg-as-it-should-be_0_all.deb --reinstall
|
|
testfailure grep 'is already the newest version' rootdir/tmp/testsuccesswithnotice.output
|
|
chmod 700 ./incoming
|
|
testsuccesswithnotice aptget install -y ./incoming/pkg-as-it-should-be_0_all.deb --reinstall
|
|
testfailure grep 'is already the newest version' rootdir/tmp/testsuccesswithnotice.output
|
|
chmod 711 ./incoming
|
|
else
|
|
testsuccess aptget install -y ./incoming/pkg-as-it-should-be_0_all.deb --reinstall
|
|
testfailure grep 'is already the newest version' rootdir/tmp/testsuccess.output
|
|
fi
|
|
|
|
sed -i -e '/^Depends: foo/ d' rootdir/var/lib/dpkg/status
|
|
testsuccess aptget install -y ./incoming/pkg-as-it-should-be_0_all.deb
|
|
testfailure grep 'is already the newest version' rootdir/tmp/testsuccess.output
|
|
testsuccess apt purge -y pkg-as-it-should-be
|
|
|
|
echo "Package: pkg-as-it-should-be
|
|
Architecture: all
|
|
Version: 0
|
|
Installed-Size: 2903
|
|
Filename: incoming/pkg-as-it-should-be_0%3a0+0_all.deb
|
|
Size: $(stat -c %s incoming/pkg-as-it-should-be_0_all.deb)
|
|
SHA256: $(sha256sum incoming/pkg-as-it-should-be_0_all.deb | cut -d' ' -f 1)
|
|
" > Packages
|
|
ln -s pkg-as-it-should-be_0_all.deb incoming/pkg-as-it-should-be_0%3a0+0_all.deb
|
|
testdpkgnotinstalled 'pkg-as-it-should-be'
|
|
testnopackage pkg-as-it-should-be
|
|
testsuccess apt install --with-source ./Packages pkg-as-it-should-be -s
|
|
testsuccess apt install --with-source ./Packages pkg-as-it-should-be --print-uris
|
|
testsuccess apt show --with-source ./Packages pkg-as-it-should-be
|
|
testequal 'Package: pkg-as-it-should-be' head -n1 rootdir/tmp/testsuccess.output
|
|
testsuccess apt install -y --with-source ./Packages pkg-as-it-should-be -o Debug::pkgAcquire::Worker=1
|
|
testdpkginstalled 'pkg-as-it-should-be'
|
|
rm -f ./Packages
|
|
|
|
echo 'dpkg::install::recursive "true";
|
|
dpkg::install::recursive::force "true";
|
|
dpkg::install::recursive::minimum "0";' > rootdir/etc/apt/apt.conf.d/lowerminimum.conf
|
|
mv ./incoming/pkg-as-it-should-be_0_all.deb ./incoming/pkg-as-it-should-be_0%3a0+0_all.ddeb
|
|
testsuccess aptget install -y ./incoming/pkg-as-it-should-be_0%3a0+0_all.ddeb --reinstall -o Debug::pkgDpkgPm=1
|
|
cp rootdir/tmp/testsuccess.output apt.output
|
|
testsuccess grep "^${TMPWORKINGDIRECTORY}/.*/dpkg.* --recursive .*/apt-dpkg-install-" apt.output
|
|
testsuccess aptget install -y ./incoming/pkg-as-it-should-be_0%3a0+0_all.ddeb --reinstall -o Debug::pkgDpkgPm=1 -o DPkg::Chroot-Directory="${TMPWORKINGDIRECTORY}/rootdir/"
|
|
cp rootdir/tmp/testsuccess.output apt.output
|
|
testsuccess grep 'dpkg.* --recursive .*/apt-dpkg-install-' apt.output
|
|
testfailure grep "^${TMPWORKINGDIRECTORY}/.*/dpkg.* --recursive .*/apt-dpkg-install-" apt.output
|
|
testfailure grep "dpkg.* --recursive ${TMPWORKINGDIRECTORY}" apt.output
|
|
testsuccess aptget install -y ./incoming/pkg-as-it-should-be_0%3a0+0_all.ddeb --reinstall
|
|
testfailure grep 'is already the newest version' rootdir/tmp/testsuccess.output
|
|
testsuccess apt purge -y pkg-as-it-should-be
|
|
testdpkgnotinstalled 'pkg-as-it-should-be'
|
|
|
|
mv ./incoming/pkg-as-it-should-be_0%3a0+0_all.ddeb ./incoming/pkg-as-it-should-be_0_all.foobar
|
|
echo "Package: pkg-as-it-should-be
|
|
Architecture: all
|
|
Version: 0
|
|
Installed-Size: 2903
|
|
Filename: incoming/pkg-as-it-should-be_0_all.foobar
|
|
Size: $(stat -c %s incoming/pkg-as-it-should-be_0_all.foobar)
|
|
SHA256: $(sha256sum incoming/pkg-as-it-should-be_0_all.foobar | cut -d' ' -f 1)
|
|
" | gzip > Packages.gz
|
|
testsuccess apt install --with-source ./Packages.gz pkg-as-it-should-be -s
|
|
testsuccess apt install --with-source ./Packages.gz pkg-as-it-should-be --print-uris
|
|
testsuccess apt show --with-source ./Packages.gz pkg-as-it-should-be
|
|
testequal 'Package: pkg-as-it-should-be' head -n1 rootdir/tmp/testsuccess.output
|
|
testsuccess apt install -y --with-source ./Packages.gz pkg-as-it-should-be
|
|
testdpkginstalled 'pkg-as-it-should-be'
|