diff options
Diffstat (limited to 'test')
365 files changed, 48663 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..2f47b5c --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(libapt) +add_subdirectory(interactive-helper) 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 new file mode 100644 index 0000000..75a769e --- /dev/null +++ b/test/integration/Packages-bug-590438-broken-provides-thanks-to-remove-order @@ -0,0 +1,67 @@ +Package: gawk +Priority: optional +Section: interpreters +Installed-Size: 2084 +Maintainer: Arthur Loiret <aloiret@debian.org> +Architecture: i386 +Version: 1:3.1.7.dfsg-5 +Provides: awk +Pre-Depends: libc6 (>= 2.3) +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: aawk +Priority: optional +Section: interpreters +Installed-Size: 2084 +Maintainer: Arthur Loiret <aloiret@debian.org> +Architecture: i386 +Version: 1:3.1.7.dfsg-5 +Provides: awk +Pre-Depends: libc6 (>= 2.3) +Filename: pool/main/a/aawk/aawk_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: gawk2 +Priority: optional +Section: interpreters +Installed-Size: 2084 +Maintainer: Arthur Loiret <aloiret@debian.org> +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 <kalnischkies+debian@gmail.com> +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/Packages-bug-591882-conkeror b/test/integration/Packages-bug-591882-conkeror new file mode 100644 index 0000000..555e855 --- /dev/null +++ b/test/integration/Packages-bug-591882-conkeror @@ -0,0 +1,1787 @@ +Package: conkeror +Priority: extra +Section: web +Installed-Size: 1488 +Maintainer: Axel Beckert <abe@debian.org> +Architecture: all +Version: 0.9.2+git100804-1 +Provides: www-browser +Depends: xulrunner-1.9.1 | xulrunner-1.9.2 | xulrunner-1.9 | xulrunner (>= 1.9~) +Recommends: conkeror-spawn-process-helper +Suggests: emacs | emacsen +Breaks: conkeror-spawn-process-helper (<< 0.9~git080901-1) +Filename: pool/main/c/conkeror/conkeror_0.9.2+git100804-1_all.deb +Size: 233068 +MD5Sum: e7bce631fe421938f2dc7a2042497e21 +Description: keyboard focused web browser with Emacs look and feel + +Package: coreutils +Essential: yes +Priority: required +Section: utils +Installed-Size: 12188 +Maintainer: Michael Stone <mstone@debian.org> +Architecture: i386 +Version: 8.5-1 +Replaces: mktemp, timeout +Pre-Depends: libacl1 (>= 2.2.11-1), libattr1 (>= 2.4.41-1), libc6 (>= 2.6), libselinux1 (>= 1.32) +Conflicts: timeout +Filename: pool/main/c/coreutils/coreutils_8.5-1_i386.deb +Size: 4608374 +MD5Sum: de7f2ef8769cc38e64774102708ce1ae +Description: GNU core utilities + +Package: debconf-i18n +Priority: required +Section: localization +Installed-Size: 1208 +Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> +Architecture: all +Source: debconf +Version: 1.5.35 +Replaces: debconf (<< 1.3.0), debconf-utils (<< 1.3.22) +Depends: debconf, liblocale-gettext-perl, libtext-iconv-perl, libtext-wrapi18n-perl, libtext-charwidth-perl +Conflicts: debconf-english, debconf-utils (<< 1.3.22) +Filename: pool/main/d/debconf/debconf-i18n_1.5.35_all.deb +Size: 210348 +MD5Sum: 03d76e5a5fc733cffc54c4b3b14dbcd4 +Description: full internationalization support for debconf + +Package: debconf +Priority: required +Section: admin +Installed-Size: 1560 +Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> +Architecture: all +Version: 1.5.35 +Replaces: debconf-tiny +Provides: debconf-2.0 +Depends: debconf-i18n | debconf-english +Pre-Depends: perl-base (>= 5.6.1-4) +Recommends: apt-utils (>= 0.5.1) +Suggests: debconf-doc, debconf-utils, whiptail | dialog | gnome-utils, libterm-readline-gnu-perl, libgnome2-perl, libnet-ldap-perl, perl, libqtgui4-perl, libqtcore4-perl +Conflicts: apt (<< 0.3.12.1), cdebconf (<< 0.96), debconf-tiny, debconf-utils (<< 1.3.22), dialog (<< 0.9b-20020814-1), menu (<= 2.1.3-1), whiptail (<< 0.51.4-11), whiptail-utf8 (<= 0.50.17-13) +Filename: pool/main/d/debconf/debconf_1.5.35_all.deb +Size: 158120 +MD5Sum: 5a64e8e187984ed4eca44bf13eae8ea0 +Description: Debian configuration management system +Python-Version: 2.4, 2.5, 2.6 + +Package: debianutils +Essential: yes +Priority: required +Section: utils +Installed-Size: 216 +Maintainer: Clint Adams <schizo@debian.org> +Architecture: i386 +Version: 3.4 +Depends: sensible-utils +Pre-Depends: libc6 (>= 2.7) +Filename: pool/main/d/debianutils/debianutils_3.4_i386.deb +Size: 49888 +MD5Sum: 32eb3eebd4c9e58aadd418ca95b23904 +Description: Miscellaneous utilities specific to Debian + +Package: defoma +Priority: optional +Section: admin +Installed-Size: 564 +Maintainer: Debian QA Group <packages@qa.debian.org> +Architecture: all +Version: 0.11.11 +Depends: whiptail | dialog, file, perl +Recommends: libfont-freetype-perl +Suggests: defoma-doc, psfontmgr, x-ttcidfont-conf, dfontmgr +Conflicts: defoma-gs, defoma-ps, defoma-x, dfontmgr (<< 0.10.0), psfontmgr (<< 0.5.0), x-ttcidfont-conf (<< 5) +Filename: pool/main/d/defoma/defoma_0.11.11_all.deb +Size: 101104 +MD5Sum: ee11d3bc1a0275473d5c1feba846ff3e +Description: Debian Font Manager -- automatic font configuration framework +Enhances: debhelper + +Package: dpkg +Essential: yes +Priority: required +Section: admin +Installed-Size: 5628 +Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> +Architecture: i386 +Version: 1.15.8.3 +Pre-Depends: libbz2-1.0, libc6 (>= 2.3), libselinux1 (>= 1.32), zlib1g (>= 1:1.1.4), coreutils (>= 5.93-1), xz-utils +Suggests: apt +Breaks: apt (<< 0.7.7), aptitude (<< 0.4.7-1), dpkg-dev (<< 1.14.16), emacs21 (<< 21.4a+1-5.7), emacs21-nox (<< 21.4a+1-5.7), emacs22 (<= 22.3+1-1), emacs22-gtk (<= 22.3+1-1), emacs22-nox (<= 22.3+1-1), jed (<< 1:0.99.18+dfsg.1-13), jed-extra (<= 2.5.3-2), konqueror (<= 4:4.2.96-1), libdpkg-perl (<< 1.15.8), pinfo (<< 0.6.9-3.1), tkinfo (<< 2.8-3.1), xemacs21-support (<< 21.4.22-2), xjed (<< 1:0.99.18+dfsg.1-13) +Filename: pool/main/d/dpkg/dpkg_1.15.8.3_i386.deb +Size: 1866568 +MD5Sum: fa4bf565ebbfde6558d70b071f6abe42 +Description: Debian package management system +Origin: debian +Bugs: debbugs://bugs.debian.org + +Package: file +Priority: standard +Section: utils +Installed-Size: 136 +Maintainer: Daniel Baumann <daniel@lists.debian-maintainers.org> +Architecture: i386 +Version: 5.04-5 +Depends: libc6 (>= 2.1), libmagic1 (= 5.04-5), zlib1g (>= 1:1.1.4) +Filename: pool/main/f/file/file_5.04-5_i386.deb +Size: 49134 +MD5Sum: 716b1c307166650f247e0a2e07cdd3b1 +Description: Determines file type using "magic" numbers + +Package: fontconfig-config +Priority: optional +Section: fonts +Installed-Size: 440 +Maintainer: Keith Packard <keithp@debian.org> +Architecture: all +Source: fontconfig +Version: 2.8.0-2.1 +Replaces: fontconfig (<< 2.3.2-2) +Depends: debconf (>= 0.5) | debconf-2.0, ucf (>= 0.29), ttf-dejavu-core | ttf-bitstream-vera | ttf-freefont | gsfonts-x11 +Conflicts: fontconfig (<< 2.3.2-2) +Filename: pool/main/f/fontconfig/fontconfig-config_2.8.0-2.1_all.deb +Size: 217150 +MD5Sum: c2dd70d32fa8e5c0588cff16efbbf614 +Description: generic font configuration library - configuration + +Package: fontconfig +Priority: optional +Section: fonts +Installed-Size: 520 +Maintainer: Keith Packard <keithp@debian.org> +Architecture: i386 +Version: 2.8.0-2.1 +Replaces: fontconfig-config (<< 2.5.93-1) +Depends: libc6 (>= 2.0), libexpat1 (>= 1.95.8), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), zlib1g (>= 1:1.1.4), fontconfig-config +Suggests: defoma (>= 0.7.0) +Filename: pool/main/f/fontconfig/fontconfig_2.8.0-2.1_i386.deb +Size: 333180 +MD5Sum: 67aeeda05141d4fe477c041c12daad1e +Description: generic font configuration library - support binaries + +Package: gcc-4.4-base +Priority: required +Section: libs +Installed-Size: 172 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.4 +Version: 4.4.4-8 +Filename: pool/main/g/gcc-4.4/gcc-4.4-base_4.4.4-8_i386.deb +Size: 118346 +MD5Sum: 5e35b249b1af8edd9e85932575f6af92 +Description: The GNU Compiler Collection (base package) + +Package: libacl1 +Priority: required +Section: libs +Installed-Size: 88 +Maintainer: Nathan Scott <nathans@debian.org> +Architecture: i386 +Source: acl +Version: 2.2.49-3 +Depends: libattr1 (>= 2.4.41-1), libc6 (>= 2.2) +Conflicts: acl (<< 2.0.0), libacl1-kerberos4kth +Filename: pool/main/a/acl/libacl1_2.2.49-3_i386.deb +Size: 27146 +MD5Sum: 99c1bd61d4f26b1f3a072b490d3daef5 +Description: Access control list shared library + +Package: libasound2 +Priority: optional +Section: libs +Installed-Size: 1236 +Maintainer: Debian ALSA Maintainers <pkg-alsa-devel@lists.alioth.debian.org> +Architecture: i386 +Source: alsa-lib +Version: 1.0.23-1 +Depends: libc6 (>= 2.3.6-6~) +Suggests: libasound2-plugins (>= 1.0.18) +Conflicts: libasound2-plugins (<< 1.0.18) +Filename: pool/main/a/alsa-lib/libasound2_1.0.23-1_i386.deb +Size: 377718 +MD5Sum: 14a1674ebd84f30080d42c4f86f2533d +Description: shared library for ALSA applications + +Package: libatk1.0-0 +Priority: optional +Section: libs +Installed-Size: 208 +Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: atk1.0 +Version: 1.30.0-1 +Depends: libc6 (>= 2.2), libglib2.0-0 (>= 2.16.0) +Recommends: libatk1.0-data +Filename: pool/main/a/atk1.0/libatk1.0-0_1.30.0-1_i386.deb +Size: 82402 +MD5Sum: 27d2b5e1b0ca90254f54dfe2bf056527 +Description: The ATK accessibility toolkit + +Package: libattr1 +Priority: required +Section: libs +Installed-Size: 64 +Maintainer: Nathan Scott <nathans@debian.org> +Architecture: i386 +Source: attr +Version: 1:2.4.44-2 +Depends: libc6 (>= 2.2.3) +Conflicts: attr (<< 2.0.0) +Filename: pool/main/a/attr/libattr1_2.4.44-2_i386.deb +Size: 11902 +MD5Sum: 1e08d3be5e8d55515e7b3fa6fc76a022 +Description: Extended attribute shared library + +Package: libavahi-client3 +Priority: optional +Section: libs +Installed-Size: 148 +Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: avahi +Version: 0.6.27-1 +Depends: libavahi-common3 (>= 0.6.22), libc6 (>= 2.4), libdbus-1-3 (>= 1.1.1) +Filename: pool/main/a/avahi/libavahi-client3_0.6.27-1_i386.deb +Size: 54328 +MD5Sum: 07bc086292d59fb7465eedb8c59d0c31 +Description: Avahi client library + +Package: libavahi-common-data +Priority: optional +Section: libs +Installed-Size: 728 +Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: avahi +Version: 0.6.27-1 +Filename: pool/main/a/avahi/libavahi-common-data_0.6.27-1_i386.deb +Size: 111952 +MD5Sum: ebc4f7471f8e8ffea1526e1894c283a7 +Description: Avahi common data files + +Package: libavahi-common3 +Priority: optional +Section: libs +Installed-Size: 132 +Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: avahi +Version: 0.6.27-1 +Depends: libc6 (>= 2.4), libavahi-common-data +Filename: pool/main/a/avahi/libavahi-common3_0.6.27-1_i386.deb +Size: 50538 +MD5Sum: 6e5bb85c3665bd26cdcb12c41eb9787e +Description: Avahi common library + +Package: libbz2-1.0 +Priority: important +Section: libs +Installed-Size: 128 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: bzip2 +Version: 1.0.5-4 +Depends: libc6 (>= 2.3) +Filename: pool/main/b/bzip2/libbz2-1.0_1.0.5-4_i386.deb +Size: 45118 +MD5Sum: f067ae75bce5ef991b3d0574bf541ddb +Description: high-quality block-sorting file compressor library - runtime + +Package: libc-bin +Priority: required +Section: libs +Installed-Size: 1516 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: i386 +Source: eglibc +Version: 2.11.2-2 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Breaks: libc0.1 (<< 2.10), libc0.3 (<< 2.10), libc6 (<< 2.10), libc6.1 (<< 2.10) +Filename: pool/main/e/eglibc/libc-bin_2.11.2-2_i386.deb +Size: 703542 +MD5Sum: f554ec34c092bb8e52e3d917bec7b46c +Description: Embedded GNU C Library: Binaries + +Package: libc6 +Priority: required +Section: libs +Installed-Size: 9340 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: i386 +Source: eglibc +Version: 2.11.2-2 +Provides: glibc-2.11-1 +Depends: libc-bin (= 2.11.2-2), libgcc1 +Recommends: libc6-i686 +Suggests: glibc-doc, debconf | debconf-2.0, locales +Conflicts: tzdata (<< 2007k-1), tzdata-etch +Breaks: locales (<< 2.11), locales-all (<< 2.11), nscd (<< 2.11) +Filename: pool/main/e/eglibc/libc6_2.11.2-2_i386.deb +Size: 3877166 +MD5Sum: 3d8fe972a359ad362ac1957c2687e5c2 +Description: Embedded GNU C Library: Shared libraries + +Package: libcairo2 +Priority: optional +Section: libs +Installed-Size: 824 +Maintainer: Dave Beckett <dajobe@debian.org> +Architecture: i386 +Source: cairo +Version: 1.8.10-4 +Depends: libc6 (>= 2.3), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libpixman-1-0 (>= 0.15.16), libpng12-0 (>= 1.2.13-4), libx11-6 (>= 0), libxcb-render-util0 (>= 0.3.6), libxcb-render0 (>= 0), libxcb1 (>= 0), libxrender1, zlib1g (>= 1:1.1.4) +Breaks: iceape-browser (<= 2.0.3-3), libgtk-directfb-2.0-0, xulrunner-1.9, xulrunner-1.9.1 (<= 1.9.1.8-3) +Filename: pool/main/c/cairo/libcairo2_1.8.10-4_i386.deb +Size: 508814 +MD5Sum: 51f8838a83d46b5cf590338bcc3c6d73 +Description: The Cairo 2D vector graphics library + +Package: libcomerr2 +Priority: required +Section: libs +Installed-Size: 104 +Maintainer: Theodore Y. Ts'o <tytso@mit.edu> +Architecture: i386 +Source: e2fsprogs +Version: 1.41.12-2 +Replaces: e2fsprogs (<< 1.34-1) +Provides: libcomerr-kth-compat +Depends: libc6 (>= 2.3.6-6~) +Filename: pool/main/e/e2fsprogs/libcomerr2_1.41.12-2_i386.deb +Size: 48508 +MD5Sum: 8fe610cf3b2f82f2a681ba196e91d883 +Description: common error description library + +Package: libcups2 +Priority: optional +Section: libs +Installed-Size: 468 +Maintainer: Debian CUPS Maintainers <pkg-cups-devel@lists.alioth.debian.org> +Architecture: i386 +Source: cups +Version: 1.4.4-3 +Provides: libcupsys2 +Depends: libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.4), libgcrypt11 (>= 1.4.2), libgnutls26 (>= 2.7.14-0), libgssapi-krb5-2 (>= 1.7+dfsg), zlib1g (>= 1:1.1.4) +Suggests: cups-common +Breaks: cups (<< 1.4.4) +Filename: pool/main/c/cups/libcups2_1.4.4-3_i386.deb +Size: 225696 +MD5Sum: f78acda030eece301cd5e0c94ea3492b +Description: Common UNIX Printing System(tm) - Core library + +Package: libdatrie1 +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Theppitak Karoonboonyanan <thep@debian.org> +Architecture: i386 +Source: libdatrie +Version: 0.2.4-1 +Depends: libc6 (>= 2.1.3) +Filename: pool/main/libd/libdatrie/libdatrie1_0.2.4-1_i386.deb +Size: 26184 +MD5Sum: 305e5beace09f16bf9b0a568e8df7920 +Description: Double-array trie library + +Package: libdb4.7 +Priority: standard +Section: libs +Installed-Size: 1432 +Maintainer: Debian Berkeley DB Maintainers <pkg-db-devel@lists.alioth.debian.org> +Architecture: i386 +Source: db4.7 +Version: 4.7.25-9 +Depends: libc6 (>= 2.3.6-6~) +Conflicts: libdb2 (<< 2:2.7.7-3) +Filename: pool/main/d/db4.7/libdb4.7_4.7.25-9_i386.deb +Size: 644290 +MD5Sum: 694cced529f6249607c523765aa1e482 +Description: Berkeley v4.7 Database Libraries [runtime] + +Package: libdb4.8 +Priority: standard +Section: libs +Installed-Size: 1488 +Maintainer: Clint Adams <schizo@debian.org> +Architecture: i386 +Source: db4.8 +Version: 4.8.30-1 +Depends: libc6 (>= 2.3.6-6~) +Conflicts: libdb2 (<< 2:2.7.7-3) +Filename: pool/main/d/db4.8/libdb4.8_4.8.30-1_i386.deb +Size: 681682 +MD5Sum: c8f9b6dd1cc49dac5d3319a5ac0d22fc +Description: Berkeley v4.8 Database Libraries [runtime] + +Package: libdbus-1-3 +Priority: optional +Section: libs +Installed-Size: 328 +Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: dbus +Version: 1.2.24-3 +Depends: libc6 (>= 2.3.6-6~) +Recommends: dbus +Filename: pool/main/d/dbus/libdbus-1-3_1.2.24-3_i386.deb +Size: 129632 +MD5Sum: 620b2226a4cad34ed86931132fa09ea6 +Description: simple interprocess messaging system + +Package: libexpat1 +Priority: optional +Section: libs +Installed-Size: 368 +Maintainer: Debian XML/SGML Group <debian-xml-sgml-pkgs@lists.alioth.debian.org> +Architecture: i386 +Source: expat +Version: 2.0.1-7 +Depends: libc6 (>= 2.1.3) +Conflicts: wink (<= 1.5.1060-4) +Filename: pool/main/e/expat/libexpat1_2.0.1-7_i386.deb +Size: 138122 +MD5Sum: 4607c75c6b55d92ac517fd0fb8543587 +Description: XML parsing C library - runtime library + +Package: libfontconfig1 +Priority: optional +Section: libs +Installed-Size: 412 +Maintainer: Keith Packard <keithp@debian.org> +Architecture: i386 +Source: fontconfig +Version: 2.8.0-2.1 +Provides: libfontconfig +Depends: libc6 (>= 2.7), libexpat1 (>= 1.95.8), libfreetype6 (>= 2.2.1), zlib1g (>= 1:1.1.4), fontconfig-config (= 2.8.0-2.1) +Filename: pool/main/f/fontconfig/libfontconfig1_2.8.0-2.1_i386.deb +Size: 273878 +MD5Sum: fd6d6426df7bc1330b064a7d45a85d84 +Description: generic font configuration library - runtime + +Package: libfreetype6 +Priority: optional +Section: libs +Installed-Size: 668 +Maintainer: Steve Langasek <vorlon@debian.org> +Architecture: i386 +Source: freetype +Version: 2.4.2-1 +Depends: libc6 (>= 2.1.3), zlib1g (>= 1:1.1.4) +Conflicts: freetype, xpdf-reader (<< 1.00-4) +Filename: pool/main/f/freetype/libfreetype6_2.4.2-1_i386.deb +Size: 360632 +MD5Sum: f9c333d2643d186685a77d1072db5425 +Description: FreeType 2 font engine, shared library files + +Package: libgcc1 +Priority: required +Section: libs +Installed-Size: 156 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.4 (4.4.4-8) +Version: 1:4.4.4-8 +Depends: gcc-4.4-base (= 4.4.4-8), libc6 (>= 2.2.4) +Filename: pool/main/g/gcc-4.4/libgcc1_4.4.4-8_i386.deb +Size: 55180 +MD5Sum: c92a5656f20caa7d50bd425f2b1f25d8 +Description: GCC support library + +Package: libgcrypt11 +Priority: standard +Section: libs +Installed-Size: 556 +Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Architecture: i386 +Version: 1.4.5-2 +Depends: libc6 (>= 2.3), libgpg-error0 (>= 1.6-1) +Suggests: rng-tools +Filename: pool/main/libg/libgcrypt11/libgcrypt11_1.4.5-2_i386.deb +Size: 266444 +MD5Sum: 6b687ecf0284d5efe44115c07198b159 +Description: LGPL Crypto library - runtime library + +Package: libgdbm3 +Priority: important +Section: libs +Installed-Size: 120 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: gdbm +Version: 1.8.3-9 +Depends: libc6 (>= 2.1.3), dpkg (>= 1.15.4) | install-info +Filename: pool/main/g/gdbm/libgdbm3_1.8.3-9_i386.deb +Size: 44940 +MD5Sum: cc0859fd9c0ea0a211e7f1a0da09ddc0 +Description: GNU dbm database routines (runtime version) + +Package: libglib2.0-0 +Priority: optional +Section: libs +Installed-Size: 2212 +Maintainer: Loic Minier <lool@dooz.org> +Architecture: i386 +Source: glib2.0 +Version: 2.24.1-1 +Replaces: libglib2.0-dev (<< 2.23.2-2) +Depends: libc6 (>= 2.9), libpcre3 (>= 7.7), libselinux1 (>= 1.32), zlib1g (>= 1:1.1.4) +Recommends: libglib2.0-data, shared-mime-info +Conflicts: libpango1.0-0 (<< 1.11) +Filename: pool/main/g/glib2.0/libglib2.0-0_2.24.1-1_i386.deb +Size: 1024782 +MD5Sum: e0f853cbcba1c8a132fc07c303c31ea9 +Description: The GLib library of C routines + +Package: libgnutls26 +Priority: standard +Section: libs +Installed-Size: 1268 +Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Architecture: i386 +Source: gnutls26 +Version: 2.8.6-1 +Replaces: gnutls0, gnutls0.4, gnutls3 +Depends: libc6 (>= 2.3), libgcrypt11 (>= 1.4.2), libtasn1-3 (>= 1.6-0), zlib1g (>= 1:1.1.4) +Suggests: gnutls-bin +Conflicts: gnutls0, gnutls0.4 +Filename: pool/main/g/gnutls26/libgnutls26_2.8.6-1_i386.deb +Size: 528314 +MD5Sum: 9c585b48d4a4e8de856b70a3350037de +Description: the GNU TLS library - runtime library + +Package: libgpg-error0 +Priority: standard +Section: libs +Installed-Size: 228 +Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org> +Architecture: i386 +Source: libgpg-error +Version: 1.6-1 +Depends: libc6 (>= 2.1.3) +Filename: pool/main/libg/libgpg-error/libgpg-error0_1.6-1_i386.deb +Size: 43118 +MD5Sum: be3a76a7176e38cb1f0464be1f21d4d4 +Description: library for common error values and messages in GnuPG components + +Package: libgssapi-krb5-2 +Priority: standard +Section: libs +Installed-Size: 1604 +Maintainer: Sam Hartman <hartmans@debian.org> +Architecture: i386 +Source: krb5 +Version: 1.8.3+dfsg~beta1-1 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.7), libcomerr2 (>= 1.34), libk5crypto3 (>= 1.8+dfsg), libkeyutils1, libkrb5-3 (= 1.8.3+dfsg~beta1-1), libkrb5support0 (>= 1.7dfsg~beta2) +Suggests: krb5-doc, krb5-user +Breaks: libkrb53 +Filename: pool/main/k/krb5/libgssapi-krb5-2_1.8.3+dfsg~beta1-1_i386.deb +Size: 1463772 +MD5Sum: 80f3ffe8e30991723a8009829e2aef10 +Description: MIT Kerberos runtime libraries - krb5 GSS-API Mechanism + +Package: libgtk2.0-0 +Priority: optional +Section: libs +Installed-Size: 5864 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: i386 +Source: gtk+2.0 +Version: 2.20.1-1 +Provides: gtk2.0-binver-2.10.0 +Depends: libgtk2.0-common, libatk1.0-0 (>= 1.29.3), libc6 (>= 2.7), libcairo2 (>= 1.6.4-6.1), libcups2 (>= 1.4.0), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libglib2.0-0 (>= 2.24.0), libgnutls26 (>= 2.7.14-0), libgssapi-krb5-2 (>= 1.6.dfsg.2), libjasper1 (>= 1.900.1), libjpeg62, libpango1.0-0 (>= 1.20.0), libpng12-0 (>= 1.2.13-4), libtiff4, libx11-6 (>= 0), libxcomposite1 (>= 1:0.3-1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6 (>= 0), libxfixes3 (>= 1:4.0.1), libxi6 (>= 0), libxinerama1, libxrandr2 (>= 2:1.2.99.3), libxrender1, zlib1g (>= 1:1.1.4), shared-mime-info +Recommends: hicolor-icon-theme, libgtk2.0-bin +Suggests: librsvg2-common, gvfs +Filename: pool/main/g/gtk+2.0/libgtk2.0-0_2.20.1-1_i386.deb +Size: 2503890 +MD5Sum: fc1fc5987ae2be51e9b4bcc4b57fc472 +Description: The GTK+ graphical user interface library + +Package: libgtk2.0-common +Priority: optional +Section: misc +Installed-Size: 21484 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: all +Source: gtk+2.0 +Version: 2.20.1-1 +Recommends: libgtk2.0-0 +Filename: pool/main/g/gtk+2.0/libgtk2.0-common_2.20.1-1_all.deb +Size: 7104864 +MD5Sum: 68cf4472a1e7bed64241f466d6830bbc +Description: Common files for the GTK+ graphical user interface library + +Package: libhunspell-1.2-0 +Priority: optional +Section: libs +Installed-Size: 376 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: i386 +Source: hunspell +Version: 1.2.11-1 +Depends: libc6 (>= 2.1.3), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.1.1) +Recommends: hunspell-en-us | hunspell-dictionary | myspell-dictionary +Conflicts: openoffice.org-core (= 2.2.0~rc2-1) +Filename: pool/main/h/hunspell/libhunspell-1.2-0_1.2.11-1_i386.deb +Size: 154502 +MD5Sum: b8b8e5d0805a5e00b4cfdd64128d8054 +Description: spell checker and morphological analyzer (shared library) + +Package: libice6 +Priority: optional +Section: libs +Installed-Size: 204 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libice +Version: 2:1.0.6-1 +Depends: libc6 (>= 2.3), x11-common +Filename: pool/main/libi/libice/libice6_1.0.6-1_i386.deb +Size: 50284 +MD5Sum: 7052cd2a95caeee0f83d0f1950fd5d42 +Description: X11 Inter-Client Exchange library + +Package: libjasper1 +Priority: optional +Section: libs +Installed-Size: 340 +Maintainer: Roland Stigge <stigge@antcom.de> +Architecture: i386 +Source: jasper +Version: 1.900.1-7 +Replaces: libjasper-1.700-2 +Depends: libc6 (>= 2.7), libjpeg62 +Suggests: libjasper-runtime +Conflicts: libjasper-1.700-2 +Filename: pool/main/j/jasper/libjasper1_1.900.1-7_i386.deb +Size: 145186 +MD5Sum: 1df984b14ac57be23d5a5ad0c40ab6cf +Description: The JasPer JPEG-2000 runtime library + +Package: libjpeg62 +Priority: optional +Section: libs +Installed-Size: 204 +Maintainer: Bill Allombert <ballombe@debian.org> +Architecture: i386 +Source: libjpeg6b +Version: 6b1-1 +Depends: libc6 (>= 2.7) +Filename: pool/main/libj/libjpeg6b/libjpeg62_6b1-1_i386.deb +Size: 87974 +MD5Sum: ab36968379a350bdae98a3bf58aeda84 +Description: The Independent JPEG Group's JPEG runtime library (version 6.2) + +Package: libk5crypto3 +Priority: standard +Section: libs +Installed-Size: 1556 +Maintainer: Sam Hartman <hartmans@debian.org> +Architecture: i386 +Source: krb5 +Version: 1.8.3+dfsg~beta1-1 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.4), libkeyutils1, libkrb5support0 (>= 1.7dfsg~beta2) +Suggests: krb5-doc, krb5-user +Breaks: libgssapi-krb5-2 (<= 1.8~aa), libkrb5-3 (<= 1.8~aa), libkrb53 (<< 1.6.dfsg.4~beta1-9) +Filename: pool/main/k/krb5/libk5crypto3_1.8.3+dfsg~beta1-1_i386.deb +Size: 1439050 +MD5Sum: 463e89d5a6eacaa55f377575eb6f0a7c +Description: MIT Kerberos runtime libraries - Crypto Library + +Package: libkeyutils1 +Priority: standard +Section: libs +Installed-Size: 56 +Maintainer: Daniel Baumann <daniel@lists.debian-maintainers.org> +Architecture: i386 +Source: keyutils +Version: 1.4-1 +Depends: libc6 (>= 2.1.3) +Filename: pool/main/k/keyutils/libkeyutils1_1.4-1_i386.deb +Size: 6640 +MD5Sum: bc6dbf8f320151e67995e55c3e358b89 +Description: Linux Key Management Utilities (library) + +Package: libkrb5-3 +Priority: standard +Section: libs +Installed-Size: 2204 +Maintainer: Sam Hartman <hartmans@debian.org> +Architecture: i386 +Source: krb5 +Version: 1.8.3+dfsg~beta1-1 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.9), libcomerr2 (>= 1.34), libk5crypto3 (>= 1.8+dfsg), libkeyutils1, libkrb5support0 (= 1.8.3+dfsg~beta1-1) +Suggests: krb5-doc, krb5-user +Conflicts: libapache-mod-auth-kerb (<= 4.996-5.0-rc6-2), libapache2-mod-auth-kerb (<= 4.996-5.0-rc6-2), ssh-krb5 (<< 3.8.1p1-10) +Breaks: libkrb53 (<< 1.6.dfsg.4~beta1-9) +Filename: pool/main/k/krb5/libkrb5-3_1.8.3+dfsg~beta1-1_i386.deb +Size: 1697246 +MD5Sum: 8894886ff9537684ef338ac9ab510467 +Description: MIT Kerberos runtime libraries + +Package: libkrb5support0 +Priority: standard +Section: libs +Installed-Size: 1436 +Maintainer: Sam Hartman <hartmans@debian.org> +Architecture: i386 +Source: krb5 +Version: 1.8.3+dfsg~beta1-1 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.3.4), libkeyutils1 +Suggests: krb5-doc, krb5-user +Breaks: libkrb53 (<< 1.6.dfsg.4~beta1-9) +Filename: pool/main/k/krb5/libkrb5support0_1.8.3+dfsg~beta1-1_i386.deb +Size: 1385290 +MD5Sum: 5a9f10f57f35e8f34b4a7b7052244c14 +Description: MIT Kerberos runtime libraries - Support library + +Package: liblocale-gettext-perl +Priority: required +Section: perl +Installed-Size: 104 +Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org> +Architecture: i386 +Version: 1.05-6 +Depends: libc6 (>= 2.2) +Pre-Depends: perl-base (>= 5.10.0-25), perlapi-5.10.0 +Filename: pool/main/libl/liblocale-gettext-perl/liblocale-gettext-perl_1.05-6_i386.deb +Size: 21596 +MD5Sum: a71c3dadecdf1b64b4cb050f91e032b5 +Description: Using libc functions for internationalization in Perl + +Package: liblzma2 +Priority: required +Section: libs +Installed-Size: 308 +Maintainer: Jonathan Nieder <jrnieder@gmail.com> +Architecture: i386 +Source: xz-utils +Version: 4.999.9beta+20100713-1 +Depends: libc6 (>= 2.3.6-6~) +Filename: pool/main/x/xz-utils/liblzma2_4.999.9beta+20100713-1_i386.deb +Size: 171540 +MD5Sum: fe14361cc247e9bb11b98e31e47cfbbe +Description: XZ-format compression library + +Package: libmagic1 +Priority: standard +Section: libs +Installed-Size: 2032 +Maintainer: Daniel Baumann <daniel@lists.debian-maintainers.org> +Architecture: i386 +Source: file +Version: 5.04-5 +Depends: libc6 (>= 2.3.4), zlib1g (>= 1:1.1.4) +Suggests: file +Conflicts: file (<< 5.04-2) +Filename: pool/main/f/file/libmagic1_5.04-5_i386.deb +Size: 233668 +MD5Sum: def2786d4289068336826c75c514b2bc +Description: File type determination library using "magic" numbers + +Package: libmozjs2d +Priority: optional +Section: libs +Installed-Size: 948 +Maintainer: Maintainers of Mozilla-related packages <pkg-mozilla-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: xulrunner +Version: 1.9.1.11-1 +Depends: libc6 (>= 2.3.6-6~), libgcc1 (>= 1:4.1.1), libnspr4-0d (>= 1.8.0.10), libstdc++6 (>= 4.1.1) +Breaks: xulrunner-1.9.1 (<< 1.9.1.10~) +Filename: pool/main/x/xulrunner/libmozjs2d_1.9.1.11-1_i386.deb +Size: 474718 +MD5Sum: 6a9032247eceb71c9b472bd6fc9961e2 +Description: The Mozilla SpiderMonkey JavaScript library + +Package: libncurses5 +Priority: required +Section: libs +Installed-Size: 592 +Maintainer: Craig Small <csmall@debian.org> +Architecture: i386 +Source: ncurses +Version: 5.7+20100313-2 +Depends: libc6 (>= 2.3.4) +Recommends: libgpm2 +Filename: pool/main/n/ncurses/libncurses5_5.7+20100313-2_i386.deb +Size: 347766 +MD5Sum: f82378f1792c81e380689b932ea26c21 +Description: shared libraries for terminal handling + +Package: libnewt0.52 +Priority: important +Section: libs +Installed-Size: 960 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: i386 +Source: newt +Version: 0.52.11-1 +Replaces: libnewt-utf8, libnewt0, libnewt0.51 +Depends: libc6 (>= 2.3), libslang2 (>= 2.0.7-1) +Recommends: libfribidi0 +Conflicts: libnewt0.51 +Filename: pool/main/n/newt/libnewt0.52_0.52.11-1_i386.deb +Size: 68022 +MD5Sum: be04bedb79431088f0ed072317143fdd +Description: Not Erik's Windowing Toolkit - text mode windowing with slang + +Package: libnspr4-0d +Priority: optional +Section: libs +Installed-Size: 340 +Maintainer: Maintainers of Mozilla-related packages <pkg-mozilla-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: nspr +Version: 4.8.6-1 +Depends: libc6 (>= 2.3.6-6~) +Filename: pool/main/n/nspr/libnspr4-0d_4.8.6-1_i386.deb +Size: 125500 +MD5Sum: 4f3c6c3c19b2f24a1734bd084b34f6f5 +Description: NetScape Portable Runtime Library + +Package: libnss3-1d +Priority: optional +Section: libs +Installed-Size: 2324 +Maintainer: Maintainers of Mozilla-related packages <pkg-mozilla-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: nss +Version: 3.12.7-1 +Depends: libc6 (>= 2.3.6-6~), libnspr4-0d (>= 4.8.6), libsqlite3-0 (>= 3.7.0), zlib1g (>= 1:1.1.4) +Filename: pool/main/n/nss/libnss3-1d_3.12.7-1_i386.deb +Size: 986188 +MD5Sum: 3dbaa9f3c493b2e6bac6dccce0a56dc2 +Description: Network Security Service libraries + +Package: libpam-modules +Priority: required +Section: admin +Installed-Size: 996 +Maintainer: Steve Langasek <vorlon@debian.org> +Architecture: i386 +Source: pam +Version: 1.1.1-3 +Replaces: libpam-umask, libpam0g-util +Provides: libpam-mkhomedir, libpam-motd, libpam-umask +Pre-Depends: libc6 (>= 2.4), libdb4.8, libpam0g (>= 1.1.0), libselinux1 (>= 2.0.85), debconf (>= 0.5) | debconf-2.0 +Conflicts: libpam-mkhomedir, libpam-motd, libpam-umask +Filename: pool/main/p/pam/libpam-modules_1.1.1-3_i386.deb +Size: 344512 +MD5Sum: d55b046bb3da59da7fb94c7325bc07d1 +Description: Pluggable Authentication Modules for PAM + +Package: libpam0g +Priority: required +Section: libs +Installed-Size: 244 +Maintainer: Steve Langasek <vorlon@debian.org> +Architecture: i386 +Source: pam +Version: 1.1.1-3 +Replaces: libpam0g-util +Depends: libc6 (>= 2.3), debconf (>= 0.5) | debconf-2.0 +Suggests: libpam-doc +Filename: pool/main/p/pam/libpam0g_1.1.1-3_i386.deb +Size: 114334 +MD5Sum: 4850e1ffc833914e164f0c14ceb91010 +Description: Pluggable Authentication Modules library + +Package: libpango1.0-0 +Priority: optional +Section: libs +Installed-Size: 836 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: i386 +Source: pango1.0 +Version: 1.28.1-1 +Provides: pango1.0-modver-1.6.0 +Depends: libpango1.0-common (>= 1.28.1-1), libc6 (>= 2.3.6-6~), libcairo2 (>= 1.8.10-3), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libglib2.0-0 (>= 2.24.0), libthai0 (>= 0.1.12), libx11-6, libxft2 (>> 2.1.1), libxrender1, zlib1g (>= 1:1.1.4) +Conflicts: pango-libthai +Filename: pool/main/p/pango1.0/libpango1.0-0_1.28.1-1_i386.deb +Size: 303342 +MD5Sum: fdc1d8650b049d88bb7cdc2f7af425f0 +Description: Layout and rendering of internationalized text + +Package: libpango1.0-common +Priority: optional +Section: misc +Installed-Size: 252 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: all +Source: pango1.0 +Version: 1.28.1-1 +Replaces: libpango-common (<< 1.0.0), libpango0 +Depends: debconf | debconf-2.0, defoma (>= 0.11.1), fontconfig (>= 2.1.91) +Recommends: x-ttcidfont-conf, libpango1.0-0 +Suggests: ttf-japanese-gothic, ttf-japanese-mincho, ttf-thryomanes, ttf-baekmuk, ttf-arphic-gbsn00lp, ttf-arphic-bsmi00lp, ttf-arphic-gkai00mp, ttf-arphic-bkai00mp +Conflicts: pango-libthai (<< 0.1.6-2) +Filename: pool/main/p/pango1.0/libpango1.0-common_1.28.1-1_all.deb +Size: 112638 +MD5Sum: 521e4171155dd465866ff400cb9a37bc +Description: Modules and configuration files for the Pango + +Package: libpcre3 +Priority: standard +Section: libs +Installed-Size: 480 +Maintainer: Mark Baker <mark@mnb.org.uk> +Architecture: i386 +Source: pcre3 +Version: 8.02-1.1 +Depends: libc6 (>= 2.3) +Conflicts: libpcre3-dev (<= 4.3-3) +Breaks: approx (<< 4.4-1~), cduce (<< 0.5.3-2~), cmigrep (<< 1.5-7~), galax (<< 1.1-7~), libpcre-ocaml (<< 6.0.1~), liquidsoap (<< 0.9.2-3~), ocsigen (<< 1.3.3-1~) +Filename: pool/main/p/pcre3/libpcre3_8.02-1.1_i386.deb +Size: 231418 +MD5Sum: 3be0351b7ecd8a5e2140318237d923d0 +Description: Perl 5 Compatible Regular Expression Library - runtime files + +Package: libpixman-1-0 +Priority: optional +Section: libs +Installed-Size: 508 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: pixman +Version: 0.16.4-1 +Depends: libc6 (>= 2.1.3) +Filename: pool/main/p/pixman/libpixman-1-0_0.16.4-1_i386.deb +Size: 236004 +MD5Sum: 46f6f180adfbbeabc95c774386c3006f +Description: pixel-manipulation library for X and cairo + +Package: libpng12-0 +Priority: optional +Section: libs +Installed-Size: 320 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: libpng +Version: 1.2.44-1 +Replaces: libpng12-dev (<= 1.2.8rel-7) +Depends: libc6 (>= 2.1.3), zlib1g (>= 1:1.1.4) +Conflicts: libpng12-dev (<= 1.2.8rel-7), mzscheme (<= 1:209-5), pngcrush (<= 1.5.10-2), pngmeta (<= 1.11-3), povray-3.5 (<= 3.5.0c-10), qemacs (<= 0.3.1-5) +Filename: pool/main/libp/libpng/libpng12-0_1.2.44-1_i386.deb +Size: 175970 +MD5Sum: e871ef14b295cad4ac8ceedbce00c818 +Description: PNG library - runtime + +Package: libpopt0 +Priority: important +Section: libs +Installed-Size: 208 +Maintainer: Paul Martin <pm@debian.org> +Architecture: i386 +Source: popt +Version: 1.16-1 +Replaces: popt +Depends: libc6 (>= 2.3) +Conflicts: libpopt-dev (<= 1.4-1), popt, rpm (<= 4.0.2-3) +Filename: pool/main/p/popt/libpopt0_1.16-1_i386.deb +Size: 52890 +MD5Sum: 935b9a8eea67b75326002f75b374383d +Description: lib for parsing cmdline parameters + +Package: libreadline6 +Priority: important +Section: libs +Installed-Size: 356 +Maintainer: Matthias Klose <doko@debian.org> +Architecture: i386 +Source: readline6 +Version: 6.1-3 +Depends: readline-common, libc6 (>= 2.3), libncurses5 (>= 5.7+20100313) +Filename: pool/main/r/readline6/libreadline6_6.1-3_i386.deb +Size: 145914 +MD5Sum: 63c3a619ef1fd5ec1c04fd0992f3f71f +Description: GNU readline and history libraries, run-time libraries + +Package: libselinux1 +Priority: required +Section: libs +Installed-Size: 216 +Maintainer: Manoj Srivastava <srivasta@debian.org> +Architecture: i386 +Source: libselinux +Version: 2.0.96-1 +Depends: libc6 (>= 2.3.4) +Filename: pool/main/libs/libselinux/libselinux1_2.0.96-1_i386.deb +Size: 82752 +MD5Sum: 65c82e5ad1ebe75c056eeb33147e1eeb +Description: SELinux runtime shared libraries + +Package: libslang2 +Priority: important +Section: libs +Installed-Size: 1264 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: i386 +Source: slang2 +Version: 2.2.2-4 +Depends: libc6 (>= 2.3) +Recommends: libpng12-0 +Filename: pool/main/s/slang2/libslang2_2.2.2-4_i386.deb +Size: 507014 +MD5Sum: 2cd4ae18b2f0e4a04c0e98d4913d5fd7 +Description: The S-Lang programming library - runtime version + +Package: libsm6 +Priority: optional +Section: libs +Installed-Size: 144 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libsm +Version: 2:1.1.1-1 +Depends: libc6 (>= 2.1.3), libice6 (>= 1:1.0.0), libuuid1 (>= 2.16) +Filename: pool/main/libs/libsm/libsm6_1.1.1-1_i386.deb +Size: 23976 +MD5Sum: eda3e07bf434262ba270bb1ae12e71e0 +Description: X11 Session Management library + +Package: libsqlite3-0 +Priority: standard +Section: libs +Installed-Size: 684 +Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.hu> +Architecture: i386 +Source: sqlite3 +Version: 3.7.0-1.1 +Depends: libc6 (>= 2.3.6-6~) +Filename: pool/main/s/sqlite3/libsqlite3-0_3.7.0-1.1_i386.deb +Size: 380004 +MD5Sum: 4706e644e7f3f2b183db0ce001a7bbaa +Description: SQLite 3 shared library + +Package: libstartup-notification0 +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Ondřej Surý <ondrej@debian.org> +Architecture: i386 +Source: startup-notification +Version: 0.10-1 +Depends: libc6 (>= 2.1.3), libice6 (>= 1:1.0.0), libsm6, libx11-6, libxcb-atom1 (>= 0.3.3), libxcb-aux0 (>= 0.3.3), libxcb-event1 (>= 0.3.3), libxcb1 (>= 1.1.92) +Filename: pool/main/s/startup-notification/libstartup-notification0_0.10-1_i386.deb +Size: 21230 +MD5Sum: 0e62e87fe56b93c30e7dee751fc7a59f +Description: library for program launch feedback (shared library) + +Package: libstdc++6 +Priority: required +Section: libs +Installed-Size: 1204 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.4 +Version: 4.4.4-8 +Depends: gcc-4.4-base (= 4.4.4-8), libc6 (>= 2.3.2), libgcc1 +Conflicts: scim (<< 1.4.2-1) +Filename: pool/main/g/gcc-4.4/libstdc++6_4.4.4-8_i386.deb +Size: 347294 +MD5Sum: c5ad981710bbe349c2847b1cc00cafc1 +Description: The GNU Standard C++ Library v3 + +Package: libtasn1-3 +Priority: important +Section: libs +Installed-Size: 152 +Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Architecture: i386 +Version: 2.7-1 +Depends: libc6 (>= 2.3) +Conflicts: libtasn1-2 (= 0.3.1-1) +Filename: pool/main/libt/libtasn1-3/libtasn1-3_2.7-1_i386.deb +Size: 61424 +MD5Sum: 0120dbb8123bef3fe7cb4155e95e4307 +Description: Manage ASN.1 structures (runtime) + +Package: libtext-charwidth-perl +Priority: required +Section: perl +Installed-Size: 92 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Version: 0.04-6 +Depends: libc6 (>= 2.1.3), perl-base (>= 5.10.0-23), perlapi-5.10.0 +Filename: pool/main/libt/libtext-charwidth-perl/libtext-charwidth-perl_0.04-6_i386.deb +Size: 11582 +MD5Sum: 6aa5a252db205de6817ee954f5193fbf +Description: get display widths of characters on the terminal + +Package: libtext-iconv-perl +Priority: required +Section: perl +Installed-Size: 104 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Version: 1.7-2 +Depends: libc6 (>= 2.1.3), perl-base (>= 5.10.0-23), perlapi-5.10.0 +Filename: pool/main/libt/libtext-iconv-perl/libtext-iconv-perl_1.7-2_i386.deb +Size: 18076 +MD5Sum: 707f244dc1df10391dd9679b2645a911 +Description: converts between character sets in Perl + +Package: libtext-wrapi18n-perl +Priority: required +Section: perl +Installed-Size: 28 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: all +Version: 0.06-7 +Depends: libtext-charwidth-perl +Filename: pool/main/libt/libtext-wrapi18n-perl/libtext-wrapi18n-perl_0.06-7_all.deb +Size: 9004 +MD5Sum: 5608c08e10e79269e391f02856f96ec5 +Description: internationalized substitute of Text::Wrap + +Package: libthai-data +Priority: optional +Section: libs +Installed-Size: 596 +Maintainer: Theppitak Karoonboonyanan <thep@debian.org> +Architecture: all +Source: libthai +Version: 0.1.14-2 +Conflicts: libthai0 (<< 0.1.10) +Filename: pool/main/libt/libthai/libthai-data_0.1.14-2_all.deb +Size: 198282 +MD5Sum: 201f73aac77afd1eef48bbf858964586 +Description: Data files for Thai language support library + +Package: libthai0 +Priority: optional +Section: libs +Installed-Size: 108 +Maintainer: Theppitak Karoonboonyanan <thep@debian.org> +Architecture: i386 +Source: libthai +Version: 0.1.14-2 +Depends: libc6 (>= 2.1.3), libdatrie1 (>= 0.2.0), libthai-data (>= 0.1.10) +Conflicts: libdatrie0 (<< 0.1.4) +Filename: pool/main/libt/libthai/libthai0_0.1.14-2_i386.deb +Size: 40222 +MD5Sum: 7f65a895b5a232442969584c8aa6635d +Description: Thai language support library +Enhances: kdelibs5 + +Package: libtiff4 +Priority: optional +Section: libs +Installed-Size: 488 +Maintainer: Jay Berkenbilt <qjb@debian.org> +Architecture: i386 +Source: tiff +Version: 3.9.4-1 +Depends: libc6 (>= 2.3), libjpeg62, zlib1g (>= 1:1.1.4) +Filename: pool/main/t/tiff/libtiff4_3.9.4-1_i386.deb +Size: 182070 +MD5Sum: 4438501f82789f341c245d79b40c175f +Description: Tag Image File Format (TIFF) library + +Package: libuuid1 +Priority: required +Section: libs +Installed-Size: 112 +Maintainer: LaMont Jones <lamont@debian.org> +Architecture: i386 +Source: util-linux +Version: 2.17.2-3.1 +Replaces: e2fsprogs (<< 1.34-1) +Depends: passwd, libc6 (>= 2.3) +Recommends: uuid-runtime +Filename: pool/main/u/util-linux/libuuid1_2.17.2-3.1_i386.deb +Size: 58126 +MD5Sum: cea424e8f6340a5ee8d4e64da2d6c953 +Description: Universally Unique ID library + +Package: libx11-6 +Priority: optional +Section: libs +Installed-Size: 1356 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libx11 +Version: 2:1.3.3-3 +Depends: libc6 (>= 2.3.2), libxcb1 (>= 1.2), libx11-data +Conflicts: xlibs-data (<< 1:7.0.0) +Filename: pool/main/libx/libx11/libx11-6_1.3.3-3_i386.deb +Size: 816814 +MD5Sum: 40f5b42f6af2ad1550d3a2d6f634218f +Description: X11 client-side library + +Package: libx11-data +Priority: optional +Section: x11 +Installed-Size: 2504 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: libx11 +Version: 2:1.3.3-3 +Replaces: libx11-6 (<= 2:1.0.0-1) +Filename: pool/main/libx/libx11/libx11-data_1.3.3-3_all.deb +Size: 232336 +MD5Sum: 5f5b2da7a114ada3bb7310f2b40cce51 +Description: X11 client-side library + +Package: libxau6 +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxau +Version: 1:1.0.6-1 +Depends: libc6 (>= 2.1.3) +Filename: pool/main/libx/libxau/libxau6_1.0.6-1_i386.deb +Size: 16144 +MD5Sum: ad33495d6208f5dd07bee9cdb07b29d1 +Description: X11 authorisation library + +Package: libxcb-atom1 +Priority: extra +Section: libs +Installed-Size: 64 +Maintainer: Julien Danjou <acid@debian.org> +Architecture: i386 +Source: xcb-util +Version: 0.3.6-1 +Depends: libc6 (>= 2.1.3), libxcb1 +Filename: pool/main/x/xcb-util/libxcb-atom1_0.3.6-1_i386.deb +Size: 9526 +MD5Sum: 79337f41329668bc137a7e4e2f273dd8 +Description: utility libraries for X C Binding -- atom + +Package: libxcb-aux0 +Priority: extra +Section: libs +Installed-Size: 64 +Maintainer: Julien Danjou <acid@debian.org> +Architecture: i386 +Source: xcb-util +Version: 0.3.6-1 +Depends: libc6 (>= 2.1.3), libxcb1 +Filename: pool/main/x/xcb-util/libxcb-aux0_0.3.6-1_i386.deb +Size: 8472 +MD5Sum: 88d95e67be4ca3a7601db394241ab486 +Description: utility libraries for X C Binding -- aux + +Package: libxcb-event1 +Priority: extra +Section: libs +Installed-Size: 64 +Maintainer: Julien Danjou <acid@debian.org> +Architecture: i386 +Source: xcb-util +Version: 0.3.6-1 +Depends: libc6 (>= 2.1.3), libxcb1 +Filename: pool/main/x/xcb-util/libxcb-event1_0.3.6-1_i386.deb +Size: 8514 +MD5Sum: 8dc0f269f8b0cea17f6207cce0964a51 +Description: utility libraries for X C Binding -- event + +Package: libxcb-render-util0 +Priority: extra +Section: libs +Installed-Size: 64 +Maintainer: Julien Danjou <acid@debian.org> +Architecture: i386 +Source: xcb-util +Version: 0.3.6-1 +Depends: libc6 (>= 2.1.3), libxcb-render0, libxcb1 +Filename: pool/main/x/xcb-util/libxcb-render-util0_0.3.6-1_i386.deb +Size: 9334 +MD5Sum: 8f0afaba8747efba1ae99d995e03b7c5 +Description: utility libraries for X C Binding -- render-util + +Package: libxcb-render0 +Priority: optional +Section: libs +Installed-Size: 84 +Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Architecture: i386 +Source: libxcb +Version: 1.6-1 +Depends: libc6 (>= 2.1.3), libxcb1 (>= 0) +Filename: pool/main/libx/libxcb/libxcb-render0_1.6-1_i386.deb +Size: 14916 +MD5Sum: 882950cf440b422d17fe5f784745c3fb +Description: X C Binding, render extension + +Package: libxcb1 +Priority: optional +Section: libs +Installed-Size: 164 +Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Architecture: i386 +Source: libxcb +Version: 1.6-1 +Depends: libc6 (>= 2.3.2), libxau6, libxdmcp6 +Breaks: libxcb-xlib0 +Filename: pool/main/libx/libxcb/libxcb1_1.6-1_i386.deb +Size: 40500 +MD5Sum: 8b1bd1c23264932b7e2c639302366a06 +Description: X C Binding + +Package: libxcomposite1 +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxcomposite +Version: 1:0.4.2-1 +Depends: libc6 (>= 2.1.3), libx11-6, libxext6, libxfixes3 (>= 1:4.0.1) +Filename: pool/main/libx/libxcomposite/libxcomposite1_0.4.2-1_i386.deb +Size: 15116 +MD5Sum: 43b75f3d05d774ae791977cd20ce1624 +Description: X11 Composite extension library + +Package: libxcursor1 +Priority: optional +Section: libs +Installed-Size: 88 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxcursor +Version: 1:1.1.10-2 +Depends: libc6 (>= 2.3), libx11-6 (>= 0), libxfixes3 (>= 1:4.0.1), libxrender1 +Filename: pool/main/libx/libxcursor/libxcursor1_1.1.10-2_i386.deb +Size: 24942 +MD5Sum: 8aadf2988320b81f3422bddd68c97f1b +Description: X cursor management library + +Package: libxdamage1 +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxdamage +Version: 1:1.1.3-1 +Depends: libc6 (>= 2.1.3), libx11-6, libxfixes3 (>= 1:4.0.1) +Filename: pool/main/libx/libxdamage/libxdamage1_1.1.3-1_i386.deb +Size: 13568 +MD5Sum: 7b5b7a9937adff801f15857d2e1c7bce +Description: X11 damaged region extension library + +Package: libxdmcp6 +Priority: optional +Section: libs +Installed-Size: 76 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxdmcp +Version: 1:1.0.3-2 +Depends: libc6 (>= 2.1.3) +Filename: pool/main/libx/libxdmcp/libxdmcp6_1.0.3-2_i386.deb +Size: 18426 +MD5Sum: cecbdad4e8a639735cf7e148681fb667 +Description: X11 Display Manager Control Protocol library + +Package: libxext6 +Priority: optional +Section: libs +Installed-Size: 132 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxext +Version: 2:1.1.2-1 +Depends: libc6 (>= 2.1.3), libx11-6 +Filename: pool/main/libx/libxext/libxext6_1.1.2-1_i386.deb +Size: 41694 +MD5Sum: 9c8bc9d73ed6ad2697df80f72edfd3c3 +Description: X11 miscellaneous extension library + +Package: libxfixes3 +Priority: optional +Section: libs +Installed-Size: 72 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxfixes +Version: 1:4.0.5-1 +Depends: libc6 (>= 2.1.3), libx11-6 +Filename: pool/main/libx/libxfixes/libxfixes3_4.0.5-1_i386.deb +Size: 17976 +MD5Sum: 8e0bf9a4ed5a0b6361085795e69ae248 +Description: X11 miscellaneous 'fixes' extension library + +Package: libxft2 +Priority: optional +Section: libs +Installed-Size: 140 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: xft +Version: 2.1.14-2 +Depends: libc6 (>= 2.3), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libx11-6 (>= 0), libxrender1 +Filename: pool/main/x/xft/libxft2_2.1.14-2_i386.deb +Size: 52030 +MD5Sum: 23a966a6319e50b8b8b9857da75cae5b +Description: FreeType-based font drawing library for X + +Package: libxi6 +Priority: optional +Section: libs +Installed-Size: 132 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxi +Version: 2:1.3-4 +Depends: libc6 (>= 2.1.3), libx11-6 (>= 2:1.2.99.901), libxext6 (>= 0) +Filename: pool/main/libx/libxi/libxi6_1.3-4_i386.deb +Size: 53936 +MD5Sum: 83cac8ca145398686339817466e11ffd +Description: X11 Input extension library + +Package: libxinerama1 +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxinerama +Version: 2:1.1-3 +Depends: libc6 (>= 2.1.3), libx11-6 (>= 0), libxext6 (>= 0) +Filename: pool/main/libx/libxinerama/libxinerama1_1.1-3_i386.deb +Size: 12186 +MD5Sum: 1fbe54b8d05b1096a4ea70cd50e1510b +Description: X11 Xinerama extension library + +Package: libxml2 +Priority: standard +Section: libs +Installed-Size: 1588 +Maintainer: Debian XML/SGML Group <debian-xml-sgml-pkgs@lists.alioth.debian.org> +Architecture: i386 +Version: 2.7.7.dfsg-4 +Depends: libc6 (>= 2.7), zlib1g (>= 1:1.2.3.3.dfsg) +Recommends: xml-core +Filename: pool/main/libx/libxml2/libxml2_2.7.7.dfsg-4_i386.deb +Size: 826866 +MD5Sum: 7153d99951b5d33f66eaa20a657e033b +Description: GNOME XML library + +Package: libxrandr2 +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxrandr +Version: 2:1.3.0-3 +Depends: libc6 (>= 2.1.3), libx11-6 (>= 0), libxext6 (>= 0), libxrender1 +Filename: pool/main/libx/libxrandr/libxrandr2_1.3.0-3_i386.deb +Size: 26618 +MD5Sum: ccd579d696aad72be69bdf1be92541f4 +Description: X11 RandR extension library + +Package: libxrender1 +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxrender +Version: 1:0.9.6-1 +Depends: libc6 (>= 2.1.3), libx11-6 +Filename: pool/main/libx/libxrender/libxrender1_0.9.6-1_i386.deb +Size: 29280 +MD5Sum: ef296f771209c82ed1245c67798b6081 +Description: X Rendering Extension client library + +Package: libxt6 +Priority: optional +Section: libs +Installed-Size: 452 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxt +Version: 1:1.0.7-1 +Depends: libc6 (>= 2.7), libice6 (>= 1:1.0.0), libsm6, libx11-6 (>= 0) +Filename: pool/main/libx/libxt/libxt6_1.0.7-1_i386.deb +Size: 171518 +MD5Sum: aa8e8f0a7ee7b57c2d58786af72da142 +Description: X11 toolkit intrinsics library + +Package: lsb-base +Priority: required +Section: misc +Installed-Size: 72 +Maintainer: Chris Lawrence <lawrencc@debian.org> +Architecture: all +Source: lsb +Version: 3.2-23.1 +Replaces: lsb (<< 2.0-6), lsb-core (<< 2.0-6) +Depends: sed, ncurses-bin +Conflicts: lsb (<< 2.0-6), lsb-core (<< 2.0-6) +Filename: pool/main/l/lsb/lsb-base_3.2-23.1_all.deb +Size: 20462 +MD5Sum: 60637dd487aedfaa48e3a38bc1a0ea4c +Description: Linux Standard Base 3.2 init script functionality + +Package: ncurses-bin +Essential: yes +Priority: required +Section: utils +Installed-Size: 500 +Maintainer: Craig Small <csmall@debian.org> +Architecture: i386 +Source: ncurses +Version: 5.7+20100313-2 +Pre-Depends: libc6 (>= 2.3), libncurses5 (>= 5.7+20100313) +Filename: pool/main/n/ncurses/ncurses-bin_5.7+20100313-2_i386.deb +Size: 314788 +MD5Sum: 408a001ec8f30f40e19caa35772c3e3b +Description: terminal-related programs and man pages + +Package: passwd +Priority: required +Section: admin +Installed-Size: 2208 +Maintainer: Shadow package maintainers <pkg-shadow-devel@lists.alioth.debian.org> +Architecture: i386 +Source: shadow +Version: 1:4.1.4.2-1 +Replaces: manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) +Depends: libc6 (>= 2.3), libpam0g (>= 0.99.7.1), libselinux1 (>= 2.0.82), libpam-modules, debianutils (>= 2.15.2) +Filename: pool/main/s/shadow/passwd_4.1.4.2-1_i386.deb +Size: 975188 +MD5Sum: 2ae7b750afe852093fd38009f054b9f7 +Description: change and administer password and group data + +Package: perl-base +Essential: yes +Priority: required +Section: perl +Installed-Size: 4488 +Maintainer: Niko Tyni <ntyni@debian.org> +Architecture: i386 +Source: perl +Version: 5.10.1-14 +Replaces: libperl5.8 (<< 5.8.0-20), libscalar-list-utils-perl, libxsloader-perl, perl (<< 5.10.1-12), perl-modules (<< 5.10.1-1) +Provides: libscalar-list-utils-perl, libxsloader-perl, perl5-base, perlapi-5.10.0, perlapi-5.10.1 +Pre-Depends: libc6 (>= 2.4), dpkg (>= 1.14.20) +Suggests: perl +Conflicts: autoconf2.13 (<< 2.13-45), libfile-spec-perl (<< 3.30), libscalar-list-utils-perl (<< 1:1.21), libxsloader-perl (<< 0.10), safe-rm (<< 0.8) +Filename: pool/main/p/perl/perl-base_5.10.1-14_i386.deb +Size: 985868 +MD5Sum: 4f62d14690a767e771baf2cffca803a5 +Description: minimal Perl system + +Package: perl-modules +Priority: standard +Section: perl +Installed-Size: 15856 +Maintainer: Niko Tyni <ntyni@debian.org> +Architecture: all +Source: perl +Version: 5.10.1-14 +Replaces: libansicolor-perl, libarchive-tar-perl, libattribute-handlers-perl, libautodie-perl, libcgi-pm-perl, libclass-isa-perl, libcpanplus-perl, libextutils-cbuilder-perl, libextutils-parsexs-perl, libfile-spec-perl, libfile-temp-perl, libi18n-langtags-perl, libio-zlib-perl, liblocale-codes-perl, liblocale-maketext-perl, liblocale-maketext-simple-perl, libmath-bigint-perl, libmodule-build-perl, libmodule-corelist-perl, libmodule-load-conditional-perl, libmodule-load-perl, libmodule-pluggable-perl, libnet-perl, libnet-ping-perl, libparams-check-perl, libparent-perl, libparse-cpan-meta-perl, libpod-escapes-perl, libpod-parser-perl, libpod-plainer-perl, libpod-simple-perl, libswitch-perl, libtest-harness-perl, libtest-simple-perl, libthread-queue-perl, libtime-local-perl, libversion-perl, podlators-perl +Provides: libansicolor-perl, libarchive-tar-perl, libattribute-handlers-perl, libautodie-perl, libcgi-pm-perl, libclass-isa-perl, libcpanplus-perl, libextutils-cbuilder-perl, libextutils-parsexs-perl, libfile-spec-perl, libfile-temp-perl, libi18n-langtags-perl, libio-zlib-perl, liblocale-codes-perl, liblocale-maketext-perl, liblocale-maketext-simple-perl, libmath-bigint-perl, libmodule-build-perl, libmodule-corelist-perl, libmodule-load-conditional-perl, libmodule-load-perl, libmodule-pluggable-perl, libnet-perl, libnet-ping-perl, libparams-check-perl, libparent-perl, libparse-cpan-meta-perl, libpod-escapes-perl, libpod-parser-perl, libpod-plainer-perl, libpod-simple-perl, libswitch-perl, libtest-harness-perl, libtest-simple-perl, libthread-queue-perl, libtime-local-perl, libversion-perl, podlators-perl +Depends: perl (>= 5.10.1-1) +Conflicts: libansicolor-perl (<< 1.10-1), libarchive-tar-perl (<< 1.52), libattribute-handlers-perl (<< 0.85), libautodie-perl (<< 2.06.01), libcgi-pm-perl (<< 3.43), libclass-isa-perl (<< 0.33), libcpanplus-perl (<< 0.88), libextutils-cbuilder-perl (<< 0.2602), libextutils-parsexs-perl (<< 2.2002), libfile-spec-perl (<< 3.30), libfile-temp-perl (<< 0.22), libi18n-langtags-perl (<< 0.35-1), libio-zlib-perl (<< 1.09), liblocale-codes-perl (<< 2.07), liblocale-maketext-perl (<< 1.13), liblocale-maketext-simple-perl (<< 0.18-1), libmath-bigint-perl (<< 1.89), libmodule-build-perl (<< 0.340201), libmodule-corelist-perl (<< 2.18), libmodule-load-conditional-perl (<< 0.30), libmodule-load-perl (<< 0.16), libmodule-pluggable-perl (<< 3.9), libnet-perl (<= 1:1.22), libnet-ping-perl (<< 2.36), libparams-check-perl (<< 0.26-1), libparent-perl (<< 0.221), libparse-cpan-meta-perl (<< 1.39), libpod-escapes-perl (<< 1.04), libpod-parser-perl (<< 1.37), libpod-plainer-perl (<< 0.01), libpod-simple-perl (<< 3.07), libswitch-perl (<< 2.14), libtest-harness-perl (<< 3.17), libtest-simple-perl (<< 0.92), libthread-queue-perl (<< 2.11), libtime-local-perl (<< 1.1901), libversion-perl (<< 1:0.7700), podlators-perl (<= 2.2.2-1) +Filename: pool/main/p/perl/perl-modules_5.10.1-14_all.deb +Size: 3481026 +MD5Sum: c502e5cc355cd19e5d264ae74f3595e2 +Description: Core Perl modules +Build-Essential: yes + +Package: perl +Priority: standard +Section: perl +Installed-Size: 13168 +Maintainer: Niko Tyni <ntyni@debian.org> +Architecture: i386 +Version: 5.10.1-14 +Replaces: libarchive-tar-perl (<= 1.38-2), libcompress-raw-bzip2-perl, libcompress-raw-zlib-perl, libcompress-zlib-perl, libdigest-md5-perl, libdigest-sha-perl, libio-compress-base-perl, libio-compress-bzip2-perl, libio-compress-perl, libio-compress-zlib-perl, libmime-base64-perl, libmodule-corelist-perl (<< 2.14-2), libstorable-perl, libsys-syslog-perl, libthreads-perl, libthreads-shared-perl, libtime-hires-perl, libtime-piece-perl, perl-base (<< 5.10.1-12), perl-doc (<< 5.8.0-1), perl-modules (<< 5.8.1-1) +Provides: data-dumper, libcompress-raw-bzip2-perl, libcompress-raw-zlib-perl, libcompress-zlib-perl, libdigest-md5-perl, libdigest-sha-perl, libio-compress-base-perl, libio-compress-bzip2-perl, libio-compress-perl, libio-compress-zlib-perl, libmime-base64-perl, libstorable-perl, libsys-syslog-perl, libthreads-perl, libthreads-shared-perl, libtime-hires-perl, libtime-piece-perl, perl5 +Depends: perl-base (= 5.10.1-14), perl-modules (>= 5.10.1-14), libbz2-1.0, libc6 (>= 2.4), libdb4.7, libgdbm3 (>= 1.8.3), zlib1g (>= 1:1.2.3.3.dfsg) +Recommends: netbase, make +Suggests: perl-doc, libterm-readline-gnu-perl | libterm-readline-perl-perl +Conflicts: libcompress-raw-bzip2-perl (<< 2.020), libcompress-raw-zlib-perl (<< 2.020), libcompress-zlib-perl (<< 2.020), libdigest-md5-perl (<< 2.39), libdigest-sha-perl (<< 5.47), libio-compress-base-perl (<< 2.020), libio-compress-bzip2-perl (<< 2.020), libio-compress-perl (<< 2.020), libio-compress-zlib-perl (<< 2.020), libmime-base64-perl (<< 3.08), libstorable-perl (<< 2.20), libsys-syslog-perl (<< 0.27), libthreads-perl (<< 1.72), libthreads-shared-perl (<< 1.29), libtime-hires-perl (<< 1.9719), libtime-piece-perl (<< 1.15), perl-doc (<< 5.10.1-1) +Filename: pool/main/p/perl/perl_5.10.1-14_i386.deb +Size: 3767054 +MD5Sum: c402cd511260c137a795afaeb6125876 +Description: Larry Wall's Practical Extraction and Report Language +Build-Essential: yes + +Package: readline-common +Priority: important +Section: utils +Installed-Size: 92 +Maintainer: Matthias Klose <doko@debian.org> +Architecture: all +Source: readline6 +Version: 6.1-3 +Replaces: libreadline-common, libreadline4 (<< 4.3-16), libreadline5 (<< 5.0-11) +Depends: dpkg (>= 1.15.4) | install-info +Conflicts: libreadline-common, libreadline5 (<< 5.0-11) +Filename: pool/main/r/readline6/readline-common_6.1-3_all.deb +Size: 54028 +MD5Sum: 1ddfb1a719db7f302abe921e261b0288 +Description: GNU readline and history libraries, common files + +Package: sed +Essential: yes +Priority: required +Section: utils +Installed-Size: 956 +Maintainer: Clint Adams <schizo@debian.org> +Architecture: i386 +Version: 4.2.1-7 +Depends: dpkg (>= 1.15.4) | install-info +Pre-Depends: libc6 (>= 2.3), libselinux1 (>= 1.32) +Filename: pool/main/s/sed/sed_4.2.1-7_i386.deb +Size: 245832 +MD5Sum: 76a28a89a0684b09abd4c9622f9b0b5f +Description: The GNU sed stream editor + +Package: sensible-utils +Priority: required +Section: utils +Installed-Size: 112 +Maintainer: Clint Adams <schizo@debian.org> +Architecture: all +Version: 0.0.4 +Replaces: debianutils (<= 2.32.3), manpages-pl (<= 20060617-3~) +Filename: pool/main/s/sensible-utils/sensible-utils_0.0.4_all.deb +Size: 5408 +MD5Sum: 6e1c38bc8506fb23d949a4df7e07d5e2 +Description: Utilities for sensible alternative selection + +Package: shared-mime-info +Priority: optional +Section: misc +Installed-Size: 3348 +Maintainer: Filip Van Raemdonck <mechanix@debian.org> +Architecture: i386 +Version: 0.71-3 +Depends: libc6 (>= 2.3), libglib2.0-0 (>= 2.24.0), libxml2 (>= 2.7.4) +Conflicts: libglib2.0-0 (<< 2.17.2), libgnomevfs2-0 (<< 1:2.24.0), tracker (<< 0.6.90) +Filename: pool/main/s/shared-mime-info/shared-mime-info_0.71-3_i386.deb +Size: 842486 +MD5Sum: 783a1538ac9561e082a8dc67f29df778 +Description: FreeDesktop.org shared MIME database and spec + +Package: ttf-dejavu-core +Priority: optional +Section: fonts +Installed-Size: 2592 +Maintainer: Debian Fonts Task Force <pkg-fonts-devel@lists.alioth.debian.org> +Architecture: all +Source: ttf-dejavu +Version: 2.31-1 +Replaces: ttf-dejavu (<< 2.20-1) +Conflicts: ttf-dejavu (<< 2.20-1) +Filename: pool/main/t/ttf-dejavu/ttf-dejavu-core_2.31-1_all.deb +Size: 1451418 +MD5Sum: d3d8850ec0ef68d9b7655545ce0b2b22 +Description: Vera font family derivative with additional characters + +Package: ucf +Priority: standard +Section: utils +Installed-Size: 260 +Maintainer: Manoj Srivastava <srivasta@debian.org> +Architecture: all +Version: 3.0025 +Depends: debconf (>= 1.5.19), coreutils (>= 5.91) +Filename: pool/main/u/ucf/ucf_3.0025_all.deb +Size: 65960 +MD5Sum: 6e664d04fea09239d450ae9f3d246a0f +Description: Update Configuration File: preserve user changes to config files. + +Package: whiptail +Priority: important +Section: utils +Installed-Size: 100 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: i386 +Source: newt +Version: 0.52.11-1 +Replaces: newt0.10, newt0.21 (<< 0.21-4), whiptail-utf8 +Provides: whiptail-provider, whiptail-utf8 +Depends: libc6 (>= 2.1), libnewt0.52 (>= 0.52.11), libpopt0 (>= 1.16), libslang2 (>= 2.0.7-1) +Conflicts: whiptail-provider +Filename: pool/main/n/newt/whiptail_0.52.11-1_i386.deb +Size: 39118 +MD5Sum: cac6b0f08d25c91011d5c267e35cb0d2 +Description: Displays user-friendly dialog boxes from shell scripts + +Package: x11-common +Priority: optional +Section: x11 +Installed-Size: 568 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: xorg +Version: 1:7.5+6 +Replaces: x-common, xfree86-common, xorg-common, xserver-common (<< 7) +Depends: debconf (>= 0.5) | debconf-2.0, debianutils (>= 1.13), lsb-base (>= 1.3-9ubuntu2) +Pre-Depends: debconf | debconf-2.0 +Conflicts: aee (<= 2.2.15b-1), ascd (<= 0.13.2-3), beaver (<= 0.2.5-2), bibview (<= 2.2-8), bugsx (<= 1.08-8), buici-clock (<= 0.4.5+b1), communicator-smotif-477, ctwm (<= 3.7-2), emelfm (<= 0.9.2-7), epan, fte-xwindow (<= 0.50.0-1.3), fvwm1 (<= 1.24r-46), fvwm95 (<= 2.0.43ba-23+b1), gerstensaft (<= 0.2-5.1), ghostview, gipsc (<= 0.4.3-2), grace (<= 1:5.1.18-1), grace6 (<= 5.99.0+final-4), gradio (<= 1.0.1-6), groff (<= 1.18.1.1-7), guitar (<= 0.1.4-11), hamsoft (<< 0.2.3-1), hanterm-classic (<= 3.1.6.0-4), hanterm-xf (<= 1:3.3.1p18-9.2), hfsutils-tcltk (<= 3.2.6-7), ibp (<= 0.21-4), isdnutils-xtools (<= 1:3.8.2005-12-06-4), ivtools-bin (<= 1.1.3-5), ivtools-dev (<= 1.1.3-5), kdrill (<= 6.4-2.1), kinput2-canna (<= 3.1-7), kinput2-canna-wnn (<= 3.1-7), kinput2-wnn (<= 3.1-7), kterm (<= 6.2.0-45), lbxproxy (<< 7.0), libmotif-dev (<= 2.2.3-1.3), libxft-dev (<= 2.1.8.2-5), lm-batmon (<= 0.96-3), login.app (<= 1.2.1-18), lsb-core (<= 3.1-4), lwm (<= 1.2.1-1), mctools-lite (<= 970129-16), mgp (<= 1.11b-6), motif-clients (<= 2.2.3-1.3), navigator-smotif-477, netscape-base-4, olvwm (<= 4.4.3.2p1.4-21), olwm (<= 3.2p1.4-21), oneko (<= 1.2.sakura.6-1), opera (<< 9.10-20060616), pgaccess (<= 1:0.98.8.20030520-2), phototk, pixmap (<= 2.6pl4-14.1), plotmtv (<= 1.4.4t-8.1), pmud (<= 0.10-9), ppxp (<= 0.2001080415-14), ppxp-x11 (<= 0.2001080415-14), procmeter (<= 2.5.1-11), propsel (<= 971130-5.3), proxymngr (<< 7.0), qcam (<= 0.91-11.1), regexplorer (<= 0.1.6-12), seyon (<= 2.20c-20), skkinput (<= 1:2.06.4-4), stella (<< 2.2-1), tkdesk (<= 2.0-5), tkseti (<= 3.06-1), tkworld, twlog (<= 1.3-4), twm (<< 7.0), ucbmpeg-play (<< 2.3p-13), vide (<= 1.21-3), videogen (<= 0.32-1), vtwm (<= 5.4.7-2), w9wm (<= 0.4.2-4), wdm (<= 1.28-1), wily (<= 0.13.41-6), wmavgload (<= 0.7.0-6.1), wmcpu (<= 1.3-4.1), wmdate (<= 0.5-7.1), wmnet (<= 1.05-12), wmnetselect (<= 0.85-5.5), wmscope (<= 3.0-9.1), wmsensors (<= 1.0.4-3.4), wmtv (<= 0.6.5-15), x-common, xautolock (<= 1:2.1-6), xbanner (<= 1.31-23), xbase-clients (<< 1:7.0), xbatt (<= 1.2.1-4), xbattbar (<= 1.4.2-3.1), xcal (<= 4.1-18.2), xcalendar-i18n (<= 4.0.0.i18p1-13.1), xcb (<= 2.4-4), xclip (<= 0.08-5), xclips (<= 6.21-6), xcolors (<= 1.5a-2), xcolorsel (<= 1.1a-11), xdkcal (<= 0.9d-2.1), xdm (<= 1:1.0.1-6), xdmx (<< 1:1.0), xdu (<= 3.0-14), xearth (<= 1.1-10.2), xengine (<= 1.11-9), xephem (<= 3.4-5), xext, xezmlm (<= 1.0.3-11), xfaces (<= 3.3-25), xfishtank (<= 2.2-23.1), xfm (<= 1.4.3-8), xfractint (<< 20.3.01-1), xfree86-common, xfs (<< 1:1.0), xfs-xtt (<= 1:1.4.1.xf430-6), xftp, xfwp (<< 7.0), xgdipc (<= 1.2-0.3), xgmod (<= 3.1-9), xgobi, xgraph (<= 12.1-3), xinput (<= 1.2-5.2), xipmsg (<= 0.8088-1.1), xisp, xlbiff (<< 4.1-4), xli (<= 1.17.0-21), xlockmore (<= 1:5.21-1), xlockmore-gl (<= 1:5.21-1), xlogmaster (<= 1.6.0-8), xmailbox (<= 2.5-9), xmem (<= 1.20-19), xmeter (<= 1.15-6), xmh (<= 6.8.2.dfsg.1-4), xmix (<= 2.1-5), xmon (<= 1.5.6-1.3), xnecview (<= 1.34-2), xnest (<< 1:1.0), xodo (<= 1.2-9.2), xorg-common, xpaste, xpmumon (<= 1.3.0), xpostit (<= 3.3.1-8.2), xpostitplus, xprint (<= 1:0.1.0.alpha1-13), xrn (<= 9.02-7.1), xserver-common (<< 7), xserver-xfree86 (<< 1:7.0), xserver-xfree86-dbg, xserver-xorg (<< 1:7.4~), xslideshow (<= 3.1-8.1), xsysinfo (<= 1.7-2), xtel (<= 3.3.0-5.4), xterm (<< 208-1), xtoolwait (<= 1.3-6), xtrkcad (<= 3.1.4-1), xtrlock (<= 2.0-11), xturqstat (<= 2.2.2sarge1), xutils (<< 1:7.0), xv (<= 3.10a-26), xvfb (<< 1:1.0), xview-clients (<= 3.2p1.4-21), xviewg (<= 3.2p1.4-21), xviewg-dev (<= 3.2p1.4-21), xvkbd (<= 2.6-2.1), xwit (<= 3.4-6), xxkb (<= 1.10-2.1), xzoom (<= 0.3-17), yank (<= 0.2.1-7.2) +Breaks: gdm (<< 2.20.7-5) +Filename: pool/main/x/xorg/x11-common_7.5+6_all.deb +Size: 280238 +MD5Sum: 312093359c4f0f7decfb049768d6bb12 +Description: X Window System (X.Org) infrastructure + +Package: xulrunner-1.9.1 +Priority: optional +Section: libs +Installed-Size: 19060 +Maintainer: Maintainers of Mozilla-related packages <pkg-mozilla-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: xulrunner +Version: 1.9.1.11-1 +Replaces: xulrunner-1.9.1-gnome-support +Depends: libasound2 (>> 1.0.18), libatk1.0-0 (>= 1.29.3), libbz2-1.0, libc6 (>= 2.3.6-6~), libcairo2 (>= 1.8.8), libdbus-1-3 (>= 1.0.2), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.24.0), libgtk2.0-0 (>= 2.18.0), libhunspell-1.2-0 (>= 1.2.11), libjpeg62 (>= 6b1), libmozjs2d (= 1.9.1.11-1), libnspr4-0d (>> 4.7.1-1), libnss3-1d (>= 3.12.6), libpango1.0-0 (>= 1.14.0), libpng12-0 (>= 1.2.13-4), libreadline6 (>= 6.0), libsqlite3-0 (>= 3.6.23.1), libstartup-notification0 (>= 0.10), libstdc++6 (>= 4.1.1), libx11-6, libxrender1, libxt6, zlib1g (>= 1:1.1.4) +Suggests: libdbus-glib-1-2 (>= 0.78), libgconf2-4 (>= 2.27.0), libgnome2-0 (>= 2.17.3), libgnomevfs2-0 (>= 1:2.17.90), libgnomeui-0, libcanberra0 +Conflicts: j2re1.4, pango-graphite (<< 0.9.3), xulrunner-1.9.1-gnome-support +Breaks: iceweasel (<< 3.5.5-1) +Filename: pool/main/x/xulrunner/xulrunner-1.9.1_1.9.1.11-1_i386.deb +Size: 7230878 +MD5Sum: d2b3c7b52aee7284290136e2c844ed7b +Description: XUL + XPCOM application runner + +Package: xz-utils +Priority: required +Section: utils +Installed-Size: 364 +Maintainer: Jonathan Nieder <jrnieder@gmail.com> +Architecture: i386 +Version: 4.999.9beta+20100713-1 +Replaces: xz-lzma (<< 4.999.9beta+20091004-1) +Depends: libc6 (>= 2.6), liblzma2 (>= 4.999.9beta+20100602) +Suggests: xz-lzma +Breaks: xz-lzma (<< 4.999.9beta+20091004-1) +Filename: pool/main/x/xz-utils/xz-utils_4.999.9beta+20100713-1_i386.deb +Size: 174098 +MD5Sum: a2a576f97035c84b78e7f269656cab86 +Description: XZ-format compression utilities + +Package: zlib1g +Priority: required +Section: libs +Installed-Size: 160 +Maintainer: Mark Brown <broonie@debian.org> +Architecture: i386 +Source: zlib +Version: 1:1.2.3.4.dfsg-3 +Provides: libz1 +Depends: libc6 (>= 2.1.3) +Conflicts: zlib1 (<= 1:1.0.4-7) +Filename: pool/main/z/zlib/zlib1g_1.2.3.4.dfsg-3_i386.deb +Size: 75952 +MD5Sum: 37246cd4fe5d4cb0f7c03ce3082164a3 +Description: compression library - runtime + diff --git a/test/integration/Packages-bug-593360-modifiers-in-names b/test/integration/Packages-bug-593360-modifiers-in-names new file mode 100644 index 0000000..d2ac8d4 --- /dev/null +++ b/test/integration/Packages-bug-593360-modifiers-in-names @@ -0,0 +1,42 @@ +Package: g++ +Priority: optional +Section: devel +Installed-Size: 40 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-defaults (1.96) +Version: 4:4.4.5-1 +Filename: pool/main/g/gcc-defaults/g++_4.4.5-1_i386.deb +Size: 1372 +MD5sum: 37e129a4b130e8b96a9b9d5b26a3fffa +SHA1: d98768d1547389a563e60433268143f42578c3e6 +SHA256: 18d933972392d233127bdd766cfcaaaa2e35f57de47c7af678d599be9613d562 +Description: The GNU C++ compiler + +Package: apt +Priority: important +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: all +Version: 0.8.8 +Filename: pool/main/a/apt/apt_0.8.8_i386.deb +Size: 2140632 +MD5sum: 4283aa3bb751253faf1b2204e0229e4f +SHA1: 59d432f56901faa86e814a436b8da010ee1c7b8a +SHA256: 072dcf4359dce9698aeaa54366eb20513f860c2bb6d44a95973c0b2ad413bfab +Description: Advanced front-end for dpkg + +Package: apt+ +Priority: important +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: all +Version: 0.8.8 +Filename: pool/main/a/apt/apt_0.8.8_i386.deb +Size: 2140632 +MD5sum: 4283aa3bb751253faf1b2204e0229e4f +SHA1: 59d432f56901faa86e814a436b8da010ee1c7b8a +SHA256: 072dcf4359dce9698aeaa54366eb20513f860c2bb6d44a95973c0b2ad413bfab +Description: Advanced front-end for dpkg diff --git a/test/integration/Packages-bug-598669-install-postfix-gets-exim-heavy b/test/integration/Packages-bug-598669-install-postfix-gets-exim-heavy new file mode 100644 index 0000000..a249d6e --- /dev/null +++ b/test/integration/Packages-bug-598669-install-postfix-gets-exim-heavy @@ -0,0 +1,30 @@ +Package: exim4-daemon-heavy +Priority: optional +Section: mail +Installed-Size: 1060 +Maintainer: Exim4 Maintainers <pkg-exim4-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: exim4 +Version: 4.72-1 +Replaces: mail-transport-agent +Provides: mail-transport-agent +Conflicts: mail-transport-agent +Filename: pool/main/e/exim4/exim4-daemon-heavy_4.72-1_i386.deb +Size: 508988 +MD5sum: 7adf3b0ef8f134e70d19ee216e6f4452 +Description: Exim MTA (v4) daemon with extended features, including exiscan-acl + +Package: postfix +Priority: extra +Section: mail +Installed-Size: 3196 +Maintainer: LaMont Jones <lamont@debian.org> +Architecture: i386 +Version: 2.7.1-1 +Replaces: mail-transport-agent +Provides: mail-transport-agent +Conflicts: mail-transport-agent +Filename: pool/main/p/postfix/postfix_2.7.1-1_i386.deb +Size: 1325662 +MD5sum: 1ef63b6a62b4be120a9cdc312b81a698 +Description: High-performance mail transport agent diff --git a/test/integration/Packages-bug-605394-versioned-or-groups b/test/integration/Packages-bug-605394-versioned-or-groups new file mode 100644 index 0000000..6032736 --- /dev/null +++ b/test/integration/Packages-bug-605394-versioned-or-groups @@ -0,0 +1,71 @@ +Package: apache2-mpm-prefork +Priority: optional +Section: httpd +Installed-Size: 68 +Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org> +Architecture: i386 +Source: apache2 +Version: 2.2.16-4 +Provides: apache2-mpm +Conflicts: apache2-mpm +Filename: pool/main/a/apache2/apache2-mpm-prefork_2.2.16-4_i386.deb +Size: 2276 +MD5Sum: c0db3e637052e59dbdb2fa08f4cdcea4 +Description: Apache HTTP Server - traditional non-threaded model +Task: web-server + +Package: apache2-mpm-worker +Priority: optional +Section: httpd +Installed-Size: 68 +Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org> +Architecture: i386 +Source: apache2 +Version: 2.2.16-4 +Provides: apache2-mpm +Conflicts: apache2-mpm +Filename: pool/main/a/apache2/apache2-mpm-worker_2.2.16-4_i386.deb +Size: 2220 +MD5Sum: 71bccda875aa0afac700410b951370ba +Description: Apache HTTP Server - high speed threaded model + +Package: libapache2-mod-php5 +Priority: optional +Section: httpd +Installed-Size: 7588 +Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org> +Architecture: i386 +Source: php5 +Version: 5.3.3-4 +Depends: apache2-mpm-prefork (>> 2.0.52) +Filename: pool/main/p/php5/libapache2-mod-php5_5.3.3-4_i386.deb +Size: 2886980 +MD5Sum: b41ec4b98aa08966288570e07cd864ab +Description: server-side, HTML-embedded scripting language (Apache 2 module) +Task: web-server + +Package: php5-cgi +Priority: optional +Section: php +Installed-Size: 14672 +Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org> +Architecture: i386 +Source: php5 +Version: 5.3.3-4 +Filename: pool/main/p/php5/php5-cgi_5.3.3-4_i386.deb +Size: 5713726 +MD5Sum: 9e579982032c7bb98508e16e314f45e9 +Description: server-side, HTML-embedded scripting language (CGI binary) + +Package: php5 +Priority: optional +Section: php +Installed-Size: 20 +Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org> +Architecture: all +Version: 5.3.3-4 +Depends: libapache2-mod-php5 (>= 5.3.3-4) | php5-cgi (>= 5.3.3-4) +Filename: pool/main/p/php5/php5_5.3.3-4_all.deb +Size: 1050 +MD5Sum: cbedd95ed5b868ba1ffd10747abc0ee3 +Description: server-side, HTML-embedded scripting language (metapackage) diff --git a/test/integration/Packages-bug-723705-tagfile-truncates-fields b/test/integration/Packages-bug-723705-tagfile-truncates-fields new file mode 100644 index 0000000..c42b850 --- /dev/null +++ b/test/integration/Packages-bug-723705-tagfile-truncates-fields @@ -0,0 +1,167 @@ +Package: cdebconf-gtk-udeb +Source: cdebconf +Version: 0.185 +Installed-Size: 92 +Maintainer: Debian Install System Team <debian-boot@lists.debian.org> +Architecture: amd64 +Description: Gtk+ frontend for Debian Configuration Management System +Description-md5: 75d036e0a245499123544e2254b92e9c +Section: debian-installer +Priority: optional +Filename: pool/main/c/cdebconf/cdebconf-gtk-udeb_0.185_amd64.udeb +Size: 27278 +MD5sum: a1bbbc1d4fb8e0615b5621abac021924 +SHA1: b1a7ab55a90f61e5337847d02ff1d12d73559def +SHA256: cd79f3205304a7932b3309c4df9898c9a53929bc651912659858e087ebe1c18a + +Package: cdebconf-newt-udeb +Source: cdebconf +Version: 0.185 +Installed-Size: 58 +Maintainer: Debian Install System Team <debian-boot@lists.debian.org> +Architecture: amd64 +Description: Newt frontend for Debian Configuration Management System +Description-md5: e080be5e38cb8c57bca2f3effe9ee030 +Section: debian-installer +Priority: optional +Filename: pool/main/c/cdebconf/cdebconf-newt-udeb_0.185_amd64.udeb +Size: 19192 +MD5sum: de27807f56dae2f2403b3322d5fe6bd2 +SHA1: 57883e223d46a9f25966f9b986e6a3bc2f67d8ef +SHA256: 5f8b9c3a5430f2ec879484a7736582b152d76cc8ba9bc19328268f3635759a1b + +Package: cdebconf-udeb +Source: cdebconf +Version: 0.185 +Installed-Size: 245 +Maintainer: Debian Install System Team <debian-boot@lists.debian.org> +Architecture: amd64 +Provides: debconf-2.0 +Description: Debian Configuration Management System (C-implementation) +Description-md5: 9f3579e9d9f86ac89e667a8707d3cbd3 +Section: debian-installer +Priority: standard +Filename: pool/main/c/cdebconf/cdebconf-udeb_0.185_amd64.udeb +Size: 77376 +MD5sum: e3883706fdbf54c2e5ea959c92b2d37f +SHA1: 0232f1bdf1531db628516ed3a46a27466b267fdc +SHA256: 96345575417a3e4df8a2cadaa55784ec8f6c042defb1e2fc002d941b6116ceab + +Package: cdebconf-gtk-terminal +Source: cdebconf-terminal +Version: 0.22 +Installed-Size: 64 +Maintainer: Debian Install System Team <debian-boot@lists.debian.org> +Architecture: amd64 +Provides: cdebconf-terminal +Depends: cdebconf-gtk-udeb, libc6-udeb (>= 2.17), libglib2.0-udeb (>= 2.36.4), libgtk2.0-0-udeb (>= 2.24.0), libvte9-udeb (>= 1:0.28.0), cdebconf-udeb, cdebconf-gtk-terminal, cdebconf-gtk-terminal, cdebconf-gtk-terminal, cdebconf-gtk-terminal, cdebconf-gtk-terminal, cdebconf-gtk-terminal, cdebconf-gtk-terminal +Description: cdebconf gtk plugin displaying a terminal +Description-md5: 18c4446758aec003eb8cd0a43419f1aa +Section: debian-installer +Priority: extra +Filename: pool/main/c/cdebconf-terminal/cdebconf-gtk-terminal_0.22_amd64.udeb +Size: 14734 +MD5sum: f9c3a7354560cb88e0396e2b7ba54363 +SHA1: 9c1c93328e758bfd9de2752466b271aaf38c8177 +SHA256: ca749853fc3b93db1d08ccdc6b46de27633de52bc5b880fa65275897ebcaaf69 + +Package: cdebconf-newt-terminal +Source: cdebconf-terminal +Version: 0.22 +Installed-Size: 43 +Maintainer: Debian Install System Team <debian-boot@lists.debian.org> +Architecture: amd64 +Provides: cdebconf-terminal +Depends: cdebconf-newt-udeb (>= 0.146), libc6-udeb (>= 2.17), libnewt0.52 +Description: cdebconf newt plugin to provide a clean terminal +Description-md5: 4109a053022081b573d864d84d6eb16d +Section: debian-installer +Priority: extra +Filename: pool/main/c/cdebconf-terminal/cdebconf-newt-terminal_0.22_amd64.udeb +Size: 4538 +MD5sum: 20db6152fce5081fcbf49c7c08f21246 +SHA1: fa2a40f777a2f48b9634866bc780fb059e60b2fe +SHA256: c4d99ef27285f0c9090005313165627e56e0972e687af7e68c2b1d1538e2ae09 + +Package: libc6-udeb +Source: eglibc (2.17-92) +Version: 2.17-92+b1 +Installed-Size: 3126 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: amd64 +Provides: glibc-2.17-1, libc-udeb, libc6 +Description: Embedded GNU C Library: Shared libraries - udeb +Description-md5: 9552ce73b7b3fb466e3d89fe8db9a563 +Section: debian-installer +Priority: extra +Filename: pool/main/e/eglibc/libc6-udeb_2.17-92+b1_amd64.udeb +Size: 1056000 +MD5sum: 7fd7032eeeecf7f76eff79a0543fbd72 +SHA1: 724b6a81b8fbc9d4d2bb43d656c08de73f7ada25 +SHA256: 137d4c001bbfde8161315c36e6cb8653ae2c50a8d6b6d2d27396c492d91a1723 + +Package: libglib2.0-udeb +Source: glib2.0 +Version: 2.36.4-1 +Installed-Size: 10070 +Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org> +Architecture: amd64 +Description: GLib library of C routines - minimal runtime +Description-md5: 0244040042870a89aa49f037cce3f1e9 +Section: debian-installer +Priority: optional +Filename: pool/main/g/glib2.0/libglib2.0-udeb_2.36.4-1_amd64.udeb +Size: 1714604 +MD5sum: 72da029f1bbb36057d874f1f82a5d00a +SHA1: 32bce78a052ef19a620f43ecbe12404fa570c0f1 +SHA256: 8edbc7cb872c0a82705913563f93f9eec5750881e4378c5a48770cde840cd6eb + +Package: libgtk2.0-0-udeb +Source: gtk+2.0 +Version: 2.24.20-1 +Installed-Size: 5035 +Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org> +Architecture: amd64 +Provides: gtk2.0-binver-2.10.0 +Description: GTK+ graphical user interface library - minimal runtime +Description-md5: 32e5112b80c02578837cff4f65dfec84 +Section: debian-installer +Priority: extra +Filename: pool/main/g/gtk+2.0/libgtk2.0-0-udeb_2.24.20-1_amd64.udeb +Size: 1643046 +MD5sum: 25513478eb2e02e5766c0eea0b411ca9 +SHA1: 9274f05bfa930a3406403441ce061bade04e2064 +SHA256: d5f611f48928ae02f759105cf8cff467cde1cb44df56ad31067168b46a80f8bc + +Package: libvte9-udeb +Source: vte +Version: 1:0.28.2-5 +Installed-Size: 628 +Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org> +Architecture: amd64 +Description: Terminal emulator widget for GTK+ 2.0 - minimal runtime +Description-md5: e7993385c30bae6e96c8cb87795a513c +Section: debian-installer +Priority: extra +Filename: pool/main/v/vte/libvte9-udeb_0.28.2-5_amd64.udeb +Size: 216968 +MD5sum: 7da7201effaf5ced19abd9d0b45aa2c6 +SHA1: a424cf779e7614d79740c422b6342de04fed3646 +SHA256: 4963033cbda5a8ba7eb8ebf1debae34463b8e63b821259860cfb51c1ab99562d + +Package: zlib1g-udeb +Source: zlib +Version: 1:1.2.8.dfsg-1 +Installed-Size: 115 +Maintainer: Mark Brown <broonie@debian.org> +Architecture: amd64 +Description: compression library - runtime for Debian installer +Description-md5: 9cab974e3eab657c53bc17611b894c7a +Section: debian-installer +Priority: optional +Filename: pool/main/z/zlib/zlib1g-udeb_1.2.8.dfsg-1_amd64.udeb +Size: 45270 +MD5sum: c02884420f79a3ae4569cf67782f3e74 +SHA1: 7cd1a7c8be4e086de733a0ce76f87d42b8b2173b +SHA256: 61641ee2b5e185232108333438b72bec71ef549fe0e0df1b2b3afa37174e53a7 + diff --git a/test/integration/Packages-bug-lp1347721-dpkg-ordering b/test/integration/Packages-bug-lp1347721-dpkg-ordering new file mode 100644 index 0000000..ea96b38 --- /dev/null +++ b/test/integration/Packages-bug-lp1347721-dpkg-ordering @@ -0,0 +1,445 @@ +Package: init +xEssential: yes +Priority: required +Section: metapackages +Installed-Size: 29 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: pkg-systemd-maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: init-system-helpers +Version: 1.20 +Pre-Depends: sysvinit-core | systemd-sysv | upstart +Filename: pool/main/i/init-system-helpers/init_1.20_i386.deb +Size: 3494 +MD5sum: a388b6f4f6ed0d01b3d459cfad6582fe +SHA1: d0eb6414a6bb48bb886fcc19962f6a7f302977f3 +SHA256: 9f299b2bf18d6e4534f3a73cca97ef93850e1b5fa38f8519da7c2b825d581f4c +Description: System-V-like init utilities - metapackage +Description-md5: e52554c23609041bfbca72fe27a132f9 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu + +Package: libudev1 +Priority: required +Section: libs +Installed-Size: 132 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: systemd +Version: 208-6ubuntu2 +Depends: libc6 (>= 2.17), libselinux1 (>= 1.32) +Pre-Depends: multiarch-support +Filename: pool/main/s/systemd/libudev1_208-6ubuntu2_i386.deb +Size: 36008 +MD5sum: b03338c052438a95919b9db4d6f9493e +SHA1: a85242bfc653255b5fa73d0fbec92815dc9c09fc +SHA256: d66d7948703b33bd617e16a1b9ac6f24ca564312890b1f9218330f638080a307 +Description: libudev shared library +Multi-Arch: same +Homepage: http://www.freedesktop.org/wiki/Software/systemd +Description-md5: ace5b83d7b48187416c90173a93255b6 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: udev +Priority: required +Section: admin +Installed-Size: 5879 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: systemd +Version: 208-6ubuntu2 +Depends: libacl1 (>= 2.2.51-8), libblkid1 (>= 2.19.1), libc6 (>= 2.17), libkmod2 (>= 5~), libselinux1 (>= 2.0.65), libudev1 (= 208-6ubuntu2), lsb-base (>= 4.1+Debian11ubuntu7), util-linux (>= 2.16), procps +Pre-Depends: debconf (>= 1.4.69) | debconf-2.0 +Breaks: consolekit (<< 0.4.6-1) +Filename: pool/main/s/systemd/udev_208-6ubuntu2_i386.deb +Size: 799582 +MD5sum: 814bb3babdbe76994ce536384ca31f88 +SHA1: bbb662c89f2b1ff4fd450d1523cc21b5b1c339bc +SHA256: e444350214c5c121b2ca8031f76c53809f95ebb5c4cec4cf4595c7520ac09529 +Description: /dev/ and hotplug management daemon +Multi-Arch: foreign +Homepage: http://www.freedesktop.org/wiki/Software/systemd +Description-md5: e875ddb09f46f1f7672af537f0c875ca +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: initscripts +Priority: required +Section: admin +Installed-Size: 246 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> +Architecture: i386 +Source: sysvinit +Version: 2.88dsf-41ubuntu16 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Depends: libc6 (>= 2.4), mount (>= 2.11x-1), debianutils (>= 4), lsb-base (>= 4.1+Debian11ubuntu7), sysvinit-utils (>= 2.86.ds1-64), sysv-rc | file-rc, coreutils (>= 5.93), passwd, init, mountall (>= 2.28) +Recommends: psmisc, e2fsprogs +Conflicts: libdevmapper1.02.1 (<< 2:1.02.24-1) +Breaks: aide (<< 0.15.1-5), atm-tools (<< 1:2.5.1-1.3), bootchart (<< 0.10~svn407-3.3), console-common (<< 0.7.86), cruft (<< 0.9.16), eepc-acpi-scripts (<< 1.1.12), fcheck (<< 2.7.59-16), hostapd (<< 1:0.7.3-3), hostname (<< 2.95ubuntu1~boot2), ifupdown (<< 0.6.8ubuntu27), libpam-mount (<< 2.13-1), ltsp-client-core (<< 5.2.16-1), mdadm (<< 3.2.2-1), nbd-client (<< 1:2.9.23-1), nfs-common (<< 1:1.2.5-3), portmap (<< 6.0.0-2), readahead-fedora (<< 2:1.5.6-3), resolvconf (<< 1.49), rpcbind (<< 0.2.0-7), rsyslog (<< 5.8.2-2), selinux-policy-default (<= 2:0.2.20100524-9), splashy (<< 0.3.13-5.1+b1), sysklogd (<< 1.5-6.2), udev (<< 146-2~boot6), upstart (<< 0.6.3-2~boot4), wpasupplicant (<< 0.7.3-4), xymon (<< 4.3.0~beta2.dfsg-9) +Filename: pool/main/s/sysvinit/initscripts_2.88dsf-41ubuntu16_i386.deb +Size: 35150 +MD5sum: e78f1e7816f03ded97eacd469505ea45 +SHA1: 81f88f9258c680e9983316d75baff7572ecec75c +SHA256: 996e4d86486cbe12a7b7852ec1a9fe459dbf0afab51dc13bd701b6d970fdc14a +Description: scripts for initializing and shutting down the system +Multi-Arch: foreign +Homepage: http://savannah.nongnu.org/projects/sysvinit +Description-md5: db9003c179cd2a623493209da58ea2ea +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: libc6 +Priority: required +Section: libs +Installed-Size: 9284 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: i386 +Source: glibc +Version: 2.19-4ubuntu1 +Replaces: libc6-i386, libc6-xen +Provides: glibc-2.19-1, libc6-i686, libc6-xen +Depends: libgcc1 +Suggests: glibc-doc, debconf | debconf-2.0, locales +Conflicts: libc6-xen, prelink (<= 0.0.20090311-1), tzdata (<< 2007k-1), tzdata-etch +Breaks: hurd (<< 1:0.5.git20140203-1), libtirpc1 (<< 0.2.3), nscd (<< 2.19) +Filename: pool/main/g/glibc/libc6_2.19-4ubuntu1_i386.deb +Size: 4012440 +MD5sum: 946665711bb0294bd2c7729b3174ba8b +SHA1: 063e268e0d1e368e218d450a4bd2af7608b5e38e +SHA256: 0e33f5c3b6da3a6ec52fb0274abfa0da5489808feb220b6e6640432cb84f948f +Description: GNU C Library: Shared libraries +Multi-Arch: same +Homepage: http://www.gnu.org/software/libc/libc.html +Description-md5: fc3001b0b90a1c8e6690b283a619d57f +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: libmount1 +Priority: required +Section: libs +Installed-Size: 253 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: LaMont Jones <lamont@debian.org> +Architecture: i386 +Source: util-linux +Version: 2.20.1-5.1ubuntu21 +Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.8), libselinux1 (>= 1.32) +Pre-Depends: multiarch-support +Filename: pool/main/u/util-linux/libmount1_2.20.1-5.1ubuntu21_i386.deb +Size: 60156 +MD5sum: d17af590ad06ac914a1024d54184cee6 +SHA1: 6eb2a281c409bd5181ce6b871795f8e4609565bc +SHA256: 78ce54b9f644c365b95a7230e1e50762d628c9d0d3549211017a98d4cb5013c4 +Description: block device id library +Multi-Arch: same +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Description-md5: 8f605597a2fb2fd7bffd09db537dd040 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: libplymouth4 +Priority: required +Section: libs +Installed-Size: 315 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Source: plymouth +Version: 0.9.0-0ubuntu2 +Replaces: plymouth (<< 0.7.0+git20090207-0ubuntu0.1~ppa4) +Depends: libc6 (>= 2.9), libpng12-0 (>= 1.2.13-4), libudev1 (>= 183) +Pre-Depends: multiarch-support +Breaks: casper (= 1.227), mountall (<< 2.8) +Filename: pool/main/p/plymouth/libplymouth4_0.9.0-0ubuntu2_i386.deb +Size: 85024 +MD5sum: 8d9e7001ba371bd802956de1e81d1997 +SHA1: 749bdaee4d8bd4c2383c703eb244caa473180d35 +SHA256: 59bd4492b6e71eee5c13ba9c63da12ece49c43106829556722ca503867ce7251 +Description: graphical boot animation and logger - shared libraries +Multi-Arch: same +Description-md5: 29e2ed45f3e127c38b58dae52061cc33 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: libprocps3 +Priority: required +Section: libs +Installed-Size: 133 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Craig Small <csmall@debian.org> +Architecture: i386 +Source: procps +Version: 1:3.3.9-1ubuntu5 +Replaces: procps (<< 1:3.3.2-1) +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Filename: pool/main/p/procps/libprocps3_3.3.9-1ubuntu5_i386.deb +Size: 30078 +MD5sum: 0df60f591dfe64ed23bb1f3a1546c0ce +SHA1: db672ec37e88574bf1a1d5484d80cfd4ff04f9f6 +SHA256: b5df28501805a6833dc78e049159a7c560af6f24f18f51459bd8890c31e0fdc6 +Description: library for accessing process information from /proc +Multi-Arch: same +Homepage: http://gitorious.org/procps +Description-md5: 195f4a1a493350f6f0732a65b3cda83f +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: libudev1 +Priority: required +Section: libs +Installed-Size: 131 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: systemd +Version: 204-14ubuntu2 +Depends: libc6 (>= 2.17), libcgmanager0, libdbus-1-3 (>= 1.0.2), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0) +Pre-Depends: multiarch-support +Filename: pool/main/s/systemd/libudev1_204-14ubuntu2_i386.deb +Size: 35518 +MD5sum: a606f9e4aab028b9ab658b6e8a09d5fb +SHA1: ef28d377e6cc8f1e98dd9cd8c40edda90e2eed20 +SHA256: c02c85725f64b6c804235329166bf66e40da948d96123336ec55e13e1654720f +Description: libudev shared library +Multi-Arch: same +Homepage: http://www.freedesktop.org/wiki/Software/systemd +Description-md5: ace5b83d7b48187416c90173a93255b6 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: lsb-base +Priority: required +Section: misc +Installed-Size: 83 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian LSB Team <debian-lsb@lists.debian.org> +Architecture: all +Source: lsb +Version: 4.1+Debian11ubuntu8 +Replaces: upstart (<< 1.12.1-0ubuntu8) +Breaks: upstart (<< 1.12.1-0ubuntu8) +Filename: pool/main/l/lsb/lsb-base_4.1+Debian11ubuntu8_all.deb +Size: 13094 +MD5sum: 9ec51f910e6d8e86bfb489b71b237e66 +SHA1: 8091ba9ffc03999a3db1e2e0ee7d32ac5139a942 +SHA256: be8d24447147aa997b79353eaf8732b3d0967118c011b47476c841667eb15f7e +Description: Linux Standard Base 4.1 init script functionality +Multi-Arch: foreign +Homepage: http://www.linuxfoundation.org/collaborate/workgroups/lsb +Description-md5: 4ebb3d88f9f483751e70c55779c52d01 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: mount +Essential: yes +Priority: required +Section: admin +Installed-Size: 410 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: LaMont Jones <lamont@debian.org> +Architecture: i386 +Source: util-linux +Version: 2.20.1-5.1ubuntu21 +Pre-Depends: libblkid1 (>= 2.20.1), libc6 (>= 2.8), libmount1 (>= 2.20.1), libselinux1 (>= 2.0.15) +Suggests: nfs-common (>= 1:1.1.0-13) +Filename: pool/main/u/util-linux/mount_2.20.1-5.1ubuntu21_i386.deb +Size: 112598 +MD5sum: bdff5dbfbf17e2be281d64e2e7a4912b +SHA1: 1ed4abb0d5de8a09c704ac2d33de123015e5318a +SHA256: d2f023c763f7b6e91f3cd14073bfc5af7e7bfe3922fc5ca681d8038c80323f9e +Description: Tools for mounting and manipulating filesystems +Multi-Arch: foreign +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Description-md5: 46eb8e09a600d5eb98b6b40428349102 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: mountall +Priority: required +Section: admin +Installed-Size: 248 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Steve Langasek <vorlon@debian.org> +Architecture: i386 +Version: 2.54build1 +Replaces: upstart (<< 0.6.3-2) +Depends: makedev, udev, plymouth, coreutils (>= 7.1), libc6 (>= 2.9), libdbus-1-3 (>= 1.2.16), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libplymouth4 (>= 0.8.1-3), libudev1 (>= 183) +Pre-Depends: dpkg (>= 1.15.7.2) +Breaks: initscripts (<< 2.88dsf-24), policycoreutils (<< 2.0.69-2ubuntu4), usplash (<< 0.5.47) +Filename: pool/main/m/mountall/mountall_2.54build1_i386.deb +Size: 54166 +MD5sum: a208d9dc5aef018087d5e00cea7f6c92 +SHA1: 13686aa81ebef6c3009ff618708d76bc68ff94e8 +SHA256: dee359411cd7cfad19581f380af6275d46a6c5ecf55f512523b75adaa4734d03 +Description: filesystem mounting tool +Multi-Arch: foreign +Description-md5: b5b5a27fc0e8063ef1226a39fb8ecf70 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: procps +Priority: required +Section: admin +Installed-Size: 634 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Craig Small <csmall@debian.org> +Architecture: i386 +Version: 1:3.3.9-1ubuntu5 +Provides: watch +Depends: libc6 (>= 2.15), libncurses5 (>= 5.5-5~), libncursesw5 (>= 5.6+20070908), libprocps3, libtinfo5, lsb-base (>= 4.1+Debian11ubuntu7), initscripts +Recommends: psmisc +Conflicts: pgrep (<< 3.3-5), w-bassman (<< 1.0-3) +Breaks: guymager (<= 0.5.9-1), open-vm-tools (<= 2011.12.20-562307-1), xmem (<= 1.20-27.1) +Filename: pool/main/p/procps/procps_3.3.9-1ubuntu5_i386.deb +Size: 203368 +MD5sum: 17be371891f077e04075c6eb0af06b3c +SHA1: a5c6171b5a6430aa9436e42f0e64226dd2e7a665 +SHA256: 41e03fd2d05161c402d9a5d2b5feecb30a42f8919eb43712ebdd4340433803c1 +Description: /proc file system utilities +Multi-Arch: foreign +Homepage: http://gitorious.org/procps +Description-md5: 943f3288c1aaa379fca73a3ff1a35278 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: sysv-rc +Priority: required +Section: admin +Installed-Size: 224 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> +Architecture: all +Source: sysvinit +Version: 2.88dsf-41ubuntu16 +Replaces: file-rc +Depends: debconf (>= 0.5) | debconf-2.0, sysvinit-utils (>= 2.86.ds1-62), insserv (>> 1.12.0-10) +Recommends: lsb-base (>= 3.2-14) +Suggests: sysv-rc-conf, bum +Conflicts: file-rc +Breaks: initscripts (<< 2.88dsf-41ubuntu14) +Filename: pool/main/s/sysvinit/sysv-rc_2.88dsf-41ubuntu16_all.deb +Size: 37784 +MD5sum: e57bc9887432f76266d7bf741cf9d813 +SHA1: 446d24cc86bdb7a779856c00f9dea966227a00e2 +SHA256: 072d2745b9c966d63cba5abf52357374e7a043b3cc1bbde0b8ccf68f82e45f60 +Description: System-V-like runlevel change mechanism +Multi-Arch: foreign +Homepage: http://savannah.nongnu.org/projects/sysvinit +Description-md5: 195f2d617082a23f37cee0f50784eef9 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: sysvinit-utils +Priority: required +Section: admin +Installed-Size: 236 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> +Architecture: i386 +Source: sysvinit +Version: 2.88dsf-41ubuntu16 +Replaces: last, sysvinit (<= 2.86.ds1-65) +Depends: libc6 (>= 2.15), libselinux1 (>= 1.32), lsb-base (>= 4.1+Debian11ubuntu7) +Recommends: upstart (>= 0.6.3-4) +Suggests: bootlogd, sash +Conflicts: chkconfig (<< 11.0-79.1-2), last, sysvconfig +Breaks: upstart (<< 1.5-0ubuntu5) +Filename: pool/main/s/sysvinit/sysvinit-utils_2.88dsf-41ubuntu16_i386.deb +Size: 49652 +MD5sum: e1340ba69c7a5f0cf1a84b3f68993570 +SHA1: 7cbd535c1c010c2e84cb454562fb6632fb366ddc +SHA256: 576c2bcfbf56871acd68576f07fd18b6bfccd8a5db6dfa04bcf62183f43e77a0 +Description: System-V-like utilities +Multi-Arch: foreign +Homepage: http://savannah.nongnu.org/projects/sysvinit +Description-md5: 1d2bc4c9c32104729144c7578ecd30bd +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: udev +Priority: required +Section: admin +Installed-Size: 5123 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: systemd +Version: 204-14ubuntu2 +Depends: libacl1 (>= 2.2.51-8), libblkid1 (>= 2.19.1), libc6 (>= 2.17), libcgmanager0, libdbus-1-3 (>= 1.0.2), libkmod2 (>= 5~), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libselinux1 (>= 2.0.65), libudev1 (= 204-14ubuntu2), lsb-base (>= 4.1+Debian11ubuntu7), util-linux (>= 2.16), procps +Pre-Depends: debconf (>= 1.4.69) | debconf-2.0 +Breaks: consolekit (<< 0.4.6-1) +Filename: pool/main/s/systemd/udev_204-14ubuntu2_i386.deb +Size: 739026 +MD5sum: a85b035885e1b316354f6e5d0b8eeb69 +SHA1: 970405e4c8838c3cf17d1834c8917705d977879e +SHA256: 05fbd7f4b502fde9752b84b49364fe633b8377bcd996ec16462e0bc94adc9fcf +Description: /dev/ and hotplug management daemon +Multi-Arch: foreign +Homepage: http://www.freedesktop.org/wiki/Software/systemd +Description-md5: e875ddb09f46f1f7672af537f0c875ca +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + +Package: upstart +Priority: required +Section: admin +Installed-Size: 1721 +Maintainer: James Hunt <james.hunt@ubuntu.com> +Architecture: i386 +Version: 1.13.1-0ubuntu1 +Replaces: startup-tasks, system-services, sysvinit, upstart-compat-sysv, upstart-job +Provides: startup-tasks, system-services, upstart-compat-sysv, upstart-job +Depends: libc6 (>= 2.15), libcgmanager0, libdbus-1-3 (>= 1.2.16), libjson-c2 (>= 0.10), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libudev1 (>= 183), sysvinit-utils, initscripts, mountall, ifupdown (>= 0.6.10ubuntu5), libjson0 (>= 0.10-1.1ubuntu1), debianutils (>= 4) +Suggests: python3, graphviz, bash-completion, upstart-monitor +Conflicts: lxcguest, startup-tasks, system-services, sysvinit, upstart-compat-sysv, upstart-job +Breaks: friendly-recovery (<< 0.2.13), libc6 (<< 2.12.1-0ubuntu12) +Filename: pool/main/u/upstart/upstart_1.13.1-0ubuntu1_i386.deb +Size: 388978 +MD5sum: 2ebf7fb1083b581707e445fee808e120 +SHA1: 901424ec0d304ca8d10a25321a55d1d69bd8e82d +SHA256: c42fb117e90770c7163c9f4770e75e9c0d6a00d41c4b3afc2afebfa65ede80f8 +Description: event-based init daemon +Multi-Arch: foreign +Homepage: http://upstart.ubuntu.com/ +Orig-Maintainer: Steve Langasek <vorlon@debian.org> +Description-md5: b776ec43b708c13dd0c2ab824471f478 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 9m +Task: minimal + diff --git a/test/integration/Packages-github-23-too-long-dependency-line b/test/integration/Packages-github-23-too-long-dependency-line new file mode 100644 index 0000000..967d6ed --- /dev/null +++ b/test/integration/Packages-github-23-too-long-dependency-line @@ -0,0 +1,17 @@ +Package: network-manager-strongswan +Architecture: amd64 +Version: 1.3.1-14 +Priority: extra +Section: net +Maintainer: Jean-Christophe Manciot <manciot.jeanchristophe@gmail.com> +Installed-Size: 256 +Provides: network-manager-strongswan +Depends: libart-2.0-2,libatk1.0-0,libavahi-client3,libavahi-common3,libavahi-glib1,libbonobo2-0,libbonoboui2-0,libc6,libcairo2,libcanberra0,libdatrie1,libdbus-1-3,libdbus-glib-1-2,libexpat1,libffi6,libfontconfig1,libfreetype6,libgail18,libgconf-2-4,libgcrypt20,libgdk-pixbuf2.0-0,libglib2.0-0,libglib2.0-0-dbg,libglib2.0-0-refdbg,libgmp10,libgnome-2-0,libgnomecanvas2-0,libgnome-keyring0,libgnomeui-0,libgnomevfs2-0,libgnutls30,libgpg-error0,libgraphite2-3,libgtk2.0-0,libharfbuzz0b,libhogweed4,libice6,libidn11,libltdl7,liblzma5,libnettle6,libnm-glib-vpn1,libnm-util2,libogg0,liborbit-2-0,libp11-kit0,libpango-1.0-0,libpangocairo-1.0-0,libpangoft2-1.0-0,libpcre3,libpixman-1-0,libpng12-0,libpopt0,libselinux1,libsm6,libsystemd0,libtasn1-6,libtdb1,libthai0,libuuid1,libvorbis0a,libvorbisfile3,libx11-6,libxau6,libxcb1,libxcb-render0,libxcb-shm0,libxcomposite1,libxcursor1,libxdamage1,libxdmcp6,libxext6,libxfixes3,libxi6,libxinerama1,libxml2,libxrandr2,libxrender1,zlib1g +Filename: dists/xenial/stable/binary-amd64/network-manager-strongswan_1.3.1-14_amd64.deb +Size: 34642 +MD5sum: 6f4482cb417e4c884a6715f315695937 +SHA1: 07dc0377c365f6ccb67d8e135ab32f27b5b5774d +SHA256: e526bc8c6c8b29dc28e5783ad076119d3be0e804779b3ca3a68959b7ac23f163 +SHA512: 6e2eb65023301dcaf1813a3c5686a82bdb61bdd3597e1976e067e06a0b0eee96e6d2a2d8b890bf37b8120eb9ff671a5ac4ee49de83feb3199afeab2893b8dec6 +Description: This package provides an IKEv2 IPSec VPN plugin for strongswan +Description-md5: 31abf1e375284c7ee36f25bf936125f1 diff --git a/test/integration/Packages-hashsum-verification b/test/integration/Packages-hashsum-verification new file mode 100644 index 0000000..29a385f --- /dev/null +++ b/test/integration/Packages-hashsum-verification @@ -0,0 +1,18 @@ +Package: apt +Version: 0.7.25.3 +Architecture: i386 +Maintainer: APT Development Team <deity@lists.debian.org> +Installed-Size: 5244 +Replaces: libapt-pkg-dev (<< 0.3.7), libapt-pkg-doc (<< 0.3.7) +Provides: libapt-pkg-libc6.9-6-4.8 +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Filename: apt.deb +Size: 0 +MD5sum: d41d8cd98f00b204e9800998ecf8427e +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. diff --git a/test/integration/Packages-pdiff-usage b/test/integration/Packages-pdiff-usage new file mode 100644 index 0000000..ac962f2 --- /dev/null +++ b/test/integration/Packages-pdiff-usage @@ -0,0 +1,36 @@ +Package: apt +Version: 0.7.25.3 +Architecture: i386 +Maintainer: APT Development Team <deity@lists.debian.org> +Installed-Size: 5244 +Replaces: libapt-pkg-dev (<< 0.3.7), libapt-pkg-doc (<< 0.3.7) +Provides: libapt-pkg-libc6.9-6-4.8 +Depends: libc6 (>= 2.3.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0), debian-archive-keyring +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Filename: pool/main/a/apt/apt_0.7.25.3_i386.deb +Size: 1750610 +MD5sum: 311aadc67d1b72428b54c9b4e1f76671 +SHA1: 3c695e028f74d5c55226f9ef30000bbbd881088c +SHA256: b46fd1546151c545fe4bfa56a5cc0e7811a9f68826326a529777fd660f28f050 +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. +Description-md5: d41ee493aa9fcc6cbc9ce4eb7069959c + +Package: oldstuff +Version: 1.0 +Architecture: i386 +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 100 +Filename: pool/oldstuff_1.0_i386.deb +Size: 100000 +MD5sum: 311aeeadf78324aaff54c9b4e1f76671 +SHA1: 3c695e028f74d5c544deeddaaa1242desa81088c +SHA256: b46fd1546151c545fe4bfa56a5cc0e7deaef23e2da3e4f129727fd660f28f050 +Description: some cool but old stuff + This package will disappear in the next mirror update +Description-md5: 1948af60eda0a41dfa9fe83f60eb8389 diff --git a/test/integration/Packages-pdiff-usage-new b/test/integration/Packages-pdiff-usage-new new file mode 100644 index 0000000..f8d7b19 --- /dev/null +++ b/test/integration/Packages-pdiff-usage-new @@ -0,0 +1,39 @@ +Package: apt +Priority: important +Section: admin +Installed-Size: 5672 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: i386 +Version: 0.8.0~pre1 +Replaces: manpages-pl (<< 20060617-3~) +Provides: libapt-pkg4.10 +Depends: libc6 (>= 2.3.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0), zlib1g (>= 1:1.1.4), debian-archive-keyring, gnupg +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Conflicts: python-apt (<< 0.7.93.2~) +Filename: pool/main/a/apt/apt_0.8.0~pre1_i386.deb +Size: 2013046 +MD5sum: 6786ca6270c988f2c201716ededaedec +SHA1: fe26559e745d4c2c977c27170938852041c9adff +SHA256: a12f968467e1e3cec24191b72bfe84f7aeed3ce422e1a60bb4f1454f2b89b8ee +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. +Description-md5: d41ee493aa9fcc6cbc9ce4eb7069959c + +Package: newstuff +Version: 1.0 +Architecture: i386 +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 101 +Filename: pool/newstuff_1.0_i386.deb +Size: 101100 +MD5sum: 311aeeadf78324aaff1ceaf3e1f76671 +SHA1: 3c695e028f7a1ae324deeddaaa1242desa81088c +SHA256: b46fd154615edefab321cc56a5cc0e7deaef23e2da3e4f129727fd660f28f050 +Description: some cool and shiny new stuff + This package will appear in the next mirror update +Description-md5: d5f89fbbc2ac69c43d7e4c9b67d82b6b diff --git a/test/integration/Packages-policy-pinning b/test/integration/Packages-policy-pinning new file mode 100644 index 0000000..a9334e9 --- /dev/null +++ b/test/integration/Packages-policy-pinning @@ -0,0 +1,12 @@ +Package: oldstuff +Version: 1.0 +Architecture: i386 +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 100 +Filename: pool/oldstuff_1.0_i386.deb +Size: 100000 +MD5sum: 311aeeadf78324aaff54c9b4e1f76671 +SHA1: 3c695e028f74d5c544deeddaaa1242desa81088c +SHA256: b46fd1546151c545fe4bfa56a5cc0e7deaef23e2da3e4f129727fd660f28f050 +Description: some old but cool stuff + This package will disappear in the next mirror update diff --git a/test/integration/Packages-releasefile-verification b/test/integration/Packages-releasefile-verification new file mode 100644 index 0000000..1e5c470 --- /dev/null +++ b/test/integration/Packages-releasefile-verification @@ -0,0 +1,20 @@ +Package: apt +Version: 0.7.25.3 +Architecture: i386 +Maintainer: APT Development Team <deity@lists.debian.org> +Installed-Size: 5244 +Replaces: libapt-pkg-dev (<< 0.3.7), libapt-pkg-doc (<< 0.3.7) +Provides: libapt-pkg-libc6.9-6-4.8 +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Filename: apt.deb +Size: 0 +MD5sum: d41d8cd98f00b204e9800998ecf8427e +SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. +Description-md5: d41ee493aa9fcc6cbc9ce4eb7069959c diff --git a/test/integration/Packages-releasefile-verification-new b/test/integration/Packages-releasefile-verification-new new file mode 100644 index 0000000..7f03829 --- /dev/null +++ b/test/integration/Packages-releasefile-verification-new @@ -0,0 +1,23 @@ +Package: apt +Priority: important +Section: admin +Installed-Size: 5672 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: i386 +Version: 0.8.0~pre1 +Replaces: manpages-pl (<< 20060617-3~) +Provides: libapt-pkg4.10 +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Conflicts: python-apt (<< 0.7.93.2~) +Filename: apt.deb +Size: 0 +MD5sum: d41d8cd98f00b204e9800998ecf8427e +SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. +Description-md5: d41ee493aa9fcc6cbc9ce4eb7069959c diff --git a/test/integration/Packages-ubuntu-bug-614993 b/test/integration/Packages-ubuntu-bug-614993 new file mode 100644 index 0000000..f1d4593 --- /dev/null +++ b/test/integration/Packages-ubuntu-bug-614993 @@ -0,0 +1,1819 @@ +Package: libx11-xcb1 +Priority: optional +Section: libs +Installed-Size: 184 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: libx11 +Version: 2:1.3.3-3ubuntu1 +Depends: libc6 (>= 2.2.5), libx11-6 +Conflicts: libx11-6 (<< 2:1.1) +Filename: pool/main/libx/libx11/libx11-xcb1_1.3.3-3ubuntu1_amd64.deb +Size: 90286 +MD5sum: 56c300a1110d9b08ab7760e375724034 +SHA1: 81fd3a089e0141236ac4dd49e98f58d7b6db3af3 +SHA256: 97a7b225bbccc6a64e2264e7ca53bb585e12982e037d26f1b22fae2c79127dc0 +Description: Xlib/XCB interface library + libX11-xcb provides functions needed by clients which take advantage of + Xlib/XCB to mix calls to both Xlib and XCB over the same X connection. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + More information about XCB can be found at: + <URL:http://xcb.freedesktop.org> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libX11 +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: libxcb-aux0 +Priority: extra +Section: libdevel +Installed-Size: 68 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Julien Danjou <acid@debian.org> +Architecture: amd64 +Source: xcb-util +Version: 0.3.6-1build1 +Depends: libc6 (>= 2.2.5), libxcb1 (>= 0) +Filename: pool/main/x/xcb-util/libxcb-aux0_0.3.6-1build1_amd64.deb +Size: 8962 +MD5sum: a35d570e9231a01ff6de0ec872638787 +SHA1: c551ed6a9b1b6c1d201537b85f4003926aa2833d +SHA256: 047ee120e83adbed4c57ff175e59ca02a772e7d4a5d1d014ff72d6f0da41e9ca +Description: utility libraries for X C Binding -- aux + This package contains the library files needed to run software using + libxcb-aux, providing convenient access to connection setup and some + core requests. + . + The xcb-util module provides a number of libraries which sit on top of + libxcb, the core X protocol library, and some of the extension + libraries. These experimental libraries provide convenience functions + and interfaces which make the raw X protocol more usable. Some of the + libraries also provide client-side code which is not strictly part of + the X protocol but which have traditionally been provided by Xlib. +Homepage: http://xcb.freedesktop.org +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, mythbuntu-frontend, ubuntu-netbook + +Package: libxcb-dri2-0 +Priority: optional +Section: libs +Installed-Size: 68 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Architecture: amd64 +Source: libxcb +Version: 1.6-1 +Depends: libc6 (>= 2.2.5), libxcb1 (>= 0) +Filename: pool/main/libx/libxcb/libxcb-dri2-0_1.6-1_amd64.deb +Size: 10130 +MD5sum: 13f3278d872f700c5e2363cab9feb5db +SHA1: cc51153c443558292604acb98043517075332263 +SHA256: 2fe00f4216eb408b0e70ffd7681b81fc750a242661790c636998dfe5738be05d +Description: X C Binding, dri2 extension + This package contains the library files needed to run software using + libxcb-dri2, the dri2 extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions +Homepage: http://xcb.freedesktop.org +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + + +Package: libmtdev1 +Priority: optional +Section: libs +Installed-Size: 72 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: mtdev +Version: 1.0.9-0ubuntu1 +Depends: libc6 (>= 2.4) +Filename: pool/main/m/mtdev/libmtdev1_1.0.9-0ubuntu1_amd64.deb +Size: 10980 +MD5sum: 694e8cee8d0d21591fa308ddd1b1e41f +SHA1: 7ea377dec6755a3e659c116a989145609fc7e9a9 +SHA256: 88075b13ad116e38d33c84e63fa5e6195c84df16f4741c4054520618d7f17797 +Description: Multitouch Protocol Translation Library - shared library + libmtdev is a library for translating evdev multitouch events using the legacy + protocol to the new multitouch slots protocol. This is necessary for kernel + drivers that have not been updated to use the newer protocol. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: libutouch-grail1 +Priority: optional +Section: libs +Installed-Size: 84 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: utouch-grail +Version: 1.0.11-0ubuntu1 +Depends: libc6 (>= 2.4), libmtdev1 (>= 1.0.8) +Breaks: libutouch-geis1 (<= 1.0.8), xserver-xorg-input-gevdev (<= 1:2.3.2-6ubuntu1) +Filename: pool/main/u/utouch-grail/libutouch-grail1_1.0.11-0ubuntu1_amd64.deb +Size: 15360 +MD5sum: 210ad74aa06bf676d9ab0200fc2a1d19 +SHA1: 734014bca516535b85b3e3eb5f76734d1dca066a +SHA256: 0905710584348b58ee88f520c874d4d5198b6be38daff8a761ad263b0c350a6a +Description: Gesture Recognition And Instantiation Library + This library consists of an interface and tools for handling gesture + recognition and gesture instantiation. Applications can use the grail + callbacks to receive gesture primitives and raw input events from the + underlying kernel device. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: libdrm-intel1 +Priority: required +Section: libs +Installed-Size: 116 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: libdrm +Version: 2.4.21-1ubuntu2 +Depends: libc6 (>= 2.3.4), libdrm2 (>= 2.4.1) +Filename: pool/main/libd/libdrm/libdrm-intel1_2.4.21-1ubuntu2_amd64.deb +Size: 33178 +MD5sum: 2d647434700294708fcaa815bc75ca07 +SHA1: f808f92ca2c86d07e654f92cffe6a806bef53c64 +SHA256: 069eb06161ca6e17d29a8cc67c7eac21c6f935292d4f208e802d595da521566b +Description: Userspace interface to intel-specific kernel DRM services -- runtime + This library implements the userspace interface to the intel-specific kernel + DRM services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is + currently used on Linux to provide hardware-accelerated OpenGL drivers. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: minimal + +Package: libdrm-nouveau1 +Priority: required +Section: libs +Installed-Size: 96 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: libdrm +Version: 2.4.21-1ubuntu2 +Depends: libc6 (>= 2.3.4), libdrm2 (>= 2.4.3) +Breaks: xserver-xorg-video-nouveau (<< 1:0.0.16) +Filename: pool/main/libd/libdrm/libdrm-nouveau1_2.4.21-1ubuntu2_amd64.deb +Size: 22290 +MD5sum: dd13107a609c4ef288aef8e0cf7c6bbe +SHA1: 3c17fcf1421f2585f3b6385eb434f8caa2ee56b8 +SHA256: f02f625b172a871e2c93a01234cb608e2c21ba21a6f76d48fff0dc743156d3a5 +Description: Userspace interface to nouveau-specific kernel DRM services -- runtime + This library implements the userspace interface to the nouveau-specific kernel + DRM services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is + currently used on Linux to provide hardware-accelerated OpenGL drivers. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: minimal + +Package: libdrm-radeon1 +Priority: required +Section: libs +Installed-Size: 96 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: libdrm +Version: 2.4.21-1ubuntu2 +Depends: libc6 (>= 2.3.4), libdrm2 (>= 2.4.3) +Filename: pool/main/libd/libdrm/libdrm-radeon1_2.4.21-1ubuntu2_amd64.deb +Size: 23196 +MD5sum: 7d8c85369e9d9deaaff960715fb8cb5d +SHA1: b39304c4f1cce9c00b2c4e01845cc03760d97ca5 +SHA256: c282a95b5ee4361c3e1fd49cfe5f862ada91a9caa9c338b634aab2b792707800 +Description: Userspace interface to radeon-specific kernel DRM services -- runtime + This library implements the userspace interface to the radeon-specific kernel + DRM services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is + currently used on Linux to provide hardware-accelerated OpenGL drivers. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: minimal + +Package: libdrm2 +Priority: required +Section: libs +Installed-Size: 120 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: libdrm +Version: 2.4.21-1ubuntu2 +Depends: libc6 (>= 2.7) +Filename: pool/main/libd/libdrm/libdrm2_2.4.21-1ubuntu2_amd64.deb +Size: 32386 +MD5sum: a66179dec8fa282a72d323cb85386a0c +SHA1: b06c48d149ad466c4e0c1f316573d8faa2924210 +SHA256: af7beb6b31b54371fdc6ec3c624199b323ac80d5043e4c5931ba1bf740462b10 +Description: Userspace interface to kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + . + This package provides the runtime environment for libdrm. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: minimal + +Package: libxfont1 +Priority: optional +Section: libs +Installed-Size: 332 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: libxfont +Version: 1:1.4.2-1 +Depends: libbz2-1.0, libc6 (>= 2.4), libfontenc1, libfreetype6 (>= 2.2.1), zlib1g (>= 1:1.1.4) +Conflicts: xprint (<< 2:1.6.0-1) +Filename: pool/main/libx/libxfont/libxfont1_1.4.2-1_amd64.deb +Size: 156844 +MD5sum: 4ad60ad1f3096f03eabcf30dedb2c2ce +SHA1: 2a1e83c35583fe2f8351783a160326b48c4559b3 +SHA256: 97c121164fdef2e6f7332c27422fc07d2d7b3f137415b3ec3a6083e471f3290e +Description: X11 font rasterisation library + libXfont provides various services for X servers, most notably font + selection and rasterisation (through external libraries). + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXfont +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, eucalyptus-cloud, eucalyptus-storage, print-server, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-common +Priority: optional +Section: x11 +Installed-Size: 176 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: xorg-server +Version: 2:1.9.0-0ubuntu2 +Replaces: xserver-xorg-core (<< 2:1.5.2) +Depends: x11-common, xkb-data, x11-xkb-utils +Recommends: xfonts-base, xauth +Filename: pool/main/x/xorg-server/xserver-common_1.9.0-0ubuntu2_all.deb +Size: 86390 +MD5sum: 278a92c5c0b5dc2189ab7b7493b69add +SHA1: 46734bd7889084fe8a296ac50ed6c81bbdcb322a +SHA256: f2757c722684626f21b638fe8de2347c3a4ce5e686af5d6ab38a8e12755762b1 +Description: common files used by various X servers + This package provides files necessary for all X.Org based X servers. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xephyr +Priority: optional +Section: x11 +Installed-Size: 2164 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg-server +Version: 2:1.9.0-0ubuntu2 +Depends: xserver-common (>= 2:1.9.0-0ubuntu2), libc6 (>= 2.4), libdrm2 (>= 2.3.1), libgcrypt11 (>= 1.4.2), libgl1-mesa-glx | libgl1, libpixman-1-0 (>= 0.15.16), libx11-6, libxau6, libxdmcp6, libxext6, libxfont1 (>= 1:1.4.2), libxv1 +Recommends: libgl1-mesa-dri (>= 7.1~rc1) +Filename: pool/main/x/xorg-server/xserver-xephyr_1.9.0-0ubuntu2_amd64.deb +Size: 1005784 +MD5sum: 93f42d8e5a4ccaac790908d9490aff49 +SHA1: 8c657f7ed9a5fea1bc72c341d690f89f7b2be852 +SHA256: 6ab0c82b3082bf3acfc9b54f63dbb472c55ca69b1dab06fc27e34ffd145c3881 +Description: nested X server + Xephyr is an X server that can be run inside another X server, + much like Xnest. It is based on the kdrive X server, and as a + result it supports newer extensions than Xnest, including render and + composite. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xserver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: edubuntu-desktop-gnome + +Package: xserver-xorg +Priority: optional +Section: x11 +Installed-Size: 180 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg +Version: 1:7.5+6ubuntu3 +Replaces: x11-common (<< 1:7.3+11), xserver-common (<< 7) +Depends: xserver-xorg-core (>= 2:1.8.99.905), xserver-xorg-video-all | xserver-xorg-video-8, xserver-xorg-input-all | xserver-xorg-input-11, xserver-xorg-input-evdev, libc6 (>= 2.7), xkb-data (>= 1.4), x11-xkb-utils, console-setup +Recommends: libgl1-mesa-dri +Conflicts: x11-common (<< 1:7.3+11), xserver-common (<< 7), xserver-xfree86 (<< 6.8.2.dfsg.1-1) +Filename: pool/main/x/xorg/xserver-xorg_7.5+6ubuntu3_amd64.deb +Size: 20560 +MD5sum: 5f4f0c969d2758cee7ce5244917df903 +SHA1: 58290e5672b6e3223dc63db33b3196d3eaa44df6 +SHA256: 35b04c220fe1b76f52fca42bb97abeed2c9e8554ff280e42f7c4ad3017985632 +Description: the X.Org X server + This package depends on the full suite of the server and drivers for the + X.Org X server. It does not provide the actual server itself. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-core +Priority: optional +Section: x11 +Installed-Size: 4108 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg-server +Version: 2:1.9.0-0ubuntu2 +Provides: xorg-input-abi-11.0, xorg-video-abi-8.0, xserver +Depends: xserver-common (>= 2:1.9.0-0ubuntu2), xserver-xorg, udev (>= 149), libc6 (>= 2.7), libdrm2 (>= 2.3.1), libgcrypt11 (>= 1.4.2), libpciaccess0 (>= 0.10.7), libpixman-1-0 (>= 0.15.16), libudev0 (>= 147), libxau6, libxdmcp6, libxfont1 (>= 1:1.4.2) +Recommends: libgl1-mesa-dri (>= 7.1~rc1) +Suggests: xfonts-100dpi | xfonts-75dpi, xfonts-scalable +Breaks: xserver-xorg-input, xserver-xorg-input-2, xserver-xorg-input-2.1, xserver-xorg-input-4, xserver-xorg-input-7, xserver-xorg-input-joystick (<= 1:1.5.0-3), xserver-xorg-input-synaptics (<= 1.2.2-1ubuntu4), xserver-xorg-input-tslib (<= 0.0.6-3), xserver-xorg-input-vmmouse (<= 1:12.6.5-4ubuntu2), xserver-xorg-input-wacom (<< 0.7.8), xserver-xorg-video, xserver-xorg-video-1.0, xserver-xorg-video-1.9, xserver-xorg-video-2, xserver-xorg-video-4, xserver-xorg-video-5, xserver-xorg-video-6 +Filename: pool/main/x/xorg-server/xserver-xorg-core_1.9.0-0ubuntu2_amd64.deb +Size: 1722082 +MD5sum: 22b1e5dcaa5a40520eb1c76996acde89 +SHA1: 26d0082a04d7c30791a8535643c08bd66cc71085 +SHA256: 073eacfdf298a76287cf9676212ac94eda9a2f7c9c1b62fc9ced3e110c06e88d +Description: Xorg X server - core server + The Xorg X server is an X server for several architectures and operating + systems, which is derived from the XFree86 4.x series of X servers. + . + The Xorg server supports most modern graphics hardware from most vendors, + and supersedes all XFree86 X servers. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xserver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-core-dbg +Priority: extra +Section: x11 +Installed-Size: 17404 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg-server +Version: 2:1.9.0-0ubuntu2 +Depends: xserver-xorg-core (= 2:1.9.0-0ubuntu2) +Filename: pool/main/x/xorg-server/xserver-xorg-core-dbg_1.9.0-0ubuntu2_amd64.deb +Size: 6305640 +MD5sum: fe080ab7fa64b8dc8446b6fe82af196d +SHA1: ae450cf592342969903a42792d07914d2717f8dd +SHA256: fd4007f1de919f1ed8f9e8bfe0235bdbbe14e3ba78bf3cd010f43d1c64a83d50 +Description: Xorg - the X.Org X server (debugging symbols) + The Xorg X server is an X server for several architectures and operating + systems, which is derived from the XFree86 4.x series of X servers. + . + The Xorg server supports most modern graphics hardware from most vendors, + and supersedes all XFree86 X servers. + . + This package provides debugging symbols for the Xorg X server and associated + modules. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-dev +Priority: optional +Section: x11 +Installed-Size: 1632 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg-server +Version: 2:1.9.0-0ubuntu2 +Depends: libpixman-1-dev (>= 0.15.20), x11proto-core-dev (>= 7.0.17), x11proto-input-dev (>= 1.9.99.902), x11proto-xext-dev (>= 7.0.99.3), x11proto-video-dev, x11proto-randr-dev (>= 1.2.99.3), x11proto-render-dev (>= 2:0.11), x11proto-dri2-dev (>= 2.3), x11proto-fonts-dev, x11proto-xinerama-dev, x11proto-kb-dev, libxkbfile-dev, libpciaccess-dev +Filename: pool/main/x/xorg-server/xserver-xorg-dev_1.9.0-0ubuntu2_amd64.deb +Size: 315992 +MD5sum: 622dad3611cef47cad83b4a3c82c0a78 +SHA1: 35237aa66771f253e22ab46ed711d7feafc3e284 +SHA256: 94114cc3aa3e9601db43d92df263715c3141922ef04ce1886a56a8842765d5f2 +Description: Xorg X server - development files + This package provides development files for the X.Org ('Xorg') X server. + This is not quite the same as the DDK (Driver Development Kit) from the + XFree86 4.x and X.Org 6.7, 6.8 and 6.9 series of servers; it provides + headers and a pkg-config file for drivers using autotools to build + against. + . + Unless you are developing or building a driver, you probably want + xserver-xorg and/or xserver-xorg-core instead. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xserver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-input-all +Priority: optional +Section: x11 +Installed-Size: 24 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg +Version: 1:7.5+6ubuntu3 +Depends: xserver-xorg-input-evdev, xserver-xorg-input-synaptics, xserver-xorg-input-vmmouse, xserver-xorg-input-wacom, x11-common +Filename: pool/main/x/xorg/xserver-xorg-input-all_7.5+6ubuntu3_amd64.deb +Size: 1014 +MD5sum: 33d323837d8dd94ec2e63b4944316c83 +SHA1: 27b0484d0282b728bd9905115da55548c2884008 +SHA256: 61338a072689a5c1565a1968811c87e370e37facb12f4055b64f8b65e35f48ea +Description: the X.Org X server -- input driver metapackage + This package depends on the full suite of input drivers for the X.Org X server + (Xorg). It does not provide any drivers itself, and may be removed if you wish + to only have certain drivers installed. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-input-evdev +Priority: optional +Section: x11 +Installed-Size: 168 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:2.3.2-6ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-input-gevdev +Provides: xserver-xorg-input-11 +Depends: libc6 (>= 2.7), libutouch-grail1 (>= 1.0.10), xorg-input-abi-11.0, xserver-xorg-core (>= 2:1.8.99.905-1ubuntu3) +Conflicts: xserver-xorg-input-gevdev +Filename: pool/main/x/xserver-xorg-input-evdev/xserver-xorg-input-evdev_2.3.2-6ubuntu1_amd64.deb +Size: 77602 +MD5sum: aa833ccaa08510e2cf02182157f49be4 +SHA1: 1b35f21aab75e0063a36bca95ecd36e4ca7cd6ef +SHA256: 8d600abfff74e13126c3b61530e782aa9ab88a8aeb0a1eeb42e6ebe2aafe314e +Description: X.Org X server -- evdev input driver + This package provides the driver for input devices using evdev, the Linux + kernel's event delivery mechanism. This driver allows for multiple keyboards + and mice to be treated as separate input devices. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-input-evdev driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-input-evdev-dev +Priority: optional +Section: libdevel +Installed-Size: 64 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: xserver-xorg-input-evdev +Version: 1:2.3.2-6ubuntu1 +Filename: pool/main/x/xserver-xorg-input-evdev/xserver-xorg-input-evdev-dev_2.3.2-6ubuntu1_all.deb +Size: 8784 +MD5sum: fa1d8161aa475e16423413110209e183 +SHA1: 6781c1afc65ab072ff3dba19b691dcb2d2d49716 +SHA256: a5f5ec31050ba190900d71527717aff06270fd9b6ee93352df745231fc95147c +Description: X.Org X server -- evdev input driver (development headers) + This package provides the development headers for the evdev input driver + found in xserver-xorg-input-evdev. Non-developers likely have little use + for this package. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-input-evdev driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-input-mouse +Priority: optional +Section: x11 +Installed-Size: 160 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.5.0-2build1 +Replaces: xserver-xorg (<< 6.8.2-35) +Provides: xorg-driver-input, xserver-xorg-input-11 +Depends: libc6 (>= 2.7), xorg-input-abi-11.0, xserver-xorg-core (>= 2:1.8.99.904) +Filename: pool/main/x/xserver-xorg-input-mouse/xserver-xorg-input-mouse_1.5.0-2build1_amd64.deb +Size: 56550 +MD5sum: 3a94050557202448e164dc6aa2baa16d +SHA1: 418432ceb03b803619743c0e90b8afd2c050d595 +SHA256: dec2aef614e6481ac91237e6ad43ef4101ab8d0c12af0281419cece33a1fab40 +Description: X.Org X server -- mouse input driver + This package provides the driver for mouse input devices. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-input-mouse driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-input-synaptics +Priority: optional +Section: x11 +Installed-Size: 360 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1.2.2-2ubuntu3 +Replaces: xfree86-driver-synaptics (<< 0.14.4-2), xorg-driver-synaptics +Provides: xfree86-driver-synaptics, xorg-driver-synaptics, xserver-xorg-input-11 +Depends: udev, libc6 (>= 2.4), libpciaccess0, libpixman-1-0, libx11-6, libxi6 (>= 2:1.2.0), xorg-input-abi-11.0, xserver-xorg-core (>= 2:1.8.99.904) +Suggests: gpointing-device-settings, touchfreeze +Conflicts: xfree86-driver-synaptics (<< 0.14.4-2), xorg-driver-synaptics +Filename: pool/main/x/xserver-xorg-input-synaptics/xserver-xorg-input-synaptics_1.2.2-2ubuntu3_amd64.deb +Size: 157472 +MD5sum: 208387c243ca97b983263f9ad1f997e4 +SHA1: 7c48f093dd3173afac8b7a44729828aad970173c +SHA256: 9dbf323b790342bb5f3642104003acba7c2ce84279fcebfcafe9802cb872dd21 +Description: Synaptics TouchPad driver for X.Org server + This package provides an input driver for the X.Org X server to enable + advanced features of the Synaptics Touchpad including: + . + * Movement with adjustable, non-linear acceleration and speed + * Button events through short touching of the touchpad + * Double-Button events through double short touching of the touchpad + * Dragging through short touching and holding down the finger on the touchpad + * Middle and right button events on the upper and lower corner of the touchpad + * Vertical scrolling (button four and five events) through moving the finger + on the right side of the touchpad + * The up/down button sends button four/five events + * Horizontal scrolling (button six and seven events) through moving the finger + on the lower side of the touchpad + * The multi-buttons send button four/five events, and six/seven events for + horizontal scrolling + * Adjustable finger detection + * Multifinger taps: two finger for middle button and three finger for right + button events. (Needs hardware support. Not all models implement this + feature.) + * Run-time configuration using shared memory. This means you can change + parameter settings without restarting the X server (see synclient(1)). + * It also provides a daemon to disable touchpad while typing at the keyboard + and thus avoid unwanted mouse movements (see syndaemon(1)). +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-input-synaptics-dev +Priority: optional +Section: libdevel +Installed-Size: 76 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: xserver-xorg-input-synaptics +Version: 1.2.2-2ubuntu3 +Depends: x11proto-core-dev +Filename: pool/main/x/xserver-xorg-input-synaptics/xserver-xorg-input-synaptics-dev_1.2.2-2ubuntu3_all.deb +Size: 16926 +MD5sum: 96c22d1c68e9037ee97b336edc572869 +SHA1: 8d921f825eaf88f55ca82dcb8271e71c0a3c36da +SHA256: 62879769c7ea06cc3cc4952a3c80175ffd45a0883c661251ef869b4318132e16 +Description: Synaptics TouchPad driver for X.Org server (development headers) + This package contains the development headers for the Synaptics input + driver found in xserver-xorg-input-synaptics. Non-developers likely have + little use for this package. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-input-vmmouse +Priority: optional +Section: x11 +Installed-Size: 172 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:12.6.9-2build1 +Replaces: xserver-xorg (<< 6.8.2-35) +Provides: xserver-xorg-input-11 +Depends: libc6 (>= 2.7), xorg-input-abi-11.0, xserver-xorg-core (>= 2:1.8.99.904), xserver-xorg-input-mouse, udev +Filename: pool/main/x/xserver-xorg-input-vmmouse/xserver-xorg-input-vmmouse_12.6.9-2build1_amd64.deb +Size: 31278 +MD5sum: 3a096dec7240837fec1bcdeece0d3523 +SHA1: 3c881221ccc56d3958d91da676f2ed177a4c31f6 +SHA256: 875498c91b8c3333a3277de41feba8ab9294912604d35aad3b35c3077ed18b5c +Description: X.Org X server -- VMMouse input driver to use with VMWare + This package provides the driver for the X11 vmmouse input device. + . + The VMMouse driver enables support for the special VMMouse protocol + that is provided by VMware virtual machines to give absolute pointer + positioning. + . + The vmmouse driver is capable of falling back to the standard "mouse" + driver if a VMware virtual machine is not detected. This allows for + dual-booting of an operating system from a virtual machine to real hardware + without having to edit xorg.conf every time. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-input-vmmouse driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-input-wacom +Priority: optional +Section: x11 +Installed-Size: 308 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Ron Lee <ron@debian.org> +Architecture: amd64 +Source: xf86-input-wacom +Version: 1:0.10.8-0ubuntu1 +Replaces: wacom-tools (<< 0.10.0) +Provides: xorg-driver-input, xserver-xorg-input-11 +Depends: xorg-input-abi-11.0, xserver-xorg-core (>= 2:1.8.99.904), libc6 (>= 2.7), libx11-6, libxi6 (>= 2:1.2.0) +Suggests: xinput +Conflicts: wacom-tools (<< 0.10.0) +Filename: pool/main/x/xf86-input-wacom/xserver-xorg-input-wacom_0.10.8-0ubuntu1_amd64.deb +Size: 85548 +MD5sum: ac0e00807ae94d5f2f7d23be578abb12 +SHA1: 1c6e1c7c12363517dc956bff94fd3137ccdc9c8f +SHA256: 185bdca5588688037e8f9303dc3011db4b459c15bd57e14610414a7b6cc31178 +Description: X.Org X server -- Wacom input driver + This package provides the X.Org driver for Wacom tablet devices. +Homepage: http://linuxwacom.sf.net +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-all +Priority: optional +Section: x11 +Installed-Size: 24 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xorg +Version: 1:7.5+6ubuntu3 +Replaces: xserver-xorg-driver-all +Depends: xserver-xorg-video-apm, xserver-xorg-video-ark, xserver-xorg-video-ati, xserver-xorg-video-chips, xserver-xorg-video-cirrus, xserver-xorg-video-fbdev, xserver-xorg-video-i128, xserver-xorg-video-intel, xserver-xorg-video-mga, xserver-xorg-video-neomagic, xserver-xorg-video-nouveau, xserver-xorg-video-nv, xserver-xorg-video-rendition, xserver-xorg-video-s3, xserver-xorg-video-s3virge, xserver-xorg-video-savage, xserver-xorg-video-siliconmotion, xserver-xorg-video-sis, xserver-xorg-video-sisusb, xserver-xorg-video-tdfx, xserver-xorg-video-trident, xserver-xorg-video-tseng, xserver-xorg-video-vesa, xserver-xorg-video-openchrome, xserver-xorg-video-voodoo, xserver-xorg-video-vmware, x11-common +Conflicts: xserver-xorg-driver-all +Filename: pool/main/x/xorg/xserver-xorg-video-all_7.5+6ubuntu3_amd64.deb +Size: 1146 +MD5sum: f7bc46f83b91857efd62086ccce6e137 +SHA1: 19b30dfd8e98e0dd16921f3715ecc2c4bfef15c0 +SHA256: b70a091c6960244112c79f6ddf7ada8715b316da2b3df7931df86d3234893b08 +Description: the X.Org X server -- output driver metapackage + This package depends on the full suite of output drivers for the X.Org X server + (Xorg). It does not provide any drivers itself, and may be removed if you wish + to only have certain drivers installed. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-apm +Priority: optional +Section: x11 +Installed-Size: 220 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.2.3-0ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-apm +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-apm +Filename: pool/main/x/xserver-xorg-video-apm/xserver-xorg-video-apm_1.2.3-0ubuntu1_amd64.deb +Size: 75166 +MD5sum: d681c49714651d631bfdce3c8f8b4876 +SHA1: db29d20c5beb03f26d8fd0d0ff3bf6ad984fcde8 +SHA256: 0d0c328570db8eee1445bbd83848a7f7be1c4ef31be629b273758f027347c910 +Description: X.Org X server -- APM display driver + This package provides the driver for the Alliance Pro Motion family + of video cards; specifically, the 6420, 6422, AT24, AT25, and AT3D + cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-apm driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-ark +Priority: optional +Section: x11 +Installed-Size: 84 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.7.2-2build2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-ark +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-ark +Filename: pool/main/x/xserver-xorg-video-ark/xserver-xorg-video-ark_0.7.2-2build2_amd64.deb +Size: 18056 +MD5sum: 2805bc3e42b20b9212e8c2d3e904c8d1 +SHA1: bbdc07c1f02e15ccd22414dc5e6c2f3e389f7427 +SHA256: 683b9c5d142d4a9b21cf3a0a930cddf5ad59b5cff91a134728c9cfd74aabbfd5 +Description: X.Org X server -- ark display driver + This package provides the driver for the ark family + of chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-ark driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-ati +Priority: optional +Section: x11 +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:6.13.1-1ubuntu4 +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), libpciaccess0, xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.905-1ubuntu3), xserver-xorg-video-r128, xserver-xorg-video-mach64, xserver-xorg-video-radeon +Filename: pool/main/x/xserver-xorg-video-ati/xserver-xorg-video-ati_6.13.1-1ubuntu4_amd64.deb +Size: 21368 +MD5sum: 91f93ce4df4bc83846763a00ef3c51dc +SHA1: 47ff08c9ed28c3e3275b0710e373b95608f831a0 +SHA256: 87e558ebd7b1214425eaa4a3afed11a86c39058fee5d19bd19b1ea0f72ff6090 +Description: X.Org X server -- AMD/ATI display driver wrapper + This package provides the 'ati' driver for the AMD/ATI Mach64, Rage128, + Radeon, FireGL, FireMV, FirePro and FireStream series. This driver is + actually a wrapper that loads one of the 'mach64', 'r128' or 'radeon' + sub-drivers depending on the hardware. + These sub-drivers are brought through package dependencies. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-ati driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-ati-dbg +Priority: extra +Section: x11 +Installed-Size: 96 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-ati +Version: 1:6.13.1-1ubuntu4 +Depends: xserver-xorg-video-ati (= 1:6.13.1-1ubuntu4), xserver-xorg-video-mach64-dbg, xserver-xorg-video-r128-dbg, xserver-xorg-video-radeon-dbg +Filename: pool/main/x/xserver-xorg-video-ati/xserver-xorg-video-ati-dbg_6.13.1-1ubuntu4_amd64.deb +Size: 25140 +MD5sum: 79ca46474fe815bc58ade6149c5213f0 +SHA1: 741ef65d6beb94f49213432bfb82dbfeeb70a375 +SHA256: 67c0f463dd9357578395832db8e432344d1639df41f6c80b010acb75b0af998b +Description: X.Org X server -- AMD/ATI display driver wrapper (debugging symbols) + This package provides the 'ati' driver for the AMD/ATI Mach64, Rage128, + Radeon, FireGL, FireMV, FirePro and FireStream series. This driver is + actually a wrapper that loads one of the 'mach64', 'r128' or 'radeon' + sub-drivers depending on the hardware. + These sub-drivers are brought through package dependencies. + . + This package provides debugging symbols for this X.org X driver wrapper + and brings debugging symbols for sub-drivers through package dependencies. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-chips +Priority: optional +Section: x11 +Installed-Size: 236 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.2.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-chips +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-chips +Filename: pool/main/x/xserver-xorg-video-chips/xserver-xorg-video-chips_1.2.3-1_amd64.deb +Size: 84812 +MD5sum: 6b6abc6c3922bda0d0c35d24ebbb2edd +SHA1: 92f73bb35f9f1e22d558c19c7de7c8388abf3702 +SHA256: 6f5dfd337a75db61a82704edbfadd063bce55970f7cfcb875d022d217ed76d09 +Description: X.Org X server -- Chips display driver + This package provides the driver for the Chips & Technologies family + of video cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-chips driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-cirrus +Priority: optional +Section: x11 +Installed-Size: 164 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.3.2-2ubuntu3 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-cirrus +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-cirrus +Filename: pool/main/x/xserver-xorg-video-cirrus/xserver-xorg-video-cirrus_1.3.2-2ubuntu3_amd64.deb +Size: 48284 +MD5sum: b206bde81987c40ec2acefafe1d02151 +SHA1: cc2cd0482c1f002901645d52955a64790af677e6 +SHA256: 9c763caf29269b89b60ccd2c338fb282ee035447930366dca03461a9cc95911a +Description: X.Org X server -- Cirrus display driver + This package provides the driver for the Cirrus Logic family of video + cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-cirrus driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-fbdev +Priority: optional +Section: x11 +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.4.2-2ubuntu2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-fbdev +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-fbdev +Filename: pool/main/x/xserver-xorg-video-fbdev/xserver-xorg-video-fbdev_0.4.2-2ubuntu2_amd64.deb +Size: 22766 +MD5sum: c3595fdebc8771a1c1bb46c8ad703204 +SHA1: e6702adf49e636fe1afdecde9734525e39510367 +SHA256: fe8739839a641e80a688ee08c01a9fde82ece14bdde22fcd8d5b2bbed60aa49e +Description: X.Org X server -- fbdev display driver + This package provides the driver for the Linux framebuffer device (aka + 'fbdev'). + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-fbdev driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-i128 +Priority: optional +Section: x11 +Installed-Size: 140 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.3.3-2build2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-i128 +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-i128 +Filename: pool/main/x/xserver-xorg-video-i128/xserver-xorg-video-i128_1.3.3-2build2_amd64.deb +Size: 35928 +MD5sum: 92cdb3768406395d7dc38c8d5254a24b +SHA1: 4dd5b6fab1bec5e81d84d42f03286518fbbb603f +SHA256: c79f25b4fd0d7e0a731ae32eb1ac376c32a5bf297d96024cc82aee7669e05cbc +Description: X.Org X server -- i128 display driver + This package provides the driver for Number 9 Imagine (I128) video cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-i128 driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-i740 +Priority: optional +Section: x11 +Installed-Size: 132 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.3.2-2build1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-i740 +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.3.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-i740 +Filename: pool/main/x/xserver-xorg-video-i740/xserver-xorg-video-i740_1.3.2-2build1_amd64.deb +Size: 33110 +MD5sum: affdf50d2cb8d927caa1458a00167a04 +SHA1: 72ad34b92111061f3e1c2d9e5e1b2ab5030419e8 +SHA256: a9d0cd04ba1b145ae345d396e8113c5ba9391662e53928407727ab9886cb6083 +Description: X.Org X server -- i740 display driver + This package provides the driver for the Intel i740 family of video chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-i740 driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-intel +Priority: optional +Section: x11 +Installed-Size: 1020 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 2:2.12.0-1ubuntu3 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-i810, xserver-xorg-video-i810 (<< 2:1.9.91-1), xserver-xorg-video-i810-modesetting, xserver-xorg-video-intel-modesetting +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), libdrm-intel1 (>= 2.4.21), libdrm2 (>= 2.4.17), libpciaccess0 (>= 0.8.0+git20071002), libx11-6, libx11-xcb1, libxcb-aux0 (>= 0.3.6), libxcb-dri2-0, libxcb1, libxext6, libxfixes3 (>= 1:4.0.1), libxv1, libxvmc1, xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Recommends: intel-gpu-tools +Conflicts: 915resolution, xserver-xorg-driver-i810, xserver-xorg-video-i810 (<< 2:1.9.91-1), xserver-xorg-video-i810-modesetting, xserver-xorg-video-intel-modesetting +Filename: pool/main/x/xserver-xorg-video-intel/xserver-xorg-video-intel_2.12.0-1ubuntu3_amd64.deb +Size: 263918 +MD5sum: 982a8ed2c2b4499d6515cbd0ed345d4c +SHA1: 0a364cdb73efc9229517d4f15c8fd2e07d81d76b +SHA256: 570204fc03af24bdb3a5ed733b85575e519060719807d0f841c02d619b5041b6 +Description: X.Org X server -- Intel i8xx, i9xx display driver + This package provides the driver for the Intel i8xx and i9xx family + of chipsets, including i810, i815, i830, i845, i855, i865, i915, i945 + and i965 series chips. + . + This package also provides XvMC (XVideo Motion Compensation) drivers + for i810/i815 and i9xx and newer chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-intel driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-intel-dbg +Priority: extra +Section: x11 +Installed-Size: 2012 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-intel +Version: 2:2.12.0-1ubuntu3 +Depends: xserver-xorg-video-intel (= 2:2.12.0-1ubuntu3) +Recommends: intel-gpu-tools +Filename: pool/main/x/xserver-xorg-video-intel/xserver-xorg-video-intel-dbg_2.12.0-1ubuntu3_amd64.deb +Size: 852222 +MD5sum: 1e2b9de8e535a1e79e28c0b365530054 +SHA1: e62911adc3695e111d21f152ee5d443f3388191d +SHA256: ec72365988119977ae92c7ed651773a2d46db2654e645b3bd9f4d894b0cc9230 +Description: X.Org X server -- Intel i8xx, i9xx display driver (debug symbols) + This driver provides support for the Intel i8xx and i9xx family of chipsets, + including i810, i815, i830, i845, i855, i865, i915, and i945 series chips. + . + This package provides debugging symbols for this Xorg X driver. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-mach64 +Priority: optional +Section: x11 +Installed-Size: 388 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 6.8.2-3build2 +Replaces: xserver-xorg-video-ati (<= 1:6.8.0-1) +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-video-ati (<= 1:6.8.0-1) +Filename: pool/main/x/xserver-xorg-video-mach64/xserver-xorg-video-mach64_6.8.2-3build2_amd64.deb +Size: 212368 +MD5sum: 293e572c7b07db7242cc3c90053ae082 +SHA1: 18236fb1abc2d6077ea9e9c2a60d0a7c7faa7723 +SHA256: 6f9f3276cdc916e4808db47b61d93ef8ff1f60f4f0bc95521446d2d448018f14 +Description: X.Org X server -- ATI Mach64 display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for the ATI Mach64 series. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-mach64 driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-mach64-dbg +Priority: extra +Section: x11 +Installed-Size: 1916 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-mach64 +Version: 6.8.2-3build2 +Depends: xserver-xorg-video-mach64 (= 6.8.2-3build2) +Filename: pool/main/x/xserver-xorg-video-mach64/xserver-xorg-video-mach64-dbg_6.8.2-3build2_amd64.deb +Size: 949534 +MD5sum: 13879b58283b1afc6760cd9fe90dd1e1 +SHA1: 81fc81d66378f12d7e98cbd1fb82ead8ac22217f +SHA256: ac66a5f2d697a533727a95d07bafe0416053af8815786c4e10fa2e1479887586 +Description: X.Org X server -- ATI display driver (debugging symbols) + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for the ATI Mach64 series. + . + This package provides debugging symbols for the Xorg X server ATI Mach64 + display driver. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-mga +Priority: optional +Section: x11 +Installed-Size: 284 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.4.11.dfsg-4build1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-mga +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Suggests: firmware-linux +Conflicts: xserver-xorg-driver-mga +Filename: pool/main/x/xserver-xorg-video-mga/xserver-xorg-video-mga_1.4.11.dfsg-4build1_amd64.deb +Size: 116770 +MD5sum: e7aad613e6d8566daee31386aaba9409 +SHA1: 7c9cdddc5eb80d338164e5c5c34337d82b9ca687 +SHA256: a7a02db1b18fb648cbe723666705128b912f97c12b0d471049f2b841ea248077 +Description: X.Org X server -- MGA display driver + This package provides the driver for the Matrox MGA family of chipsets, + including Matrox Millennium and Mystique cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-mga driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-neomagic +Priority: optional +Section: x11 +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.2.4-3build2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-neomagic +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-neomagic +Filename: pool/main/x/xserver-xorg-video-neomagic/xserver-xorg-video-neomagic_1.2.4-3build2_amd64.deb +Size: 46042 +MD5sum: 883c95770dec8473fc44f0560937bde6 +SHA1: 47add4ef96ffcd0eab086fb5c09412e769088ae3 +SHA256: f560066d2d7de1ba74b71382169f6a2402308822f1a07fbc5bbad30a3b99d846 +Description: X.Org X server -- Neomagic display driver + This package provides the driver for Neomagic MagicGraph chipsets, which are + commonly found in laptops. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-neomagic driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-nouveau +Priority: optional +Section: x11 +Installed-Size: 304 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.0.16+git20100805+b96170a-0ubuntu1 +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), libdrm-nouveau1 (>= 2.4.20-3~), libudev0 (>= 147), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Filename: pool/main/x/xserver-xorg-video-nouveau/xserver-xorg-video-nouveau_0.0.16+git20100805+b96170a-0ubuntu1_amd64.deb +Size: 113304 +MD5sum: ade4a7afa72b9bfcea0cdaee5d18472e +SHA1: f1cd5716bc00ffb0e55897a7aa9047a7537b9f42 +SHA256: 3f8a7eda416f6324495a74a04f3868a1251a1a4caa8ec002421adc0ec31268dc +Description: X.Org X server -- Nouveau display driver (experimental) + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for NVIDIA Riva, TNT, GeForce, and Quadro cards. + . + Although the nouveau project aims to provide full 3D support it is not yet + complete, and these packages do not include any 3D support. + Users requiring 3D support should use the non-free "nvidia" driver. + . + This package is built from the FreeDesktop.org xf86-video-nouveau driver. +Homepage: http://nouveau.freedesktop.org/wiki/ +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-nouveau-dbg +Priority: extra +Section: debug +Installed-Size: 1252 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-nouveau +Version: 1:0.0.16+git20100805+b96170a-0ubuntu1 +Depends: xserver-xorg-video-nouveau (= 1:0.0.16+git20100805+b96170a-0ubuntu1) +Filename: pool/main/x/xserver-xorg-video-nouveau/xserver-xorg-video-nouveau-dbg_0.0.16+git20100805+b96170a-0ubuntu1_amd64.deb +Size: 522694 +MD5sum: d50e53f1832e2acd58ad5adc7c324a5a +SHA1: 774ad386ef1cff56b346cde3b4c99d10f2bf2f93 +SHA256: 0e910561ac3913123fbaf1b8223f01d30c251138e7ba483e5ab77eb436988173 +Description: X.Org X server -- Nouveau display driver (debug symbols) + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for NVIDIA Riva, TNT, GeForce, and Quadro cards. + . + Although the nouveau project aims to provide full 3D support it is not yet + complete, and these packages do not include any 3D support. + Users requiring 3D support should use the non-free "nvidia" driver. + . + This package provides debugging symbols for this Xorg X driver. +Homepage: http://nouveau.freedesktop.org/wiki/ +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-nv +Priority: optional +Section: x11 +Installed-Size: 288 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:2.1.17-3ubuntu3 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-nv, xserver-xorg-video-riva128 +Provides: xf86-video-driver-riva128, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), libdrm2 (>= 2.4.3), libpciaccess0 (>= 0.8.0+git20071002), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-nv, xserver-xorg-video-riva128 +Filename: pool/main/x/xserver-xorg-video-nv/xserver-xorg-video-nv_2.1.17-3ubuntu3_amd64.deb +Size: 117648 +MD5sum: a04ed6409ff5fd3fb7beb30d922bb046 +SHA1: e817cab78e016a3c585ea77cb45f6de6b77a743a +SHA256: 20a3fec830cf7ccafa31daf06a998fa550ed909359c4cf1f9590bd634030566e +Description: X.Org X server -- NV display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for NVIDIA Riva, TNT, GeForce, and Quadro cards. + . + Note that this is not the same as the binary-only 'nvidia' driver, which + adds 3D support, but is binary-only and not supported. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-nv driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-openchrome +Priority: optional +Section: x11 +Installed-Size: 572 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.2.904+svn842-0ubuntu1 +Replaces: libchromexvmc1, libchromexvmcpro1 +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), libdrm2 (>= 2.3.1), libx11-6, libxext6, libxv1, libxvmc1, xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: libchromexvmc1, libchromexvmcpro1 +Filename: pool/main/x/xserver-xorg-video-openchrome/xserver-xorg-video-openchrome_0.2.904+svn842-0ubuntu1_amd64.deb +Size: 195642 +MD5sum: 6b7ba8d6cea0d091c85c8677f57711df +SHA1: 8aa58956d76f4177b30a64c2e36ad379371f3e93 +SHA256: 31476e9de3305a4c069f922a452be791f0ae8f015407125f8c09eeb6eebca0aa +Description: X.Org X server -- VIA display driver + OpenChrome is a project for the development of free and open-source drivers + for the VIA UniChrome video chipsets. + . + Originally called the 'snapshot' release, since it was a snapshot of an + experimental branch of the unichrome cvs code, this is a continued development + of the open source unichrome driver (from http://unichrome.sf.net) which + also incorporates support for the unichrome-pro chipsets. + . + Support for hardware acceleration (XvMC) for all chipsets has subsequently + been ripped out of the unichrome.sf.net driver. Therefore your only option if + you wish to make use of the acceleration features of your VIA chip with free + and open-source drivers is to use this version of the driver. +Homepage: http://www.openchrome.org +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-r128 +Priority: optional +Section: x11 +Installed-Size: 320 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 6.8.1-3build1 +Replaces: xserver-xorg-video-ati (<= 1:6.8.0-1) +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Suggests: firmware-linux +Conflicts: xserver-xorg-video-ati (<= 1:6.8.0-1) +Filename: pool/main/x/xserver-xorg-video-r128/xserver-xorg-video-r128_6.8.1-3build1_amd64.deb +Size: 179372 +MD5sum: bb1ced7f07b0df67f771005e2c778eb4 +SHA1: 622c864794e968edab180a122b7b158e0b8643b2 +SHA256: b3361b85020d8be4c3354872882c42debdc8d00a95a5ba6512c6418582334ae6 +Description: X.Org X server -- ATI r128 display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for the ATI Rage 'r128' series. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-r128 driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-r128-dbg +Priority: extra +Section: x11 +Installed-Size: 644 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-r128 +Version: 6.8.1-3build1 +Depends: xserver-xorg-video-r128 (= 6.8.1-3build1) +Filename: pool/main/x/xserver-xorg-video-r128/xserver-xorg-video-r128-dbg_6.8.1-3build1_amd64.deb +Size: 331644 +MD5sum: 53ba42b5e97d8ae41a1d0d28cbd9d737 +SHA1: 69d657096949d9028c2226e8af5facba4e7cf046 +SHA256: 2976cecbb0ad4f2837c801d3e5ef1791bf25743d7c5724e901538820aca6c64e +Description: X.Org X server -- ATI r128 display driver (debugging symbols) + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for the ATI Rage 'r128' series. + . + This package provides debugging symbols for the Xorg X server ATI r128 + display driver. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-radeon +Priority: optional +Section: x11 +Installed-Size: 1336 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-ati +Version: 1:6.13.1-1ubuntu4 +Replaces: xserver-xorg-video-ati (<= 1:6.8.191-1) +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), libdrm-radeon1 (>= 2.4.17), libdrm2 (>= 2.4.16), libpciaccess0 (>= 0.10.2), libpixman-1-0, libudev0 (>= 147), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.905-1ubuntu3) +Suggests: firmware-linux +Filename: pool/main/x/xserver-xorg-video-ati/xserver-xorg-video-radeon_6.13.1-1ubuntu4_amd64.deb +Size: 446340 +MD5sum: 5cbd60724971234d437d66152bd6f53d +SHA1: 001f849426d1a04ce69ead3311ad72fa8a218223 +SHA256: b8ff48845a3c7ff814e3d3bd80e61d0c26d79deb8cde03f38462eb0be60060ab +Description: X.Org X server -- AMD/ATI Radeon display driver + This package provides the 'radeon' driver for the AMD/ATI Radeon, FireGL, + FireMV, FirePro and FireStream series. + . + Note that this is not the same as the ATI-provided, binary-only, 'fglrx' + driver, which provides additional 3D functionality for some newer Radeon + cards, but is not supported. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-ati driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-radeon-dbg +Priority: extra +Section: x11 +Installed-Size: 3636 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Source: xserver-xorg-video-ati +Version: 1:6.13.1-1ubuntu4 +Replaces: xserver-xorg-video-ati-dbg (<= 1:6.8.191-1) +Depends: xserver-xorg-video-radeon (= 1:6.13.1-1ubuntu4) +Filename: pool/main/x/xserver-xorg-video-ati/xserver-xorg-video-radeon-dbg_6.13.1-1ubuntu4_amd64.deb +Size: 1622426 +MD5sum: 578f8055b90f4fffb4470536d0ee3816 +SHA1: ba25bf44d4db7e252452657beb9815fe498dc34b +SHA256: 318952ff7e6ee96d41736388ba0aaab4c50de8faecb5263c7290ee761a926248 +Description: X.Org X server -- AMD/ATI Radeon display driver (debugging symbols) + This package provides the 'radeon' driver for the AMD/ATI Radeon, FireGL, + FireMV, FirePro and FireStream series. + . + This package provides debugging symbols for this X.org X driver. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m + +Package: xserver-xorg-video-rendition +Priority: optional +Section: x11 +Installed-Size: 116 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:4.2.4-0ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-rendition +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-rendition +Filename: pool/main/x/xserver-xorg-video-rendition/xserver-xorg-video-rendition_4.2.4-0ubuntu1_amd64.deb +Size: 32006 +MD5sum: 040f0b377d623d40fd33d3befcb12e77 +SHA1: a76e9747761a5225808bf96fcefdb0196d7c2540 +SHA256: 227537a5f5635d56e1b28f5455dda40ec01fbda04e67a6aab956cb455046dc16 +Description: X.Org X server -- Rendition display driver + This package provides the driver for the Rendition Verite family of chipsets, + commonly found in 3D accelerators such as the Creative 3D Blaster. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-rendition driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-s3 +Priority: optional +Section: x11 +Installed-Size: 148 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.6.3-2build2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-s3 +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-s3 +Filename: pool/main/x/xserver-xorg-video-s3/xserver-xorg-video-s3_0.6.3-2build2_amd64.deb +Size: 43636 +MD5sum: 0318e0c20f32816e993115dcc15a9b6b +SHA1: ff75f22d1054d73260f0968fd22ff978be6b215a +SHA256: 04ccbe465f03732a9a30d80527dada04197035d2cde298e1dbc13bc2dc57f57e +Description: X.Org X server -- legacy S3 display driver + This package provides the driver for certain legacy S3 video card chipsets, + including the Trio64 and 96x cards. It does not provide support for + ViRGE/Trio3D or Savage chipsets; support for these cards is provided by + xserver-xorg-video-s3virge and xserver-xorg-driver-savage, respectively. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-s3 driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-s3virge +Priority: optional +Section: x11 +Installed-Size: 160 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.10.4-2build2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-s3virge +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-s3virge +Filename: pool/main/x/xserver-xorg-video-s3virge/xserver-xorg-video-s3virge_1.10.4-2build2_amd64.deb +Size: 48792 +MD5sum: 3da2e57ba1ae98bfe73473416ff030f5 +SHA1: 3296574523259de9c62dbbf771584b94f8d519c0 +SHA256: 0c4604ad77d36b8913e602372f1c4721c3ae8b2a187d2b3583ce4d53bba29e60 +Description: X.Org X server -- S3 ViRGE display driver + This package provides the driver for the S3 ViRGE and Trio3D family + of chipsets. It does not support Trio64 or S3 96x cards; support for + these can be found in the xserver-xorg-video-s3 package. Support for + S3 Savage chipsets can be found in xserver-xorg-video-savage. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-s3virge driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-savage +Priority: optional +Section: x11 +Installed-Size: 240 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 1:2.3.1-2ubuntu2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-savage +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.3.4), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-savage +Filename: pool/main/x/xserver-xorg-video-savage/xserver-xorg-video-savage_2.3.1-2ubuntu2_amd64.deb +Size: 94910 +MD5sum: a57a30c861246f6c6d7bae87749bda30 +SHA1: aee96ab1c5817f881f7c30613efb6ff6c61590d4 +SHA256: 2465340a5607ff72b7088a4ad7a2f7254f02c4d17d0438c2823ff76c9ec5b01e +Description: X.Org X server -- Savage display driver + This package provides the driver for the S3/VIA Savage/ProSavage/Twister family + of chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-savage driver module. +Orig-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-siliconmotion +Priority: optional +Section: x11 +Installed-Size: 224 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.7.4-0ubuntu2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-siliconmotion +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-siliconmotion +Filename: pool/main/x/xserver-xorg-video-siliconmotion/xserver-xorg-video-siliconmotion_1.7.4-0ubuntu2_amd64.deb +Size: 89322 +MD5sum: 67bb40a85964b18216c30594cd260a6a +SHA1: 39647585477ce517ce094fa346879cbe6c68a8f8 +SHA256: 9459d2f7d0be571881e18b7e24dae010f5a4d0c8210ea4bab306e476f77b7e63 +Description: X.Org X server -- SiliconMotion display driver + This package provides the driver for the SiliconMotion Lynx and Cougar family + of chipsets, commonly found in laptops. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-siliconmotion driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-sis +Priority: optional +Section: x11 +Installed-Size: 672 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.10.3-1build1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-sis +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-sis +Filename: pool/main/x/xserver-xorg-video-sis/xserver-xorg-video-sis_0.10.3-1build1_amd64.deb +Size: 297044 +MD5sum: 57f26ef639f3bc4dffce2e631f5edab3 +SHA1: fbeb26493846b2bd9f0dd306f411ded6b15e367a +SHA256: b391011332abdff5241f0bef9b295a981d0f12ed575b34827cca3d22809b1d5a +Description: X.Org X server -- SiS display driver + This package provides the driver for all SiS and XGI Volari cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-sis driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-sisusb +Priority: optional +Section: x11 +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:0.9.4-0ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-sisusb +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-sisusb +Filename: pool/main/x/xserver-xorg-video-sisusb/xserver-xorg-video-sisusb_0.9.4-0ubuntu1_amd64.deb +Size: 49900 +MD5sum: e17bb0f9c542a826ae6ae9364e4651c0 +SHA1: 695515870f6b7c19e9e2b9a2c6aa63d188f9f0a3 +SHA256: fd6cfff10a85c55661e29b91aec99f538940d5cf55dc9fa138ea0dc83fda5b47 +Description: X.Org X server -- SiS USB display driver + This package provides the driver for SiS USB-attached video devices. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-sisusb driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-tdfx +Priority: optional +Section: x11 +Installed-Size: 152 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.4.3-2build2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-tdfx +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-tdfx +Filename: pool/main/x/xserver-xorg-video-tdfx/xserver-xorg-video-tdfx_1.4.3-2build2_amd64.deb +Size: 46392 +MD5sum: 0adaf52a840699116197b796a8eb5492 +SHA1: f2026af7d453518705f049ef9750ba3f08df1c62 +SHA256: 620e5143574d0820641004e9c386748c35344bb3ec95833d884685c022dabe87 +Description: X.Org X server -- tdfx display driver + This package provides the driver for 3dfx Voodoo video cards and their + derivatives. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-tdfx driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-trident +Priority: optional +Section: x11 +Installed-Size: 244 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.3.4-0ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-trident +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.7), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-trident +Filename: pool/main/x/xserver-xorg-video-trident/xserver-xorg-video-trident_1.3.4-0ubuntu1_amd64.deb +Size: 82352 +MD5sum: 5389ff7eb1757dda92a35b8cec818b23 +SHA1: f731b2a951e5a64b990ddd88275a9158ddfdee30 +SHA256: 9757b882d296eed853c152d79546ad61eec9162abe0f32007dfa666c774cb408 +Description: X.Org X server -- Trident display driver + This package provides the driver for Trident Blade/Image/ProVidia/TGUI/9xxx + video cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-trident driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-tseng +Priority: optional +Section: x11 +Installed-Size: 136 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.2.4-0ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-tseng +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-tseng +Filename: pool/main/x/xserver-xorg-video-tseng/xserver-xorg-video-tseng_1.2.4-0ubuntu1_amd64.deb +Size: 37086 +MD5sum: 49454fcbc2be113329a7d7c4baa451ec +SHA1: ba126de1cb3ce5f3348de11bc2aa5656b59b1e63 +SHA256: 66b15338b13dd04c4f987326103b14f647824c368f197db5cdbd4e8038b4e764 +Description: X.Org X server -- Tseng display driver + This package provides the driver for Tseng Labs cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-tseng driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-vesa +Priority: optional +Section: x11 +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:2.3.0-3build1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-vesa +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), libdrm2 (>= 2.4.3), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-vesa +Filename: pool/main/x/xserver-xorg-video-vesa/xserver-xorg-video-vesa_2.3.0-3build1_amd64.deb +Size: 27648 +MD5sum: 11f9542a9848c934781ff4c7e526b4eb +SHA1: 7d04bd52102ba4bc279121dda3b23bf0bb365494 +SHA256: 8960650901beb1b9cebae21d4f7c505039b4e8b584acf7d495948d8c064c078a +Description: X.Org X server -- VESA display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + uses the standard VESA interface provided on all video cards, but runs + unaccelerated. This driver is not recommended for use unless you have a + problem with the normal driver for your card, because it will peform very + badly. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-vesa driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-vmware +Priority: optional +Section: x11 +Installed-Size: 148 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:11.0.1-2build1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-vmware +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.4), libdrm2 (>= 2.3.1), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-vmware +Filename: pool/main/x/xserver-xorg-video-vmware/xserver-xorg-video-vmware_11.0.1-2build1_amd64.deb +Size: 46210 +MD5sum: 324e418b02bfaab852d05363b63beb7b +SHA1: 533ba227f0c038e7f4eb63689fb27ab48c8a3915 +SHA256: 5a9910e91c7f0c6c51bbbd93b95a933a13e14412b0c5d10d6c6d406acf036835 +Description: X.Org X server -- VMware display driver + This package provides the driver for VMware client sessions, i.e. if Linux + is running inside a VMware session. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-vmware driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook + +Package: xserver-xorg-video-voodoo +Priority: optional +Section: x11 +Installed-Size: 104 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: amd64 +Version: 1:1.2.4-0ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-voodoo +Provides: xorg-driver-video, xserver-xorg-video-8 +Depends: libc6 (>= 2.2.5), xorg-video-abi-8.0, xserver-xorg-core (>= 2:1.8.99.904) +Conflicts: xserver-xorg-driver-voodoo +Filename: pool/main/x/xserver-xorg-video-voodoo/xserver-xorg-video-voodoo_1.2.4-0ubuntu1_amd64.deb +Size: 25076 +MD5sum: 8fc0fa8abb44151231be76434bf3451e +SHA1: cb618ff8a5eff6389aa660f5a51643ed3ba8b3d6 +SHA256: dfdda11e40c533f6636084385882d114347336766e7fc4bb14f515df5b858982 +Description: X.Org X server -- Voodoo display driver + This package provides the driver for 3dfx Voodoo1 and Voodoo2 chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + . + This package is built from the X.org xf86-video-voodoo driver module. +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Origin: Ubuntu +Supported: 18m +Task: ubuntu-desktop, ubuntu-uec-live, kubuntu-desktop, kubuntu-mobile, kubuntu-netbook, edubuntu-desktop, edubuntu-uec-live, xubuntu-desktop, mythbuntu-backend-master, mythbuntu-backend-slave, mythbuntu-desktop, mythbuntu-frontend, ubuntu-netbook diff --git a/test/integration/Packages-xorg-break-providers b/test/integration/Packages-xorg-break-providers new file mode 100644 index 0000000..f6e1d81 --- /dev/null +++ b/test/integration/Packages-xorg-break-providers @@ -0,0 +1,52 @@ +Package: xserver-xorg-video-intel +Priority: optional +Section: x11 +Installed-Size: 1292 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Version: 2:2.13.901-2 +Provides: xserver-xorg-video-8 +Filename: pool/main/x/xserver-xorg-video-intel/xserver-xorg-video-intel_2.13.901-2_i386.deb +Size: 586964 +MD5sum: 72527f4b2c9d734e53202736e3177865 +Description: X.Org X server -- Intel i8xx, i9xx display driver + +Package: xserver-xorg-video-vesa +Priority: optional +Section: x11 +Installed-Size: 104 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Version: 1:2.3.0-4 +Provides: xserver-xorg-video-8 +Filename: pool/main/x/xserver-xorg-video-vesa/xserver-xorg-video-vesa_2.3.0-4_i386.deb +Size: 27158 +MD5sum: 77bf2935c40b3b7739d431930e53d185 +Description: X.Org X server -- VESA display driver + +Package: xserver-xorg-video-vesa +Priority: optional +Section: x11 +Installed-Size: 104 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Version: 1:2.3.0-3 +Provides: xserver-xorg-video-6 +Filename: pool/main/x/xserver-xorg-video-vesa/xserver-xorg-video-vesa_2.3.0-3_i386.deb +Size: 27122 +MD5sum: 0cd97be927c7d75f2a7230739f8f866c +Description: X.Org X server -- VESA display driver + +Package: xserver-xorg-core +Priority: optional +Section: x11 +Installed-Size: 4436 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: xorg-server +Version: 2:1.7.7-8 +Breaks: xserver-xorg-video-6 +Filename: pool/main/x/xorg-server/xserver-xorg-core_1.7.7-8_i386.deb +Size: 2405050 +MD5sum: 976ddb13473e52903dd839d1f7ec390b +Description: Xorg X server - core server diff --git a/test/integration/apt.pem b/test/integration/apt.pem new file mode 100644 index 0000000..f48df05 --- /dev/null +++ b/test/integration/apt.pem @@ -0,0 +1,49 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCt4R1Q2oYF6utL +19GBhnlHW8L2BI7PRFWge/ZpqIZWsaFcb30FV86Z6aXXZmgfEJ2814ZZYD1IKeCe +JsJpns7B4vYe1v64r995ZNBQAAKIYjICkKZOBgOphV+ChBfrCctVXgfLbMP6iBdH +J02wHzSCCdZm0sdVl9tB5l/OyJU8Mb4KB3btBhfZfY2M6lU+FOjcXs1LOduUrv7K +fZ+DEalvVGkomLtHtD0qb2vkqFrTjVCkziUVWhhxFFflt08oQ01Clxpl+uv7rOQo +jtkJ1LrMuv7iPfaZ/z3qLiFxZYG1BCGEwTOKCtJo6bgFzXiN3q7Q5FFlmv851x2J +Dn8C7Qm7AgMBAAECggEAE3q6vAofJZ6Ryadd8zLLd3ESQFl2XkX7icUZb/DPS/sO +ZrqeuPCDVr7UM3NnisNjyHoktPKRKvp2DYGuGgMOiq4QgJf5ZVten8zpgWze28SU +cbEe0HLgCifE8Ww2+b/ZJbEpEmMW+YQxh2khzO9SBJdxi4dliXM/vvw+E35pKZsB +s6glrz6VQAxxa9fY4fLnB2DafHy+pUvRVw8gC6PCM9jXN9tMYAqztsJu7aaanNyT +HX2UDWa8hxVx6t5UQZuxvst9N+RcEwmVCR2qlfZt/VRBRibBm62crEKbTD00mNHQ +4AIDn3g6Y3SXpDlgtNpjLyBL3fODPIwqwGdblaSKkQKBgQDYXecu0Eda7kbR5ciW +IAn8XOxsBIkkh8YVl2gRiiajRVoeiYBHaW9TyuQiaWrftiDQxB/N4G2focTXy/7O +VJn6e/SUoO/ZGRw2GbTxLUQptgvFsejYCcW9XpC8MCwE/y2swiY7JM0WR8cV2nCk +a/Cls6f1LjL13aFO0PAorEcahQKBgQDNuth6EHZVwfDgUuqhRw4HIIpfsfiA3UOd +b5k/NsfQIev1YUqnfucgInNPDq2Jf8eTQw3TKaszo2DCjDffCsEgM09Tym143Bd6 +AsMuqAStsE3IEC7pnmh95l29/7mh4OuG5cp5JUx0Pi5PkuJ6ywA8P1rM1MB9Zf52 +NGJCo1pnPwKBgQCx/n4i+uDYo1DLd/dN2UmdvGwaaJjR3ohMVuQcGcSzaGg82u0W +0lvtWOnYjVSIeXIBjHaFjW1hd1lSFdWms96AO9z3MHZf6NJWh0tdZNnAXqzMlBFz +OIbdxJ/Y0OBFtA9FIesFmL7G54GWLr+f49Ry3Jr9jmYJ8au0BRqsux07aQKBgC4q +CT2KyCMCO/z6XjAGc71hres/UlYIUI3ZZvfqYPfxRLNxO4FOVqq9UEajMomyJKSE +3WtO5F3YAXRmZnskPKXvHZPdzqbaLGJykD298h7PewSzrPM7WpM1yD9ETPFoOTGy +CrcYiYlkEpxEh5GqT8k1JjjkXLVG18zKgGoXocedAoGAQyU2DCNfxwzIJfFHKZEG +zpni72cR68Tu3AhW/38vMR2ZPca4KzXrUA52T+j7vkQC38LHm/mzNXNP7Vya0PJ3 +WoYOcLtg2uFPh0P/35ArEzuNooLsvulgg1jsamPbF8KAvJZKZHr30hlC/JGYSBbV +bnkzJTShsKzHIUiLtQ8Ja+E= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIJAJ39xapQo0vLMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV +BAYTAkRFMRMwEQYDVQQIDApTb21lLVN0YXRlMRswGQYDVQQKDBJBUFQgVGVzdGNh +c2VzIEdtYkgxEjAQBgNVBAMMCWxvY2FsaG9zdDAgFw0xMzA5MTYwODQ4MzVaGA80 +NzUxMDgxMzA4NDgzNVowUzELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3Rh +dGUxGzAZBgNVBAoMEkFQVCBUZXN0Y2FzZXMgR21iSDESMBAGA1UEAwwJbG9jYWxo +b3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAreEdUNqGBerrS9fR +gYZ5R1vC9gSOz0RVoHv2aaiGVrGhXG99BVfOmeml12ZoHxCdvNeGWWA9SCngnibC +aZ7OweL2Htb+uK/feWTQUAACiGIyApCmTgYDqYVfgoQX6wnLVV4Hy2zD+ogXRydN +sB80ggnWZtLHVZfbQeZfzsiVPDG+Cgd27QYX2X2NjOpVPhTo3F7NSznblK7+yn2f +gxGpb1RpKJi7R7Q9Km9r5Kha041QpM4lFVoYcRRX5bdPKENNQpcaZfrr+6zkKI7Z +CdS6zLr+4j32mf896i4hcWWBtQQhhMEzigrSaOm4Bc14jd6u0ORRZZr/OdcdiQ5/ +Au0JuwIDAQABo1AwTjAdBgNVHQ4EFgQUhd26E7ykEYRTDbgMzkYtFtENhSkwHwYD +VR0jBBgwFoAUhd26E7ykEYRTDbgMzkYtFtENhSkwDAYDVR0TBAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAWcyMKi0Vc4beGV7w4Qft0/2P68jjMlQRdgkz+gGXbMVr +//KhqR3PbgFmHHpUsZ718AHeerNNdfFzOUptiAiOqH2muyAGdeWCxJ8KcU0sic8x +/h3TOzMYfEozhgMSJp9YW1z655uHcb15S7jb4zZwXwGyQzxwXT35SKj2mCqSbjIb +G987DGI+MtyoGRXhIwnBEsGTI1ck3NoeXBJ/tS/Ma8gUUC2xldMSprtHjeUHvZV2 +iz/HTqGlMLGW96AVeZiFNiC1fJ6pvref2XW5MkkvQm8tOi2cSrwJc9CgnCpCxkLp +liRsbwAduwkA26XzEomMR7yyYS5pm0Eu0cO9X39FKQ== +-----END CERTIFICATE----- diff --git a/test/integration/cachedb-lp1274466-old-format.db b/test/integration/cachedb-lp1274466-old-format.db Binary files differnew file mode 100644 index 0000000..88da5f1 --- /dev/null +++ b/test/integration/cachedb-lp1274466-old-format.db diff --git a/test/integration/create-test-data b/test/integration/create-test-data new file mode 100755 index 0000000..eff2ba5 --- /dev/null +++ b/test/integration/create-test-data @@ -0,0 +1,60 @@ +#!/bin/sh +set +e # its okay to fail in these script, most of the time the apt* stuff will generate errors + +if [ -z "$1" -o -z "$2" ]; then + echo "Usage: $0 file codename pkg…" + exit 1 +fi + +CHECK_ARGS='no' +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +find_project_binary_dir +BUILDDIRECTORY="${APT_INTEGRATION_TESTS_BUILD_DIR:-"${PROJECT_BINARY_DIR}/cmdline"}" + +GENERATE="$1" +CODENAME="$2" +shift 2 + +WORKDIR="$(mktemp -d)" +cleanupworkdir() { + if [ -z "$WORKDIR" ]; then return; fi + rm -rf "$WORKDIR" +} +trap "cleanupworkdir;" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM +touch "$WORKDIR/status" +TMPGEN="$WORKDIR/Packages" +export LANG=C.UTF-8 + +aptgetinstall() { + aptget install "$@" --no-install-recommends -t "$CODENAME" -s \ + -o Dir::state::status="$WORKDIR/status" \ + -o Dir::Cache="$WORKDIR" \ + -o pkgCacheGen::Essential=none \ + -o APT::Immediate-Configure=0 +} +LISTOFPKGS="$(aptgetinstall "$@" 2> /dev/null | awk '/^Inst/ {print $2}' | sed -e "s#\$#/$CODENAME#")" +if [ -z "$LISTOFPKGS" ]; then + echo "List of packages is empty: run apt-get install command again for you now" + aptgetinstall + exit 1 +fi +aptcache show $LISTOFPKGS --no-all-versions 2> "$WORKDIR/error.lst" | sed -e '/^ / d' \ + -e '/^SHA1: / d' -e '/^SHA256: / d' \ + -e '/^Homepage: / d' -e '/^Tag: / d' \ + -e '/^Xul-Appid: / d' \ + -e '/^Status: / d' \ + -e 's/^Description-en:/Description:/' \ + > "$TMPGEN" + +if [ "$CODENAME" = "experimental" ]; then + aptcache show $(cut -d"'" -f 4 "$WORKDIR/error.lst" | sed -e 's#$#/sid#') --no-all-versions 2> /dev/null >> "$TMPGEN" +fi + +if echo "$GENERATE" | grep '^status-' > /dev/null; then + sed -i "$TMPGEN" -e '/^Package: / a\ +Status: install ok installed' \ + -e '/^Filename: / d' -e '/^Size: / d' -e '/^MD5sum: / d' +fi + +apt-sortpkgs "$TMPGEN" > "$GENERATE" diff --git a/test/integration/deb-bug-330162-encoded-tar-header.deb b/test/integration/deb-bug-330162-encoded-tar-header.deb Binary files differnew file mode 100644 index 0000000..f38b1aa --- /dev/null +++ b/test/integration/deb-bug-330162-encoded-tar-header.deb diff --git a/test/integration/deb-lp1274466-cachedb.deb b/test/integration/deb-lp1274466-cachedb.deb Binary files differnew file mode 100644 index 0000000..43d7ee6 --- /dev/null +++ b/test/integration/deb-lp1274466-cachedb.deb diff --git a/test/integration/framework b/test/integration/framework new file mode 100644 index 0000000..e7b82c2 --- /dev/null +++ b/test/integration/framework @@ -0,0 +1,2156 @@ +#!/bin/sh -- # no runable script, just for vi + +EXIT_CODE=0 + +while [ -n "$1" -a -z "$CHECK_ARGS" ]; do + if [ "$1" = "-q" ]; then + export MSGLEVEL=2 + elif [ "$1" = "-qq" ]; then + export MSGLEVEL=1 + elif [ "$1" = "-v" ]; then + export MSGLEVEL=4 + elif [ "$1" = '--color=no' ]; then + export MSGCOLOR='NO' + elif [ "$1" = '--color=yes' ]; then + export MSGCOLOR='YES' + elif [ "$1" = '--color' ]; then + export MSGCOLOR="$(echo "$2" | tr 'a-z' 'A-Z')" + shift + elif [ "$1" = '--level' ]; then + export MSGLEVEL=$2 + shift + else + echo >&2 "WARNING: Unknown parameter »$1« will be ignored" + fi + shift +done +export MSGLEVEL="${MSGLEVEL:-3}" + +# we all like colorful messages +if [ "${MSGCOLOR:-YES}" = 'YES' ]; then + if [ ! -t 1 ]; then # but check that we output to a terminal + export MSGCOLOR='NO' + fi +fi + +if [ "$MSGCOLOR" != 'NO' ]; then + CERROR="\033[1;31m" # red + CWARNING="\033[1;33m" # yellow + CMSG="\033[1;32m" # green + CINFO="\033[1;96m" # light blue + CDEBUG="\033[1;94m" # blue + CNORMAL="\033[0;39m" # default system console color + CDONE="\033[1;32m" # green + CPASS="\033[1;32m" # green + CFAIL="\033[1;31m" # red + CCMD="\033[1;35m" # pink +fi + +msgprintf() { + local START="$1" + local MIDDLE="$2" + local END="$3" + shift 3 + if [ -n "$1" ]; then + printf "$START " "$1" + shift + while [ -n "$1" ]; do + printf "$MIDDLE " "$(echo "$1" | sed -e 's#^apt\([cfghks]\)#apt-\1#')" + shift + done + fi + printf "${END}" +} +msgdie() { msgprintf "${CERROR}E: %s" '%s' "${CNORMAL}\n" "$@" >&2; exit 1; } +msgwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}\n" "$@" >&2; } +msgmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}\n" "$@"; } +msginfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}\n" "$@"; } +msgdebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}\n" "$@"; } +msgdone() { msgprintf "${CDONE}DONE" '%s' "${CNORMAL}\n" "$@"; } +msgnwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}" "$@" >&2; } +msgnmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}" "$@"; } +msgninfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}" "$@"; } +msgndebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}" "$@"; } +msgtest() { msgprintf "${CINFO}%s" "${CCMD}%s${CINFO}" "…${CNORMAL} " "$@"; } +msgpass() { printf "${CPASS}PASS${CNORMAL}\n"; } +msgreportheader() { + if [ -n "$MSGTEST_MSG" ]; then + test "$1" != 'msgfailoutput' || echo + if [ -n "$MSGTEST_MSGMSG" ]; then + echo "$MSGTEST_MSGMSG" + fi + if [ -n "$MSGTEST_GRP" ] && [ "$MSGTEST_GRP" != 'NEXT' ] && [ "$MSGTEST_GRP" != "$MSGTEST_MSG" ]; then + echo "${CFAIL}Part of the test group: $MSGTEST_GRP" + fi + echo -n "$MSGTEST_MSG" + unset MSGTEST_MSG + fi +} +msgskip() { + msgreportheader 'msgskip' + if [ $# -gt 0 ]; then printf "${CWARNING}SKIP: $*${CNORMAL}\n" >&2; + else printf "${CWARNING}SKIP${CNORMAL}\n" >&2; fi +} +msgfail() { + msgreportheader 'msgfail' + if [ $# -gt 0 ] && [ -n "$1" ]; then printf "${CFAIL}FAIL: $*${CNORMAL}\n" >&2; + else printf "${CFAIL}FAIL${CNORMAL}\n" >&2; fi + if [ -n "$APT_DEBUG_TESTS" ]; then + runapt $SHELL + fi + EXIT_CODE=$((EXIT_CODE+1)); +} +MSGGROUP_LEVEL=0 +msggroup() { + if [ -n "$1" ]; then + if [ $MSGGROUP_LEVEL = 0 ]; then + MSGTEST_GRP='NEXT' + fi + MSGGROUP_LEVEL=$((MSGGROUP_LEVEL+1)); + else + MSGGROUP_LEVEL=$((MSGGROUP_LEVEL-1)); + if [ $MSGGROUP_LEVEL = 0 ]; then + unset MSGTEST_GRP + fi + fi +} + +# enable / disable Debugging +if [ $MSGLEVEL -le 0 ]; then + msgdie() { true; } +fi +if [ $MSGLEVEL -le 1 ]; then + msgwarn() { true; } + msgnwarn() { true; } +fi +if [ $MSGLEVEL -le 2 ]; then + msgmsg() { + MSGTEST_MSGMSG="$(msgprintf "${CMSG}%s" '%s' "${CNORMAL}" "$@")" + } + msgnmsg() { true; } + msgtest() { + MSGTEST_MSG="$(msgprintf "${CINFO}%s" "${CCMD}%s${CINFO}" "…${CNORMAL} " "$@")" + if [ "$MSGTEST_GRP" = 'NEXT' ]; then + MSGTEST_GRP="$MSGTEST_MSG" + fi + } + msgpass() { printf " ${CPASS}P${CNORMAL}"; } +fi +if [ $MSGLEVEL -le 3 ]; then + msginfo() { true; } + msgninfo() { true; } +fi +if [ $MSGLEVEL -le 4 ]; then + msgdebug() { true; } + msgndebug() { true; } +fi +if [ $MSGLEVEL -le 1 ]; then + msgpass() { true; } +fi +msgdone() { + if [ "$1" = "debug" -a $MSGLEVEL -le 4 ] || + [ "$1" = "info" -a $MSGLEVEL -le 3 ] || + [ "$1" = "msg" -a $MSGLEVEL -le 2 ] || + [ "$1" = "warn" -a $MSGLEVEL -le 1 ] || + [ "$1" = "die" -a $MSGLEVEL -le 0 ]; then + true; + else + printf "${CDONE}DONE${CNORMAL}\n"; + fi +} +getaptconfig() { + if [ -f ./aptconfig.conf ]; then + echo "$(readlink -f ./aptconfig.conf)" + elif [ -f ../aptconfig.conf ]; then + echo "$(readlink -f ../aptconfig.conf)" + elif [ -f ../../aptconfig.conf ]; then + echo "$(readlink -f ../../aptconfig.conf)" + elif [ -f "${TMPWORKINGDIRECTORY}/aptconfig.conf" ]; then + echo "$(readlink -f "${TMPWORKINGDIRECTORY}/aptconfig.conf")" + fi +} +runapt() { + msgdebug "Executing: ${CCMD}$*${CDEBUG} " + local CMD="$1" + shift + case "$CMD" in + sh|aptitude|*/*|command) ;; + *) CMD="${BUILDDIRECTORY}/$CMD";; + esac + if [ "$CMD" = 'aptitude' ]; then + MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" command "$CMD" "$@" + else + MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" "$CMD" "$@" + fi +} +runpython3() { runapt command python3 "$@"; } +aptconfig() { runapt apt-config "$@"; } +aptcache() { runapt apt-cache "$@"; } +aptcdrom() { runapt apt-cdrom "$@"; } +aptget() { runapt apt-get "$@"; } +aptftparchive() { runapt "${APTFTPARCHIVEBINDIR}/apt-ftparchive" "$@"; } +aptkey() { runapt apt-key "$@"; } +aptmark() { runapt apt-mark "$@"; } +aptsortpkgs() { runapt apt-sortpkgs "$@"; } +apt() { runapt apt "$@"; } +apthelper() { runapt "${APTHELPERBINDIR}/apt-helper" "$@"; } +aptwebserver() { runapt "${APTTESTHELPERSBINDIR}/aptwebserver" "$@"; } +aptitude() { runapt aptitude "$@"; } +aptextracttemplates() { runapt apt-extracttemplates "$@"; } +aptinternalsolver() { runapt "${APTINTERNALSOLVER}" "$@"; } +aptdumpsolver() { runapt "${APTDUMPSOLVER}" "$@"; } +aptinternalplanner() { runapt "${APTINTERNALPLANNER}" "$@"; } + +dpkg() { + "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" "$@" +} +dpkg_version() { + command perl -MDpkg -E 'say $Dpkg::PROGVERSION' +} +dpkgcheckbuilddeps() { + command dpkg-checkbuilddeps --admindir="${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg" "$@" +} +gdb() { + local CMD + case "$1" in + aptget) CMD="apt-get";; + aptcache) CMD="apt-cache";; + aptcdrom) CMD="apt-cdrom";; + aptconfig) CMD="apt-config";; + aptmark) CMD="apt-mark";; + apthelper) CMD="apt-helper";; + aptftparchive) CMD="apt-ftparchive";; + dpkg) shift; runapt "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/gdb-dpkg" "$@"; return;; + *) CMD="$1";; + esac + shift + if [ "${CMD##*/}" = "$CMD" ]; then + CMD="${BUILDDIRECTORY}/${CMD}" + fi + runapt command gdb --quiet -ex "directory '$SOURCEDIRECTORY'" -ex run "$CMD" --args "$CMD" "$@" +} +lastmodification() { + date -u -d "@$(stat -c '%Y' "${TMPWORKINGDIRECTORY}/$1")" -R +} +releasefiledate() { + grep "^${2:-Date}:" "$1" | cut -d' ' -f 2- +} + +exitwithstatus() { + # error if we about to overflow, but ... + # "255 failures ought to be enough for everybody" + if [ $EXIT_CODE -gt 255 ]; then + msgdie "Total failure count $EXIT_CODE too big" + fi + exit $((EXIT_CODE <= 255 ? EXIT_CODE : 255)); +} + +shellsetedetector() { + local exit_status=$? + if [ "$exit_status" != '0' ]; then + printf >&2 "${CERROR}E: Looks like the testcases ended prematurely with exitcode: ${exit_status}${CNORMAL}\n" + if [ "$EXIT_CODE" = '0' ]; then + EXIT_CODE="$exit_status" + fi + fi +} + +addtrap() { + if [ "$1" = 'prefix' ]; then + CURRENTTRAP="$2 $CURRENTTRAP" + else + CURRENTTRAP="$CURRENTTRAP $1" + fi + trap "shellsetedetector; $CURRENTTRAP exitwithstatus;" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM +} + +escape_shell() { + echo "$@" | sed -e "s#'#'\"'\"'#g" +} + +find_project_binary_dir() { + local TESTDIRECTORY="$(readlink -f "$(dirname $0)")" + if [ -z "$PROJECT_BINARY_DIR" ]; then + PROJECT_BINARY_DIR= + for dir in ${TESTDIRECTORY}/../../ ${TESTDIRECTORY}/../../*; do + test -e "$dir/CMakeCache.txt" || continue + if [ -z "$PROJECT_BINARY_DIR" ] || + [ "$dir/CMakeCache.txt" -nt "$PROJECT_BINARY_DIR/CMakeCache.txt" ]; then + PROJECT_BINARY_DIR="$dir" + fi + done + if [ -z "$PROJECT_BINARY_DIR" ]; then + echo "Cannot find build directory, you might want to set PROJECT_BINARY_DIR" >&2 + exit 1 + fi + export PROJECT_BINARY_DIR + fi +} +setupenvironment() { + # Next check needs a gnu stat, let's figure that out early. + stat=stat + if command -v gnustat >/dev/null 2>&1; then + stat=gnustat + fi + # privilege dropping and testing doesn't work if /tmp isn't world-writeable (as e.g. with libpam-tmpdir) + if [ -n "$TMPDIR" ] && [ "$(id -u)" = '0' ] && [ "$($stat --format '%a' "$TMPDIR")" != '1777' ]; then + unset TMPDIR + fi + TMPWORKINGDIRECTORY="$(mktemp -d)" + addtrap "cd /; rm -rf '$(escape_shell "$TMPWORKINGDIRECTORY")';" + if [ -n "$TMPDIR_ADD" ]; then + TMPWORKINGDIRECTORY="${TMPWORKINGDIRECTORY}/${TMPDIR_ADD}" + mkdir -p "$TMPWORKINGDIRECTORY" + unset TMPDIR_ADD + export TMPDIR="$TMPWORKINGDIRECTORY" + fi + msgninfo "Preparing environment for ${0##*/} in ${TMPWORKINGDIRECTORY}…" + + # Setup coreutils on BSD systems + mkdir "${TMPWORKINGDIRECTORY}/bin" + for prefix in gnu g; do + for command in stat touch sed cp tr sha1sum sha256sum md5sum sha512sum grep date wc chmod head readlink tar expr base64; do + if command -v $prefix$command 2>/dev/null >/dev/null; then + [ -e "${TMPWORKINGDIRECTORY}/bin/$command" ] || ln -sf $(command -v $prefix$command) "${TMPWORKINGDIRECTORY}/bin/$command" + fi + done + done + export PATH="${TMPWORKINGDIRECTORY}/bin/:$PATH" + + + mkdir -m 700 "${TMPWORKINGDIRECTORY}/downloaded" + if [ "$(id -u)" = '0' ]; then + # relax permissions so that running as root with user switching works + umask 022 + chmod 711 "$TMPWORKINGDIRECTORY" + chown _apt:$(id -gn) "${TMPWORKINGDIRECTORY}/downloaded" + fi + + TESTDIRECTORY="$(readlink -f "$(dirname $0)")" + # Find the newest build directory (sets PROJECT_BINARY_DIR) + find_project_binary_dir + # allow overriding the default BUILDDIR location + SOURCEDIRECTORY="${APT_INTEGRATION_TESTS_SOURCE_DIR:-"${TESTDIRECTORY}/../../"}" + BUILDDIRECTORY="${APT_INTEGRATION_TESTS_BUILD_DIR:-"${PROJECT_BINARY_DIR}/cmdline"}" + LIBRARYPATH="${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}/../apt-pkg"}" + METHODSDIR="${APT_INTEGRATION_TESTS_METHODS_DIR:-"${BUILDDIRECTORY}/../methods"}" + APTHELPERBINDIR="${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"}" + APTTESTHELPERSBINDIR="${APT_INTEGRATION_TESTS_HELPERS_BIN_DIR:-"${BUILDDIRECTORY}/../test/interactive-helper"}" + APTFTPARCHIVEBINDIR="${APT_INTEGRATION_TESTS_FTPARCHIVE_BIN_DIR:-"${BUILDDIRECTORY}/../ftparchive"}" + APTINTERNALSOLVER="${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/solvers/apt"}" + APTDUMPSOLVER="${APT_INTEGRATION_TESTS_DUMP_SOLVER:-"${BUILDDIRECTORY}/solvers/dump"}" + APTINTERNALPLANNER="${APT_INTEGRATION_TESTS_INTERNAL_PLANNER:-"${BUILDDIRECTORY}/planners/apt"}" + test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first" + # ----- + + cd "$TMPWORKINGDIRECTORY" + echo "#x-apt-configure-index \"${SOURCEDIRECTORY}/doc/examples/configure-index\";" > aptconfig.conf + mkdir rootdir aptarchive keys + cd rootdir + 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 var/crash 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 + ln -s "${METHODSDIR}" usr/lib/apt/methods + 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 [ -z "${APT_INTEGRATION_TESTS_SOURCE_DIR}" ]; then + ln -s "${SOURCEDIRECTORY}/debian/apt.conf.autoremove" etc/apt/apt.conf.d/01autoremove + else + ln -s /etc/apt/apt.conf.d/01autoremove etc/apt/apt.conf.d/01autoremove + fi + cd .. + local BASENAME="${0##*/}" + local PACKAGESFILE="Packages-${BASENAME#*-}" + if [ -f "${TESTDIRECTORY}/${PACKAGESFILE}" ]; then + cp "${TESTDIRECTORY}/${PACKAGESFILE}" aptarchive/Packages + fi + local SOURCESSFILE="Sources-${BASENAME#*-}" + if [ -f "${TESTDIRECTORY}/${SOURCESSFILE}" ]; then + cp "${TESTDIRECTORY}/${SOURCESSFILE}" aptarchive/Sources + fi + find "$TESTDIRECTORY" \( -name '*.pub' -o -name '*.sec' \) -exec cp '{}' keys/ \; + chmod 644 keys/* + ln -s "${TMPWORKINGDIRECTORY}/keys/joesixpack.pub" rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + + echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf + echo "Dir::Etc \"etc\";" >> aptconfig.conf + echo "Dir::State \"var/lib/apt\";" >> aptconfig.conf + echo "Dir::Cache \"var/cache/apt\";" >> aptconfig.conf + echo "Dir::Etc \"etc/apt\";" >> aptconfig.conf + echo "Dir::Log \"var/log/apt\";" >> 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 + #cp "${BUILDDIRECTORY}/apt-key" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/" + #chmod o+rx "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key" + #echo "Dir::Bin::apt-key \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key\";" >> aptconfig.conf + # destroys coverage reporting though, so we disable changing user for the calling gpgv + echo "Dir::Bin::apt-key \"${BUILDDIRECTORY}/apt-key\";" >> aptconfig.conf + if [ "$(id -u)" = '0' ]; then + echo 'Binary::gpgv::APT::Sandbox::User "root";' >> aptconfig.conf + # same for the solver executables + echo 'APT::Solver::RunAsUser "root";' >> aptconfig.conf + echo 'APT::Planner::RunAsUser "root";' >> aptconfig.conf + fi + + cat > "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" <<EOF +#!/bin/sh +set -e +if [ -r '${TMPWORKINGDIRECTORY}/noopchroot.so' ]; then + if [ -n "\$LD_LIBRARY_PATH" ]; then + export LD_LIBRARY_PATH='${TMPWORKINGDIRECTORY}:'"\${LD_LIBRARY_PATH}" + else + export LD_LIBRARY_PATH='${TMPWORKINGDIRECTORY}' + fi + if [ -n "\$LD_PRELOAD" ]; then + export LD_PRELOAD="noopchroot.so \${LD_PRELOAD}" + else + export LD_PRELOAD="noopchroot.so" + fi +fi +EOF + cp "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/gdb-dpkg" + cat >> "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" <<EOF +exec fakeroot '${DPKG:-dpkg}' --root='${TMPWORKINGDIRECTORY}/rootdir' \\ + --admindir="${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg" \\ + --log='${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log' \\ + --force-not-root --force-bad-path "\$@" +EOF + cat >> "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/gdb-dpkg" <<EOF +exec fakeroot gdb --quiet -ex run '${DPKG:-dpkg}' --args '${DPKG:-dpkg}' --root='${TMPWORKINGDIRECTORY}/rootdir' \\ + --admindir="${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg" \\ + --log='${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log' \\ + --force-not-root --force-bad-path "\$@" +EOF + chmod +x "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/gdb-dpkg" + echo "Dir::Bin::dpkg \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg\";" > rootdir/etc/apt/apt.conf.d/99dpkg + + { + if ! command dpkg --assert-multi-arch >/dev/null 2>&1; then + echo "DPKG::options:: \"--force-architecture\";" # Added to test multiarch before dpkg is ready for it… + fi + echo 'quiet "0";' + echo 'quiet::NoUpdate "true";' + echo 'quiet::NoStatistic "true";' + # too distracting for users, but helpful to detect changes + echo 'Acquire::Progress::Ignore::ShowErrorText "true";' + echo 'Acquire::Progress::Diffpercent "true";' + # in testcases, it can appear as if localhost has a rotation setup, + # hide this as we can't really deal with it properly + echo 'Acquire::Failure::ShowIP "false";' + # randomess and tests don't play well together + echo 'Acquire::IndexTargets::Randomized "false";' + # fakeroot can't fake everything, so disabled in production but good for tests + echo 'APT::Sandbox::Verify "true";' + } >> aptconfig.conf + + cp "${TESTDIRECTORY}/apt.pem" "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem" + if [ "$(id -u)" = '0' ]; then + chown _apt:$(id -gn) "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem" + fi + echo "Acquire::https::CaInfo \"${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem\";" > rootdir/etc/apt/apt.conf.d/99https + echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=no + echo 'Acquire::Connect::AddrConfig "false";' > rootdir/etc/apt/apt.conf.d/connect-addrconfig + # Allow release files to be 10 hours in the future, rather than 10 seconds + echo 'Acquire::Max-FutureTime "'$((10 * 60 * 60))'";' > rootdir/etc/apt/apt.conf.d/future-time + + configcompression '.' 'gz' #'bz2' 'lzma' 'xz' + confighashes 'SHA256' # these are tests, not security best-practices + + # create some files in /tmp and look at user/group to get what this means + TEST_DEFAULT_USER="$(id -un)" + touch "${TMPWORKINGDIRECTORY}/test-file" + TEST_DEFAULT_GROUP=$(stat --format '%G' "${TMPWORKINGDIRECTORY}/test-file") + + # cleanup the environment a bit + # prefer our apt binaries over the system apt binaries + export PATH="${BUILDDIRECTORY}:${PATH}:/usr/local/sbin:/usr/sbin:/sbin" + export LC_ALL=C + unset LANGUAGE COLUMNS NLSPATH + unset APT_CONFIG DPKG_ADMINDIR DPKG_COLORS + unset DEB_CHECK_COMMAND DEB_SIGN_KEYID DEB_BUILD_OPTIONS DEB_BUILD_PROFILES + unset DH_VERBOSE DH_QUIET DH_COMPAT DH_NO_ACT DH_OPTIONS DH_EXTRA_ADDONS + unset GREP_OPTIONS POSIXLY_CORRECT + unset http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy + + # Make dpkg inherit testing path + echo 'DPkg::Path "";\n' >> aptconfig.conf + + # Make gcov shut up + export GCOV_ERROR_FILE=/dev/null + + # If gpgv supports --weak-digest, pass it to make sure we can disable SHA1 + if aptkey verify --weak-digest SHA1 --help 2>/dev/null >/dev/null; then + echo 'Acquire::gpgv::Options { "--weak-digest"; "sha1"; };' > rootdir/etc/apt/apt.conf.d/no-sha1 + fi + + # most tests just need one signed Release file, not both + export APT_DONT_SIGN='Release.gpg' + + if [ -r "${TESTDIRECTORY}/extra-environment" ]; then + . "${TESTDIRECTORY}/extra-environment" + fi + + msgdone "info" +} + +getarchitecture() { + if [ "$1" = "native" -o -z "$1" ]; then + eval `aptconfig shell ARCH APT::Architecture` + if [ -n "$ARCH" ]; then + echo $ARCH + else + dpkg --print-architecture + fi + else + echo $1 + fi +} + +getarchitectures() { + aptconfig dump --no-empty --format '%v%n' APT::Architecture APT::Architectures | sort -u | tr '\n' ' ' +} + +getarchitecturesfromcommalist() { + echo "$1" | sed -e 's#,#\n#g' | sed -e "s/^native\$/$(getarchitecture 'native')/" +} + +configarchitecture() { + { + echo "APT::Architecture \"$(getarchitecture $1)\";" + while [ -n "$1" ]; do + echo "APT::Architectures:: \"$(getarchitecture $1)\";" + shift + done + } >rootdir/etc/apt/apt.conf.d/01multiarch.conf + configdpkg +} + +configdpkg() { + if [ ! -e rootdir/var/lib/dpkg/status ]; then + local BASENAME="${0##*/}" + local STATUSFILE="status-${BASENAME#*-}" + if [ -f "${TESTDIRECTORY}/${STATUSFILE}" ]; then + cp "${TESTDIRECTORY}/${STATUSFILE}" rootdir/var/lib/dpkg/status + # Add an empty line to the end if there is none + if tail -1 rootdir/var/lib/dpkg/status | grep -q .; then + echo >> rootdir/var/lib/dpkg/status + fi + else + echo -n > rootdir/var/lib/dpkg/status + fi + fi + rm -f rootdir/etc/apt/apt.conf.d/00foreigndpkg + # make sure dpkg can detect itself as capable of it + 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 + insertinstalledpackage 'dpkg' "all" '1.16.2+fake' + fi + if dpkg --assert-multi-arch >/dev/null 2>&1 ; then + local ARCHS="$(getarchitectures)" + 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 + fi + done + fi +} + +configdpkgnoopchroot() { + # create a library to noop chroot() and rewrite maintainer script executions + # via execvp() as used by dpkg as we don't want our rootdir to be a fullblown + # chroot directory dpkg could chroot into to execute the maintainer scripts + msgtest 'Building library to preload to make maintainerscript work in' 'dpkg' + cat > noopchroot.c << EOF +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <dlfcn.h> + +static char * chrootdir = NULL; + +int chroot(const char *path) { + printf("WARNING: CHROOTing to %s was ignored!\n", path); + free(chrootdir); + chrootdir = strdup(path); + return 0; +} +int execvp(const char *file, char *const argv[]) { + static int (*func_execvp) (const char *, char * const []) = NULL; + if (func_execvp == NULL) + func_execvp = (int (*) (const char *, char * const [])) dlsym(RTLD_NEXT, "execvp"); + if (chrootdir == NULL || strncmp(file, "/var/lib/dpkg/", strlen("/var/lib/dpkg/")) != 0) + return func_execvp(file, argv); + printf("REWRITE execvp call %s into %s\n", file, chrootdir); + char *newfile; + if (asprintf(&newfile, "%s%s", chrootdir, file) == -1) { + perror("asprintf"); + return -1; + } + char const * const baseadmindir = "/var/lib/dpkg"; + char *admindir; + if (asprintf(&admindir, "%s%s", chrootdir, baseadmindir) == -1) { + perror("asprintf"); + return -1; + } + setenv("DPKG_ADMINDIR", admindir, 1); + return func_execvp(newfile, argv); +} +EOF + if cc -ldl 2>&1 | grep -q dl; then + testempty --nomsg cc -Wall -Wextra -fPIC -shared -o noopchroot.so noopchroot.c + else + testempty --nomsg cc -Wall -Wextra -fPIC -shared -o noopchroot.so noopchroot.c -ldl + fi +} +configcompression() { + if [ "$1" = 'ALL' ]; then + configcompression '.' $(aptconfig dump APT::Compressor --format '%t %v%n' | sed -n 's#^Extension \.\(.*\)$#\1#p') + return + fi + local CMD='apthelper cat-file -C' + while [ -n "$1" ]; do + case "$1" in + '.') printf ".\t.\tcat\n";; + 'gz') printf "gzip\tgz\t$CMD $1\n";; + 'bz2') printf "bzip2\tbz2\t$CMD $1\n";; + 'zst') printf "zstd\tzst\t$CMD $1\n";; + *) printf "$1\t$1\t$CMD $1\n";; + esac + shift + done > "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" +} +confighashes() { + { + echo 'APT::FTPArchive {' + { + while [ -n "$1" ]; do + printf "$1" | tr 'a-z' 'A-Z' + printf "\t\"true\";\n" + shift + done + for h in 'MD5' 'SHA1' 'SHA256' 'SHA512'; do + printf "$h\t\"false\";\n" + done + } | awk '!x[$1]++' + echo '};' + } >> "${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/ftparchive-hashes.conf" +} +forcecompressor() { + COMPRESSOR="$1" + COMPRESS="$1" + COMPRESSOR_CMD="apthelper cat-file -C $1" + case $COMPRESSOR in + gzip) COMPRESS='gz';; + bzip2) COMPRESS='bz2';; + zstd) COMPRESS='zst';; + esac + local CONFFILE="${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/00force-compressor" + echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; }; +Dir::Bin::uncompressed \"/does/not/exist\";" > "$CONFFILE" + for COMP in $(aptconfig dump 'APT::Compressor' --format '%f%n' | cut -d':' -f 5 | uniq); do + if [ -z "$COMP" -o "$COMP" = '.' -o "$COMP" = "$COMPRESSOR" ]; then continue; fi + echo "Dir::Bin::${COMP} \"/does/not/exist\";" >> "$CONFFILE" + echo "APT::Compressor::${COMP}::Name \"${COMP}-disabled\";" >> "$CONFFILE" + done +} + +_setupsimplenativepackage() { + local NAME="$1" + local ARCH="$2" + local VERSION="$3" + local RELEASE="${4:-unstable}" + local DEPENDENCIES="$5" + local DESCRIPTION="${6:-an autogenerated dummy ${NAME}=${VERSION}/${RELEASE} + If you find such a package installed on your system, + something went horribly wrong! They are autogenerated + und used only by testcases and serve no other purpose…}" + + local SECTION="${7:-others}" + local PRIORITY="${8:-optional}" + local FILE_TREE="$9" + local COMPRESS_TYPE="${10:-gzip}" + local DISTSECTION + if [ "$SECTION" = "${SECTION#*/}" ]; then + DISTSECTION="main" + else + DISTSECTION="${SECTION%/*}" + fi + local BUILDDIR="${TMPWORKINGDIRECTORY}/incoming/${NAME}-${VERSION}" + + mkdir -p "$BUILDDIR/debian/source" + echo "* most suckless software product ever" > "${BUILDDIR}/FEATURES" + echo "#!/bin/sh +echo '$NAME says \"Hello!\"'" > "${BUILDDIR}/${NAME}" + + echo "Copyleft by Joe Sixpack $(date -u +%Y)" > "${BUILDDIR}/debian/copyright" + echo "$NAME ($VERSION) $RELEASE; urgency=low + + * Initial release + + -- Joe Sixpack <joe@example.org> $(date -u -R)" > "${BUILDDIR}/debian/changelog" + { + echo "Source: $NAME +Priority: $PRIORITY +Maintainer: Joe Sixpack <joe@example.org> +Standards-Version: 4.3.1 +Rules-Requires-Root: no" + if [ "$SECTION" != '<none>' ]; then + echo "Section: $SECTION" + fi + local BUILDDEPS="$(printf "%b\n" "$DEPENDENCIES" | grep '^Build-')" + test -z "$BUILDDEPS" || echo "$BUILDDEPS" + echo " +Package: $NAME" + + if [ "$ARCH" = 'all' ]; then + echo "Architecture: all" + else + echo "Architecture: any" + fi + local DEPS="$(printf "%b\n" "$DEPENDENCIES" | grep -v '^Build-')" + test -z "$DEPS" || echo "$DEPS" + printf "%b\n" "Description: $DESCRIPTION" + } > "${BUILDDIR}/debian/control" + + echo '3.0 (native)' > "${BUILDDIR}/debian/source/format" +} + +make_tiny_rules() { + local OUT="$1" + if command -v gmake >/dev/null 2>&1; then + [ -e ${TMPWORKINGDIRECTORY}/bin/make ] || ln -s $(command -v gmake) ${TMPWORKINGDIRECTORY}/bin/make + echo "#!${TMPWORKINGDIRECTORY}/bin/make -f" > "$OUT" + else + echo '#!/usr/bin/make -f' > "$OUT" + fi + echo '%:' >> "$OUT" + echo ' dh $@' >> "$OUT" +} + +setupsimplenativepackage() { + _setupsimplenativepackage "$@" + local NAME="$1" + local VERSION="$3" + local BUILDDIR="${TMPWORKINGDIRECTORY}/incoming/${NAME}-${VERSION}" + test -e "${BUILDDIR}/debian/compat" || echo '10' > "${BUILDDIR}/debian/compat" + test -e "${BUILDDIR}/debian/rules" || make_tiny_rules "${BUILDDIR}/debian/rules" +} + +buildsimplenativepackage() { + local NAME="$1" + local ARCH="$2" + local VERSION="$3" + local RELEASE="${4:-unstable}" + local DEPENDENCIES="$5" + local DESCRIPTION="$6" + local SECTION="${7:-others}" + local PRIORITY="${8:-optional}" + local FILE_TREE="$9" + local COMPRESS_TYPE="${10:-gzip}" + local DISTSECTION + if [ "$SECTION" = "${SECTION#*/}" ]; then + DISTSECTION="main" + else + DISTSECTION="${SECTION%/*}" + fi + local BUILDDIR="${TMPWORKINGDIRECTORY}/incoming/${NAME}-${VERSION}" + msgtest "Build source package in version ${VERSION} for ${RELEASE} in ${DISTSECTION}" "$NAME" + _setupsimplenativepackage "$@" + cd "${BUILDDIR}/.." + testsuccess --nomsg dpkg-source -b ${NAME}-${VERSION} + cd - >/dev/null + sed -n 's#^dpkg-source: info: building [^ ]\+ in ##p' "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" \ + | while read SRC; do + echo "pool/${SRC}" >> "${BUILDDIR}/../${RELEASE}.${DISTSECTION}.srclist" +# if expr match "${SRC}" '.*\.dsc' >/dev/null 2>&1; then +# aptkey --keyring ./keys/joesixpack.pub --secret-keyring ./keys/joesixpack.sec --quiet --readonly \ +# adv --yes --default-key 'Joe Sixpack' \ +# --clearsign -o "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC" +# mv "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC" +# fi + done + + for arch in $(getarchitecturesfromcommalist "$ARCH"); do + msgtest "Build binary package for ${RELEASE} in ${SECTION}" "$NAME" + rm -rf "${BUILDDIR}/debian/tmp" + mkdir -p "${BUILDDIR}/debian/tmp/DEBIAN" "${BUILDDIR}/debian/tmp/usr/share/doc/${NAME}" "${BUILDDIR}/debian/tmp/usr/bin" + cp "${BUILDDIR}/debian/copyright" "${BUILDDIR}/debian/changelog" "${BUILDDIR}/FEATURES" "${BUILDDIR}/debian/tmp/usr/share/doc/${NAME}" + cp "${BUILDDIR}/${NAME}" "${BUILDDIR}/debian/tmp/usr/bin/${NAME}-${arch}" + if [ -n "$FILE_TREE" ]; then + cp -ar "$FILE_TREE" "${BUILDDIR}/debian/tmp" + fi + + (cd "${BUILDDIR}"; dpkg-gencontrol -DArchitecture=$arch) + (cd "${BUILDDIR}/debian/tmp"; md5sum $(find usr/ -type f) > DEBIAN/md5sums) + local LOG="${BUILDDIR}/../${NAME}_${VERSION}_${arch}.dpkg-deb.log" + # ensure the right permissions as dpkg-deb insists + chmod 755 "${BUILDDIR}/debian/tmp/DEBIAN" + testsuccess --nomsg dpkg-deb -Z${COMPRESS_TYPE} --build "${BUILDDIR}/debian/tmp" "${BUILDDIR}/.." + echo "pool/${NAME}_${VERSION}_${arch}.deb" >> "${BUILDDIR}/../${RELEASE}.${DISTSECTION}.pkglist" + done + + local NM + if [ "$(echo "$NAME" | cut -c 1-3)" = 'lib' ]; then + NM="$(echo "$NAME" | cut -c 1-4)" + else + NM="$(echo "$NAME" | cut -c 1)" + fi + local CHANGEPATH="${BUILDDIR}/../${DISTSECTION}/${NM}/${NAME}/${NAME}_${VERSION}" + mkdir -p "$CHANGEPATH" + cp "${BUILDDIR}/debian/changelog" "$CHANGEPATH" + rm -rf "${BUILDDIR}" + msgdone "info" +} + +buildpackage() { + local BUILDDIR=$1 + local RELEASE=$2 + local SECTION=$3 + local ARCH=$(getarchitecture $4) + local PKGNAME="$(echo "$BUILDDIR" | grep -o '[^/]*$')" + local BUILDLOG="$(readlink -f "${BUILDDIR}/../${PKGNAME}_${RELEASE}_${SECTION}.dpkg-bp.log")" + msgtest "Build package for ${RELEASE} in ${SECTION}" "$PKGNAME" + cd "$BUILDDIR" + if [ "$ARCH" = "all" ]; then + ARCH="$(dpkg-architecture -qDEB_HOST_ARCH 2> /dev/null)" + fi + testsuccess --nomsg dpkg-buildpackage -uc -us -a$ARCH -d + cp "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" "$BUILDLOG" + local PKGS="$(grep '^dpkg-deb: building package' "$BUILDLOG" | cut -d'/' -f 2 | sed -e "s#'\.##")" + local SRCS="$(grep '^dpkg-source: info: building' "$BUILDLOG" | grep -o '[a-z0-9._+~-]*$')" + cd - > /dev/null + for PKG in $PKGS; do + echo "pool/${PKG}" >> "${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.pkglist" + done + for SRC in $SRCS; do + echo "pool/${SRC}" >> "${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.srclist" + done +} + +buildaptarchive() { + if [ -d incoming ]; then + buildaptarchivefromincoming "$@" + else + buildaptarchivefromfiles "$@" + fi +} + +createaptftparchiveconfig() { + local COMPRESSORS="$(cut -d' ' -f 1 "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" | tr '\n' ' ')" + local COMPRESSORS="${COMPRESSORS%* }" + local ARCHS="$(getarchitectures)" + cat > ftparchive.conf <<EOF +Dir { + ArchiveDir "$(readlink -f .)"; + CacheDir "$(readlink -f ..)"; + FileListDir "$(readlink -f pool/)"; +}; +Default { + Packages::Compress "$COMPRESSORS"; + Sources::Compress "$COMPRESSORS"; + Contents::Compress "$COMPRESSORS"; + Translation::Compress "$COMPRESSORS"; + LongDescription "false"; +}; +TreeDefault { + Directory "pool/"; + SrcDirectory "pool/"; +}; +EOF + for DIST in $(find ./pool/ -maxdepth 1 -name '*.pkglist' -type f | cut -d'/' -f 3 | cut -d'.' -f 1 | sort | uniq); do + cat <<EOF +tree "dists/$DIST" { + Architectures "$ARCHS all source"; + FileList "${DIST}.\$(SECTION).pkglist"; + SourceFileList "${DIST}.\$(SECTION).srclist"; + Sections "$(find ./pool/ -maxdepth 1 -name "${DIST}.*.pkglist" -type f | cut -d'/' -f 3 | cut -d'.' -f 2 | sort | uniq | tr '\n' ' ')"; +}; +EOF + done >> ftparchive.conf +} + +buildaptftparchivedirectorystructure() { + local DISTS="$(grep -i '^tree ' ftparchive.conf | cut -d'/' -f 2 | sed -e 's#".*##')" + for DIST in $DISTS; do + local SECTIONS="$(grep -i -A 5 "dists/$DIST" ftparchive.conf | grep -i 'Sections' | cut -d'"' -f 2)" + for SECTION in $SECTIONS; do + local ARCHS="$(grep -A 5 "dists/$DIST" ftparchive.conf | grep Architectures | cut -d'"' -f 2 | sed -e 's#source##')" + for ARCH in $ARCHS; do + mkdir -p "dists/${DIST}/${SECTION}/binary-${ARCH}" + done + mkdir -p "dists/${DIST}/${SECTION}/source" + mkdir -p "dists/${DIST}/${SECTION}/i18n" + done + done +} + +insertpackage() { + local RELEASES="$1" + local NAME="$2" + local ARCH="$3" + local VERSION="$4" + local DEPENDENCIES="$5" + local PRIORITY="${6:-optional}" + local DESCRIPTION="${7:-an autogenerated dummy ${NAME}=${VERSION}/${RELEASES} + If you find such a package installed on your system, + something went horribly wrong! They are autogenerated + und used only by testcases and serve no other purpose…}" + local SECTION="${8:-other}" + + if [ "$SECTION" = "${SECTION#*/}" ]; then + DISTSECTION="main" + else + DISTSECTION="${SECTION%/*}" + fi + local ARCHS="" + for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do + if [ "$RELEASE" = 'installed' ]; then + insertinstalledpackage "$2" "$3" "$4" "$5" "$6" "$7" "$8" + continue + fi + for arch in $(getarchitecturesfromcommalist "$ARCH"); do + if [ "$arch" = 'none' ]; then + ARCHS="$(getarchitectures)" + else + ARCHS="$arch" + fi + for BUILDARCH in $ARCHS; do + local PPATH="aptarchive/dists/${RELEASE}/${DISTSECTION}/binary-${BUILDARCH}" + mkdir -p "$PPATH" + { + echo "Package: $NAME +Priority: $PRIORITY +Section: $SECTION +Installed-Size: 42 +Maintainer: Joe Sixpack <joe@example.org>" + test "$arch" = 'none' || echo "Architecture: $arch" + echo "Version: $VERSION +Filename: pool/${DISTSECTION}/${NAME}/${NAME}_${VERSION}_${arch}.deb" + test -z "$DEPENDENCIES" || printf "%b\n" "$DEPENDENCIES" + echo "Description: $(printf '%s' "$DESCRIPTION" | head -n 1)" + echo "Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)" + echo "SHA256: 0000000000000000000000000000000000000000000000000000000000000000" + echo + } >> "${PPATH}/Packages" + done + done + mkdir -p "aptarchive/dists/${RELEASE}/${DISTSECTION}/source" "aptarchive/dists/${RELEASE}/${DISTSECTION}/i18n" + touch "aptarchive/dists/${RELEASE}/${DISTSECTION}/source/Sources" + echo "Package: $NAME +Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1) +Description-en: $DESCRIPTION +" >> "aptarchive/dists/${RELEASE}/${DISTSECTION}/i18n/Translation-en" + done +} + +insertsource() { + local RELEASES="$1" + local NAME="$2" + local ARCH="$3" + local VERSION="$4" + local DEPENDENCIES="$5" + local BINARY="${6:-$NAME}" + local ARCHS="" + for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do + local SPATH="aptarchive/dists/${RELEASE}/main/source" + mkdir -p $SPATH + local FILE="${SPATH}/Sources" + local DSCFILE="${NAME}_${VERSION}.dsc" + local TARFILE="${NAME}_${VERSION}.tar.gz" + echo "Package: $NAME +Binary: $BINARY +Version: $VERSION +Maintainer: Joe Sixpack <joe@example.org> +Architecture: $ARCH" >> $FILE + test -z "$DEPENDENCIES" || printf "%b\n" "$DEPENDENCIES" >> "$FILE" + echo "Files: + $(echo -n "$DSCFILE" | md5sum | cut -d' ' -f 1) $(echo -n "$DSCFILE" | wc -c) "$DSCFILE" + $(echo -n "$TARFILE" | md5sum | cut -d' ' -f 1) $(echo -n "$TARFILE" | wc -c) "$TARFILE" +Checksums-Sha256: + $(echo -n "$DSCFILE" | sha256sum | cut -d' ' -f 1) $(echo -n "$DSCFILE" | wc -c) "$DSCFILE" + $(echo -n "$TARFILE" | sha256sum | cut -d' ' -f 1) $(echo -n "$TARFILE" | wc -c) "$TARFILE" +" >> "$FILE" + done +} + +insertinstalledpackage() { + local NAME="$1" + local ARCH="$2" + local VERSION="$3" + local DEPENDENCIES="$4" + local PRIORITY="${5:-optional}" + local STATUS="${6:-install ok installed}" + local DESCRIPTION="${7:-an autogenerated dummy ${NAME}=${VERSION}/installed + If you find such a package installed on your system, + something went horribly wrong! They are autogenerated + und used only by testcases and serve no other purpose…}" + local SECTION="${8:-other}" + + local FILE='rootdir/var/lib/dpkg/status' + local INFO='rootdir/var/lib/dpkg/info' + for arch in $(getarchitecturesfromcommalist "$ARCH"); do + echo "Package: $NAME +Status: $STATUS +Priority: $PRIORITY +Section: $SECTION +Installed-Size: 42 +Maintainer: Joe Sixpack <joe@example.org> +Version: $VERSION" >> "$FILE" + test "$arch" = 'none' || echo "Architecture: $arch" >> "$FILE" + test -z "$DEPENDENCIES" || printf "%b\n" "$DEPENDENCIES" >> "$FILE" + printf "%b\n" "Description: $DESCRIPTION" >> "$FILE" + echo >> "$FILE" + if [ "$(dpkg-query -W --showformat='${Multi-Arch}')" = 'same' ]; then + echo -n > "${INFO}/${NAME}:${arch}.list" + else + echo -n > "${INFO}/${NAME}.list" + fi + done +} + + +buildaptarchivefromincoming() { + msginfo "Build APT archive for ${CCMD}${0##*/}${CINFO} based on incoming packages…" + cd aptarchive + [ -e pool ] || ln -s ../incoming pool + [ -e ftparchive.conf ] || createaptftparchiveconfig + [ -e dists ] || buildaptftparchivedirectorystructure + msgninfo "\tGenerate Packages, Sources and Contents files… " + testsuccess aptftparchive generate ftparchive.conf + cd - > /dev/null + msgdone "info" + generatereleasefiles "$@" +} + +buildaptarchivefromfiles() { + msginfo "Build APT archive for ${CCMD}${0##*/}${CINFO} based on prebuild files…" + local DIR='aptarchive' + if [ -d "${DIR}/dists" ]; then DIR="${DIR}/dists"; fi + find "$DIR" -name 'Packages' -o -name 'Sources' -o -name 'Translation-*' | while read line; do + msgninfo "\t${line} file… " + compressfile "$line" "$1" + msgdone "info" + done + generatereleasefiles "$@" +} + +compressfile() { + while read compressor extension command; do + if [ "$compressor" = '.' ]; then + if [ -n "$2" ]; then + touch -d "$2" "$1" + fi + continue + fi + cat "$1" | $command > "${1}.${extension}" + if [ -n "$2" ]; then + touch -d "$2" "${1}.${extension}" + fi + done < "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" +} + +# can be overridden by testcases for their pleasure +getcodenamefromsuite() { + case "$1" in + unstable) echo 'sid';; + *) echo -n "$1";; + esac +} +getreleaseversionfromsuite() { true; } +getlabelfromsuite() { true; } +getoriginfromsuite() { true; } +getarchitecturesfromreleasefile() { echo "all $(getarchitectures)"; } +getnotautomaticfromsuite() { + case "$1" in + experimental|experimental2) echo "yes";; + esac +} +getbutautomaticupgradesfromsuite() { true; } + +aptftparchiverelease() { + aptftparchive -qq release "$@" | sed -e '/0 Release$/ d' # remove the self reference +} +generatereleasefiles() { + # $1 is the Date header and $2 is the ValidUntil header to be set + # both should be given in notation date/touch can understand + local DATE="$1" + local VALIDUNTIL="$2" + if [ -e aptarchive/dists ]; then + msgninfo "\tGenerate Release files for dists… " + for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do + local ARCHITECTURES="$(getarchitecturesfromreleasefile "$dir")" + local SUITE="$(echo "$dir" | cut -d'/' -f 4)" + local CODENAME="$(getcodenamefromsuite $SUITE)" + local VERSION="$(getreleaseversionfromsuite $SUITE)" + local LABEL="$(getlabelfromsuite $SUITE)" + local ORIGIN="$(getoriginfromsuite $SUITE)" + local NOTAUTOMATIC="$(getnotautomaticfromsuite $SUITE)" + local BUTAUTOMATICUPGRADES="$(getbutautomaticupgradesfromsuite $SUITE)" + aptftparchiverelease "$dir" \ + -o APT::FTPArchive::Release::Suite="${SUITE}" \ + -o APT::FTPArchive::Release::Codename="${CODENAME}" \ + -o APT::FTPArchive::Release::Architectures="${ARCHITECTURES}" \ + -o APT::FTPArchive::Release::Label="${LABEL}" \ + -o APT::FTPArchive::Release::Origin="${ORIGIN}" \ + -o APT::FTPArchive::Release::Version="${VERSION}" \ + -o APT::FTPArchive::Release::NotAutomatic="${NOTAUTOMATIC}" \ + -o APT::FTPArchive::Release::ButAutomaticUpgrades="${BUTAUTOMATICUPGRADES}" \ + > "$dir/Release" + done + else + msgninfo "\tGenerate Release files for flat… " + aptftparchiverelease ./aptarchive > aptarchive/Release + fi + if [ -n "$DATE" -a "$DATE" != "now" ]; then + for release in $(find ./aptarchive -name 'Release'); do + sed -i "s/^Date: .*$/Date: $(date -u -d "$DATE" -R)/" "$release" + touch -d "$DATE" "$release" + done + fi + if [ -n "$VALIDUNTIL" ]; then + sed -i "/^Date: / a\ +Valid-Until: $(date -u -d "$VALIDUNTIL" -R)" $(find ./aptarchive -name 'Release') + fi + msgdone "info" +} + +setupdistsaptarchive() { + local APTARCHIVE="$(readlink -f ./aptarchive | sed 's# #%20#g')" + rm -f root/etc/apt/sources.list.d/apt-test-*-deb.list + rm -f root/etc/apt/sources.list.d/apt-test-*-deb-src.list + for DISTS in $(find ./aptarchive/dists/ -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 4); do + SECTIONS=$(find "./aptarchive/dists/${DISTS}/" -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 5 | tr '\n' ' ') + msgninfo "\tadd deb and deb-src sources.list lines for ${CCMD}${DISTS} ${SECTIONS}${CINFO}… " + echo "deb file://$APTARCHIVE $DISTS $SECTIONS" > "rootdir/etc/apt/sources.list.d/apt-test-${DISTS}-deb.list" + echo "deb-src file://$APTARCHIVE $DISTS $SECTIONS" > "rootdir/etc/apt/sources.list.d/apt-test-${DISTS}-deb-src.list" + msgdone "info" + done +} + +setupflataptarchive() { + local APTARCHIVE="$(readlink -f ./aptarchive)" + local APTARCHIVEURI="$(readlink -f ./aptarchive | sed 's# #%20#g')" + if [ -f "${APTARCHIVE}/Packages" ]; then + msgninfo "\tadd deb sources.list line… " + echo "deb file://$APTARCHIVEURI /" > '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://$APTARCHIVEURI /" > '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 +} + +setupaptarchive() { + local NOUPDATE=0 + if [ "$1" = '--no-update' ]; then + NOUPDATE=1 + shift + fi + buildaptarchive "$@" + if [ -e aptarchive/dists ]; then + setupdistsaptarchive + else + setupflataptarchive + fi + signreleasefiles 'Joe Sixpack' + if [ "1" != "$NOUPDATE" ]; then + testsuccess aptget update -o Debug::pkgAcquire::Worker=true -o Debug::Acquire::gpgv=true + fi +} + +killgpgagent() { + if [ -z "${TMPWORKINGDIRECTORY}" ]; then return; fi + local GPGHOME="${TMPWORKINGDIRECTORY}/signinghome" + if [ ! -e "${GPGHOME}" ]; then return; fi + # ensure the agent dies quickly as different versions have different suicide heuristics + GNUPGHOME="${GPGHOME}" gpgconf --kill gpg-agent >/dev/null 2>&1 || true + rm -rf "$GPGHOME" +} +dosigning() { + local KEY="$1" + shift + local GPGHOME="${TMPWORKINGDIRECTORY}/signinghome" + if [ -n "$APT_TEST_SIGNINGHOME" ]; then + GPGHOME="$APT_TEST_SIGNINGHOME" + else + if [ ! -e "$GPGHOME" ]; then + mkdir -p --mode=700 "${GPGHOME}" + addtrap 'prefix' 'killgpgagent;' + fi + fi + testsuccess aptkey --quiet --keyring ${KEY}.pub --secret-keyring ${KEY}.sec --readonly \ + --homedir "${GPGHOME}" adv --batch --yes --digest-algo "${APT_TESTS_DIGEST_ALGO:-SHA512}" \ + "$@" +} +signreleasefiles() { + local SIGNERS="${1:-Joe Sixpack}" + local REPODIR="${2:-aptarchive}" + if [ -n "$1" ]; then shift; fi + if [ -n "$1" ]; then shift; fi + local KEY="keys/$(echo "$SIGNERS" | tr 'A-Z' 'a-z' | tr -d ' ,')" + msgninfo "\tSign archive with $SIGNERS key $KEY… " + local REXKEY='keys/rexexpired' + local SECEXPIREBAK="${REXKEY}.sec.bak" + local PUBEXPIREBAK="${REXKEY}.pub.bak" + local SIGUSERS="" + while [ -n "${SIGNERS%%,*}" ]; do + local SIGNER="${SIGNERS%%,*}" + if [ "${SIGNERS}" = "${SIGNER}" ]; then + SIGNERS="" + fi + SIGNERS="${SIGNERS#*,}" + # FIXME: This should be the full name, but we can't encode the space properly currently + SIGUSERS="${SIGUSERS} -u ${SIGNER#* }" + if [ "${SIGNER}" = 'Rex Expired' ]; then + # the key is expired, so gpg doesn't allow one to sign with and the --faked-system-time + # option doesn't exist anymore (and using faketime would add a new obscure dependency) + # therefore we 'temporary' make the key not expired and restore a backup after signing + cp "${REXKEY}.sec" "$SECEXPIREBAK" + cp "${REXKEY}.pub" "$PUBEXPIREBAK" + local SECUNEXPIRED="${REXKEY}.sec.unexpired" + local PUBUNEXPIRED="${REXKEY}.pub.unexpired" + if [ -f "$SECUNEXPIRED" ] && [ -f "$PUBUNEXPIRED" ]; then + cp "$SECUNEXPIRED" "${REXKEY}.sec" + cp "$PUBUNEXPIRED" "${REXKEY}.pub" + else + if ! printf "expire\n1w\nsave\n" | aptkey --quiet --keyring "${REXKEY}.pub" --secret-keyring "${REXKEY}.sec" \ + --readonly adv --batch --yes --digest-algo "${APT_TESTS_DIGEST_ALGO:-SHA512}" \ + --default-key "$SIGNER" --command-fd 0 --edit-key "${SIGNER}" >setexpire.gpg 2>&1; then + cat setexpire.gpg + exit 1 + fi + cp "${REXKEY}.sec" "$SECUNEXPIRED" + cp "${REXKEY}.pub" "$PUBUNEXPIRED" + fi + fi + if [ ! -e "${KEY}.pub" ]; then + local K="keys/$(echo "$SIGNER" | tr 'A-Z' 'a-z' | tr -d ' ,')" + cat "${K}.pub" >> "${KEY}.new.pub" + cat "${K}.sec" >> "${KEY}.new.sec" + fi + done + if [ ! -e "${KEY}.pub" ]; then + mv "${KEY}.new.pub" "${KEY}.pub" + mv "${KEY}.new.sec" "${KEY}.sec" + fi + for RELEASE in $(find "${REPODIR}/" -name Release); do + # we might have set a specific date for the Release file, so copy it + local DATE="$(stat --format "%y" "${RELEASE}")" + if [ "$APT_DONT_SIGN" = 'Release.gpg' ]; then + rm -f "${RELEASE}.gpg" + else + dosigning "$KEY" "$@" $SIGUSERS --armor --detach-sign --sign --output "${RELEASE}.gpg" "${RELEASE}" + touch -d "$DATE" "${RELEASE}.gpg" + fi + local INRELEASE="${RELEASE%/*}/InRelease" + if [ "$APT_DONT_SIGN" = 'InRelease' ]; then + rm -f "$INRELEASE" + else + dosigning "$KEY" "$@" $SIGUSERS --clearsign --output "$INRELEASE" "$RELEASE" + touch -d "$DATE" "${INRELEASE}" + fi + done + if [ -f "$SECEXPIREBAK" ] && [ -f "$PUBEXPIREBAK" ]; then + mv -f "$SECEXPIREBAK" "${REXKEY}.sec" + mv -f "$PUBEXPIREBAK" "${REXKEY}.pub" + fi + msgdone 'info' +} + +redatereleasefiles() { + local DATE="$(date -u -d "$1" -R)" + for release in $(find aptarchive/ -name 'Release'); do + sed -i "s/^Date: .*$/Date: ${DATE}/" "$release" + touch -d "$DATE" "$release" + done + signreleasefiles "${2:-Joe Sixpack}" +} + +webserverconfig() { + local WEBSERVER="${3:-http://localhost:${APTHTTPPORT}}" + local NOCHECK=false + if [ "$1" = '--no-check' ]; then + NOCHECK=true + shift + fi + local DOWNLOG="${TMPWORKINGDIRECTORY}/rootdir/tmp/download-testfile.log" + local STATUS="${TMPWORKINGDIRECTORY}/downloaded/webserverconfig.status" + rm -f "$STATUS" "$DOWNLOG" + # very very basic URI encoding + local URI + if [ -n "$2" ]; then + msgtest "Set webserver config option '${1}' to" "$2" + URI="${WEBSERVER}/_config/set/$(echo "${1}" | sed -e 's/\//%2f/g')/$(echo "${2}" | sed -e 's/\//%2f/g')" + else + msgtest 'Clear webserver config option' "${1}" + URI="${WEBSERVER}/_config/clear/$(echo "${1}" | sed -e 's/\//%2f/g')" + fi + if downloadfile "$URI" "$STATUS" > "$DOWNLOG"; then + msgpass + else + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/webserverconfig.output" + cat "$DOWNLOG" "$STATUS" >"$OUTPUT" 2>&1 || true + msgfailoutput '' "$OUTPUT" + fi + $NOCHECK || testwebserverlaststatuscode '200' +} + +rewritesourceslist() { + local APTARCHIVE="file://$(readlink -f "${TMPWORKINGDIRECTORY}/aptarchive" | sed 's# #%20#g')" + local APTARCHIVE2="copy://$(readlink -f "${TMPWORKINGDIRECTORY}/aptarchive" | sed 's# #%20#g')" + for LIST in $(find "${TMPWORKINGDIRECTORY}/rootdir/etc/apt/sources.list.d/" -name 'apt-test-*.list'); do + sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#$APTARCHIVE2#${1}#" \ + -e "s#http://[^@]*@\?localhost:${APTHTTPPORT}/\?#${1}#" \ + -e "s#https://[^@]*@\?localhost:${APTHTTPSPORT}/\?#${1}#" + done +} + +# wait for up to 10s for a pid file to appear to avoid possible race +# when a helper is started and doesn't write the PID quick enough +waitforpidfile() { + local PIDFILE="$1" + for i in $(seq 10); do + if test -s "$PIDFILE"; then + return 0 + fi + sleep 1 + done + msgdie "waiting for $PIDFILE failed" + return 1 +} + +changetowebserver() { + local REWRITE='no' + if [ "$1" != '--no-rewrite' ]; then + REWRITE='yes' + else + shift + fi + if test -x "${APTTESTHELPERSBINDIR}/aptwebserver"; then + cd aptarchive + local LOG="webserver.log" + if ! aptwebserver --port 0 -o aptwebserver::fork=1 -o aptwebserver::portfile='aptwebserver.port' -o aptwebserver::logfiles="$(readlink -f .)/$LOG" "$@" >$LOG 2>&1 ; then + cat "$LOG" + false + fi + waitforpidfile aptwebserver.pid + local PID="$(cat aptwebserver.pid)" + if [ -z "$PID" ]; then + msgdie 'Could not fork aptwebserver successfully' + fi + addtrap "kill $PID;" + waitforpidfile aptwebserver.port + APTHTTPPORT="$(cat aptwebserver.port)" + if [ -z "$APTHTTPPORT" ]; then + msgdie 'Could not get port for aptwebserver successfully' + fi + cd - > /dev/null + else + msgdie 'You have to build apt from source to have test/interactive-helper/aptwebserver available for tests requiring a webserver' + fi + if [ "$REWRTE" != 'yes' ]; then + rewritesourceslist "http://localhost:${APTHTTPPORT}/" + fi +} + +changetohttpswebserver() { + local stunnel4 + if command -v stunnel4 >/dev/null 2>&1; then + stunnel4=stunnel4 + elif command -v stunnel >/dev/null 2>&1; then + stunnel4=stunnel + else + msgdie 'You need to install stunnel4 for https testcases' + fi + if [ ! -e "${TMPWORKINGDIRECTORY}/aptarchive/aptwebserver.pid" ]; then + changetowebserver --no-rewrite "$@" + fi + echo "pid = ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid +cert = ${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem +output = /dev/null + +[https] +accept = 127.0.0.1:0 +connect = $APTHTTPPORT +" > "${TMPWORKINGDIRECTORY}/stunnel.conf" + $stunnel4 "${TMPWORKINGDIRECTORY}/stunnel.conf" + waitforpidfile "${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid" + local PID="$(cat "${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid")" + if [ -z "$PID" ]; then + msgdie 'Could not fork $stunnel4 successfully' + fi + addtrap 'prefix' "kill ${PID};" + APTHTTPSPORT="$(lsof -i -n | awk "/^$stunnel4 / && \$2 == \"${PID}\" {print \$9; exit; }" | cut -d':' -f 2)" + webserverconfig 'aptwebserver::port::https' "$APTHTTPSPORT" "https://localhost:${APTHTTPSPORT}" + rewritesourceslist "https://localhost:${APTHTTPSPORT}/" +} + +changetocdrom() { + mkdir -p rootdir/media/cdrom/.disk + local CD="$(readlink -f rootdir/media/cdrom)" + cat > rootdir/etc/apt/apt.conf.d/00cdrom <<EOF +acquire::cdrom::mount "${CD}"; +acquire::cdrom::"${CD}/"::mount "mv ${CD}-unmounted ${CD}"; +acquire::cdrom::"${CD}/"::umount "mv ${CD} ${CD}-unmounted"; +acquire::cdrom::autodetect 0; +EOF + echo -n "$1" > "${CD}/.disk/info" + if [ ! -d aptarchive/dists ]; then + msgdie 'Flat file archive cdroms can not be created currently' + return 1 + fi + mv aptarchive/dists "$CD" + ln -s "$(readlink -f ./incoming)" "$CD/pool" + find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list' -delete + # start with an unmounted disk + mv "${CD}" "${CD}-unmounted" + # we don't want the disk to be modifiable + addtrap 'prefix' "chmod -f -R +w '$(escape_shell "$PWD/rootdir/media/cdrom/dists/")' '$(escape_shell "$PWD/rootdir/media/cdrom-unmounted/dists/")' || true;" + chmod -R 555 rootdir/media/cdrom-unmounted/dists +} + +downloadfile() { + local PROTO="${1%%:*}" + if ! apthelper -o Debug::Acquire::${PROTO}=1 -o Debug::pkgAcquire::Worker=1 \ + download-file "$1" "$2" "$3" 2>&1 ; then + return 1 + fi + # only if the file exists the download was successful + if [ -r "$2" ]; then + return 0 + else + return 1 + fi +} + +cleanup_output() { + cat "$1" | sed \ + -e '/gpgv: WARNING: This key is not suitable for signing in --compliance=gnupg mode/ d' \ + -e '/^profiling:/ d' \ + | sed -e '/\.\.\.profiling:/ {N;s#\.\.\.profiling:.*\n#...#g}' \ + >"$2" +} + +checkdiff() { + local TMPFILE1="${TMPWORKINGDIRECTORY}/rootdir/tmp/checkdiff.1.tmp" + local TMPFILE2="${TMPWORKINGDIRECTORY}/rootdir/tmp/checkdiff.2.tmp" + touch "$TMPFILE1" "$TMPFILE2" + + cleanup_output "$1" "$TMPFILE1" + cleanup_output "$2" "$TMPFILE2" + + local DIFFTEXT="$(command diff -u "$TMPFILE1" "$TMPFILE2" 2>&1 | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')" + if [ -n "$DIFFTEXT" ]; then + echo >&2 + echo >&2 "$DIFFTEXT" + return 1 + else + return 0 + fi +} + +testoutputequal() { + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testoutputequal.output" + local COMPAREFILE="$1" + shift + if "$@" 2>&1 | checkdiff "$COMPAREFILE" - >"$OUTPUT" 2>&1; then + msgpass + else + echo "=== content of file we compared with (${COMPAREFILE}) ===" >>"${OUTPUT}" + cat "$COMPAREFILE" >>"${OUTPUT}" + msgfailoutput '' "$OUTPUT" "$@" + fi +} + +testfileequal() { + msggroup 'testfileequal' + local MSG='Test for correctness of file' + if [ "$1" = '--nomsg' ]; then + MSG='' + shift + fi + local FILE="$1" + shift + if [ -n "$MSG" ]; then + msgtest "$MSG" "$FILE" + fi + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfileequal.output" + if [ -z "$*" ]; then + testoutputequal "$FILE" echo -n '' + else + testoutputequal "$FILE" echo "$*" + fi + msggroup +} + +testempty() { + msggroup 'testempty' + if [ "$1" = '--nomsg' ]; then + shift + else + msgtest "Test for no output of" "$*" + fi + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile" + if "$@" >"$COMPAREFILE" 2>&1 && test ! -s "$COMPAREFILE"; then + msgpass + else + msgfailoutput '' "$COMPAREFILE" "$@" + fi + aptautotest 'testempty' "$@" + msggroup +} +testwarningempty() { + testwarning "$@" + testfailure grep -v '^W:' "${ROOTDIR}/tmp/testwarning.output" +} +testnotempty() { + msggroup 'testnotempty' + msgtest "Test for some output of" "$*" + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testnotempty.comparefile" + if ("$@" >"$COMPAREFILE" 2>&1 || true) && test -s "$COMPAREFILE"; then + msgpass + else + msgfailoutput '' "$COMPAREFILE" "$@" + fi + aptautotest 'testnotempty' "$@" + msggroup +} + +testequal() { + msggroup 'testequal' + local MSG='Test of equality of' + if [ "$1" = '--nomsg' ]; then + MSG='' + shift + fi + + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequal.comparefile" + echo "$1" > "$COMPAREFILE" + shift + + if [ -n "$MSG" ]; then + msgtest "$MSG" "$*" + fi + testoutputequal "$COMPAREFILE" "$@" + aptautotest 'testequal' "$@" + msggroup +} + +testequalor2() { + msggroup 'testequalor2' + local COMPAREFILE1="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile1" + local COMPAREFILE2="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile2" + local COMPAREAGAINST="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.compareagainst" + echo "$1" > "$COMPAREFILE1" + echo "$2" > "$COMPAREFILE2" + shift 2 + msgtest "Test for equality OR of" "$*" + "$@" >"$COMPAREAGAINST" 2>&1 || true + if checkdiff "$COMPAREFILE1" "$COMPAREAGAINST" >/dev/null 2>&1 || \ + checkdiff "$COMPAREFILE2" "$COMPAREAGAINST" >/dev/null 2>&1 + then + msgpass + else + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequal.output" + echo -n "\n${CINFO}Diff against OR 1${CNORMAL}" >"$OUTPUT" 2>&1 + checkdiff "$COMPAREFILE1" "$COMPAREAGAINST" >"$OUTPUT" 2>&1 || true + echo -n "${CINFO}Diff against OR 2${CNORMAL}" >"$OUTPUT" 2>&1 + checkdiff "$COMPAREFILE2" "$COMPAREAGAINST" >"$OUTPUT" 2>&1 || true + msgfailoutput '' "$OUTPUT" + fi + aptautotest 'testequalor2' "$@" + msggroup +} + +testshowvirtual() { + msggroup 'testshowvirtual' + local VIRTUAL="N: Can't select versions from package '$1' as it is purely virtual" + local PACKAGE="$1" + shift + while [ -n "$1" ]; do + VIRTUAL="${VIRTUAL} +N: Can't select versions from package '$1' as it is purely virtual" + PACKAGE="${PACKAGE} $1" + shift + done + msgtest "Test for virtual packages" "apt-cache show $PACKAGE" + VIRTUAL="${VIRTUAL} +N: No packages found" + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testshowvirtual.comparefile" + local ARCH="$(getarchitecture 'native')" + echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' >"$COMPAREFILE" + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testshowvirtual.output" + testoutputequal "$COMPAREFILE" aptcache show "$PACKAGE" + msggroup +} + +testnopackage() { + msggroup 'testnopackage' + msgtest "Test for non-existent packages" "apt-cache show $*" + local SHOWPKG="$(aptcache show "$@" 2>&1 | grep '^Package: ')" + if [ -n "$SHOWPKG" ]; then + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testnopackage.output" + echo "$SHOWPKG" >"$OUTPUT" + msgfailoutput '' "$OUTPUT" + else + msgpass + fi + msggroup +} +testnosrcpackage() { + msggroup 'testnosrcpackage' + msgtest "Test for non-existent source packages" "apt-cache showsrc $*" + local SHOWPKG="$(aptcache showsrc "$@" 2>&1 | grep '^Package: ')" + if [ -n "$SHOWPKG" ]; then + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testnosrcpackage.output" + echo "$SHOWPKG" >"$OUTPUT" + msgfailoutput '' "$OUTPUT" + else + msgpass + fi + msggroup +} + +testdpkgstatus() { + msggroup 'testdpkgstatus' + local STATE="$1" + local NR="$2" + shift 2 + msgtest "Test that $NR package(s) are in state $STATE with" "dpkg -l $*" + local PKGS="$(dpkg -l "$@" 2>/dev/null | grep "^${STATE}" | wc -l)" + if [ "$PKGS" != $NR ]; then + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testnopackage.output" + echo "$PKGS" >"$OUTPUT" + dpkg -l "$@" | grep '^[a-z]' >"$OUTPUT" >&2 || true + msgfailoutput '' "$OUTPUT" + else + msgpass + fi + msggroup +} + +testdpkginstalled() { + msggroup 'testdpkginstalled' + testdpkgstatus 'ii' "$#" "$@" + msggroup +} + +testdpkgnotinstalled() { + msggroup 'testdpkgnotinstalled' + testdpkgstatus 'ii' '0' "$@" + msggroup +} + +testmarkedauto() { + msggroup 'testmarkedauto' + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testmarkedauto.comparefile" + if [ -n "$1" ]; then + msgtest 'Test for correctly marked as auto-installed' "$*" + while [ -n "$1" ]; do echo "$1"; shift; done | sort > "$COMPAREFILE" + else + msgtest 'Test for correctly marked as auto-installed' 'no package' + echo -n > "$COMPAREFILE" + fi + testoutputequal "$COMPAREFILE" aptmark showauto + msggroup +} +testmarkedmanual() { + msggroup 'testmarkedmanual' + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testmarkedmanual.comparefile" + if [ -n "$1" ]; then + msgtest 'Test for correctly marked as manually installed' "$*" + while [ -n "$1" ]; do echo "$1"; shift; done | sort > "$COMPAREFILE" + else + msgtest 'Test for correctly marked as manually installed' 'no package' + echo -n > "$COMPAREFILE" + fi + testoutputequal "$COMPAREFILE" aptmark showmanual + msggroup +} + +catfile() { + if [ "${1##*.}" = 'deb' ]; then + stat >&2 "$1" || true + file >&2 "$1" || true + else + cat >&2 "$1" || true + fi +} +msgfailoutput() { + msgreportheader 'msgfailoutput' + local MSG="$1" + local OUTPUT="$2" + shift 2 + local CMD="$1" + if [ "$1" = 'grep' -o "$1" = 'tail' -o "$1" = 'head' ]; then + echo >&2 + while [ -n "$2" ]; do shift; done + echo "#### Complete file: $1 ####" + catfile "$1" + echo "#### $CMD output ####" + elif [ "$1" = 'test' ]; then + echo >&2 + # doesn't support ! or non-file flags + msgfailoutputstatfile() { + local FILEFLAGS='^-[bcdefgGhkLOprsStuwx]$' + if expr match "$1" "$FILEFLAGS" >/dev/null; then + echo "#### stat(2) of file: $2 ####" + stat "$2" || true + if test -d "$2"; then + echo "#### The directory contains: $2 ####" + ls >&2 "$2" || true + elif test -e "$2"; then + echo "#### Complete file: $2 ####" + catfile "$2" + fi + fi + } + msgfailoutputstatfile "$2" "$3" + while [ -n "$5" ] && [ "$4" = '-o' -o "$4" = '-a' ]; do + shift 3 + msgfailoutputstatfile "$2" "$3" + done + echo '#### test output ####' + elif [ "$1" = 'cmp' ]; then + echo >&2 + while [ -n "$2" ]; do + echo "#### Complete file: $2 ####" + catfile "$2" + shift + done + echo '#### cmp output ####' + fi + catfile "$OUTPUT" + msgfail "$MSG" +} + +testsuccesswithglobalerror() { + local TYPE="$1" + local ERRORS="$2" + shift 2 + msggroup "$TYPE" + if [ "$1" = '--nomsg' ]; then + shift + else + msgtest 'Test for successful execution of' "$*" + fi + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/${TYPE}.output" + if "$@" >"${OUTPUT}" 2>&1; then + if expr match "$1" '^apt.*' >/dev/null; then + if grep -q -E ' runtime error: ' "$OUTPUT"; then + msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@" + elif grep -E "^[${ERRORS}]: " "$OUTPUT" > "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" 2>&1; then + if [ "$IGNORE_PTY_NOT_MOUNTED" = '1' ]; then + if echo 'E: Can not write log (Is /dev/pts mounted?) - posix_openpt (2: No such file or directory)' \ + | cmp - "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" >/dev/null 2>&1; then + msgpass + else + msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@" + fi + else + msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@" + fi + elif [ "$TYPE" = 'testsuccesswithnotice' ]; then + if grep -q -E "^N: " "$OUTPUT"; then + msgpass + else + msgfailoutput 'successful run, but output had no notices' "$OUTPUT" "$@" + fi + else + msgpass + fi + else + msgpass + fi + else + local EXITCODE=$? + msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@" + fi + aptautotest "$TYPE" "$@" + msggroup +} +testsuccesswithnotice() { + testsuccesswithglobalerror 'testsuccesswithnotice' 'WE' "$@" +} +testsuccess() { + testsuccesswithglobalerror 'testsuccess' 'NWE' "$@" +} +testwarning() { + msggroup 'testwarning' + if [ "$1" = '--nomsg' ]; then + shift + else + msgtest 'Test for successful execution with warnings of' "$*" + fi + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwarning.output" + if "$@" >"${OUTPUT}" 2>&1; then + if expr match "$1" '^apt.*' >/dev/null; then + if grep -q -E ' runtime error: ' "$OUTPUT"; then + msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@" + elif grep -q -E '^E: ' "$OUTPUT"; then + msgfailoutput 'successful run, but output contains errors' "$OUTPUT" "$@" + elif ! grep -q -E '^W: ' "$OUTPUT"; then + msgfailoutput 'successful run, but output contains no warnings' "$OUTPUT" "$@" + else + msgpass + fi + else + msgpass + fi + else + local EXITCODE=$? + msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@" + fi + aptautotest 'testwarning' "$@" + msggroup +} +testfailure() { + msggroup 'testfailure' + if [ "$1" = '--nomsg' ]; then + shift + else + msgtest 'Test for failure in execution of' "$*" + fi + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output" + if "$@" >"${OUTPUT}" 2>&1; then + local EXITCODE=$? + msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@" + else + local EXITCODE=$? + if expr match "$1" '^apt.*' >/dev/null; then + if [ "$1" = 'aptkey' ]; then + if grep -q " Can't check signature: + BAD signature from + signature could not be verified" "$OUTPUT"; then + msgpass + else + msgfailoutput "run failed with exitcode ${EXITCODE}, but no signature error" "$OUTPUT" "$@" + fi + else + if grep -q -E ' runtime error: ' "$OUTPUT"; then + msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@" + elif grep -q -E '==ERROR' "$OUTPUT"; then + msgfailoutput 'compiler sanitizers reported errors' "$OUTPUT" "$@" + elif ! grep -q -E '^E: ' "$OUTPUT"; then + msgfailoutput "run failed with exitcode ${EXITCODE}, but with no errors" "$OUTPUT" "$@" + else + msgpass + fi + fi + else + msgpass + fi + fi + aptautotest 'testfailure' "$@" + msggroup +} + +testreturnstateequal() { + local STATE="$1" + if [ "$STATE" = 'testsuccesswithglobalerror' ]; then + local STATE="$2" + local TYPE="$3" + shift 3 + msggroup "${STATE}equal" + if [ "$1" != '--nomsg' ]; then + local CMP="$1" + shift + testsuccesswithglobalerror "$STATE" "$TYPE" "$@" + testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP" + else + local CMP="$2" + shift 2 + testsuccesswithglobalerror "$STATE" "$TYPE" "$@" + testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP" + fi + else + msggroup "${STATE}equal" + if [ "$2" != '--nomsg' ]; then + local CMP="$2" + shift 2 + "$STATE" "$@" + testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP" + else + local CMP="$3" + shift 3 + "$STATE" --nomsg "$@" + testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP" + fi + fi + msggroup +} +testsuccessequal() { + # we compare output, so we know perfectly well about N: + testreturnstateequal 'testsuccesswithglobalerror' 'testsuccess' 'WE' "$@" +} +testwarningequal() { + testreturnstateequal 'testwarning' "$@" +} +testfailureequal() { + testreturnstateequal 'testfailure' "$@" +} + +testfailuremsg() { + msggroup 'testfailuremsg' + local CMP="$1" + shift + testfailure "$@" + msgtest 'Check that the output of the previous failed command has expected' 'failures and warnings' + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailuremsg.comparefile" + grep '^\(W\|E\|N\):' "${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output" > "$COMPAREFILE" 2>&1 || true + testoutputequal "$COMPAREFILE" echo "$CMP" + msggroup +} +testwarningmsg() { + msggroup 'testwarningmsg' + local CMP="$1" + shift + testwarning "$@" + msgtest 'Check that the output of the previous warned command has expected' 'warnings' + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwarningmsg.comparefile" + grep '^\(W\|E\|N\):' "${TMPWORKINGDIRECTORY}/rootdir/tmp/testwarning.output" > "$COMPAREFILE" 2>&1 || true + testoutputequal "$COMPAREFILE" echo "$CMP" + msggroup +} + +testfilestats() { + msggroup 'testfilestats' + msgtest "Test that file $1 has $2 $3" "$4" + if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then + msgpass + else + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfilestats.output" + { + ls -ld "$1" || true + echo -n "stat(1) reports for $2: " + stat --format "$2" "$1" || true + } >"$OUTPUT" 2>&1 + msgfailoutput '' "$OUTPUT" + fi + msggroup +} +testaccessrights() { + msggroup 'testaccessrights' + testfilestats "$1" '%a' '=' "$2" + msggroup +} + +testwebserverlaststatuscode() { + msggroup 'testwebserverlaststatuscode' + local DOWNLOG="${TMPWORKINGDIRECTORY}/rootdir/tmp/webserverstatus-testfile.log" + local STATUS="${TMPWORKINGDIRECTORY}/downloaded/webserverstatus-statusfile.log" + rm -f "$DOWNLOG" "$STATUS" + msgtest 'Test last status code from the webserver was' "$1" + if downloadfile "http://localhost:${APTHTTPPORT}/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then + msgpass + else + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwebserverlaststatuscode.output" + { + if [ -n "$2" ]; then + shift + echo >&2 '#### Additionally provided output files contain:' + cat >&2 "$@" + fi + echo >&2 '#### Download log of the status code:' + cat >&2 "$DOWNLOG" + } >"$OUTPUT" 2>&1 + msgfailoutput "Status was $(cat "$STATUS")" "$OUTPUT" + fi + msggroup +} + +mapkeynametokeyid() { + while [ -n "$1" ]; do + case "$1" in + *Joe*|*Sixpack*|newarchive) echo '5A90D141DBAC8DAE';; + *Rex*|*Expired*) echo '4BC0A39C27CE74F9';; + *Marvin*|*Paranoid*) echo 'E8525D47528144E2';; + *Sebastian*|*Subkey*) echo '5B6896415D44C43E';; + oldarchive) echo 'FDD2DB85F68C85A3';; + *) echo 'UNKNOWN KEY';; + esac + shift + done +} +testaptkeys() { + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/aptkeylist.output" + if ! aptkey list --with-colon 2>/dev/null | grep '^pub' | cut -d':' -f 5 > "$OUTPUT"; then + echo -n > "$OUTPUT" + fi + testfileequal "$OUTPUT" "$(mapkeynametokeyid "$@")" +} + +pause() { + echo "STOPPED execution. Press enter to continue" + local IGNORE + 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 + stat --format '%U:%G:%a:%n' "$line" + done + find rootdir/var/lib/apt/lists -maxdepth 1 \! -type d | while read line; do + stat --format '%U:%G:%a:%s:%y:%n' "$line" + done + } | sort +} +forallsupportedcompressors() { + rm -f "${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/00force-compressor" + for COMP in $(aptconfig dump 'APT::Compressor' --format '%f%n' | cut -d':' -f 5 | uniq); do + if [ -z "$COMP" -o "$COMP" = '.' ]; then continue; fi + "$@" "$COMP" + done +} + +breakfiles() { + while [ -n "$1" ]; do + mv -f "${1}" "${1}.bak" + testsuccess dd if=/dev/zero of="${1}" bs="$(stat -c %s "${1}.bak")" count=1 + shift + done +} +unbreakfiles() { + while [ -n "$1" ]; do + mv -f "${1}.bak" "${1}" + shift + done +} + +### convenience hacks ### +mkdir() { + # creating some directories by hand is a tedious task, so make it look simple + local PARAMS="$*" + if [ "$PARAMS" != "${PARAMS#*rootdir/var/lib/apt/lists}" ]; then + # only the last directory created by mkdir is effected by the -m ! + command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt" + command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" + command mkdir -m 700 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" + command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/auxfiles" + touch "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/lock" + if [ "$(id -u)" = '0' ]; then + chown _apt:$(id -gn) "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" + chown _apt:$(id -gn) "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/auxfiles" + fi + else + command mkdir "$@" + fi +} + +### The following tests are run by most test methods automatically to check +### 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 + # 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" + mv "${TMPWORKINGDIRECTORY}/rootdir/tmp" "${TMPWORKINGDIRECTORY}/rootdir/tmp-before" + mkdir "${TMPWORKINGDIRECTORY}/rootdir/tmp" + $AUTOTEST "$TESTCALL" "$@" + rm -rf "${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest" + mv "${TMPWORKINGDIRECTORY}/rootdir/tmp" "${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest" + mv "${TMPWORKINGDIRECTORY}/rootdir/tmp-before" "${TMPWORKINGDIRECTORY}/rootdir/tmp" + fi +} + +aptautotest_aptget_update() { + local TESTCALL="$1" + while [ -n "$2" ]; do + if [ "$2" = '--print-uris' ]; then return; fi # simulation mode + shift + done + if ! test -d "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"; then return; fi + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:755" + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:755" + ( + cd / + # all copied files are properly chmodded + local backupIFS="$IFS" + IFS="$(printf "\n\b")" + find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" -type f ! -name 'lock' | while read file; do + testfilestats "$file" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" + done + IFS="$backupIFS" + if [ "$TESTCALL" = 'testsuccess' ]; then + # 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 "$@"; } + +testaptautotestnodpkgwarning() { + local TESTCALL="$1" + while [ -n "$2" ]; do + if expr match "$2" '^-[a-z]*s' >/dev/null 2>&1; then return; fi # simulation mode + if expr match "$2" '^-dy\?' >/dev/null 2>&1; then return; fi # download-only mode + shift + done + testfailure grep '^dpkg: warning:.*\(ignor\|unknown\).*' "${TMPWORKINGDIRECTORY}/rootdir/tmp-before/${TESTCALL}.output" +} + +aptautotest_aptget_install() { testaptautotestnodpkgwarning "$@"; } +aptautotest_aptget_remove() { testaptautotestnodpkgwarning "$@"; } +aptautotest_aptget_purge() { testaptautotestnodpkgwarning "$@"; } +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 "$@"; } diff --git a/test/integration/header-compilation b/test/integration/header-compilation new file mode 100755 index 0000000..33e0a5c --- /dev/null +++ b/test/integration/header-compilation @@ -0,0 +1,26 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment + +(for i in $TESTDIR/../../build/include/apt-pkg/*.h; do echo "#include \"$i\""; done) > include.h + + +testone() { + local cxx=$1 + shift + + if type $cxx 2>&1 1>/dev/null; then + testsuccess $cxx -c -o /dev/null include.h + testsuccess $cxx -c -o /dev/null -std=c++98 include.h + testsuccess $cxx -c -o /dev/null -std=c++11 include.h + else + msgskip "Compile $cxx is not installed" + fi +} + +testone clang++ +testone g++ +testone g++-4.8 diff --git a/test/integration/joesixpack.pub b/test/integration/joesixpack.pub Binary files differnew file mode 100644 index 0000000..cad0561 --- /dev/null +++ b/test/integration/joesixpack.pub diff --git a/test/integration/joesixpack.sec b/test/integration/joesixpack.sec Binary files differnew file mode 100644 index 0000000..0dc5cd8 --- /dev/null +++ b/test/integration/joesixpack.sec diff --git a/test/integration/keyrings/test-archive-keyring.pub b/test/integration/keyrings/test-archive-keyring.pub Binary files differnew file mode 100644 index 0000000..3251740 --- /dev/null +++ b/test/integration/keyrings/test-archive-keyring.pub diff --git a/test/integration/keyrings/test-archive-keyring.sec b/test/integration/keyrings/test-archive-keyring.sec Binary files differnew file mode 100644 index 0000000..001f795 --- /dev/null +++ b/test/integration/keyrings/test-archive-keyring.sec diff --git a/test/integration/keyrings/test-master-keyring.pub b/test/integration/keyrings/test-master-keyring.pub Binary files differnew file mode 100644 index 0000000..9809d32 --- /dev/null +++ b/test/integration/keyrings/test-master-keyring.pub diff --git a/test/integration/keyrings/test-master-keyring.sec b/test/integration/keyrings/test-master-keyring.sec Binary files differnew file mode 100644 index 0000000..c5c5bfd --- /dev/null +++ b/test/integration/keyrings/test-master-keyring.sec diff --git a/test/integration/marvinparanoid.pub b/test/integration/marvinparanoid.pub Binary files differnew file mode 100644 index 0000000..866dc14 --- /dev/null +++ b/test/integration/marvinparanoid.pub diff --git a/test/integration/marvinparanoid.sec b/test/integration/marvinparanoid.sec Binary files differnew file mode 100644 index 0000000..ace09f7 --- /dev/null +++ b/test/integration/marvinparanoid.sec diff --git a/test/integration/rexexpired.pub b/test/integration/rexexpired.pub Binary files differnew file mode 100644 index 0000000..2d2c81c --- /dev/null +++ b/test/integration/rexexpired.pub diff --git a/test/integration/rexexpired.sec b/test/integration/rexexpired.sec Binary files differnew file mode 100644 index 0000000..c431fd9 --- /dev/null +++ b/test/integration/rexexpired.sec diff --git a/test/integration/run-tests b/test/integration/run-tests new file mode 100755 index 0000000..80f1fc6 --- /dev/null +++ b/test/integration/run-tests @@ -0,0 +1,164 @@ +#!/bin/sh +set -e + +TESTTORUN='' +while [ -n "$1" ]; do + if [ "$1" = "-q" ]; then + export MSGLEVEL=2 + elif [ "$1" = "-qq" ]; then + export MSGLEVEL=1 + elif [ "$1" = "-v" ]; then + export MSGLEVEL=4 + elif [ "$1" = '--color=no' ]; then + export MSGCOLOR='NO' + elif [ "$1" = '--color=yes' ]; then + export MSGCOLOR='YES' + elif [ "$1" = '--color' ]; then + export MSGCOLOR="$(echo "$2" | tr 'a-z' 'A-Z')" + shift + elif [ "$1" = '--level' ]; then + export MSGLEVEL=$2 + shift + elif [ "$1" = '-j' ]; then + APT_TEST_JOBS=$2 + shift + elif [ -x "$1" ]; then + TESTTORUN="$1" + else + echo >&2 "WARNING: Unknown parameter »$1« will be ignored" + fi + shift +done +export MSGLEVEL="${MSGLEVEL:-3}" + +if [ "${MSGCOLOR:-YES}" = 'YES' ]; then + if [ ! -t 1 ]; then # but check that we output to a terminal + export MSGCOLOR='NO' + fi +fi +if [ "$MSGCOLOR" != 'NO' ]; then + CTEST='\033[1;32m' + CHIGH='\033[1;35m' + CRESET='\033[0m' +else + CTEST='' + CHIGH='' + CRESET='' +fi + +if [ -n "$TESTTORUN" ]; then + # collecting the output of one test to have it together + OUTPUT="$(mktemp)" + CURRENTTRAP="rm -f \"$OUTPUT\"; $CURRENTTRAP" + trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM + { + if [ "$MSGLEVEL" -le 1 ]; then + printf "${TESTTORUN##*/}" + elif [ "$MSGLEVEL" -le 2 ]; then + printf "${CTEST}Testcase ${CHIGH}${TESTTORUN##*/}${CRESET}: " + else + printf "${CTEST}Run Testcase ${CHIGH}${TESTTORUN##*/}${CRESET}\n" + fi + if ! "$TESTTORUN"; then + FAIL='yes' + if [ "$MSGLEVEL" -le 2 ]; then + printf >&2 "\n${CHIGH}Running ${TESTTORUN##*/} -> FAILED${CRESET}\n" + elif [ "$MSGLEVEL" -le 2 ]; then + printf >&2 "\n${CHIGH}Running ${TESTTORUN##*/} -> FAILED${CRESET}" + else + echo >&2 "${CHIGH}Running ${TESTTORUN##*/} -> FAILED${CRESET}" + fi + else + if [ "$MSGLEVEL" -le 1 ]; then + printf " " + fi + fi + if [ "$MSGLEVEL" -le 1 ]; then + : + elif [ "$MSGLEVEL" -le 2 ]; then + echo + fi + } >"$OUTPUT" 2>&1 + # without we end up getting stepped output 'randomly' + stty sane + cat >&2 "$OUTPUT" + stty sane + if [ "$FAIL" = 'yes' ]; then + exit 1 + else + exit 0 + fi +fi + +FAIL=0 +PASS=0 +ALL=0 +FAILED_TESTS="" +DIR="$(readlink -f "$(dirname "$0")")" +cd "$DIR" +TESTLIST="$(find . -mindepth 1 -maxdepth 1 -regex '^\./test-[^/]*$' | sort)" +if [ -n "$APT_TEST_JOBS" ]; then + if [ "$MSGCOLOR" != 'NO' ]; then + export MSGCOLOR='ALWAYS' + fi + parallel=parallel + if command -v moreutils-parallel >/dev/null 2>&1; then + parallel=moreutils-parallel + fi + exec $parallel -j "$APT_TEST_JOBS" "./$(basename "$0")" -- $(echo "$TESTLIST") +fi + +APT_TEST_SIGNINGHOME="$(mktemp --directory --tmpdir 'apt-key-signinghome.XXXXXXXXXX')" +removesigninghome() { + if [ -z "$APT_TEST_SIGNINGHOME" ]; then return; fi + GNUPGHOME="${APT_TEST_SIGNINGHOME}" gpgconf --kill gpg-agent >/dev/null 2>&1 || true + rm -rf -- "$APT_TEST_SIGNINGHOME" +} +trap "exit 1" 0 HUP INT ILL ABRT FPE SEGV PIPE TERM +trap "removesigninghome" 0 QUIT +export APT_TEST_SIGNINGHOME + +TOTAL="$(echo "$TESTLIST" | wc -l)" +if [ "$MSGLEVEL" -le 1 ]; then + printf "${CTEST}Running testcases${CRESET}: " +fi +for testcase in $TESTLIST; do + if [ "$MSGLEVEL" -le 1 ]; then + printf "${testcase##*/}" + elif [ "$MSGLEVEL" -le 2 ]; then + printf "($(($ALL+1))/${TOTAL}) ${CTEST}Testcase ${CHIGH}${testcase##*/}${CRESET}: " + else + printf "${CTEST}Run Testcase ($(($ALL+1))/${TOTAL}) ${CHIGH}${testcase##*/}${CRESET}\n" + fi + if ! ${testcase}; then + FAIL=$((FAIL+1)) + FAILED_TESTS="$FAILED_TESTS ${testcase##*/}" + if [ "$MSGLEVEL" -le 1 ]; then + printf >&2 "\n${CHIGH}Running ${testcase##*/} -> FAILED${CRESET}\n" + elif [ "$MSGLEVEL" -le 2 ]; then + printf >&2 "\n${CHIGH}Running ${testcase##*/} -> FAILED${CRESET}" + else + echo >&2 "${CHIGH}Running ${testcase##*/} -> FAILED${CRESET}" + fi + else + PASS=$((PASS+1)) + if [ "$MSGLEVEL" -le 1 ]; then + printf " " + fi + fi + ALL=$((ALL+1)) + if [ "$MSGLEVEL" -le 1 ]; then + : + elif [ "$MSGLEVEL" -le 2 ]; then + echo + fi +done + +echo >&2 "Statistics: $ALL tests were run: $PASS successfully and $FAIL failed" +if [ -n "$FAILED_TESTS" ]; then + echo >&2 "Failed tests: $FAILED_TESTS" +else + echo >&2 'All tests seem to have been run successfully. What could possibly go wrong?' +fi +# ensure we don't overflow +exit $((FAIL <= 255 ? FAIL : 255)) diff --git a/test/integration/sebastiansubkey.master.sec b/test/integration/sebastiansubkey.master.sec Binary files differnew file mode 100644 index 0000000..4d86fb9 --- /dev/null +++ b/test/integration/sebastiansubkey.master.sec diff --git a/test/integration/sebastiansubkey.pub b/test/integration/sebastiansubkey.pub Binary files differnew file mode 100644 index 0000000..c5f198c --- /dev/null +++ b/test/integration/sebastiansubkey.pub diff --git a/test/integration/sebastiansubkey.sec b/test/integration/sebastiansubkey.sec Binary files differnew file mode 100644 index 0000000..fd40889 --- /dev/null +++ b/test/integration/sebastiansubkey.sec diff --git a/test/integration/skip-acquire-same-repository-multiple-times b/test/integration/skip-acquire-same-repository-multiple-times new file mode 100755 index 0000000..c8372bd --- /dev/null +++ b/test/integration/skip-acquire-same-repository-multiple-times @@ -0,0 +1,85 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +TESTFILE="$TESTDIR/framework" +cp "$TESTFILE" aptarchive/foo +APTARCHIVE="$(readlink -f ./aptarchive)" + +getcodenamefromsuite() { echo "jessie"; } +buildsimplenativepackage 'foo' 'all' '1.0' 'stable' +setupaptarchive --no-update +ln -s "${APTARCHIVE}/dists/stable" "${APTARCHIVE}/dists/jessie" +for FILE in rootdir/etc/apt/sources.list.d/*-stable-* ; do + sed 's#stable#jessie#g' $FILE > $(echo "$FILE" | sed 's#stable#jessie#g') +done + +# install a slowed down file: otherwise its to fast to reproduce combining +NEWMETHODS="$(readlink -f rootdir)/usr/lib/apt/methods" +OLDMETHODS="$(readlink -f rootdir/usr/lib/apt/methods)" +rm "$NEWMETHODS" +mkdir "$NEWMETHODS" +backupIFS="$IFS" +IFS="$(printf "\n\b")" +for METH in $(find "$OLDMETHODS" ! -type d); do + ln -s "$OLDMETHODS/$(basename "$METH")" "$NEWMETHODS" +done +IFS="$backupIFS" +rm "${NEWMETHODS}/file" "${NEWMETHODS}/http" +cat >"${NEWMETHODS}/file" <<EOF +#!/bin/sh +while read line; do + echo "\$line" + if [ -z "\$line" ]; then + sleep 0.5 + fi +done | '$OLDMETHODS/'"\${0##*/}" +EOF +chmod +x "${NEWMETHODS}/file" +ln -s "${NEWMETHODS}/file" "${NEWMETHODS}/http" + +tworepos() { + msgtest "Downloading the same repository twice over $1" "$3" + testsuccess --nomsg aptget update -o Debug::pkgAcquire::Worker=1 + cp rootdir/tmp/testsuccess.output download.log + #cat download.log + aptget indextargets --format '$(FILENAME)' --no-release-info | sort > file.lst + testequal "$(find "$(readlink -f ./rootdir/var/lib/apt/lists)" -name '*_dists_*' \( ! -name '*InRelease' \) -type f | sort)" cat file.lst + testsuccess aptcache policy + testequal "foo: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 $1:$2 jessie/main all Packages + 500 $1:$2 stable/main all Packages" aptcache policy foo + testfailure aptcache show foo/unstable + testsuccess aptcache show foo/stable + testsuccess aptcache show foo/jessie +} + +tworepos 'file' "$APTARCHIVE" 'no partial' +testequal '14' grep -c '200%20URI%20Start' ./download.log +testequal '14' grep -c '201%20URI%20Done' ./download.log +testequal '8' grep -c '^ @ Queue: Action combined' ./download.log +tworepos 'file' "$APTARCHIVE" 'hit' +testequal '6' grep -c '200%20URI%20Start' ./download.log +testequal '6' grep -c '201%20URI%20Done' ./download.log +testequal '0' grep -c '^ @ Queue: Action combined' ./download.log +rm -rf rootdir/var/lib/apt/lists + +changetowebserver + +tworepos 'http' "//localhost:${APTHTTPPORT}" 'no partial' +testequal '12' grep -c '200%20URI%20Start' ./download.log +testequal '12' grep -c '201%20URI%20Done' ./download.log +testequal '8' grep -c '^ @ Queue: Action combined' ./download.log +tworepos 'http' "//localhost:${APTHTTPPORT}" 'hit' +testequal '2' grep -c '200%20URI%20Start' ./download.log +testequal '4' grep -c '201%20URI%20Done' ./download.log +testequal '0' grep -c '^ @ Queue: Action combined' ./download.log +rm -rf rootdir/var/lib/apt/lists diff --git a/test/integration/skip-apt-download-progress b/test/integration/skip-apt-download-progress new file mode 100755 index 0000000..13a18f7 --- /dev/null +++ b/test/integration/skip-apt-download-progress @@ -0,0 +1,48 @@ +#!/bin/sh +# +# ensure downloading sends progress as a regression test for commit 9127d7ae +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +changetohttpswebserver + +assertprogress() { + testsuccess grep "dlstatus:1:0.0000:Retrieving file 1 of 1" "$1" + testsuccess grep -E "dlstatus:1:[1-9][0-9]{0,1}\.[0-9]{1,4}:Retrieving file 1 of 1" "$1" + testsuccess grep "dlstatus:1:100.0000:Retrieving file 1 of 1" "$1" +} + +# we need to ensure the file is reasonable big so that apt has a chance to +# actually report progress - but not too big to ensure its not delaying the +# test too much +TESTFILE=testfile.big +testsuccess dd if=/dev/zero of=./aptarchive/$TESTFILE bs=1600k count=1 + +OPT='-o APT::Status-Fd=3 -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::http=1 -o Debug::Acquire::https=1' + +msgtest 'download progress works via' 'http' +for i in 2 5 7 10 12 15; do + exec 3> apt-progress-http.log + testsuccess --nomsg apthelper download-file "http://localhost:${APTHTTPPORT}/$TESTFILE" ./downloaded/http-$TESTFILE $OPT -o Acquire::http::Dl-Limit=$((1600/i)) + if [ "$(wc -l apt-progress-http.log | awk '{print $1}')" -ge 3 ]; then + break + fi +done +assertprogress apt-progress-http.log + +msgtest 'download progress works via' 'https' +for i in 2 5 7 10 12 15; do + exec 3> apt-progress-https.log + testsuccess --nomsg apthelper download-file "https://localhost:${APTHTTPSPORT}/$TESTFILE" ./downloaded/https-$TESTFILE $OPT -o Acquire::https::Dl-Limit=$((1600/i)) + if [ "$(wc -l apt-progress-https.log | awk '{print $1}')" -ge 3 ]; then + break + fi +done +assertprogress apt-progress-https.log + +# cleanup +rm -f apt-progress*.log diff --git a/test/integration/skip-apt-dropprivs b/test/integration/skip-apt-dropprivs new file mode 100755 index 0000000..e0dd741 --- /dev/null +++ b/test/integration/skip-apt-dropprivs @@ -0,0 +1,32 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +aptdropprivs() { runapt "${APTTESTHELPERSBINDIR}/aptdropprivs" "$@"; } + +testsuccess aptdropprivs -- /bin/true +testsuccess aptdropprivs --user "$USER" -- /bin/true +testsuccess aptdropprivs --user 'nobody' -- /bin/true +testsuccess aptdropprivs --user '_apt' -- /bin/true + +IDBIN='/usr/bin/id' +testsuccessequal "$("$IDBIN")" aptdropprivs --user "$USER" -- "$IDBIN" + +SUDOBIN='/usr/bin/sudo' +testequal "sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?" aptdropprivs --user 'nobody' -- "$SUDOBIN" "$IDBIN" + +if [ "$(id -u)" = '0' ]; then + testsuccessequal '_apt' aptdropprivs --user '_apt' -- "$IDBIN" '-un' + testsuccess aptdropprivs --user '_apt' -- '/bin/sh' '-c' 'export' + cp rootdir/tmp/testsuccess.output apt.env + testsuccessequal "export HOME='/nonexistent'" grep '^export HOME' apt.env + testsuccessequal "export USER='_apt' +export USERNAME='_apt'" grep '^export USER' apt.env + testsuccessequal "export LOGNAME='_apt'" grep '^export LOGNAME' apt.env + testsuccessequal "export SHELL='/bin/sh'" grep '^export SHELL=' apt.env +fi diff --git a/test/integration/skip-avoid-avoiding-breaks-predepends b/test/integration/skip-avoid-avoiding-breaks-predepends new file mode 100755 index 0000000..0697ff4 --- /dev/null +++ b/test/integration/skip-avoid-avoiding-breaks-predepends @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'native' + +insertinstalledpackage 'looping' 'native' '1' +insertinstalledpackage 'loop1' 'native' '1' 'Depends: loop2 (= 1)' +insertinstalledpackage 'loop2' 'native' '1' 'Depends: loop1 (= 1)' + +buildsimplenativepackage 'looping' 'native' '1.15.7.2' 'stable' 'Breaks: loop2 (<= 1)' +buildsimplenativepackage 'loop1' 'native' '2' 'stable' 'Depends: loop2 (= 2)' +buildsimplenativepackage 'loop2' 'native' '2' 'stable' 'Depends: loop1 (= 2) +Pre-Depends: looping (>= 1.15)' + +setupaptarchive + +aptget dist-upgrade -y -o Debug::pkgOrderList=1 #-qq >/dev/null 2>&1 +testdpkginstalled looping loop1 loop2 diff --git a/test/integration/skip-bug-601016-description-translation b/test/integration/skip-bug-601016-description-translation new file mode 100755 index 0000000..fd0465a --- /dev/null +++ b/test/integration/skip-bug-601016-description-translation @@ -0,0 +1,133 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' 'amd64' + +# we need a valid locale here, otherwise the language configuration +# will be overridden by LC_ALL=C +LOCALE="$(echo "$LANG" | cut -d'_' -f 1)" +MD5Sum='Description-md5: d41ee493aa9fcc6cbc9ce4eb7069959c' + +PACKAGESTANZA='Package: apt +Priority: important +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: i386 +Version: 0.8.7 +Filename: pool/main/a/apt/apt_0.8.7_i386.deb +Size: 2140230 +MD5sum: 74769bfbcef9ebc4fa74f7a5271b9c08' + +PACKAGESTANZA2='Package: apt +Priority: important +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: amd64 +Version: 0.8.7 +Filename: pool/main/a/apt/apt_0.8.7_amd64.deb +Size: 2210342 +MD5sum: 4a869bfbdef9ebc9fa74f7a5271e8d1a' + +echo "$PACKAGESTANZA +Description: Advanced front-end for dpkg +$MD5Sum + +$PACKAGESTANZA2 +Description: Advanced front-end for dpkg +$MD5Sum" > aptarchive/Packages + +echo "Package: apt +Description-${LOCALE}: Mächtige Oberfläche für dpkg + Das Paket bietet dem Nutzer technisch führende Methoden für den Zugriff + auf den dpkg-Paketmanager. Es beinhaltet das apt-get-Werkzeug und die + APT-Dselect-Methode. Beides sind einfache und sicherere Wege, + um Pakete zu installieren und Upgrades durchzuführen. +$MD5Sum" | bzip2 > aptarchive/${LOCALE}.bz2 + +# the $LOCALE translation file will not be included as it is a flat archive it came from and therefore +# its name can not be guessed correctly… (in non-flat archives the files are called Translation-*) +echo 'APT::Cache::Generate "false";' > rootdir/etc/apt/apt.conf.d/00nogenerate + +NOLONGSTANZA="$PACKAGESTANZA +Description: Advanced front-end for dpkg +$MD5Sum +" + +ENGLISHSTANZA="$PACKAGESTANZA +Description: Advanced front-end for dpkg +$MD5Sum +" + +LOCALESTANZA="$PACKAGESTANZA +Description-${LOCALE}: Mächtige Oberfläche für dpkg + Das Paket bietet dem Nutzer technisch führende Methoden für den Zugriff + auf den dpkg-Paketmanager. Es beinhaltet das apt-get-Werkzeug und die + APT-Dselect-Methode. Beides sind einfache und sicherere Wege, + um Pakete zu installieren und Upgrades durchzuführen. +$MD5Sum +" +LOCALESTANZA2="$PACKAGESTANZA2 +Description-${LOCALE}: Mächtige Oberfläche für dpkg + Das Paket bietet dem Nutzer technisch führende Methoden für den Zugriff + auf den dpkg-Paketmanager. Es beinhaltet das apt-get-Werkzeug und die + APT-Dselect-Methode. Beides sind einfache und sicherere Wege, + um Pakete zu installieren und Upgrades durchzuführen. +$MD5Sum +" + +testrun() { + echo "Acquire::Languages { \"${LOCALE}\"; \"en\"; };" > rootdir/etc/apt/apt.conf.d/00languages + export LC_ALL="" + rm -rf rootdir/var/lib/apt/lists + setupaptarchive + testequal "$LOCALESTANZA" aptcache show apt -o Test=File-${LOCALE} + testequal "$LOCALESTANZA" aptcache show apt:i386 -o Test=File-${LOCALE} + testequal "$LOCALESTANZA2" aptcache show apt:amd64 -o Test=File-${LOCALE} + testequal "$NOLONGSTANZA" aptcache show apt -o Acquire::Languages="ww" -o Test=File-${LOCALE} + testequal "$LOCALESTANZA" aptcache show apt -o Acquire::Languages::="ww" -o Test=File-${LOCALE} + LC_ALL=C testequal "$ENGLISHSTANZA" aptcache show apt -o Test=File-${LOCALE} + export LC_ALL="" + echo "Acquire::Languages { \"ww\"; \"${LOCALE}\"; \"en\"; };" > rootdir/etc/apt/apt.conf.d/00languages + testequal "$LOCALESTANZA" aptcache show apt -o Test=File-ww-${LOCALE} + echo "Acquire::Languages { \"ww\"; \"en\"; };" > rootdir/etc/apt/apt.conf.d/00languages + testequal "$ENGLISHSTANZA" aptcache show apt -o Test=File-ww +} + +testrun + +echo "$PACKAGESTANZA +Description: Advanced front-end for dpkg +$MD5Sum + +$PACKAGESTANZA2 +Description: Advanced front-end for dpkg +$MD5Sum" > aptarchive/Packages + +echo "Package: apt +Description-en: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. +$MD5Sum" | bzip2 > aptarchive/en.bz2 + +ENGLISHSTANZA="$PACKAGESTANZA +Description-en: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. +$MD5Sum +" +ENGLISHSTANZA2="$PACKAGESTANZA2 +Description-en: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. +$MD5Sum +" + +testrun diff --git a/test/integration/skip-bug-711456-apt-cdrom-multiple-cds-multiarch b/test/integration/skip-bug-711456-apt-cdrom-multiple-cds-multiarch new file mode 100755 index 0000000..9abaee1 --- /dev/null +++ b/test/integration/skip-bug-711456-apt-cdrom-multiple-cds-multiarch @@ -0,0 +1,47 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'testing' 'amd64,i386' '0.8.15' 'stable' 'Depends: libtest' +buildsimplenativepackage 'libtest' 'amd64,i386' '0.8.15' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'libtest' 'amd64,i386' '1' 'unstable' 'Multi-Arch: same' + +# needed by the ftparchive.conf +cd aptarchive +ln -s ../incoming pool +createaptftparchiveconfig +cd - >/dev/null +# create an amd64 cdrom +sed -i 's#Architectures .*$#Architectures "amd64 source";#' aptarchive/ftparchive.conf +setupaptarchive --no-update +changetocdrom 'Debian APT Testdisk amd64 0.8.15' +mv rootdir/media/cdrom rootdir/media/cdrom-amd64 +addtrap 'prefix' "chmod -R +w $PWD/rootdir/media/cdrom-amd64/dists/;" +chmod -R -w rootdir/media/cdrom-amd64/dists +ln -s $PWD/rootdir/media/cdrom-amd64 $PWD/rootdir/media/cdrom +aptcdrom add -m -o quiet=1 +rm $PWD/rootdir/media/cdrom +# do it again to create a i386 cdrom +sed -i 's#Architectures .*$#Architectures "i386 source";#' aptarchive/ftparchive.conf +setupaptarchive --no-update +changetocdrom 'Debian APT Testdisk i386 0.8.15' +mv rootdir/media/cdrom rootdir/media/cdrom-i386 +addtrap 'prefix' "chmod -R +w $PWD/rootdir/media/cdrom-i386/dists/;" +chmod -R -w rootdir/media/cdrom-i386/dists +ln -s $PWD/rootdir/media/cdrom-i386 $PWD/rootdir/media/cdrom +aptcdrom add -m -o quiet=1 + +# play with the cdroms +testdpkgnotinstalled testing +aptget install testing -t stable -y #> /dev/null 2>&1 +testdpkginstalled testing + +testdpkgnotinstalled testing:i386 +aptget install testing:i386 -t stable -y #> /dev/null 2>&1 +testdpkginstalled testing:i386 + +aptget dist-upgrade -y diff --git a/test/integration/skip-method-http-socks-client b/test/integration/skip-method-http-socks-client new file mode 100755 index 0000000..b9e8393 --- /dev/null +++ b/test/integration/skip-method-http-socks-client @@ -0,0 +1,181 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment + +# We don't do a real proxy here, we just look how the implementation +# reacts to certain responses from a "proxy" provided by socat +# Checks HTTP, but requesting https instead will check HTTPS (curl) which +# uses different error messages through – also: https://github.com/curl/curl/issues/944 + +# FIXME: Not run automatically as it uses a hardcoded port (5555) + +msgtest 'Check that everything is installed' 'socat' +if dpkg-checkbuilddeps -d 'socat' /dev/null >/dev/null 2>&1; then + msgpass +else + msgskip "$(command dpkg -l socat)" + exit +fi + +runclient() { + # this doesn't need to be an actually reachable webserver for this test + # in fact, its better if it isn't. + rm -f index.html + apthelper download-file "http://${2:-localhost:2903}/" index.html \ + -o Acquire::http::Proxy="socks5h://${1}localhost:5555" \ + -o Acquire::http::Timeout=2 -o Debug::Acquire::http=1 > client.output 2>&1 || true +} +runserver() { + socat -x tcp-listen:5555,reuseaddr \ + system:"echo -n '$*' | xxd -r -p; echo 'HTTP/1.1 200 OK'; echo 'Content-Length: 5'; echo 'Connection: close'; echo; echo 'HTML'" \ + > server.output 2>&1 & +} +PROXY="socks5h://localhost:5555" + +msgmsg 'SOCKS does not run' +runclient +testsuccess grep 'Could not connect to localhost:5555' client.output + +msgmsg 'SOCKS greets back with wrong version' +runserver '04 00' +runclient +testsuccess grep 'greets back with wrong version: 4' client.output + +msgmsg 'SOCKS tries GSSAPI auth we have not advertised' +runserver '05 01' +runclient +testsuccess grep 'greets back having not found a common authorization method: 1' client.output + +msgmsg 'SOCKS tries user&pass auth we have not advertised' +runserver '05 02' +runclient +testsuccess grep 'pass auth, but we had not offered it' client.output + +msgmsg 'SOCKS user:pass wrong version' +runserver '05 02' '05 00' +runclient 'user:pass@' +testsuccess grep 'auth status response with wrong version: 5' client.output + +msgmsg 'SOCKS user:pass wrong auth' +runserver '05 02' '01 01' +runclient 'user:pass@' +testsuccess grep 'reported authorization failure: username or password incorrect? (1)' client.output + +msgmsg 'SOCKS user:pass request not granted no hostname' +runserver '05 02' '01 00' '05 01 00 03 00 1f 90' +runclient 'user:pass@' +testsuccess grep 'could not connect to localhost (:8080) due to: general SOCKS server failure (1)' client.output + +msgmsg 'SOCKS user:pass request not granted with hostname' +runserver '05 02' '01 00' '05 01 00 03 09 68 6f 73 74 6c 6f 63 61 6c 1f 90' +runclient 'user:pass@' +testsuccess grep 'could not connect to localhost (hostlocal:8080) due to: general SOCKS server failure (1)' client.output + +msgmsg 'SOCKS user:pass request not granted ipv4' +runserver '05 02' '01 00' '05 04 00 01 ac 10 fe 01 1f 90' +runclient 'user:pass@' +testsuccess grep 'could not connect to localhost (172.16.254.1:8080) due to: Host unreachable (4)' client.output + +msgmsg 'SOCKS user:pass request not granted ipv6' +runserver '05 02' '01 00' '05 12 00 04 20 01 0d b8 ac 10 fe 00 00 00 00 00 00 00 00 00 1f 90' +runclient 'user:pass@' +testsuccess grep 'could not connect to localhost (\[2001:0DB8:AC10:FE00:0000:0000:0000:0000\]:8080) due to: Unknown error (18)' client.output + +msgmsg 'SOCKS user:pass request granted ipv4' +runserver '05 02' '01 00' '05 00 00 01 ac 10 fe 01 1f 90' +runclient 'user:pass@' +testequal "http: SOCKS proxy $PROXY connection established to localhost (172.16.254.1:8080)" head -n 1 client.output +testfileequal index.html 'HTML' + +msgmsg 'SOCKS user:pass request granted ipv6' +runserver '05 02' '01 00' '05 00 00 04 20 01 0d b8 ac 10 fe 00 00 00 00 00 00 00 00 00 1f 90' +runclient 'user:pass@' +testequal "http: SOCKS proxy $PROXY connection established to localhost ([2001:0DB8:AC10:FE00:0000:0000:0000:0000]:8080)" head -n 1 client.output +testfileequal index.html 'HTML' + +msgmsg 'SOCKS no auth no hostname' +runserver '05 00 05 00 00 03 00 1f 90' +runclient +testequal "http: SOCKS proxy $PROXY connection established to localhost (:8080)" head -n 1 client.output +testfileequal index.html 'HTML' + +msgmsg 'SOCKS no auth with hostname' +runserver '05 00 05 00 00 03 09 68 6f 73 74 6c 6f 63 61 6c 1f 90' +runclient +testequal "http: SOCKS proxy $PROXY connection established to localhost (hostlocal:8080)" head -n 1 client.output +testfileequal index.html 'HTML' + +msgmsg 'SOCKS user-only request granted ipv4' +runserver '05 02' '01 00' '05 00 00 01 ac 10 fe 01 1f 90' +runclient 'apt@' +testequal "http: SOCKS proxy $PROXY connection established to localhost (172.16.254.1:8080)" head -n 1 client.output +testfileequal index.html 'HTML' + +msgmsg 'tor: SOCKS user:pass request not granted' +runserver '05 02' '01 00' '05 04 00 01 00 00 00 00 00 00' +runclient 'user:pass@' +testsuccess grep 'could not connect to localhost (0.0.0.0:0) due to: Host unreachable (4)' client.output + +msgmsg 'tor: SOCKS user:pass request tll expired' +runserver '05 02' '01 00' '05 06 00 01 00 00 00 00 00 00' +runclient 'user:pass@' +testsuccess grep 'could not connect to localhost (0.0.0.0:0) due to: TTL expired (6)' client.output + +msgmsg 'tor: SOCKS user:pass request service unreachable' +runserver '05 02' '01 00' '05 06 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'vwakviie2ienjx6t.onion' +testsuccess grep 'could not connect to vwakviie2ienjx6t.onion (0.0.0.0:0) due to: Host unreachable (6)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted onion' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'vwakviie2ienjx6t.onion' +testsuccess grep 'could not connect to vwakviie2ienjx6t.onion (0.0.0.0:0) due to: general SOCKS server failure (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted subdomain' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'ftp.vwakviie2ienjx6t.onion' +testsuccess grep 'could not connect to ftp.vwakviie2ienjx6t.onion (0.0.0.0:0) due to: general SOCKS server failure (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too short' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'wakviie2ienjx6t.onion' +testsuccess grep 'could not connect to wakviie2ienjx6t.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too long' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'vwakviie2ienjx6t2.onion' +testsuccess grep 'could not connect to vwakviie2ienjx6t2.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too short subdomain' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'a.akviie2ienjx6t.onion' +testsuccess grep 'could not connect to a.akviie2ienjx6t.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too short subdomains' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'a.a.viie2ienjx6t.onion' +testsuccess grep 'could not connect to a.a.viie2ienjx6t.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too short' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67oro.onion' +testsuccess grep 'could not connect to l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67oro.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too long' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad2.onion' +testsuccess grep 'could not connect to l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad2.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too short subdomain' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'a.satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad.onion' +testsuccess grep 'could not connect to a.satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output + +msgmsg 'tor: SOCKS user:pass request not granted too short subdomains' +runserver '05 02' '01 00' '05 01 00 01 00 00 00 00 00 00' +runclient 'user:pass@' 'a.a.tjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad.onion' +testsuccess grep 'could not connect to a.a.tjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad.onion (0.0.0.0:0) due to: Invalid hostname: onion service name must be either 16 or 56 characters long (1)' client.output diff --git a/test/integration/status-bug-590438-broken-provides-thanks-to-remove-order b/test/integration/status-bug-590438-broken-provides-thanks-to-remove-order new file mode 100644 index 0000000..c2c03c0 --- /dev/null +++ b/test/integration/status-bug-590438-broken-provides-thanks-to-remove-order @@ -0,0 +1,97 @@ +Package: libc-bin +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1516 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: i386 +Source: eglibc +Version: 2.11.2-2 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Breaks: libc0.1 (<< 2.10), libc0.3 (<< 2.10), libc6 (<< 2.10), libc6.1 (<< 2.10) +Filename: pool/main/e/eglibc/libc-bin_2.11.2-2_i386.deb +Size: 703542 +MD5sum: f554ec34c092bb8e52e3d917bec7b46c +SHA1: 4d5ba53b50937b1d50e3234e45335de5ea97b84b +SHA256: 4f1e6430a730321209bb6b9cf89ba8a72c95f5c93f3e263a982251b3cc8beb14 +Description-de: Die »Embedded GNU C Library«: Binärdateien +Homepage: http://www.eglibc.org +Tag: devel::lang:c, devel::packaging, implemented-in::c, interface::commandline, role::program, scope::utility, special::auto-inst-parts, suite::gnu, works-with::text, works-with::unicode + +Package: libc6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 9340 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: i386 +Source: eglibc +Version: 2.11.2-2 +Provides: glibc-2.11-1 +Depends: libc-bin (= 2.11.2-2), libgcc1 +Recommends: libc6-i686 +Suggests: glibc-doc, debconf | debconf-2.0, locales +Conflicts: tzdata (<< 2007k-1), tzdata-etch +Breaks: locales (<< 2.11), locales-all (<< 2.11), nscd (<< 2.11) +Filename: pool/main/e/eglibc/libc6_2.11.2-2_i386.deb +Size: 3877166 +MD5sum: 3d8fe972a359ad362ac1957c2687e5c2 +SHA1: cd901f3265254e40ad198b935877f546eeaa8403 +SHA256: e1bc3da1e11f9b742d05f927362e2079482db4186ff45af9f937d284e112e7e5 +Description-de: Die »Embedded GNU C Library«: Laufzeitbibliotheken +Homepage: http://www.eglibc.org +Tag: devel::lang:c, devel::library, implemented-in::c, protocol::ipv6, role::shared-lib, suite::gnu + +Package: mawk +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 228 +Maintainer: Steve Langasek <vorlon@debian.org> +Architecture: i386 +Version: 1.3.3-15 +Provides: awk +Pre-Depends: libc6 (>= 2.1) +Filename: pool/main/m/mawk/mawk_1.3.3-15_i386.deb +Size: 81430 +MD5sum: e0f9e9903a862a52b5f107d560c4d8e0 +SHA1: cca3b3ea3a57b9c3c136fb538a4fb06a99d1a33e +SHA256: 7449b10ffb6a8636a249ad6866188cad0040a6a446fb4a3a71d81fd136297ee6 +Description-de: Eine Muster- und Textverarbeitungssprache +Tag: devel::interpreter, implemented-in::c, interface::commandline, role::program, scope::utility, use::filtering, use::scanning, works-with::text + +Package: gcc-4.5-base +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 172 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.5 +Version: 4.5.0-8 +Filename: pool/main/g/gcc-4.5/gcc-4.5-base_4.5.0-8_i386.deb +Size: 117894 +MD5sum: f5850c42681fcfee3429a1b43da68433 +SHA1: 0548343feba69c4c01d5dbf147393d8dc27605ac +SHA256: 04b60f5fe24b7397e3be233051615ff9addb66d4581578f67fde76f5d7f69f7a +Description: The GNU Compiler Collection (base package) +Homepage: http://gcc.gnu.org/ + +Package: libgcc1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 148 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.5 (4.5.0-8) +Version: 1:4.5.0-8 +Depends: gcc-4.5-base (= 4.5.0-8), libc6 (>= 2.2.4) +Filename: pool/main/g/gcc-4.5/libgcc1_4.5.0-8_i386.deb +Size: 52190 +MD5sum: beda956a1dcdeffed11072c2d0f3eb83 +SHA1: 7117ec43eec7982a030fcc9a12d4772de3fcdba0 +SHA256: 1d10bd532adce8683b475fcc60c22300f717ef19bf84dc5bf43b07e504f85dcb +Description: GCC support library +Homepage: http://gcc.gnu.org/ + diff --git a/test/integration/status-bug-591882-conkeror b/test/integration/status-bug-591882-conkeror new file mode 100644 index 0000000..f05ac81 --- /dev/null +++ b/test/integration/status-bug-591882-conkeror @@ -0,0 +1,1357 @@ +Package: conkeror +Status: install ok installed +Priority: extra +Section: web +Installed-Size: 1044 +Maintainer: Axel Beckert <abe@deuxchevaux.org> +Architecture: all +Version: 0.9~git080629-2 +Provides: www-browser +Depends: xulrunner (>= 1.9~) | xulrunner-1.9 +Recommends: conkeror-spawn-process-helper +Suggests: emacs | emacsen +Description: keyboard focused web browser with Emacs look and feel + +Package: coreutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 10032 +Maintainer: Michael Stone <mstone@debian.org> +Architecture: i386 +Version: 6.10-6 +Replaces: textutils, shellutils, fileutils, stat, debianutils (<= 2.3.1), dpkg (<< 1.13.2) +Provides: textutils, shellutils, fileutils +Pre-Depends: libacl1 (>= 2.2.11-1), libc6 (>= 2.6.1-1), libselinux1 (>= 2.0.15) +Conflicts: stat +Description: The GNU core utilities + +Package: debconf-i18n +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1100 +Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> +Architecture: all +Source: debconf +Version: 1.5.24 +Replaces: debconf (<< 1.3.0), debconf-utils (<< 1.3.22) +Depends: debconf, liblocale-gettext-perl, libtext-iconv-perl, libtext-wrapi18n-perl, libtext-charwidth-perl +Conflicts: debconf-english, debconf-utils (<< 1.3.22) +Description: full internationalization support for debconf + +Package: debconf +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1508 +Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> +Architecture: all +Version: 1.5.24 +Replaces: debconf-tiny +Provides: debconf-2.0 +Depends: debconf-i18n | debconf-english +Pre-Depends: perl-base (>= 5.6.1-4) +Recommends: apt-utils (>= 0.5.1) +Suggests: debconf-doc, debconf-utils, whiptail | dialog | gnome-utils, libterm-readline-gnu-perl, libgnome2-perl, libqt-perl, libnet-ldap-perl, perl +Conflicts: apt (<< 0.3.12.1), cdebconf (<< 0.96), debconf-tiny, debconf-utils (<< 1.3.22), dialog (<< 0.9b-20020814-1), menu (<= 2.1.3-1), whiptail (<< 0.51.4-11), whiptail-utf8 (<= 0.50.17-13) +Description: Debian configuration management system + +Package: debianutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 272 +Maintainer: Clint Adams <schizo@debian.org> +Architecture: i386 +Version: 2.30 +Pre-Depends: libc6 (>= 2.7-1) +Description: Miscellaneous utilities specific to Debian + +Package: defoma +Status: install ok installed +Priority: optional +Section: admin +Installed-Size: 449 +Maintainer: Angus Lees <gus@debian.org> +Architecture: all +Version: 0.11.10-0.2 +Depends: file, perl (>= 5.6.0-16), whiptail | dialog +Recommends: libft-perl +Suggests: defoma-doc, dfontmgr, psfontmgr, x-ttcidfont-conf +Conflicts: defoma-gs, defoma-ps, defoma-x, dfontmgr (<< 0.10.0), psfontmgr (<< 0.5.0), x-ttcidfont-conf (<< 5) +Description: Debian Font Manager -- automatic font configuration framework +Enhances: debhelper + +Package: dpkg +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 7276 +Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> +Architecture: i386 +Version: 1.14.29 +Replaces: manpages-de (<= 0.4-3), manpages-pl (<= 20051117-1) +Pre-Depends: libc6 (>= 2.7-1), coreutils (>= 5.93-1), lzma +Suggests: apt +Conflicts: apt (<< 0.7.7), aptitude (<< 0.4.7-1), dpkg-dev (<< 1.14.16), dpkg-iasearch (<< 0.11), sysvinit (<< 2.82-1) +Description: Debian package management system +Origin: debian +Bugs: debbugs://bugs.debian.org + +Package: file +Status: install ok installed +Priority: standard +Section: utils +Installed-Size: 136 +Maintainer: Daniel Baumann <daniel@debian.org> +Architecture: i386 +Version: 4.26-1 +Depends: libc6 (>= 2.7-1), libmagic1 (= 4.26-1), zlib1g (>= 1:1.1.4) +Description: Determines file type using "magic" numbers + +Package: fontconfig-config +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 250 +Maintainer: Keith Packard <keithp@debian.org> +Architecture: all +Source: fontconfig +Version: 2.6.0-3 +Replaces: fontconfig (<< 2.3.2-2) +Depends: debconf (>= 0.5) | debconf-2.0, ucf (>= 0.29), ttf-dejavu | ttf-bitstream-vera | ttf-freefont | gsfonts-x11 +Conflicts: fontconfig (<< 2.3.2-2) +Description: generic font configuration library - configuration + +Package: fontconfig +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 384 +Maintainer: Keith Packard <keithp@debian.org> +Architecture: i386 +Version: 2.6.0-3 +Replaces: fontconfig-config (<< 2.5.93-1) +Depends: libc6 (>= 2.7-1), libfontconfig1 (>= 2.4.0), fontconfig-config +Suggests: defoma (>= 0.7.0) +Description: generic font configuration library - support binaries + +Package: gcc-4.3-base +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 160 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.3 +Version: 4.3.2-1.1 +Replaces: cpp-4.3 (<< 4.3.2) +Description: The GNU Compiler Collection (base package) + +Package: libacl1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 48 +Maintainer: Nathan Scott <nathans@debian.org> +Architecture: i386 +Source: acl +Version: 2.2.47-2 +Depends: libattr1 (>= 2.4.41-1), libc6 (>= 2.7-1) +Conflicts: acl (<< 2.0.0), libacl1-kerberos4kth +Description: Access control list shared library + +Package: libatk1.0-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 168 +Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: atk1.0 +Version: 1.22.0-1 +Depends: libc6 (>= 2.7-1), libglib2.0-0 (>= 2.16.0) +Recommends: libatk1.0-data +Description: The ATK accessibility toolkit + +Package: libattr1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 36 +Maintainer: Nathan Scott <nathans@debian.org> +Architecture: i386 +Source: attr +Version: 1:2.4.43-2 +Depends: libc6 (>= 2.7-1) +Conflicts: attr (<< 2.0.0) +Description: Extended attribute shared library + +Package: libbz2-1.0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 92 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: bzip2 +Version: 1.0.5-1 +Depends: libc6 (>= 2.7-1) +Description: high-quality block-sorting file compressor library - runtime + +Package: libc6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 10756 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: i386 +Source: glibc +Version: 2.7-18lenny4 +Provides: glibc-2.7-1 +Depends: libgcc1 +Suggests: locales, glibc-doc, libc6-i686 +Conflicts: libterm-readline-gnu-perl (<< 1.15-2), tzdata (<< 2007k-1), tzdata-etch +Description: GNU C Library: Shared libraries + +Package: libcairo2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 844 +Maintainer: Dave Beckett <dajobe@debian.org> +Architecture: i386 +Source: cairo +Version: 1.6.4-7 +Replaces: libcairo0.5.1, libcairo0.6.0, libcairo0.9.0, libcairo1 +Provides: libcairo +Depends: libc6 (>= 2.7-1), libdirectfb-1.0-0, libfontconfig1 (>= 2.4.0), libfreetype6 (>= 2.3.5), libpixman-1-0 (>= 0.10.0), libpng12-0 (>= 1.2.13-4), libx11-6, libxcb-render-util0 (>= 0.2.1+git1), libxcb-render0, libxcb1, libxrender1, zlib1g (>= 1:1.1.4) +Conflicts: libcairo1 +Description: The Cairo 2D vector graphics library + +Package: libcomerr2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 96 +Maintainer: Theodore Y. Ts'o <tytso@mit.edu> +Architecture: i386 +Source: e2fsprogs +Version: 1.41.3-1 +Replaces: e2fsprogs (<< 1.34-1) +Provides: libcomerr-kth-compat +Depends: libc6 (>= 2.7-1) +Description: common error description library + +Package: libcups2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 364 +Maintainer: Debian CUPS Maintainers <pkg-cups-devel@lists.alioth.debian.org> +Architecture: i386 +Source: cups +Version: 1.3.8-1+lenny8 +Replaces: libcupsys2 (<< 1.3.7-6) +Provides: libcupsys2 +Depends: libc6 (>= 2.7-1), libcomerr2 (>= 1.01), libgnutls26 (>= 2.4.0-0), libkrb53 (>= 1.6.dfsg.2), zlib1g (>= 1:1.1.4) +Suggests: cups-common +Conflicts: libcupsys2 (<< 1.3.7-6) +Description: Common UNIX Printing System(tm) - libs + +Package: libdatrie0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 60 +Maintainer: Theppitak Karoonboonyanan <thep@linux.thai.net> +Architecture: i386 +Source: libdatrie +Version: 0.1.3-2 +Depends: libc6 (>= 2.7-1) +Description: Double-array trie library + +Package: libdb4.6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1248 +Maintainer: Debian Berkeley DB Maintainers <pkg-db-devel@lists.alioth.debian.org> +Architecture: i386 +Source: db4.6 +Version: 4.6.21-11 +Depends: libc6 (>= 2.7-1) +Conflicts: libdb2 (<< 2:2.7.7-3) +Description: Berkeley v4.6 Database Libraries [runtime] + +Package: libdirectfb-1.0-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 2140 +Maintainer: Debian DirectFB Team <pkg-directfb-devel@lists.alioth.debian.org> +Architecture: i386 +Source: directfb +Version: 1.0.1-11 +Depends: libc6 (>= 2.7-1), libsysfs2, libts-0.0-0 (>= 1.0) +Description: direct frame buffer graphics - shared libraries + +Package: libexpat1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 364 +Maintainer: Debian XML/SGML Group <debian-xml-sgml-pkgs@lists.alioth.debian.org> +Architecture: i386 +Source: expat +Version: 2.0.1-4+lenny3 +Depends: libc6 (>= 2.7-1) +Conflicts: wink (<= 1.5.1060-4) +Description: XML parsing C library - runtime library + +Package: libfontconfig1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 336 +Maintainer: Keith Packard <keithp@debian.org> +Architecture: i386 +Source: fontconfig +Version: 2.6.0-3 +Depends: libc6 (>= 2.7-1), libexpat1 (>= 1.95.8), libfreetype6 (>= 2.3.5), zlib1g (>= 1:1.1.4), fontconfig-config (= 2.6.0-3) +Description: generic font configuration library - runtime + +Package: libfreetype6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 672 +Maintainer: Steve Langasek <vorlon@debian.org> +Architecture: i386 +Source: freetype +Version: 2.3.7-2+lenny1 +Replaces: freetype0, freetype1 +Depends: libc6 (>= 2.7-1), zlib1g (>= 1:1.1.4) +Suggests: libfreetype6-dev +Conflicts: freetype, xpdf-reader (<< 1.00-4) +Description: FreeType 2 font engine, shared library files + +Package: libgcc1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 88 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.3 (4.3.2-1.1) +Version: 1:4.3.2-1.1 +Depends: gcc-4.3-base (= 4.3.2-1.1), libc6 (>= 2.7-1) +Description: GCC support library + +Package: libgcrypt11 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 508 +Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Architecture: i386 +Version: 1.4.1-1 +Depends: libc6 (>= 2.7-1), libgpg-error0 (>= 1.4) +Suggests: rng-tools +Description: LGPL Crypto library - runtime library + +Package: libgdbm3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 80 +Maintainer: James Troup <james@nocrew.org> +Architecture: i386 +Source: gdbm +Version: 1.8.3-3 +Depends: libc6 (>= 2.3.6-6) +Description: GNU dbm database routines (runtime version) + +Package: libglib2.0-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 1732 +Maintainer: Loic Minier <lool@dooz.org> +Architecture: i386 +Source: glib2.0 +Version: 2.16.6-3 +Depends: libc6 (>= 2.7-1), libpcre3 (>= 7.4), libselinux1 (>= 2.0.59) +Recommends: libglib2.0-data +Conflicts: libpango1.0-0 (<< 1.11) +Description: The GLib library of C routines + +Package: libgnutls26 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 1100 +Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Architecture: i386 +Source: gnutls26 +Version: 2.4.2-6+lenny2 +Replaces: gnutls0, gnutls0.4, gnutls3 +Depends: libc6 (>= 2.7-1), libgcrypt11 (>= 1.4.0), libgpg-error0 (>= 1.4), libtasn1-3 (>= 0.3.4), zlib1g (>= 1:1.1.4) +Suggests: gnutls-bin +Conflicts: gnutls0, gnutls0.4 +Description: the GNU TLS library - runtime library + +Package: libgpg-error0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 196 +Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org> +Architecture: i386 +Source: libgpg-error +Version: 1.4-2 +Depends: libc6 (>= 2.3.6-6) +Description: library for common error values and messages in GnuPG components + +Package: libgtk2.0-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 5084 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: i386 +Source: gtk+2.0 +Version: 2.12.12-1~lenny2 +Replaces: libgtk2.0-0png3 +Provides: gtk2.0-binver-2.10.0 +Depends: libgtk2.0-common, libatk1.0-0 (>= 1.20.0), libc6 (>= 2.7-1), libcairo2 (>= 1.6.4-6.1), libcomerr2 (>= 1.01), libcups2 (>= 1.3.8), libfontconfig1 (>= 2.4.0), libglib2.0-0 (>= 2.16.0), libgnutls26 (>= 2.4.0-0), libjpeg62, libkrb53 (>= 1.6.dfsg.2), libpango1.0-0 (>= 1.20.3), libpng12-0 (>= 1.2.13-4), libtiff4, libx11-6, libxcomposite1 (>= 1:0.3-1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3 (>= 1:4.0.1), libxi6, libxinerama1, libxrandr2, libxrender1, zlib1g (>= 1:1.1.4) +Recommends: hicolor-icon-theme, libgtk2.0-bin +Suggests: librsvg2-common +Conflicts: celestia (<< 1.2.4-4), eog2 (<< 1.0.1-4), gcin (<< 1.3.4-2), gimp1.3 (<< 1.3.7-1.1), glabels (<< 2.1.3-3), gnome-panel2 (<< 2.0.4-1), gnome-themes (<< 2.6), gtk-im-libthai (<< 0.1.4-3), gtk-qt-engine (<< 1:0.8~svn-rev36-1), gtk2-engines (<< 1:2.8.2-2), gtk2-engines-cleanice (<< 2.4.0-1.1), gtk2-engines-crux (<< 2.6), gtk2-engines-gtk-qt (<< 1:0.7-2), gtk2-engines-highcontrast (<< 2.6), gtk2-engines-industrial (<< 0.2.32-5), gtk2-engines-lighthouseblue (<< 2.6), gtk2-engines-magicchicken (<< 1.1.1-7.1), gtk2-engines-metal (<< 2.2.0-2.1), gtk2-engines-mist (<< 2.6), gtk2-engines-pixbuf (<= 2.10), gtk2-engines-qtpixmap (<< 0.28-1.2), gtk2-engines-redmond95 (<< 2.2.0-2.1), gtk2-engines-smooth (<< 0.5.6-3), gtk2-engines-thinice (<< 2.6), gtk2-engines-ubuntulooks (<= 0.9.11-1), gtk2-engines-wonderland (<< 1.0-4), gtk2-engines-xfce (<< 2.4.0-1), gtk2.0-examples (<< 2.2.0), iiimf-client-gtk (<< 12.3.91-4), iiimgcf (<= 11.4.1870-7.3), imhangul (<< 0.9.13-5), libeel2-2.18, libgdkxft0, libginspx0 (<< 20050529-1.1), libgnomeui-0 (<= 2.14.1-3), libgtk2.0-0png3, librsvg2-common (<= 2.14.4-2), libwmf-dev (<< 0.2.8.4-5), libwmf0.2-7 (<< 0.2.8.4-5), libwxgtk2.6-0 (<< 2.6.3.2.2-1), metacity (<< 1:2.20.0-1), metatheme (<< 0.9.7-3), openoffice.org-core (<< 2.2.1-8), scim-bridge (<= 0.2.4-1), scim-bridge-client-gtk (<< 0.4.10-1.1), scim-gtk2-immodule (<< 1.4.4-8), swf-player (<< 0.3.6-2.3), tamil-gtk2im (<< 2.2-4.4), uim-gtk2.0 (<< 1:1.4.1-3), xfwm4 (<< 4.4.1-3) +Description: The GTK+ graphical user interface library + +Package: libgtk2.0-common +Status: install ok installed +Priority: optional +Section: misc +Installed-Size: 15934 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: all +Source: gtk+2.0 +Version: 2.12.12-1~lenny2 +Replaces: libgtk1.3-common, libgtk2.0-data +Recommends: libgtk2.0-0 +Conflicts: libgtk1.3-common, libgtk2.0-data +Description: Common files for the GTK+ graphical user interface library + +Package: libhunspell-1.2-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 336 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: i386 +Source: hunspell +Version: 1.2.6-1 +Depends: libc6 (>= 2.7-1), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.1.1) +Recommends: myspell-en-us | myspell-dictionary | hunspell-dictionary +Conflicts: openoffice.org-core (= 2.2.0~rc2-1) +Description: spell checker and morphological analyzer (shared library) + +Package: libice6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 140 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libice +Version: 2:1.0.4-1 +Depends: libc6 (>= 2.6-1), x11-common +Description: X11 Inter-Client Exchange library + +Package: libjpeg62 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 164 +Maintainer: Bill Allombert <ballombe@debian.org> +Architecture: i386 +Source: libjpeg6b +Version: 6b-14 +Depends: libc6 (>= 2.6.1-1) +Description: The Independent JPEG Group's JPEG runtime library + +Package: libkeyutils1 +Status: install ok installed +Priority: standard +Section: misc +Installed-Size: 56 +Maintainer: Daniel Baumann <daniel@debian.org> +Architecture: i386 +Source: keyutils +Version: 1.2-9 +Depends: libc6 (>= 2.7-1) +Description: Linux Key Management Utilities (library) + +Package: libkrb53 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 1188 +Maintainer: Sam Hartman <hartmans@debian.org> +Architecture: i386 +Source: krb5 +Version: 1.6.dfsg.4~beta1-5lenny4 +Depends: libc6 (>= 2.7-1), libcomerr2 (>= 1.34), libkeyutils1 +Suggests: krb5-doc, krb5-user +Conflicts: libapache-mod-auth-kerb (<= 4.996-5.0-rc6-2), libapache2-mod-auth-kerb (<= 4.996-5.0-rc6-2), ssh-krb5 (<< 3.8.1p1-10) +Description: MIT Kerberos runtime libraries + +Package: liblcms1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 260 +Maintainer: Oleksandr Moskalenko <malex@debian.org> +Architecture: i386 +Source: lcms +Version: 1.17.dfsg-1+lenny2 +Replaces: liblcms +Provides: liblcms +Depends: libc6 (>= 2.7-1) +Suggests: liblcms-utils +Conflicts: liblcms +Description: Color management library + +Package: liblocale-gettext-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 104 +Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org> +Architecture: i386 +Version: 1.05-4 +Depends: libc6 (>= 2.7-1) +Pre-Depends: perl-base (>= 5.10.0-9), perlapi-5.10.0 +Description: Using libc functions for internationalization in Perl + +Package: libmagic1 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 2412 +Maintainer: Daniel Baumann <daniel@debian.org> +Architecture: i386 +Source: file +Version: 4.26-1 +Depends: libc6 (>= 2.7-1), zlib1g (>= 1:1.1.4) +Suggests: file +Description: File type determination library using "magic" numbers + +Package: libmozjs1d +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 736 +Maintainer: Mike Hommey <glandium@debian.org> +Architecture: i386 +Source: xulrunner +Version: 1.9.0.19-1 +Depends: libc6 (>= 2.7-1), libnspr4-0d (>= 1.8.0.10) +Description: The Mozilla SpiderMonkey JavaScript library + +Package: libncurses5 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 584 +Maintainer: Daniel Baumann <daniel@debian.org> +Architecture: i386 +Source: ncurses +Version: 5.7+20081213-1 +Depends: libc6 (>= 2.7-1) +Recommends: libgpm2 +Description: shared libraries for terminal handling + +Package: libnewt0.52 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 820 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: i386 +Source: newt +Version: 0.52.2-11.3+lenny1 +Replaces: libnewt-utf8, libnewt0, libnewt0.51 +Depends: libc6 (>= 2.7-1), libslang2 (>= 2.0.7-1) +Recommends: libfribidi0 +Conflicts: libnewt0.51 +Description: Not Erik's Windowing Toolkit - text mode windowing with slang + +Package: libnspr4-0d +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 328 +Maintainer: Maintainers of Mozilla-related packages <pkg-mozilla-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: nspr +Version: 4.7.1-5 +Depends: libc6 (>= 2.7-1) +Conflicts: libnspr4, libnspr4-dev (<= 4.7.1-1) +Description: NetScape Portable Runtime Library + +Package: libnss3-1d +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 2292 +Maintainer: Maintainers of Mozilla-related packages <pkg-mozilla-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: nss +Version: 3.12.3.1-0lenny1 +Depends: libc6 (>= 2.7-1), libnspr4-0d (>= 1.8.0.10), libsqlite3-0 (>= 3.5.9), dpkg (<< 1.14.8) | dpkg (>= 1.14.18) +Conflicts: libnss3, libnss3-0d (>= 3.11.5), libnss3-dev (<= 3.12.0~rc3-1) +Description: Network Security Service libraries + +Package: libpango1.0-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 780 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: i386 +Source: pango1.0 +Version: 1.20.5-5+lenny1 +Provides: pango1.0-modver-1.6.0 +Depends: libpango1.0-common (>= 1.20.5-5+lenny1), libc6 (>= 2.7-1), libcairo2 (>= 1.6.4-6.1), libdatrie0 (>= 0.1.2), libfontconfig1 (>= 2.4.0), libfreetype6 (>= 2.3.5), libglib2.0-0 (>= 2.16.0), libthai0 (>= 0.1.9), libx11-6, libxft2 (>> 2.1.1), libxrender1, zlib1g (>= 1:1.1.4) +Conflicts: pango-libthai +Description: Layout and rendering of internationalized text + +Package: libpango1.0-common +Status: install ok installed +Priority: optional +Section: misc +Installed-Size: 204 +Maintainer: Sebastien Bacher <seb128@debian.org> +Architecture: all +Source: pango1.0 +Version: 1.20.5-5+lenny1 +Replaces: libpango-common (<< 1.0.0), libpango0 +Depends: debconf | debconf-2.0, defoma (>= 0.11.1), fontconfig (>= 2.1.91) +Recommends: x-ttcidfont-conf, libpango1.0-0 +Suggests: ttf-kochi-gothic, ttf-kochi-mincho, ttf-thryomanes, ttf-baekmuk, ttf-arphic-gbsn00lp, ttf-arphic-bsmi00lp, ttf-arphic-gkai00mp, ttf-arphic-bkai00mp +Conflicts: pango-libthai (<< 0.1.6-2) +Description: Modules and configuration files for the Pango + +Package: libpcre3 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 356 +Maintainer: Mark Baker <mark@mnb.org.uk> +Architecture: i386 +Source: pcre3 +Version: 7.6-2.1 +Depends: libc6 (>= 2.7-1) +Conflicts: libpcre3-dev (<= 4.3-3) +Description: Perl 5 Compatible Regular Expression Library - runtime files + +Package: libpixman-1-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 220 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: pixman +Version: 0.10.0-2 +Depends: libc6 (>= 2.7-1) +Description: pixel-manipulation library for X and cairo + +Package: libpng12-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 316 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: libpng +Version: 1.2.27-2+lenny3 +Replaces: libpng12-dev (<= 1.2.8rel-7) +Depends: libc6 (>= 2.7-1), zlib1g (>= 1:1.1.4) +Conflicts: libpng12-dev (<= 1.2.8rel-7), mzscheme (<= 1:209-5), pngcrush (<= 1.5.10-2), pngmeta (<= 1.11-3), povray-3.5 (<= 3.5.0c-10), qemacs (<= 0.3.1-5) +Description: PNG library - runtime + +Package: libpopt0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 192 +Maintainer: Paul Martin <pm@debian.org> +Architecture: i386 +Source: popt +Version: 1.14-4 +Replaces: popt +Depends: libc6 (>= 2.7-1) +Conflicts: libpopt-dev (<= 1.4-1), popt, rpm (<= 4.0.2-3) +Description: lib for parsing cmdline parameters + +Package: libreadline5 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 320 +Maintainer: Matthias Klose <doko@debian.org> +Architecture: i386 +Source: readline5 +Version: 5.2-3.1 +Depends: readline-common, libc6 (>= 2.7-1), libncurses5 (>= 5.6+20071006-3) +Description: GNU readline and history libraries, run-time libraries + +Package: libselinux1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 148 +Maintainer: Manoj Srivastava <srivasta@debian.org> +Architecture: i386 +Source: libselinux +Version: 2.0.65-5 +Depends: libc6 (>= 2.7-1) +Description: SELinux shared libraries + +Package: libslang2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1104 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: i386 +Source: slang2 +Version: 2.1.3-3 +Depends: libc6 (>= 2.7-1) +Recommends: libpng12-0 +Description: The S-Lang programming library - runtime version + +Package: libsm6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 84 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libsm +Version: 2:1.0.3-2 +Depends: libc6 (>= 2.7-1), libice6 (>= 1:1.0.0), x11-common +Description: X11 Session Management library + +Package: libsqlite3-0 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 468 +Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.hu> +Architecture: i386 +Source: sqlite3 +Version: 3.5.9-6 +Depends: libc6 (>= 2.7-1) +Description: SQLite 3 shared library + +Package: libstartup-notification0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Ondřej Surý <ondrej@debian.org> +Architecture: i386 +Source: startup-notification +Version: 0.9-1 +Depends: libc6 (>= 2.3.6-6), libice6 (>= 1:1.0.0), libsm6, libx11-6 +Description: library for program launch feedback (shared library) + +Package: libstdc++6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1168 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-4.3 +Version: 4.3.2-1.1 +Depends: gcc-4.3-base (= 4.3.2-1.1), libc6 (>= 2.7-1), libgcc1 (>= 1:4.1.1) +Conflicts: scim (<< 1.4.2-1) +Description: The GNU Standard C++ Library v3 + +Package: libsysfs2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 112 +Maintainer: Martin Pitt <mpitt@debian.org> +Architecture: i386 +Source: sysfsutils +Version: 2.1.0-5 +Depends: libc6 (>= 2.7-1) +Description: interface library to sysfs + +Package: libtasn1-3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 164 +Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Architecture: i386 +Version: 1.4-1 +Depends: libc6 (>= 2.7-1) +Conflicts: libtasn1-2 (= 0.3.1-1) +Description: Manage ASN.1 structures (runtime) + +Package: libtext-charwidth-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 36 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: libtext-charwidth-perl (0.04-5) +Version: 0.04-5+b1 +Depends: libc6 (>= 2.7-1), perl-base (>= 5.10.0-9), perlapi-5.10.0 +Description: get display widths of characters on the terminal + +Package: libtext-iconv-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 44 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: i386 +Source: libtext-iconv-perl (1.7-1) +Version: 1.7-1+b1 +Depends: libc6 (>= 2.7-1), perl-base (>= 5.10.0-9), perlapi-5.10.0 +Description: converts between character sets in Perl + +Package: libtext-wrapi18n-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 28 +Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Architecture: all +Version: 0.06-6 +Depends: libtext-charwidth-perl +Description: internationalized substitute of Text::Wrap + +Package: libthai-data +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 340 +Maintainer: Theppitak Karoonboonyanan <thep@linux.thai.net> +Architecture: all +Source: libthai +Version: 0.1.9-4+lenny1 +Description: Data files for Thai language support library + +Package: libthai0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 100 +Maintainer: Theppitak Karoonboonyanan <thep@linux.thai.net> +Architecture: i386 +Source: libthai +Version: 0.1.9-4+lenny1 +Depends: libc6 (>= 2.7-1), libdatrie0 (>= 0.1.2), libthai-data +Description: Thai language support library + +Package: libtiff4 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 456 +Maintainer: Jay Berkenbilt <qjb@debian.org> +Architecture: i386 +Source: tiff +Version: 3.8.2-11.2 +Depends: libc6 (>= 2.7-1), libjpeg62, zlib1g (>= 1:1.1.4) +Description: Tag Image File Format (TIFF) library + +Package: libts-0.0-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 108 +Maintainer: Neil Williams <codehelp@debian.org> +Architecture: i386 +Source: tslib +Version: 1.0-4 +Replaces: libts0, tslib +Provides: libts0, tslib +Depends: libc6 (>= 2.7-1) +Conflicts: libts0, tslib +Description: touch screen library + +Package: libx11-6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 1240 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libx11 +Version: 2:1.1.5-2 +Depends: libc6 (>= 2.7-1), libxcb-xlib0, libxcb1, libx11-data +Conflicts: xlibs-data (<< 1:7.0.0) +Description: X11 client-side library + +Package: libx11-data +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 3108 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: libx11 +Version: 2:1.1.5-2 +Replaces: libx11-6 (<= 2:1.0.0-1) +Description: X11 client-side library + +Package: libxau6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxau +Version: 1:1.0.3-3 +Depends: libc6 (>= 2.7-1) +Description: X11 authorisation library + +Package: libxcb-render-util0 +Status: install ok installed +Priority: extra +Section: libs +Installed-Size: 40 +Maintainer: Julien Danjou <acid@debian.org> +Architecture: i386 +Source: xcb-util +Version: 0.2.1+git1-1 +Depends: libc6 (>= 2.7-1), libxcb-render0, libxcb1 +Description: utility libraries for X C Binding -- render-util + +Package: libxcb-render0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 88 +Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Architecture: i386 +Source: libxcb +Version: 1.1-1.2 +Depends: libc6 (>= 2.7-1), libxcb1 +Description: X C Binding, render extension + +Package: libxcb-xlib0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 68 +Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Architecture: i386 +Source: libxcb +Version: 1.1-1.2 +Depends: libc6 (>= 2.7-1), libxcb1 +Description: X C Binding, Xlib/XCB interface library + +Package: libxcb1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 160 +Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Architecture: i386 +Source: libxcb +Version: 1.1-1.2 +Depends: libc6 (>= 2.7-1), libxau6, libxdmcp6 +Description: X C Binding + +Package: libxcomposite1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 60 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxcomposite +Version: 1:0.4.0-3 +Depends: libc6 (>= 2.7-1), libx11-6, libxext6, libxfixes3 (>= 1:4.0.1) +Description: X11 Composite extension library + +Package: libxcursor1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 80 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxcursor +Version: 1:1.1.9-1 +Depends: libc6 (>= 2.6-1), libx11-6, libxfixes3 (>= 1:4.0.1), libxrender1 +Description: X cursor management library + +Package: libxdamage1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 60 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxdamage +Version: 1:1.1.1-4 +Depends: libc6 (>= 2.7-1), libx11-6, libxfixes3 (>= 1:4.0.1) +Description: X11 damaged region extension library + +Package: libxdmcp6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 76 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxdmcp +Version: 1:1.0.2-3 +Depends: libc6 (>= 2.7-1) +Description: X11 Display Manager Control Protocol library + +Package: libxext6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 184 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxext +Version: 2:1.0.4-2 +Depends: libc6 (>= 2.7-1), libx11-6, libxau6, x11-common +Description: X11 miscellaneous extension library + +Package: libxfixes3 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxfixes +Version: 1:4.0.3-2 +Depends: libc6 (>= 2.3.6-6), libx11-6 +Pre-Depends: x11-common (>= 1:7.0.0) +Description: X11 miscellaneous 'fixes' extension library + +Package: libxft2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 132 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: xft +Version: 2.1.12-3 +Depends: libc6 (>= 2.7-1), libfontconfig1 (>= 2.4.0), libfreetype6 (>= 2.3.5), libx11-6, libxrender1, zlib1g (>= 1:1.1.4) +Description: FreeType-based font drawing library for X + +Package: libxi6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 148 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxi +Version: 2:1.1.4-1 +Depends: libc6 (>= 2.7-1), libx11-6, libxext6, x11-common +Description: X11 Input extension library + +Package: libxinerama1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 60 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxinerama +Version: 2:1.0.3-2 +Depends: libc6 (>= 2.7-1), libx11-6, libxext6 +Description: X11 Xinerama extension library + +Package: libxrandr2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 84 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxrandr +Version: 2:1.2.3-1 +Depends: libc6 (>= 2.7-1), libx11-6, libxext6, libxrender1 +Description: X11 RandR extension library + +Package: libxrender1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 88 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxrender +Version: 1:0.9.4-2 +Depends: libc6 (>= 2.7-1), libx11-6 +Description: X Rendering Extension client library + +Package: libxt6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 380 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: libxt +Version: 1:1.0.5-3 +Depends: libc6 (>= 2.5-5), libice6 (>= 1:1.0.0), libsm6, libx11-6 +Pre-Depends: x11-common (>= 1:7.0.0) +Description: X11 toolkit intrinsics library + +Package: lsb-base +Status: install ok installed +Priority: required +Section: misc +Installed-Size: 72 +Maintainer: Chris Lawrence <lawrencc@debian.org> +Architecture: all +Source: lsb +Version: 3.2-20 +Replaces: lsb (<< 2.0-6), lsb-core (<< 2.0-6) +Depends: sed, ncurses-bin +Conflicts: lsb (<< 2.0-6), lsb-core (<< 2.0-6) +Description: Linux Standard Base 3.2 init script functionality + +Package: lzma +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 124 +Maintainer: Mohammed Adnène Trojette <adn+deb@diwi.org> +Architecture: i386 +Version: 4.43-14 +Depends: libc6 (>= 2.7-1), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.2.1) +Description: Compression method of 7z format in 7-Zip program + +Package: ncurses-bin +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 480 +Maintainer: Daniel Baumann <daniel@debian.org> +Architecture: i386 +Source: ncurses +Version: 5.7+20081213-1 +Provides: tput +Pre-Depends: libc6 (>= 2.7-1), libncurses5 (>= 5.6+20071006-3) +Conflicts: ncurses, tput +Description: terminal-related programs and man pages + +Package: perl-base +Essential: yes +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 4316 +Maintainer: Brendan O'Dea <bod@debian.org> +Architecture: i386 +Source: perl +Version: 5.10.0-19lenny2 +Replaces: libclass-multimethods-perl (<< 1.70-4), libperl5.8 (<< 5.8.0-20), libscalar-list-utils-perl, libxsloader-perl, perl (<= 5.10.0-9), perl-modules (<< 5.10.0-12) +Provides: libscalar-list-utils-perl, libxsloader-perl, perl5-base, perlapi-5.10.0 +Pre-Depends: libc6 (>= 2.7-1), dpkg (>= 1.14.20) +Suggests: perl +Conflicts: autoconf2.13 (<< 2.13-45), findimagedupes (<< 2.11-2), icheck (<< 0.9.7-6.1), libcflow-perl (<< 1:0.68-11.1), libclass-methodmaker-perl (<< 2.10-1), libclearsilver-perl (<< 0.10.4-1.1), libcrypt-openssl-bignum-perl (<< 0.04-1), libcrypt-openssl-dsa-perl (<< 0.13-3), libcrypt-openssl-random-perl (<< 0.04-1), libcrypt-openssl-rsa-perl (<< 0.25-1), libhamlib2-perl (<< 1.2.6.2-6), libqt-perl (<< 3.008-3), libscalar-list-utils-perl (<< 1:1.18-1), libsufary-perl (<< 2.1.1-8), libsys-cpu-perl (<< 0.40-2.1), libterm-size-perl (<< 0.2-4), libvideo-ivtv-perl (<< 0.13-6), libxsloader-perl (<< 0.08-1), megahal (<< 9.1.1a-5), razor (<< 1:2.84-6) +Description: minimal Perl system + +Package: perl-modules +Status: install ok installed +Priority: standard +Section: perl +Installed-Size: 14520 +Maintainer: Brendan O'Dea <bod@debian.org> +Architecture: all +Source: perl +Version: 5.10.0-19lenny2 +Replaces: libansicolor-perl, libarchive-tar-perl, libattribute-handlers-perl, libcgi-pm-perl, libcpanplus-perl, libextutils-cbuilder-perl, libextutils-parsexs-perl, libfile-temp-perl, libi18n-langtags-perl, libio-zlib-perl, liblocale-codes-perl, liblocale-maketext-perl, liblocale-maketext-simple-perl, libmath-bigint-perl, libmodule-build-perl, libmodule-corelist-perl, libmodule-load-conditional-perl, libmodule-load-perl, libmodule-pluggable-perl, libnet-perl, libnet-ping-perl, libparams-check-perl, libpod-parser-perl, libpod-simple-perl, libtest-harness-perl, libtest-simple-perl, libversion-perl, podlators-perl +Provides: libansicolor-perl, libarchive-tar-perl, libattribute-handlers-perl, libcgi-pm-perl, libcpanplus-perl, libextutils-cbuilder-perl, libextutils-parsexs-perl, libfile-temp-perl, libi18n-langtags-perl, libio-zlib-perl, liblocale-codes-perl, liblocale-maketext-perl, liblocale-maketext-simple-perl, libmath-bigint-perl, libmodule-build-perl, libmodule-corelist-perl, libmodule-load-conditional-perl, libmodule-load-perl, libmodule-pluggable-perl, libnet-perl, libnet-ping-perl, libparams-check-perl, libpod-parser-perl, libpod-simple-perl, libtest-harness-perl, libtest-simple-perl, libversion-perl, podlators-perl +Depends: perl (>= 5.10.0-1) +Conflicts: libansicolor-perl (<< 1.10-1), libarchive-tar-perl (<= 1.38-2), libattribute-handlers-perl (<< 0.78.02-1), libcgi-pm-perl (<< 3.15-1), libcpanplus-perl (<< 0.83.09-1), libextutils-cbuilder-perl (<< 0.21-1), libextutils-parsexs-perl (<= 2.18), libfile-temp-perl (<< 0.18), libi18n-langtags-perl (<< 0.35-1), libio-zlib-perl (<< 1.07-1), liblocale-codes-perl (<< 2.06.1-1), liblocale-maketext-perl (<< 1.08-1), liblocale-maketext-simple-perl (<< 0.18-1), libmath-bigint-perl (<< 1.77-1), libmodule-build-perl (<< 0.2808.1-1), libmodule-corelist-perl (<< 2.13-1), libmodule-load-conditional-perl (<< 0.22-1), libmodule-load-perl (<< 0.12-1), libmodule-pluggable-perl (<< 3.6-1), libnet-perl (<= 1:1.19-3), libnet-ping-perl (<< 2.31-1), libparams-check-perl (<< 0.26-1), libpod-parser-perl (<< 1.32-1), libpod-simple-perl (<< 3.05-2), libtest-harness-perl (<< 2.56-1), libtest-simple-perl (<< 0.62-1), libversion-perl (<< 1:0.7400-2), podlators-perl (<< 2.2.0) +Description: Core Perl modules +Build-Essential: yes + +Package: perl +Status: install ok installed +Priority: standard +Section: perl +Installed-Size: 13524 +Maintainer: Brendan O'Dea <bod@debian.org> +Architecture: i386 +Version: 5.10.0-19lenny2 +Replaces: libarchive-tar-perl (<= 1.38-2), libdigest-md5-perl, libdigest-sha-perl, libmime-base64-perl, libmodule-corelist-perl (<< 2.14-2), libstorable-perl, libtime-hires-perl, libtime-piece-perl, perl-base (<< 5.8.8-1), perl-doc (<< 5.8.0-1), perl-modules (<< 5.8.1-1) +Provides: data-dumper, libdigest-md5-perl, libdigest-sha-perl, libmime-base64-perl, libstorable-perl, libtime-hires-perl, libtime-piece-perl, perl5 +Depends: perl-base (= 5.10.0-19lenny2), perl-modules (>= 5.10.0-19lenny2), libc6 (>= 2.7-1), libdb4.6, libgdbm3 +Recommends: netbase +Suggests: perl-doc, libterm-readline-gnu-perl | libterm-readline-perl-perl +Conflicts: libdigest-md5-perl (<< 3.07-1), libdigest-sha-perl (<< 5.45-1), libmime-base64-perl (<< 3.07-1), libstorable-perl (<< 2.15-1), libtime-hires-perl (<< 1.86-1), libtime-piece-perl (<< 1.12-1), perl-doc (<< 5.10.0-1) +Description: Larry Wall's Practical Extraction and Report Language +Build-Essential: yes + +Package: readline-common +Status: install ok installed +Priority: important +Section: utils +Installed-Size: 136 +Maintainer: Matthias Klose <doko@debian.org> +Architecture: all +Source: readline5 +Version: 5.2-3.1 +Replaces: libreadline-common, libreadline4 (<< 4.3-16), libreadline5 (<< 5.0-11) +Conflicts: libreadline-common, libreadline5 (<< 5.0-11) +Description: GNU readline and history libraries, common files + +Package: sed +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 628 +Maintainer: Clint Adams <schizo@debian.org> +Architecture: i386 +Version: 4.1.5-6 +Replaces: ssed (<< 3.59) +Pre-Depends: libc6 (>= 2.7-1) +Description: The GNU sed stream editor + +Package: ttf-dejavu-core +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 2488 +Maintainer: Debian Fonts Task Force <pkg-fonts-devel@lists.alioth.debian.org> +Architecture: all +Source: ttf-dejavu +Version: 2.25-3 +Replaces: ttf-dejavu (<< 2.20-1) +Depends: defoma +Conflicts: ttf-dejavu (<< 2.20-1) +Description: Vera font family derivative with additional characters + +Package: ttf-dejavu-extra +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 5504 +Maintainer: Debian Fonts Task Force <pkg-fonts-devel@lists.alioth.debian.org> +Architecture: all +Source: ttf-dejavu +Version: 2.25-3 +Replaces: ttf-dejavu (<< 2.20-1) +Depends: defoma, ttf-dejavu-core +Conflicts: ttf-dejavu (<< 2.20-1) +Description: Vera font family derivative with additional characters + +Package: ttf-dejavu +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 68 +Maintainer: Debian Fonts Task Force <pkg-fonts-devel@lists.alioth.debian.org> +Architecture: all +Version: 2.25-3 +Depends: ttf-dejavu-core, ttf-dejavu-extra +Conflicts: ttf-dejavu (<< 2.20-1) +Description: Metapackage to pull in ttf-dejavu-core and ttf-dejavu-extra +Task: bulgarian-desktop, hungarian-desktop, kurdish-desktop, macedonian-desktop, romanian-desktop, ukrainian-desktop + +Package: ucf +Status: install ok installed +Priority: standard +Section: utils +Installed-Size: 256 +Maintainer: Manoj Srivastava <srivasta@debian.org> +Architecture: all +Version: 3.0016 +Depends: debconf (>= 1.5.19), coreutils (>= 5.91) +Description: Update Configuration File: preserve user changes to config files. + +Package: whiptail +Status: install ok installed +Priority: important +Section: utils +Installed-Size: 96 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: i386 +Source: newt +Version: 0.52.2-11.3+lenny1 +Replaces: newt0.10, newt0.21 (<< 0.21-4), whiptail-utf8 +Provides: whiptail-provider, whiptail-utf8 +Depends: libc6 (>= 2.7-1), libnewt0.52 (>= 0.52.2), libpopt0 (>= 1.14), libslang2 (>= 2.0.7-1) +Conflicts: whiptail-provider +Description: Displays user-friendly dialog boxes from shell scripts + +Package: x11-common +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 696 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: all +Source: xorg +Version: 1:7.3+20 +Replaces: x-common, xfree86-common, xorg-common, xserver-common (<< 7) +Depends: debconf (>= 0.5) | debconf-2.0, debianutils (>= 1.13), lsb-base (>= 1.3-9ubuntu2) +Pre-Depends: debconf | debconf-2.0 +Conflicts: aee (<= 2.2.15b-1), ascd (<= 0.13.2-3), beaver (<= 0.2.5-2), bibview (<= 2.2-8), bugsx (<= 1.08-8), buici-clock (<= 0.4.5+b1), communicator-smotif-477, ctwm (<= 3.7-2), emelfm (<= 0.9.2-7), epan, fte-xwindow (<= 0.50.0-1.3), fvwm1 (<= 1.24r-46), fvwm95 (<= 2.0.43ba-23+b1), gerstensaft (<= 0.2-5.1), ghostview, gipsc (<= 0.4.3-2), grace (<= 1:5.1.18-1), grace6 (<= 5.99.0+final-4), gradio (<= 1.0.1-6), groff (<= 1.18.1.1-7), guitar (<= 0.1.4-11), hamsoft (<< 0.2.3-1), hanterm-classic (<= 3.1.6.0-4), hanterm-xf (<= 1:3.3.1p18-9.2), hfsutils-tcltk (<= 3.2.6-7), ibp (<= 0.21-4), isdnutils-xtools (<= 1:3.8.2005-12-06-4), ivtools-bin (<= 1.1.3-5), ivtools-dev (<= 1.1.3-5), kdrill (<= 6.4-2.1), kinput2-canna (<= 3.1-7), kinput2-canna-wnn (<= 3.1-7), kinput2-wnn (<= 3.1-7), kterm (<= 6.2.0-45), lbxproxy (<< 7.0), libmotif-dev (<= 2.2.3-1.3), libxft-dev (<= 2.1.8.2-5), lm-batmon (<= 0.96-3), login.app (<= 1.2.1-18), lsb-core (<= 3.1-4), lwm (<= 1.2.1-1), mctools-lite (<= 970129-16), mgp (<= 1.11b-6), motif-clients (<= 2.2.3-1.3), navigator-smotif-477, netscape-base-4, olvwm (<= 4.4.3.2p1.4-21), olwm (<= 3.2p1.4-21), oneko (<= 1.2.sakura.6-1), opera (<< 9.10-20060616), pgaccess (<= 1:0.98.8.20030520-2), phototk, pixmap (<= 2.6pl4-14.1), plotmtv (<= 1.4.4t-8.1), pmud (<= 0.10-9), ppxp (<= 0.2001080415-14), ppxp-x11 (<= 0.2001080415-14), procmeter (<= 2.5.1-11), propsel (<= 971130-5.3), proxymngr (<< 7.0), qcam (<= 0.91-11.1), regexplorer (<= 0.1.6-12), seyon (<= 2.20c-20), skkinput (<= 1:2.06.4-4), stella (<< 2.2-1), tkdesk (<= 2.0-5), tkseti (<= 3.06-1), tkworld, twlog (<= 1.3-4), twm (<< 7.0), ucbmpeg-play (<< 2.3p-13), vide (<= 1.21-3), videogen (<= 0.32-1), vtwm (<= 5.4.7-2), w9wm (<= 0.4.2-4), wdm (<= 1.28-1), wily (<= 0.13.41-6), wmavgload (<= 0.7.0-6.1), wmcpu (<= 1.3-4.1), wmdate (<= 0.5-7.1), wmnet (<= 1.05-12), wmnetselect (<= 0.85-5.5), wmscope (<= 3.0-9.1), wmsensors (<= 1.0.4-3.4), wmtv (<= 0.6.5-15), x-common, xautolock (<= 1:2.1-6), xbanner (<= 1.31-23), xbase-clients (<< 1:7.0), xbatt (<= 1.2.1-4), xbattbar (<= 1.4.2-3.1), xcal (<= 4.1-18.2), xcalendar-i18n (<= 4.0.0.i18p1-13.1), xcb (<= 2.4-4), xclip (<= 0.08-5), xclips (<= 6.21-6), xcolors (<= 1.5a-2), xcolorsel (<= 1.1a-11), xdkcal (<= 0.9d-2.1), xdm (<= 1:1.0.1-6), xdmx (<< 1:1.0), xdu (<= 3.0-14), xearth (<= 1.1-10.2), xengine (<= 1.11-9), xephem (<= 3.4-5), xext, xezmlm (<= 1.0.3-11), xfaces (<= 3.3-25), xfishtank (<= 2.2-23.1), xfm (<= 1.4.3-8), xfractint (<< 20.3.01-1), xfree86-common, xfs (<< 1:1.0), xfs-xtt (<= 1:1.4.1.xf430-6), xftp, xfwp (<< 7.0), xgdipc (<= 1.2-0.3), xgmod (<= 3.1-9), xgobi, xgraph (<= 12.1-3), xinput (<= 1.2-5.2), xipmsg (<= 0.8088-1.1), xisp, xlbiff (<< 4.1-4), xli (<= 1.17.0-21), xlockmore (<= 1:5.21-1), xlockmore-gl (<= 1:5.21-1), xlogmaster (<= 1.6.0-8), xmailbox (<= 2.5-9), xmem (<= 1.20-19), xmeter (<= 1.15-6), xmh (<= 6.8.2.dfsg.1-4), xmix (<= 2.1-5), xmon (<= 1.5.6-1.3), xnecview (<= 1.34-2), xnest (<< 1:1.0), xodo (<= 1.2-9.2), xorg-common, xpaste, xpmumon (<= 1.3.0), xpostit (<= 3.3.1-8.2), xpostitplus, xprint (<= 1:0.1.0.alpha1-13), xrn (<= 9.02-7.1), xserver-common (<< 7), xserver-xfree86 (<< 1:7.0), xserver-xfree86-dbg, xserver-xorg (<< 1:7.3+11), xslideshow (<= 3.1-8.1), xsysinfo (<= 1.7-2), xtel (<= 3.3.0-5.4), xterm (<< 208-1), xtoolwait (<= 1.3-6), xtrkcad (<= 3.1.4-1), xtrlock (<= 2.0-11), xturqstat (<= 2.2.2sarge1), xutils (<< 1:7.0), xv (<= 3.10a-26), xvfb (<< 1:1.0), xview-clients (<= 3.2p1.4-21), xviewg (<= 3.2p1.4-21), xviewg-dev (<= 3.2p1.4-21), xvkbd (<= 2.6-2.1), xwit (<= 3.4-6), xxkb (<= 1.10-2.1), xzoom (<= 0.3-17), yank (<= 0.2.1-7.2) +Description: X Window System (X.Org) infrastructure + +Package: xulrunner-1.9 +Status: install ok installed +Priority: optional +Section: devel +Installed-Size: 17800 +Maintainer: Mike Hommey <glandium@debian.org> +Architecture: i386 +Source: xulrunner +Version: 1.9.0.19-1 +Replaces: xulrunner-1.9-common +Depends: libatk1.0-0 (>= 1.20.0), libbz2-1.0, libc6 (>= 2.7-1), libcairo2 (>= 1.6.0), libfontconfig1 (>= 2.4.0), libfreetype6 (>= 2.3.5), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.16.0), libgtk2.0-0 (>= 2.12.0), libhunspell-1.2-0 (>= 1.2.4), libjpeg62, liblcms1 (>= 1.15-1), libmozjs1d (>= 1.9.0.15), libnspr4-0d (>> 4.7.1-1), libnss3-1d (>= 3.12.3), libpango1.0-0 (>= 1.20.3), libpng12-0 (>= 1.2.13-4), libreadline5 (>= 5.2), libsqlite3-0 (>= 3.5.9), libstartup-notification0 (>= 0.8-1), libstdc++6 (>= 4.1.1), libx11-6, libxrender1, libxt6, zlib1g (>= 1:1.1.4) +Suggests: xulrunner-1.9-gnome-support +Conflicts: j2re1.4, pango-graphite +Description: XUL + XPCOM application runner + +Package: zlib1g +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 128 +Maintainer: Mark Brown <broonie@debian.org> +Architecture: i386 +Source: zlib +Version: 1:1.2.3.3.dfsg-12 +Provides: libz1 +Depends: libc6 (>= 2.7-1) +Conflicts: zlib1 (<= 1:1.0.4-7) +Description: compression library - runtime + diff --git a/test/integration/status-bug-598669-install-postfix-gets-exim-heavy b/test/integration/status-bug-598669-install-postfix-gets-exim-heavy new file mode 100644 index 0000000..fcf21dc --- /dev/null +++ b/test/integration/status-bug-598669-install-postfix-gets-exim-heavy @@ -0,0 +1,30 @@ +Package: exim4-daemon-light +Status: install ok installed +Priority: standard +Section: mail +Installed-Size: 952 +Maintainer: Exim4 Maintainers <pkg-exim4-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: exim4 +Version: 4.72-1 +Replaces: mail-transport-agent +Provides: mail-transport-agent +Conflicts: mail-transport-agent +Filename: pool/main/e/exim4/exim4-daemon-light_4.72-1_i386.deb +Size: 459500 +MD5sum: f32ccafef44bed2efcd526cd6501307d +Description: lightweight Exim MTA (v4) daemon + +Package: exim4 +Status: install ok installed +Priority: standard +Section: mail +Installed-Size: 60 +Maintainer: Exim4 Maintainers <pkg-exim4-maintainers@lists.alioth.debian.org> +Architecture: all +Version: 4.72-1 +Depends: exim4-daemon-light | exim4-daemon-heavy +Filename: pool/main/e/exim4/exim4_4.72-1_all.deb +Size: 7738 +MD5sum: 2f473b82bbabac9718ff3e755eaf85c1 +Description: metapackage to ease Exim MTA (v4) installation diff --git a/test/integration/status-bug-601961-install-info b/test/integration/status-bug-601961-install-info new file mode 100644 index 0000000..c43cffa --- /dev/null +++ b/test/integration/status-bug-601961-install-info @@ -0,0 +1,42 @@ +Package: dpkg +Status: install ok installed +Essential: yes +Priority: required +Section: admin +Installed-Size: 6432 +Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> +Architecture: i386 +Version: 1.15.8.5 +Description: Debian package management system + +Package: findutils +Status: install ok installed +Essential: yes +Priority: required +Section: utils +Installed-Size: 1704 +Maintainer: Andreas Metzler <ametzler@debian.org> +Architecture: i386 +Version: 4.4.2-1+b1 +Depends: dpkg (>= 1.15.4) | install-info, essentialpkg +Description: utilities for finding files--find, xargs + +Package: install-info +Status: install ok installed +Priority: important +Section: doc +Installed-Size: 256 +Maintainer: Debian TeX maintainers <debian-tex-maint@lists.debian.org> +Architecture: i386 +Version: 4.13a.dfsg.1-6 +Description: Manage installed documentation in info format + +Package: essentialpkg +Status: install ok installed +Priority: important +Section: other +Installed-Size: 256 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: i386 +Version: 4.13a.dfsg.1-6 +Description: ultra hypercool important package diff --git a/test/integration/status-bug-605394-versioned-or-groups b/test/integration/status-bug-605394-versioned-or-groups new file mode 100644 index 0000000..3ac9c30 --- /dev/null +++ b/test/integration/status-bug-605394-versioned-or-groups @@ -0,0 +1,34 @@ +Package: apache2-mpm-worker +Status: install ok installed +Priority: optional +Section: httpd +Installed-Size: 68 +Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org> +Architecture: i386 +Source: apache2 +Version: 2.2.16-4 +Provides: apache2-mpm +Conflicts: apache2-mpm +Description: Apache HTTP Server - high speed threaded model + +Package: php5-cgi +Status: install ok installed +Priority: optional +Section: php +Installed-Size: 14672 +Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org> +Architecture: i386 +Source: php5 +Version: 5.3.3-3 +Description: server-side, HTML-embedded scripting language (CGI binary) + +Package: php5 +Status: install ok installed +Priority: optional +Section: php +Installed-Size: 20 +Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org> +Architecture: all +Version: 5.3.3-3 +Depends: libapache2-mod-php5 (>= 5.3.3-3) | libapache2-mod-php5filter (>= 5.3.3-3) | php5-cgi (>= 5.3.3-3) +Description: server-side, HTML-embedded scripting language (metapackage) diff --git a/test/integration/status-bug-612557-garbage-upgrade b/test/integration/status-bug-612557-garbage-upgrade new file mode 100644 index 0000000..7403d8c --- /dev/null +++ b/test/integration/status-bug-612557-garbage-upgrade @@ -0,0 +1,34 @@ +Package: python-uno +Status: install ok installed +Priority: optional +Section: python +Installed-Size: 2032 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: i386 +Source: openoffice.org +Version: 1:3.2.1-11+squeeze2 +Description: Python-UNO bridge + +Package: openoffice.org-common +Status: install ok installed +Priority: optional +Section: editors +Installed-Size: 48356 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: all +Source: openoffice.org +Version: 1:3.2.1-11+squeeze2 +Description: office productivity suite -- arch-independent files + +Package: openoffice.org-emailmerge +Status: install ok installed +Priority: optional +Section: editors +Installed-Size: 1652 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: all +Source: openoffice.org +Version: 1:3.2.1-11+squeeze2 +Replaces: python-uno (<< 1:2.4.1-5) +Pre-Depends: python-uno, openoffice.org-common +Description: office productivity suite -- email mail merge diff --git a/test/integration/status-bug-613420-new-garbage-dependency b/test/integration/status-bug-613420-new-garbage-dependency new file mode 100644 index 0000000..166a393 --- /dev/null +++ b/test/integration/status-bug-613420-new-garbage-dependency @@ -0,0 +1,22 @@ +Package: openoffice.org-officebean +Status: install ok installed +Priority: optional +Section: java +Installed-Size: 1656 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: i386 +Source: openoffice.org +Version: 1:3.2.1-11+squeeze2 +Depends: openoffice.org-core (= 1:3.2.1-11+squeeze2) +Description: office productivity suite -- Java bean + +Package: openoffice.org-core +Status: install ok installed +Priority: optional +Section: editors +Installed-Size: 121724 +Maintainer: Debian OpenOffice Team <debian-openoffice@lists.debian.org> +Architecture: i386 +Source: openoffice.org +Version: 1:3.2.1-11+squeeze2 +Description: office productivity suite -- arch-dependent files diff --git a/test/integration/status-bug-723705-tagfile-truncates-fields b/test/integration/status-bug-723705-tagfile-truncates-fields new file mode 100644 index 0000000..fe18506 --- /dev/null +++ b/test/integration/status-bug-723705-tagfile-truncates-fields @@ -0,0 +1,62 @@ +Package: libc6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 10164 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Architecture: amd64 +Multi-Arch: same +Source: eglibc (2.17-92) +Version: 2.17-92+b1 +Replaces: libc6-amd64 +Provides: glibc-2.17-1 +Suggests: glibc-doc, debconf | debconf-2.0, locales +Breaks: locales (<< 2.17), locales-all (<< 2.17), lsb-core (<= 3.2-27), nscd (<< 2.17) +Conflicts: prelink (<= 0.0.20090311-1), tzdata (<< 2007k-1), tzdata-etch +Conffiles: + /etc/ld.so.conf.d/x86_64-linux-gnu.conf 593ad12389ab2b6f952e7ede67b8fbbf +Description: Embedded GNU C Library: Shared libraries + Contains the standard libraries that are used by nearly all programs on + the system. This package includes shared versions of the standard C library + and the standard math library, as well as many others. +Homepage: http://www.eglibc.org + +Package: libnewt0.52 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 820 +Maintainer: Alastair McKinstry <mckinstry@debian.org> +Architecture: amd64 +Multi-Arch: same +Source: newt +Version: 0.52.15-3 +Recommends: libfribidi0 +Conffiles: + /etc/newt/palette.original d41d8cd98f00b204e9800998ecf8427e +Description: Not Erik's Windowing Toolkit - text mode windowing with slang + Newt is a windowing toolkit for text mode built from the slang library. + It allows color text mode applications to easily use stackable windows, + push buttons, check boxes, radio buttons, lists, entry fields, labels, + and displayable text. Scrollbars are supported, and forms may be nested + to provide extra functionality. This package contains the shared library + for programs that have been built with newt. +Homepage: https://fedorahosted.org/newt/ + +Package: libgcc1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 128 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: amd64 +Multi-Arch: same +Source: gcc-4.8 (4.8.1-10) +Version: 1:4.8.1-10 +Breaks: gcc-4.1, gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2) +Description: GCC support library + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +Homepage: http://gcc.gnu.org/ + diff --git a/test/integration/status-bug-lp1347721-dpkg-ordering b/test/integration/status-bug-lp1347721-dpkg-ordering new file mode 100644 index 0000000..62e545c --- /dev/null +++ b/test/integration/status-bug-lp1347721-dpkg-ordering @@ -0,0 +1,1942 @@ +Package: libustr-1.0-1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 261 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: ustr +Version: 1.0.4-3ubuntu2 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Description: Micro string library: shared library + ustr (Micro string library) is a string API for C. It has tiny overhead over + just plain strdup(), is much safer, is easier to use, is faster for many + operations, can be used with read-only or automatically allocated data. You + don't even need to link to the library to use it (so there are no + dependencies). + . + This package contains the shared library for ustr. +Homepage: http://www.and.org/ustr/ +Original-Maintainer: Vaclav Ovsik <vaclav.ovsik@i.cz> + +Package: debconf +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 609 +Maintainer: Colin Watson <cjwatson@ubuntu.com> +Architecture: all +Multi-Arch: foreign +Version: 1.5.53ubuntu1 +Replaces: debconf-tiny +Provides: debconf-2.0 +Pre-Depends: perl-base (>= 5.6.1-4) +Recommends: apt-utils (>= 0.5.1), debconf-i18n +Suggests: debconf-doc, debconf-utils, whiptail | dialog | gnome-utils, libterm-readline-gnu-perl, libgtk2-perl (>= 1:1.130), libnet-ldap-perl, perl, libqtgui4-perl, libqtcore4-perl +Conflicts: apt (<< 0.3.12.1), cdebconf (<< 0.96), debconf-tiny, debconf-utils (<< 1.3.22), dialog (<< 0.9b-20020814-1), menu (<= 2.1.3-1), whiptail (<< 0.51.4-11), whiptail-utf8 (<= 0.50.17-13) +Conffiles: + /etc/debconf.conf 8c0619be413824f1fc7698cee0f23811 + /etc/apt/apt.conf.d/70debconf 7e9d09d5801a42b4926b736b8eeabb73 + /etc/bash_completion.d/debconf 8fa1862734fbe54d7178aaaa419f5a11 +Description: Debian configuration management system + Debconf is a configuration management system for debian packages. Packages + use Debconf to ask questions when they are installed. +Original-Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> + +Package: iproute2 +Status: install ok installed +Priority: important +Section: net +Installed-Size: 1184 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 3.14.0-1 +Replaces: iproute +Provides: arpd +Depends: libc6 (>= 2.14), libdb5.3 +Recommends: libatm1 (>= 2.4.1-17~), libxtables10 +Suggests: iproute2-doc +Conflicts: arpd, iproute (<< 20130000-1) +Conffiles: + /etc/iproute2/rt_realms 7137bdf40e8d58c87ac7e3bba503767f + /etc/iproute2/rt_protos 95ce0b4b5b79f5a8a45941fb418a904c + /etc/iproute2/rt_dsfield 4264d5c7c8298300185aa04e1a736934 + /etc/iproute2/rt_scopes 6298b8df09e9bda23ea7da49021ca457 + /etc/iproute2/ematch_map b91e7f9b26918449bade9573f8871d61 + /etc/iproute2/group 3aea2c0e0dd75e13a5f8f48f2936915f + /etc/iproute2/rt_tables a1313318d6778fe6b8c680248ef5a463 +Description: networking and traffic control tools + The iproute2 suite is a collection of utilities for networking and + traffic control. + . + These tools communicate with the Linux kernel via the (rt)netlink + interface, providing advanced features not available through the + legacy net-tools commands 'ifconfig' and 'route'. +Original-Maintainer: Debian iproute2 Maintainers <ah-iproute@debian.org> +Homepage: http://www.linux-foundation.org/en/Net:Iproute2 + +Package: coreutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 6124 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 8.21-1ubuntu5 +Replaces: mktemp, timeout +Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.17), libselinux1 (>= 1.32) +Conflicts: timeout +Description: GNU core utilities + This package contains the basic file, shell and text manipulation + utilities which are expected to exist on every operating system. + . + Specifically, this package includes: + arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp + csplit cut date dd df dir dircolors dirname du echo env expand expr + factor false flock fmt fold groups head hostid id install join link ln + logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc od + paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir runcon + sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test + timeout touch tr true truncate tsort tty uname unexpand uniq unlink + users vdir wc who whoami yes +Homepage: http://gnu.org/software/coreutils +Original-Maintainer: Michael Stone <mstone@debian.org> + +Package: debianutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 273 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 4.4 +Replaces: manpages-pl (<< 1:0.5) +Depends: sensible-utils +Pre-Depends: libc6 (>= 2.15) +Description: Miscellaneous utilities specific to Debian + This package provides a number of small utilities which are used + primarily by the installation scripts of Debian packages, although + you may use them directly. + . + The specific utilities included are: + add-shell installkernel ischroot remove-shell run-parts savelog + tempfile which +Original-Maintainer: Clint Adams <clint@debian.org> + +Package: initramfs-tools +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 365 +Maintainer: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Version: 0.103ubuntu4 +Provides: linux-initramfs-tool +Depends: initramfs-tools-bin (>= 0.103ubuntu4), initramfs-tools-bin (<< 0.103ubuntu4.1~), klibc-utils (>= 2.0-1~), busybox-initramfs (>= 1:1.13.3-1ubuntu5), cpio, module-init-tools, udev (>= 147~-5), findutils (>= 4.2.24), util-linux (>> 2.15~rc1) +Suggests: bash-completion +Breaks: cryptsetup (<< 2:1.1.0-2.1), elilo (<< 3.12-3.1~), lilo (<< 22.8-8.2~), mountall (<< 2.0~), s390-tools (<< 1.8.3-2~) +Conflicts: usplash (<< 0.5.50) +Conffiles: + /etc/bash_completion.d/initramfs-tools 7eeb7184772f3658e7cf446945c096b1 + /etc/initramfs-tools/update-initramfs.conf e2026d4603e7161efaccca519aeb1297 + /etc/initramfs-tools/initramfs.conf 8801535d9bec98754eea6a172f956d42 + /etc/kernel/postrm.d/initramfs-tools e22d1ab0d7a7a1b66ae6d71ea4f21938 + /etc/kernel/postinst.d/initramfs-tools fe7713b9a74a10ed71d1e7dd93afc209 +Description: tools for generating an initramfs + This package contains tools to create and boot an initramfs for packaged 2.6 + Linux kernel. The initramfs is a gzipped cpio archive. At boot time, the + kernel unpacks that archive into RAM, mounts and uses it as initial root file + system. The mounting of the real root file system occurs in early user space. + klibc provides utilities to setup root. Having the root on MD, LVM2, LUKS or + NFS is also supported. + Any boot loader with initrd support is able to load an initramfs archive. +Original-Maintainer: Debian kernel team <debian-kernel@lists.debian.org> + +Package: makedev +Status: install ok installed +Priority: extra +Section: admin +Installed-Size: 125 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Version: 2.3.1-93ubuntu1 +Depends: base-passwd (>= 3.0.4) +Conflicts: udev (<= 0.024-7) +Description: creates device files in /dev + The MAKEDEV executable is used to create device files, often in /dev. + . + Device files are special files through which applications can interact + with hardware. + . + This package is not necessary for most modern Linux systems, where the udev + subsystem provides a more dynamic mechanism for device file management. +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: libdbus-1-3 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 398 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: dbus +Version: 1.6.18-0ubuntu4 +Depends: libc6 (>= 2.10) +Pre-Depends: multiarch-support +Recommends: dbus +Breaks: kde-window-manager (<< 4:4.4.5-9), kdebase-workspace-bin (<< 4:4.4.5-9) +Description: simple interprocess messaging system (library) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + D-Bus supports broadcast messages, asynchronous messages (thus + decreasing latency), authentication, and more. It is designed to be + low-overhead; messages are sent using a binary protocol, not using + XML. D-Bus also supports a method call mapping for its messages, but + it is not required; this makes using the system quite simple. + . + It comes with several bindings, including GLib, Python, Qt and Java. + . + The daemon can be found in the dbus package. +Homepage: http://dbus.freedesktop.org/ +Original-Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org> + +Package: module-init-tools +Status: install ok installed +Priority: extra +Section: admin +Installed-Size: 31 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Source: kmod +Version: 16-2ubuntu3 +Depends: libkmod2, kmod +Pre-Depends: dpkg (>= 1.15.7.2) +Description: transitional dummy package (module-init-tools to kmod) + This dummy package is provided to support the transition from + module-init-tools to kmod and should be removed afterwards. +Original-Maintainer: Marco d'Itri <md@linux.it> + +Package: libuuid1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 107 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: util-linux +Version: 2.20.1-5.1ubuntu20 +Replaces: e2fsprogs (<< 1.34-1) +Depends: passwd, libc6 (>= 2.4) +Pre-Depends: multiarch-support +Recommends: uuid-runtime +Description: Universally Unique ID library + The libuuid library generates and parses 128-bit universally unique + ids (UUIDs). A UUID is an identifier that is unique across both + space and time, with respect to the space of all UUIDs. A UUID can + be used for multiple purposes, from tagging objects with an extremely + short lifetime, to reliably identifying very persistent objects + across a network. + . + See RFC 4122 for more information. +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: lsb-base +Status: install ok installed +Priority: required +Section: misc +Installed-Size: 82 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Source: lsb +Version: 4.1+Debian11ubuntu6 +Description: Linux Standard Base 4.1 init script functionality + The Linux Standard Base (http://www.linuxbase.org/) is a standard + core system that third-party applications written for Linux can + depend upon. + . + This package only includes the init-functions shell library, which + may be used by other packages' initialization scripts for console + logging and other purposes. +Homepage: http://www.linuxfoundation.org/collaborate/workgroups/lsb +Original-Maintainer: Debian LSB Team <debian-lsb@lists.debian.org> + +Package: procps +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 637 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 1:3.3.9-1ubuntu2 +Provides: watch +Depends: libc6 (>= 2.15), libncurses5 (>= 5.5-5~), libncursesw5 (>= 5.6+20070908), libprocps3, libtinfo5, lsb-base (>= 3.0-10), initscripts +Recommends: psmisc +Breaks: guymager (<= 0.5.9-1), open-vm-tools (<= 2011.12.20-562307-1), xmem (<= 1.20-27.1) +Conflicts: pgrep (<< 3.3-5), w-bassman (<< 1.0-3) +Conffiles: + /etc/sysctl.d/10-console-messages.conf 154f6f5c5810d10bb303fb6a8e907c6a + /etc/sysctl.d/README c20074b9b11a5202758c69d7bcb6996f + /etc/sysctl.d/10-magic-sysrq.conf b3059f2835f17c97265433fdfdee358f + /etc/sysctl.d/10-kernel-hardening.conf 5c1388f00011a287cdeba60208c674e1 + /etc/sysctl.d/10-link-restrictions.conf 8568316f2baa8db06554dab91f93a161 + /etc/sysctl.d/10-zeropage.conf 8d7193abcc4dfedaf519dd03016a5e59 + /etc/sysctl.d/10-network-security.conf 4ac7258f5336e7eeaf448c05ab668d3c + /etc/sysctl.d/10-ptrace.conf 47f40494b2fc698e15549e0a4a79e81c + /etc/sysctl.d/10-ipv6-privacy.conf e9473d12b4a7069d6a3ca8b694511ddf + /etc/sysctl.conf 76c1d8285c578d5e827c3e07b9738112 + /etc/init.d/procps 021482ebab1024f5ed76e650e5191e8f + /etc/init/procps.conf 96170a339d08797dc90d69b01d6bf610 +Description: /proc file system utilities + This package provides command line and full screen utilities for browsing + procfs, a "pseudo" file system dynamically generated by the kernel to + provide information about the status of entries in its process table + (such as whether the process is running, stopped, or a "zombie"). + . + It contains free, kill, pkill, pgrep, pmap, ps, pwdx, skill, slabtop, + snice, sysctl, tload, top, uptime, vmstat, w, and watch. +Homepage: http://gitorious.org/procps +Original-Maintainer: Craig Small <csmall@debian.org> + +Package: libpam0g +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 219 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: pam +Version: 1.1.8-1ubuntu2 +Replaces: libpam0g-util +Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.8), debconf (>= 0.5) | debconf-2.0 +Pre-Depends: multiarch-support +Suggests: libpam-doc +Description: Pluggable Authentication Modules library + Contains the shared library for Linux-PAM, a library that enables the + local system administrator to choose how applications authenticate users. + In other words, without rewriting or recompiling a PAM-aware application, + it is possible to switch between the authentication mechanism(s) it uses. + One may entirely upgrade the local authentication system without touching + the applications themselves. +Homepage: http://pam.sourceforge.net/ +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: sensible-utils +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 110 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Version: 0.0.9 +Replaces: debianutils (<= 2.32.3), manpages-pl (<= 20060617-3~) +Description: Utilities for sensible alternative selection + This package provides a number of small utilities which are used + by programs to sensibly select and spawn an appropriate browser, + editor, or pager. + . + The specific utilities included are: sensible-browser sensible-editor + sensible-pager +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> + +Package: perl-base +Essential: yes +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 4780 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Source: perl +Version: 5.18.2-2ubuntu1 +Replaces: libperl5.8 (<< 5.8.0-20), libscalar-list-utils-perl, libsocket-perl, libxsloader-perl, perl (<< 5.10.1-12), perl-modules (<< 5.10.1-1) +Provides: libscalar-list-utils-perl, libsocket-perl, libxsloader-perl, perl5-base, perlapi-5.18.1, perlapi-5.18.2 +Pre-Depends: libc6 (>= 2.11), dpkg (>= 1.14.20) +Suggests: perl +Breaks: autoconf2.13 (<< 2.13-45), libcommon-sense-perl (<< 3.72-2~), libfile-spec-perl (<< 3.4000), libmarc-charset-perl (<< 1.2), libsocket-perl (<< 2.009), libxsloader-perl (<< 0.16) +Conflicts: defoma (<< 0.11.12), doc-base (<< 0.10.3), libscalar-list-utils-perl, mono-gac (<< 2.10.8.1-3), safe-rm (<< 0.8), update-inetd (<< 4.41) +Description: minimal Perl system + Perl is a scripting language used in many system scripts and utilities. + . + This package provides a Perl interpreter and the small subset of the + standard run-time library required to perform basic tasks. For a full + Perl installation, install "perl" (and its dependencies, "perl-modules" + and "perl-doc"). +Original-Maintainer: Niko Tyni <ntyni@debian.org> +Homepage: http://dev.perl.org/perl5/ + +Package: sysv-rc +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 221 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Source: sysvinit +Version: 2.88dsf-41ubuntu6 +Replaces: file-rc +Depends: debconf (>= 0.5) | debconf-2.0, sysvinit-utils (>= 2.86.ds1-62), insserv (>> 1.12.0-10) +Recommends: lsb-base (>= 3.2-14) +Suggests: sysv-rc-conf, bum +Breaks: initscripts (<< 2.86.ds1-63) +Conflicts: file-rc +Description: System-V-like runlevel change mechanism + This package provides support for the System-V like system + for booting, changing runlevels, and shutting down, + configured through symbolic links in /etc/rc?.d/. +Homepage: http://savannah.nongnu.org/projects/sysvinit +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> + +Package: libprocps3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 129 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: procps +Version: 1:3.3.9-1ubuntu2 +Replaces: procps (<< 1:3.3.2-1) +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Description: library for accessing process information from /proc + The libprocps library is a way of accessing information out of the /proc + filesystem. + . + This package contains the shared libraries necessary to run programs + compilied with libprocps. +Homepage: http://gitorious.org/procps +Original-Maintainer: Craig Small <csmall@debian.org> + +Package: libjson-c2 +Status: install ok installed +Priority: extra +Section: libs +Installed-Size: 82 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: json-c +Version: 0.11-4ubuntu1 +Depends: libc6 (>= 2.8) +Pre-Depends: multiarch-support +Description: JSON manipulation library - shared library + This library allows you to easily construct JSON objects in C, + output them as JSON formatted strings and parse JSON formatted + strings back into the C representation of JSON objects. +Homepage: https://github.com/json-c/json-c/wiki +Original-Maintainer: fabien boucher <fabien.dot.boucher@gmail.com> + +Package: libdrm2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 105 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libdrm +Version: 2.4.53-1 +Depends: libc6 (>= 2.17) +Pre-Depends: multiarch-support +Description: Userspace interface to kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + . + This package provides the runtime environment for libdrm. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libsepol1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 322 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libsepol +Version: 2.2-1 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Description: SELinux library for manipulating binary security policies + Security-enhanced Linux is a patch of the Linux kernel and a number + of utilities with enhanced security functionality designed to add + mandatory access controls to Linux. The Security-enhanced Linux + kernel contains new architectural components originally developed to + improve the security of the Flask operating system. These + architectural components provide general support for the enforcement + of many kinds of mandatory access control policies, including those + based on the concepts of Type Enforcement®, Role-based Access + Control, and Multi-level Security. + . + libsepol provides an API for the manipulation of SELinux binary policies. + It is used by checkpolicy (the policy compiler) and similar tools, as well + as by programs like load_policy that need to perform specific transformations + on binary policies such as customizing policy boolean settings. +Original-Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org> +Homepage: http://userspace.selinuxproject.org/ + +Package: libpam-modules +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 764 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: pam +Version: 1.1.8-1ubuntu2 +Replaces: libpam-umask, libpam0g-util +Provides: libpam-mkhomedir, libpam-motd, libpam-umask +Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.15), libdb5.3, libpam0g (>= 1.1.3-2), libselinux1 (>= 2.1.9), debconf (>= 0.5) | debconf-2.0, libpam-modules-bin (= 1.1.8-1ubuntu2) +Conflicts: libpam-mkhomedir, libpam-motd, libpam-umask +Conffiles: + /etc/security/limits.conf 11c27ba00b7bd6a255f33126f75c5005 + /etc/security/group.conf f1e26e8db6f7abd2d697d7dad3422c36 + /etc/security/access.conf 13ec4d189f0ed9acf3433977a53d446b + /etc/security/pam_env.conf ddee4a931170dc21b4e0b9bb28e02a7b + /etc/security/namespace.init b46b23d64860d1557d2a8f44b231fd54 + /etc/security/time.conf 06e05c6079e839c8833ac7c3abfde192 + /etc/security/sepermit.conf d41c74654734a5c069a37bfc02f0a6d4 + /etc/security/namespace.conf 6424c99a62ddf4b7d3ca713bb06ded89 +Description: Pluggable Authentication Modules for PAM + This package completes the set of modules for PAM. It includes the + pam_unix.so module as well as some specialty modules. +Homepage: http://pam.sourceforge.net/ +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: tzdata +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1599 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Version: 2014b-1 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Provides: tzdata-jessie +Depends: debconf (>= 0.5) | debconf-2.0 +Description: time zone and daylight-saving time data + This package contains data required for the implementation of + standard local time for many representative locations around the + globe. It is updated periodically to reflect changes made by + political bodies to time zone boundaries, UTC offsets, and + daylight-saving rules. +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Homepage: http://www.iana.org/time-zones + +Package: libudev1 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 129 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: systemd +Version: 204-10ubuntu1 +Depends: libc6 (>= 2.17), libcgmanager0, libdbus-1-3 (>= 1.0.2), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0) +Pre-Depends: multiarch-support +Description: libudev shared library + This library provides access to udev device information. +Homepage: http://www.freedesktop.org/wiki/Software/systemd +Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> + +Package: ifupdown +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 229 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 0.7.48.1ubuntu1 +Replaces: netbase (<< 5.0) +Depends: iproute2 | iproute (>= 20071016-1), libc6 (>= 2.7), sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16), lsb-base (>= 4.1+Debian3), initscripts (>= 2.88dsf-25), adduser +Recommends: isc-dhcp-client | dhcp-client +Suggests: ppp, rdnssd, net-tools +Breaks: dhcp3-client (<< 4.0), netbase (<< 5.0) +Conffiles: + /etc/network/if-up.d/upstart dfbcde4fd4a3a2553930605e03e160ab + /etc/network/if-down.d/upstart 1a0205ddbc1446782a8d4d818e97d8a5 + /etc/init/network-interface-container.conf 4daa570594afc50940f140a7731d20d1 + /etc/init/networking.conf c50811e19bcd596d99b0467b40cfbb8b + /etc/init/network-interface.conf aae12345eba8e946579b06798b1752c1 + /etc/init/network-interface-security.conf feb6b4b52fe24c44ff1bc68addf245d6 + /etc/init.d/networking 2c8c3be8b90f99de7edf0f883ebe39f3 + /etc/default/networking 35cd4a2713981c9239ce4532c1bfc1c7 +Description: high level tools to configure network interfaces + This package provides the tools ifup and ifdown which may be used to + configure (or, respectively, deconfigure) network interfaces based on + interface definitions in the file /etc/network/interfaces. +Original-Maintainer: Andrew Shadura <andrewsh@debian.org> + +Package: libsemanage1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 261 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libsemanage +Version: 2.2-1ubuntu1 +Depends: libsemanage-common (= 2.2-1ubuntu1), libaudit1 (>= 1:2.2.1), libbz2-1.0, libc6 (>= 2.8), libselinux1 (>= 2.1.12), libsepol1 (>= 2.1.4), libustr-1.0-1 (>= 1.0.4) +Pre-Depends: multiarch-support +Description: SELinux policy management library + This package provides the shared libraries for SELinux policy management. + It uses libsepol for binary policy manipulation and libselinux for + interacting with the SELinux system. It also exec's helper programs + for loading policy and for checking whether the file_contexts + configuration is valid (load_policy and setfiles from + policycoreutils) presently, although this may change at least for the + bootstrapping case + . + Security-enhanced Linux is a patch of the Linux kernel and a + number of utilities with enhanced security functionality designed to + add mandatory access controls to Linux. The Security-enhanced Linux + kernel contains new architectural components originally developed to + improve the security of the Flask operating system. These + architectural components provide general support for the enforcement + of many kinds of mandatory access control policies, including those + based on the concepts of Type Enforcement, Role-based Access + Control, and Multi-level Security. +Original-Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org> +Homepage: http://userspace.selinuxproject.org/ + +Package: mountall +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 248 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 2.53 +Replaces: upstart (<< 0.6.3-2) +Depends: makedev, udev, plymouth, coreutils (>= 7.1), libc6 (>= 2.9), libdbus-1-3 (>= 1.2.16), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libplymouth2 (>= 0.8.1-3), libudev1 (>= 183) +Pre-Depends: dpkg (>= 1.15.7.2) +Breaks: initscripts (<< 2.88dsf-24), policycoreutils (<< 2.0.69-2ubuntu4), usplash (<< 0.5.47) +Conffiles: + /etc/init/checkroot.sh.conf 3ea7f6ba450f431fd239e2b53a805216 + /etc/init/mounted-dev.conf cf7bea42235e77168c996d774f059c44 + /etc/init/mounted-tmp.conf 289fa57d726885147a41b2b1f3695a29 + /etc/init/mountdevsubfs.sh.conf dd33cb414bca17d97140d7f8671207f2 + /etc/init/mountall-net.conf feff70cd7006f6763e24263d381940f3 + /etc/init/mountall-shell.conf aa05af89db3de044d1cd7f6971b46d9f + /etc/init/mountall.sh.conf ee258840aad52477434cc22e34efcc50 + /etc/init/bootmisc.sh.conf d1a51c54dcfe6f3f5265246888ba4161 + /etc/init/mountnfs.sh.conf 760a5b57cbd0d1e2c65ba6db9297a586 + /etc/init/mounted-proc.conf 07198659bd06c1442a35882b2fae05fc + /etc/init/mountnfs-bootclean.sh.conf 0b6f3f9e9f8757efee57f6a4839d7dff + /etc/init/mountall.conf ac0fbaa98e705e52f59ca9e4d39751ad + /etc/init/mountall-bootclean.sh.conf d1899239aa60ea903f43a3ac58c5c238 + /etc/init/mtab.sh.conf 27aece82dbe70232d734d1dadfe87518 + /etc/init/mountkernfs.sh.conf 2e7449097b6cf88cba915edc1c339ec4 + /etc/init/mounted-var.conf 02f90856c91a46e9cbed1c35b92fec6c + /etc/init/mountall-reboot.conf 43e3c229085a13005b0681a49b2bef51 + /etc/init/checkroot-bootclean.sh.conf e02a473c76e4a2bfc1efb4c367495052 + /etc/init/checkfs.sh.conf 2e928476ccb2ecefe9ee87e2f83d34da + /etc/init/mounted-debugfs.conf 462c8aab0d9d4e6e496b1e2be5910edc + /etc/init/mounted-run.conf a26db58c801e0f6ec8738a5838aa53ed + /etc/dbus-1/system.d/Mountall.Server.conf 91b1414af1257d2ef089f84a3e5c1ed1 +Description: filesystem mounting tool + mountall mounts filesystems when the underlying block devices are + ready, or when network interfaces come up, checking the filesystems + first. +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: kmod +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 285 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 16-2ubuntu3 +Replaces: module-init-tools (<< 4) +Depends: libc6 (>= 2.17), libkmod2, sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16), lsb-base (>= 3.0-6) +Breaks: module-init-tools (<< 4) +Conffiles: + /etc/init/kmod.conf 2686532745c8b71d6d3df91c3a53aef3 + /etc/modprobe.d/blacklist-framebuffer.conf 097e2142ae3e4dd2911eda7844ce0c18 + /etc/modprobe.d/blacklist-rare-network.conf 8fb4b96124e461f53adceba9ca91f09a + /etc/modprobe.d/blacklist.conf bc6754fa320733c6d239a4bb0148ffd7 + /etc/modprobe.d/iwlwifi.conf f27bc645e93e20c8e532325d190ac8ee + /etc/modprobe.d/blacklist-ath_pci.conf d1da9bb08c2b0f56f3be93fd0e37946b + /etc/modprobe.d/mlx4.conf b2a0bedb7461daeb0138270639581bbf + /etc/modprobe.d/blacklist-firewire.conf 9cc07a17e8e64f9cd35ff59c29debe69 + /etc/modprobe.d/blacklist-watchdog.conf 55327f9270c8a6257a833c4d127a39e1 + /etc/init.d/kmod e6d43abead3714ceb8aca68dd77e1dad + /etc/depmod.d/ubuntu.conf 7c8439ef36b12e5f226b5dbfa20b8c2d +Description: tools for managing Linux kernel modules + This package contains a set of programs for loading, inserting, and + removing kernel modules for Linux. + It replaces module-init-tools. +Original-Maintainer: Marco d'Itri <md@linux.it> + +Package: libkmod2 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 138 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: kmod +Version: 16-2ubuntu3 +Depends: libc6 (>= 2.17) +Pre-Depends: multiarch-support +Description: libkmod shared library + This library provides an API for insertion, removal, configuration and + listing of kernel modules. +Original-Maintainer: Marco d'Itri <md@linux.it> + +Package: tar +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 760 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 1.27.1-2 +Replaces: cpio (<< 2.4.2-39) +Pre-Depends: libacl1 (>= 2.2.51-8), libc6 (>= 2.17), libselinux1 (>= 1.32) +Suggests: bzip2, ncompress, xz-utils, tar-scripts +Breaks: dpkg-dev (<< 1.14.26) +Conflicts: cpio (<= 2.4.2-38) +Conffiles: + /etc/rmt 3c58b7cd13da1085eff0acc6a00f43c7 +Description: GNU version of the tar archiving utility + Tar is a program for packaging a set of files as a single archive in tar + format. The function it performs is conceptually similar to cpio, and to + things like PKZIP in the DOS world. It is heavily used by the Debian package + management system, and is useful for performing system backups and exchanging + sets of files with others. +Original-Maintainer: Bdale Garbee <bdale@gag.com> + +Package: libmount1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 249 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: util-linux +Version: 2.20.1-5.1ubuntu20 +Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.8), libselinux1 (>= 1.32) +Pre-Depends: multiarch-support +Description: block device id library + The device mounting library, used by mount and mount helpers. +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: zlib1g +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 170 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: zlib +Version: 1:1.2.8.dfsg-1ubuntu1 +Provides: libz1 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Breaks: libxml2 (<< 2.7.6.dfsg-2), texlive-binaries (<< 2009-12) +Conflicts: zlib1 (<= 1:1.0.4-7) +Description: compression library - runtime + zlib is a library implementing the deflate compression method found + in gzip and PKZIP. This package includes the shared library. +Homepage: http://zlib.net/ +Original-Maintainer: Mark Brown <broonie@debian.org> + +Package: adduser +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 644 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Version: 3.113+nmu3ubuntu3 +Replaces: manpages-it (<< 0.3.4-2), manpages-pl (<= 20051117-1) +Depends: perl-base (>= 5.6.0), passwd (>= 1:4.0.12), debconf | debconf-2.0 +Suggests: liblocale-gettext-perl, perl-modules, ecryptfs-utils (>= 67-1) +Conffiles: + /etc/deluser.conf 773fb95e98a27947de4a95abb3d3f2a2 +Description: add and remove users and groups + This package includes the 'adduser' and 'deluser' commands for creating + and removing users. + . + - 'adduser' creates new users and groups and adds existing users to + existing groups; + - 'deluser' removes users and groups and removes users from a given + group. + . + Adding users with 'adduser' is much easier than adding them manually. + Adduser will choose appropriate UID and GID values, create a home + directory, copy skeletal user configuration, and automate setting + initial values for the user's password, real name and so on. + . + Deluser can back up and remove users' home directories + and mail spool or all the files they own on the system. + . + A custom script can be executed after each of the commands. + . + Development mailing list: + http://lists.alioth.debian.org/mailman/listinfo/adduser-devel/ +Homepage: http://alioth.debian.org/projects/adduser/ +Original-Maintainer: Debian Adduser Developers <adduser-devel@lists.alioth.debian.org> + +Package: libgcc1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 154 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: gcc-4.9 (4.9.0-1ubuntu3) +Version: 1:4.9.0-1ubuntu3 +Depends: gcc-4.9-base (= 4.9.0-1ubuntu3), libc6 (>= 2.2.4) +Pre-Depends: multiarch-support +Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2) +Description: GCC support library + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: libdebconfclient0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 85 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: cdebconf +Version: 0.190ubuntu1 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Description: Debian Configuration Management System (C-implementation library) + Debconf is a configuration management system for Debian packages. It is + used by some packages to prompt you for information before they are + installed. This is a reimplementation of the original debconf version + in C. + . + This is the libraries needed by libdebconfclient-dev and cdebconf. +Original-Maintainer: Debian Install System Team <debian-boot@lists.debian.org> + +Package: libklibc +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 133 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Source: klibc +Version: 2.0.3-0ubuntu1 +Description: minimal libc subset for use with initramfs + klibc is intended to be a minimalistic libc subset for use with + initramfs. It is deliberately written for small size, minimal + entanglement, and portability, not speed. It is definitely a work in + progress, and a lot of things are still missing. +Homepage: http://git.kernel.org/?p=libs/klibc/klibc.git;a=summary +Original-Maintainer: maximilian attems <maks@debian.org> + +Package: libcgmanager0 +Status: install ok installed +Priority: optional +Section: admin +Installed-Size: 152 +Maintainer: Serge Hallyn <serge.hallyn@ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: cgmanager +Version: 0.25-0ubuntu4 +Depends: libc6 (>= 2.1.3), libdbus-1-3 (>= 1.0.2) +Description: Central cgroup manager daemon (client library) + cgmanager provides a central cgroup manager daemon and a + per-namespace manager proxy, allowing users and programs + to administrate cgroups through D-Bus requests. + . + This package contains the shared library. +Homepage: http://cgmanager.linuxcontainers.org/ + +Package: mount +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 410 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: util-linux +Version: 2.20.1-5.1ubuntu20 +Pre-Depends: libblkid1 (>= 2.20.1), libc6 (>= 2.8), libmount1 (>= 2.20.1), libselinux1 (>= 2.0.15) +Suggests: nfs-common (>= 1:1.1.0-13) +Description: Tools for mounting and manipulating filesystems + This package provides the mount(8), umount(8), swapon(8), + swapoff(8), and losetup(8) commands. +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: libncurses5 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 292 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: ncurses +Version: 5.9+20140118-1ubuntu1 +Depends: libtinfo5 (= 5.9+20140118-1ubuntu1), libc6 (>= 2.15) +Pre-Depends: multiarch-support, libtinfo5 (>= 5.9-3) +Recommends: libgpm2 +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package contains the shared libraries necessary to run programs + compiled with ncurses. +Homepage: http://invisible-island.net/ncurses/ +Original-Maintainer: Craig Small <csmall@debian.org> + +Package: libplymouth2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 298 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: plymouth +Version: 0.8.8-0ubuntu17 +Replaces: plymouth (<< 0.7.0+git20090207-0ubuntu0.1~ppa4) +Depends: libc6 (>= 2.8), libpng12-0 (>= 1.2.13-4) +Pre-Depends: multiarch-support +Breaks: casper (= 1.227), mountall (<< 2.8) +Description: graphical boot animation and logger - shared libraries + Plymouth is an application that runs very early in the boot process + (even before the root filesystem is mounted!) that provides a graphical + boot animation while the boot process happens in the background. + . + This package contains the shared libraries. + +Package: gcc-4.9-base +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 213 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: gcc-4.9 +Version: 4.9.0-1ubuntu3 +Breaks: dehydra (<= 0.9.hg20110609-2), gcc-4.4-base (<< 4.4.7), gcj-4.4-base (<< 4.4.6-9~), gcj-4.6-base (<< 4.6.1-4~), gnat-4.4-base (<< 4.4.6-3~), gnat-4.6 (<< 4.6.1-5~) +Description: GCC, the GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: initramfs-tools-bin +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 119 +Maintainer: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com> +Architecture: i386 +Source: initramfs-tools +Version: 0.103ubuntu4 +Depends: libc6 (>= 2.4), libudev1 (>= 183) +Description: binaries used by initramfs-tools + This package contains binaries used inside the initramfs images generated + by initramfs-tools. +Original-Maintainer: Debian kernel team <debian-kernel@lists.debian.org> + +Package: libattr1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 55 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: attr +Version: 1:2.4.47-1ubuntu1 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Conflicts: attr (<< 2.0.0) +Description: Extended attribute shared library + Contains the runtime environment required by programs that make use + of extended attributes. +Homepage: http://savannah.nongnu.org/projects/attr/ +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> + +Package: klibc-utils +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 392 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Source: klibc +Version: 2.0.3-0ubuntu1 +Depends: libklibc (= 2.0.3-0ubuntu1) +Breaks: initramfs-tools (<< 0.103) +Description: small utilities built with klibc for early boot + This package contains a collection of programs that are linked + against klibc. These duplicate some of the functionality of a + regular Linux toolset, but are typically much smaller than their + full-function counterparts. They are intended for inclusion in + initramfs images and embedded systems. +Homepage: http://git.kernel.org/?p=libs/klibc/klibc.git;a=summary +Original-Maintainer: maximilian attems <maks@debian.org> + +Package: e2fslibs +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 418 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: e2fsprogs +Version: 1.42.9-3ubuntu1 +Replaces: e2fsprogs (<< 1.34-1) +Provides: libe2p2, libext2fs2 +Depends: libc6 (>= 2.17) +Pre-Depends: multiarch-support +Description: ext2/ext3/ext4 file system libraries + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package provides the ext2fs and e2p libraries, for userspace software + that directly accesses extended file systems. Programs that use libext2fs + include e2fsck, mke2fs, and tune2fs. Programs that use libe2p include + dumpe2fs, chattr, and lsattr. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: base-passwd +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 247 +Maintainer: Colin Watson <cjwatson@debian.org> +Architecture: i386 +Multi-Arch: foreign +Version: 3.5.33 +Replaces: base +Depends: libc6 (>= 2.8), libdebconfclient0 (>= 0.145) +Recommends: debconf (>= 0.5) | debconf-2.0 +Description: Debian base system master password and group files + These are the canonical master copies of the user database files + (/etc/passwd and /etc/group), containing the Debian-allocated user and + group IDs. The update-passwd tool is provided to keep the system databases + synchronized with these master files. + +Package: libcomerr2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 102 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: e2fsprogs +Version: 1.42.9-3ubuntu1 +Replaces: e2fsprogs (<< 1.34-1) +Provides: libcomerr-kth-compat +Depends: libc6 (>= 2.17) +Pre-Depends: multiarch-support +Description: common error description library + libcomerr is an attempt to present a common error-handling mechanism to + manipulate the most common form of error code in a fashion that does not + have the problems identified with mechanisms commonly in use. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: plymouth +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 441 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Version: 0.8.8-0ubuntu17 +Depends: initramfs-tools, libplymouth2 (= 0.8.8-0ubuntu17), mountall (>= 2.0), upstart (>= 1.11-0ubuntu3), udev (>= 166-0ubuntu4), sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16), libc6 (>= 2.8), libdbus-1-3 (>= 1.1.1), libdrm2 (>= 2.4.25), libtinfo5 +Recommends: plymouth-theme-ubuntu-text | plymouth-theme +Breaks: gdm (<< 3.0.4-0ubuntu11), kdm (<< 4:4.7.1-0ubuntu3), lightdm (<< 0.9.7-0ubuntu2), lubuntu-plymouth-theme (<= 0.4), lxdm (<< 0.4.1-0ubuntu2), ubuntustudio-plymouth-theme (<= 0.38), xubuntu-plymouth-theme (<< 10.04.4) +Conflicts: usplash +Conffiles: + /etc/init/plymouth-ready.conf f8542ccc586a5b63f5b76f68ac4f2f59 + /etc/init/plymouth-shutdown.conf febc1a3763f8e15add963ede4e561a26 + /etc/init/plymouth-stop.conf 03c8ba8289470d71e22fdbfa5859e122 + /etc/init/plymouth.conf 859e01281230eb9a522c99875f4b8b69 + /etc/init/plymouth-log.conf 65d2943a69f455dec3fed43fd7996d76 + /etc/init/plymouth-splash.conf 63b63b446cc981dc4f2fa5772b4b3e93 + /etc/init/plymouth-upstart-bridge.conf dd271be2c476aadd0cd34bc77d95a379 +Description: graphical boot animation and logger - main package + Plymouth is an application that runs very early in the boot process + (even before the root filesystem is mounted!) that provides a graphical + boot animation while the boot process happens in the background. + +Package: upstart +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1621 +Maintainer: James Hunt <james.hunt@ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 1.12.1-0ubuntu4 +Replaces: startup-tasks, system-services, sysvinit, upstart-compat-sysv, upstart-job +Provides: startup-tasks, system-services, upstart-compat-sysv, upstart-job +Depends: libc6 (>= 2.15), libdbus-1-3 (>= 1.2.16), libjson-c2 (>= 0.10), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libselinux1 (>= 1.32), libudev1 (>= 183), sysvinit-utils, initscripts, mountall, ifupdown (>= 0.6.10ubuntu5), libjson0 (>= 0.10-1.1ubuntu1), debianutils (>= 4) +Suggests: python3, graphviz, bash-completion, upstart-monitor +Breaks: friendly-recovery (<< 0.2.13), libc6 (<< 2.12.1-0ubuntu12) +Conflicts: lxcguest, startup-tasks, system-services, sysvinit, upstart-compat-sysv, upstart-job +Conffiles: + /etc/logrotate.d/upstart 070767086a27883ec119e1dde779a856 + /etc/cron.daily/upstart 761747ebd3d1677620d5af50c9900b13 + /etc/dbus-1/system.d/Upstart.conf 64be74cddb0c74b7d98202b40389784c + /etc/bash_completion.d/upstart 080f7eee4a3f3e5f76197eaa581fb4da + /etc/X11/Xsession.d/99upstart d150fce36cf22f5504e4dbc89b4826e0 + /etc/X11/Xsession.d/00upstart 46b4576b1f2ceffb2450a88d58786b95 + /etc/init/tty5.conf 6d5794f72a1098b008e53e326a6bb5a0 + /etc/init/rc-sysinit.conf a50c045d9390a6e6c43c18b19cd72fe5 + /etc/init/rcS.conf 8533688686f75d7bcf20da5a0d36d94b + /etc/init/flush-early-job-log.conf 09e959647877c39f6490ad29b8a35a28 + /etc/init/wait-for-state.conf 20b85b55c3f1e040fdbbf669afe4d2a1 + /etc/init/shutdown.conf 559659602cefe7e8d3c1e76820f5ae5d + /etc/init/upstart-udev-bridge.conf 2c24bb70877476b5e7016ccf6de745a4 + /etc/init/tty2.conf 0d9326fdda081ac96d92bbc57ff773e4 + /etc/init/failsafe.conf 0b88eeccf6c8fd456e886aa7a76e3291 + /etc/init/rc.conf 3ebc6ddcd00482cfb24ce09a14ded29f + /etc/init/upstart-file-bridge.conf 57ea7ed6cba1f1259ac87410c59237ca + /etc/init/console.conf 8d79b0205f2daffb473604ce53e1dc83 + /etc/init/tty1.conf f42f2298f711147ecf177054294861a7 + /etc/init/control-alt-delete.conf 16e6603524084b63b0f0ca04eb56757e + /etc/init/upstart-socket-bridge.conf 5f3eaca09ee1f03d5d0686ea99f8c051 + /etc/init/tty4.conf 2c78cd865d848bb2674104905151dbe2 + /etc/init/tty3.conf 6608f08adf00a282358a1eeb9bdcf78e + /etc/init/tty6.conf e8ad2f0411614f9c8dc9c4e364763549 + /etc/init/container-detect.conf 6bae6257355ad7322e7263e567817465 + /etc/upstart-xsessions ec9aa92a5c50938479d711daa9ee774a +Description: event-based init daemon + upstart is a replacement for the /sbin/init daemon which handles + starting of tasks and services during boot, stopping them during + shutdown and supervising them while the system is running. +Homepage: http://upstart.ubuntu.com/ +Orig-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: passwd +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 2250 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: shadow +Version: 1:4.1.5.1-1ubuntu9 +Replaces: manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) +Depends: libc6 (>= 2.8), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32), libsemanage1 (>= 2.0.3), libpam-modules, debianutils (>= 2.15.2) +Conffiles: + /etc/default/useradd cc9f9a7713ab62a32cd38363d958f396 + /etc/init/passwd.conf ea81baf06e4c358225ce22b786ad9e6a + /etc/cron.daily/passwd db990990933b6f56322725223f13c2bc + /etc/pam.d/chpasswd 9900720564cb4ee98b7da29e2d183cb2 + /etc/pam.d/newusers 1454e29bfa9f2a10836563e76936cea5 + /etc/pam.d/chfn 4d466e00a348ba426130664d795e8afa + /etc/pam.d/passwd eaf2ad85b5ccd06cceb19a3e75f40c63 + /etc/pam.d/chsh a6e9b589e90009334ffd030d819290a6 +Description: change and administer password and group data + This package includes passwd, chsh, chfn, and many other programs to + maintain password and group data. + . + Shadow passwords are supported. See /usr/share/doc/passwd/README.Debian +Homepage: http://pkg-shadow.alioth.debian.org/ +Original-Maintainer: Shadow package maintainers <pkg-shadow-devel@lists.alioth.debian.org> + +Package: libacl1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 75 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: acl +Version: 2.2.52-1 +Depends: libattr1 (>= 1:2.4.46-8), libc6 (>= 2.4) +Pre-Depends: multiarch-support +Conflicts: acl (<< 2.0.0), libacl1-kerberos4kth +Description: Access control list shared library + This package contains the libacl.so dynamic library containing + the POSIX 1003.1e draft standard 17 functions for manipulating + access control lists. +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://savannah.nongnu.org/projects/acl/ + +Package: libslang2 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 1244 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: slang2 +Version: 2.2.4-16ubuntu1 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Recommends: libpng12-0 +Description: S-Lang programming library - runtime version + S-Lang is a C programmer's library that includes routines for the rapid + development of sophisticated, user friendly, multi-platform applications. + . + This package contains only the shared library libslang.so.* and copyright + information. It is only necessary for programs that use this library (such + as jed and slrn). If you plan on doing development with S-Lang, you will + need the companion -dev package as well. +Homepage: http://www.jedsoft.org/slang/ +Original-Maintainer: Alastair McKinstry <mckinstry@debian.org> + +Package: initscripts +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 219 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: sysvinit +Version: 2.88dsf-41ubuntu6 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Depends: libc6 (>= 2.4), mount (>= 2.11x-1), debianutils (>= 4), lsb-base (>= 3.2-14), sysvinit-utils (>= 2.86.ds1-64), sysv-rc | file-rc, coreutils (>= 5.93), passwd, upstart, mountall (>= 2.28) +Recommends: psmisc, e2fsprogs +Breaks: aide (<< 0.15.1-5), atm-tools (<< 1:2.5.1-1.3), bootchart (<< 0.10~svn407-3.3), console-common (<< 0.7.86), cruft (<< 0.9.16), eepc-acpi-scripts (<< 1.1.12), fcheck (<< 2.7.59-16), hostapd (<< 1:0.7.3-3), hostname (<< 2.95ubuntu1~boot2), ifupdown (<< 0.6.8ubuntu27), libpam-mount (<< 2.13-1), ltsp-client-core (<< 5.2.16-1), mdadm (<< 3.2.2-1), nbd-client (<< 1:2.9.23-1), nfs-common (<< 1:1.2.5-3), portmap (<< 6.0.0-2), readahead-fedora (<< 2:1.5.6-3), resolvconf (<< 1.49), rpcbind (<< 0.2.0-7), rsyslog (<< 5.8.2-2), selinux-policy-default (<= 2:0.2.20100524-9), splashy (<< 0.3.13-5.1+b1), sysklogd (<< 1.5-6.2), udev (<< 146-2~boot6), upstart (<< 0.6.3-2~boot4), wpasupplicant (<< 0.7.3-4), xymon (<< 4.3.0~beta2.dfsg-9) +Conflicts: libdevmapper1.02.1 (<< 2:1.02.24-1) +Conffiles: + /etc/init.d/halt 6ae1b3b1b8198567a5e32116077f12a2 + /etc/init.d/killprocs 5e404d35091fab6c4889302736ed4602 + /etc/init.d/ondemand 63d57b1f5df759ddea8ef193094c118a + /etc/init.d/rc.local 18cd07959adfa8411ca17fe7c2ec3d96 + /etc/init.d/reboot 1b9db1ef7bfd79b128ef85d5065721a6 + /etc/init.d/sendsigs 8376da0c226dcc989f6829230b1d5b50 + /etc/init.d/single dc13cb373c5c098a8fb95424701373e3 + /etc/init.d/umountfs 07e4c8c8d9136f36745feb4776edc6f4 + /etc/init.d/umountnfs.sh b369d5215733f79ee2bf58cc966c5931 + /etc/init.d/umountroot 677b1eb8358469b50044663bfbee5699 + /etc/init.d/urandom e6454386bfce38efb5987dd06cb3b21d + /etc/default/devpts fc857c5ac5fb84d80720ed4d1c624f6e + /etc/default/halt 18d9844cf8ca8608e2a559a4555e593a + /etc/default/rcS db3696fc6caa33a1d72b33fa3cec7c42 +Description: scripts for initializing and shutting down the system + The scripts in this package initialize a standard Debian + system at boot time and shut it down at halt or reboot time. +Homepage: http://savannah.nongnu.org/projects/sysvinit +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> + +Package: libblkid1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 254 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: util-linux +Version: 2.20.1-5.1ubuntu20 +Depends: libc6 (>= 2.7), libuuid1 (>= 2.16) +Pre-Depends: multiarch-support +Conffiles: + /etc/blkid.conf 7f4c49e01e0a23d2f4b20eeb32e95abb +Description: block device id library + The blkid library which allows system programs like fsck and + mount to quickly and easily find block devices by filesystem UUID and + LABEL. This allows system administrators to avoid specifying + filesystems by hard-coded device names, but via a logical naming + system instead. +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: libss2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 110 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: e2fsprogs +Version: 1.42.9-3ubuntu1 +Replaces: e2fsprogs (<< 1.34-1) +Depends: libcomerr2, libc6 (>= 2.17) +Pre-Depends: multiarch-support +Description: command-line interface parsing library + libss provides a simple command-line interface parser which will + accept input from the user, parse the command into an argv argument + vector, and then dispatch it to a handler function. + . + It was originally inspired by the Multics SubSystem library. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: libsemanage-common +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 56 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Source: libsemanage +Version: 2.2-1ubuntu1 +Replaces: libsemanage1 (<= 2.0.41-1), libsemanage1-dev (<< 2.1.6-3~) +Breaks: libsemanage1 (<= 2.0.41-1), libsemanage1-dev (<< 2.1.6-3~) +Conffiles: + /etc/selinux/semanage.conf e69d42a4d98a93c3b8e201bdda367c55 +Description: Common files for SELinux policy management libraries + This package provides the common files used by the shared libraries + for SELinux policy management. + . + Security-enhanced Linux is a patch of the Linux kernel and a + number of utilities with enhanced security functionality designed to + add mandatory access controls to Linux. The Security-enhanced Linux + kernel contains new architectural components originally developed to + improve the security of the Flask operating system. These + architectural components provide general support for the enforcement + of many kinds of mandatory access control policies, including those + based on the concepts of Type Enforcement, Role-based Access + Control, and Multi-level Security. +Original-Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org> +Homepage: http://userspace.selinuxproject.org/ + +Package: libpam-modules-bin +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 212 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: pam +Version: 1.1.8-1ubuntu2 +Replaces: libpam-modules (<< 1.1.3-8) +Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.4), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32) +Description: Pluggable Authentication Modules for PAM - helper binaries + This package contains helper binaries used by the standard set of PAM + modules in the libpam-modules package. +Homepage: http://pam.sourceforge.net/ +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: findutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 668 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 4.4.2-8 +Pre-Depends: libc6 (>= 2.17) +Suggests: mlocate | locate +Description: utilities for finding files--find, xargs + GNU findutils provides utilities to find files meeting specified + criteria and perform various actions on the files which are found. + This package contains 'find' and 'xargs'; however, 'locate' has + been split off into a separate package. +Original-Maintainer: Andreas Metzler <ametzler@debian.org> +Homepage: http://savannah.gnu.org/projects/findutils/ + +Package: e2fsprogs +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 2424 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 1.42.9-3ubuntu1 +Replaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2) +Pre-Depends: e2fslibs (= 1.42.9-3ubuntu1), libblkid1 (>= 2.17.2), libc6 (>= 2.11), libcomerr2 (>= 1.42~WIP-2011-10-05-1), libss2 (>= 1.34-1), libuuid1 (>= 2.16), util-linux (>= 2.15~rc1-1) +Suggests: gpart, parted, e2fsck-static +Conflicts: dump (<< 0.4b4-4), initscripts (<< 2.85-4), quota (<< 1.55-8.1), sysvinit (<< 2.85-4) +Conffiles: + /etc/mke2fs.conf e2cdbf0620e93949af5857eb4739f949 +Description: ext2/ext3/ext4 file system utilities + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package contains programs for creating, checking, and maintaining + ext2/3/4-based file systems. It also includes the "badbocks" program, + which can be used to scan for bad blocks on a disk or other storage device. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: liblzma5 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 316 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: xz-utils +Version: 5.1.1alpha+20120614-2ubuntu2 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Description: XZ-format compression library + XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm + compression format, which provides memory-hungry but powerful + compression (often better than bzip2) and fast, easy decompression. + . + The native format of liblzma is XZ; it also supports raw (headerless) + streams and the older LZMA format used by lzma. (For 7-Zip's related + format, use the p7zip package instead.) +Homepage: http://tukaani.org/xz/ +Original-Maintainer: Jonathan Nieder <jrnieder@gmail.com> + +Package: libnih1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 147 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libnih +Version: 1.0.3-4ubuntu25 +Pre-Depends: multiarch-support, libc6 (>= 2.15~) +Description: NIH Utility Library + libnih is a light-weight "standard library" of C functions to ease the + development of other libraries and applications, especially those + normally found in /lib. + . + This package contains the shared library. +Homepage: https://launchpad.net/libnih +Original-Maintainer: Scott James Remnant <scott@netsplit.com> + +Package: libaudit1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 143 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: audit +Version: 1:2.3.2-2ubuntu1 +Depends: libaudit-common (= 1:2.3.2-2ubuntu1), libc6 (>= 2.8) +Pre-Depends: multiarch-support +Description: Dynamic library for security auditing + The audit-libs package contains the dynamic libraries needed for + applications to use the audit framework. It is used to monitor systems for + security related events. +Homepage: http://people.redhat.com/sgrubb/audit/ +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: libdb5.3 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 1788 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: db5.3 +Version: 5.3.28-3ubuntu3 +Depends: libc6 (>= 2.17) +Pre-Depends: multiarch-support +Description: Berkeley v5.3 Database Libraries [runtime] + This is the runtime package for programs that use the v5.3 Berkeley + database library. +Homepage: http://www.oracle.com/technology/software/products/berkeley-db/index.html +Original-Maintainer: Debian Berkeley DB Group <pkg-db-devel@lists.alioth.debian.org> + +Package: insserv +Status: install ok installed +Priority: optional +Section: misc +Installed-Size: 182 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Version: 1.14.0-5ubuntu2 +Depends: libc6 (>= 2.7) +Suggests: bootchart2 +Breaks: sysv-rc (<< 2.87dsf-3) +Conffiles: + /etc/insserv.conf 3e9467113029a6356f57842085f3c849 + /etc/bash_completion.d/insserv 32975fe14795d6fce1408d5fd22747fd +Description: boot sequence organizer using LSB init.d script dependency information + The insserv program is used by the standard SysV-based init system. It + updates the order of symlinks in /etc/rc?.d/ based on dependencies + specified by LSB headers in the init.d scripts themselves. + . + These declared relations between scripts make it possible to optimize + the boot sequence for the currently installed set of packages, while + detecting and rejecting dependency loops. + . + Using insserv incorrectly can result in an unbootable system. +Homepage: http://savannah.nongnu.org/projects/sysvinit +Original-Maintainer: Petter Reinholdtsen <pere@debian.org> + +Package: dpkg +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 6327 +Origin: debian +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Bugs: debbugs://bugs.debian.org +Architecture: i386 +Multi-Arch: foreign +Version: 1.17.9ubuntu1 +Replaces: manpages-it (<< 2.80-4) +Pre-Depends: libbz2-1.0, libc6 (>= 2.11), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 2.1.0), zlib1g (>= 1:1.1.4), tar (>= 1.23) +Suggests: apt +Breaks: apt (<< 0.7.7), aptitude (<< 0.4.7-1), dpkg-dev (<< 1.15.8), libdpkg-perl (<< 1.15.8) +Conflicts: ada-reference-manual (<< 20021112web-4), asn1-mode (<< 2.7-7), bogosort (<< 0.4.2-3), cl-yacc (<< 0.3-3), cpp-4.1-doc (<< 4.1.2.nf2-4), cpp-4.2-doc (<< 4.2.4.nf1-4), gcc-4.1-doc (<< 4.1.2.nf2-4), gcc-4.2-doc (<< 4.2.4.nf1-4), gcj-4.1-doc (<< 4.1.2.nf2-4), gcj-4.2-doc (<< 4.2.4.nf1-4), gfortran-4.1-doc (<< 4.1.2.nf2-4), gfortran-4.2-doc (<< 4.2.4.nf1-4), ggz-docs (<< 0.0.14.1-2), glame (<< 2.0.1-6), gnat-4.1-doc (<< 4.1.2.nf2-4), gnat-4.2-doc (<< 4.2.4.nf1-4), gtalk (<< 0.99.10-16), libalogg-dev (<< 1.3.7-2), libgtk1.2-doc (<< 1.2.10-19), libnettle-dev (<< 2), liborbit-dev (<< 0.5.17-12), libreadline5-dev (<< 5.2-8), librep-doc (<< 0.90), mmucl (<< 1.5.2-3), nxml-mode (<< 20041004-9), r6rs-doc (<< 1.0-2), serveez-doc (<< 0.1.5-3), slat (<< 2.0-6), texlive-base-bin-doc (<< 2007.dfsg.2-9), ttcn-el (<< 0.6.9-2), ulog-acctd (<< 0.4.3-3), xconq-doc (<< 7.4.1-5), zenirc (<< 2.112.dfsg-1) +Conffiles: + /etc/alternatives/README 69c4ba7f08363e998e0f2e244a04f881 + /etc/logrotate.d/dpkg 782ea5ae536f67ff51dc8c3e2eeb4cf9 + /etc/dpkg/dpkg.cfg f4413ffb515f8f753624ae3bb365b81b + /etc/cron.daily/dpkg 2712ab0dc801324ea632a0f1f82cd38c +Description: Debian package management system + This package provides the low-level infrastructure for handling the + installation and removal of Debian software packages. + . + For Debian package development tools, install dpkg-dev. +Homepage: https://wiki.debian.org/Teams/Dpkg +Original-Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> + +Package: libpcre3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 595 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: pcre3 +Version: 1:8.31-5ubuntu1 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Breaks: approx (<< 4.4-1~), cduce (<< 0.5.3-2~), cmigrep (<< 1.5-7~), galax (<< 1.1-7~), libpcre-ocaml (<< 6.0.1~), liquidsoap (<< 0.9.2-3~), ocsigen (<< 1.3.3-1~) +Conflicts: libpcre3-dev (<= 4.3-3) +Description: Perl 5 Compatible Regular Expression Library - runtime files + This is a library of functions to support regular expressions whose syntax + and semantics are as close as possible to those of the Perl 5 language. + . + This package contains the runtime libraries. +Original-Maintainer: Mark Baker <mark@mnb.org.uk> + +Package: libncursesw5 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 378 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: ncurses +Version: 5.9+20140118-1ubuntu1 +Depends: libtinfo5 (= 5.9+20140118-1ubuntu1), libc6 (>= 2.15) +Pre-Depends: multiarch-support +Recommends: libgpm2 +Description: shared libraries for terminal handling (wide character support) + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package contains the shared libraries necessary to run programs + compiled with ncursesw, which includes support for wide characters. +Homepage: http://invisible-island.net/ncurses/ +Original-Maintainer: Craig Small <csmall@debian.org> + +Package: busybox-initramfs +Status: install ok installed +Priority: optional +Section: shells +Installed-Size: 357 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Source: busybox +Version: 1:1.22.0-5ubuntu1 +Depends: libc6 (>= 2.11) +Description: Standalone shell setup for initramfs + BusyBox combines tiny versions of many common UNIX utilities into a single + small executable. It provides minimalist replacements for the most common + utilities you would usually find on your desktop system (i.e., ls, cp, mv, + mount, tar, etc.). The utilities in BusyBox generally have fewer options than + their full-featured GNU cousins; however, the options that are included + provide the expected functionality and behave very much like their GNU + counterparts. + . + busybox-initramfs provides a simple stand alone shell that provides + only the basic utilities needed for the initramfs. +Homepage: http://www.busybox.net +Original-Maintainer: Debian Install System Team <debian-boot@lists.debian.org> + +Package: libbz2-1.0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 116 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: bzip2 +Version: 1.0.6-5 +Depends: libc6 (>= 2.4) +Pre-Depends: multiarch-support +Description: high-quality block-sorting file compressor library - runtime + This package contains libbzip2 which is used by the bzip2 compressor. + . + bzip2 is a freely available, patent free, high-quality data compressor. + It typically compresses files to within 10% to 15% of the best available + techniques, whilst being around twice as fast at compression and six + times faster at decompression. + . + bzip2 compresses files using the Burrows-Wheeler block-sorting text + compression algorithm, and Huffman coding. Compression is generally + considerably better than that achieved by more conventional + LZ77/LZ78-based compressors, and approaches the performance of the PPM + family of statistical compressors. + . + The archive file format of bzip2 (.bz2) is incompatible with that of its + predecessor, bzip (.bz). +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://www.bzip.org/ + +Package: libtinfo5 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 433 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: ncurses +Version: 5.9+20140118-1ubuntu1 +Replaces: libncurses5 (<< 5.9-3) +Depends: libc6 (>= 2.15) +Pre-Depends: multiarch-support +Breaks: dialog (<< 1.2-20130523) +Description: shared low-level terminfo library for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package contains the shared low-level terminfo library. +Homepage: http://invisible-island.net/ncurses/ +Original-Maintainer: Craig Small <csmall@debian.org> + +Package: sysvinit-utils +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 232 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: sysvinit +Version: 2.88dsf-41ubuntu6 +Replaces: last, sysvinit (<= 2.86.ds1-65) +Depends: libc6 (>= 2.15), libselinux1 (>= 1.32), sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16) +Recommends: upstart (>= 0.6.3-4) +Suggests: bootlogd, sash +Breaks: upstart (<< 1.5-0ubuntu5) +Conflicts: chkconfig (<< 11.0-79.1-2), last, sysvconfig +Conffiles: + /etc/init/startpar-bridge.conf d220afa75514468471c42469967341d2 +Description: System-V-like utilities + This package contains the important System-V-like utilities. + . + Specifically, this package includes: + killall5, last, lastb, mesg, pidof, service, sulogin +Homepage: http://savannah.nongnu.org/projects/sysvinit +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> + +Package: multiarch-support +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 201 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: eglibc +Version: 2.19-0ubuntu6 +Depends: libc6 (>= 2.13-5) +Description: Transitional package to ensure multiarch compatibility + This is a transitional package used to ensure multiarch support is present + in ld.so before unpacking libraries to the multiarch directories. It can + be removed once nothing on the system depends on it. +Homepage: http://www.eglibc.org +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> + +Package: libjson0 +Status: install ok installed +Priority: extra +Section: oldlibs +Installed-Size: 29 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: json-c +Version: 0.11-4ubuntu1 +Depends: libjson-c2 +Description: JSON manipulation library (transitional package) + This is a transition package that can be safely removed once no + package depend on it. +Homepage: https://github.com/json-c/json-c/wiki +Original-Maintainer: fabien boucher <fabien.dot.boucher@gmail.com> + +Package: libnih-dbus1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 65 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libnih +Version: 1.0.3-4ubuntu25 +Depends: libnih1 (= 1.0.3-4ubuntu25), libc6 (>= 2.3.4), libdbus-1-3 (>= 1.2.16) +Pre-Depends: multiarch-support +Description: NIH D-Bus Bindings Library + libnih-dbus is a D-Bus bindings library that integrates with the main + loop provided by libnih. + . + This package contains the shared library. +Homepage: https://launchpad.net/libnih +Original-Maintainer: Scott James Remnant <scott@netsplit.com> + +Package: libselinux1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 192 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libselinux +Version: 2.2.2-1ubuntu1 +Depends: libc6 (>= 2.8), libpcre3 +Pre-Depends: multiarch-support +Description: SELinux runtime shared libraries + This package provides the shared libraries for Security-enhanced + Linux that provides interfaces (e.g. library functions for the + SELinux kernel APIs like getcon(), other support functions like + getseuserbyname()) to SELinux-aware applications. Security-enhanced + Linux is a patch of the Linux kernel and a number of utilities with + enhanced security functionality designed to add mandatory access + controls to Linux. The Security-enhanced Linux kernel contains new + architectural components originally developed to improve the security + of the Flask operating system. These architectural components provide + general support for the enforcement of many kinds of mandatory access + control policies, including those based on the concepts of Type + Enforcement, Role-based Access Control, and Multi-level Security. + . + libselinux1 provides an API for SELinux applications to get and set + process and file security contexts and to obtain security policy + decisions. Required for any applications that use the SELinux + API. libselinux may use the shared libsepol to manipulate the binary + policy if necessary (e.g. to downgrade the policy format to an older + version supported by the kernel) when loading policy. +Homepage: http://userspace.selinuxproject.org/ +Original-Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org> + +Package: libaudit-common +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 44 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Multi-Arch: foreign +Source: audit +Version: 1:2.3.2-2ubuntu1 +Replaces: libaudit0, libaudit1 (<< 1:2.2.1-2) +Breaks: libaudit0, libaudit1 (<< 1:2.2.1-2) +Conffiles: + /etc/libaudit.conf cdc703f9d27f0d980271a9e95d0f18b2 +Description: Dynamic library for security auditing - common files + The audit-libs package contains the dynamic libraries needed for + applications to use the audit framework. It is used to monitor systems for + security related events. + . + This package contains the libaudit.conf configuration file and the associated + manpage. +Homepage: http://people.redhat.com/sgrubb/audit/ +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: libc6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 9254 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: eglibc +Version: 2.19-0ubuntu6 +Replaces: libc6-i386, libc6-xen +Provides: glibc-2.19-1, libc6-i686, libc6-xen +Depends: libgcc1 +Suggests: glibc-doc, debconf | debconf-2.0, locales +Breaks: hurd (<< 1:0.5.git20140203-1), nscd (<< 2.19) +Conflicts: libc6-xen, prelink (<= 0.0.20090311-1), tzdata (<< 2007k-1), tzdata-etch +Conffiles: + /etc/ld.so.conf.d/i686-linux-gnu.conf 1c63da36f33ec6647af1d8faff9b9795 +Description: Embedded GNU C Library: Shared libraries + Contains the standard libraries that are used by nearly all programs on + the system. This package includes shared versions of the standard C library + and the standard math library, as well as many others. +Homepage: http://www.eglibc.org +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> + +Package: libpng12-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 308 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: same +Source: libpng +Version: 1.2.50-1ubuntu2 +Replaces: libpng12-dev (<= 1.2.8rel-7) +Depends: libc6 (>= 2.11), zlib1g (>= 1:1.1.4) +Pre-Depends: multiarch-support +Conflicts: libpng12-dev (<= 1.2.8rel-7), mzscheme (<= 1:209-5), pngcrush (<= 1.5.10-2), pngmeta (<= 1.11-3), povray-3.5 (<= 3.5.0c-10), qemacs (<= 0.3.1-5) +Description: PNG library - runtime + libpng is a library implementing an interface for reading and writing + PNG (Portable Network Graphics) format files. + . + This package contains the runtime library files needed to run software + using libpng. +Homepage: http://libpng.org/pub/png/libpng.html +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> + +Package: udev +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 5119 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Source: systemd +Version: 204-10ubuntu1 +Depends: libacl1 (>= 2.2.51-8), libblkid1 (>= 2.19.1), libc6 (>= 2.17), libcgmanager0, libdbus-1-3 (>= 1.0.2), libkmod2 (>= 5~), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libselinux1 (>= 2.0.65), libudev1 (= 204-10ubuntu1), sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16), lsb-base (>= 3.0-6), util-linux (>= 2.16), procps +Pre-Depends: debconf (>= 1.4.69) | debconf-2.0 +Breaks: consolekit (<< 0.4.6-1) +Conffiles: + /etc/udev/udev.conf ae415f84e2967eff580089fb08aa0a61 + /etc/init.d/udev b1cab2570af69ccbf49a208799af6247 + /etc/init.d/udev-finish 6eac2544228b88cbe8cede182082f46a + /etc/init/udev-fallback-graphics.conf b8bfe7164e10cd0e53494b243c5728b1 + /etc/init/udevtrigger.conf 651ff2421dde80be7ce7ccbf7fa8cf18 + /etc/init/udev-finish.conf 5c953c5b98ccfbb2a02985bfa2f80aed + /etc/init/udev.conf 41c0081f3a830e0902aaff76a53edf98 + /etc/init/udevmonitor.conf b541dfb5aa4958e9a5336ecaec00ca15 + /etc/modprobe.d/fbdev-blacklist.conf 01cd03c88ce6821c03baf904f7dfcbd0 + /etc/udev/rules.d/README 3b6de9f3f911176734c66903b4f8735c obsolete +Description: /dev/ and hotplug management daemon + udev is a daemon which dynamically creates and removes device nodes from + /dev/, handles hotplug events and loads drivers at boot time. +Homepage: http://www.freedesktop.org/wiki/Software/systemd +Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org> + +Package: util-linux +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 1554 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 2.20.1-5.1ubuntu20 +Replaces: e2fsprogs, fdisk, fstrim, linux32, miscutils, schedutils, setterm, sparc-utils +Provides: linux32, schedutils +Depends: lsb-base (>= 3.0-6), tzdata (>= 2006c-2), dpkg (>= 1.15.4) | install-info, debconf (>= 0.5) | debconf-2.0, sysv-rc (>= 2.88dsf-24) | file-rc (>= 0.8.16) +Pre-Depends: libblkid1 (>= 2.20.1), libc6 (>= 2.15), libncurses5 (>= 5.5-5~), libselinux1 (>= 1.32), libslang2 (>= 2.2.4), libtinfo5, libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4) +Suggests: util-linux-locales, kbd | console-tools, dosfstools +Conflicts: console-tools (<< 1:0.2.3-21), fdisk, fstrim, kbd (<< 1.05-3), linux32, schedutils, setterm +Conffiles: + /etc/cron.weekly/fstrim 4de5cd1aac392609593296f0d81e7595 + /etc/init/hwclock.conf 132aa3db7e5a8cf55168e4866052208a + /etc/init/hwclock-save.conf 4a002046525e338fc23e4418602865c9 +Description: Miscellaneous system utilities + This package contains a number of important utilities, most of which + are oriented towards maintenance of your system. Some of the more + important utilities included in this package allow you to partition + your hard disk, view kernel messages, and create new filesystems. +Homepage: http://userweb.kernel.org/~kzak/util-linux/ +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: cpio +Status: install ok installed +Priority: important +Section: utils +Installed-Size: 312 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: i386 +Multi-Arch: foreign +Version: 2.11+dfsg-2ubuntu1 +Replaces: cpio-mt +Depends: libc6 (>= 2.17) +Suggests: libarchive1 +Conflicts: cpio-mt, mt-st (<< 0.6) +Description: GNU cpio -- a program to manage archives of files + GNU cpio is a tool for creating and extracting archives, or copying + files from one place to another. It handles a number of cpio formats + as well as reading and writing tar files. +Homepage: http://www.gnu.org/software/cpio/ +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> + diff --git a/test/integration/status-github-23-too-long-dependency-line b/test/integration/status-github-23-too-long-dependency-line new file mode 100644 index 0000000..7378c99 --- /dev/null +++ b/test/integration/status-github-23-too-long-dependency-line @@ -0,0 +1,12 @@ +Package: network-manager-strongswan +Status: install ok installed +Priority: extra +Section: net +Installed-Size: 256 +Maintainer: Jean-Christophe Manciot <manciot.jeanchristophe@gmail.com> +Architecture: amd64 +Version: 1.3.1-14 +Provides: network-manager-strongswan +Depends: libart-2.0-2, libatk1.0-0, libavahi-client3, libavahi-common3, libavahi-glib1, libbonobo2-0, libbonoboui2-0, libc6, libcairo2, libcanberra0, libdatrie1, libdbus-1-3, libdbus-glib-1-2, libexpat1, libffi6, libfontconfig1, libfreetype6, libgail18, libgconf-2-4, libgcrypt20, libgdk-pixbuf2.0-0, libglib2.0-0, libglib2.0-0-dbg, libglib2.0-0-refdbg, libgmp10, libgnome-2-0, libgnomecanvas2-0, libgnome-keyring0, libgnomeui-0, libgnomevfs2-0, libgnutls30, libgpg-error0, libgraphite2-3, libgtk2.0-0, libharfbuzz0b, libhogweed4, libice6, libidn11, libltdl7, liblzma5, libnettle6, libnm-glib-vpn1, libnm-util2, libogg0, liborbit-2-0, libp11-kit0, libpango-1.0-0, libpangocairo-1.0-0, libpangoft2-1.0-0, libpcre3, libpixman-1-0, libpng12-0, libpopt0, libselinux1, libsm6, libsystemd0, libtasn1-6, libtdb1, libthai0, libuuid1, libvorbis0a, libvorbisfile3, libx11-6, libxau6, libxcb1, libxcb-render0, libxcb-shm0, libxcomposite1, libxcursor1, libxdamage1, libxdmcp6, libxext6, libxfixes3, libxi6, libxinerama1, libxml2, libxrandr2, libxrender1, zlib1g +Description: This package provides an IKEv2 IPSec VPN plugin for strongswan +Description-md5: 31abf1e375284c7ee36f25bf936125f1 diff --git a/test/integration/status-ubuntu-bug-614993 b/test/integration/status-ubuntu-bug-614993 new file mode 100644 index 0000000..99de51d --- /dev/null +++ b/test/integration/status-ubuntu-bug-614993 @@ -0,0 +1,5894 @@ +Package: xserver-xorg-input-vmmouse +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 176 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 1:12.6.5-4ubuntu2 +Replaces: mdetect (<< 0.5.2.2), xserver-xorg (<< 6.8.2-35) +Provides: xserver-xorg-input-7 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900), xserver-xorg-input-mouse, udev +Description: X.Org X server -- VMMouse input driver to use with VMWare + This package provides the driver for the X11 vmmouse input device. + . + The VMMouse driver enables support for the special VMMouse protocol + that is provided by VMware virtual machines to give absolute pointer + positioning. + . + The vmmouse driver is capable of falling back to the standard "mouse" + driver if a VMware virtual machine is not detected. This allows for + dual-booting of an operating system from a virtual machine to real hardware + without having to edit xorg.conf every time. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-input-vmmouse driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libtext-wrapi18n-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 68 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 0.06-7 +Depends: libtext-charwidth-perl +Description: internationalized substitute of Text::Wrap + This module is a substitution for Text::Wrap, supporting + multibyte characters such as UTF-8, EUC-JP, and GB2312, fullwidth + characters such as east Asian characters, combining characters + such as diacritical marks and Thai, and languages which don't + use whitespaces between words such as Chinese and Japanese. + . + It provides wrap(). +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://search.cpan.org/search?module=Text::WrapI18N + +Package: debconf +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 924 +Maintainer: Colin Watson <cjwatson@ubuntu.com> +Architecture: all +Version: 1.5.28ubuntu4 +Replaces: debconf-tiny +Provides: debconf-2.0 +Depends: debconf-i18n | debconf-english +Pre-Depends: perl-base (>= 5.6.1-4) +Recommends: apt-utils (>= 0.5.1) +Suggests: debconf-doc, debconf-utils, whiptail | dialog | gnome-utils, libterm-readline-gnu-perl, libgnome2-perl, libnet-ldap-perl, perl +Conflicts: apt (<< 0.3.12.1), cdebconf (<< 0.96), debconf-tiny, debconf-utils (<< 1.3.22), dialog (<< 0.9b-20020814-1), menu (<= 2.1.3-1), whiptail (<< 0.51.4-11), whiptail-utf8 (<= 0.50.17-13) +Conffiles: + /etc/apt/apt.conf.d/70debconf 7e9d09d5801a42b4926b736b8eeabb73 + /etc/bash_completion.d/debconf 8fa1862734fbe54d7178aaaa419f5a11 + /etc/debconf.conf 8c0619be413824f1fc7698cee0f23811 +Description: Debian configuration management system + Debconf is a configuration management system for debian packages. Packages + use Debconf to ask questions when they are installed. +Original-Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> +Python-Version: 2.6, 3.1 + +Package: xserver-common +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 172 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: all +Source: xorg-server +Version: 2:1.7.6-2ubuntu7 +Replaces: xserver-xorg-core (<< 2:1.5.2) +Depends: x11-common, xkb-data, x11-xkb-utils +Recommends: xfonts-base +Description: common files used by various X servers + This package provides files necessary for all X.Org based X servers. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: dash +Status: install ok installed +Priority: required +Section: shells +Installed-Size: 236 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.5.5.1-3ubuntu2 +Depends: debianutils (>= 2.15), dpkg (>= 1.15.0) +Pre-Depends: libc6 (>= 2.11) +Description: POSIX-compliant shell + The Debian Almquist Shell (dash) is a POSIX-compliant shell derived + from ash. + . + Since it executes scripts faster than bash, and has fewer library + dependencies (making it more robust against software or hardware + failures), it is used as the default system shell on Debian systems. +Homepage: http://gondor.apana.org.au/~herbert/dash/ +Original-Maintainer: Gerrit Pape <pape@smarden.org> + +Package: libmpfr1ldbl +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 656 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: mpfr +Version: 2.4.2-3ubuntu1 +Replaces: libmpfr1 +Depends: libgmp3c2 (>= 4.2.dfsg-1), libc6 (>= 2.4) +Conflicts: libgmp3 (<< 4.1.4-3), libmpfr1 +Description: multiple precision floating-point computation + MPFR provides a library for multiple-precision floating-point computation + with correct rounding. The computation is both efficient and has a + well-defined semantics. It copies the good ideas from the + ANSI/IEEE-754 standard for double-precision floating-point arithmetic + (53-bit mantissa). + . + The home page is http://www.mpfr.org/. +Homepage: http://www.mpfr.org/ +Original-Maintainer: Laurent Fousse <laurent@komite.net> + +Package: libxdmcp6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 80 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxdmcp +Version: 1:1.0.3-1 +Depends: libc6 (>= 2.4) +Description: X11 Display Manager Control Protocol library + This package provides the main interface to the X11 display manager control + protocol library, which allows for remote logins to display managers. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXdmcp +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libgl1-mesa-dri +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 37216 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: mesa +Version: 7.7.1-1ubuntu2 +Replaces: xlibmesa-dri (<< 1:7.0.0) +Depends: libc6 (>= 2.4), libdrm-intel1 (>= 2.4.15), libdrm-radeon1 (>= 2.4.17), libdrm2 (>= 2.3.1), libexpat1 (>= 1.95.8) +Suggests: libglide3 +Breaks: libgl1-mesa-glx (<< 7.2), xserver-xorg-core (<< 2:1.5) +Conflicts: xlibmesa-dri (<< 1:7.0.0) +Description: A free implementation of the OpenGL API -- DRI modules + This version of Mesa provides GLX and DRI capabilities: it is capable of + both direct and indirect rendering. For direct rendering, it can use DRI + modules from the libgl1-mesa-dri package to accelerate drawing. + . + This package does not include the OpenGL library itself, only the DRI + modules for accelerating direct rendering. + . + For a complete description of Mesa, please look at the + libgl1-mesa-swx11 package. + . + The tdfx DRI module needs libglide3 to enable direct rendering. +Homepage: http://mesa3d.sourceforge.net/ +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: coreutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 12992 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.4-2ubuntu2 +Replaces: mktemp +Pre-Depends: libacl1 (>= 2.2.11-1), libattr1 (>= 2.4.41-1), libc6 (>= 2.11), libselinux1 (>= 1.32) +Description: The GNU core utilities + This package contains the essential basic system utilities. + . + Specifically, this package includes: + basename cat chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir + dircolors dirname du echo env expand expr factor false fmt fold groups head + hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp + mv nice nl nohup od paste pathchk pinky pr printenv printf ptx pwd readlink + rm rmdir sha1sum seq shred sleep sort split stat stty sum sync tac tail tee + test touch tr true tsort tty uname unexpand uniq unlink users vdir wc who + whoami yes +Original-Maintainer: Michael Stone <mstone@debian.org> + +Package: libfreetype6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 796 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: freetype +Version: 2.3.11-1ubuntu2 +Depends: libc6 (>= 2.4), zlib1g (>= 1:1.1.4) +Conflicts: freetype, xpdf-reader (<< 1.00-4) +Description: FreeType 2 font engine, shared library files + The FreeType project is a team of volunteers who develop free, + portable and high-quality software solutions for digital typography. + They specifically target embedded systems and focus on bringing small, + efficient and ubiquitous products. + . + The FreeType 2 library is their new software font engine. It has been + designed to provide the following important features: + * A universal and simple API to manage font files + * Support for several font formats through loadable modules + * High-quality anti-aliasing + * High portability & performance + . + Supported font formats include: + * TrueType files (.ttf) and collections (.ttc) + * Type 1 font files both in ASCII (.pfa) or binary (.pfb) format + * Type 1 Multiple Master fonts. The FreeType 2 API also provides + routines to manage design instances easily + * Type 1 CID-keyed fonts + * OpenType/CFF (.otf) fonts + * CFF/Type 2 fonts + * Adobe CEF fonts (.cef), used to embed fonts in SVG documents with + the Adobe SVG viewer plugin. + * Windows FNT/FON bitmap fonts + . + This package contains the files needed to run programs that use the + FreeType 2 library. + . + Home Page: http://www.freetype.org/ + Authors: David Turner <david.turner@freetype.org> + Robert Wilhelm <robert.wilhelm@freetype.org> + Werner Lemberg <werner.lemberg@freetype.org> +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: debianutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 228 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 3.2.2 +Depends: sensible-utils +Pre-Depends: libc6 (>= 2.7) +Description: Miscellaneous utilities specific to Debian + This package provides a number of small utilities which are used + primarily by the installation scripts of Debian packages, although + you may use them directly. + . + The specific utilities included are: installkernel run-parts + savelog tempfile which. +Original-Maintainer: Clint Adams <schizo@debian.org> + +Package: libxmuu1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 72 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxmu +Version: 2:1.0.5-1 +Depends: libc6 (>= 2.4), libx11-6 +Description: X11 miscellaneous micro-utility library + libXmuu provides a set of miscellaneous utility convenience functions for X + libraries to use. It is a lighter version of libXmu that does not depend + on libXt or libXext; for more information on libXmu, see libxmu6. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXmu +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: initramfs-tools +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 432 +Maintainer: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com> +Architecture: all +Version: 0.92bubuntu78 +Provides: linux-initramfs-tool +Depends: initramfs-tools-bin (= 0.92bubuntu78), klibc-utils (>= 1.5.9-1), busybox-initramfs (>= 1:1.13.3-1ubuntu5), cpio, module-init-tools, udev (>= 147~-5), findutils (>= 4.2.24), util-linux (>> 2.15~rc1) +Breaks: mountall (<< 2.0~) +Conflicts: usplash (<< 0.5.50) +Conffiles: + /etc/initramfs-tools/initramfs.conf eec5dbb69cee0bc2894cbd36b36bb821 + /etc/initramfs-tools/update-initramfs.conf 25099e2e0961298b2772355149f9810d +Description: tools for generating an initramfs + This package contains tools to create and boot an initramfs for packaged 2.6 + Linux kernel. The initramfs is a gzipped cpio archive. At boot time, the + kernel unpacks that archive into RAM, mounts and uses it as initial root file + system. The mounting of the real root file system occurs in early user space. + klibc provides utilities to setup root. Having the root on EVMS, MD, LVM2, + LUKS or NFS is also supported. + Any boot loader with initrd support is able to load an initramfs archive. +Original-Maintainer: Debian kernel team <debian-kernel@lists.debian.org> + +Package: makedev +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 144 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 2.3.1-89ubuntu1 +Depends: base-passwd (>= 3.0.4) +Conflicts: udev (<= 0.024-7) +Description: creates device files in /dev + The MAKEDEV executable is used to create device files, often in /dev. + . + Device files are special files through which applications can interact + with hardware. + . + This package is not necessary for most modern Linux systems, where the udev + subsystem provides a more dynamic mechanism for device file management. +Original-Maintainer: Bdale Garbee <bdale@gag.com> + +Package: x11-xkb-utils +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 524 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.5+1 +Replaces: setxkbmap, xbase-clients (<= 1:7.2.ds2-3), xkbcomp, xkbevd, xkbprint, xkbutils +Depends: libc6 (>= 2.7), libx11-6, libxaw7, libxkbfile1, libxmu6, libxt6, cpp +Pre-Depends: x11-common (>= 1:7.0.0) +Conflicts: setxkbmap, xkbcomp, xkbevd, xkbprint, xkbutils +Description: X11 XKB utilities + xkbutils contains a number of client-side utilities for XKB, the X11 + keyboard extension. + . + setxkbmap is a tool to query and change the current XKB map. + . + xkbbell generates a bell event through the keyboard. + . + xkbcomp is a tool to compile XKB definitions into map files the server + can use. + . + xkbevd is an experimental tool to listen for certain XKB events and execute + defined triggers when actions occur. + . + xkbprint is a tool to generate an image with the physical representation + of the keyboard as XKB sees it. + . + xkbvleds shows the changing status of keyboard LEDs. + . + xkbwatch shows the changing status of modifiers and LEDs. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: login +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 2384 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: shadow +Version: 1:4.1.4.2-1ubuntu2 +Replaces: manpages-de (<< 0.5-3), manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) +Pre-Depends: libc6 (>= 2.7), libpam0g (>= 0.99.7.1), libpam-runtime, libpam-modules +Conflicts: amavisd-new (<< 2.3.3-8), backupninja (<< 0.9.3-5), echolot (<< 2.1.8-4), gnunet (<< 0.7.0c-2), python-4suite (<< 0.99cvs20060405-1) +Conffiles: + /etc/pam.d/login 837d7e3c52c5570b4e48d751cae9f8b0 + /etc/pam.d/su 7309fb874571fe5447321b43448a50b3 + /etc/login.defs 182bb938192636c8b62e3d4349de6f72 + /etc/securetty 0ae2cda1645723f062be3abaf4331747 +Description: system login tools + These tools are required to be able to login and use your system. The + login program invokes your user shell and enables command execution. The + newgrp program is used to change your effective group ID (useful for + workgroup type situations). The su program allows changing your effective + user ID (useful being able to execute commands as another user). +Homepage: http://pkg-shadow.alioth.debian.org/ +Original-Maintainer: Shadow package maintainers <pkg-shadow-devel@lists.alioth.debian.org> + +Package: gpgv +Status: install ok installed +Priority: important +Section: utils +Installed-Size: 444 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gnupg +Version: 1.4.10-2ubuntu1 +Depends: libbz2-1.0, libc6 (>= 2.4), libreadline6, zlib1g (>= 1:1.1.4) +Suggests: gnupg +Description: GNU privacy guard - signature verification tool + GnuPG is GNU's tool for secure communication and data storage. + . + gpgv is a stripped-down version of gnupg which is only able to check + signatures. It is smaller than the full-blown gnupg and uses a + different (and simpler) way to check that the public keys used to + make the signature are trustworthy. +Homepage: http://www.gnupg.org +Original-Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org> + +Package: libgmp3c2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 668 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gmp +Version: 2:4.3.2+dfsg-1ubuntu1 +Replaces: libgmp3 +Depends: libc6 (>= 2.7) +Conflicts: libgmp2 (<< 2.0.2-10), libgmp3 +Description: Multiprecision arithmetic library + GNU MP is a programmer's library for arbitrary precision + arithmetic (ie, a bignum package). It can operate on signed + integer, rational, and floating point numeric types. + . + It has a rich set of functions, and the functions have a regular + interface. +Homepage: http://gmplib.org/ +Original-Maintainer: Debian Scientific Computing Team <pkg-scicomp-devel@lists.alioth.debian.org> + +Package: libdbus-1-3 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 348 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: dbus +Version: 1.2.16-2ubuntu4 +Depends: libc6 (>= 2.4) +Recommends: dbus +Conflicts: dbus (<< 0.60) +Description: simple interprocess messaging system + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + D-Bus supports broadcast messages, asynchronous messages (thus + decreasing latency), authentication, and more. It is designed to be + low-overhead; messages are sent using a binary protocol, not using + XML. D-Bus also supports a method call mapping for its messages, but + it is not required; this makes using the system quite simple. + . + It comes with several bindings, including GLib, Python, Qt and Java. + . + The daemon can be found in the dbus package. +Homepage: http://dbus.freedesktop.org/ +Original-Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org> + +Package: module-init-tools +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 376 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Version: 3.11.1-2ubuntu1 +Depends: libc6 (>= 2.8), upstart-job +Breaks: initramfs-tools (<< 0.92bubuntu23) +Conffiles: + /etc/depmod.d/ubuntu.conf 7c8439ef36b12e5f226b5dbfa20b8c2d + /etc/modprobe.d/blacklist-ath_pci.conf d1da9bb08c2b0f56f3be93fd0e37946b + /etc/modprobe.d/blacklist-firewire.conf cb8a4c10a5dddd1d67092198b1ae415f + /etc/modprobe.d/blacklist-framebuffer.conf b46c9509180b5a76145f08be46b1aff5 + /etc/modprobe.d/blacklist-watchdog.conf 55327f9270c8a6257a833c4d127a39e1 + /etc/modprobe.d/blacklist.conf bc6754fa320733c6d239a4bb0148ffd7 + /etc/init/module-init-tools.conf 48db1b767c3148fd83eba59d12fc9a5e +Description: tools for managing Linux kernel modules + This package contains a set of programs for loading, inserting, and + removing kernel modules for Linux (versions 2.5.48 and above). + +Package: libgdbm3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 128 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gdbm +Version: 1.8.3-9 +Depends: libc6 (>= 2.2.5), dpkg (>= 1.15.4) | install-info +Description: GNU dbm database routines (runtime version) + GNU dbm ('gdbm') is a library of database functions that use extendible + hashing and works similarly to the standard UNIX 'dbm' functions. + . + The basic use of 'gdbm' is to store key/data pairs in a data file, thus + providing a persistent version of the 'dictionary' Abstract Data Type + ('hash' to perl programmers). +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://directory.fsf.org/project/gdbm/ + +Package: xserver-xorg-video-v4l +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 136 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.2.0-4 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-v4l +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-v4l +Description: X.Org X server -- Video 4 Linux display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + uses the Video For Linux interface. It does not provide a graphics chip + driver, but instead registers a number of generic Xv adaptors which can be + used with any graphics chipset driver. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-v4l driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libgcrypt11 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 560 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.4.4-5ubuntu2 +Depends: libc6 (>= 2.4), libgpg-error0 (>= 1.6) +Suggests: rng-tools +Description: LGPL Crypto library - runtime library + libgcrypt contains cryptographic functions. Many important free + ciphers, hash algorithms and public key signing algorithms have been + implemented: + arcfour, blowfish, cast5, DSA, DSA2, des, 3DES, elgamal, MD5, rijndael, + RMD160, RSA, SEED, SHA1, SHA-384, SHA-512, twofish, tiger. +Homepage: http://directory.fsf.org/project/libgcrypt/ +Original-Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> + +Package: xserver-xorg-video-sis +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 664 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.10.2-2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-sis +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-sis +Description: X.Org X server -- SiS display driver + This package provides the driver for all SiS and XGI Volari cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-sis driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxinerama1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 68 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxinerama +Version: 2:1.1-2 +Depends: libc6 (>= 2.2.5), libx11-6, libxext6 +Description: X11 Xinerama extension library + libXinerama provides an X Window System client interface to the XINERAMA + extension to the X protocol. + . + The Xinerama (also known as panoramiX) extension allows for multiple screens + attached to a single display to be treated as belonging together, and to give + desktop applications a better idea of the monitor layout. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXinerama +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: lzma +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 172 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 4.43-14ubuntu2 +Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0) +Description: Compression method of 7z format in 7-Zip program + LZMA is a compression algorithm, based on the famous Lempel Ziv + compression method. + . + The main characteristics of the algorithm are very good compression, + fast decompression, use of lot of RAM for compression and low usage of + RAM for decompression. + . + LZMA provides high compression ratio and very fast decompression, so it + is very suitable for embedded applications. For example, it can be used + for ROM (firmware) compression. + . + This package provides a gzip-like interface for the lzma program. +Homepage: http://www.7-zip.org/sdk.htm +Original-Maintainer: Mohammed Adnène Trojette <adn+deb@diwi.org> + +Package: libuuid1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 120 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: util-linux +Version: 2.17.2-0ubuntu1 +Replaces: e2fsprogs (<< 1.34-1) +Depends: passwd, libc6 (>= 2.4) +Recommends: uuid-runtime +Description: Universally Unique ID library + The libuuid library generates and parses 128-bit universally unique + ids (UUIDs). A UUID is an identifier that is unique across both + space and time, with respect to the space of all UUIDs. A UUID can + be used for multiple purposes, from tagging objects with an extremely + short lifetime, to reliably identifying very persistent objects + across a network. + . + See RFC 4122 for more information. +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: libtasn1-3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 144 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.4-1 +Depends: libc6 (>= 2.4) +Conflicts: libtasn1-2 (= 0.3.1-1) +Description: Manage ASN.1 structures (runtime) + Manage ASN1 (Abstract Syntax Notation One) structures. + The main features of this library are: + * on-line ASN1 structure management that doesn't require any C code + file generation. + * off-line ASN1 structure management with C code file generation + containing an array. + * DER (Distinguish Encoding Rules) encoding + * no limits for INTEGER and ENUMERATED values + . + This package contains runtime libraries. +Original-Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Homepage: http://www.gnu.org/software/libtasn1/ + +Package: lsb-base +Status: install ok installed +Priority: required +Section: misc +Installed-Size: 84 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: lsb +Version: 4.0-0ubuntu8 +Replaces: lsb (<< 2.0-6), lsb-core (<< 2.0-6) +Depends: sed, ncurses-bin +Conflicts: lsb (<< 2.0-6), lsb-core (<< 2.0-6) +Conffiles: + /etc/lsb-base-logging.sh 5126106e3af09b522cdbd5e4685942af +Description: Linux Standard Base 4.0 init script functionality + The Linux Standard Base (http://www.linuxbase.org/) is a standard + core system that third-party applications written for Linux can + depend upon. + . + This package only includes the init-functions shell library, which + may be used by other packages' initialization scripts for console + logging and other purposes. +Homepage: http://www.linux-foundation.org/en/LSB +Original-Maintainer: Chris Lawrence <lawrencc@debian.org> + +Package: libcurl3-gnutls +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 440 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: curl +Version: 7.19.7-1ubuntu1 +Replaces: libcurl4-gnutls +Depends: libc6 (>= 2.7), libgcrypt11 (>= 1.4.2), libgnutls26 (>= 2.7.14-0), libgssapi-krb5-2 (>= 1.7dfsg~beta1), libidn11 (>= 1.13), libldap-2.4-2 (>= 2.4.7), zlib1g (>= 1:1.1.4), ca-certificates +Conflicts: libcurl4-gnutls +Description: Multi-protocol file transfer library (GnuTLS) + libcurl is designed to be a solid, usable, reliable and portable + multi-protocol file transfer library. + . + SSL support is provided by GnuTLS. + . + This is the shared version of libcurl. +Homepage: http://curl.haxx.se +Original-Maintainer: Domenico Andreoli <cavok@debian.org> + +Package: cpp-4.4 +Status: install ok installed +Priority: optional +Section: interpreters +Installed-Size: 9828 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gcc-4.4 +Version: 4.4.3-4ubuntu5 +Depends: gcc-4.4-base (= 4.4.3-4ubuntu5), libc6 (>= 2.11), libgmp3c2, libmpfr1ldbl +Suggests: gcc-4.4-locales (>= 4.4.3-1) +Description: The GNU C preprocessor + A macro processor that is used automatically by the GNU C compiler + to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: procps +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 808 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:3.2.8-1ubuntu4 +Replaces: bsdutils (<< 2.9x-1), watch +Provides: watch +Depends: libc6 (>= 2.4), libncurses5 (>= 5.6+20071006-3), upstart-job, lsb-base (>= 3.0-10) +Recommends: psmisc +Conflicts: libproc-dev (<< 1:1.2.6-2), pgrep (<< 3.3-5), procps-nonfree, w-bassman (<< 1.0-3), watch +Conffiles: + /etc/sysctl.d/10-console-messages.conf 154f6f5c5810d10bb303fb6a8e907c6a + /etc/sysctl.d/10-network-security.conf 4ac7258f5336e7eeaf448c05ab668d3c + /etc/sysctl.d/10-zeropage.conf 8d7193abcc4dfedaf519dd03016a5e59 + /etc/sysctl.d/README c20074b9b11a5202758c69d7bcb6996f + /etc/sysctl.conf 86b831bbed0a49bc7361ed64d6c09435 + /etc/init/procps.conf 72d5354efb1017283c440cf102b5d74a +Description: /proc file system utilities + These are utilities to browse the /proc filesystem, which is not a real file + system but a way for the kernel to provide information about the status of + entries in its process table. (e.g. running, stopped or "zombie") + Both command line and full screen utilities are provided. Ncurses is needed + for the full screen utilities. More information can be found at procps + website http://procps.sf.net/ + . + This package includes the following utilities: top, uptime, tload, + free, vmstat, watch, skill, pmap, pgrep, slabtop and pwdx. +Original-Maintainer: Craig Small <csmall@debian.org> + +Package: libgssapi-krb5-2 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 312 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: krb5 +Version: 1.8.1+dfsg-2 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.7), libcomerr2 (>= 1.34), libk5crypto3 (>= 1.8+dfsg), libkeyutils1, libkrb5-3 (= 1.8.1+dfsg-2), libkrb5support0 (>= 1.7dfsg~beta2) +Suggests: krb5-doc, krb5-user +Description: MIT Kerberos runtime libraries - krb5 GSS-API Mechanism + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the Kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos V5. + . + This package contains the runtime library for the MIT Kerberos + implementation of GSS-API used by applications and Kerberos clients. +Original-Maintainer: Sam Hartman <hartmans@debian.org> +Homepage: http://web.mit.edu/kerberos/ + +Package: python-minimal +Essential: yes +Status: install ok installed +Priority: required +Section: python +Installed-Size: 120 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: python-defaults +Version: 2.6.5-0ubuntu1 +Replaces: python (<= 2.4-1) +Depends: python2.6-minimal (>= 2.6.5), dpkg (>= 1.13.20) +Recommends: python +Conflicts: python (<= 2.4-1), python-central (<< 0.5.5) +Description: A minimal subset of the Python language (default version) + This package contains the interpreter and some essential modules. It's used + in the boot process for some basic tasks. + See /usr/share/doc/python2.6-minimal/README.Debian for a list of the modules + contained in this package. +Original-Maintainer: Matthias Klose <doko@debian.org> + +Package: ncurses-base +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 488 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: ncurses +Version: 5.7+20090803-2ubuntu3 +Replaces: ncurses-term +Provides: ncurses-runtime +Depends: libncurses5 +Conflicts: ncurses, ncurses-runtime +Conffiles: + /etc/terminfo/README 9d086188afcd9479ae96ff55dd6c1573 +Description: basic terminal type definitions + This package contains terminfo data files to support the most common types of + terminal, including ansi, dumb, linux, rxvt, screen, sun, vt100, vt102, vt220, + vt52, and xterm. +Homepage: ftp://invisible-island.net/ncurses/ +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: libpam0g +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 272 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: pam +Version: 1.1.1-2ubuntu2 +Replaces: libpam0g-util +Depends: libc6 (>= 2.8), debconf (>= 0.5) | debconf-2.0 +Suggests: libpam-doc +Description: Pluggable Authentication Modules library + Contains the C shared library for Linux-PAM, a suite of shared + libraries that enable the local system administrator to choose how + applications authenticate users. In other words, without rewriting + or recompiling a PAM-aware application, it is possible to switch + between the authentication mechanism(s) it uses. One may entirely + upgrade the local authentication system without touching the + applications themselves. +Homepage: http://pam.sourceforge.net/ +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: libusb-0.1-4 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libusb +Version: 2:0.1.12-14 +Replaces: libusb0 +Depends: libc6 (>= 2.4) +Conflicts: libccid (<< 0.9.2-3), libusb0 +Description: userspace USB programming library + Library for programming USB applications without the knowledge + of Linux kernel internals. +Original-Maintainer: Aurelien Jarno <aurel32@debian.org> +Homepage: http://www.linux-usb.org/ + +Package: libgpg-error0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 236 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libgpg-error +Version: 1.6-1ubuntu2 +Depends: libc6 (>= 2.2.5) +Description: library for common error values and messages in GnuPG components + Library that defines common error values for all GnuPG + components. Among these are GPG, GPGSM, GPGME, GPG-Agent, libgcrypt, + pinentry, SmartCard Daemon and possibly more in the future. +Original-Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org> + +Package: ucf +Status: install ok installed +Priority: standard +Section: utils +Installed-Size: 260 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 3.0025 +Depends: debconf (>= 1.5.19), coreutils (>= 5.91) +Conffiles: + /etc/ucf.conf 5565b8b26108c49ba575ba452cd69b3e +Description: Update Configuration File: preserve user changes to config files. + Debian policy mandates that user changes to configuration files must be + preserved during package upgrades. The easy way to achieve this behavior + is to make the configuration file a 'conffile', in which case dpkg + handles the file specially during upgrades, prompting the user as + needed. + . + This is appropriate only if it is possible to distribute a default + version that will work for most installations, although some system + administrators may choose to modify it. This implies that the + default version will be part of the package distribution, and must + not be modified by the maintainer scripts during installation (or at + any other time). + . + This script attempts to provide conffile-like handling for files that + may not be labelled conffiles, and are not shipped in a Debian package, + but handled by the postinst instead. This script allows one to + maintain files in /etc, preserving user changes and in general + offering the same facilities while upgrading that dpkg normally + provides for 'conffiles'. + . + Additionally, this script provides facilities for transitioning a + file that had not been provided with conffile-like protection to come + under this schema, and attempts to minimize questions asked at + installation time. Indeed, the transitioning facility is better than the + one offered by dpkg while transitioning a file from a non-conffile to + conffile status. +Original-Maintainer: Manoj Srivastava <srivasta@debian.org> + +Package: perl-modules +Status: deinstall ok config-files +Priority: standard +Section: perl +Installed-Size: 15848 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: perl +Version: 5.10.1-8ubuntu2 +Config-Version: 5.10.1-8ubuntu2 +Replaces: libansicolor-perl, libarchive-tar-perl, libattribute-handlers-perl, libautodie-perl, libcgi-pm-perl, libcpanplus-perl, libextutils-cbuilder-perl, libextutils-parsexs-perl, libfile-temp-perl, libi18n-langtags-perl, libio-zlib-perl, liblocale-codes-perl, liblocale-maketext-perl, liblocale-maketext-simple-perl, libmath-bigint-perl, libmodule-build-perl, libmodule-corelist-perl, libmodule-load-conditional-perl, libmodule-load-perl, libmodule-pluggable-perl, libnet-perl, libnet-ping-perl, libparams-check-perl, libparent-perl, libparse-cpan-meta-perl, libpod-escapes-perl, libpod-parser-perl, libpod-simple-perl, libtest-harness-perl, libtest-simple-perl, libthread-queue-perl, libversion-perl, podlators-perl +Provides: libansicolor-perl, libarchive-tar-perl, libattribute-handlers-perl, libautodie-perl, libcgi-pm-perl, libcpanplus-perl, libextutils-cbuilder-perl, libextutils-parsexs-perl, libfile-temp-perl, libi18n-langtags-perl, libio-zlib-perl, liblocale-codes-perl, liblocale-maketext-perl, liblocale-maketext-simple-perl, libmath-bigint-perl, libmodule-build-perl, libmodule-corelist-perl, libmodule-load-conditional-perl, libmodule-load-perl, libmodule-pluggable-perl, libnet-perl, libnet-ping-perl, libparams-check-perl, libparent-perl, libparse-cpan-meta-perl, libpod-escapes-perl, libpod-parser-perl, libpod-simple-perl, libtest-harness-perl, libtest-simple-perl, libthread-queue-perl, libversion-perl, podlators-perl +Depends: perl (>= 5.10.1-1) +Conflicts: libansicolor-perl (<< 1.10-1), libarchive-tar-perl (<< 1.52), libattribute-handlers-perl (<< 0.85), libautodie-perl (<< 2.06.01), libcgi-pm-perl (<< 3.43), libcpanplus-perl (<< 0.88), libextutils-cbuilder-perl (<< 0.2602), libextutils-parsexs-perl (<< 2.2002), libfile-temp-perl (<< 0.22), libi18n-langtags-perl (<< 0.35-1), libio-zlib-perl (<< 1.09), liblocale-codes-perl (<< 2.07), liblocale-maketext-perl (<< 1.13), liblocale-maketext-simple-perl (<< 0.18-1), libmath-bigint-perl (<< 1.89), libmodule-build-perl (<< 0.340201), libmodule-corelist-perl (<< 2.18), libmodule-load-conditional-perl (<< 0.30), libmodule-load-perl (<< 0.16), libmodule-pluggable-perl (<< 3.9), libnet-perl (<= 1:1.19-3), libnet-ping-perl (<< 2.36), libparams-check-perl (<< 0.26-1), libparent-perl (<< 0.221), libparse-cpan-meta-perl (<< 1.39), libpod-escapes-perl (<< 1.04), libpod-parser-perl (<< 1.37), libpod-simple-perl (<< 3.07), libtest-harness-perl (<< 3.17), libtest-simple-perl (<< 0.92), libthread-queue-perl (<< 2.11), libversion-perl (<< 1:0.7700), podlators-perl (<= 2.2.2-1) +Conffiles: + /etc/perl/Net/libnet.cfg fb2946cae573b8ed3d654a180d458733 +Description: Core Perl modules + Architecture independent Perl modules. These modules are part of Perl and + required if the `perl' package is installed. +Original-Maintainer: Niko Tyni <ntyni@debian.org> + +Package: bsdutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 208 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: util-linux (2.17.2-0ubuntu1) +Version: 1:2.17.2-0ubuntu1 +Depends: libc6 (>= 2.7) +Recommends: bsdmainutils +Description: Basic utilities from 4.4BSD-Lite + This package contains the bare minimum number of BSD utilities needed + to boot a Debian system: logger, renice, script, scriptreplay, and wall. + The remaining standard BSD utilities are provided by bsdmainutils. +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: xserver-xorg-video-apm +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 216 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.2.2-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-apm +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-apm +Description: X.Org X server -- APM display driver + This package provides the driver for the Alliance Pro Motion family + of video cards; specifically, the 6420, 6422, AT24, AT25, and AT3D + cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-apm driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: sensible-utils +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 0.0.1ubuntu3 +Replaces: debianutils (<= 2.32.3) +Description: Utilities for sensible alternative selection + This package provides a number of small utilities which are used + by programs to sensibly select and spawn an appropriate browser, + editor, or pager. + . + The specific utilities included are: select-editor sensible-browser + sensible-editor sensible-pager +Original-Maintainer: Clint Adams <schizo@debian.org> + +Package: xserver-xorg-video-voodoo +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.2.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-voodoo +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-voodoo +Description: X.Org X server -- Voodoo display driver + This package provides the driver for 3dfx Voodoo1 and Voodoo2 chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-voodoo driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxkbfile1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 204 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxkbfile +Version: 1:1.0.6-1 +Depends: libc6 (>= 2.7), libx11-6 +Description: X11 keyboard file manipulation library + libxkbfile provides an interface to read and manipulate description files for + XKB, the X11 keyboard configuration extension. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libxkbfile +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: dpkg-dev +Status: deinstall ok config-files +Priority: optional +Section: utils +Installed-Size: 2068 +Origin: debian +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Bugs: debbugs://bugs.debian.org +Architecture: all +Source: dpkg +Version: 1.15.5.6ubuntu4 +Config-Version: 1.15.5.6ubuntu4 +Replaces: manpages-pl (<= 20051117-1) +Depends: dpkg (>= 1.15.4), perl5, perl-modules, bzip2, lzma, xz-utils, patch (>= 2.2-1), make, binutils, libtimedate-perl, base-files (>= 5.0.0) +Recommends: gcc | c-compiler, build-essential, fakeroot, gnupg, gpgv +Suggests: debian-keyring, debian-maintainers +Conflicts: devscripts (<< 2.10.26), dpkg-cross (<< 2.0.0) +Conffiles: + /etc/dpkg/shlibs.default 1a2b9d0a869e2aa885ae3621c557fb95 + /etc/dpkg/shlibs.override 84b1e69080569cc5c613a50887af5200 +Description: Debian package development tools + This package provides the development tools (including dpkg-source) + required to unpack, build and upload Debian source packages. + . + Most Debian source packages will require additional tools to build; + for example, most packages need make and the C compiler gcc. +Homepage: http://wiki.debian.org/Teams/Dpkg +Original-Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> + +Package: xserver-xorg-video-s3virge +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 160 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.10.4-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-s3virge +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-s3virge +Description: X.Org X server -- S3 ViRGE display driver + This package provides the driver for the S3 ViRGE and Trio3D family + of chipsets. It does not support Trio64 or S3 96x cards; support for + these can be found in the xserver-xorg-video-s3 package. Support for + S3 Savage chipsets can be found in xserver-xorg-video-savage. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-s3virge driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libssl0.9.8 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 2332 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: openssl +Version: 0.9.8k-7ubuntu8 +Depends: libc6 (>= 2.7), zlib1g (>= 1:1.1.4), debconf (>= 0.5) | debconf-2.0 +Conflicts: libssl, libssl096-dev (<< 0.9.6-2), openssl (<< 0.9.6-2), ssleay (<< 0.9.2b) +Description: SSL shared libraries + libssl and libcrypto shared libraries needed by programs like + apache-ssl, telnet-ssl and openssh. + . + It is part of the OpenSSL implementation of SSL. +Original-Maintainer: Debian OpenSSL Team <pkg-openssl-devel@lists.alioth.debian.org> + +Package: bzip2 +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 160 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.0.5-4 +Replaces: libbz2 (<< 0.9.5d-3) +Depends: libbz2-1.0 (= 1.0.5-4), libc6 (>= 2.4) +Suggests: bzip2-doc +Description: high-quality block-sorting file compressor - utilities + bzip2 is a freely available, patent free, high-quality data compressor. + It typically compresses files to within 10% to 15% of the best available + techniques, whilst being around twice as fast at compression and six + times faster at decompression. + . + bzip2 compresses files using the Burrows-Wheeler block-sorting text + compression algorithm, and Huffman coding. Compression is generally + considerably better than that achieved by more conventional + LZ77/LZ78-based compressors, and approaches the performance of the PPM + family of statistical compressors. + . + The archive file format of bzip2 (.bz2) is incompatible with that of its + predecessor, bzip (.bz). +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://www.bzip.org/ + +Package: vim-common +Status: install ok installed +Priority: important +Section: editors +Installed-Size: 380 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: vim +Version: 2:7.2.330-1ubuntu3 +Depends: libc6 (>= 2.4) +Recommends: vim | vim-gnome | vim-gtk | vim-lesstif | vim-nox | vim-tiny +Conffiles: + /etc/vim/vimrc e8793640eb83ade46e2d452bcf62e7e3 +Description: Vi IMproved - Common files + Vim is an almost compatible version of the UNIX editor Vi. + . + Many new features have been added: multi level undo, syntax + highlighting, command line history, on-line help, filename + completion, block operations, folding, Unicode support, etc. + . + This package contains files shared by all non GUI-enabled vim + variants (vim and vim-tiny currently) available in Debian. + Examples of such shared files are: manpages, common executables + like xxd, and configuration files. +Homepage: http://www.vim.org/ +Original-Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org> + +Package: openssl +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 844 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.9.8k-7ubuntu8 +Depends: libc6 (>= 2.7), libssl0.9.8 (>= 0.9.8k-1), zlib1g (>= 1:1.1.4) +Suggests: ca-certificates, openssl-doc +Conflicts: ssleay (<< 0.9.2b) +Conffiles: + /etc/ssl/openssl.cnf 0b1cf9a835b829131d630b7c2fe55f3c +Description: Secure Socket Layer (SSL) binary and related cryptographic tools + This package contains the openssl binary and related tools. + . + It is part of the OpenSSL implementation of SSL. + . + You need it to perform certain cryptographic actions like: + - Creation of RSA, DH and DSA key parameters; + - Creation of X.509 certificates, CSRs and CRLs; + - Calculation of message digests; + - Encryption and decryption with ciphers; + - SSL/TLS client and server tests; + - Handling of S/MIME signed or encrypted mail. +Original-Maintainer: Debian OpenSSL Team <pkg-openssl-devel@lists.alioth.debian.org> + +Package: ncurses-bin +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 520 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: ncurses +Version: 5.7+20090803-2ubuntu3 +Provides: tput +Pre-Depends: libc6 (>= 2.4), libncurses5 (>= 5.6+20071006-3) +Conflicts: ncurses, tput +Description: terminal-related programs and man pages + This package contains the programs used for manipulating the terminfo + database and individual terminfo entries, as well as some programs for + resetting terminals and such. +Homepage: ftp://invisible-island.net/ncurses/ +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: perl-base +Essential: yes +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 4900 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: perl +Version: 5.10.1-8ubuntu2 +Replaces: libperl5.8 (<< 5.8.0-20), libscalar-list-utils-perl, libxsloader-perl, perl (<= 5.10.0-9), perl-modules (<< 5.10.1-1) +Provides: libscalar-list-utils-perl, libxsloader-perl, perl5-base, perlapi-5.10.0, perlapi-5.10.1 +Pre-Depends: libc6 (>= 2.11), dpkg (>= 1.14.20) +Suggests: perl +Breaks: doc-base (<< 0.8.16) +Conflicts: autoconf2.13 (<< 2.13-45), libscalar-list-utils-perl (<< 1:1.18-1), libxsloader-perl (<< 0.08-1), safe-rm (<< 0.8) +Description: minimal Perl system + Perl is a scripting language used in many system scripts and utilities. + . + This package provides a Perl interpreter and the small subset of the + standard run-time library required to perform basic tasks. For a full + Perl installation, install "perl" (and its dependencies, "perl-modules" + and "perl-doc"). +Original-Maintainer: Niko Tyni <ntyni@debian.org> + +Package: sysv-rc +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 288 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: sysvinit +Version: 2.87dsf-4ubuntu17 +Replaces: file-rc +Depends: debconf | debconf-2.0, sysvinit-utils (>= 2.86.ds1-62), insserv (>> 1.12.0-10) +Recommends: lsb-base (>= 3.2-14) +Suggests: sysv-rc-conf, bum +Breaks: initscripts (<< 2.86.ds1-63) +Conflicts: file-rc +Description: System-V-like runlevel change mechanism + This package provides support for the System-V like system + for booting, shutting down and changing runlevels, + configured through symbolic links in /etc/rc?.d/. +Homepage: http://freshmeat.net/projects/sysvinit/ +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> + +Package: apt +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 5488 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.7.25.3ubuntu7 +Replaces: libapt-pkg-dev (<< 0.3.7), libapt-pkg-doc (<< 0.3.7) +Provides: libapt-pkg-libc6.10-6-4.8 +Depends: libc6 (>= 2.8), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0) +Recommends: ubuntu-keyring +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Conffiles: + /etc/apt/apt.conf.d/01autoremove 6154750d39a78704b5bbf6fafd65ada7 + /etc/apt/apt.conf.d/01ubuntu 078b96538a377743bee0f554eb5b2fc6 + /etc/logrotate.d/apt 179f2ed4f85cbaca12fa3d69c2a4a1c3 + /etc/cron.daily/apt 3528ddf873535d4c268d83e73e85dc79 +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. +Original-Maintainer: APT Development Team <deity@lists.debian.org> + +Package: xserver-xorg-core +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 4872 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: xorg-server +Version: 2:1.7.6-2ubuntu7 +Replaces: xserver-common (<< 7), xserver-xfree86 (<< 1:7.0.0), xserver-xorg (<< 6.8.2-38) +Provides: xserver +Depends: xserver-common (>= 2:1.7.6-2ubuntu7), xserver-xorg, udev (>= 149), libc6 (>= 2.7), libdrm2 (>= 2.3.1), libgcrypt11 (>= 1.4.2), libpciaccess0 (>= 0.10.7), libpixman-1-0 (>= 0.15.16), libudev0 (>= 147), libxau6, libxdmcp6, libxfont1 (>= 1:1.2.9) +Recommends: libgl1-mesa-dri (>= 7.1~rc1) +Suggests: xfonts-100dpi | xfonts-75dpi, xfonts-scalable +Conflicts: xserver-common (<< 7), xserver-xfree86 (<< 1:7.0.0), xserver-xorg (<< 6.8.2-38), xserver-xorg-input, xserver-xorg-input-2, xserver-xorg-input-2.1, xserver-xorg-input-4, xserver-xorg-input-wacom (<< 0.7.8), xserver-xorg-video, xserver-xorg-video-1.0, xserver-xorg-video-1.9, xserver-xorg-video-2, xserver-xorg-video-4, xserver-xorg-video-5 +Description: Xorg X server - core server + The Xorg X server is an X server for several architectures and operating + systems, which is derived from the XFree86 4.x series of X servers. + . + The Xorg server supports most modern graphics hardware from most vendors, + and supersedes all XFree86 X servers. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xserver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libk5crypto3 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 252 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: krb5 +Version: 1.8.1+dfsg-2 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.4), libkeyutils1, libkrb5support0 (>= 1.7dfsg~beta2) +Suggests: krb5-doc, krb5-user +Breaks: libgssapi-krb5-2 (<= 1.8~aa), libkrb5-3 (<= 1.8~aa) +Description: MIT Kerberos runtime libraries - Crypto Library + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the Kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos V5. + . + This package contains the runtime cryptography libraries used by + applications and Kerberos clients. +Original-Maintainer: Sam Hartman <hartmans@debian.org> +Homepage: http://web.mit.edu/kerberos/ + +Package: netbase +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 100 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 4.35ubuntu3 +Depends: lsb-base (>= 3.0-6), upstart-job +Recommends: ifupdown +Conflicts: inetutils-inetd (<< 2:1.4.3+20060719-3), openbsd-inetd (<< 0.20050402-3) +Conffiles: + /etc/protocols 3aaa310b088fa84233d7fb2e358d4d29 + /etc/rpc f0b6f6352bf886623adc04183120f83b + /etc/services b6a26fbe90d859f7c8600d5941262921 + /etc/init.d/networking db7e515f04f04f54708b5ea862585c31 +Description: Basic TCP/IP networking system + This package provides the necessary infrastructure for basic TCP/IP based + networking. +Original-Maintainer: Marco d'Itri <md@linux.it> + +Package: libdrm2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 480 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: libdrm +Version: 2.4.18-1ubuntu3 +Depends: libc6 (>= 2.7) +Description: Userspace interface to kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + . + This package provides the runtime environment for libdrm. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-openchrome +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 588 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.2.904+svn827-1 +Replaces: libchromexvmc1, libchromexvmcpro1 +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), libdrm2 (>= 2.3.1), libx11-6 (>= 0), libxext6 (>= 0), libxv1, libxvmc1, xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: libchromexvmc1, libchromexvmcpro1 +Description: X.Org X server -- VIA display driver + OpenChrome is a project for the development of free and open-source drivers + for the VIA UniChrome video chipsets. + . + Originally called the 'snapshot' release, since it was a snapshot of an + experimental branch of the unichrome cvs code, this is a continued development + of the open source unichrome driver (from http://unichrome.sf.net) which + also incorporates support for the unichrome-pro chipsets. + . + Support for hardware acceleration (XvMC) for all chipsets has subsequently + been ripped out of the unichrome.sf.net driver. Therefore your only option if + you wish to make use of the acceleration features of your VIA chip with free + and open-source drivers is to use this version of the driver. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Homepage: http://www.openchrome.org + +Package: libxapian15 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 1644 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: xapian-core +Version: 1.0.18-1 +Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0), zlib1g (>= 1:1.1.4) +Suggests: xapian-tools +Conflicts: libxapian2 +Description: Search engine library + This package contains the core Xapian runtime library. + . + The Xapian search engine library is a highly adaptable toolkit which allows + developers to easily add advanced indexing and search facilities to their own + applications. It implements the probabilistic model of information retrieval, + and provides facilities for performing ranked free-text searches, relevance + feedback, phrase searching, boolean searching, stemming, and simultaneous + update and searching. It is highly scalable, and is capable of working with + collections containing hundreds of millions of documents. +Original-Maintainer: Olly Betts <olly@survex.com> +Homepage: http://xapian.org/ + +Package: libsepol1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 328 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libsepol +Version: 2.0.40-2 +Depends: libc6 (>= 2.4) +Description: SELinux library for manipulating binary security policies + Security-enhanced Linux is a patch of the Linux kernel and a number + of utilities with enhanced security functionality designed to add + mandatory access controls to Linux. The Security-enhanced Linux + kernel contains new architectural components originally developed to + improve the security of the Flask operating system. These + architectural components provide general support for the enforcement + of many kinds of mandatory access control policies, including those + based on the concepts of Type Enforcement®, Role-based Access + Control, and Multi-level Security. + . + libsepol provides an API for the manipulation of SELinux binary policies. + It is used by checkpolicy (the policy compiler) and similar tools, as well + as by programs like load_policy that need to perform specific transformations + on binary policies such as customizing policy boolean settings. +Original-Maintainer: Manoj Srivastava <srivasta@debian.org> + +Package: libpam-modules +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1196 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: pam +Version: 1.1.1-2ubuntu2 +Replaces: libpam-umask, libpam0g-util +Provides: libpam-mkhomedir, libpam-motd, libpam-umask +Depends: base-files (>= 5.0.0ubuntu6) +Pre-Depends: libc6 (>= 2.8), libdb4.8, libpam0g (>= 1.1.0), libselinux1 (>= 2.0.85), debconf (>= 0.5) | debconf-2.0 +Conflicts: libpam-mkhomedir, libpam-motd, libpam-umask +Conffiles: + /etc/security/access.conf 13ec4d189f0ed9acf3433977a53d446b + /etc/security/group.conf 5a6bd21801df034da8d64b407470e8f6 + /etc/security/limits.conf cbacdff4aa5f51749f191b32754946cb + /etc/security/namespace.conf c600fa5899cfb3198a01dfba2bf281f3 + /etc/security/namespace.init 114e73ed5f40956527286e6213d305bc + /etc/security/pam_env.conf ed3f430e418ad366ddb23307a8755249 + /etc/security/sepermit.conf d41c74654734a5c069a37bfc02f0a6d4 + /etc/security/time.conf c23fcbb29dda6c1499e6a5e5ade0265e +Description: Pluggable Authentication Modules for PAM + This package completes the set of modules for PAM. It includes the + pam_unix_*.so module as well as some specialty modules. +Homepage: http://pam.sourceforge.net/ +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: xserver-xorg-video-vmware +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 140 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:10.16.9-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-vmware +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-vmware +Description: X.Org X server -- VMware display driver + This package provides the driver for VMware client sessions, i.e. if Linux + is running inside a VMware session. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-vmware driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: tzdata +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 6276 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 2010i-1 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Provides: tzdata-squeeze +Depends: debconf (>= 0.5) | debconf-2.0 +Description: time zone and daylight-saving time data + This package contains data required for the implementation of + standard local time for many representative locations around the + globe. It is updated periodically to reflect changes made by + political bodies to time zone boundaries, UTC offsets, and + daylight-saving rules. +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> + +Package: libudev0 +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 196 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Source: udev +Version: 151-12 +Depends: libc6 (>= 2.4) +Description: udev library + libudev provides a set of functions for accessing the udev database + and querying sysfs. + +Package: libfontconfig1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 444 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: fontconfig +Version: 2.8.0-2ubuntu1 +Provides: libfontconfig +Depends: libc6 (>= 2.7), libexpat1 (>= 1.95.8), libfreetype6 (>= 2.2.1), zlib1g (>= 1:1.1.4), fontconfig-config (= 2.8.0-2ubuntu1) +Description: generic font configuration library - runtime + Fontconfig is a font configuration and customization library, which + does not depend on the X Window System. It is designed to locate + fonts within the system and select them according to requirements + specified by applications. + . + This package contains the runtime library needed to launch applications + using fontconfig. +Original-Maintainer: Keith Packard <keithp@debian.org> + +Package: xserver-xorg-input-wacom +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 264 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: xf86-input-wacom +Version: 1:0.10.5-0ubuntu4 +Replaces: wacom-tools (<= 1:0.8.4.1-0ubuntu4) +Provides: xserver-xorg-input-7 +Depends: xserver-xorg-core (>= 2:1.6.99.900), libc6 (>= 2.7), libx11-6 (>= 0), libxi6 (>= 2:1.2.0) +Suggests: xinput +Conflicts: wacom-tools (<= 1:0.8.4.1-0ubuntu4) +Description: X.Org X server -- Wacom input driver + This package provides the X.Org driver for Wacom tablet devices. +Homepage: http://linuxwacom.sf.net +Original-Maintainer: Ron Lee <ron@debian.org> + +Package: ifupdown +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 276 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.6.8ubuntu29 +Replaces: netbase (<< 4.00) +Depends: net-tools, libc6 (>= 2.7), debconf (>= 1.2.0) | debconf-2.0, upstart-job, lsb-base (>= 1.3-9ubuntu3), netbase (>= 4.30ubuntu2) +Suggests: iproute, dhcp3-client | dhcp-client, ppp +Breaks: udev (<< 136-1) +Description: high level tools to configure network interfaces + This package provides the tools ifup and ifdown which may be used to + configure (or, respectively, deconfigure) network interfaces based on + interface definitions in the file /etc/network/interfaces. +Original-Maintainer: Anthony Towns <ajt@debian.org> + +Package: libxxf86dga1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 84 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxxf86dga +Version: 2:1.1.1-2 +Depends: libc6 (>= 2.3.4), libx11-6, libxext6, x11-common +Description: X11 Direct Graphics Access extension library + libXxf86dga provides the XFree86-DGA extension, which allows direct + graphics access to a framebuffer-like region, and also allows relative + mouse reporting, et al. It is mainly used by games and emulators for + games. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXxf86dga +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxext6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 148 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxext +Version: 2:1.1.1-2 +Depends: libc6 (>= 2.4), libx11-6 +Description: X11 miscellaneous extension library + libXext provides an X Window System client interface to several extensions to + the X protocol. + . + The supported protocol extensions are: + - DOUBLE-BUFFER (DBE), the Double Buffer extension; + - DPMS, the VESA Display Power Management System extension; + - Extended-Visual-Information (EVI), an extension for gathering extra + information about the X server's visuals; + - LBX, the Low Bandwidth X extension; + - MIT-SHM, the MIT X client/server shared memory extension; + - MIT-SUNDRY-NONSTANDARD, a miscellaneous extension by MIT; + - Multi-Buffering, the multi-buffering and stereo display extension; + - SECURITY, the X security extension; + - SHAPE, the non-rectangular shaped window extension; + - SYNC, the X synchronization extension; + - TOG-CUP, the Open Group's Colormap Utilization extension; + - XC-APPGROUP, the X Consortium's Application Group extension; + - XC-MISC, the X Consortium's resource ID querying extension; + - XTEST, the X test extension (this is one of two client-side + implementations; the other is in the libXtst library, provided by the + libxtst6 package); + . + libXext also provides a small set of utility functions to aid authors of + client APIs for X protocol extensions. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXext +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xterm +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 1332 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 256-1ubuntu1 +Provides: x-terminal-emulator +Depends: xbitmaps, libc6 (>= 2.11), libfontconfig1 (>= 2.8.0), libice6 (>= 1:1.0.0), libncurses5 (>= 5.6+20071006-3), libx11-6 (>= 0), libxaw7, libxft2 (>> 2.1.1), libxmu6, libxt6 +Recommends: x11-utils | xutils +Suggests: xfonts-cyrillic +Conffiles: + /etc/X11/app-defaults/KOI8RXTerm e904665737663827da6ff9b9651910df + /etc/X11/app-defaults/KOI8RXTerm-color d2d26270262950b81921694506281cfe + /etc/X11/app-defaults/UXTerm 420d7404a359b3b74a24d415d1a53254 + /etc/X11/app-defaults/UXTerm-color 446ecb44b3bec790d5c7ac8582ef6ca5 + /etc/X11/app-defaults/XTerm b13fe7ad4bb906659bfc22db2513bacb + /etc/X11/app-defaults/XTerm-color 0ceac6d8b2f3e33be29edddb64394d96 +Description: X terminal emulator + xterm is a terminal emulator for the X Window System. It provides DEC VT102 + and Tektronix 4014 compatible terminals for programs that cannot use the + window system directly. This version implements ISO/ANSI colors and most of + the control sequences used by DEC VT220 terminals. + . + This package provides four commands: xterm, which is the traditional + terminal emulator; uxterm, which is a wrapper around xterm that is + intelligent about locale settings (especially those which use the UTF-8 + character encoding), but which requires the luit program from the x11-utils + package; koi8rxterm, a wrapper similar to uxterm for locales that use the + KOI8-R character set; and lxterm, a simple wrapper that chooses which of the + previous commands to execute based on the user's locale settings. + . + A complete list of control sequences supported by the X terminal emulator + is provided in /usr/share/doc/xterm. + . + The xterm program uses bitmap images provided by the xbitmaps package. + . + Those interested in using koi8rxterm will likely want to install the + xfonts-cyrillic package as well. +Homepage: http://invisible-island.net/xterm/xterm.html +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-radeon +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 1564 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: xserver-xorg-video-ati +Version: 1:6.13.0-1ubuntu5 +Replaces: xserver-xorg-video-ati (<= 1:6.8.191-1) +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), libdrm-radeon1 (>= 2.4.17), libdrm2 (>= 2.4.16), libpciaccess0 (>= 0.10.2), libpixman-1-0, xserver-xorg-core (>= 2:1.6.99.900) +Suggests: firmware-linux +Description: X.Org X server -- AMD/ATI Radeon display driver + This package provides the 'radeon' driver for the AMD/ATI Radeon, FireGL, + FireMV, FirePro and FireStream series. + . + Note that this is not the same as the ATI-provided, binary-only, 'fglrx' + driver, which provides additional 3D functionality for some newer Radeon + cards, but is not supported. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-ati driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: x11-session-utils +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 304 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.5+1 +Replaces: smproxy, xbase-clients (<= 1:7.2.ds2-3), xsm (<= 1:1.0.1-1), xutils (<= 1:7.1.ds.3-1) +Depends: libc6 (>= 2.7), libice6 (>= 1:1.0.0), libsm6, libx11-6, libxaw7, libxmu6, libxt6, cpp +Pre-Depends: x11-common (>= 1:7.0.0) +Conflicts: smproxy, xsm (<= 1:1.0.1-1) +Conffiles: + /etc/X11/app-defaults/XSm 34f161c4cba12ff40099e12b40e511d3 +Description: X session utilities + This package provides the X session manager and related tools: + - rstart; + - smproxy, a session manager proxy for X clients that do not use the X + session manager protocol; + - xsm, a session manager for X sessions; + Installation of an rsh or ssh daemon (server) is necessary if rstartd is + to be used, and installation of an rsh or ssh client is necessary if + rstart is to be used. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxrender1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 96 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxrender +Version: 1:0.9.5-1 +Depends: libc6 (>= 2.2.5), libx11-6 +Description: X Rendering Extension client library + The X Rendering Extension (Render) introduces digital image composition as + the foundation of a new rendering model within the X Window System. + Rendering geometric figures is accomplished by client-side tessellation into + either triangles or trapezoids. Text is drawn by loading glyphs into the + server and rendering sets of them. The Xrender library exposes this + extension to X clients. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXrender +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: mountall +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 232 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Version: 2.14 +Replaces: upstart (<< 0.6.3-2) +Depends: makedev, udev, plymouth, coreutils (>= 7.1), libc6 (>= 2.9), libdbus-1-3 (>= 1.2.16), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libplymouth2 (>= 0.8.1-3), libudev0 (>= 151-5) +Breaks: policycoreutils (<< 2.0.69-2ubuntu4), usplash (<< 0.5.47) +Conffiles: + /etc/init/mountall.conf fba4525691d30c5b18cc3409f990c5be + /etc/init/mountall-net.conf feff70cd7006f6763e24263d381940f3 + /etc/init/mountall-reboot.conf 43e3c229085a13005b0681a49b2bef51 + /etc/init/mountall-shell.conf aa05af89db3de044d1cd7f6971b46d9f + /etc/init/mounted-dev.conf 0c983df7da8b456ea38068e39f2f2a1e + /etc/init/mounted-varrun.conf f1908b81facd9a0e78319327e6a9db0a + /etc/init/mounted-tmp.conf b049fee4d7c235355555a004befe4633 +Description: filesystem mounting tool + mountall mounts filesystems when the underlying block devices are + ready, or when network interfaces come up, checking the filesystems + first. + +Package: xserver-xorg-video-savage +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 240 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 1:2.3.1-1ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-savage +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.3.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-savage +Description: X.Org X server -- Savage display driver + This package provides the driver for the S3/VIA Savage/ProSavage/Twister family + of chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-savage driver module. +Orig-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-fbdev +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.4.1-1ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-fbdev +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-fbdev +Description: X.Org X server -- fbdev display driver + This package provides the driver for the Linux framebuffer device (aka + 'fbdev'). + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-fbdev driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxfont1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 336 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxfont +Version: 1:1.4.1-1 +Depends: libbz2-1.0, libc6 (>= 2.4), libfontenc1, libfreetype6 (>= 2.2.1), zlib1g (>= 1:1.1.4) +Conflicts: xprint (<< 2:1.6.0-1) +Description: X11 font rasterisation library + libXfont provides various services for X servers, most notably font + selection and rasterisation (through external libraries). + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXfont +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: diffutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 776 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:2.8.1-18 +Replaces: diff +Pre-Depends: libc6 (>= 2.4) +Suggests: diffutils-doc +Description: File comparison utilities + The diffutils package provides the diff, diff3, sdiff, and cmp programs. + . + `diff' shows differences between two files, or each corresponding file + in two directories. `cmp' shows the offsets and line numbers where + two files differ. `cmp' can also show all the characters that + differ between the two files, side by side. `diff3' shows differences + among three files. `sdiff' merges two files interactively. + . + The set of differences produced by `diff' can be used to distribute + updates to text files (such as program source code) to other people. + This method is especially useful when the differences are small compared + to the complete files. Given `diff' output, the `patch' program can + update, or "patch", a copy of the file. +Original-Maintainer: Santiago Vila <sanvila@debian.org> + +Package: libxvmc1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxvmc +Version: 2:1.0.5-1ubuntu1 +Depends: libc6 (>= 2.4), libx11-6, libxext6, libxv1, x11-common +Description: X11 Video extension library + libXvMC provides an X Window System client interface to the + XVideo-MotionCompensation extension to the X protocol. + . + The XVideo-MotionCompensation extension allows for further accelerated drawing + of videos. Video data may be sent at earlier stages of the decoding pipeline + than raw YUV data. At the moment, driver support for XvMC is poor to + non-existent. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXvMC +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-input-evdev +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 180 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 1:2.3.2-5ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35) +Provides: xserver-xorg-input-7 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Description: X.Org X server -- evdev input driver + This package provides the driver for input devices using evdev, the Linux + kernel's event delivery mechanism. This driver allows for multiple keyboards + and mice to be treated as separate input devices. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-input-evdev driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxpm4 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 128 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxpm +Version: 1:3.5.8-1 +Depends: libc6 (>= 2.7), libx11-6 +Description: X11 pixmap library + libXpm provides support and common operation for the XPM pixmap format, which + is commonly used in legacy X applications. XPM is an extension of the + monochrome XBM bitmap specificied in the X protocol. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXpm +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: tar +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 2464 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.22-2 +Replaces: cpio (<< 2.4.2-39) +Pre-Depends: libc6 (>= 2.7) +Suggests: bzip2, ncompress +Conflicts: cpio (<= 2.4.2-38) +Conffiles: + /etc/rmt 3c58b7cd13da1085eff0acc6a00f43c7 +Description: GNU version of the tar archiving utility + Tar is a program for packaging a set of files as a single archive in tar + format. The function it performs is conceptually similar to cpio, and to + things like PKZIP in the DOS world. It is heavily used by the Debian package + management system, and is useful for performing system backups and exchanging + sets of files with others. +Original-Maintainer: Bdale Garbee <bdale@gag.com> + +Package: gcc-4.4 +Status: install ok installed +Priority: optional +Section: devel +Installed-Size: 4692 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 4.4.3-4ubuntu5 +Provides: c-compiler +Depends: gcc-4.4-base (= 4.4.3-4ubuntu5), cpp-4.4 (= 4.4.3-4ubuntu5), binutils (>= 2.20), libgcc1 (>= 1:4.4.3-4ubuntu5), libgomp1 (>= 4.4.3-4ubuntu5), libc6 (>= 2.11) +Recommends: libc6-dev (>= 2.5) +Suggests: gcc-4.4-multilib, libmudflap0-4.4-dev (>= 4.4.3-4ubuntu5), gcc-4.4-doc (>= 4.4.3-1), gcc-4.4-locales (>= 4.4.3-1), libgcc1-dbg, libgomp1-dbg, libmudflap0-dbg, libcloog-ppl0, libppl-c2, libppl7 +Description: The GNU C compiler + This is the GNU C compiler, a fairly portable optimizing compiler for C. +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: libdrm-radeon1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 452 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: libdrm +Version: 2.4.18-1ubuntu3 +Depends: libc6 (>= 2.3.4), libdrm2 (>= 2.4.3) +Description: Userspace interface to radeon-specific kernel DRM services -- runtime + This library implements the userspace interface to the radeon-specific kernel + DRM services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is + currently used on Linux to provide hardware-accelerated OpenGL drivers. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: zlib1g +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 176 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: zlib +Version: 1:1.2.3.3.dfsg-15ubuntu1 +Provides: libz1 +Depends: libc6 (>= 2.4) +Conflicts: zlib1 (<= 1:1.0.4-7) +Description: compression library - runtime + zlib is a library implementing the deflate compression method found + in gzip and PKZIP. This package includes the shared library. +Original-Maintainer: Mark Brown <broonie@debian.org> + +Package: xserver-xorg +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 180 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: xorg +Version: 1:7.5+5ubuntu1 +Replaces: x11-common (<< 1:7.3+11), xserver-common (<< 7) +Depends: xserver-xorg-core (>= 2:1.7), xserver-xorg-video-all | xserver-xorg-video-6, xserver-xorg-input-all | xserver-xorg-input-7, xserver-xorg-input-evdev, libc6 (>= 2.7), xkb-data (>= 1.4), x11-xkb-utils, console-setup +Recommends: libgl1-mesa-dri +Conflicts: x11-common (<< 1:7.3+11), xserver-common (<< 7), xserver-xfree86 (<< 6.8.2.dfsg.1-1) +Description: the X.Org X server + This package depends on the full suite of the server and drivers for the + X.Org X server. It does not provide the actual server itself. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxrandr2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxrandr +Version: 2:1.3.0-3 +Depends: libc6 (>= 2.2.5), libx11-6 (>= 0), libxext6 (>= 0), libxrender1 +Description: X11 RandR extension library + libXrandr provides an X Window System client interface to the RandR + extension to the X protocol. + . + The RandR extension allows for run-time configuration of display attributes + such as resolution, rotation, and reflection. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXrandr +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libglu1-mesa +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 548 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: mesa +Version: 7.7.1-1ubuntu2 +Replaces: libglu1 +Provides: libglu1 +Depends: libc6 (>= 2.11), libgcc1 (>= 1:4.1.1), libgl1-mesa-glx | libgl1, libstdc++6 (>= 4.1.1) +Conflicts: libglu1, mesag3 (<< 5.0.0-1), xlibmesa3 +Description: The OpenGL utility library (GLU) + GLU offers simple interfaces for building mipmaps; checking for the + presence of extensions in the OpenGL (or other libraries which follow + the same conventions for advertising extensions); drawing + piecewise-linear curves, NURBS, quadrics and other primitives + (including, but not limited to, teapots); tesselating surfaces; setting + up projection matrices and unprojecting screen coordinates to world + coordinates. + . + On Linux, this library is also known as libGLU or libGLU.so.1. + . + This package provides the SGI implementation of GLU shipped with the + Mesa package (ergo the "-mesa" suffix). +Homepage: http://mesa3d.sourceforge.net/ +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: adduser +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 884 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 3.112ubuntu1 +Replaces: manpages-it (<< 0.3.4-2), manpages-pl (<= 20051117-1) +Depends: perl-base (>= 5.6.0), passwd (>= 1:4.0.12), debconf | debconf-2.0 +Suggests: liblocale-gettext-perl, perl-modules, ecryptfs-utils (>= 67-1) +Conffiles: + /etc/deluser.conf 527e6a57d0bc9f7c1b1aca2071f3da00 +Description: add and remove users and groups + This package includes the 'adduser' and 'deluser' commands for creating + and removing users. + . + - 'adduser' creates new users and groups and adds existing users to + existing groups; + - 'deluser' removes users and groups and removes users from a given + group. + . + Adding users with 'adduser' is much easier than adding them manually. + Adduser will choose appropriate UID and GID values, create a home + directory, copy skeletal user configuration, and automate setting + initial values for the user's password, real name and so on. + . + Deluser can back up and remove users' home directories + and mail spool or all the files they own on the system. + . + A custom script can be executed after each of the commands. + . + Development mailing list: + http://lists.alioth.debian.org/mailman/listinfo/adduser-devel/ +Homepage: http://alioth.debian.org/projects/adduser/ +Original-Maintainer: Debian Adduser Developers <adduser-devel@lists.alioth.debian.org> + +Package: libxcb1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 180 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxcb +Version: 1.5-2 +Depends: libc6 (>= 2.4), libxau6, libxdmcp6 +Breaks: libxcb-xlib0 +Description: X C Binding + This package contains the library files needed to run software using libxcb, + the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions +Original-Maintainer: XCB Developers <xcb@lists.freedesktop.org> +Homepage: http://xcb.freedesktop.org + +Package: xserver-xorg-video-all +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 24 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: xorg +Version: 1:7.5+5ubuntu1 +Replaces: xserver-xorg-driver-all +Depends: xserver-xorg-video-apm, xserver-xorg-video-ark, xserver-xorg-video-ati, xserver-xorg-video-chips, xserver-xorg-video-cirrus, xserver-xorg-video-fbdev, xserver-xorg-video-i128, xserver-xorg-video-intel, xserver-xorg-video-mga, xserver-xorg-video-neomagic, xserver-xorg-video-nouveau, xserver-xorg-video-nv, xserver-xorg-video-rendition, xserver-xorg-video-s3, xserver-xorg-video-s3virge, xserver-xorg-video-savage, xserver-xorg-video-siliconmotion, xserver-xorg-video-sis, xserver-xorg-video-sisusb, xserver-xorg-video-tdfx, xserver-xorg-video-trident, xserver-xorg-video-tseng, xserver-xorg-video-vesa, xserver-xorg-video-openchrome, xserver-xorg-video-voodoo, xserver-xorg-video-v4l, xserver-xorg-video-vmware, x11-common +Conflicts: xserver-xorg-driver-all +Description: the X.Org X server -- output driver metapackage + This package depends on the full suite of output drivers for the X.Org X server + (Xorg). It does not provide any drivers itself, and may be removed if you wish + to only have certain drivers installed. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: locales +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 21820 +Maintainer: Martin Pitt <martin.pitt@ubuntu.com> +Architecture: all +Source: langpack-locales +Version: 2.11+git20100304-3 +Replaces: base-config, belocs-locale-data, belocs-locales-bin, libc6 (<< 2.3.6-0ubuntu6), libc6.1 (<< 2.3.6-0ubuntu6) +Depends: libc6 (>= 2.9-0ubuntu10) | libc6.1 (>= 2.9-0ubuntu10) +Conflicts: base-config, belocs-locale-data +Conffiles: + /etc/locale.alias 6ac3cbee43012440edc6bcbade0a61ce +Description: common files for locale support + This package provides support for localized environments (locales). + It installs character and transliteration maps, provides the POSIX + locale definition and provides common scripts for language pack + handling. + . + The actual locale definitions are not part of this package, these are + shipped in the language packs and are installed and removed + automatically. + +Package: manpages +Status: install ok installed +Priority: important +Section: doc +Installed-Size: 1104 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 3.23-1 +Replaces: bind, rsh-server (<< 0.10-7) +Suggests: man-browser +Description: Manual pages about using a GNU/Linux system + This package contains GNU/Linux manual pages for these sections: + 4 = Devices (e.g. hd, sd). + 5 = File formats and protocols, syntaxes of several system + files (e.g. wtmp, /etc/passwd, nfs). + 7 = Conventions and standards, macro packages, etc. + (e.g. nroff, ascii). + . + Sections 1, 6 and 8 are provided by the respective applications. This + package only includes the intro man page describing the section. + . + The man pages describe syntaxes of several system files. +Original-Maintainer: Martin Schulze <joey@debian.org> + +Package: libgcc1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 132 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gcc-4.4 (4.4.3-4ubuntu5) +Version: 1:4.4.3-4ubuntu5 +Depends: gcc-4.4-base (= 4.4.3-4ubuntu5), libc6 (>= 2.2.5) +Description: GCC support library + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: libklibc +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 136 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: klibc +Version: 1.5.17-4ubuntu1 +Description: minimal libc subset for use with initramfs + klibc is intended to be a minimalistic libc subset for use with + initramfs. It is deliberately written for small size, minimal + entanglement, and portability, not speed. It is definitely a work in + progress, and a lot of things are still missing. +Original-Maintainer: maximilian attems <maks@debian.org> + +Package: libxv1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 80 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxv +Version: 2:1.0.5-1 +Depends: libc6 (>= 2.4), libx11-6, libxext6 +Description: X11 Video extension library + libXv provides an X Window System client interface to the XVideo + extension to the X protocol. + . + The XVideo extension allows for accelerated drawing of videos. Hardware + adaptors are exposed to clients, which may draw in a number of colourspaces, + including YUV. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXv +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: base-files +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 500 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 5.0.0ubuntu20 +Replaces: base, dpkg (<= 1.15.0), lsb-release (<< 3.0-8), miscutils +Provides: base +Depends: base-passwd (>= 2.0.3.4), libpam-modules (>= 0.79-3ubuntu3) +Pre-Depends: awk +Conffiles: + /etc/debian_version 82711d8dc3e89c428b4694a284e32541 + /etc/dpkg/origins/debian 731423fa8ba067262f8ef37882d1e742 + /etc/dpkg/origins/ubuntu ea35901c45553c3451f60476be94d2d8 + /etc/host.conf 89408008f2585c957c031716600d5a80 + /etc/issue 0773f7fd061b03b7643118d133e4c581 + /etc/issue.net b779759799b4ec17dd4dab41ad557f49 + /etc/lsb-release a50b6779ddccab3277e2560028f3eb15 +Description: Debian base system miscellaneous files + This package contains the basic filesystem hierarchy of a Debian system, and + several important miscellaneous files, such as /etc/debian_version, + /etc/host.conf, /etc/issue, /etc/motd, /etc/profile, /etc/nsswitch.conf, + and others, and the text of several common licenses in use on Debian systems. +Original-Maintainer: Santiago Vila <sanvila@debian.org> + +Package: mount +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 380 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: util-linux +Version: 2.17.2-0ubuntu1 +Pre-Depends: libblkid1 (>= 2.17), libc6 (>= 2.7), libselinux1 (>= 2.0.15), libsepol1 (>= 1.14), libuuid1 (>= 2.16) +Suggests: nfs-common (>= 1:1.1.0-13) +Breaks: nfs-common (<< 1:1.1.0-7) +Description: Tools for mounting and manipulating filesystems + This package provides the mount(8), umount(8), swapon(8), + swapoff(8), and losetup(8) commands. +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: libtext-iconv-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.7-2 +Depends: libc6 (>= 2.2.5), perl-base (>= 5.10.0-24ubuntu4), perlapi-5.10.0 +Description: converts between character sets in Perl + The iconv() family of functions from XPG4 define an API for converting + between character sets (e.g. UTF-8 to Latin1, EBCDIC to ASCII). They + are provided by libc6. + . + This package allows access to them from Perl via the Text::Iconv + package. +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://search.cpan.org/search?module=Text::Iconv + +Package: console-setup +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 1396 +Maintainer: Ubuntu Installer Team <ubuntu-installer@lists.ubuntu.com> +Architecture: all +Version: 1.34ubuntu15 +Depends: debconf (>= 0.5) | debconf-2.0, console-terminus (>= 4.26), xkb-data (>= 0.9), initramfs-tools (>= 0.85eubuntu12), kbd (>= 1.15-1ubuntu3) +Suggests: lsb-base (>= 3.0-6), locales +Conflicts: lsb (<< 2.0-6), lsb-base (<< 3.0-6), lsb-core (<< 2.0-6) +Conffiles: + /etc/console-setup/compose.ARMSCII-8.inc fef36b61fb8b1cacc151ad3db127f777 + /etc/console-setup/compose.CP1251.inc fef88d8c8dd4c726498003fd3cd84a7f + /etc/console-setup/compose.CP1255.inc c972a2e90938657e97b643366b98b2ed + /etc/console-setup/compose.CP1256.inc 5ea5e4d41da7a88f742863810e86144b + /etc/console-setup/compose.GEORGIAN-ACADEMY.inc b6d80f40abff7e8af236796ebaca0247 + /etc/console-setup/compose.GEORGIAN-PS.inc cf45272b6bf35a22223b132600dc36c3 + /etc/console-setup/compose.IBM1133.inc a31102602f7e7cab9738022b6c5469ae + /etc/console-setup/compose.ISIRI-3342.inc 5ada7fbba750192f11fa238add232ba9 + /etc/console-setup/compose.ISO-8859-1.inc 719a4300a50dcb168d7de921bab338e9 + /etc/console-setup/compose.ISO-8859-10.inc e5fce59617c839b56574c9e323d34686 + /etc/console-setup/compose.ISO-8859-11.inc ad2f3cc7ee64602a790bad8a2a989243 + /etc/console-setup/compose.ISO-8859-13.inc 9c2f47a52091515749fefc62fc8efd63 + /etc/console-setup/compose.ISO-8859-14.inc a19822b59629ea7af7682d9247de807f + /etc/console-setup/compose.ISO-8859-15.inc cfa9b04fec26afa1debc17ce09d46a0a + /etc/console-setup/compose.ISO-8859-16.inc 8245c19b5262d8d23ca856587739eb20 + /etc/console-setup/compose.ISO-8859-2.inc a56cb83dbe0cd88e4deef52d966d30e4 + /etc/console-setup/compose.ISO-8859-3.inc e70d7b634791b9c97db75bddf6dcc5fa + /etc/console-setup/compose.ISO-8859-4.inc 4092be9556db0ac82e96eae413f1bd47 + /etc/console-setup/compose.ISO-8859-5.inc f861a4b0403490677e6d400f2d7129da + /etc/console-setup/compose.ISO-8859-6.inc 41ea36ea1c1a1c0c9bebdf0016395e1f + /etc/console-setup/compose.ISO-8859-7.inc aa280de25f20e82f58da707101b24d48 + /etc/console-setup/compose.ISO-8859-8.inc 9cceaa9f3312f89aba371d3c893f4e7b + /etc/console-setup/compose.ISO-8859-9.inc 1893bc3994c24917c907a17ceb2f284b + /etc/console-setup/compose.KOI8-R.inc 8cfd7766b86e5e55d6e71d0d95519c92 + /etc/console-setup/compose.KOI8-U.inc 217ee62f6982736276f41f760f8622f8 + /etc/console-setup/compose.TIS-620.inc 31b73af83ef3993c128e2b983b9eaf89 + /etc/console-setup/compose.VISCII.inc 0741db54ddb6268e476010a44f219f03 + /etc/init/console-setup.conf 1e2fdc7b62f4d1dee3845f5fc2b13fc4 +Description: console font and keymap setup program + This package provides the Linux console with the same + keyboard configuration scheme as the X Window System. As a result, + there is no need to duplicate or change the keyboard files just to + make simple customizations such as the use of dead keys, the key + functioning as AltGr or Compose key, the key(s) to switch between + Latin and non-Latin mode, etc. + . + The package also contains console fonts supporting many of the + world's languages. It provides an unified set of font faces - the + classic VGA, the simplistic Fixed, and the cleaned Terminus, + TerminusBold and TerminusBoldVGA. +Original-Maintainer: Debian Install System Team <debian-boot@lists.debian.org> + +Package: xserver-xorg-input-synaptics +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 356 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.2.2-1ubuntu4 +Replaces: xfree86-driver-synaptics (<< 0.14.4-2), xorg-driver-synaptics +Provides: xfree86-driver-synaptics, xorg-driver-synaptics, xserver-xorg-input-7 +Depends: udev, libc6 (>= 2.4), libpciaccess0, libpixman-1-0, libx11-6 (>= 0), libxi6 (>= 2:1.2.0), xserver-xorg-core (>= 2:1.6.99.900) +Suggests: gpointing-device-settings, touchfreeze +Conflicts: xfree86-driver-synaptics (<< 0.14.4-2), xorg-driver-synaptics +Description: Synaptics TouchPad driver for X.Org server + This package provides an input driver for the X.Org X server to enable + advanced features of the Synaptics Touchpad including: + . + * Movement with adjustable, non-linear acceleration and speed + * Button events through short touching of the touchpad + * Double-Button events through double short touching of the touchpad + * Dragging through short touching and holding down the finger on the touchpad + * Middle and right button events on the upper and lower corner of the touchpad + * Vertical scrolling (button four and five events) through moving the finger + on the right side of the touchpad + * The up/down button sends button four/five events + * Horizontal scrolling (button six and seven events) through moving the finger + on the lower side of the touchpad + * The multi-buttons send button four/five events, and six/seven events for + horizontal scrolling + * Adjustable finger detection + * Multifinger taps: two finger for middle button and three finger for right + button events. (Needs hardware support. Not all models implement this + feature.) + * Run-time configuration using shared memory. This means you can change + parameter settings without restarting the X server (see synclient(1)). + * It also provides a daemon to disable touchpad while typing at the keyboard + and thus avoid unwanted mouse movements (see syndaemon(1)). +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-vesa +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:2.3.0-1ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-vesa +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-vesa +Description: X.Org X server -- VESA display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + uses the standard VESA interface provided on all video cards, but runs + unaccelerated. This driver is not recommended for use unless you have a + problem with the normal driver for your card, because it will peform very + badly. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-vesa driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libreadline6 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 408 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: readline6 +Version: 6.1-1 +Depends: readline-common, libc6 (>= 2.11~20100104-0ubuntu5), libncurses5 (>= 5.6+20071006-3) +Description: GNU readline and history libraries, run-time libraries + The GNU readline library aids in the consistency of user interface + across discrete programs that need to provide a command line + interface. + . + The GNU history library provides a consistent user interface for + recalling lines of previously typed input. +Original-Maintainer: Matthias Klose <doko@debian.org> + +Package: libncurses5 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 512 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: ncurses +Version: 5.7+20090803-2ubuntu3 +Depends: libc6 (>= 2.4) +Recommends: libgpm2 +Description: shared libraries for terminal handling + This package contains the shared libraries necessary to run programs + compiled with ncurses. +Homepage: ftp://invisible-island.net/ncurses/ +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: libplymouth2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 312 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: plymouth +Version: 0.8.2-2ubuntu2 +Replaces: plymouth (<< 0.7.0+git20090207-0ubuntu0.1~ppa4) +Depends: libc6 (>= 2.8), libpng12-0 (>= 1.2.13-4) +Breaks: casper (= 1.227), mountall (<< 2.8) +Description: graphical boot animation and logger - shared libraries + Plymouth is an application that runs very early in the boot process + (even before the root filesystem is mounted!) that provides a graphical + boot animation while the boot process happens in the background. + . + This package contains the shared libraries. + +Package: libkeyutils1 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 60 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: keyutils +Version: 1.2-12 +Depends: libc6 (>= 2.2.5) +Description: Linux Key Management Utilities (library) + Keyutils is a set of utilities for managing the key retention facility in the + kernel, which can be used by filesystems, block devices and more to gain and + retain the authorization and encryption keys required to perform secure + operations. + . + This package provides a wrapper library for the key management facility system + calls. +Original-Maintainer: Daniel Baumann <daniel@lists.debian-maintainers.org> +Homepage: http://people.redhat.com/~dhowells/keyutils/ + +Package: libexpat1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 392 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: expat +Version: 2.0.1-7ubuntu1 +Depends: libc6 (>= 2.4) +Conflicts: wink (<= 1.5.1060-4) +Description: XML parsing C library - runtime library + This package contains the runtime, shared library of expat, the C + library for parsing XML. Expat is a stream-oriented parser in + which an application registers handlers for things the parser + might find in the XML document (like start tags). +Homepage: http://expat.sourceforge.net +Original-Maintainer: Debian XML/SGML Group <debian-xml-sgml-pkgs@lists.alioth.debian.org> + +Package: xserver-xorg-video-rendition +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 116 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:4.2.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-rendition +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-rendition +Description: X.Org X server -- Rendition display driver + This package provides the driver for the Rendition Verite family of chipsets, + commonly found in 3D accelerators such as the Creative 3D Blaster. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-rendition driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: patch +Status: install ok installed +Priority: standard +Section: vcs +Installed-Size: 244 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.6-2ubuntu1 +Depends: libc6 (>= 2.4) +Suggests: ed, diffutils-doc +Description: Apply a diff file to an original + Patch will take a patch file containing any of the four forms + of difference listing produced by the diff program and apply + those differences to an original file, producing a patched + version. +Original-Maintainer: Christoph Berg <myon@debian.org> + +Package: initramfs-tools-bin +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 104 +Maintainer: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com> +Architecture: amd64 +Source: initramfs-tools +Version: 0.92bubuntu78 +Depends: libc6 (>= 2.11), libudev0 (>= 147) +Description: binaries used by initramfs-tools + This package contains binaries used inside the initramfs images generated + by initramfs-tools. +Original-Maintainer: Debian kernel team <debian-kernel@lists.debian.org> + +Package: libxi6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 144 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxi +Version: 2:1.3-3 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.2.99.901), libxext6 (>= 0) +Description: X11 Input extension library + libXi provides an X Window System client interface to the XINPUT + extension to the X protocol. + . + The Input extension allows setup and configuration of multiple input devices, + and will soon allow hotplugging of input devices; to be added and removed on + the fly. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXi +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xinit +Status: deinstall ok config-files +Priority: optional +Section: x11 +Installed-Size: 128 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.2.0-1 +Config-Version: 1.2.0-1 +Replaces: xbase-clients (<= 1:7.2.ds2-3) +Depends: libc6 (>= 2.4), libx11-6, x11-common, xauth +Recommends: xserver-xorg | xserver, xterm | x-session-manager | x-window-manager | x-terminal-emulator +Conffiles: + /etc/X11/xinit/xinitrc cc40a5ba097b062b284e639f4160c04e + /etc/X11/xinit/xserverrc 50faa91e980a25adcd0de32020b340bb +Description: X server initialisation tool + xinit and startx are programs which facilitate starting an X server, and + loading a base X session. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libattr1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 68 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: attr +Version: 1:2.4.44-1 +Depends: libc6 (>= 2.4) +Conflicts: attr (<< 2.0.0) +Description: Extended attribute shared library + Contains the runtime environment required by programs that make use + of extended attributes. +Original-Maintainer: Nathan Scott <nathans@debian.org> +Homepage: http://savannah.nongnu.org/projects/attr/ + +Package: xfonts-base +Status: install ok installed +Priority: optional +Section: fonts +Installed-Size: 8272 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 1:1.0.1 +Replaces: xfonts-misc +Depends: xfonts-utils +Suggests: xfs | xserver +Conffiles: + /etc/X11/fonts/misc/xfonts-base.alias a8ec05d528431d4c9703b55a7efd67a8 +Description: standard fonts for X + xfonts-base provides a standard set of low-resolution bitmapped fonts. In + most cases it is desirable to have the X font server (xfs) and/or an X server + installed to make the fonts available to X clients. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-sisusb +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.9.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-sisusb +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-sisusb +Description: X.Org X server -- SiS USB display driver + This package provides the driver for SiS USB-attached video devices. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-sisusb driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: sed +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 972 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 4.2.1-6 +Depends: dpkg (>= 1.15.4) | install-info +Pre-Depends: libc6 (>= 2.4), libselinux1 (>= 1.32) +Description: The GNU sed stream editor + sed reads the specified files or the standard input if no + files are specified, makes editing changes according to a + list of commands, and writes the results to the standard + output. +Original-Maintainer: Clint Adams <schizo@debian.org> +Homepage: http://www.gnu.org/software/sed/ + +Package: libidn11 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 368 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libidn +Version: 1.15-2 +Replaces: libidn11-dev +Depends: libc6 (>= 2.4) +Conflicts: libidn9-dev +Description: GNU Libidn library, implementation of IETF IDN specifications + GNU Libidn is a fully documented implementation of the Stringprep, + Punycode and IDNA specifications. Libidn's purpose is to encode and + decode internationalized domain names. The Nameprep, XMPP, SASLprep, + and iSCSI profiles are supported. + . + This package contains the shared library. +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://www.gnu.org/software/libidn/ + +Package: xserver-xorg-video-tdfx +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.4.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-tdfx +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-tdfx +Description: X.Org X server -- tdfx display driver + This package provides the driver for 3dfx Voodoo video cards and their + derivatives. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-tdfx driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: klibc-utils +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 476 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: klibc +Version: 1.5.17-4ubuntu1 +Depends: libklibc (= 1.5.17-4ubuntu1) +Description: small utilities built with klibc for early boot + This package contains a collection of programs that are linked + against klibc. These duplicate some of the functionality of a + regular Linux toolset, but are typically much smaller than their + full-function counterparts. They are intended for inclusion in + initramfs images and embedded systems. +Original-Maintainer: maximilian attems <maks@debian.org> + +Package: e2fslibs +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 316 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: e2fsprogs +Version: 1.41.11-1ubuntu2 +Replaces: e2fsprogs (<< 1.34-1) +Provides: libe2p2, libext2fs2 +Depends: libc6 (>= 2.7) +Description: ext2/ext3/ext4 file system libraries + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package provides the ext2fs and e2p libraries, for userspace software + that directly accesses extended file systems. Programs that use libext2fs + include e2fsck, mke2fs, and tune2fs. Programs that use libe2p include + dumpe2fs, chattr, and lsattr. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: xfonts-100dpi +Status: install ok installed +Priority: optional +Section: fonts +Installed-Size: 4808 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 1:1.0.1 +Depends: xfonts-utils +Suggests: xfs | xserver +Conffiles: + /etc/X11/fonts/100dpi/xfonts-100dpi.alias 85bebd6ca213aa656c301a72eb4397cb +Description: 100 dpi fonts for X + xfonts-100dpi provides a set of bitmapped fonts at 100 dots per inch. In + most cases it is desirable to have the X font server (xfs) and/or an X server + installed to make the fonts available to X clients. + . + This package contains only fonts in the ISO 10646-1 and ISO 8859-1 + encodings, to conserve disk space. For other encodings, see the + xfonts-100dpi-transcoded package. + . + This package and xfonts-75dpi provide the same set of fonts, rendered at + different resolutions; only one or the other is necessary, but both may be + installed. xfonts-100dpi may be more suitable for large monitors and/or + large screen resolutions (over 1024x768). + . + This package requires the xfonts-utils package to prepare the font + directories for use by an X server or X font server. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libkrb5support0 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 124 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: krb5 +Version: 1.8.1+dfsg-2 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.3.4), libkeyutils1 +Suggests: krb5-doc, krb5-user +Description: MIT Kerberos runtime libraries - Support library + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the Kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos V5. + . + This package contains an internal runtime support library used by other + Kerberos libraries. +Original-Maintainer: Sam Hartman <hartmans@debian.org> +Homepage: http://web.mit.edu/kerberos/ + +Package: libgl1-mesa-glx +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 632 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: mesa +Version: 7.7.1-1ubuntu2 +Replaces: libgl1, libgl1-mesa-dri (<< 6.4.0) +Provides: libgl1 +Depends: libc6 (>= 2.4), libdrm2 (>= 2.3.1), libx11-6 (>= 0), libxdamage1 (>= 1:1.1), libxext6 (>= 0), libxfixes3 (>= 1:4.0.1), libxxf86vm1, dpkg (>= 1.15.4) +Recommends: libgl1-mesa-dri (>= 7.2) +Conflicts: libgl1, libgl1-mesa-dri (<< 6.4.0) +Description: A free implementation of the OpenGL API -- GLX runtime + This version of Mesa provides GLX and DRI capabilities: it is capable of + both direct and indirect rendering. For direct rendering, it can use DRI + modules from the libgl1-mesa-dri package to accelerate drawing. + . + This package does not include the modules themselves: these can be found + in the libgl1-mesa-dri package. + . + For a complete description of Mesa, please look at the + libgl1-mesa-swx11 package. +Homepage: http://mesa3d.sourceforge.net/ +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: x11-utils +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 688 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.5+3 +Replaces: appres, editres, listres, luit, viewres, xbase-clients (<< 1:7.2.ds3), xdpyinfo, xdriinfo, xev, xfd, xfontsel, xkill, xlsatoms, xlsclients, xlsfonts, xmessage, xprop, xutils (<< 1:7.2), xvinfo, xwininfo +Depends: libc6 (>= 2.7), libfontconfig1 (>= 2.8.0), libfontenc1, libfreetype6 (>= 2.2.1), libgl1-mesa-glx | libgl1, libx11-6 (>= 0), libxaw7, libxext6 (>= 0), libxft2 (>> 2.1.1), libxi6 (>= 0), libxinerama1, libxmu6, libxmuu1, libxrender1, libxt6, libxtst6, libxv1, libxxf86dga1, libxxf86vm1, zlib1g (>= 1:1.1.4), cpp +Pre-Depends: x11-common (>= 1:7.0.0) +Suggests: mesa-utils +Conflicts: appres, editres, listres, luit, viewres, xdpyinfo, xdriinfo, xev, xfd, xfontsel, xkill, xlsatoms, xlsclients, xlsfonts, xmessage, xprop, xvinfo, xwininfo +Conffiles: + /etc/X11/app-defaults/Editres 04c860eb13ac3a4e8d74ebebcf3da76c + /etc/X11/app-defaults/Editres-color f16b07f1caf85b42cd40355e23d927a0 + /etc/X11/app-defaults/Viewres 4f77da598593ff07cda9d2d147a07772 + /etc/X11/app-defaults/Viewres-color ff9c397a80443790a97b909050f63282 + /etc/X11/app-defaults/Xfd 5cee09dc86e1dc14c19492b6b866d17c + /etc/X11/app-defaults/XFontSel d917f63ef27294544ab192a3e33e30df + /etc/X11/app-defaults/Xmessage eed84b35dde8b18e7dcfc80e75c1da67 + /etc/X11/app-defaults/Xmessage-color ca383db9e4e9648bda0952ad6b8a2115 +Description: X11 utilities + An X client is a program that interfaces with an X server (almost always via + the X libraries), and thus with some input and output hardware like a + graphics card, monitor, keyboard, and pointing device (such as a mouse). + . + This package provides a miscellaneous assortment of X utilities + that ship with the X Window System, including: + - appres, editres, listres and viewres, which query the X resource database; + - luit, a filter that can be run between an arbitrary application and a + UTF-8 terminal emulator; + - xdpyinfo, a display information utility for X; + - xdriinfo, query configuration information of DRI drivers; + - xev, an X event displayer; + - xfd, a tool that displays all the glyphs in a given X font; + - xfontsel, a tool for browsing and selecting X fonts; + - xkill, a tool for terminating misbehaving X clients; + - xlsatoms, which lists interned atoms defined on an X server; + - xlsclients, which lists client applications running on an X display; + - xlsfonts, a server font list displayer; + - xmessage, a tool to display message or dialog boxes; + - xprop, a property displayer for X; + - xvinfo, an Xv extension information utility for X; + - xwininfo, a window information utility for X; + . + The editres and viewres programs use bitmap images provided by the + xbitmaps package. The luit program requires locale information from + the libx11-data package. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: base-passwd +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 184 +Maintainer: Colin Watson <cjwatson@debian.org> +Architecture: amd64 +Version: 3.5.22 +Replaces: base +Depends: libc6 (>= 2.8) +Description: Debian base system master password and group files + These are the canonical master copies of the user database files + (/etc/passwd and /etc/group), containing the Debian-allocated user and + group IDs. The update-passwd tool is provided to keep the system databases + synchronized with these master files. + +Package: libcomerr2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 108 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: e2fsprogs +Version: 1.41.11-1ubuntu2 +Replaces: e2fsprogs (<< 1.34-1) +Provides: libcomerr-kth-compat +Depends: libc6 (>= 2.3.4) +Description: common error description library + libcomerr is an attempt to present a common error-handling mechanism to + manipulate the most common form of error code in a fashion that does not + have the problems identified with mechanisms commonly in use. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: mawk +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 256 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.3.3-15ubuntu2 +Provides: awk +Pre-Depends: libc6 (>= 2.11~20100104-0ubuntu3) +Description: a pattern scanning and text processing language + Mawk is an interpreter for the AWK Programming Language. The AWK + language is useful for manipulation of data files, text retrieval and + processing, and for prototyping and experimenting with algorithms. Mawk + is a new awk meaning it implements the AWK language as defined in Aho, + Kernighan and Weinberger, The AWK Programming Language, Addison-Wesley + Publishing, 1988. (Hereafter referred to as the AWK book.) Mawk conforms + to the POSIX 1003.2 (draft 11.3) definition of the AWK language + which contains a few features not described in the AWK book, and mawk + provides a small number of extensions. + . + Mawk is smaller and much faster than gawk. It has some compile-time + limits such as NF = 32767 and sprintf buffer = 1020. +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: xserver-xorg-video-ark +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 84 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.7.2-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-ark +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-ark +Description: X.Org X server -- ark display driver + This package provides the driver for the ark family + of chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-ark driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: gnupg +Status: install ok installed +Priority: important +Section: utils +Installed-Size: 5320 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.4.10-2ubuntu1 +Depends: libbz2-1.0, libc6 (>= 2.4), libreadline6, libusb-0.1-4 (>= 2:0.1.12), zlib1g (>= 1:1.1.4), dpkg (>= 1.15.4) | install-info, gpgv +Recommends: libldap-2.4-2 (>= 2.4.7), gnupg-curl +Suggests: gnupg-doc, xloadimage | imagemagick | eog, libpcsclite1 +Description: GNU privacy guard - a free PGP replacement + GnuPG is GNU's tool for secure communication and data storage. + It can be used to encrypt data and to create digital signatures. + It includes an advanced key management facility and is compliant + with the proposed OpenPGP Internet standard as described in RFC2440. + . + The gnupg package is built without libcurl. So it does not support + HKPS keyservers. Install the gnupg-curl package if you want to use + the keyserver helper tools built with libcurl and supporting HKPS. + . + GnuPG does not use any patented algorithms. This means it cannot be + compatible with PGP2, because that uses IDEA (which is patented in + a number of countries). +Homepage: http://www.gnupg.org +Original-Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org> + +Package: xserver-xorg-video-cirrus +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 164 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.3.2-1ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-cirrus +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-cirrus +Description: X.Org X server -- Cirrus display driver + This package provides the driver for the Cirrus Logic family of video + cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-cirrus driver module. +Orig-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libdb4.8 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1516 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: db +Version: 4.8.24-1ubuntu1 +Depends: libc6 (>= 2.4) +Conflicts: libdb2 (<< 2:2.7.7-3) +Description: Berkeley v4.8 Database Libraries [runtime] + This is the runtime package for programs that use the v4.8 Berkeley + database library. +Homepage: http://www.oracle.com/technology/software/products/berkeley-db/index.html +Original-Maintainer: Debian Berkeley DB Maintainers <pkg-db-devel@lists.alioth.debian.org> + +Package: x11-apps +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 2276 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.5+1ubuntu2 +Replaces: bitmap, ico, oclock, x11perf, xbase-clients (<= 1:7.2.ds2-3), xbiff, xcalc, xclipboard, xclock, xconsole, xcursorgen, xditview, xeyes, xgc, xload, xlogo, xmag, xman, xmore, xwd, xwud +Depends: libc6 (>= 2.11), libpng12-0 (>= 1.2.13-4), libsm6, libx11-6 (>= 0), libxaw7, libxcursor1 (>> 1.1.2), libxext6 (>= 0), libxft2 (>> 2.1.1), libxkbfile1, libxmu6, libxmuu1, libxrender1, libxt6, cpp +Pre-Depends: x11-common (>= 1:7.0.0) +Suggests: mesa-utils +Conflicts: bitmap, ico, oclock, x11perf, xbiff, xcalc, xclipboard, xclock, xconsole, xcursorgen, xditview, xeyes, xgc, xload, xlogo, xmag, xman, xmore, xwd, xwud +Conffiles: + /etc/X11/app-defaults/Bitmap 53d1579022e3e95bc2b15eb813f08731 + /etc/X11/app-defaults/Bitmap-color 946b659d5d6c41b6840f5e0df10680d9 + /etc/X11/app-defaults/Bitmap-nocase f2db8f925e5ea5680090c32db9121c8d + /etc/X11/app-defaults/Clock-color b4ba6ae900e0e488e4b030f14c6fe656 + /etc/X11/app-defaults/XCalc bc0d4c4717137a2d25e17b7358c8ad8d + /etc/X11/app-defaults/XCalc-color c8efe9caf8987a902df98270e2b291c9 + /etc/X11/app-defaults/XClipboard 18ebd8e152da9203e9e34e88dad98d97 + /etc/X11/app-defaults/XClock 812dfcc6f6d83e2ae9da809c3bf11c67 + /etc/X11/app-defaults/XClock-color 7b049809f0bca03c76480959e2e4db89 + /etc/X11/app-defaults/XConsole a310ffbe0ed9509a2477ea5f1ac1dcc5 + /etc/X11/app-defaults/Xditview 49d35244a61618b60f17d3400f64a81e + /etc/X11/app-defaults/Xditview-chrtr 98a562569a7db396c9a0d2e6d414067e + /etc/X11/app-defaults/Xedit 013f41442eb431168793e1943779c8f3 + /etc/X11/app-defaults/Xedit-color 59d7f0d96f4346ae0fe4904d46daf53c + /etc/X11/app-defaults/Xgc 744adc578acb239541e378eb16e337f7 + /etc/X11/app-defaults/Xgc-color 8dfaceb0c12917fd0b1c77423f9f6a47 + /etc/X11/app-defaults/XLoad 3ea554c7be110102e42e25d3d83c4134 + /etc/X11/app-defaults/XLogo fb1407c8cb1574726a6eb743b0092407 + /etc/X11/app-defaults/XLogo-color 439375bf8e3b87f46eebf35f55a8dbb5 + /etc/X11/app-defaults/Xmag 798a596142ae1b051408171e2b2db096 + /etc/X11/app-defaults/Xman b34cc2adfe0b89d436864163387417d1 + /etc/X11/app-defaults/XMore d6a85ee054f522e47a246d4471b6ab49 +Description: X applications + This package provides a miscellaneous assortment of X applications + that ship with the X Window System, including: + - atobm, bitmap, and bmtoa, tools for manipulating bitmap images; + - oclock and xclock, graphical clocks; + - xbiff, a tool which tells you when you have new email; + - xcalc, a scientific calculator desktop accessory; + - xclipboard, a tool to manage cut-and-pasted text selections; + - xconsole, which monitors system console messages; + - xcursorgen, a tool for creating X cursor files from PNGs; + - xditview, a viewer for ditroff output; + - xedit, a simple text editor for X; + - xeyes, a demo program in which a pair of eyes track the pointer; + - xgc, a graphics demo; + - xload, a monitor for the system load average; + - xlogo, a demo program that displays the X logo; + - xmag, which magnifies parts of the X screen; + - xman, a manual page browser; + - xmore, a text pager; + - xwd, a utility for taking window dumps ("screenshots") of the X session; + - xwud, a viewer for window dumps created by xwd; + - Xmark, x11perf, and x11perfcomp, tools for benchmarking graphical + operations under the X Window System; + . + The xbiff, xcalc, xconsole and xman programs use bitmap images provided + by the xbitmaps package. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: x11-common +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 640 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: all +Source: xorg +Version: 1:7.5+5ubuntu1 +Replaces: x-common, xfree86-common, xorg-common, xserver-common (<< 7) +Depends: debconf (>= 0.5) | debconf-2.0, upstart-job, debianutils (>= 1.13), lsb-base (>= 1.3-9ubuntu2) +Pre-Depends: debconf | debconf-2.0 +Conflicts: aee (<= 2.2.15b-1), ascd (<= 0.13.2-3), beaver (<= 0.2.5-2), bibview (<= 2.2-8), bugsx (<= 1.08-8), buici-clock (<= 0.4.5+b1), communicator-smotif-477, ctwm (<= 3.7-2), emelfm (<= 0.9.2-7), epan, fte-xwindow (<= 0.50.0-1.3), fvwm1 (<= 1.24r-46), fvwm95 (<= 2.0.43ba-23+b1), gerstensaft (<= 0.2-5.1), ghostview, gipsc (<= 0.4.3-2), grace (<= 1:5.1.18-1), grace6 (<= 5.99.0+final-4), gradio (<= 1.0.1-6), groff (<= 1.18.1.1-7), guitar (<= 0.1.4-11), hamsoft (<< 0.2.3-1), hanterm-classic (<= 3.1.6.0-4), hanterm-xf (<= 1:3.3.1p18-9.2), hfsutils-tcltk (<= 3.2.6-7), ibp (<= 0.21-4), isdnutils-xtools (<= 1:3.8.2005-12-06-4), ivtools-bin (<= 1.1.3-5), ivtools-dev (<= 1.1.3-5), kdrill (<= 6.4-2.1), kinput2-canna (<= 3.1-7), kinput2-canna-wnn (<= 3.1-7), kinput2-wnn (<= 3.1-7), kterm (<= 6.2.0-45), lbxproxy (<< 7.0), libmotif-dev (<= 2.2.3-1.3), libxft-dev (<= 2.1.8.2-5), lm-batmon (<= 0.96-3), login.app (<= 1.2.1-18), lsb-core (<= 3.1-4), lwm (<= 1.2.1-1), mctools-lite (<= 970129-16), mgp (<= 1.11b-6), motif-clients (<= 2.2.3-1.3), navigator-smotif-477, netscape-base-4, olvwm (<= 4.4.3.2p1.4-21), olwm (<= 3.2p1.4-21), oneko (<= 1.2.sakura.6-1), opera (<< 9.10-20060616), pgaccess (<= 1:0.98.8.20030520-2), phototk, pixmap (<= 2.6pl4-14.1), plotmtv (<= 1.4.4t-8.1), pmud (<= 0.10-9), ppxp (<= 0.2001080415-14), ppxp-x11 (<= 0.2001080415-14), procmeter (<= 2.5.1-11), propsel (<= 971130-5.3), proxymngr (<< 7.0), qcam (<= 0.91-11.1), regexplorer (<= 0.1.6-12), seyon (<= 2.20c-20), skkinput (<= 1:2.06.4-4), stella (<< 2.2-1), tkdesk (<= 2.0-5), tkseti (<= 3.06-1), tkworld, twlog (<= 1.3-4), twm (<< 7.0), ucbmpeg-play (<< 2.3p-13), vide (<= 1.21-3), videogen (<= 0.32-1), vtwm (<= 5.4.7-2), w9wm (<= 0.4.2-4), wdm (<= 1.28-1), wily (<= 0.13.41-6), wmavgload (<= 0.7.0-6.1), wmcpu (<= 1.3-4.1), wmdate (<= 0.5-7.1), wmnet (<= 1.05-12), wmnetselect (<= 0.85-5.5), wmscope (<= 3.0-9.1), wmsensors (<= 1.0.4-3.4), wmtv (<= 0.6.5-15), x-common, xautolock (<= 1:2.1-6), xbanner (<= 1.31-23), xbase-clients (<< 1:7.0), xbatt (<= 1.2.1-4), xbattbar (<= 1.4.2-3.1), xcal (<= 4.1-18.2), xcalendar-i18n (<= 4.0.0.i18p1-13.1), xcb (<= 2.4-4), xclip (<= 0.08-5), xclips (<= 6.21-6), xcolors (<= 1.5a-2), xcolorsel (<= 1.1a-11), xdkcal (<= 0.9d-2.1), xdm (<= 1:1.0.1-6), xdmx (<< 1:1.0), xdu (<= 3.0-14), xearth (<= 1.1-10.2), xengine (<= 1.11-9), xephem (<= 3.4-5), xext, xezmlm (<= 1.0.3-11), xfaces (<= 3.3-25), xfishtank (<= 2.2-23.1), xfm (<= 1.4.3-8), xfractint (<< 20.3.01-1), xfree86-common, xfs (<< 1:1.0), xfs-xtt (<= 1:1.4.1.xf430-6), xftp, xfwp (<< 7.0), xgdipc (<= 1.2-0.3), xgmod (<= 3.1-9), xgobi, xgraph (<= 12.1-3), xinput (<= 1.2-5.2), xipmsg (<= 0.8088-1.1), xisp, xlbiff (<< 4.1-4), xli (<= 1.17.0-21), xlockmore (<= 1:5.21-1), xlockmore-gl (<= 1:5.21-1), xlogmaster (<= 1.6.0-8), xmailbox (<= 2.5-9), xmem (<= 1.20-19), xmeter (<= 1.15-6), xmh (<= 6.8.2.dfsg.1-4), xmix (<= 2.1-5), xmon (<= 1.5.6-1.3), xnecview (<= 1.34-2), xnest (<< 1:1.0), xodo (<= 1.2-9.2), xorg-common, xpaste, xpmumon (<= 1.3.0), xpostit (<= 3.3.1-8.2), xpostitplus, xprint (<= 1:0.1.0.alpha1-13), xqbiff (<= 0.75-4), xrn (<= 9.02-7.1), xserver-common (<< 7), xserver-xfree86 (<< 1:7.0), xserver-xfree86-dbg, xserver-xorg (<< 1:7.4~), xslideshow (<= 3.1-8.1), xsysinfo (<= 1.7-2), xtel (<= 3.3.0-5.4), xterm (<< 208-1), xtoolwait (<= 1.3-6), xtrkcad (<= 3.1.4-1), xtrlock (<= 2.0-11), xturqstat (<= 2.2.2sarge1), xutils (<< 1:7.0), xv (<= 3.10a-26), xvfb (<< 1:1.0), xview-clients (<= 3.2p1.4-21), xviewg (<= 3.2p1.4-21), xviewg-dev (<= 3.2p1.4-21), xvkbd (<= 2.6-2.1), xwit (<= 3.4-6), xxkb (<= 1.10-2.1), xzoom (<= 0.3-17), yank (<= 0.2.1-7.2) +Conffiles: + /etc/X11/rgb.txt 09ee098b83d94c7c046d6b55ebe84ae1 + /etc/X11/Xreset 05d188ccac2f3360af8fe0c216640233 + /etc/X11/Xreset.d/README b344c222b5daf81926fd3270df374b5f + /etc/X11/Xsession 50678401170c9c701d2375bd279690c5 + /etc/X11/Xsession.d/20x11-common_process-args 862c8286749d25fe58dd98cad24c3fe4 + /etc/X11/Xsession.d/30x11-common_xresources 61cebe25ee0c64e981b88958dfee6f9c + /etc/X11/Xsession.d/40x11-common_xsessionrc db544c8543d1cb3762b9859288e77040 + /etc/X11/Xsession.d/50x11-common_determine-startup fe7c99261ba27b26aa14926d92447439 + /etc/X11/Xsession.d/60x11-common_localhost 2353ea72efc0c3e101058c3c56e282b4 + /etc/X11/Xsession.d/90x11-common_ssh-agent ae74aadf705c5fccf841ef921b45ca72 + /etc/X11/Xsession.d/99x11-common_start 3874d5e8f3ec888f69adb126e223e168 + /etc/X11/Xsession.options 210cd520efa87a5197cac01e10b3a84a + /etc/X11/Xresources/x11-common b640adb1cd646ec097f8df5b6deca9f0 + /etc/gdm/failsafeBlacklist 9b860f21bf33a6bfce55f233ba975e41 + /etc/gdm/failsafeXinit bf497dc1b011021e548c37392bd2a883 + /etc/gdm/failsafeXServer 791297354d1c22d1616154b3c6060f2d + /etc/init.d/x11-common 9a2901c839ade46a2a0f795ad1400fdf + /etc/init/failsafe-x.conf b85b200b5d58cbba7c81d51485e210fc +Description: X Window System (X.Org) infrastructure + x11-common contains the filesystem infrastructure required for further + installation of the X Window System in any configuration; it does not + provide a full installation of clients, servers, libraries, and utilities + required to run the X Window System. + . + A number of terms are used to refer to the X Window System, including "X", + "X Version 11", "X11", "X11R6", and "X11R7". The version of X used in + Debian is derived from the version released by the X.Org Foundation, and + is thus often also referred to as "X.Org". All of the preceding quoted + terms are functionally interchangeable in an Debian system. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: net-tools +Status: install ok installed +Priority: required +Section: net +Installed-Size: 1044 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.60-23ubuntu2 +Replaces: ja-trans (<= 0.8-2), netbase (<< 4.00) +Depends: libc6 (>= 2.4) +Conflicts: ja-trans (<= 0.8-2) +Description: The NET-3 networking toolkit + This package includes the important tools for controlling the network + subsystem of the Linux kernel. This includes arp, ifconfig, netstat, + rarp, nameif and route. Additionally, this package contains utilities + relating to particular network hardware types (plipconfig, slattach, + mii-tool) and advanced aspects of IP configuration (iptunnel, ipmaddr). + . + In the upstream package 'hostname' and friends are included. Those are + not installed by this package, since there is a special "hostname*.deb". +Original-Maintainer: net-tools Team <pkg-net-tools-maintainers@lists.alioth.debian.org> + +Package: libxfixes3 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 80 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxfixes +Version: 1:4.0.4-1 +Depends: libc6 (>= 2.2.5), libx11-6 +Description: X11 miscellaneous 'fixes' extension library + libXfixes provides an X Window System client interface to the 'XFIXES' + extension to the X protocol. + . + It provides support for Region types, and some cursor functions. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXfixes +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: ccache +Status: install ok installed +Priority: optional +Section: devel +Installed-Size: 128 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.4-17build1 +Depends: libc6 (>= 2.8), zlib1g (>= 1:1.1.4) +Suggests: distcc +Description: Compiler results cacher, for fast recompiles + ccache is a compiler cache. It speeds up re-compilation of C/C++ code + by caching previous compiles and detecting when the same compile is + being done again. +Original-Maintainer: Y Giridhar Appaji Nag <appaji@debian.org> +Homepage: http://ccache.samba.org + +Package: xserver-xorg-video-r128 +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 320 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 6.8.1-2ubuntu1 +Replaces: xserver-xorg-video-ati (<= 1:6.8.0-1ubuntu1) +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Suggests: firmware-linux +Conflicts: xserver-xorg-video-ati (<= 1:6.8.0-1ubuntu1) +Description: X.Org X server -- ATI r128 display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for the ATI Rage 'r128' series. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-r128 driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libfs6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 116 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libfs +Version: 2:1.0.2-1build1 +Depends: libc6 (>= 2.4) +Description: X11 Font Services library + libFS, the Font Services library, provides various functions useful to + X11 font servers, and clients connecting to font servers. It is not used + outside of these implementations. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libFS +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: debconf-i18n +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1136 +Maintainer: Colin Watson <cjwatson@ubuntu.com> +Architecture: all +Source: debconf +Version: 1.5.28ubuntu4 +Replaces: debconf (<< 1.3.0), debconf-utils (<< 1.3.22) +Depends: debconf, liblocale-gettext-perl, libtext-iconv-perl, libtext-wrapi18n-perl, libtext-charwidth-perl +Conflicts: debconf-english, debconf-utils (<< 1.3.22) +Description: full internationalization support for debconf + This package provides full internationalization for debconf, including + translations into all available languages, support for using translated + debconf templates, and support for proper display of multibyte character + sets. +Original-Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org> + +Package: libxmu6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 164 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxmu +Version: 2:1.0.5-1 +Depends: libc6 (>= 2.7), libx11-6, libxext6, libxt6 +Description: X11 miscellaneous utility library + libXmu provides a set of miscellaneous utility convenience functions for X + libraries to use. libXmuu is a lighter-weight version that does not depend + on libXt or libXext; for more information, see libxmuu1. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXmu +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: grep +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 1188 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.5.4-4build1 +Provides: rgrep +Pre-Depends: libc6 (>= 2.4) +Suggests: libpcre3 (>= 7.7) +Conflicts: rgrep +Description: GNU grep, egrep and fgrep + 'grep' is a utility to search for text in files; it can be used from the + command line or in scripts. Even if you don't want to use it, other packages + on your system probably will. + . + The GNU family of grep utilities may be the "fastest grep in the west". + GNU grep is based on a fast lazy-state deterministic matcher (about + twice as fast as stock Unix egrep) hybridized with a Boyer-Moore-Gosper + search for a fixed string that eliminates impossible text from being + considered by the full regexp matcher without necessarily having to + look at every character. The result is typically many times faster + than Unix grep or egrep. (Regular expressions containing backreferencing + will run more slowly, however.) +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://www.gnu.org/software/grep/ + +Package: plymouth +Status: install ok installed +Priority: required +Section: x11 +Installed-Size: 480 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.8.2-2ubuntu2 +Depends: libc6 (>= 2.8), libdrm-intel1 (>= 2.4.9), libdrm-nouveau1 (>= 2.4.11-1ubuntu1~), libdrm-radeon1 (>= 2.4.17), libdrm2 (>= 2.4.3), libplymouth2 (= 0.8.2-2ubuntu2), upstart-job, udev (>= 149-2), mountall (>= 2.0), initramfs-tools +Recommends: plymouth-theme-ubuntu-text | plymouth-theme +Breaks: gdm (<< 2.29.1-0ubuntu4), kdm (<< 4:4.4.2-0ubuntu6), lubuntu-plymouth-theme (<= 0.4), ubuntustudio-plymouth-theme (<= 0.38), xubuntu-plymouth-theme (<< 10.04.4) +Conflicts: usplash +Conffiles: + /etc/init/plymouth.conf a0352db1159bc9f4322170dd78cd1dae + /etc/init/plymouth-log.conf 65d2943a69f455dec3fed43fd7996d76 + /etc/init/plymouth-splash.conf 5daa5d5dafaee30442e4d8d82e542c0a + /etc/init/plymouth-stop.conf f422b651bb1fe8164f968bb58e18bb6c +Description: graphical boot animation and logger - main package + Plymouth is an application that runs very early in the boot process + (even before the root filesystem is mounted!) that provides a graphical + boot animation while the boot process happens in the background. + +Package: libdrm-nouveau1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 456 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: libdrm +Version: 2.4.18-1ubuntu3 +Depends: libc6 (>= 2.3.4), libdrm2 (>= 2.4.3) +Description: Userspace interface to nouveau-specific kernel DRM services -- runtime + This library implements the userspace interface to the nouveau-specific kernel + DRM services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is + currently used on Linux to provide hardware-accelerated OpenGL drivers. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: kbd +Status: install ok installed +Priority: extra +Section: utils +Installed-Size: 1632 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.15-1ubuntu3 +Replaces: open, util-linux (<< 2.11) +Provides: console-utilities, open +Depends: libc6 (>= 2.7), console-setup, lsb-base (>= 3.0-10), initramfs-tools +Conflicts: console-utilities, kbd-data, open, util-linux (<< 2.11) +Conffiles: + /etc/kbd/config 182c6394322efb8a10e6e95836ad220d + /etc/kbd/remap 2f1f15d62b45ab43c04b3ddbfcf591ec +Description: Linux console font and keytable utilities + This package allows you to set up the Linux console, change the font, + resize text mode virtual consoles and remap the keyboard. + . + You will probably want to install a set of data files, such as the one + in the “console-setup” package. +Original-Maintainer: Console utilities maintainers <pkg-kbd-devel@lists.alioth.debian.org> + +Package: libxdamage1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 64 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxdamage +Version: 1:1.1.2-1 +Depends: libc6 (>= 2.2.5), libx11-6, libxfixes3 (>= 1:4.0.1) +Description: X11 damaged region extension library + libXdamage provides an X Window System client interface to the DAMAGE + extension to the X protocol. + . + The Damage extension provides for notification of when on-screen regions have + been 'damaged' (altered). + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXdamage +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: x11-xserver-utils +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 556 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.5+1ubuntu2 +Replaces: iceauth, sessreg, xbase-clients (<< 1:7.3), xgamma, xhost, xmodmap, xrandr, xrdb, xrefresh, xrgb, xset, xsetmode, xsetpointer, xsetroot, xstdcmap, xutils (<< 1:7.2), xvidtune +Depends: libc6 (>= 2.7), libice6 (>= 1:1.0.0), libx11-6 (>= 0), libxau6, libxaw7, libxext6 (>= 0), libxi6 (>= 0), libxmu6, libxmuu1, libxrandr2 (>= 2:1.2.99.3), libxrender1, libxt6, libxxf86vm1, cpp +Pre-Depends: x11-common (>= 1:7.0.0) +Suggests: nickle, cairo-5c, xorg-docs-core +Conflicts: iceauth, sessreg, xgamma, xhost, xmodmap, xrandr, xrdb, xrefresh, xrgb, xset, xsetmode, xsetpointer, xsetroot, xstdcmap, xvidtune +Conffiles: + /etc/X11/app-defaults/Xvidtune b8a276636b9bee314fa77b468a54a84a +Description: X server utilities + An X client is a program that interfaces with an X server (almost always via + the X libraries), and thus with some input and output hardware like a + graphics card, monitor, keyboard, and pointing device (such as a mouse). + . + This package provides a miscellaneous assortment of X Server utilities + that ship with the X Window System, including: + - iceauth, a tool for manipulating ICE protocol authorization records; + - rgb; + - sessreg, a simple program for managing utmp/wtmp entries; + - xcmsdb, a device color characteristic utility for the X Color Management + System; + - xgamma, a tool for querying and setting a monitor's gamma correction; + - xhost, a very dangerous program that you should never use; + - xmodmap, a utility for modifying keymaps and pointer button mappings in X; + - xrandr, a command-line interface to the RandR extension; + - xrdb, a tool to manage the X server resource database; + - xrefresh, a tool that forces a redraw of the X screen; + - xset, a tool for setting miscellaneous X server parameters; + - xsetmode and xsetpointer, tools for handling X Input devices; + - xsetroot, a tool for tailoring the appearance of the root window; + - xstdcmap, a utility to selectively define standard colormap properties; + - xvidtune, a tool for customizing X server modelines for your monitor. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxaw7 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 516 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxaw +Version: 2:1.0.7-1 +Depends: libc6 (>= 2.4), libx11-6, libxext6, libxmu6, libxpm4, libxt6 +Description: X11 Athena Widget library + libXaw7 provides the second version of Xaw, the Athena Widgets tookit, + which is largely used by legacy X applications. This version is the + most common version, as version 6 is considered deprecated, and version + 8, which adds Xprint support, is unsupported and not widely used. + In general, use of a more modern toolkit such as GTK+ is recommended. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXaw +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: upstart +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 856 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Version: 0.6.5-6 +Replaces: startup-tasks, system-services, sysvinit, upstart-compat-sysv, upstart-job +Provides: startup-tasks, system-services, upstart-compat-sysv, upstart-job +Depends: libc6 (>= 2.4), libdbus-1-3 (>= 1.2.16), libnih-dbus1 (>= 1.0.0), libnih1 (>= 1.0.0), libudev0 (>= 151-5), sysvinit-utils, sysv-rc, initscripts, mountall, ifupdown (>= 0.6.8ubuntu29) +Conflicts: startup-tasks, system-services, sysvinit, upstart-compat-sysv, upstart-job +Conffiles: + /etc/dbus-1/system.d/Upstart.conf 64be74cddb0c74b7d98202b40389784c + /etc/init/control-alt-delete.conf 16e6603524084b63b0f0ca04eb56757e + /etc/init/rc-sysinit.conf bd0415c6387debecfff37a371b07002a + /etc/init/rc.conf c5e4b13b644d79d5a5c02e1396159c00 + /etc/init/rcS.conf 918e9d799d6aa99a0d96538d9685821d + /etc/init/tty1.conf 543a3404e714bb96b676770c8334d86d + /etc/init/tty2.conf 5eed82253d8c362021c344f1dbdc863b + /etc/init/tty3.conf b75577836957bb5adb50b3482c429edb + /etc/init/tty4.conf 27b4a36d59bf74fd6792a69394511e42 + /etc/init/tty5.conf 9803918babed47f733554dcd556d09d1 + /etc/init/tty6.conf 34f7b6971a5580f5fb6a2ff6f14af996 + /etc/init/upstart-udev-bridge.conf b3d59bd6e5debf634e4fe258d5a4dd71 +Description: event-based init daemon + upstart is a replacement for the /sbin/init daemon which handles + starting of tasks and services during boot, stopping them during + shutdown and supervising them while the system is running. +Homepage: http://upstart.ubuntu.com/ + +Package: xserver-xorg-video-neomagic +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.2.4-2 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-neomagic +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-neomagic +Description: X.Org X server -- Neomagic display driver + This package provides the driver for Neomagic MagicGraph chipsets, which are + commonly found in laptops. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-neomagic driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libcwidget3 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 844 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: cwidget +Version: 0.5.13-1ubuntu1 +Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libncursesw5 (>= 5.6+20071006-3), libsigc++-2.0-0c2a (>= 2.0.2), libstdc++6 (>= 4.1.1) +Suggests: libcwidget-dev +Description: high-level terminal interface library for C++ (runtime files) + libcwidget is a modern user interface library modeled on GTK+ and Qt, + but using curses as its display layer and with widgets that are + tailored to a terminal environment. + . + This package contains the files that are required to run programs + compiled against libcwidget. +Homepage: http://cwidget.alioth.debian.org +Original-Maintainer: Daniel Burrows <dburrows@debian.org> + +Package: libsasl2-modules +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 500 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: cyrus-sasl2 +Version: 2.1.23.dfsg1-5ubuntu1 +Depends: libsasl2-2 (= 2.1.23.dfsg1-5ubuntu1), libc6 (>= 2.4), libssl0.9.8 (>= 0.9.8k-1) +Suggests: libsasl2-modules-otp, libsasl2-modules-ldap, libsasl2-modules-sql, libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal +Description: Cyrus SASL - pluggable authentication modules + This is the Cyrus SASL API implementation, version 2.1. See package + libsasl2-2 and RFC 2222 for more information. + . + This package provides the following SASL modules: LOGIN, PLAIN, ANONYMOUS, + NTLM, CRAM-MD5, and DIGEST-MD5 (with DES support). +Homepage: http://cyrusimap.web.cmu.edu/ +Original-Maintainer: Debian Cyrus SASL Team <pkg-cyrus-sasl2-debian-devel@lists.alioth.debian.org> + +Package: libsasl2-2 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 272 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: cyrus-sasl2 +Version: 2.1.23.dfsg1-5ubuntu1 +Replaces: libsasl2 +Depends: libc6 (>= 2.4), libdb4.8 +Recommends: libsasl2-modules (= 2.1.23.dfsg1-5ubuntu1) +Conflicts: libsasl2-gssapi-mit (<< 2.1.22), libsasl2-krb4-mit (<< 2.1.22), postfix (<< 2.3.4-3) +Description: Cyrus SASL - authentication abstraction library + This is the Cyrus SASL API implementation, version 2.1. + . + SASL is the Simple Authentication and Security Layer, a method for + adding authentication support to connection-based protocols. To use + SASL, a protocol includes a command for identifying and + authenticating a user to a server and for optionally negotiating + protection of subsequent protocol interactions. If its use is + negotiated, a security layer is inserted between the protocol and the + connection. See RFC 2222 for more information. + . + Any of: ANONYMOUS, CRAM-MD5, DIGEST-MD5, GSSAPI (MIT or Heimdal + Kerberos 5), NTLM, OTP, PLAIN, or LOGIN can be used. If you intend to + use this package on a server that provides SASL authentication, then + you must install some of the libsasl2-modules* packages. +Homepage: http://cyrusimap.web.cmu.edu/ +Original-Maintainer: Debian Cyrus SASL Team <pkg-cyrus-sasl2-debian-devel@lists.alioth.debian.org> + +Package: passwd +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 2640 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: shadow +Version: 1:4.1.4.2-1ubuntu2 +Replaces: manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) +Depends: libc6 (>= 2.4), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32), libpam-modules, debianutils (>= 2.15.2) +Conffiles: + /etc/default/useradd cc9f9a7713ab62a32cd38363d958f396 + /etc/pam.d/passwd eaf2ad85b5ccd06cceb19a3e75f40c63 + /etc/pam.d/chfn 4d466e00a348ba426130664d795e8afa + /etc/pam.d/chsh a6e9b589e90009334ffd030d819290a6 + /etc/pam.d/chpasswd 9900720564cb4ee98b7da29e2d183cb2 + /etc/pam.d/newusers 1454e29bfa9f2a10836563e76936cea5 +Description: change and administer password and group data + This package includes passwd, chsh, chfn, and many other programs to + maintain password and group data. + . + Shadow passwords are supported. See /usr/share/doc/passwd/README.Debian +Homepage: http://pkg-shadow.alioth.debian.org/ +Original-Maintainer: Shadow package maintainers <pkg-shadow-devel@lists.alioth.debian.org> + +Package: xfonts-75dpi +Status: install ok installed +Priority: optional +Section: fonts +Installed-Size: 4476 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 1:1.0.1 +Depends: xfonts-utils +Suggests: xfs | xserver +Conffiles: + /etc/X11/fonts/75dpi/xfonts-75dpi.alias 6bc48023f2ae7f3bfc105db7b0ee6b49 +Description: 75 dpi fonts for X + xfonts-75dpi provides a set of bitmapped fonts at 75 dots per inch. In + most cases it is desirable to have the X font server (xfs) and/or an X server + installed to make the fonts available to X clients. + . + This package contains only fonts in the ISO 10646-1 and ISO 8859-1 + encodings, to conserve disk space. For other encodings, see the + xfonts-75dpi-transcoded package. + . + This package and xfonts-100dpi provide the same set of fonts, rendered at + different resolutions; only one or the other is necessary, but both may be + installed. xfonts-75dpi may be more suitable for small monitors and/or + small screen resolutions (under 1024x768). + . + This package requires the xfonts-utils package to prepare the font + directories for use by an X server or X font server. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: hostname +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 112 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 3.03ubuntu1 +Replaces: nis (<< 3.17-30) +Pre-Depends: libc6 (>= 2.4), upstart-job +Conflicts: nis (<< 3.17-30) +Conffiles: + /etc/init/hostname.conf e426591274acd83666295d90a937ee7a +Description: utility to set/show the host name or domain name + This package provides commands which can be used to display the system's + DNS name, and to display or set its hostname or NIS domain name. +Original-Maintainer: Debian Hostname Team <hostname-devel@lists.alioth.debian.org> + +Package: xkb-data +Status: install ok installed +Priority: extra +Section: x11 +Installed-Size: 3384 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: xkeyboard-config +Version: 1.8-1ubuntu8 +Breaks: libx11-6 (<< 2:1.1) +Description: X Keyboard Extension (XKB) configuration data + This package contains configuration data used by the X Keyboard + Extension (XKB), which allows selection of keyboard layouts when + using a graphical interface. + . + Every X11 vendor provides its own XKB data files, so keyboard layout + designers have to send their layouts to several places. The + xkeyboard-config project has been launched at FreeDesktop in order + to provide a central repository that could be used by all vendors. +Homepage: http://www.freedesktop.org/Software/XKeyboardConfig +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: fakeroot +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 372 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.14.4-1ubuntu1 +Depends: libc6 (>= 2.7) +Description: Gives a fake root environment + This package is intended to enable something like: + dpkg-buildpackage -rfakeroot + i.e. to remove the need to become root for a package build. + This is done by setting LD_PRELOAD to libfakeroot.so, + which provides wrappers around getuid, chown, chmod, mknod, + stat, and so on, thereby creating a fake root environment. + . + fakeroot requires SYSV IPC or TCP to operate. +Original-Maintainer: Clint Adams <schizo@debian.org> + +Package: libacl1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 92 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: acl +Version: 2.2.49-2 +Depends: libattr1 (>= 2.4.41-1), libc6 (>= 2.4) +Conflicts: acl (<< 2.0.0), libacl1-kerberos4kth +Description: Access control list shared library + This package contains the libacl.so dynamic library containing + the POSIX 1003.1e draft standard 17 functions for manipulating + access control lists. +Original-Maintainer: Nathan Scott <nathans@debian.org> +Homepage: http://savannah.nongnu.org/projects/acl/ + +Package: python2.6-minimal +Status: install ok installed +Priority: required +Section: python +Installed-Size: 5044 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: python2.6 +Version: 2.6.5-1ubuntu6 +Replaces: python2.6 (<< 2.6.4~rc1-1) +Depends: libc6 (>= 2.4), libssl0.9.8 (>= 0.9.8k-1), zlib1g (>= 1:1.2.0) +Recommends: python2.6 +Suggests: binfmt-support +Conflicts: binfmt-support (<< 1.1.2), python-central (<< 0.6.11ubuntu6) +Conffiles: + /etc/python2.6/sitecustomize.py d6b276695157bde06a56ba1b2bc53670 +Description: A minimal subset of the Python language (version 2.6) + This package contains the interpreter and some essential modules. It can + be used in the boot process for some basic tasks. + See /usr/share/doc/python2.6-minimal/README.Debian for a list of the modules + contained in this package. +Original-Maintainer: Matthias Klose <doko@debian.org> +Python-Runtime: python2.6 +Python-Version: 2.6 + +Package: libpam-runtime +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1248 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: pam +Version: 1.1.1-2ubuntu2 +Replaces: libpam0g-dev, libpam0g-util +Depends: debconf (>= 1.5.19), libpam-modules (>= 1.0.1-6) +Conflicts: libpam0g-util +Conffiles: + /etc/pam.conf 87fc76f18e98ee7d3848f6b81b3391e5 + /etc/pam.d/other 31aa7f2181889ffb00b87df4126d1701 +Description: Runtime support for the PAM library + Contains configuration files and directories required for + authentication to work on Debian systems. This package is required + on almost all installations. +Homepage: http://pam.sourceforge.net/ +Original-Maintainer: Steve Langasek <vorlon@debian.org> + +Package: libslang2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1520 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: slang2 +Version: 2.2.2-2ubuntu1 +Depends: libc6 (>= 2.4) +Recommends: libpng12-0 +Description: The S-Lang programming library - runtime version + S-Lang is a C programmer's library that includes routines for the rapid + development of sophisticated, user friendly, multi-platform applications. + . + This package contains only the shared library libslang.so.* and copyright + information. It is only necessary for programs that use this library (such + as jed and slrn). If you plan on doing development with S-Lang, you will + need the companion -dev package as well. +Original-Maintainer: Alastair McKinstry <mckinstry@debian.org> + +Package: initscripts +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 336 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: sysvinit +Version: 2.87dsf-4ubuntu17 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Depends: libc6 (>= 2.4), mount (>= 2.11x-1), debianutils (>= 2.13.1), lsb-base (>= 3.2-14), sysvinit-utils (>= 2.86.ds1-39), sysv-rc | file-rc, passwd, upstart +Recommends: psmisc, e2fsprogs +Breaks: hostname (<< 2.95ubuntu1~boot2), rsyslog (<< 4.2.0-2ubuntu3~boot1), udev (<< 146-2~boot6), upstart (<< 0.6.3-2~boot4) +Conflicts: libdevmapper1.02.1 (<< 2:1.02.24-1) +Conffiles: + /etc/init.d/bootlogd 6e90878c898804bf9059f8a304faed5d + /etc/init.d/stop-bootlogd e1a190ec1150ff0c1514eb318be9e227 + /etc/init.d/stop-bootlogd-single 1046585487345dd2d5d4b2841fb4a75b + /etc/init.d/halt 6ae1b3b1b8198567a5e32116077f12a2 + /etc/init.d/killprocs 5e404d35091fab6c4889302736ed4602 + /etc/init.d/ondemand cc2a79a545967eec1170dc2bb44468e0 + /etc/init.d/rc.local 2964c1446c6453cdde4213eede97ac38 + /etc/init.d/reboot 1b9db1ef7bfd79b128ef85d5065721a6 + /etc/init.d/sendsigs 2a1f251ca12ef06f46a166f9a37e2400 + /etc/init.d/single dc13cb373c5c098a8fb95424701373e3 + /etc/init.d/umountfs 842eba3cdd65c66a424f80a53f87d704 + /etc/init.d/umountnfs.sh b824a44ff24087eb2bf6780db7dfd9dc + /etc/init.d/umountroot aa9aa9db438cc99f76b065827971ff42 + /etc/init.d/urandom d0385e199d51b19181b77dc55211ac02 + /etc/default/bootlogd 70a108da715299a6e33470eb450669fb + /etc/default/devpts fc857c5ac5fb84d80720ed4d1c624f6e + /etc/default/halt 18d9844cf8ca8608e2a559a4555e593a + /etc/default/tmpfs d959a98cfb571cd7fdfb36bbb3d0a5c8 +Description: scripts for initializing and shutting down the system + The scripts in this package initialize a standard Debian + GNU/Linux system at boot time and shut it down at halt or + reboot time. +Homepage: http://freshmeat.net/projects/sysvinit/ +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> + +Package: libblkid1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 248 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: util-linux +Version: 2.17.2-0ubuntu1 +Depends: libc6 (>= 2.4), libuuid1 (>= 2.16) +Conffiles: + /etc/blkid.conf 7f4c49e01e0a23d2f4b20eeb32e95abb +Description: block device id library + The blkid library which allows system programs like fsck and + mount to quickly and easily find block devices by filesystem UUID and + LABEL. This allows system administrators to avoid specifying + filesystems by hard-coded device names, but via a logical naming + system instead. +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: xinput +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 92 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.5.0-2ubuntu1 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.2.99.901), libxext6, libxi6 (>= 2:1.2.99.4) +Description: Runtime configuration and test of XInput devices + Xinput is an utility for configuring and testing XInput + devices. +Original-Maintainer: Julien Cristau <jcristau@debian.org> + +Package: libss2 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 120 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: e2fsprogs +Version: 1.41.11-1ubuntu2 +Replaces: e2fsprogs (<< 1.34-1) +Depends: libcomerr2, libc6 (>= 2.11) +Description: command-line interface parsing library + This package includes a tool that parses a command table to generate + a simple command-line interface parser, the include files needed to + compile and use it, and the static libs. + . + It was originally inspired by the Multics SubSystem library. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: findutils +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 1892 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 4.4.2-1ubuntu1 +Pre-Depends: libc6 (>= 2.7) +Suggests: mlocate | locate | slocate +Description: utilities for finding files--find, xargs + GNU findutils provides utilities to find files meeting specified + criteria and perform various actions on the files which are found. + This package contains 'find' and 'xargs'; however, 'locate' has + been split off into a separate package. +Homepage: http://savannah.gnu.org/projects/findutils/ +Original-Maintainer: Andreas Metzler <ametzler@debian.org> + +Package: libxft2 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 152 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: xft +Version: 2.1.14-1ubuntu1 +Depends: libc6 (>= 2.4), libfontconfig1 (>= 2.4.0), libfreetype6 (>= 2.3.5), libx11-6, libxrender1 +Description: FreeType-based font drawing library for X + Xft provides a client-side font API for X applications, making the FreeType + font rasterizer available to X clients. Fontconfig is used for font + specification resolution. Where available, the RENDER extension handles + glyph drawing; otherwise, the core X protocol is used. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xz-utils +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 476 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 4.999.9beta+20091116-1 +Depends: libc6 (>= 2.7), liblzma1 (>= 4.999.9beta) +Conflicts: xz-lzma (<< 4.999.9beta+20091004-1) +Description: XZ-format compression utilities + XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm + compression format, which provides memory-hungry but powerful + compression (often better than bzip2) and fast, easy decompression. + . + This package provides the command line tools for working with XZ + compression, including xz, unxz, xzcat, xzgrep, and so on. They can + also handle the older LZMA format, and if invoked via appropriate + symlinks will emulate the behavior of the commands in the lzma + package. + . + The XZ format is similar to the older LZMA format but includes some + improvements for general use: + . + * 'file' magic for detecting XZ files; + * crc64 data integrity check; + * limited random-access reading support; + * improved support for multithreading (not used in xz-utils); + * support for flushing the encoder. +Original-Maintainer: Jonathan Nieder <jrnieder@gmail.com> +Homepage: http://tukaani.org/xz/ + +Package: xserver-xorg-video-nouveau +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 296 +Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.0.15+git20100219+9b4118d-0ubuntu5 +Replaces: xserver-xorg (<< 6.8.2-35) +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), libdrm-nouveau1 (>= 2.4.16), xserver-xorg-core (>= 2:1.6.99.900) +Description: X.Org X server -- Nouveau display driver (experimental) + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for NVIDIA Riva, TNT, GeForce, and Quadro cards. + . + Although the nouveau project aims to provide full 3D support it is not yet + complete, and these packages do not include any 3D support. + Users requiring 3D support should use the non-free "nvidia" driver. + . + This package is built from the FreeDesktop.org xf86-video-nouveau driver. +Homepage: http://nouveau.freedesktop.org/wiki/ +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xfonts-encodings +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 832 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 1:1.0.3-1 +Replaces: xfonts-base (<< 1:1.0.0) +Depends: x11-common +Description: Encodings for X.Org fonts + This package contains the encodings that map to specific characters. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libx11-6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 1456 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: libx11 +Version: 2:1.3.2-1ubuntu3 +Depends: libc6 (>= 2.4), libxcb1 (>= 1.2), libx11-data +Conflicts: xlibs-data (<< 1:7.0.0) +Description: X11 client-side library + This package provides a client interface to the X Window System, otherwise + known as 'Xlib'. It provides a complete API for the basic functions of the + window system. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libX11 +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: e2fsprogs +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 2148 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.41.11-1ubuntu2 +Replaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2) +Pre-Depends: e2fslibs (= 1.41.11-1ubuntu2), libblkid1 (>= 1.34-1), libc6 (>= 2.11), libcomerr2 (>= 1.34-1), libss2 (>= 1.34-1), libuuid1 (>= 1.34-1), util-linux (>= 2.15~rc1-1) +Suggests: gpart, parted, e2fsck-static +Conflicts: dump (<< 0.4b4-4), initscripts (<< 2.85-4), quota (<< 1.55-8.1), sysvinit (<< 2.85-4) +Conffiles: + /etc/mke2fs.conf 33c2a4bda46c7cee498bb660084492dd +Description: ext2/ext3/ext4 file system utilities + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package contains programs for creating, checking, and maintaining + ext-based file systems, and the generic fsck wrapper. +Homepage: http://e2fsprogs.sourceforge.net +Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu> + +Package: libsigc++-2.0-0c2a +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 100 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libsigc++-2.0 +Version: 2.2.4.2-1 +Replaces: libsigc++-1.9-0, libsigc++-2.0-0, libsigc++-2.0-0c2 +Depends: libc6 (>= 2.2.5), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.1.1) +Conflicts: libsigc++-1.9-0, libsigc++-2.0-0, libsigc++-2.0-0c2 +Description: type-safe Signal Framework for C++ - runtime + This library implements a full callback system for use in widget + libraries, abstract interfaces, and general programming. It provides + the ability to connect an abstract callback to a class method, + function, or function object, and contains adaptor classes for the + connection of dissimilar callbacks. + . + These are the runtime files for libsigc++, needed only if you wish to + run software which depends on it. +Original-Maintainer: Daniel Burrows <dburrows@debian.org> + +Package: liblzma1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 288 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: xz-utils +Version: 4.999.9beta+20091116-1 +Depends: libc6 (>= 2.4) +Description: XZ-format compression library + XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm + compression format, which provides memory-hungry but powerful + compression (often better than bzip2) and fast, easy decompression. + . + The native format of liblzma is XZ; it also supports raw (headerless) + streams and the older LZMA format used by lzma. (For 7-Zip's related + format, use the p7zip package instead.) +Original-Maintainer: Jonathan Nieder <jrnieder@gmail.com> +Homepage: http://tukaani.org/xz/ + +Package: libnih1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 252 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Source: libnih +Version: 1.0.1-1 +Depends: libc6 (>> 2.10), libc6 (<< 2.12) +Description: NIH Utility Library + libnih is a light-weight "standard library" of C functions to ease the + development of other libraries and applications, especially those + normally found in /lib. + . + This package contains the shared library. + +Package: cpp +Status: install ok installed +Priority: optional +Section: interpreters +Installed-Size: 104 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gcc-defaults (1.93ubuntu1) +Version: 4:4.4.3-1ubuntu1 +Depends: cpp-4.4 (>= 4.4.3-1) +Suggests: cpp-doc +Conflicts: cpp-doc (<< 1:2.95.3) +Description: The GNU C preprocessor (cpp) + The GNU C preprocessor is a macro processor that is used automatically + by the GNU C compiler to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. + . + This is a dependency package providing the default GNU C preprocessor. +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: libgnutls26 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 1176 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gnutls26 +Version: 2.8.5-2 +Replaces: gnutls0, gnutls0.4, gnutls3 +Depends: libc6 (>= 2.8), libgcrypt11 (>= 1.4.2), libtasn1-3 (>= 1.6-0), zlib1g (>= 1:1.1.4) +Suggests: gnutls-bin +Conflicts: gnutls0, gnutls0.4 +Description: the GNU TLS library - runtime library + gnutls is a portable library which implements the Transport Layer + Security (TLS) 1.0 and Secure Sockets Layer (SSL) 3.0 protocols. + . + Currently gnutls implements: + - the TLS 1.0 and SSL 3.0 protocols, without any US-export + controlled algorithms + - X509 Public Key Infrastructure (with several limitations). + - SRP for TLS authentication. + - TLS Extension mechanism + . + This package contains the runtime libraries. +Original-Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org> +Homepage: http://www.gnutls.org/ + +Package: xserver-xorg-video-mga +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 284 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.4.11.dfsg-2ubuntu1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-mga +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Suggests: firmware-linux +Conflicts: xserver-xorg-driver-mga +Description: X.Org X server -- MGA display driver + This package provides the driver for the Matrox MGA family of chipsets, + including Matrox Millennium and Mystique cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-mga driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: insserv +Status: install ok installed +Priority: required +Section: misc +Installed-Size: 292 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.12.0-14 +Depends: libc6 (>= 2.7) +Suggests: bootchart +Breaks: sysv-rc (<< 2.87dsf-3) +Conffiles: + /etc/bash_completion.d/insserv 32975fe14795d6fce1408d5fd22747fd + /etc/insserv.conf 9c13a4d5da9cb2c2fa550a30705f041a +Description: Tool to organize boot sequence using LSB init.d script dependencies + The insserv program is used to update the order of symlinks in + /etc/rc?.d/ with sysv-rc based on dependencies specified in the + scripts themselves using LSB init.d script headers. + . + This allow each package maintainer to specify their init.d script + relation to other scripts and make it possible to detect and reject + script dependency loops as well as making sure all scripts start in + their intended order. + . + The program insserv in this package should be used with care and + together with the sysv-rc package, as using it incorrectly can lead + to an unbootable system. +Original-Maintainer: Petter Reinholdtsen <pere@debian.org> +Homepage: http://ftp.suse.com/pub/projects/init/ + +Package: xserver-xorg-video-i128 +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 140 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.3.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-i128 +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-i128 +Description: X.Org X server -- i128 display driver + This package provides the driver for Number 9 Imagine (I128) video cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-i128 driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: gzip +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 284 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.3.12-9ubuntu1 +Pre-Depends: libc6 (>= 2.4) +Suggests: less +Description: GNU compression utilities + This package provides the standard GNU file compression utilities, which + are also the default compression tools for Debian. They typically operate + on files with names ending in '.gz', but can also decompress files ending + in '.Z' created with 'compress'. +Original-Maintainer: Bdale Garbee <bdale@gag.com> + +Package: dpkg +Essential: yes +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 6728 +Origin: debian +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Bugs: debbugs://bugs.debian.org +Architecture: amd64 +Version: 1.15.5.6ubuntu4 +Replaces: manpages-de (<= 0.4-3), manpages-pl (<= 20051117-1) +Pre-Depends: libc6 (>= 2.11), coreutils (>= 5.93-1), lzma +Suggests: apt +Breaks: emacs21 (<< 21.4a+1-5.7), emacs21-nox (<< 21.4a+1-5.7), emacs22 (<= 22.2-0ubuntu2), emacs22-gtk (<= 22.2-0ubuntu2), emacs22-nox (<= 22.2-0ubuntu2), jed (<< 1:0.99.18+dfsg.1-13), jed-extra (<= 2.5.3-2), konqueror (<= 4:4.2.96-1), pinfo (<< 0.6.9-3.1), tkinfo (<< 2.8-3.1), xemacs21-support (<< 21.4.22-2), xjed (<< 1:0.99.18+dfsg.1-13) +Conflicts: apt (<< 0.7.7), aptitude (<< 0.4.7-1), dpkg-dev (<< 1.14.16), dpkg-iasearch (<< 0.11), sysvinit (<< 2.82-1) +Conffiles: + /etc/dpkg/dpkg.cfg f4413ffb515f8f753624ae3bb365b81b + /etc/alternatives/README 69c4ba7f08363e998e0f2e244a04f881 + /etc/cron.daily/dpkg b6b8dc21210ea50db7cc4636f521758f + /etc/logrotate.d/dpkg 9e25c8505966b5829785f34a548ae11f +Description: Debian package management system + This package provides the low-level infrastructure for handling the + installation and removal of Debian software packages. + . + For Debian package development tools, install dpkg-dev. +Homepage: http://wiki.debian.org/Teams/Dpkg +Original-Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> + +Package: libpcre3 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 456 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: pcre3 +Version: 7.8-3build1 +Depends: libc6 (>= 2.4) +Conflicts: libpcre3-dev (<= 4.3-3) +Description: Perl 5 Compatible Regular Expression Library - runtime files + This is a library of functions to support regular expressions whose syntax + and semantics are as close as possible to those of the Perl 5 language. + . + This package contains the runtime libraries. +Original-Maintainer: Mark Baker <mark@mnb.org.uk> + +Package: aptitude +Status: install ok installed +Priority: important +Section: admin +Installed-Size: 9828 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.4.11.11-1ubuntu10 +Depends: libapt-pkg-libc6.10-6-4.8, libc6 (>= 2.4), libcwidget3, libept0 (>= 0.5.30), libgcc1 (>= 1:4.1.1), libncursesw5 (>= 5.6+20071006-3), libsigc++-2.0-0c2a (>= 2.0.2), libstdc++6 (>= 4.4.0), libxapian15, zlib1g (>= 1:1.1.4) +Recommends: libparse-debianchangelog-perl +Suggests: aptitude-doc-en | aptitude-doc, tasksel, debtags +Conffiles: + /etc/apt/apt.conf.d/05aptitude 85b39c8f9413a8f29ddcce844d026929 + /etc/cron.daily/aptitude f934222d5eb13cb132e2751bdb023318 + /etc/logrotate.d/aptitude fb66bc5dc8c13edbcb83cea15ff86959 +Description: terminal-based package manager + aptitude is a terminal-based package manager with a number of useful + features, including: a mutt-like syntax for matching packages in a + flexible manner, dselect-like persistence of user actions, the + ability to retrieve and display the Debian changelog of most + packages, and a command-line mode similar to that of apt-get. + . + aptitude is also Y2K-compliant, non-fattening, naturally cleansing, + and housebroken. +Original-Maintainer: Daniel Burrows <dburrows@debian.org> + +Package: libept0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 528 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libept +Version: 0.5.30 +Depends: libapt-pkg-libc6.10-6-4.8, libc6 (>= 2.8), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0), libxapian15, zlib1g (>= 1:1.1.4) +Description: High-level library for managing Debian package information + The library defines a very minimal framework in which many sources of data + about Debian packages can be implemented and queried together. + . + The library includes four data sources: + . + * APT: access the APT database + * Debtags: access the Debtags tag information + * Popcon: access Popcon package scores + * The Xapian index built by apt-xapian-index + . + This is the shared library. +Original-Maintainer: Enrico Zini <enrico@debian.org> + +Package: libncursesw5 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 556 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: ncurses +Version: 5.7+20090803-2ubuntu3 +Depends: libc6 (>= 2.4) +Recommends: libgpm2 +Description: shared libraries for terminal handling (wide character support) + This package contains the shared libraries necessary to run programs + compiled with ncursesw, which includes support for wide characters. +Homepage: ftp://invisible-island.net/ncurses/ +Original-Maintainer: Debian QA Group <packages@qa.debian.org> + +Package: liblocale-gettext-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1.05-6 +Depends: libc6 (>= 2.2.5) +Pre-Depends: perl-base (>= 5.10.0-24ubuntu4), perlapi-5.10.0 +Description: Using libc functions for internationalization in Perl + The gettext module permits access from perl to the gettext() family of + functions for retrieving message strings from databases constructed + to internationalize software. + . + It provides gettext(), dgettext(), dcgettext(), textdomain(), + bindtextdomain(), bind_textdomain_codeset(), ngettext(), dcngettext() + and dngettext(). +Original-Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org> +Homepage: http://search.cpan.org/dist/gettext/gettext.pm + +Package: ubuntu-keyring +Status: install ok installed +Priority: important +Section: misc +Installed-Size: 60 +Maintainer: Michael Vogt <michael.vogt@canonical.com> +Architecture: all +Version: 2010.11.09 +Depends: gnupg (>= 1.0.6-4) +Description: GnuPG keys of the Ubuntu archive + The Ubuntu project digitally signs its Release files. This package + contains the archive keys used for that. + +Package: xbitmaps +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 476 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 1.1.0-1 +Description: Base X bitmaps + This package contains the base X bitmaps, which are used in many legacy X + clients. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: busybox-initramfs +Status: install ok installed +Priority: required +Section: shells +Installed-Size: 344 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: busybox +Version: 1:1.13.3-1ubuntu11 +Replaces: busybox-cvs-initramfs +Depends: libc6 (>= 2.11) +Conflicts: busybox-cvs-initramfs +Description: Standalone shell setup for initramfs + BusyBox combines tiny versions of many common UNIX utilities into a single + small executable. It provides minimalist replacements for the most common + utilities you would usually find on your desktop system (i.e., ls, cp, mv, + mount, tar, etc.). The utilities in BusyBox generally have fewer options than + their full-featured GNU cousins; however, the options that are included + provide the expected functionality and behave very much like their GNU + counterparts. + . + busybox-initramfs provides a statically linked simple stand alone shell + that provides only the basic utilities needed for the initramfs. +Original-Maintainer: Debian Install System Team <debian-boot@lists.debian.org> + +Package: xserver-xorg-video-s3 +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 148 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:0.6.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-s3 +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-s3 +Description: X.Org X server -- legacy S3 display driver + This package provides the driver for certain legacy S3 video card chipsets, + including the Trio64 and 96x cards. It does not provide support for + ViRGE/Trio3D or Savage chipsets; support for these cards is provided by + xserver-xorg-video-s3virge and xserver-xorg-driver-savage, respectively. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-s3 driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: ttf-dejavu-core +Status: install ok installed +Priority: optional +Section: fonts +Installed-Size: 2564 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: ttf-dejavu +Version: 2.30-2 +Replaces: ttf-dejavu (<< 2.20-1) +Conflicts: ttf-dejavu (<< 2.20-1) +Description: Vera font family derivative with additional characters + DejaVu provides an expanded version of the Vera font family aiming for + quality and broader Unicode coverage while retaining the original Vera + style. DejaVu currently works towards conformance with the Multilingual + European Standards (MES-1 and MES-2) for Unicode coverage. The DejaVu + fonts provide serif, sans and monospaced variants. + . + This package only contains the sans, sans-bold, serif, serif-bold, + mono and mono-bold variants. For additional variants, see the + ttf-dejavu-extra package. + . + DejaVu fonts are intended for use on low-resolution devices (mainly + computer screens) but can be used in printing as well. +Original-Maintainer: Debian Fonts Task Force <pkg-fonts-devel@lists.alioth.debian.org> +Homepage: http://dejavu-fonts.org/ + +Package: xserver-xorg-video-trident +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 244 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.3.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-trident +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-trident +Description: X.Org X server -- Trident display driver + This package provides the driver for Trident Blade/Image/ProVidia/TGUI/9xxx + video cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-trident driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libbz2-1.0 +Status: install ok installed +Priority: important +Section: libs +Installed-Size: 128 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: bzip2 +Version: 1.0.5-4 +Depends: libc6 (>= 2.4) +Description: high-quality block-sorting file compressor library - runtime + This package contains libbzip2 which is used by the bzip2 compressor. + . + bzip2 is a freely available, patent free, high-quality data compressor. + It typically compresses files to within 10% to 15% of the best available + techniques, whilst being around twice as fast at compression and six + times faster at decompression. + . + bzip2 compresses files using the Burrows-Wheeler block-sorting text + compression algorithm, and Huffman coding. Compression is generally + considerably better than that achieved by more conventional + LZ77/LZ78-based compressors, and approaches the performance of the PPM + family of statistical compressors. + . + The archive file format of bzip2 (.bz2) is incompatible with that of its + predecessor, bzip (.bz). +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://www.bzip.org/ + +Package: xserver-xorg-video-chips +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 232 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.2.2-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-chips +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-chips +Description: X.Org X server -- Chips display driver + This package provides the driver for the Chips & Technologies family + of video cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-chips driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-intel +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 1688 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2:2.9.1-3ubuntu5 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-i810, xserver-xorg-video-i810 (<< 2:1.9.91-1), xserver-xorg-video-i810-modesetting, xserver-xorg-video-intel-modesetting +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), libdrm-intel1 (>= 2.4.11), libdrm2 (>= 2.4.3), libpciaccess0 (>= 0.8.0+git20071002), libxext6 (>= 0), libxfixes3 (>= 1:4.0.1), libxv1, libxvmc1, xserver-xorg-core (>= 2:1.6.99.900) +Recommends: intel-gpu-tools +Conflicts: 915resolution, xserver-xorg-driver-i810, xserver-xorg-video-i810 (<< 2:1.9.91-1), xserver-xorg-video-i810-modesetting, xserver-xorg-video-intel-modesetting +Description: X.Org X server -- Intel i8xx, i9xx display driver + This package provides the driver for the Intel i8xx and i9xx family + of chipsets, including i810, i815, i830, i845, i855, i865, i915, i945 + and i965 series chips. + . + This package also provides XvMC (XVideo Motion Compensation) drivers + for i810/i815 and i9xx and newer chipsets. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-intel driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-mach64 +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 388 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 6.8.2-2 +Replaces: xserver-xorg-video-ati (<= 1:6.8.0-1) +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-video-ati (<= 1:6.8.0-1) +Description: X.Org X server -- ATI Mach64 display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for the ATI Mach64 series. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-mach64 driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: console-terminus +Status: install ok installed +Priority: optional +Section: fonts +Installed-Size: 784 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: xfonts-terminus +Version: 4.30-2 +Recommends: kbd | console-tools +Suggests: console-setup +Conflicts: console-cyrillic (<= 0.9-11) +Description: Fixed-width fonts for fast reading on the Linux console + This package installs in /usr/share/consolefonts several console + variants of the Terminus font. If you have to work for extended time + in front of monitor (i.e. over eight hours), you may find that using + of these fonts reduces your eyes-fatigue. + . + The following charsets are supported: western European Latin, central + European Latin, Turkish Latin, Romanian Latin, Slavic Cyrillic and + Asian Cyrillic (Bashkyr, Kazakh, Mongolian and others). +Original-Maintainer: Anton Zinoviev <zinoviev@debian.org> + +Package: libdrm-intel1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 476 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: libdrm +Version: 2.4.18-1ubuntu3 +Depends: libc6 (>= 2.3.4), libdrm2 (>= 2.4.1) +Description: Userspace interface to intel-specific kernel DRM services -- runtime + This library implements the userspace interface to the intel-specific kernel + DRM services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is + currently used on Linux to provide hardware-accelerated OpenGL drivers. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libpciaccess0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 112 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libpciaccess +Version: 0.11.0-1 +Depends: libc6 (>= 2.7), zlib1g (>= 1:1.1.4) +Suggests: pciutils +Description: Generic PCI access library for X + Provides functionality for X to access the PCI bus and devices + in a platform-independent way. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libc-bin +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1784 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: eglibc +Version: 2.11.1-0ubuntu7 +Replaces: libc0.1, libc0.3, libc6, libc6.1 +Breaks: libc0.1 (<< 2.10), libc0.3 (<< 2.10), libc6 (<< 2.10), libc6.1 (<< 2.10) +Conffiles: + /etc/bindresvport.blacklist 154db0e55fa99051ff1bd99e5b2c0584 + /etc/ld.so.conf.d/libc.conf d4d833fd095fb7b90e1bb4a547f16de6 + /etc/gai.conf 4b3389be7132a6a8805f3df8d0ff00f6 +Description: Embedded GNU C Library: Binaries + This package contains utility programs related to the GNU C Library. + . + * catchsegv: catch segmentation faults in programs + * getconf: query system configuration variables + * getent: get entries from administrative databases + * iconv, iconvconfig: convert between character encodings + * ldd, ldconfig: print/configure shared library dependencies + * locale, localedef: show/generate locale definitions + * rpcinfo: report RPC information + * tzselect, zdump, zic: select/dump/compile time zones +Homepage: http://www.eglibc.org +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> + +Package: libldap-2.4-2 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 496 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: openldap +Version: 2.4.21-0ubuntu5 +Replaces: libldap-2.3-0, libldap2 +Depends: libc6 (>= 2.4), libgnutls26 (>= 2.7.14-0), libgssapi-krb5-2 (>= 1.7+dfsg), libsasl2-2 +Conflicts: ldap-utils (<= 2.1.23-1) +Conffiles: + /etc/ldap/ldap.conf 7fac807f65d84394410881bc16f1198a +Description: OpenLDAP libraries + These are the run-time libraries for the OpenLDAP (Lightweight Directory + Access Protocol) servers and clients. +Homepage: http://www.openldap.org/ +Original-Maintainer: Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org> + +Package: sysvinit-utils +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 300 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: sysvinit +Version: 2.87dsf-4ubuntu17 +Replaces: last, sysvconfig (<< 0.80ubuntu1), sysvinit (<= 2.86.ds1-65), sysvutils (<< 2.86.ds1-56ubuntu1) +Provides: sysvutils +Depends: libc6 (>= 2.8), libselinux1 (>= 1.32), libsepol1 (>= 1.14) +Recommends: upstart (>= 0.6.3-4) +Suggests: sash +Conflicts: chkconfig (<< 11.0-79.1-1ubuntu1), last, sysvconfig +Description: System-V-like utilities + This package contains the important System-V-like utilities. + . + Specifically, this package includes: + killall5, last, lastb, mesg, pidof, service, sulogin +Homepage: http://freshmeat.net/projects/sysvinit/ +Original-Maintainer: Debian sysvinit maintainers <pkg-sysvinit-devel@lists.alioth.debian.org> + +Package: xserver-xorg-input-all +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 24 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Source: xorg +Version: 1:7.5+5ubuntu1 +Depends: xserver-xorg-input-evdev, xserver-xorg-input-synaptics, xserver-xorg-input-vmmouse, xserver-xorg-input-wacom, x11-common +Description: the X.Org X server -- input driver metapackage + This package depends on the full suite of input drivers for the X.Org X server + (Xorg). It does not provide any drivers itself, and may be removed if you wish + to only have certain drivers installed. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: fontconfig-config +Status: install ok installed +Priority: optional +Section: fonts +Installed-Size: 428 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: fontconfig +Version: 2.8.0-2ubuntu1 +Replaces: fontconfig (<< 2.3.2-2) +Depends: ucf (>= 0.29), ttf-dejavu-core | ttf-bitstream-vera | ttf-freefont | gsfonts-x11 +Conflicts: fontconfig (<< 2.3.2-2) +Conffiles: + /etc/fonts/fonts.conf 4c841acd3dd065819b23a0fc077d783c + /etc/fonts/fonts.dtd 9a099c7722190e00548c0d8375bdc24b + /etc/fonts/conf.d/README 296384642206e0c9952d5c73a5451eec + /etc/fonts/conf.avail/10-antialias.conf d77e6cfb9608490da012671c25213fe4 + /etc/fonts/conf.avail/10-autohint.conf 5fe723b1fde478085868af26461bcf58 + /etc/fonts/conf.avail/10-hinting-full.conf 65b0e8b7e1392797850856d8411d7272 + /etc/fonts/conf.avail/10-hinting-medium.conf b663214dd84d0f5c4e279b153e0b38f9 + /etc/fonts/conf.avail/10-hinting-slight.conf 4d7df8529053d526a503b472ee42b2b3 + /etc/fonts/conf.avail/10-hinting.conf 4d1fb88a99c516270526c8dca5764df8 + /etc/fonts/conf.avail/10-no-sub-pixel.conf d06c13e792afb20a06528d23e6542459 + /etc/fonts/conf.avail/10-sub-pixel-bgr.conf cacb7572b778448d592501d03a7f96fd + /etc/fonts/conf.avail/10-sub-pixel-rgb.conf 60ef22ca1f56543131eddee764383b46 + /etc/fonts/conf.avail/10-sub-pixel-vbgr.conf d526b41cd9b4d5e09ab4044a39b4c038 + /etc/fonts/conf.avail/10-sub-pixel-vrgb.conf a3198f34365f978c1fb5355a92e4ef94 + /etc/fonts/conf.avail/10-unhinted.conf 7bdecdf76d7bb22cd39e3b18bcbcc28d + /etc/fonts/conf.avail/11-lcd-filter-lcddefault.conf 34d7cffd14602241d09f23b0d1a39521 + /etc/fonts/conf.avail/20-fix-globaladvance.conf fbad2da072b8609477d89a59a167705a + /etc/fonts/conf.avail/20-unhint-small-vera.conf b975a96cc427cde633cbdedc4012aa22 + /etc/fonts/conf.avail/25-unhint-nonlatin.conf 62953912e2a45ea9a1ef4d8a400b2894 + /etc/fonts/conf.avail/30-metric-aliases.conf 64accc211b62e4fb7da141d8c1c271b3 + /etc/fonts/conf.avail/30-urw-aliases.conf c6c33cfde9f637e1d2b8cad9353df6dc + /etc/fonts/conf.avail/40-nonlatin.conf c78f533d9546bfc3a78f85d96f9eccf7 + /etc/fonts/conf.avail/45-latin.conf 8d9a57e7891ecc9d6f0806a3e7c204a1 + /etc/fonts/conf.avail/49-sansserif.conf 22278b0b48e5864d9c7fcbc178da0db3 + /etc/fonts/conf.avail/50-user.conf 0165add6524289f6eb0461ba0be73be2 + /etc/fonts/conf.avail/51-local.conf a2fa562c168c2c4cc0c2480bfdc0f8eb + /etc/fonts/conf.avail/53-monospace-lcd-filter.conf a6737024098d0bdc74b70846d4b99fe9 + /etc/fonts/conf.avail/60-latin.conf 2a898e836efee4347362e1e7f09cd0d6 + /etc/fonts/conf.avail/65-fonts-persian.conf 7df3a06989afcf1ecd9a8f44c9bf5d63 + /etc/fonts/conf.avail/65-khmer.conf ce66ea0c26f43091ab70092f3f7024d4 + /etc/fonts/conf.avail/65-nonlatin.conf 12a4cb7a2d642497f73f338abf988235 + /etc/fonts/conf.avail/69-unifont.conf 49a6cb52e1cf23e0f691807a3e8c105d + /etc/fonts/conf.avail/70-no-bitmaps.conf dccfa658875eea3b30514d7a8bc306bc + /etc/fonts/conf.avail/70-yes-bitmaps.conf 91c414090c7d8bfe557785fe845cb6bd + /etc/fonts/conf.avail/80-delicious.conf 1c0cbfdceb6bc7a55668c11f03b0710b + /etc/fonts/conf.avail/90-synthetic.conf 7659edb861f44ff8e9f4e31567d24e47 + /etc/fonts/conf.avail/70-force-bitmaps.conf 6423e63e204d4ea4629cd3f58636fcdc +Description: generic font configuration library - configuration + Fontconfig is a font configuration and customization library, which + does not depend on the X Window System. It is designed to locate + fonts within the system and select them according to requirements + specified by applications. + . + This package contains the configuration files and scripts for fontconfig. +Original-Maintainer: Keith Packard <keithp@debian.org> + +Package: libxtst6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 84 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxtst +Version: 2:1.1.0-2 +Depends: libc6 (>= 2.4), libx11-6, libxext6, libxi6, x11-common +Description: X11 Testing -- Resource extension library + libXtst provides an X Window System client interface to the Record + extension to the X protocol. + . + The Record extension allows X clients to synthesise input events, which + is useful for automated testing. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXtst +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-input-mouse +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 160 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.5.0-1 +Replaces: xserver-xorg (<< 6.8.2-35) +Provides: xserver-xorg-input-7 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Description: X.Org X server -- mouse input driver + This package provides the driver for mouse input devices. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-input-mouse driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libice6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libice +Version: 2:1.0.6-1 +Depends: libc6 (>= 2.4), x11-common +Description: X11 Inter-Client Exchange library + This package provides the main interface to the X11 Inter-Client Exchange + library, which allows for communication of data between X clients. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libICE +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libnih-dbus1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 80 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Source: libnih +Version: 1.0.1-1 +Depends: libnih1 (= 1.0.1-1), libc6 (>= 2.3.4), libdbus-1-3 (>= 1.2.16) +Description: NIH D-Bus Bindings Library + libnih-dbus is a D-Bus bindings library that integrates with the main + loop provided by libnih. + . + This package contains the shared library. + +Package: libx11-data +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 2500 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: all +Source: libx11 +Version: 2:1.3.2-1ubuntu3 +Replaces: libx11-6 (<= 2:1.0.0-1) +Description: X11 client-side library + This package provides the locale data files for libx11. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libX11 +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libselinux1 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 228 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libselinux +Version: 2.0.89-4 +Depends: libc6 (>= 2.8) +Description: SELinux runtime shared libraries + This package provides the shared libraries for Security-enhanced + Linux that provides interfaces (e.g. library functions for the + SELinux kernel APIs like getcon(), other support functions like + getseuserbyname()) to SELinux-aware applications. Security-enhanced + Linux is a patch of the Linux kernel and a number of utilities with + enhanced security functionality designed to add mandatory access + controls to Linux. The Security-enhanced Linux kernel contains new + architectural components originally developed to improve the security + of the Flask operating system. These architectural components provide + general support for the enforcement of many kinds of mandatory access + control policies, including those based on the concepts of Type + Enforcement, Role-based Access Control, and Multi-level Security. + . + libselinux1 provides an API for SELinux applications to get and set + process and file security contexts and to obtain security policy + decisions. Required for any applications that use the SELinux + API. libselinux may use the shared libsepol to manipulate the binary + policy if necessary (e.g. to downgrade the policy format to an older + version supported by the kernel) when loading policy. +Original-Maintainer: Manoj Srivastava <srivasta@debian.org> + +Package: libc6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 10208 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: eglibc +Version: 2.11.1-0ubuntu7 +Replaces: belocs-locales-bin +Provides: glibc-2.10-1 +Depends: libc-bin (= 2.11.1-0ubuntu7), debconf (>= 0.5) | debconf-2.0, libgcc1, tzdata, findutils (>= 4.4.0-2ubuntu2) +Suggests: glibc-doc, locales +Breaks: nscd (<< 2.9) +Conflicts: belocs-locales-bin, tzdata (<< 2007k-1), tzdata-etch +Conffiles: + /etc/ld.so.conf.d/x86_64-linux-gnu.conf 593ad12389ab2b6f952e7ede67b8fbbf +Description: Embedded GNU C Library: Shared libraries + Contains the standard libraries that are used by nearly all programs on + the system. This package includes shared versions of the standard C library + and the standard math library, as well as many others. +Homepage: http://www.eglibc.org +Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> + +Package: xserver-xorg-video-nv +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 304 +Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com> +Architecture: amd64 +Version: 1:2.1.15-1ubuntu3 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-nv, xserver-xorg-video-riva128 +Provides: xf86-video-driver-riva128, xserver-xorg-video-6 +Depends: libc6 (>= 2.4), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-nv, xserver-xorg-video-riva128 +Description: X.Org X server -- NV display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for NVIDIA Riva, TNT, GeForce, and Quadro cards. + . + Note that this is not the same as the binary-only 'nvidia' driver, which + adds 3D support, but is binary-only and not supported. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-nv driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libsm6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libsm +Version: 2:1.1.1-1 +Depends: libc6 (>= 2.4), libice6 (>= 1:1.0.0), libuuid1 (>= 2.16-1) +Description: X11 Session Management library + This package provides the main interface to the X11 Session Management + library, which allows for applications to both manage sessions, and make use + of session managers to save and restore their state for later use. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libSM +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libxxf86vm1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 76 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxxf86vm +Version: 1:1.1.0-2 +Depends: libc6 (>= 2.2.5), libx11-6, libxext6 +Description: X11 XFree86 video mode extension library + libXxf86vm provides an interface to the XFree86-VidModeExtension + extension, which allows client applications to get and set video mode + timings in extensive detail. It is used by the xvidtune program in + particular. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXxf86vm +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libpng12-0 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 336 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libpng +Version: 1.2.42-1ubuntu2 +Replaces: libpng12-dev (<= 1.2.8rel-7) +Depends: libc6 (>= 2.11), zlib1g (>= 1:1.1.4) +Conflicts: libpng12-dev (<= 1.2.8rel-7), mzscheme (<= 1:209-5), pngcrush (<= 1.5.10-2), pngmeta (<= 1.11-3), povray-3.5 (<= 3.5.0c-10), qemacs (<= 0.3.1-5) +Description: PNG library - runtime + libpng is a library implementing an interface for reading and writing + PNG (Portable Network Graphics) format files. + . + This package contains the runtime library files needed to run software + using libpng. +Homepage: http://libpng.org/pub/png/libpng.html +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> + +Package: udev +Status: install ok installed +Priority: required +Section: admin +Installed-Size: 1584 +Maintainer: Scott James Remnant <scott@ubuntu.com> +Architecture: amd64 +Version: 151-12 +Replaces: hotplug, ifrename, initramfs-tools (<< 0.040ubuntu1), udev-extras (<= 20090618) +Depends: libacl1 (>= 2.2.11-1), libc6 (>= 2.9), libglib2.0-0 (>= 2.16.0), libselinux1 (>= 1.32), libusb-0.1-4 (>= 2:0.1.12), upstart-job, module-init-tools (>= 3.2.1-0ubuntu3), initramfs-tools (>= 0.92bubuntu63), procps, adduser, util-linux (>> 2.15~rc2) +Suggests: watershed +Breaks: casper (<< 1.174), consolekit (<= 0.4.1), dmsetup (<= 2:1.02.27-4ubuntu5), initramfs-tools (<< 0.92bubuntu30), lvm2 (<= 2.02.39-0ubuntu9), mdadm (<= 2.6.7.1-1ubuntu8) +Conflicts: hotplug, ifrename, libdevmapper1.02 (<< 2:1.02.08-1ubuntu7), udev-extras (<= 20090618) +Conffiles: + /etc/udev/rules.d/README 3b6de9f3f911176734c66903b4f8735c + /etc/udev/udev.conf 8b024b79a468658332fbf2586737907e + /etc/init/udev.conf 57d33a5ba9c438b3be4275e908213535 + /etc/init/udev-finish.conf 28ebb3ad2d2c6ca545d72f3f0769f448 + /etc/init/udevtrigger.conf 16f1ef5e6e1a9c589fa6993af7ea9ff5 + /etc/init/udevmonitor.conf b541dfb5aa4958e9a5336ecaec00ca15 +Description: rule-based device node and kernel event manager + udev is a collection of tools and a daemon to manage events received from + the kernel and deal with them in user-space. Primarily this involves + creating and removing device nodes in /dev when hardware is discovered or + removed from the system. + . + Events are received via kernel netlink messaged and processed according to + rules in /etc/udev/rules.d and /lib/udev/rules.d, altering the name of the + device node, creating additional symlinks or calling other tools and programs + including those to load kernel modules and initialise the device. + +Package: libpixman-1-0 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 504 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: pixman +Version: 0.16.4-1ubuntu2 +Depends: libc6 (>= 2.4) +Description: pixel-manipulation library for X and cairo + A library for manipulating pixel regions -- a set of Y-X banded + rectangles, image compositing using the Porter/Duff model + and implicit mask generation for geometric primitives including + trapezoids, triangles, and rectangles. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: bash +Essential: yes +Status: install ok installed +Priority: required +Section: shells +Installed-Size: 3612 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 4.1-2ubuntu3 +Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1) +Depends: base-files (>= 2.1.12), debianutils (>= 2.15) +Pre-Depends: dash, libc6 (>= 2.11), libncurses5 (>= 5.6+20071006-3) +Recommends: bash-completion (>= 20060301-0) +Suggests: bash-doc +Conflicts: bash-completion (<< 20060301-0) +Conffiles: + /etc/skel/.bashrc 65c464307b8370db7fd43189f237dbd6 + /etc/skel/.profile ecb6d3479ac3823f1da7f314d871989b + /etc/skel/.bash_logout 22bfb8c1dd94b5f3813a2b25da67463f + /etc/bash.bashrc 856b64d15f052027a6807413e9035d3f +Description: The GNU Bourne Again SHell + Bash is an sh-compatible command language interpreter that executes + commands read from the standard input or from a file. Bash also + incorporates useful features from the Korn and C shells (ksh and csh). + . + Bash is ultimately intended to be a conformant implementation of the + IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2). + . + The Programmable Completion Code, by Ian Macdonald, is now found in + the bash-completion package. +Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html +Original-Maintainer: Matthias Klose <doko@debian.org> + +Package: make +Status: install ok installed +Priority: standard +Section: devel +Installed-Size: 1224 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: make-dfsg +Version: 3.81-7ubuntu1 +Suggests: make-doc +Description: An utility for Directing compilation. + GNU Make is an utility which controls the generation of executables and + other target files of a program from the program's source files. It + determines automatically which pieces of a large program need to be + (re)created, and issues the commands to (re)create them. Make is not + limited to programs and executable, it can be applied to any task + where a set of target files must be created based on a set of input + files, based on dependency and processing rules. Indeed, Make is a + general purpose dependency solver. +Original-Maintainer: Manoj Srivastava <srivasta@debian.org> +Homepage: http://www.gnu.org/software/make/ + +Package: util-linux +Essential: yes +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 2344 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.17.2-0ubuntu1 +Replaces: e2fsprogs (<= 1.41.8-1ubuntu1), fdisk, linux32, miscutils, schedutils, setterm, sparc-utils +Provides: linux32, schedutils +Depends: upstart-job, lsb-base (>= 3.0-6), tzdata (>= 2006c-2), dpkg (>= 1.15.4) | install-info +Pre-Depends: libblkid1 (>= 2.17), libc6 (>= 2.11), libncurses5 (>= 5.6+20071006-3), libselinux1 (>= 1.32), libslang2 (>= 2.0.7-1), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4) +Suggests: util-linux-locales, kbd | console-tools, dosfstools +Breaks: udev (<< 136-1) +Conflicts: console-tools (<< 1:0.2.3-21), fdisk, kbd (<< 1.05-3), linux32, schedutils, setterm +Conffiles: + /etc/init/hwclock.conf 132aa3db7e5a8cf55168e4866052208a + /etc/init/hwclock-save.conf 4a002046525e338fc23e4418602865c9 +Description: Miscellaneous system utilities + This package contains a number of important utilities, most of which + are oriented towards maintenance of your system. Some of the more + important utilities included in this package allow you to partition + your hard disk, view kernel messages, and create new filesystems. +Original-Maintainer: LaMont Jones <lamont@debian.org> + +Package: libxcursor1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 92 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxcursor +Version: 1:1.1.10-1 +Depends: libc6 (>= 2.4), libx11-6, libxfixes3 (>= 1:4.0.1), libxrender1 +Description: X cursor management library + Xcursor is a simple library designed to help locate and load cursors for the + X Window System. Cursors can be loaded from files or memory and can exist in + several sizes; the library automatically picks the best size. When using + images loaded from files, Xcursor prefers to use the Render extension's + CreateCursor request for rendering cursors. Where the Render extension is + not supported, Xcursor maps the cursor image to a standard X cursor and uses + the core X protocol CreateCursor request. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xfonts-utils +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 528 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:7.5+2 +Replaces: fonttosfnt (<< 1.0.4), xutils (<< 1:1.0.1-1) +Depends: libc6 (>= 2.8), libfontenc1, libfreetype6 (>= 2.2.1), libxfont1 (>= 1:1.2.9), zlib1g (>= 1:1.1.4), x11-common, xfonts-encodings +Description: X Window System font utility programs + xfonts-utils provides a set of utility programs shipped with the X Window + System that are needed for font management. + . + The programs in this package include: + - bdftopcf, which converts BDF fonts to PCF fonts; + - bdftruncate and ucs2any, tools to generate fonts with various encodings + from ISO 10646-encoded fonts + - mkfontdir, a program to generate fonts.dir files; + - mkfontscale, a program to generate fonts.scale files; + - fonttosfnt, a program to wrap bitmap fonts in a sfnt (TrueType) wrapper. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libfontenc1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 88 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libfontenc +Version: 1:1.0.5-1 +Depends: libc6 (>= 2.7), zlib1g (>= 1:1.1.4) +Description: X11 font encoding library + libfontenc is a library which helps font libraries portably determine + and deal with different encodings of fonts. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libfontenc +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: cpio +Status: install ok installed +Priority: required +Section: utils +Installed-Size: 872 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.10-1ubuntu2 +Replaces: cpio-mt +Depends: libc6 (>= 2.6) +Conflicts: cpio-mt, mt-st (<< 0.6) +Description: GNU cpio -- a program to manage archives of files + GNU cpio is a tool for creating and extracting archives, or copying + files from one place to another. It handles a number of cpio formats + as well as reading and writing tar files. +Original-Maintainer: Clint Adams <schizo@debian.org> + +Package: libstdc++6 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 1268 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gcc-4.4 +Version: 4.4.3-4ubuntu5 +Depends: gcc-4.4-base (= 4.4.3-4ubuntu5), libc6 (>= 2.4), libgcc1 +Conflicts: scim (<< 1.4.2-1) +Description: The GNU Standard C++ Library v3 + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: x11-xfs-utils +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 132 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 7.4+1build2 +Replaces: fslsfonts, fstobdf, showfont, xbase-clients (<= 1:7.2.ds2-3), xfsinfo, xutils (<= 1:7.1.ds.3-1) +Depends: libc6 (>= 2.4), libfs6, libx11-6 (>= 0) +Pre-Depends: x11-common (>= 1:7.0.0) +Conflicts: fslsfonts, fstobdf, showfont, xfsinfo +Description: X font server utilities + x11-xfs-utils provides a set of utility programs useful on a system that uses + an X font server. + . + The programs in this package include: + - fslsfonts, a tool that lists fonts served by an X font server; + - fstobdf, a tool which retrieves a font in BDF format from an X font server; + - showfont, a font dumper for use with an X font server; + - xfsinfo, an X font server information utility. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: ca-certificates +Status: install ok installed +Priority: optional +Section: misc +Installed-Size: 736 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Version: 20090814 +Depends: openssl, debconf (>= 0.5) | debconf-2.0 +Enhances: libssl0.9.8, openssl +Description: Common CA certificates + This package includes PEM files of CA certificates to allow SSL-based + applications to check for the authenticity of SSL connections. + . + It includes, among others, certificate authorities used by the Debian + infrastructure and those shipped with Mozilla's browsers. + . + Please note that certificate authorities whose certificates are + included in this package are not in any way audited for + trustworthiness and RFC 3647 compliance, and that full responsibility + to assess them belongs to the local system administrator. +Original-Maintainer: Philipp Kern <pkern@debian.org> + +Package: vim-tiny +Status: install ok installed +Priority: important +Section: editors +Installed-Size: 840 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: vim +Version: 2:7.2.330-1ubuntu3 +Replaces: vim-common (<< 1:7.1.293-2) +Provides: editor +Depends: vim-common (= 2:7.2.330-1ubuntu3), libc6 (>= 2.11), libncurses5 (>= 5.6+20071006-3), libselinux1 (>= 1.32) +Suggests: indent +Conflicts: vim-common (<< 1:7.1.293-2), vim-runtime (<< 1:7.1-056+1) +Conffiles: + /etc/vim/vimrc.tiny 3b4112567ad92c78ccc16c670df381e9 +Description: Vi IMproved - enhanced vi editor - compact version + Vim is an almost compatible version of the UNIX editor Vi. + . + Many new features have been added: multi level undo, syntax + highlighting, command line history, on-line help, filename + completion, block operations, folding, Unicode support, etc. + . + This package contains a minimal version of vim compiled with no + GUI and a small subset of features in order to keep small the + package size. This package does not depend on the vim-runtime + package, but installing it you will get its additional benefits + (online documentation, plugins, ...). +Homepage: http://www.vim.org/ +Original-Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org> + +Package: xorg-docs-core +Status: install ok installed +Priority: optional +Section: doc +Installed-Size: 108 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: xorg-docs +Version: 1:1.5-1 +Replaces: xorg-docs (<< 1:1.4-5) +Suggests: xorg-docs +Description: Core documentation for the X.org X Window System + This package contains core documentation for the X.org X Window + System. This currently includes only a set of manpages which are + standard for the system. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-ati +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 320 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:6.13.0-1ubuntu5 +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), libpciaccess0 (>= 0), xserver-xorg-core (>= 2:1.6.99.900), xserver-xorg-video-r128, xserver-xorg-video-mach64, xserver-xorg-video-radeon +Description: X.Org X server -- AMD/ATI display driver wrapper + This package provides the 'ati' driver for the AMD/ATI Mach64, Rage128, + Radeon, FireGL, FireMV, FirePro and FireStream series. This driver is + actually a wrapper that loads one of the 'mach64', 'r128' or 'radeon' + sub-drivers depending on the hardware. + These sub-drivers are brought through package dependencies. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-ati driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: xserver-xorg-video-siliconmotion +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 228 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.7.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-siliconmotion +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.7), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-siliconmotion +Description: X.Org X server -- SiliconMotion display driver + This package provides the driver for the SiliconMotion Lynx and Cougar family + of chipsets, commonly found in laptops. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-siliconmotion driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: binutils +Status: install ok installed +Priority: optional +Section: devel +Installed-Size: 10176 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 2.20.1-3ubuntu5 +Replaces: binutils-gold (<< 2.20-5) +Provides: elf-binutils +Depends: libc6 (>= 2.11), zlib1g (>= 1:1.1.4) +Suggests: binutils-doc (>= 2.20.1-3ubuntu5) +Conflicts: elf-binutils, gas, modutils (<< 2.4.19-1) +Description: The GNU assembler, linker and binary utilities + The programs in this package are used to assemble, link and manipulate + binary and object files. They may be used in conjunction with a compiler + and various libraries to build programs. +Original-Maintainer: Matthias Klose <doko@debian.org> + +Package: libglib2.0-0 +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 2428 +Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com> +Architecture: amd64 +Source: glib2.0 +Version: 2.24.0-0ubuntu4 +Replaces: libglib2.0-dev (<< 2.23.2-2) +Depends: libc6 (>= 2.9), libpcre3 (>= 7.7), libselinux1 (>= 1.32), zlib1g (>= 1:1.1.4) +Recommends: libglib2.0-data, shared-mime-info +Conflicts: libpango1.0-0 (<< 1.11) +Description: The GLib library of C routines + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared libraries. +Homepage: http://www.gtk.org/ +Original-Maintainer: Loic Minier <lool@dooz.org> + +Package: libgomp1 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 96 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gcc-4.4 +Version: 4.4.3-4ubuntu5 +Depends: gcc-4.4-base (= 4.4.3-4ubuntu5), libc6 (>= 2.6) +Description: GCC OpenMP (GOMP) support library + GOMP is an implementation of OpenMP for the C, C++, and Fortran 95 compilers + in the GNU Compiler Collection. +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: xserver-xorg-video-tseng +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 136 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 1:1.2.3-1 +Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-driver-tseng +Provides: xserver-xorg-video-6 +Depends: libc6 (>= 2.2.5), xserver-xorg-core (>= 2:1.6.99.900) +Conflicts: xserver-xorg-driver-tseng +Description: X.Org X server -- Tseng display driver + This package provides the driver for Tseng Labs cards. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This package is built from the X.org xf86-video-tseng driver module. +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: libtext-charwidth-perl +Status: install ok installed +Priority: required +Section: perl +Installed-Size: 96 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Version: 0.04-6 +Depends: libc6 (>= 2.2.5), perl-base (>= 5.10.0-24ubuntu4), perlapi-5.10.0 +Description: get display widths of characters on the terminal + This module permits perl software to get the display widths of characters + and strings on the terminal, using wcwidth() and wcswidth() from libc. + . + It provides mbwidth(), mbswidth(), and mblen(). +Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org> +Homepage: http://search.cpan.org/search?module=Text::CharWidth + +Package: libxt6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 468 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxt +Version: 1:1.0.7-1 +Depends: libc6 (>= 2.7), libice6 (>= 1:1.0.0), libsm6, libx11-6 +Description: X11 toolkit intrinsics library + libXt provides the X Toolkit Intrinsics, an abstract widget library upon + which other toolkits are based. Xt is the basis for many toolkits, including + the Athena widgets (Xaw), and LessTif (a Motif implementation). + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXt +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + +Package: readline-common +Status: install ok installed +Priority: important +Section: utils +Installed-Size: 132 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: all +Source: readline6 +Version: 6.1-1 +Replaces: libreadline-common, libreadline4 (<< 4.3-16), libreadline5 (<< 5.0-11) +Depends: dpkg (>= 1.15.4) | install-info +Conflicts: libreadline-common, libreadline5 (<< 5.0-11) +Description: GNU readline and history libraries, common files + The GNU readline library aids in the consistency of user interface + across discrete programs that need to provide a command line + interface. + . + The GNU history library provides a consistent user interface for + recalling lines of previously typed input. +Original-Maintainer: Matthias Klose <doko@debian.org> + +Package: gnupg-curl +Status: install ok installed +Priority: optional +Section: utils +Installed-Size: 156 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gnupg +Version: 1.4.10-2ubuntu1 +Depends: libc6 (>= 2.4), libcurl3-gnutls (>= 7.16.2-1), libldap-2.4-2 (>= 2.4.7), gnupg +Description: GNU privacy guard - a free PGP replacement (cURL) + GnuPG is GNU's tool for secure communication and data storage. + It can be used to encrypt data and to create digital signatures. + It includes an advanced key management facility and is compliant + with the proposed OpenPGP Internet standard as described in RFC2440. + . + This package contains the keyserver helper tools built with libcurl, + which replace the ones in the gnupg package built with the "curl shim" + variant of gnupg. This package provides support for HKPS keyservers. + . + GnuPG does not use any patented algorithms. This means it cannot be + compatible with PGP2, because that uses IDEA (which is patented in + a number of countries). +Homepage: http://www.gnupg.org +Original-Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org> + +Package: gcc-4.4-base +Status: install ok installed +Priority: required +Section: libs +Installed-Size: 172 +Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: gcc-4.4 +Version: 4.4.3-4ubuntu5 +Description: The GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). +Homepage: http://gcc.gnu.org/ +Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> + +Package: libkrb5-3 +Status: install ok installed +Priority: standard +Section: libs +Installed-Size: 964 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: krb5 +Version: 1.8.1+dfsg-2 +Replaces: libkrb53 (<< 1.6.dfsg.4~beta1-7) +Depends: libc6 (>= 2.9), libcomerr2 (>= 1.34), libk5crypto3 (>= 1.8+dfsg), libkeyutils1, libkrb5support0 (= 1.8.1+dfsg-2) +Suggests: krb5-doc, krb5-user +Conflicts: libapache-mod-auth-kerb (<= 4.996-5.0-rc6-2), libapache2-mod-auth-kerb (<= 4.996-5.0-rc6-2), ssh-krb5 (<< 3.8.1p1-10) +Description: MIT Kerberos runtime libraries + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the Kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos V5. + . + This package contains the runtime library for the main Kerberos v5 API + used by applications and Kerberos clients. +Original-Maintainer: Sam Hartman <hartmans@debian.org> +Homepage: http://web.mit.edu/kerberos/ + +Package: libxau6 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 72 +Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> +Architecture: amd64 +Source: libxau +Version: 1:1.0.5-1 +Depends: libc6 (>= 2.4) +Description: X11 authorisation library + This package provides the main interface to the X11 authorisation handling, + which controls authorisation for X connections, both client-side and + server-side. + . + More information about X.Org can be found at: + <URL:http://www.X.org> + <URL:http://xorg.freedesktop.org> + <URL:http://lists.freedesktop.org/mailman/listinfo/xorg> + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXau +Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> + diff --git a/test/integration/status-xorg-break-providers b/test/integration/status-xorg-break-providers new file mode 100644 index 0000000..c637351 --- /dev/null +++ b/test/integration/status-xorg-break-providers @@ -0,0 +1,22 @@ +Package: xserver-xorg-core +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 4436 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Source: xorg-server +Version: 2:1.7.7-8 +Breaks: xserver-xorg-video-5 +Description: Xorg X server - core server + +Package: xserver-xorg-video-intel +Status: install ok installed +Priority: optional +Section: x11 +Installed-Size: 1268 +Maintainer: Debian X Strike Force <debian-x@lists.debian.org> +Architecture: i386 +Version: 2:2.13.0-2 +Provides: xserver-xorg-video-6 +Description: X.Org X server -- Intel i8xx, i9xx display driver diff --git a/test/integration/test-00-commands-have-help b/test/integration/test-00-commands-have-help new file mode 100755 index 0000000..4a0cc64 --- /dev/null +++ b/test/integration/test-00-commands-have-help @@ -0,0 +1,101 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +# this test does double duty: The obvious is checking for --help and co, +# but it also checks if the binary can find all methods in the library. +# The later is quite handy for manual testing of non-abibreaking changes +export LD_BIND_NOW=1 +# german variant of klingon used for testing usage of non-existent l10n +export LC_ALL=tlh_DE.UTF-8 + +checkversionmessage() { + testsuccess grep '^apt .* (' ${1}-help.output +} + +checkhelpmessage() { + checkversionmessage "$1" + testsuccess grep '^Usage:' ${1}-help.output +} + +checkoptions() { + testsuccess $1 --help + cp -f rootdir/tmp/testsuccess.output ${1}-help.output + checkhelpmessage "$1" + + testsuccess $1 --version + cp -f rootdir/tmp/testsuccess.output ${1}-help.output + checkversionmessage "$1" +} + +for CMD in 'apt-cache' 'apt-cdrom' 'apt-config' \ + 'apt-extracttemplates' 'apt-get' 'apt-helper' \ + 'apt-mark' 'apt-sortpkgs' 'apt' 'apt-ftparchive'; do + cmd="$(echo "$CMD" | tr -d '-')" + msgtest 'Test for failure with no parameters calling' "$CMD" + if $cmd > ${cmd}-help.output 2>&1; then + echo + cat ${cmd}-help.output + msgfail 'zero exit' + else + msgpass + fi + checkhelpmessage "$cmd" + checkoptions "$cmd" +done + +for CMD in 'apt-dump-solver' 'apt-internal-solver' 'apt-internal-planner'; do + checkoptions "$(echo "$CMD" | tr -d '-')" +done + +# in times of need, we all look for super cow to save the day +testsuccess aptget moo +testsuccess aptget moo -q=2 +testsuccess aptget moo moo +testsuccess aptget moo moo -q=2 +testsuccess aptget moo moo --color +testsuccess aptget moo moo moo +testsuccess aptget moo moo moo -q=2 +testsuccess aptget moo moo moo moo +testsuccess aptget moo moo moo moo -q=2 + +export SOURCE_DATE_EPOCH=moo +testwarningmsg 'W: Environment variable SOURCE_DATE_EPOCH was ignored as it has an invalid value: "moo"' apt moo +testmoo() { + export SOURCE_DATE_EPOCH="$(date -d "$1" +'%s')" + testsuccess aptget moo + cp rootdir/tmp/testsuccess.output moo.output + testsuccess grep "$2" moo.output + testsuccessequal "$2" apt moo -qqq + unset SOURCE_DATE_EPOCH +} +testmoo '@0' 'Have you mooed today?' +# the year 0 is too early for 32bit architectures +testmoo '2000-12-25' 'Happy package management day!' +testmoo '1930-02-18' "It's a Bird ... It's a Plane ... It's Super Cow!" +testmoo '1966-11-07' 'Whoever needs milk, bows to the animal.' +testmoo '1988-03-29' 'Have you mooed today?' +testmoo '1993-08-16' 'Three moos for Debian!' +testmoo '1998-04-01' 'Have you smashed some milk today?' +testmoo '@1484822790' 'Have you mooed today?' +testmoo '@1484822791' 'Have you mooed today?' +testmoo '@1484822792' 'Have you mooed today?' +testmoo '@1484822793' 'Have you mooed today?' + +# that also helps with reproducibility of output… +export COLUMNS=80 +testsuccess aptget moo +export COLUMNS=0 +testwarning aptget moo +export COLUMNS=80a +testwarning aptget moo +export COLUMNS=a80 +testwarning aptget moo +export COLUMNS= +testwarning aptget moo +unset COLUMNS diff --git a/test/integration/test-acquire-binary-all b/test/integration/test-acquire-binary-all new file mode 100755 index 0000000..379348e --- /dev/null +++ b/test/integration/test-acquire-binary-all @@ -0,0 +1,142 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'foo-1' 'all' '2' 'unstable' +buildsimplenativepackage 'foo-2' 'amd64' '2' 'unstable' +setupaptarchive --no-update + +cat >rootdir/etc/apt/apt.conf.d/get-contents <<EOF +Acquire::IndexTargets::deb::Contents { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE)/\$(COMPONENT) \$(ARCHITECTURE) Contents"; + KeepCompressed "true"; +}; +EOF +cp -a rootdir/etc/apt/sources.list.d rootdir/etc/apt/sources.list.d.bak + +msgmsg 'Releasefile with Architectures field and all included' +testsuccess apt update +cp rootdir/tmp/testsuccess.output aptupdate.output +testsuccess grep '^Get.* all Packages ' aptupdate.output +testsuccess grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-1 +foo-2' aptcache pkgnames foo- + +listcurrentlistsdirectory > lists.before +testsuccess grep '_binary-all_Packages' lists.before +testsuccess grep '_Contents-all\.' lists.before + +configarchitecture 'amd64' 'i386' +testsuccessequal "All packages are up to date. +N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'file:$(readlink -f ./aptarchive) unstable InRelease' doesn't support architecture 'i386'" apt update -o quiet::NoProgress=1 +testfileequal lists.before "$(listcurrentlistsdirectory)" +testequal 'foo-1 +foo-2' aptcache pkgnames foo- + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile with Architectures field and all included, but arch-=all' +sed -i 's#^deb\(-src\)\? #deb\1 [arch-=all] #' rootdir/etc/apt/sources.list.d/* +testsuccesswithnotice apt update +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +cp rootdir/tmp/testsuccess.output aptupdate.output +testfailure grep '^Get.* all Packages ' aptupdate.output +testfailure grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-2' aptcache pkgnames foo- + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile has all, but forbids its usage' +configarchitecture 'amd64' +sed -i '/^Architectures: / a\ +No-Support-for-Architecture-all: Packages' $(find ./aptarchive -name 'Release') +signreleasefiles +testsuccess apt update +cp rootdir/tmp/testsuccess.output aptupdate.output +testfailure grep '^Get.* all Packages ' aptupdate.output +testsuccess grep '^Get.* all Contents ' aptupdate.output +sed -i '/^No-Support-for-Architecture-all: / d' $(find ./aptarchive -name 'Release') + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile has all, forbids its usage, but it is forced with arch=all' +sed -i 's#^deb\(-src\)\? #deb\1 [arch=all] #' rootdir/etc/apt/sources.list.d/* +testsuccess apt update +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +cp rootdir/tmp/testsuccess.output aptupdate.output +testsuccess grep '^Get.* all Packages ' aptupdate.output +testsuccess grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-1' aptcache pkgnames foo- + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile with Architectures field but without all' +configarchitecture 'amd64' 'i386' +getarchitecturesfromreleasefile() { echo "$(getarchitectures)"; } +generatereleasefiles +signreleasefiles +testsuccessequal 'All packages are up to date.' apt update -o quiet::NoProgress=1 +cp rootdir/tmp/testsuccess.output aptupdate.output +testfailure grep '^Get.* all Packages ' aptupdate.output +testfailure grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-2' aptcache pkgnames foo- + +configarchitecture 'amd64' +testsuccess apt update +cp rootdir/tmp/testsuccess.output aptupdate.output +testfailure grep '^Get.* all Packages ' aptupdate.output +testfailure grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-2' aptcache pkgnames foo- + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile with Architectures field but without all forced with arch+=all' +sed -i 's#^deb\(-src\)\? #deb\1 [arch+=all] #' rootdir/etc/apt/sources.list.d/* +testsuccess apt update +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +cp rootdir/tmp/testsuccess.output aptupdate.output +testsuccess grep '^Get.* all Packages ' aptupdate.output +testsuccess grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-1 +foo-2' aptcache pkgnames foo- + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile without Architectures field' +getarchitecturesfromreleasefile() { echo -n ''; } +generatereleasefiles +signreleasefiles +testfailure grep '^Architectures: ' $(find ./aptarchive -name 'Release') +testsuccess apt update +cp rootdir/tmp/testsuccess.output aptupdate.output +testsuccess grep '^Get.* all Packages ' aptupdate.output +testsuccess grep '^Get.* all Contents ' aptupdate.output +testequal 'foo-1 +foo-2' aptcache pkgnames foo- + +# apt doesn't know supported archs, so missing a configured arch is a problem +configarchitecture 'amd64' 'i386' +testwarningmsg "W: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'file:$(readlink -f ./aptarchive) unstable InRelease' does not seem to provide it (sources.list entry misspelt?)" apt update +testequal 'foo-1 +foo-2' aptcache pkgnames foo- + +rm -rf rootdir/var/lib/apt/lists +msgmsg 'Releasefile no Architectures all, but forbids its usage' +configarchitecture 'amd64' +sed -i '/^Date: / a\ +No-Support-for-Architecture-all: Packages' $(find ./aptarchive -name 'Release') +signreleasefiles +testsuccess apt update +cp rootdir/tmp/testsuccess.output aptupdate.output +testfailure grep '^Get.* all Packages ' aptupdate.output +testsuccess grep '^Get.* all Contents ' aptupdate.output +sed -i '/^No-Support-for-Architecture-all: / d' $(find ./aptarchive -name 'Release') + +msgmsg 'No Releasefile' +rm -rf rootdir/var/lib/apt/lists +find aptarchive -name '*Release*' -delete +configarchitecture 'amd64' +testfailure apt update +testwarning apt update --allow-insecure-repositories +testequal 'foo-1 +foo-2' aptcache pkgnames foo- diff --git a/test/integration/test-acquire-same-file-multiple-times b/test/integration/test-acquire-same-file-multiple-times new file mode 100755 index 0000000..a6825b2 --- /dev/null +++ b/test/integration/test-acquire-same-file-multiple-times @@ -0,0 +1,90 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +TESTFILE="$TESTDIR/framework" +cp "$TESTFILE" aptarchive/foo +APTARCHIVE="$(readlink -f ./aptarchive)" + +filedown() { + msgtest 'Downloading the same URI twice over file' "$1" + testsuccess --nomsg apthelper download-file "file:///$APTARCHIVE/foo" './downloaded/foo1' '' \ + "file:///$APTARCHIVE/foo" './downloaded/foo2' '' -o Debug::pkgAcquire::Worker=1 + cp rootdir/tmp/testsuccess.output download.log + testsuccess cmp "$TESTFILE" ./downloaded/foo1 + testsuccess cmp ./downloaded/foo1 ./downloaded/foo2 + testequal '1' grep -c '200%20URI%20Start' ./download.log + testequal '1' grep -c '201%20URI%20Done' ./download.log + rm -f ./downloaded/foo1 ./downloaded/foo2 +} + +testrun() { + $1 'no partial' + cp "$TESTFILE" ./downloaded/foo1 + $1 'complete partial 1' + cp "$TESTFILE" ./downloaded/foo2 + $1 'complete partial 2' + cp "$TESTFILE" ./downloaded/foo1 + cp "$TESTFILE" ./downloaded/foo2 + $1 'complete partial 1+2' + dd if="$TESTFILE" of=./downloaded/foo1 bs=500 count=1 2>/dev/null + $1 'partial partial 1' + dd if="$TESTFILE" of=./downloaded/foo2 bs=500 count=1 2>/dev/null + $1 'partial partial 2' + dd if="$TESTFILE" of=./downloaded/foo1 bs=500 count=1 2>/dev/null + dd if="$TESTFILE" of=./downloaded/foo2 bs=500 count=1 2>/dev/null + $1 'partial partial 1+2' +} +testrun 'filedown' + +changetowebserver -o aptwebserver::redirect::replace::/foo2=/foo + +httpdown() { + msgtest 'Downloading the same URI to different files' 'twice over http' + testsuccess --nomsg apthelper download-file "http://localhost:${APTHTTPPORT}/foo" "./downloaded/foo1" '' \ + "http://localhost:${APTHTTPPORT}/foo" './downloaded/foo2' '' -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::http=1 + cp rootdir/tmp/testsuccess.output download.log + testsuccess cmp "$TESTDIR/framework" ./downloaded/foo1 + testsuccess cmp ./downloaded/foo1 ./downloaded/foo2 + testequal '1' grep -c '200%20URI%20Start' ./download.log + testequal '1' grep -c '201%20URI%20Done' ./download.log + rm -f ./downloaded/foo1 ./downloaded/foo2 +} +testrun 'httpdown' + +httpredirectdown() { + msgtest 'Redirect leads' 'first URI to the second URI' + for i in 1 2 3 4 5 6 7 8 9 10; do + rm -f ./downloaded/foo1 ./downloaded/foo2 + testsuccess --nomsg apthelper download-file "http://localhost:${APTHTTPPORT}/foo2" "./downloaded/foo1" '' \ + "http://localhost:${APTHTTPPORT}/foo" './downloaded/foo2' '' -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::http=1 + cp rootdir/tmp/testsuccess.output download.log + testsuccess cmp "$TESTDIR/framework" ./downloaded/foo1 + testsuccess cmp ./downloaded/foo1 ./downloaded/foo2 + + if grep -q '103%20Redirect' ./download.log; then + break + fi + done + testequal '1' grep -c '200%20URI%20Start' ./download.log + testequal '1' grep -c '103%20Redirect' ./download.log + testequal '1' grep -c '201%20URI%20Done' ./download.log + rm -f ./downloaded/foo1 ./downloaded/foo2 +} +testrun 'httpredirectdown' + +httpsamedown() { + msgtest 'Downloading two files via the same URI to' 'the same file' + testsuccess --nomsg apthelper download-file "http://localhost:${APTHTTPPORT}/foo" "./downloaded/foo1" '' \ + "http://localhost:${APTHTTPPORT}/foo" './downloaded/foo1' '' -o Debug::pkgAcquire::Worker=1 + cp rootdir/tmp/testsuccess.output download.log + testsuccess cmp "$TESTDIR/framework" ./downloaded/foo1 + testequal '1' grep -c '200%20URI%20Start' ./download.log + testequal '1' grep -c '201%20URI%20Done' ./download.log + rm -f ./downloaded/foo1 +} +testrun 'httpsamedown' diff --git a/test/integration/test-allow b/test/integration/test-allow new file mode 100755 index 0000000..2cc57bc --- /dev/null +++ b/test/integration/test-allow @@ -0,0 +1,98 @@ +#!/bin/sh +# +# Test for --allow-remove-essential and friends replacing --force-yes +# +set -e + +TESTDIR="$(readlink -f "$(dirname $0)")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'downgrade' 'all' '1' +insertinstalledpackage 'downgrade' 'all' '2' + +insertpackage 'unstable' 'hold' 'all' '2' +insertinstalledpackage 'hold' 'all' '1' + +insertinstalledpackage 'essential' 'all' '1' 'Essential: yes' + +setupaptarchive + +testsuccess aptmark hold hold + +# Test --allow-remove--essential + +testfailureequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + essential +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + essential +0 upgraded, 0 newly installed, 1 to remove and 1 not upgraded. +E: Essential packages were removed and -y was used without --allow-remove-essential.' aptget remove essential -y -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + essential +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + essential +0 upgraded, 0 newly installed, 1 to remove and 1 not upgraded. +Remv essential [1]' aptget remove essential -y --allow-remove-essential -s + +# Test --allow-change-held-packages (should not influence dist-upgrade, but an install) + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + hold +0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.' aptget dist-upgrade --allow-change-held-packages -s + +testfailureequal 'Reading package lists... +Building dependency tree... +The following held packages will be changed: + hold +The following packages will be upgraded: + hold +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +E: Held packages were changed and -y was used without --allow-change-held-packages.' aptget install hold -y -s + +testfailureequal 'Reading package lists... +Building dependency tree... +The following held packages will be changed: + hold +The following packages will be upgraded: + hold +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +E: Held packages were changed and -y was used without --allow-change-held-packages.' aptget install hold -y -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following held packages will be changed: + hold +The following packages will be upgraded: + hold +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst hold [1] (2 unstable [all]) +Conf hold (2 unstable [all])' aptget install hold -y -s --allow-change-held-packages + +# Test --allow-downgrades + +testfailureequal 'Reading package lists... +Building dependency tree... +The following packages will be DOWNGRADED: + downgrade +0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 1 not upgraded. +E: Packages were downgraded and -y was used without --allow-downgrades.' aptget install downgrade=1 -y -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be DOWNGRADED: + downgrade +0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 1 not upgraded. +Inst downgrade [2] (1 unstable [all]) +Conf downgrade (1 unstable [all])' aptget install downgrade=1 --allow-downgrades -y -s diff --git a/test/integration/test-allow-scores-for-all-dependency-types b/test/integration/test-allow-scores-for-all-dependency-types new file mode 100755 index 0000000..9b300b7 --- /dev/null +++ b/test/integration/test-allow-scores-for-all-dependency-types @@ -0,0 +1,179 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unversioned' 'libdb-dev' 'amd64' '5.3.0' 'Depends: libdb5.3-dev +Conflicts: libdb5.1-dev' +insertpackage 'unversioned' 'libdb5.1-dev' 'amd64' '5.1.29-7' +insertpackage 'unversioned' 'libdb5.3-dev' 'amd64' '5.3.28-3' 'Conflicts: libdb5.1-dev' + +insertpackage 'unversioned' 'foo' 'amd64' '1' +insertpackage 'unversioned' 'bar' 'amd64' '1' +insertpackage 'unversioned' 'foo' 'amd64' '2' 'Conflicts: bar' +insertpackage 'unversioned' 'bar' 'amd64' '2' 'Conflicts: foo' +insertpackage 'unversioned' 'baz' 'amd64' '2' 'Depends: bar | foo' + +insertpackage 'versioned' 'libdb-dev' 'amd64' '5.3.0' 'Depends: libdb5.3-dev +Conflicts: libdb5.1-dev (<< 5.2)' +insertpackage 'versioned' 'libdb5.3-dev' 'amd64' '5.3.28-3' 'Conflicts: libdb5.1-dev (<< 5.2)' + +insertpackage 'versioned' 'foo' 'amd64' '2' 'Conflicts: bar (<= 2)' +insertpackage 'versioned' 'bar' 'amd64' '2' 'Conflicts: foo (<= 2)' +insertpackage 'versioned' 'baz' 'amd64' '2' 'Depends: bar (>= 2) | foo (>= 2)' + +insertpackage 'multipleno' 'foo' 'amd64' '2.1' 'Conflicts: bar (<= 3)' +insertpackage 'multipleno' 'bar' 'amd64' '2.1' 'Conflicts: foo (<= 3), foo (<= 1)' + +insertpackage 'multipleyes' 'foo' 'amd64' '2.2' 'Conflicts: bar (<= 3)' +# having foo multiple times as conflict is a non-advisable hack in general +insertpackage 'multipleyes' 'bar' 'amd64' '2.2' 'Conflicts: foo (<= 3), foo (<= 3)' + +#774924 - slightly simplified +insertpackage 'jessie' 'login' 'amd64' '2' 'Pre-Depends: libaudit1 (>= 0)' +insertpackage 'jessie' 'libaudit1' 'amd64' '2' 'Depends: libaudit-common (>= 0)' +insertpackage 'jessie' 'libaudit-common' 'amd64' '2' 'Breaks: libaudit0, libaudit1 (<< 2)' + +cp rootdir/var/lib/dpkg/status rootdir/var/lib/dpkg/status-backup +setupaptarchive + +insertinstalledpackage 'libdb-dev' 'amd64' '5.1.7' 'Depends: libdb5.1-dev' +insertinstalledpackage 'libdb5.1-dev' 'amd64' '5.1.29-7' +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + libdb5.1-dev +The following NEW packages will be installed: + libdb5.3-dev +The following packages will be upgraded: + libdb-dev +1 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libdb5.1-dev [5.1.29-7] [libdb-dev:amd64 ] +Inst libdb-dev [5.1.7] (5.3.0 unversioned [amd64]) [] +Inst libdb5.3-dev (5.3.28-3 unversioned [amd64]) +Conf libdb-dev (5.3.0 unversioned [amd64]) +Conf libdb5.3-dev (5.3.28-3 unversioned [amd64])' aptget dist-upgrade -st unversioned +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + libdb5.1-dev +The following NEW packages will be installed: + libdb5.3-dev +The following packages will be upgraded: + libdb-dev +1 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libdb5.1-dev [5.1.29-7] [libdb-dev:amd64 ] +Inst libdb-dev [5.1.7] (5.3.0 versioned [amd64]) [] +Inst libdb5.3-dev (5.3.28-3 versioned [amd64]) +Conf libdb-dev (5.3.0 versioned [amd64]) +Conf libdb5.3-dev (5.3.28-3 versioned [amd64])' aptget dist-upgrade -st versioned + +cp -f rootdir/var/lib/dpkg/status-backup rootdir/var/lib/dpkg/status +insertinstalledpackage 'foo' 'amd64' '1' +insertinstalledpackage 'bar' 'amd64' '1' +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + bar foo +0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st unversioned +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + bar foo +0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st versioned +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + bar foo +0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st multipleno +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + foo +The following packages will be upgraded: + bar +1 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv foo [1] +Inst bar [1] (2.2 multipleyes [amd64]) +Conf bar (2.2 multipleyes [amd64])' aptget dist-upgrade -st multipleyes + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + baz +0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst baz (2 unversioned [amd64]) +Conf baz (2 unversioned [amd64])' aptget install baz -st unversioned +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following packages will be REMOVED: + bar +The following NEW packages will be installed: + baz +The following packages will be upgraded: + foo +1 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv bar [1] +Inst foo [1] (2 versioned [amd64]) +Inst baz (2 versioned [amd64]) +Conf foo (2 versioned [amd64]) +Conf baz (2 versioned [amd64])' aptget install baz -st versioned + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + baz +0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst baz (2 unversioned [amd64]) +Conf baz (2 unversioned [amd64])' aptget install baz -st unversioned +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following packages will be REMOVED: + bar +The following NEW packages will be installed: + baz +The following packages will be upgraded: + foo +1 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv bar [1] +Inst foo [1] (2 versioned [amd64]) +Inst baz (2 versioned [amd64]) +Conf foo (2 versioned [amd64]) +Conf baz (2 versioned [amd64])' aptget install baz -st versioned + +# recreating the exact situation is hard, so we pull tricks to get the score +cp -f rootdir/var/lib/dpkg/status-backup rootdir/var/lib/dpkg/status +insertinstalledpackage 'gdm3' 'amd64' '1' 'Depends: libaudit0, libaudit0' +insertinstalledpackage 'login' 'amd64' '1' 'Essential: yes' +insertinstalledpackage 'libaudit0' 'amd64' '1' +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + gdm3 libaudit0 +The following NEW packages will be installed: + libaudit-common libaudit1 +The following packages will be upgraded: + login +1 upgraded, 2 newly installed, 2 to remove and 0 not upgraded. +Remv gdm3 [1] +Remv libaudit0 [1] +Inst libaudit-common (2 jessie [amd64]) +Conf libaudit-common (2 jessie [amd64]) +Inst libaudit1 (2 jessie [amd64]) +Conf libaudit1 (2 jessie [amd64]) +Inst login [1] (2 jessie [amd64]) +Conf login (2 jessie [amd64])' aptget dist-upgrade -st jessie diff --git a/test/integration/test-apt-acquire-additional-files b/test/integration/test-apt-acquire-additional-files new file mode 100755 index 0000000..928c703 --- /dev/null +++ b/test/integration/test-apt-acquire-additional-files @@ -0,0 +1,246 @@ +#!/bin/sh +set -e +# Cause umask failures +umask 000 + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +# note that in --print-uri we talk about .xz because that is the default. +# This doesn't mean it is actually attempt to download it. +configcompression '.' 'gz' +LOWCOSTEXT='lz4' + +buildsimplenativepackage 'foo' 'amd64' '1' 'unstable' +buildsimplenativepackage 'bar' 'all' '1' 'unstable' + +setupaptarchive --no-update +changetowebserver + +testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 " aptget update --print-uris + +testsuccessequal "Get:1 http://localhost:${APTHTTPPORT} unstable InRelease [$(stat -c%s aptarchive/dists/unstable/InRelease) B] +Get:2 http://localhost:${APTHTTPPORT} unstable/main Sources [$(stat -c%s aptarchive/dists/unstable/main/source/Sources.gz) B] +Get:3 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages [$(stat -c%s aptarchive/dists/unstable/main/binary-amd64/Packages.gz) B] +Get:4 http://localhost:${APTHTTPPORT} unstable/main all Packages [$(stat -c%s aptarchive/dists/unstable/main/binary-all/Packages.gz) B] +Get:5 http://localhost:${APTHTTPPORT} unstable/main Translation-en [$(stat -c%s aptarchive/dists/unstable/main/i18n/Translation-en.gz) B] +Reading package lists..." aptget update + +testempty find rootdir/var/lib/apt/lists -name '*Contents*' + +msgmsg "Normal Contents file" +cat > rootdir/etc/apt/apt.conf.d/content-target.conf <<EOF +Acquire::IndexTargets::deb::Contents { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE)/\$(COMPONENT) \$(ARCHITECTURE) Contents"; +}; +EOF + +readfile() { + while [ -n "$1" ]; do + readlink -f "./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_${1}" + shift + done +} + +testequal "$(readfile Contents-amd64 Contents-all)" aptget indextargets --no-release-info --format '$(FILENAME)' 'Identifier: Contents' +testempty aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +# lets fake the existence of a compressed Contents file +touch "./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" +chmod 644 "./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" +testequal "$(readfile Contents-amd64.gz)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +touch "./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" +chmod 644 "./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" +testequal "$(readfile Contents-amd64.gz Contents-all.gz)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' + +testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-amd64.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-all.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all 0 " aptget update --print-uris + +# apt believes the Contents files we faked are good +testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Reading package lists..." aptget update +testequal "$(readfile Contents-amd64.gz Contents-all.gz)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' + +find rootdir/var/lib/apt/lists -name '*Contents*' -delete + +testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-amd64.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-all.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all 0 " aptget update --print-uris + +testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Get:2 http://localhost:${APTHTTPPORT} unstable/main amd64 Contents [$(stat -c%s aptarchive/dists/unstable/main/Contents-amd64.gz) B] +Get:3 http://localhost:${APTHTTPPORT} unstable/main all Contents [$(stat -c%s aptarchive/dists/unstable/main/Contents-all.gz) B] +Reading package lists..." aptget update + +testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64" find rootdir/var/lib/apt/lists -name '*Contents-amd64*' +testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all" find rootdir/var/lib/apt/lists -name '*Contents-all*' +testequal "$(readfile Contents-amd64 Contents-all)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64" 'aptarchive/dists/unstable/main/Contents-amd64' +testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all" 'aptarchive/dists/unstable/main/Contents-all' + +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64 \ + ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all +testempty aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' + +# if we asked for keeping it compressed, keep it +msgmsg "Normal Contents file with KeepCompressed" +echo 'Acquire::IndexTargets::deb::Contents::KeepCompressed "true";' >> rootdir/etc/apt/apt.conf.d/content-target.conf +testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Get:2 http://localhost:${APTHTTPPORT} unstable/main amd64 Contents [$(stat -c%s aptarchive/dists/unstable/main/Contents-amd64.gz) B] +Get:3 http://localhost:${APTHTTPPORT} unstable/main all Contents [$(stat -c%s aptarchive/dists/unstable/main/Contents-all.gz) B] +Reading package lists..." aptget update + +testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.$LOWCOSTEXT" find rootdir/var/lib/apt/lists -name '*Contents-amd64*' +testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.$LOWCOSTEXT" find rootdir/var/lib/apt/lists -name '*Contents-all*' +testequal "$(readfile Contents-amd64.$LOWCOSTEXT Contents-all.$LOWCOSTEXT)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +testequal "$(apthelper cat-file rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.$LOWCOSTEXT)" apthelper cat-file 'aptarchive/dists/unstable/main/Contents-amd64.gz' +testequal "$(apthelper cat-file rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.$LOWCOSTEXT)" apthelper cat-file 'aptarchive/dists/unstable/main/Contents-all.gz' + +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.$LOWCOSTEXT +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.$LOWCOSTEXT +testempty aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' + +msgmsg "Compressed Contents file" +# and no automatic uncompress based on the name please, +# only if we downloaded a compressed file, but target was uncompressed +cat > rootdir/etc/apt/apt.conf.d/content-target.conf <<EOF +Acquire::IndexTargets::deb::Contents { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE).gz"; + ShortDescription "Contents.gz"; + Description "\$(RELEASE)/\$(COMPONENT) \$(ARCHITECTURE) Contents.gz"; +}; +EOF + +runthistest() { + # the last lines are utter bogus of course, but how should apt know… + testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-amd64.gz.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-all.gz.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz 0 " aptget update --print-uris + + testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Get:2 http://localhost:${APTHTTPPORT} unstable/main amd64 Contents.gz [$(stat -c%s aptarchive/dists/unstable/main/Contents-amd64.gz) B] +Get:3 http://localhost:${APTHTTPPORT} unstable/main all Contents.gz [$(stat -c%s aptarchive/dists/unstable/main/Contents-all.gz) B] +Reading package lists..." aptget update + + testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" find rootdir/var/lib/apt/lists -name '*Contents-amd64*' + testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" find rootdir/var/lib/apt/lists -name '*Contents-all*' + testequal "$(readfile Contents-amd64.gz Contents-all.gz)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' + testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" 'aptarchive/dists/unstable/main/Contents-amd64.gz' + testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" 'aptarchive/dists/unstable/main/Contents-all.gz' +} +runthistest + +msgmsg "Compressed Contents file from native architecture" +echo 'Acquire::IndexTargets::deb::Contents::MetaKey "$(COMPONENT)/Contents-$(NATIVE_ARCHITECTURE).gz";' >> rootdir/etc/apt/apt.conf.d/content-target.conf +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz +testempty aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +runthistest + +msgmsg "Contents with 3 MetaKeys, first match" +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz +testempty aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +cat > rootdir/etc/apt/apt.conf.d/content-target.conf <<EOF +Acquire::IndexTargets::deb::Contents3 { + MetaKey "main/Contents-all"; + ShortDescription "Contents3"; + Description "\$(RELEASE) all Contents3"; + Fallback-Of "Contents2"; + Identifier "Contents"; +}; +Acquire::IndexTargets::deb::Contents { + MetaKey "\$(COMPONENT)/Contents-amd64"; + ShortDescription "Contents"; + Description "\$(RELEASE)/\$(COMPONENT) amd64 Contents"; +}; +Acquire::IndexTargets::deb::Contents2 { + MetaKey "Contents-all"; + ShortDescription "Contents2"; + Description "\$(RELEASE) all Contents2"; + Fallback-Of "Contents"; + Identifier "Contents"; +}; +EOF +testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-amd64.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64 0 " aptget update --print-uris +testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Get:2 http://localhost:${APTHTTPPORT} unstable/main amd64 Contents [$(stat -c%s aptarchive/dists/unstable/main/Contents-amd64.gz) B] +Reading package lists..." aptget update +testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64" find rootdir/var/lib/apt/lists -name '*Contents*' +testequal "$(readfile Contents-amd64)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64" 'aptarchive/dists/unstable/main/Contents-amd64' + +msgmsg "Contents with 3 MetaKeys, third match" +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64 +testempty aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +echo 'Acquire::IndexTargets::deb::Contents::MetaKey "$(COMPONENT)/Contents-i386";' >> rootdir/etc/apt/apt.conf.d/content-target.conf +testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-i386.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-i386 0 " aptget update --print-uris +testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Get:2 http://localhost:${APTHTTPPORT} unstable all Contents3 [$(stat -c%s aptarchive/dists/unstable/main/Contents-all.gz) B] +Reading package lists..." aptget update +testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all" find rootdir/var/lib/apt/lists -name '*Contents*' +testequal "$(readfile Contents-all)" aptget indextargets --format '$(FILENAME)' 'Identifier: Contents' +testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all" 'aptarchive/dists/unstable/main/Contents-all' + +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all +msgmsg "No Contents file" +cat > rootdir/etc/apt/apt.conf.d/content-target-notdefault.conf <<EOF +Acquire::IndexTargets::deb::Contents::DefaultEnabled "no"; +Acquire::IndexTargets::deb::Contents2::DefaultEnabled "no"; +Acquire::IndexTargets::deb::Contents3::DefaultEnabled "no"; +EOF +testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.xz' localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-en 0 " aptget update --print-uris + +testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Reading package lists..." aptget update + +testempty find rootdir/var/lib/apt/lists -name '*Contents*' + +msgmsg "Order of Contents files" +sameupdateoutput() { + testsuccessequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-i386.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-i386 0 " aptget update --print-uris +} +sed -i -e 's#deb\(-src\)\? http#deb\1 [target=Contents3,Contents2,Contents] http#' rootdir/etc/apt/sources.list.d/* +sameupdateoutput +sed -i -e 's#deb\(-src\)\? \[target=[^]]\+\] http#deb\1 [target=Contents2,Contents3,Contents] http#' rootdir/etc/apt/sources.list.d/* +sameupdateoutput +sed -i -e 's#deb\(-src\)\? \[target=[^]]\+\] http#deb\1 [target=Contents3,Contents,Contents2] http#' rootdir/etc/apt/sources.list.d/* +sameupdateoutput +sed -i -e 's#deb\(-src\)\? \[target=[^]]\+\] http#deb\1 [target=Contents,Contents3,Contents2] http#' rootdir/etc/apt/sources.list.d/* +sameupdateoutput diff --git a/test/integration/test-apt-acquire-additional-files-duplicates b/test/integration/test-apt-acquire-additional-files-duplicates new file mode 100755 index 0000000..b0b6460 --- /dev/null +++ b/test/integration/test-apt-acquire-additional-files-duplicates @@ -0,0 +1,105 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +cat > rootdir/etc/apt/apt.conf.d/content-target.conf <<EOF +Acquire::IndexTargets::deb::Contents1 { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE) Contents"; + DefaultEnabled "false"; +}; +Acquire::IndexTargets::deb::Contents2 { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE) Contents"; + DefaultEnabled "false"; +}; +Acquire::IndexTargets::deb::Contentsflat { + MetaKey "Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE) Contents"; + DefaultEnabled "false"; +}; +EOF + +mkdir -p ./rootdir/var/lib/apt/lists +APTLISTS="$(readlink -f ./rootdir/var/lib/apt/lists)" +APTETC="$(readlink -f ./rootdir/etc/apt)" +cat > rootdir/etc/apt/sources.list <<EOF +deb http://example.org/debian stable main rocks +deb-src http://example.org/debian stable main rocks +EOF +testsuccessequal "${APTLISTS}/example.org_debian_dists_stable_main_source_Sources +${APTLISTS}/example.org_debian_dists_stable_rocks_source_Sources +${APTLISTS}/example.org_debian_dists_stable_main_binary-amd64_Packages +${APTLISTS}/example.org_debian_dists_stable_main_binary-i386_Packages +${APTLISTS}/example.org_debian_dists_stable_main_binary-all_Packages +${APTLISTS}/example.org_debian_dists_stable_main_i18n_Translation-en +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-amd64_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-i386_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-all_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_i18n_Translation-en" aptget indextargets --no-release-info --format '$(FILENAME)' + +cat >> rootdir/etc/apt/sources.list <<EOF +deb http://example.org/debian stable main rocks +EOF +rm -r rootdir/var/cache/apt/*.bin +testwarning aptcache gencaches +testwarningequal "${APTLISTS}/example.org_debian_dists_stable_main_source_Sources +${APTLISTS}/example.org_debian_dists_stable_rocks_source_Sources +${APTLISTS}/example.org_debian_dists_stable_main_binary-amd64_Packages +${APTLISTS}/example.org_debian_dists_stable_main_binary-i386_Packages +${APTLISTS}/example.org_debian_dists_stable_main_binary-all_Packages +${APTLISTS}/example.org_debian_dists_stable_main_i18n_Translation-en +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-amd64_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-i386_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-all_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_i18n_Translation-en +W: Target Packages (main/binary-amd64/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (main/binary-i386/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (main/binary-all/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Translations (main/i18n/Translation-en) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (rocks/binary-amd64/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (rocks/binary-i386/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (rocks/binary-all/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Translations (rocks/i18n/Translation-en) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3" aptget indextargets --no-release-info --format '$(FILENAME)' + +cat >> rootdir/etc/apt/sources.list <<EOF +deb [target=Contents1,Contents2,Contentsflat arch=amd64] http://example.org/debian stable main rocks +deb-src [target=Contents1,Contents2,Contentsflat arch=amd64] http://example.org/debian stable main rocks +EOF +rm -r rootdir/var/cache/apt/*.bin +testwarning aptcache gencaches +testwarningequal "${APTLISTS}/example.org_debian_dists_stable_main_source_Sources +${APTLISTS}/example.org_debian_dists_stable_rocks_source_Sources +${APTLISTS}/example.org_debian_dists_stable_main_binary-amd64_Packages +${APTLISTS}/example.org_debian_dists_stable_main_binary-i386_Packages +${APTLISTS}/example.org_debian_dists_stable_main_binary-all_Packages +${APTLISTS}/example.org_debian_dists_stable_main_i18n_Translation-en +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-amd64_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-i386_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_binary-all_Packages +${APTLISTS}/example.org_debian_dists_stable_rocks_i18n_Translation-en +${APTLISTS}/example.org_debian_dists_stable_main_Contents-amd64 +${APTLISTS}/example.org_debian_dists_stable_main_Contents-all +${APTLISTS}/example.org_debian_dists_stable_Contents-amd64 +${APTLISTS}/example.org_debian_dists_stable_Contents-all +${APTLISTS}/example.org_debian_dists_stable_rocks_Contents-amd64 +${APTLISTS}/example.org_debian_dists_stable_rocks_Contents-all +W: Target Packages (main/binary-amd64/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (main/binary-i386/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (main/binary-all/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Translations (main/i18n/Translation-en) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (rocks/binary-amd64/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (rocks/binary-i386/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Packages (rocks/binary-all/Packages) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Translations (rocks/i18n/Translation-en) is configured multiple times in ${APTETC}/sources.list:1 and ${APTETC}/sources.list:3 +W: Target Contents2 wants to acquire the same file (main/Contents-amd64) as Contents1 from source ${APTETC}/sources.list:4 +W: Target Contents2 wants to acquire the same file (main/Contents-all) as Contents1 from source ${APTETC}/sources.list:4 +W: Target Contents2 wants to acquire the same file (rocks/Contents-amd64) as Contents1 from source ${APTETC}/sources.list:4 +W: Target Contents2 wants to acquire the same file (rocks/Contents-all) as Contents1 from source ${APTETC}/sources.list:4" aptget indextargets --no-release-info --format '$(FILENAME)' diff --git a/test/integration/test-apt-by-hash-update b/test/integration/test-apt-by-hash-update new file mode 100755 index 0000000..f4794a8 --- /dev/null +++ b/test/integration/test-apt-by-hash-update @@ -0,0 +1,107 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' +confighashes 'SHA512' +configcompression '.' 'gz' + +insertpackage 'unstable' 'foo' 'all' '1.0' +insertpackage 'unstable' 'bar' 'i386' '1.0' + +setupaptarchive --no-update + +# make Packages *only* accessible by-hash for this test +makebyhashonly() { + local NORMAL="$(readlink -f "./aptarchive/dists/unstable/main/${1}")" + local BYHASH="${NORMAL}/by-hash/SHA512" + mkdir -p "${BYHASH}" + find "${NORMAL}/" -maxdepth 1 -name "${2}*" -exec mv '{}' "$BYHASH" \; + ln -s "${BYHASH}/${2}.gz" "${BYHASH}/$(sha512sum "${BYHASH}/${2}.gz" | cut -f1 -d' ')" +} +makebyhashonly 'binary-i386' 'Packages' +makebyhashonly 'binary-all' 'Packages' +makebyhashonly 'source' 'Sources' + +ensureitsbroken() { + rm -rf rootdir/var/lib/apt/lists + # we moved the Packages file away, normal update won't work + testfailure aptget update "$@" + # ensure we do not know about "foo" + testfailureequal "Reading package lists... +Building dependency tree... +E: Unable to locate package foo" aptget install -q -s foo +} +ensureitsbroken +ensureitsbroken -o Acquire::By-Hash=1 + +ensureitworks() { + rm -rf rootdir/var/lib/apt/lists + testsuccess aptget update "$@" -o Acquire::Languages=none + testfailure grep '^Ign' rootdir/tmp/testsuccess.output + rm -rf rootdir/var/lib/apt/lists + testsuccess aptget update "$@" + cp -f rootdir/tmp/testsuccess.output rootdir/tmp/aptupdate.output + testsuccess grep '^Ign' rootdir/tmp/aptupdate.output + testsuccessequal "Inst foo (1.0 unstable [all]) +Conf foo (1.0 unstable [all])" aptget install -qq -s foo + testsuccessequal "Inst bar (1.0 unstable [i386]) +Conf bar (1.0 unstable [i386])" aptget install -qq -s bar +} +msgmsg 'Test by-hash via' 'config option' +ensureitworks -o Acquire::By-Hash=force + +msgmsg 'Test by-hash via' 'release option' +cp -a aptarchive/dists aptarchive/dists.bak +# add magic string to Release file ... +sed -i '/^Suite: / a \ +Acquire-By-Hash: yes' aptarchive/dists/unstable/Release +signreleasefiles +ensureitworks +ensureitsbroken -o Acquire::By-Hash=0 + +msgmsg 'Test by-hash via' 'sources option' +sed -i "s#^\(deb\(-src\)\?\) #\1 [by-hash=yes] #" rootdir/etc/apt/sources.list.d/* +ensureitworks +#ensureitsbroken -o Acquire::By-Hash=0 + +rm -rf aptarchive/dists +cp -a aptarchive/dists.bak aptarchive/dists +#ensureitworks -o Acquire::By-Hash=force +ensureitsbroken -o Acquire::By-Hash=1 +ensureitsbroken -o Acquire::By-Hash=0 + +sed -i "s#^\(deb\(-src\)\?\) \[by-hash=yes\] #\1 [by-hash=force] #" rootdir/etc/apt/sources.list.d/* +ensureitworks +#ensureitsbroken -o Acquire::By-Hash=0 + + + +msgmsg 'Test InRelease by-hash via' 'sources option' + +rm -rf aptarchive/dists +cp -a aptarchive/dists.bak aptarchive/dists +mkdir -p aptarchive/dists/unstable/by-hash/SHA256 +inrelease_hash=$(sha256sum aptarchive/dists/unstable/InRelease | awk '{print $1}') +mv aptarchive/dists/unstable/InRelease aptarchive/dists/unstable/by-hash/SHA256/$inrelease_hash +#ensureitworks -o Acquire::By-Hash=force +ensureitsbroken -o Acquire::By-Hash=1 +ensureitsbroken -o Acquire::By-Hash=0 + +sed -i "s#^\(deb\(-src\)\?\) \[by-hash=force\] #\1 [by-hash=force inrelease-path=by-hash/SHA256/$inrelease_hash] #" rootdir/etc/apt/sources.list.d/* +ensureitworks +#ensureitsbroken -o Acquire::By-Hash=0 + +msgmsg 'Test InRelease by-hash with' 'no fallback' + +rm -rf aptarchive/dists +cp -a aptarchive/dists.bak aptarchive/dists + +testfailureequal "Get:1 file:${TMPWORKINGDIRECTORY}/aptarchive unstable InRelease +Err:1 file:${TMPWORKINGDIRECTORY}/aptarchive unstable InRelease + File not found - ${TMPWORKINGDIRECTORY}/aptarchive/dists/unstable/by-hash/SHA256/${inrelease_hash} (2: No such file or directory) +Reading package lists... +E: Failed to fetch file://${TMPWORKINGDIRECTORY}/aptarchive/dists/unstable/InRelease File not found - ${TMPWORKINGDIRECTORY}/aptarchive/dists/unstable/by-hash/SHA256/${inrelease_hash} (2: No such file or directory)" aptget update diff --git a/test/integration/test-apt-cache b/test/integration/test-apt-cache new file mode 100755 index 0000000..bff1667 --- /dev/null +++ b/test/integration/test-apt-cache @@ -0,0 +1,183 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' 'i386' + +DESCR='Some description + That has multiple lines' +insertpackage 'unstable' 'fancy' 'all' '1' +insertpackage 'unstable,installed' 'foo' 'all' '1' 'Depends: bar +Conflicts: foobar +Recommends: cool (>= 2) | cooler (<< 5)' "$DESCR" +insertpackage 'unstable' 'bar' 'all' '1' 'Depends: bar +Breaks: foo (<< 1) +Replaces: foo (<< 1)' "$DESCR" +insertpackage 'unstable' 'specific' 'all' '1' 'Depends: bar:i386, specific:amd64 +Breaks: foo:amd64 (<< 1) +Replaces: foo:i386 (<< 1)' "$DESCR" + +setupaptarchive + +# dpkg is installed by our framework +testdpkginstalled 'dpkg' +testempty aptcache unmet dpkg + +# FIXME: Find some usecase for unmet as it seems kinda useless/broken +#testsuccess aptcache unmet +#testsuccess aptcache unmet foo + +# not too useful to test, but makes coverage green… +testsuccess aptcache stats +cp rootdir/tmp/testsuccess.output stats.output +testsuccess test -s stats.output +testfailureequal 'E: apt-cache stats does not take any arguments' aptcache stats foo +testsuccess aptcache xvcg foo +cp rootdir/tmp/testsuccess.output xvcg.output +testsuccess test -s xvcg.output +testsuccess aptcache dotty foo +cp rootdir/tmp/testsuccess.output dotty.output +testsuccess test -s dotty.output +# for this, even the sourcecode says it is useless (expect debugging) +testsuccess aptcache dump +cp rootdir/tmp/testsuccess.output dump.output +testsuccess test -s dump.output + +testsuccessequal 'bar +foo +dpkg +specific +fancy' aptcache pkgnames +testsuccessequal 'bar' aptcache pkgnames bar +testsuccessequal 'foo +fancy' aptcache pkgnames f + +testsuccessequal " foo | 1 | file:$(readlink -f .)/aptarchive unstable/main all Packages" aptcache madison foo + +### depends + +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + |Recommends: <cool> + Recommends: <cooler>' aptcache depends foo +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + |Recommends: <cool> + Recommends: <cooler>' aptcache depends foo --implicit +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + Recommends: <cool>' aptcache depends foo -o APT::Cache::ShowOnlyFirstOr=1 +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + Recommends: <cool>' aptcache depends foo -o APT::Cache::ShowOnlyFirstOr=1 --implicit +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + |Recommends: <cool> (>= 2) + Recommends: <cooler> (<< 5)' aptcache depends foo -o APT::Cache::ShowVersion=1 +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + |Recommends: <cool> (>= 2) + Recommends: <cooler> (<< 5)' aptcache depends foo -o APT::Cache::ShowVersion=1 --implicit +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar>' aptcache depends foo --no-recommends +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar>' aptcache depends foo --no-recommends --implicit +testsuccessequal 'foo + Depends: bar' aptcache depends foo --important --implicit +testsuccessequal 'foo + Conflicts: <foobar>' aptcache depends foo --important --no-depends --conflicts +testsuccessequal 'foo + Conflicts: <foobar>' aptcache depends foo --important --no-depends --conflicts --implicit +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + |Recommends: <cool> + Recommends: <cooler> +bar + Depends: bar + Breaks: foo + Replaces: foo +<foobar> +<cool> +<cooler>' aptcache depends foo --recurse +testsuccessequal 'foo + Depends: bar + Conflicts: <foobar> + |Recommends: <cool> + Recommends: <cooler> +bar + Depends: bar + Breaks: foo + Replaces: foo + Breaks: <foo:i386> + Replaces: <foo:i386> +<foobar> +<cool> +<cooler> +<foo:i386>' aptcache depends foo --recurse --implicit +testsuccessequal 'foo + Depends: bar +bar + Depends: bar + Replaces: foo' aptcache depends foo --recurse --important --replaces +testsuccessequal 'foo + Depends: bar +bar + Depends: bar + Replaces: foo + Replaces: <foo:i386> +<foo:i386>' aptcache depends foo --recurse --important --replaces --implicit +testsuccessequal 'bar + Depends: bar + Breaks: foo + Replaces: foo' aptcache depends bar +testsuccessequal 'bar + Depends: bar + Breaks: foo + Replaces: foo + Breaks: <foo:i386> + Replaces: <foo:i386>' aptcache depends bar --implicit + +testsuccessequal 'specific + Depends: <bar:i386> + Depends: <specific:amd64> + specific + Breaks: <foo:amd64> + Replaces: <foo:i386>' aptcache depends specific +testsuccessequal 'specific + Depends: <bar:i386> + Depends: <specific:amd64> + specific + Breaks: <foo:amd64> + Replaces: <foo:i386>' aptcache depends specific --implicit + +## rdepends + +# Note that specific does not appear in this list as it doesn't depend on foo, +# but on an arch-specific foo! +testsuccessequal 'foo +Reverse Depends: + bar + bar' aptcache rdepends foo +testsuccessequal 'foo +Reverse Depends: + Breaks: bar + Replaces: bar' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 +testsuccessequal 'foo +Reverse Depends: + Breaks: bar (<< 1) + Replaces: bar (<< 1)' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 -o APT::Cache::ShowVersion=1 +testsuccessequal 'foo +Reverse Depends: + Breaks: bar (<< 1)' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 -o APT::Cache::ShowVersion=1 --important --breaks diff --git a/test/integration/test-apt-cache-remapping b/test/integration/test-apt-cache-remapping new file mode 100755 index 0000000..31a406c --- /dev/null +++ b/test/integration/test-apt-cache-remapping @@ -0,0 +1,47 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'foo' 'amd64' '1' + +# the default is 1MB – too much for our simple tests +echo 'APT::Cache-Grow "1000";' > rootdir/etc/apt/apt.conf.d/limit-cachegrow.conf + +# experiment with cache remapping +rm -f rootdir/var/cache/apt/*.bin +testsuccess apt install ./incoming/foo_1_amd64.deb -s +msgtest 'Cache files are generated in tests' +if [ ! -e rootdir/var/cache/apt/srcpkgcache.bin -o ! -e rootdir/var/cache/apt/pkgcache.bin ]; then + msgfail 'files do not exist' + ls -l rootdir/var/cache/apt/*.bin + exit 1 +else + msgpass +fi + +SLSIZE="$(stat -c '%s' rootdir/var/cache/apt/srcpkgcache.bin)" +STSIZE="$(stat -c '%s' rootdir/var/cache/apt/pkgcache.bin)" +rm -f rootdir/var/cache/apt/*.bin +testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$SLSIZE" -o APT::Cache-Grow=0 +testfailure test -e rootdir/var/cache/apt/pkgcache.bin +rm -f rootdir/var/cache/apt/*.bin +testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$SLSIZE" -o APT::Cache-Limit="$SLSIZE" +testfailure test -e rootdir/var/cache/apt/pkgcache.bin +rm -f rootdir/var/cache/apt/*.bin +testsuccess apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$SLSIZE" +testsuccess test -e rootdir/var/cache/apt/srcpkgcache.bin -a -e rootdir/var/cache/apt/pkgcache.bin + +rm -f rootdir/var/cache/apt/*.bin +testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" -o APT::Cache-Grow=0 +rm -f rootdir/var/cache/apt/*.bin +testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" -o APT::Cache-Limit="$SLSIZE" +rm -f rootdir/var/cache/apt/*.bin +testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" -o APT::Cache-Limit="$STSIZE" +rm -f rootdir/var/cache/apt/*.bin +testsuccess apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" +testsuccess test -e rootdir/var/cache/apt/srcpkgcache.bin -a -e rootdir/var/cache/apt/pkgcache.bin diff --git a/test/integration/test-apt-cache-showsrc b/test/integration/test-apt-cache-showsrc new file mode 100755 index 0000000..88de077 --- /dev/null +++ b/test/integration/test-apt-cache-showsrc @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +# we have a foo source package +insertsource 'unstable' 'foo' 'all' '1.0' '' 'foo-binary' + +# and a similar one that builds a foo binary package +insertsource 'unstable' 'unreleated' 'all' '1.0' '' 'foo' + +# just here to workaround the need for a authenticated package +insertpackage 'unstable' 'workaround' 'all' '1.0' + +setupaptarchive + +# by default apt-cache showsrc will look into "binary" and "source" names +# and show all matches +aptcache showsrc foo > output.txt +testsuccess grep "Package: foo" output.txt +testsuccess grep "Package: unreleated" output.txt + +# by default apt-cache showsrc will look into "binary" and "source" names +# and show all matches +aptcache showsrc --only-source foo > output.txt +testsuccess grep "Package: foo" output.txt +testfailure grep "Package: unreleated" output.txt diff --git a/test/integration/test-apt-cdrom b/test/integration/test-apt-cdrom new file mode 100755 index 0000000..01680c4 --- /dev/null +++ b/test/integration/test-apt-cdrom @@ -0,0 +1,158 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'testing' 'amd64,i386' '0.8.15' 'stable' +setupaptarchive --no-update + +changetocdrom 'Debian APT Testdisk 0.8.15' + +# -de is not in the Release file, but picked up anyway for compatibility +cd rootdir/media/cdrom-unmounted/dists/stable/main/i18n +chmod +w . +sed -e '/^Description-en:/ d' -e '/^ / d' -e '/^$/ d' Translation-en > Translation-de +echo 'Description-de: automatisch generiertes Testpaket testing=0.8.15/stable + Diese Pakete sind nur für das testen von APT gedacht, + sie erfüllen keinen Zweck auf einem normalen System… +' >> Translation-de +compressfile Translation-de +rm -f Translation-en Translation-de +chmod -R 555 . +cd - > /dev/null + +aptcdromlog() { + rm -f rootdir/tmp/apt-cdrom.log + test ! -e rootdir/media/cdrom || echo "CD-ROM is mounted, but shouldn't be!" + test -e rootdir/media/cdrom-unmounted || echo "Unmounted CD-ROM doesn't exist, but it should!" + aptcdrom "$@" -o quiet=1 >rootdir/tmp/apt-cdrom.log 2>&1 </dev/null + sed -e '/gpgv\?:\s*Signature made/ d' \ + -e '/gpgv\?:\s*Good signature/ d' \ + -e '/gpgv\?:\s*using RSA key/ d' \ + -e '/gpgv\?:\s*issuer/ d' \ + -e '/^Identifying/ d' \ + -e '/Reading / d' rootdir/tmp/apt-cdrom.log + test ! -e rootdir/media/cdrom || echo "CD-ROM is mounted, but shouldn't be!" + test -e rootdir/media/cdrom-unmounted || echo "Unmounted CD-ROM doesn't exist, but it should!" +} +aptautotest_aptcdromlog_add() { aptautotest_aptget_update "$@"; } + +CDROM_PRE="Using CD-ROM mount point $(readlink -f ./rootdir/media)/cdrom/ +Unmounting CD-ROM... +Waiting for disc... +Please insert a Disc in the drive and press [Enter] +Mounting CD-ROM... +Scanning disc for index files..." +CDROM_POST="This disc is called: +'Debian APT Testdisk 0.8.15' +Writing new source list +Source list entries for this disc are: +deb cdrom:[Debian APT Testdisk 0.8.15]/ stable main +deb-src cdrom:[Debian APT Testdisk 0.8.15]/ stable main +Unmounting CD-ROM... +Repeat this process for the rest of the CDs in your set." + +testsuccessequal "$CDROM_PRE +Found 3 package indexes, 1 source indexes, 1 translation indexes and 1 signatures +Found label 'Debian APT Testdisk 0.8.15' +$CDROM_POST" aptcdromlog add + +testsuccessequal "Using CD-ROM mount point $(readlink -f ./rootdir/media)/cdrom/ +Mounting CD-ROM... +Stored label: Debian APT Testdisk 0.8.15 +Unmounting CD-ROM..." aptcdromlog ident + +# apt-setup uses these commands (expect the tr in the id) to find id and label +ident="$(LC_ALL=C aptcdrom ident 2>&1 )" +CD_ID="$(echo "$ident" | grep "^Identifying" | head -n1 | cut -d" " -f2 | tr --delete '[]')" +CD_LABEL="$(echo "$ident" | grep "^Stored label:" | head -n1 | sed "s/^[^:]*: //")" +testfileequal rootdir/var/lib/apt/cdroms.list "CD::${CD_ID} \"${CD_LABEL}\"; +CD::${CD_ID}::Label \"${CD_LABEL}\";" + +testcdromusage() { + touch rootdir/var/lib/apt/extended_states + + testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following NEW packages will be installed: + testing +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst testing (0.8.15 stable [amd64]) +Conf testing (0.8.15 stable [amd64])' aptget install testing -s + + testdpkgnotinstalled testing + testsuccess aptget install testing -y + testdpkginstalled testing + testsuccess aptget purge testing -y + testdpkgnotinstalled testing + + testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following NEW packages will be installed: + testing:i386 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst testing:i386 (0.8.15 stable [i386]) +Conf testing:i386 (0.8.15 stable [i386])' aptget install testing:i386 -s + + testdpkgnotinstalled testing:i386 + testsuccess aptget install testing:i386 -y + testdpkginstalled testing:i386 + testsuccess aptget purge testing:i386 -y + testdpkgnotinstalled testing:i386 + + cd downloaded + rm -f testing_0.8.15_amd64.deb + testsuccess aptget download testing + testsuccess test -s testing_0.8.15_amd64.deb + rm -f testing_0.8.15_amd64.deb + + rm -f testing_0.8.15.dsc + testsuccess aptget source testing --dsc-only + testsuccess test -s testing_0.8.15.dsc + rm -f testing_0.8.15.dsc + cd - >/dev/null +} +testcdromusage + +# check Idempotence of apt-cdrom (and disabling of Translation dropping) +testsuccessequal "$CDROM_PRE +Found 3 package indexes, 1 source indexes, 2 translation indexes and 1 signatures +$CDROM_POST" aptcdromlog add -o APT::CDROM::DropTranslation=0 + +# take Translations from previous runs as needed +testsuccessequal "$CDROM_PRE +Found 3 package indexes, 1 source indexes, 2 translation indexes and 1 signatures +$CDROM_POST" aptcdromlog add +msgtest 'Test for the german description translation of' 'testing' +aptcache show testing -o Acquire::Languages=de | grep -q '^Description-de: ' && msgpass || msgfail +rm -rf rootdir/var/lib/apt/lists +testsuccessequal "$CDROM_PRE +Found 3 package indexes, 1 source indexes, 1 translation indexes and 1 signatures +$CDROM_POST" aptcdromlog add +msgtest 'Test for the english description translation of' 'testing' +aptcache show testing -o Acquire::Languages=en | grep -q '^Description-en: ' && msgpass || msgfail + +# ensure cdrom method isn't trying to mount the cdrom +mv rootdir/media/cdrom-unmounted rootdir/media/cdrom-ejected +msgmsg "ensure an update doesn't mess with cdrom sources" +testsuccess aptget update +testfileequal rootdir/tmp/testsuccess.output 'Hit:1 cdrom://Debian APT Testdisk 0.8.15 stable InRelease +Reading package lists...' +mv rootdir/media/cdrom-ejected rootdir/media/cdrom-unmounted +testcdromusage + +msgmsg 'and again to check that it withstands the temptation even if it could mount' +testsuccess aptget update +testfileequal rootdir/tmp/testsuccess.output 'Hit:1 cdrom://Debian APT Testdisk 0.8.15 stable InRelease +Reading package lists...' +testcdromusage + +msgmsg 'Check that nothing touched our' 'CD-ROM' +for file in $(find rootdir/media/cdrom-unmounted/dists); do + testfilestats "$file" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:555" +done diff --git a/test/integration/test-apt-cli-json-hooks b/test/integration/test-apt-cli-json-hooks new file mode 100755 index 0000000..80922e0 --- /dev/null +++ b/test/integration/test-apt-cli-json-hooks @@ -0,0 +1,209 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +DESCR='Some description that has a unusual word xxyyzz and aabbcc and a UPPERCASE' +DESCR2='Some other description with the unusual aabbcc only' +insertpackage 'unstable' 'foo' 'all' '1.0' '' '' "$DESCR + Long description of stuff and such, with lines + . + and paragraphs and everything." +insertpackage 'testing' 'bar' 'i386' '2.0' '' '' "$DESCR2" + +setupaptarchive + +APTARCHIVE="$(readlink -f ./aptarchive)" + +cat >> json-hook.sh << EOF +#!/bin/bash +while true; do + read request <&\$APT_HOOK_SOCKET + read empty <&\$APT_HOOK_SOCKET + + if echo "\$request" | grep -q ".hello"; then + echo "HOOK: HELLO" + printf '{"jsonrpc": "2.0", "result": {"version": "0.1"}, "id": 0}\n\n' >&\$APT_HOOK_SOCKET + fi + + if echo "\$request" | grep -q ".bye"; then + echo "HOOK: BYE" + exit 0; + fi + + echo HOOK: request \$request + echo HOOK: empty \$empty +done +EOF + +chmod +x json-hook.sh + +HOOK="$(readlink -f ./json-hook.sh)" + +# Setup all hooks +cat >> rootdir/etc/apt/apt.conf.d/99-json-hooks << EOF + AptCli::Hooks::Install:: "$HOOK"; + AptCli::Hooks::Search:: "$HOOK"; +EOF + + +############################# Success search ####################### +testsuccessequal 'HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.search.pre","params":{"command":"search","search-terms":["foo"],"unknown-packages":[],"packages":[]}} +HOOK: empty +HOOK: BYE +Sorting... +Full Text Search... +foo/unstable 1.0 all + Some description that has a unusual word xxyyzz and aabbcc and a UPPERCASE + +HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.search.post","params":{"command":"search","search-terms":["foo"],"unknown-packages":[],"packages":[]}} +HOOK: empty +HOOK: BYE' apt search foo + +############################# Failed search ####################### +testsuccessequal 'HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.search.pre","params":{"command":"search","search-terms":["foox"],"unknown-packages":[],"packages":[]}} +HOOK: empty +HOOK: BYE +Sorting... +Full Text Search... +HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.search.fail","params":{"command":"search","search-terms":["foox"],"unknown-packages":[],"packages":[]}} +HOOK: empty +HOOK: BYE' apt search foox + + +############################# Failed install ####################### + +testfailureequal 'Reading package lists... +Building dependency tree... +HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.install.fail","params":{"command":"install","search-terms":["foxxx"],"unknown-packages":["foxxx"],"packages":[]}} +HOOK: empty +HOOK: BYE +E: Unable to locate package foxxx' apt install foxxx + +############################# Success install ####################### + +testsuccessequal 'Reading package lists... +Building dependency tree... +HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.install.pre-prompt","params":{"command":"install","search-terms":["foo"],"unknown-packages":[],"packages":[{"id":1,"name":"foo","architecture":"i386","mode":"install","automatic":false,"versions":{"candidate":{"id":1,"version":"1.0","architecture":"all","pin":500},"install":{"id":1,"version":"1.0","architecture":"all","pin":500}}}]}} +HOOK: empty +HOOK: BYE +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [all]) +Conf foo (1.0 unstable [all]) +HOOK: HELLO +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.hello","id":0,"params":{"versions":["0.1"]}} +HOOK: empty +HOOK: request {"jsonrpc":"2.0","method":"org.debian.apt.hooks.install.post","params":{"command":"install","search-terms":["foo"],"unknown-packages":[],"packages":[{"id":1,"name":"foo","architecture":"i386","mode":"install","automatic":false,"versions":{"candidate":{"id":1,"version":"1.0","architecture":"all","pin":500},"install":{"id":1,"version":"1.0","architecture":"all","pin":500}}}]}} +HOOK: empty +HOOK: BYE' apt install foo -s + +################## Error in hello response ######################### + +cat > json-hook.sh << EOF +#!/bin/bash +exec 2>/dev/null +trap '' SIGPIPE +while true; do + read request <&\$APT_HOOK_SOCKET + read empty <&\$APT_HOOK_SOCKET + + if echo "\$request" | grep -q ".hello"; then + printf '{"jsonrpc": "2.0", "error": {"version": "0.1"}, "id": 0}\n\n' >&\$APT_HOOK_SOCKET + break + fi +done +exit 0 +EOF + + +testfailureequal 'Reading package lists... +Building dependency tree... +E: Hook '$HOOK' reported an error during hello: {"jsonrpc": "2.0", "error": {"version": "0.1"}, "id": 0} +E: Hook '$HOOK' reported an error during hello: {"jsonrpc": "2.0", "error": {"version": "0.1"}, "id": 0}' apt install foo -s + +################## Missing separator line ######################### +cat > json-hook.sh << EOF +#!/bin/bash +exec 2>/dev/null +trap '' SIGPIPE +while true; do + read request <&\$APT_HOOK_SOCKET + read empty <&\$APT_HOOK_SOCKET + + if echo "\$request" | grep -q ".hello"; then + printf '{"jsonrpc": "2.0", "result": {"version": "0.1"}, "id": 0}\n' >&\$APT_HOOK_SOCKET + break + fi +done +exit 0 +EOF + + +testfailureequal 'Reading package lists... +Building dependency tree... +E: Could not read message separator line after handshake from '$HOOK': end of file +E: Could not read message separator line after handshake from '$HOOK': end of file' apt install foo -s + +################## Wrong separator line ######################### +cat > json-hook.sh << EOF +#!/bin/bash +exec 2>/dev/null +trap '' SIGPIPE +while true; do + read request <&\$APT_HOOK_SOCKET + read empty <&\$APT_HOOK_SOCKET + + if echo "\$request" | grep -q ".hello"; then + printf '{"jsonrpc": "2.0", "result": {"version": "0.1"}, "id": 0}\nXX' >&\$APT_HOOK_SOCKET + break + fi +done +exit 0 +EOF + + +testfailureequal 'Reading package lists... +Building dependency tree... +E: Expected empty line after handshake from '$HOOK', received XX +E: Expected empty line after handshake from '$HOOK', received XX' apt install foo -s + +##################### Removed hook || true ############################ +cat > rootdir/etc/apt/apt.conf.d/99-json-hooks << EOF + AptCli::Hooks::Install:: "true"; + AptCli::Hooks::Search:: "true"; +EOF + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [all]) +Conf foo (1.0 unstable [all])' apt install foo -s + + + diff --git a/test/integration/test-apt-cli-list b/test/integration/test-apt-cli-list new file mode 100755 index 0000000..3a9ca2c --- /dev/null +++ b/test/integration/test-apt-cli-list @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' 'armel' + +insertpackage 'unstable' 'foo' 'all' '1.0' +insertinstalledpackage 'bar' 'i386' '1.0' + +insertinstalledpackage 'foobar' 'i386' '1.0' +insertpackage 'unstable' 'foobar' 'i386' '2.0' + +insertinstalledpackage 'baz' 'all' '0.1' +insertpackage 'testing' 'baz' 'all' '1.0' +insertpackage 'unstable' 'baz' 'all' '2.0' + +insertinstalledpackage 'foreign' 'armel' '1.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'foreign' 'i386,armel' '2.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'lib' 'i386,armel' '2.0' 'Multi-Arch: same' + +setupaptarchive + +testsuccessequal "Listing... +bar/now 1.0 i386 [installed,local] +baz/unstable 2.0 all [upgradable from: 0.1] +dpkg/now 1.16.2+fake all [installed,local] +foo/unstable 1.0 all +foobar/unstable 2.0 i386 [upgradable from: 1.0] +foreign/unstable 2.0 armel [upgradable from: 1.0] +foreign/unstable 2.0 i386 +lib/unstable 2.0 armel +lib/unstable 2.0 i386" apt list + +testsuccessequal "Listing... +foo/unstable 1.0 all +foobar/unstable 2.0 i386 [upgradable from: 1.0]" apt list "foo*" + +testsuccessequal "Listing... +baz/unstable 2.0 all [upgradable from: 0.1] +foobar/unstable 2.0 i386 [upgradable from: 1.0] +foreign/unstable 2.0 armel [upgradable from: 1.0]" apt list --upgradable + +# FIXME: hm, hm - does it make sense to have this different? shouldn't +# we use "installed,upgradable" consistently? +testsuccessequal "Listing... +bar/now 1.0 i386 [installed,local] +baz/now 0.1 all [installed,upgradable to: 2.0] +dpkg/now 1.16.2+fake all [installed,local] +foobar/now 1.0 i386 [installed,upgradable to: 2.0] +foreign/now 1.0 armel [installed,upgradable to: 2.0]" apt list --installed + +testsuccessequal "Listing... +bar/now 1.0 i386 [installed,local] + +foobar/unstable 2.0 i386 [upgradable from: 1.0] +foobar/now 1.0 i386 [installed,upgradable to: 2.0] +" apt list bar foobar --all-versions + +testsuccessequal "Listing... +bar/now 1.0 i386 [installed,local] + an autogenerated dummy bar=1.0/installed +" apt list bar --verbose + +# test for dpkg ^rc state +insertinstalledpackage 'conf-only' 'i386' '1.0' '' '' 'deinstall ok config-files' +testsuccessequal "Listing... +conf-only/now 1.0 i386 [residual-config]" apt list conf-only + +# ensure that the users learns about multiple versions too +testsuccessequal "Listing... +baz/unstable 2.0 all [upgradable from: 0.1] +N: There are 2 additional versions. Please use the '-a' switch to see them." apt list baz -o quiet=0 +testsuccessequal 'Listing... +baz/unstable 2.0 all [upgradable from: 0.1] +baz/testing 1.0 all +baz/now 0.1 all [installed,upgradable to: 2.0] +' apt list baz -o quiet=0 -a + +# test format strings for machine parseable output +testsuccessequal 'bar - 1.0 - 1.0 +baz - 0.1 - 2.0' apt list -qq bar baz -o APT::Cmd::use-format=true -o APT::Cmd::format="\${Package} - \${installed:Version} - \${candidate:Version}" + + +insertinstalledpackage 'lib' 'i386,armel' '1.0' 'Multi-Arch: same' +testsuccessequal 'Listing... +baz/unstable 2.0 all [upgradable from: 0.1] +foobar/unstable 2.0 i386 [upgradable from: 1.0] +foreign/unstable 2.0 armel [upgradable from: 1.0] +lib/unstable 2.0 armel [upgradable from: 1.0] +lib/unstable 2.0 i386 [upgradable from: 1.0]' apt list --upgradeable diff --git a/test/integration/test-apt-cli-search b/test/integration/test-apt-cli-search new file mode 100755 index 0000000..6457ece --- /dev/null +++ b/test/integration/test-apt-cli-search @@ -0,0 +1,79 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +DESCR='Some description that has a unusual word xxyyzz and aabbcc and a UPPERCASE' +DESCR2='Some other description with the unusual aabbcc only' +insertpackage 'unstable' 'foo' 'all' '1.0' '' '' "$DESCR + Long description of stuff and such, with lines + . + and paragraphs and everything." +insertpackage 'testing' 'bar' 'i386' '2.0' '' '' "$DESCR2" + +setupaptarchive + +APTARCHIVE="$(readlink -f ./aptarchive)" + +testfailureequal 'E: You must give at least one search pattern' aptcache search +testfailureequal 'E: You must give at least one search pattern' apt search + +# with OP progress +testsuccessequal "Sorting... +Full Text Search... +foo/unstable 1.0 all + $DESCR +" apt search xxyyzz + +# without op progress +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq xxyyzz +testempty apt search -qq --names-only xxyyzz + +# search name +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq foo +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq --names-only foo + +# search with multiple words is a AND search +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq aabbcc xxyyzz +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq 'a+b+c+' 'i*xxy{0,2}zz' + +# search is not case-sensitive by default +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq uppercase +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq 'up[pP]erc[Aa]se' + +# search is done in the long description +testsuccessequal "foo/unstable 1.0 all + $DESCR +" apt search -qq 'long description' +testsuccessequal "foo/unstable 1.0 all + $DESCR + Long description of stuff and such, with lines + . + and paragraphs and everything. +" apt search --full -qq 'long description' + +# output is sorted and search word finds both package +testsuccessequal "bar/testing 2.0 i386 + $DESCR2 + +foo/unstable 1.0 all + $DESCR +" apt search -qq aabbcc diff --git a/test/integration/test-apt-cli-show b/test/integration/test-apt-cli-show new file mode 100755 index 0000000..a37dbd8 --- /dev/null +++ b/test/integration/test-apt-cli-show @@ -0,0 +1,111 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' 'amd64' + +generatelotsofnames() { + for i in $(seq 0 10000); do + printf ', this-is-a-long-pkg-name-%s (= 0.a.long.version)' "$i" + done +} + +DESCR='Some description + That has multiple lines' +insertpackage 'unstable' 'foo' 'all' '1.0' '' '' "$DESCR" +insertpackage 'unstable' 'bar' 'i386,amd64' '1' '' '' "$DESCR" +insertpackage 'unstable' 'big' 'i386,amd64' '1' 'Installed-Size: 4129421' '' "$DESCR" +insertpackage 'unstable' 'large' 'all' '1' "Provides: pkga$(generatelotsofnames)" '' "$DESCR" +insertpackage 'unstable' 'large2' 'all' '1' "Provides: foobar, pkga$(generatelotsofnames)" '' "$DESCR" +insertinstalledpackage 'foo' 'all' '1.0' + +setupaptarchive + +APTARCHIVE=$(readlink -f ./aptarchive) + +# note that we do not display Description-md5 with the "apt" cmd +# and also show some additional fields that are calculated +testsuccessequal "Package: foo +Version: 1.0 +Priority: optional +Section: other +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 43.0 kB +Download-Size: unknown +APT-Manual-Installed: yes +APT-Sources: file:$APTARCHIVE unstable/main all Packages +Description: Some description + That has multiple lines +" apt show foo +testsuccessequal "Package: bar +Version: 1 +Priority: optional +Section: other +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 43.0 kB +Download-Size: unknown +APT-Sources: file:$APTARCHIVE unstable/main i386 Packages +Description: Some description + That has multiple lines +" apt show bar +testsuccessequal "Package: bar:amd64 +Version: 1 +Priority: optional +Section: other +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 43.0 kB +Download-Size: unknown +APT-Sources: file:$APTARCHIVE unstable/main amd64 Packages +Description: Some description + That has multiple lines +" apt show bar:amd64 +testsuccessequal "Package: big:amd64 +Version: 1 +Priority: optional +Section: other +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 4229 MB +Download-Size: unknown +APT-Sources: file:$APTARCHIVE unstable/main amd64 Packages +Description: Some description + That has multiple lines +" apt show big:amd64 + +testsuccessequal "Package: large +Version: 1 +Priority: optional +Section: other +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 43.0 kB +Provides: pkga$(generatelotsofnames) +Download-Size: unknown +APT-Sources: file:$APTARCHIVE unstable/main all Packages +Description: Some description + That has multiple lines +" apt show large +testsuccessequal "Package: large2 +Version: 1 +Priority: optional +Section: other +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 43.0 kB +Provides: foobar, pkga$(generatelotsofnames) +Download-Size: unknown +APT-Sources: file:$APTARCHIVE unstable/main all Packages +Description: Some description + That has multiple lines +" apt show large2 + +# this is the default, but disabled by the testcases +testsuccess apt show foo -o Apt::Cmd::Disable-Script-Warning=0 +cp rootdir/tmp/testsuccess.output aptshow.output +testsuccess grep '^WARNING: ' aptshow.output + +if [ "$(id -u)" != '0' ]; then + testsuccess apt install foo -s -o APT::Get::Show-User-Simulation-Note=1 + cp rootdir/tmp/testsuccess.output aptshow.output + testsuccess grep '^NOTE: ' aptshow.output +fi diff --git a/test/integration/test-apt-cli-update b/test/integration/test-apt-cli-update new file mode 100755 index 0000000..cc8d051 --- /dev/null +++ b/test/integration/test-apt-cli-update @@ -0,0 +1,23 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'foo' 'all' '2.0' +cp rootdir/var/lib/dpkg/status dpkg.status +insertinstalledpackage 'foo' 'all' '1.0' + +setupaptarchive --no-update + +testfailuremsg 'E: The update command takes no arguments' apt update arguments + +testempty apt update -qq -o pkgCacheFile::Generate=false +testsuccessequal "1 package can be upgraded. Run 'apt list --upgradable' to see it." apt update -qq + +cp dpkg.status rootdir/var/lib/dpkg/status +insertinstalledpackage 'foo' 'all' '2.0' +testsuccessequal 'All packages are up to date.' apt update -qq diff --git a/test/integration/test-apt-cli-upgrade b/test/integration/test-apt-cli-upgrade new file mode 100755 index 0000000..705c163 --- /dev/null +++ b/test/integration/test-apt-cli-upgrade @@ -0,0 +1,32 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'foo' 'all' '2.0' 'Depends: foo-new-dependency' +insertpackage 'unstable' 'foo-new-dependency' 'all' '2.0' +insertinstalledpackage 'foo' 'all' '1.0' + +setupaptarchive + +APTARCHIVE="$(readlink -f ./aptarchive)" + +# default is to allow new dependencies +testsuccessequal "The following NEW packages will be installed: + foo-new-dependency +The following packages will be upgraded: + foo +1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo-new-dependency (2.0 unstable [all]) +Inst foo [1.0] (2.0 unstable [all]) +Conf foo-new-dependency (2.0 unstable [all]) +Conf foo (2.0 unstable [all])" apt upgrade -qq -s + +# ensure the 'old' way works as well +testsuccessequal "The following packages have been kept back: + foo +0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded." apt upgrade -qq -s --no-new-pkgs diff --git a/test/integration/test-apt-config b/test/integration/test-apt-config new file mode 100755 index 0000000..12df63d --- /dev/null +++ b/test/integration/test-apt-config @@ -0,0 +1,50 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +testsuccess aptconfig dump +testsuccessequal 'APT::Architecture "amd64";' aptconfig dump APT::Architecture +testempty aptconfig dump config::which::does::not::exist + +testsuccessequal 'APT::Architectures ""; +APT::Architectures:: "amd64";' aptconfig dump APT::Architectures +testsuccessequal 'APT::Architectures:: "amd64";' aptconfig dump --no-empty APT::Architectures +testsuccessequal 'amd64' aptconfig dump --no-empty --format='%v%n' APT::Architectures + +testempty aptconfig shell +testfailureequal 'E: Arguments not in pairs' aptconfig shell APT::Architecture +testempty aptconfig shell APT::Architecture ARCH # incorrect order +testsuccessequal "ARCH='amd64'" aptconfig shell ARCH APT::Architecture + +ROOTDIR="$(readlink -f rootdir)" +testsuccessequal "CONFIG='apt.conf'" aptconfig shell CONFIG Dir::Etc::main +testsuccessequal "CONFIG='${ROOTDIR}/etc/apt/apt.conf'" aptconfig shell CONFIG Dir::Etc::main/f +testsuccessequal "CONFIG='etc/apt'" aptconfig shell CONFIG Dir::Etc +testsuccessequal "CONFIG='${ROOTDIR}/etc/apt/'" aptconfig shell CONFIG Dir::Etc/ # old style +testsuccessequal "CONFIG='${ROOTDIR}/etc/apt/'" aptconfig shell CONFIG Dir::Etc/d + +testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles +export DEB_BUILD_PROFILES='nodoc stage1' +testsuccessequal 'nodoc +stage1' aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles +unset DEB_BUILD_PROFILES +testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles + +cat > spaces.conf <<EOF +Spaces::Test::"Foo Bar" "1 1"; +Spaces::Test2::" Bar Baz " "B B" { + A%20B "C C"; + "B C" "A A"; +}; +EOF +testsuccessequal 'Spaces::Test ""; +Spaces::Test::Foo%20Bar "1 1"; +Spaces::Test2 ""; +Spaces::Test2::%20Bar%20Baz%20 "B B"; +Spaces::Test2::%20Bar%20Baz%20::A%20B "C C"; +Spaces::Test2::%20Bar%20Baz%20::B%20C "A A";' aptconfig dump -c spaces.conf Spaces::Test Spaces::Test2 diff --git a/test/integration/test-apt-edit-sources b/test/integration/test-apt-edit-sources new file mode 100755 index 0000000..58742e9 --- /dev/null +++ b/test/integration/test-apt-edit-sources @@ -0,0 +1,39 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +echo 'Dir::Bin::Editor "cat";' > rootdir/etc/apt/apt.conf.d/editor.conf + +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list.d/rocks.list +testsuccessequal "$(cat rootdir/etc/apt/sources.list.d/rocks.list)" apt edit-sources rocks.list + +cat >editor.sh <<EOF +#!/bin/sh +umask 077 +touch "\$@" +EOF +chmod +x ./editor.sh +echo 'Dir::Bin::Editor "./editor.sh";' > rootdir/etc/apt/apt.conf.d/editor.conf +testsuccess apt edit-sources blub.list +testfailure test -e 'rootdir/etc/apt/sources.list.d/blub.list' + +cat >editor.sh <<EOF +#!/bin/sh +umask 077 +echo '#comment' > "\$1" +EOF +testsuccess apt edit-sources blub.list +testfilestats 'rootdir/etc/apt/sources.list.d/blub.list' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" + +echo 'Dir::Bin::Editor "cat";' > rootdir/etc/apt/apt.conf.d/editor.conf +echo 'blub' > rootdir/etc/apt/sources.list.d/blub.list +testfailure apt edit-sources blub.list --assume-no + +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list.d/blub.list +touch -m -d 'now + 1 hour' rootdir/etc/apt/sources.list.d/blub.list +testwarning apt edit-sources blub.list --assume-no diff --git a/test/integration/test-apt-extracttemplates b/test/integration/test-apt-extracttemplates new file mode 100755 index 0000000..a47257c --- /dev/null +++ b/test/integration/test-apt-extracttemplates @@ -0,0 +1,78 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +# apt-extracttemplates needs this +insertinstalledpackage 'pkg-with-template' 'amd64' '1.0' + +# build a simple package that contains a config and a template +mkdir -p DEBIAN +CONFIG_STR="#!/bin/sh +random shell stuff +" +echo "$CONFIG_STR" > DEBIAN/config +chmod 755 DEBIAN/config + +testrun() { + local TEMPLATE_STR='Template: foo/bar +Type: string +Description: Some bar var +' + echo "$TEMPLATE_STR" > DEBIAN/templates + buildsimplenativepackage "$1" 'amd64' '0.8.15' 'stable' "$2" 'pkg with template' '' '' './DEBIAN' + + cp dpkg.status rootdir/var/lib/dpkg/status + insertinstalledpackage 'debconf' 'amd64' '3' + + # ensure we get the right stuff out of the file + rm -rf extracttemplates-out rootdir/var/cache/apt + mkdir extracttemplates-out + testsuccess aptextracttemplates -t ./extracttemplates-out incoming/${1}*.deb + OUT='rootdir/tmp/testsuccess.output' + testequal "$1" cut -f1 -d' ' $OUT + if [ -n "$2" ]; then + testequal '' cut -s -f2 -d' ' $OUT + else + testequal '1.0' cut -f2 -d' ' $OUT + fi + TEMPLATE=$(cut -f3 -d' ' $OUT) + testfileequal "$TEMPLATE" "$TEMPLATE_STR" + CONFIG=$(cut -f4 -d' ' $OUT) + testfileequal "$CONFIG" "$CONFIG_STR" + msgtest 'No extra files or directories in extraction directory' + if [ "$(find ./extracttemplates-out | wc -l)" = '3' ]; then + msgpass + else + msgfail + ls -l ./extracttemplates-out + fi + + # ensure that the format of the output string has the right number of dots + for s in "$CONFIG" "$TEMPLATE"; do + NR_DOTS=$(basename "$s" | tr -c -d '.') + testequal '..' echo $NR_DOTS + done + + if [ -n "$2" ]; then + rm -rf extracttemplates-out rootdir/var/cache/apt + mkdir extracttemplates-out + cp dpkg.status rootdir/var/lib/dpkg/status + insertinstalledpackage 'debconf' 'amd64' '1' + testempty aptextracttemplates -t ./extracttemplates-out incoming/${1}*.deb + fi +} + +cp rootdir/var/lib/dpkg/status dpkg.status +testrun 'pkg-with-template' '' +testrun 'pkg-with-template-depends' 'Depends: debconf (>= 2)' +testrun 'pkg-with-template-predepends' 'Pre-Depends: debconf (>= 2)' + +# test with no debconf installed +cp dpkg.status rootdir/var/lib/dpkg/status +testfailure aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template-depends*.deb +testfileequal 'rootdir/tmp/testfailure.output' 'E: Cannot get debconf version. Is debconf installed?' diff --git a/test/integration/test-apt-ftparchive b/test/integration/test-apt-ftparchive new file mode 100755 index 0000000..378b059 --- /dev/null +++ b/test/integration/test-apt-ftparchive @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment + +buildsimplenativepackage 'baz' 'all' '1' +buildsimplenativepackage 'foo' 'all' '1' +buildsimplenativepackage 'bar' 'all' '2' +buildsimplenativepackage 'bar' 'all' '1' + +EXPECT_PKG='Package: bar +Version: 1 +Package: bar +Version: 2 +Package: baz +Version: 1 +Package: foo +Version: 1' +EXPECT_SRC="$EXPECT_PKG" + +linkfiles() { + ln -s "../incoming/${2}.dsc" "${1}/${2}.dsc" + ln -s "../incoming/${2}.tar.xz" "${1}/${2}.tar.xz" + ln -s "../incoming/${2}_all.deb" "${1}/${2}_all.deb" +} +genoptions() { + echo 'baz_1' + echo 'foo_1' + echo 'bar_2' + echo 'bar_1' +} +gencombos() { + for a in $(genoptions); do + for b in $(genoptions); do + if [ "$a" = "$b" ]; then continue; fi + for c in $(genoptions); do + if [ "$a" = "$c" -o "$b" = "$c" ]; then continue; fi + for d in $(genoptions); do + if [ "$a" = "$d" -o "$b" = "$d" -o "$c" = "$d" ]; then continue; fi + echo "${a};${b};${c};${d}" + done + done + done + done +} +for combo in $(gencombos); do + msgmsg 'Running apt-ftparchive in configuration' "$combo" + incomedir="incoming${combo}" + mkdir "$incomedir" + for i in $(echo "$combo" | tr ';' '\n'); do + linkfiles "$incomedir" "$i" + done + + testsuccess aptftparchive packages "$incomedir" + cp rootdir/tmp/testsuccess.output aptarchive/Packages + testsuccessequal "$EXPECT_PKG" grep -e '^Package: ' -e '^Version: ' aptarchive/Packages + + testsuccess aptftparchive -qq sources "$incomedir" + cp rootdir/tmp/testsuccess.output aptarchive/Sources + testsuccessequal "$EXPECT_SRC" grep -e '^Package: ' -e '^Version: ' aptarchive/Sources +done diff --git a/test/integration/test-apt-ftparchive-by-hash b/test/integration/test-apt-ftparchive-by-hash new file mode 100755 index 0000000..ccfc627 --- /dev/null +++ b/test/integration/test-apt-ftparchive-by-hash @@ -0,0 +1,70 @@ +#!/bin/sh +set -e + +verify_by_hash() { + for hash_gen in SHA256:sha256sum SHA512:sha512sum; do + hash=$(echo ${hash_gen} | cut -f1 -d:) + gen=$(echo ${hash_gen} | cut -f2 -d:) + testsuccess stat aptarchive/dists/unstable/main/binary-i386/by-hash/$hash/$($gen aptarchive/dists/unstable/main/binary-i386/Packages | cut -f1 -d' ') + testsuccess stat aptarchive/dists/unstable/main/binary-i386/by-hash/$hash/$($gen aptarchive/dists/unstable/main/binary-i386/Packages.gz | cut -f1 -d' ') + done +} + +# +# main() +# +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' +configcompression 'gz' '.' +confighashes 'SHA256' 'SHA512' + +# enable by-hash in apt-ftparchive +echo 'APT::FTPArchive::DoByHash "1";' >> aptconfig.conf + +# build one package +buildsimplenativepackage 'foo' 'i386' '1' 'unstable' +buildaptarchivefromincoming + +# verify initial run +verify_by_hash +previous_hash=$(sha256sum aptarchive/dists/unstable/main/binary-i386/Packages | cut -f1 -d' ') + +# insert new package +buildsimplenativepackage 'bar' 'i386' '1' 'unstable' +# and build again +buildaptarchivefromincoming + +# ensure the new package packag is there +testsuccess zgrep "Package: bar" aptarchive/dists/unstable/main/binary-i386/Packages.gz + +# ensure we have the by-hash stuff +verify_by_hash + +# ensure the old hash is still there +testsuccess stat aptarchive/dists/unstable/main/binary-i386/by-hash/SHA256/$previous_hash + +# ensure we have it in the Release file +testsuccess grep "Acquire-By-Hash: yes" aptarchive/dists/unstable/*Release + +# now ensure gc work +for i in $(seq 3); do + buildsimplenativepackage 'bar' 'i386' "$i" 'unstable' + buildaptarchivefromincoming +done + +hash_count=$(ls aptarchive/dists/unstable/main/binary-i386/by-hash/SHA256/|wc -l) +# we have 2 files (uncompressed, gz) per run, 5 runs in total +# by default apt-ftparchive keeps three generations (current plus 2 older) +msgtest "Check that gc for by-hash works… " +if [ "$hash_count" = "6" ]; then + msgpass +else + echo "Got $hash_count expected 6" + msgfail +fi + +# ensure the current generation is still there +verify_by_hash + diff --git a/test/integration/test-apt-ftparchive-cachedb b/test/integration/test-apt-ftparchive-cachedb new file mode 100755 index 0000000..73d762c --- /dev/null +++ b/test/integration/test-apt-ftparchive-cachedb @@ -0,0 +1,103 @@ +#!/bin/sh +set -e + +ensure_correct_packages_file() { + testequal "Package: foo +Architecture: i386 +Version: 1 +Priority: optional +Section: others +Maintainer: Joe Sixpack <joe@example.org> +$(dpkg-deb -I ./aptarchive/pool/main/foo_1_i386.deb | grep 'Installed-Size:' | sed 's#^ ##') +Filename: pool/main/foo_1_i386.deb" head -n8 ./aptarchive/dists/test/main/binary-i386/Packages +} + +ensure_correct_contents_file() { + testfileequal ./aptarchive/dists/test/Contents-i386 "usr/bin/foo-i386 others/foo +usr/share/doc/foo/FEATURES others/foo +usr/share/doc/foo/changelog others/foo +usr/share/doc/foo/copyright others/foo" +} + +# +# main() +# +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +mkdir -p aptarchive/dists/test/main/i18n/ +mkdir -p aptarchive/dists/test/main/source/ +mkdir -p aptarchive/dists/test/main/binary-i386 +mkdir -p aptarchive/pool/main + +mkdir aptarchive-overrides +mkdir aptarchive-cache +cat > ftparchive.conf <<"EOF" +Dir { + ArchiveDir "./aptarchive"; + OverrideDir "./aptarchive-overrides"; + CacheDir "./aptarchive-cache"; +}; + +Default { + Packages::Compress ". gzip bzip2"; + Contents::Compress ". gzip bzip2"; + LongDescription "false"; +}; + +TreeDefault { + BinCacheDB "packages-$(SECTION)-$(ARCH).db"; + + Directory "pool/$(SECTION)"; + SrcDirectory "pool/$(SECTION)"; + + Packages "$(DIST)/$(SECTION)/binary-$(ARCH)/Packages"; + Contents "$(DIST)/Contents-$(ARCH)"; +}; + +Tree "dists/test" { + Sections "main"; + Architectures "i386"; + +}; +EOF + +# build one package +buildsimplenativepackage 'foo' 'i386' '1' 'test' +mv incoming/* aptarchive/pool/main/ + +# generate (empty cachedb) +testsuccess aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +ensure_correct_packages_file +ensure_correct_contents_file +testsuccessequal ' Misses in Cache: 2 + dists/test/Contents-i386: New 402 B Misses in Cache: 0' grep Misses stats-out.txt + +# generate again +testsuccess aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +ensure_correct_packages_file +ensure_correct_contents_file +testsuccessequal ' Misses in Cache: 0 + dists/test/Contents-i386: Misses in Cache: 0' grep Misses stats-out.txt + +# and again (with removing the Packages file) +rm -f ./aptarchive/dists/test/main/binary-i386/* +rm -f ./aptarchive/dists/test/Contents-i386 +testsuccess aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +ensure_correct_packages_file +ensure_correct_contents_file +testsuccessequal ' Misses in Cache: 0 + dists/test/Contents-i386: New 402 B Misses in Cache: 0' grep Misses stats-out.txt + +# and clean +rm -rf aptarchive/pool/main/* +testsuccessequal "packages-main-i386.db" aptftparchive clean ftparchive.conf +testsuccess aptftparchive clean ftparchive.conf -o Debug::APT::FTPArchive::Clean=1 +cp rootdir/tmp/testsuccess.output clean-out.txt +testsuccessequal "0 Number of unique keys in the tree" grep unique clean-out.txt +testsuccessequal "packages-main-i386.db" grep packages-main-i386.db clean-out.txt diff --git a/test/integration/test-apt-ftparchive-cachedb-lp1274466 b/test/integration/test-apt-ftparchive-cachedb-lp1274466 new file mode 100755 index 0000000..b0bcae8 --- /dev/null +++ b/test/integration/test-apt-ftparchive-cachedb-lp1274466 @@ -0,0 +1,59 @@ +#!/bin/sh +set -e + + +# +# main() +# +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +confighashes 'MD5' 'SHA1' 'SHA256' 'SHA512' + +db_dump=db_dump +if command -v db_dump-5 >/dev/null 2>&1; then + db_dump=db_dump-5 +fi + +# gather the db and the deb, ensure mtime is not modified as its saved in the DB +cp -p "$TESTDIR/deb-lp1274466-cachedb.deb" foo_1_i386.deb +cp -p "$TESTDIR/cachedb-lp1274466-old-format.db" old-format.db + +# verify that the format is different +testsuccess aptftparchive --db new-format.db packages . +$db_dump new-format.db > new-format.dump +$db_dump old-format.db > old-format.dump +testfailure diff -u old-format.dump new-format.dump + +# ensure the new format as the sha512 +testsuccess grep 7da58ff901a40ecf42a730dc33198b182e9ba9ec98799fc2c2b6fabeeee40cc12a0e7cadb4b66764235c56e1009dbfe8a9a566fb1eedf47a992d1fff2cc3332c new-format.dump +# but the old format does not +testfailure grep 7da58ff901a40ecf42a730dc33198b182e9ba9ec98799fc2c2b6fabeeee40cc12a0e7cadb4b66764235c56e1009dbfe8a9a566fb1eedf47a992d1fff2cc3332c old-format.dump + +# regression test for corruption with previous generation of cachedb +testsuccessequal "Package: foo +Architecture: i386 +Version: 1 +Priority: optional +Section: others +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 29 +Filename: ./foo_1_i386.deb +Size: 1270 +MD5sum: 85d0e908c1a897700e2c5dea72d7e3c0 +SHA1: 858b09169032b7925a0e463f46b6634243fc40ce +SHA256: 3750a2c9c6b5beee7f307564be3d51d3ec7cbb78fa4f0b47f84a7c41477bff59 +SHA512: 7da58ff901a40ecf42a730dc33198b182e9ba9ec98799fc2c2b6fabeeee40cc12a0e7cadb4b66764235c56e1009dbfe8a9a566fb1eedf47a992d1fff2cc3332c +Description: an autogenerated dummy foo=1/test + If you find such a package installed on your system, + something went horribly wrong! They are autogenerated + und used only by testcases and surf no other propose… +" aptftparchive --db old-format.db packages . + +# ensure that the db is updated and contains the new sha512 +$db_dump old-format.db > old-format.dump + +testsuccess grep 7da58ff901a40ecf42a730dc33198b182e9ba9ec98799fc2c2b6fabeeee40cc12a0e7cadb4b66764235c56e1009dbfe8a9a566fb1eedf47a992d1fff2cc3332c old-format.dump + + diff --git a/test/integration/test-apt-ftparchive-notautomatic b/test/integration/test-apt-ftparchive-notautomatic new file mode 100755 index 0000000..b2f65cc --- /dev/null +++ b/test/integration/test-apt-ftparchive-notautomatic @@ -0,0 +1,54 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +getnotautomaticfromsuite() { + case "$1" in + experimental|backports) echo 'yes';; + esac +} +getbutautomaticupgradesfromsuite() { + case "$1" in + backports) echo 'yes';; + esac +} + +insertpackage 'unstable' 'foo' 'i386' '1' +insertpackage 'backports' 'foo' 'i386' '3~bpo1' +insertpackage 'experimental' 'foo' 'i386' '3' +setupaptarchive + +# check no unstable NotAutomatic field +testfailure grep "NotAutomatic:" aptarchive/dists/unstable/*Release +# check backports NotAutomatic field +testsuccess grep "NotAutomatic: yes" aptarchive/dists/backports/*Release +# check experimental NotAutomatic field +testsuccess grep "NotAutomatic: yes" aptarchive/dists/experimental/*Release + +# check no unstable ButAutomaticUpgrades field +testfailure grep "ButAutomaticUpgrades:" aptarchive/dists/unstable/*Release +# check backports ButAutomaticUpgrades field +testsuccess grep "ButAutomaticUpgrades: yes" aptarchive/dists/backports/*Release +# check no experimental ButAutomaticUpgrades field +testfailure grep "ButAutomaticUpgrades:" aptarchive/dists/experimental/*Release + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [i386]) +Conf foo (1 unstable [i386])' apt install foo -s + +insertinstalledpackage 'foo' 'i386' '2' +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be upgraded: + foo +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst foo [2] (3~bpo1 backports [i386]) +Conf foo (3~bpo1 backports [i386])' apt install foo -s diff --git a/test/integration/test-apt-ftparchive-src-cachedb b/test/integration/test-apt-ftparchive-src-cachedb new file mode 100755 index 0000000..8bab1fd --- /dev/null +++ b/test/integration/test-apt-ftparchive-src-cachedb @@ -0,0 +1,191 @@ +#!/bin/sh +set -e + +assert_correct_sources_file() { + testsuccessequal "Package: bar +Format: 3.0 (native) +Binary: bar +Architecture: all +Version: 1.0 +Directory: pool/main +Package-List: + bar deb admin extra +Files: + 7b57dd065e51de5905288a5104d4bef5 406 bar_1.0.dsc + d41d8cd98f00b204e9800998ecf8427e 0 bar_1.0.tar.gz +Checksums-Sha1: + 17a40b76715f393ab7fd6485c9392a02f1adf903 406 bar_1.0.dsc + da39a3ee5e6b4b0d3255bfef95601890afd80709 0 bar_1.0.tar.gz +Checksums-Sha256: + d9d7507f66a89258b6920aca47747d7a30e0e64b09ecabbf02b2efbdabf840a9 406 bar_1.0.dsc + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 bar_1.0.tar.gz +Checksums-Sha512: + ee0a9bfb6614159b45203fc29487d4f37387993ca0e6d6f27b80010498f3731d75753188ece307508ae9af0259bd11a6af15a1a38f0b87dbd5ea1273b7a7d53e 406 bar_1.0.dsc + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e 0 bar_1.0.tar.gz + +Package: foo +Format: 3.0 (native) +Binary: foo +Architecture: all +Version: 1.0 +Directory: pool/main +Package-List: + foo deb admin extra +Files: + d144826e6f02831c1933e910c92cd7e0 171 foo_1.0.dsc + d41d8cd98f00b204e9800998ecf8427e 0 foo_1.0.tar.gz +Checksums-Sha1: + 979306aa3ccff3d61bba062bb6977e2493c6f907 171 foo_1.0.dsc + da39a3ee5e6b4b0d3255bfef95601890afd80709 0 foo_1.0.tar.gz +Checksums-Sha256: + 8c780af8b5a6d5b3c2e2f9518940beebea52ac6d6ad7b52c082dc925cfe5b532 171 foo_1.0.dsc + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 foo_1.0.tar.gz +Checksums-Sha512: + 3da0240fd764657c2f3661b4d750578a9a99b0580591b133756379d48117ebda87a5ed2467f513200d6e7eaf51422cbe91c15720eef7fb4bba2cc8ff81ebc547 171 foo_1.0.dsc + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e 0 foo_1.0.tar.gz +" aptsortpkgs ./aptarchive/dists/test/main/source/Sources -o APT::SortPkgs::Source=true +} + +create_source_files() { + NAME="$1" + REQUEST_CLEARSIGN="$2" + + TARFILE="aptarchive/pool/main/${NAME}_1.0.tar.gz" + DSC_FILE="aptarchive/pool/main/${NAME}_1.0.dsc" + touch $TARFILE + if [ "$REQUEST_CLEARSIGN" = "CLEARSIGN" ]; then + printf -- "-----BEGIN PGP SIGNED MESSAGE-----\n\n" > $DSC_FILE + fi + cat >> $DSC_FILE << EOF +Format: 3.0 (native) +Source: $NAME +Binary: $NAME +Architecture: all +Version: 1.0 +Package-List: + $NAME deb admin extra +Files: + $(md5sum $TARFILE|cut -f1 -d' ') $(stat --print="%s" $TARFILE) ${NAME}_1.0.tar.gz +EOF + if [ "$REQUEST_CLEARSIGN" = "CLEARSIGN" ]; then + cat >> $DSC_FILE <<EOF + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (GNU/Linux) + +iEYEARECAAYFAk3k/VoACgkQliSD4VZixzQxlgCgpav7j68z48qNTDFuT9fLqwT5 +DFwAoIXatJFENEC371bMKTkUKlwZxQEk +=iI9V +-----END PGP SIGNATURE----- +EOF + fi +} + +create_clearsigned_source_files() { + NAME="$1" + create_source_files "$NAME" "CLEARSIGN" +} + +# +# main() +# +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +confighashes 'MD5' 'SHA1' 'SHA256' 'SHA512' + +msgtest 'Test apt-ftparchive source with missing hashes in .dsc' + +mkdir -p aptarchive/pool/main +create_source_files foo +create_clearsigned_source_files bar + +mkdir -p aptarchive/dists/test/main/i18n/ +mkdir -p aptarchive/dists/test/main/source/ + +mkdir aptarchive-overrides +mkdir aptarchive-cache + +msgtest 'generate with --db option' +cd aptarchive +aptftparchive --db ./test.db sources pool/main/ -o APT::FTPArchive::ShowCacheMisses=1 > dists/test/main/source/Sources 2>stats-out.txt && msgpass || msgfail +testsuccess grep Misses stats-out.txt +testfileequal '../rootdir/tmp/testsuccess.output' ' Misses in Cache: 2' +cd .. +assert_correct_sources_file + +msgtest 'generate with --db option (again to ensure its in the cache)' +cd aptarchive +aptftparchive --db ./test.db sources pool/main/ -o APT::FTPArchive::ShowCacheMisses=1 > dists/test/main/source/Sources 2>stats-out.txt && msgpass || msgfail +testsuccess grep Misses stats-out.txt +testfileequal '../rootdir/tmp/testsuccess.output' ' Misses in Cache: 0' +cd .. +assert_correct_sources_file + +# get ready for the "apt-ftparchive generate" command +cat > apt-ftparchive.conf <<"EOF" +Dir { + ArchiveDir "./aptarchive"; + OverrideDir "./aptarchive-overrides"; + CacheDir "./aptarchive-cache"; +}; + +Default { + Packages::Compress ". gzip bzip2"; + Contents::Compress ". gzip bzip2"; + LongDescription "false"; +}; + +TreeDefault { + BinCacheDB "packages-$(SECTION)-$(ARCH).db"; + SrcCacheDB "sources-$(SECTION).db"; + + Directory "pool/$(SECTION)"; + SrcDirectory "pool/$(SECTION)"; + + Sources "$(DIST)/$(SECTION)/source/Sources"; +}; + +Tree "dists/test" { + Sections "main"; + Architectures "source"; + +}; +EOF + +msgtest 'generate (empty cachedb)' +testsuccess aptftparchive generate apt-ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal rootdir/tmp/testsuccess.output ' Misses in Cache: 2' +assert_correct_sources_file + +msgtest 'generate again out of the cache' +rm -f ./aptarchive/dists/test/main/source/Sources +testsuccess aptftparchive generate apt-ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 +cp rootdir/tmp/testsuccess.output stats-out.txt +testsuccess grep Misses stats-out.txt +testfileequal rootdir/tmp/testsuccess.output ' Misses in Cache: 0' +assert_correct_sources_file + +# generate invalid files +mkdir aptarchive/pool/invalid +printf "meep" > aptarchive/pool/invalid/invalid_1.0.dsc +testequal " +E: Could not find a record in the DSC 'aptarchive/pool/invalid/invalid_1.0.dsc'" aptftparchive sources aptarchive/pool/invalid +rm -f aptarchive/pool/invalid/invalid_1.0.dsc + +printf "meep: yes" > aptarchive/pool/invalid/invalid_1.0.dsc +testequal " +E: Could not find a Source entry in the DSC 'aptarchive/pool/invalid/invalid_1.0.dsc'" aptftparchive sources aptarchive/pool/invalid +rm -f aptarchive/pool/invalid/invalid_1.0.dsc + +# ensure clean works +rm -f aptarchive/pool/main/* +testsuccess aptftparchive clean apt-ftparchive.conf -o Debug::APT::FTPArchive::Clean=1 +cp rootdir/tmp/testsuccess.output clean-out.txt +testsuccess grep unique clean-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' "0 Number of unique keys in the tree" +testsuccess grep sources-main.db clean-out.txt +testfileequal 'rootdir/tmp/testsuccess.output' "sources-main.db" diff --git a/test/integration/test-apt-get-autoremove b/test/integration/test-apt-get-autoremove new file mode 100755 index 0000000..5546958 --- /dev/null +++ b/test/integration/test-apt-get-autoremove @@ -0,0 +1,238 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +buildsimplenativepackage 'unrelated' 'all' '1' 'unstable' +buildsimplenativepackage 'po-debconf' 'all' '1.0.16' 'unstable' +buildsimplenativepackage 'debhelper' 'all' '8.0.0' 'unstable' 'Depends: po-debconf' +buildsimplenativepackage 'base-files' 'all' '10' 'unstable' 'Essential: yes' +buildsimplenativepackage 'fdisk' 'all' '2.30.2' 'unstable' 'XB-Important: yes' +buildsimplenativepackage 'linux-image' 'all' '4.9.80' 'unstable' +buildsimplenativepackage 'hold-me' 'all' '1.0' 'unstable' +buildsimplenativepackage 'remove-me' 'all' '1.0' 'unstable' +buildsimplenativepackage 'system-base' 'all' '1.0' 'unstable' 'Depends: unrelated, base-files, fdisk, linux-image, hold-me, remove-me' +setupaptarchive + +testsuccess aptget install unrelated debhelper -y +testdpkginstalled 'unrelated' 'debhelper' 'po-debconf' + +testmarkedauto 'po-debconf' +testsuccess aptget remove debhelper -y +testdpkgnotinstalled 'debhelper' +testdpkginstalled 'po-debconf' 'unrelated' +echo 'unrelated purge' | dpkg --set-selections +testdpkgstatus 'pi' '1' 'unrelated' + +AUTOREMOVE='apt autoremove' +if [ -n "$SUDO_USER" ]; then + AUTOREMOVE="sudo $AUTOREMOVE" +fi +echo 'APT::NeverAutoRemove { "^debc.*nf$"; };' > rootdir/etc/apt/apt.conf.d/00autoremove +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget autoremove -s +testequal "Reading package lists... +Building dependency tree... +Reading state information... +The following package was automatically installed and is no longer required: + po-debconf +Use '$AUTOREMOVE' to remove it. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s +testequal "Reading package lists... +Building dependency tree... +Reading state information... +1 package was automatically installed and is no longer required. +Use '$AUTOREMOVE' to remove it. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s -o APT::Get::HideAutoRemove=small +testequal "Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following package was automatically installed and is no longer required: + po-debconf +Use '$AUTOREMOVE' to remove it. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget upgrade -s +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget install -s --autoremove +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget upgrade -s --autoremove +echo 'APT::Get::AutomaticRemove "true";' > rootdir/etc/apt/apt.conf.d/autoremoval +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget install -s +testequal "Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following package was automatically installed and is no longer required: + po-debconf +Use '$AUTOREMOVE' to remove it. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget upgrade -s +rm -f rootdir/etc/apt/apt.conf.d/autoremoval + +testdpkginstalled 'po-debconf' + +echo 'APT::NeverAutoRemove { "^po-debconf$"; };' > rootdir/etc/apt/apt.conf.d/00autoremove +testsuccess aptget autoremove -y +testdpkginstalled 'po-debconf' +testdpkgstatus 'pi' '1' 'unrelated' + +echo 'APT::NeverAutoRemove { "^po-.*$"; };' > rootdir/etc/apt/apt.conf.d/00autoremove +testsuccess aptget autoremove -y +testdpkginstalled "po-debconf" +testdpkgstatus 'pi' '1' 'unrelated' + +rm rootdir/etc/apt/apt.conf.d/00autoremove +testsuccess aptget autoremove -y +testdpkgnotinstalled 'po-debconf' +testdpkgstatus 'pi' '1' 'unrelated' +testmarkedauto + +sed rootdir/var/log/apt/history.log -e '/^Commandline: / d' \ + -e '/^Start-Date: / d' -e '/^End-Date: / d' \ + -e '/^Requested-By: / d' \ + -e 's#), #)\nInstall: #g' | sort -u > apt-history.log +testfileequal 'apt-history.log' ' +Install: debhelper:i386 (8.0.0) +Install: po-debconf:i386 (1.0.16, automatic) +Install: unrelated:i386 (1) +Remove: debhelper:i386 (8.0.0) +Remove: po-debconf:i386 (1.0.16)' + +testsuccess aptget install debhelper -y +testdpkgstatus 'pi' '1' 'unrelated' +testdpkginstalled 'debhelper' 'po-debconf' +testsuccess aptmark auto debhelper + +testmarkedauto 'debhelper' 'po-debconf' +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + debhelper po-debconf +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +Remv debhelper [8.0.0] +Remv po-debconf [1.0.16]' aptget autoremove -s +testequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages were automatically installed and are no longer required: + debhelper po-debconf +Use '$AUTOREMOVE' to remove them. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s +testequal "Reading package lists... +Building dependency tree... +Reading state information... +2 packages were automatically installed and are no longer required. +Use '$AUTOREMOVE' to remove them. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s -o APT::Get::HideAutoRemove=small + +testsuccess aptmark hold debhelper +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget autoremove -s + +testsuccess aptget autoremove debhelper -y --allow-change-held-packages +testdpkgnotinstalled 'po-debconf' 'debhelper' +testdpkgstatus 'pi' '1' 'unrelated' +testmarkedauto +testsuccess aptget install debhelper --solver apt -y -o Debug::pkgDepCache::Marker=1 +testmarkedauto 'po-debconf' +testdpkgstatus 'pi' '1' 'unrelated' + +testsuccess aptget install system-base debhelper -y +testdpkginstalled 'debhelper' 'po-debconf' 'system-base' 'base-files' 'fdisk' 'linux-image' 'hold-me' 'remove-me' +testsuccess aptmark hold 'hold-me' +echo 'APT::NeverAutoRemove { "^linux-image$"; };' > rootdir/etc/apt/apt.conf.d/00autoremove +testsuccess aptget remove system-base -y +testsuccess aptget autoremove -y -o Debug::pkgAutoRemove=yes +DEBUGLOG=${TMPWORKINGDIRECTORY}/rootdir/tmp/autoremove.debuglog +cp "${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" "$DEBUGLOG" +testsuccess grep -Fx 'Marking: fdisk:i386 2.30.2 (Important)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: base-files:i386 10 (Essential)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: unrelated:i386 1 (Manual-Installed)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: hold-me:i386 1.0 (Hold)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: po-debconf:i386 1.0.16 (Dependency)' "$DEBUGLOG" +testsuccess grep -Fx 'Marking: linux-image:i386 4.9.80 (Blacklisted [APT::NeverAutoRemove])' "$DEBUGLOG" +testdpkginstalled 'debhelper' 'po-debconf' 'base-files' 'fdisk' 'linux-image' +testdpkgstatus 'hi' '1' 'hold-me' +testdpkgnotinstalled 'remove-me' +testdpkgstatus 'pi' '1' 'unrelated' + +insertinstalledpackage 'bar' 'all' '1' 'Depends: foo-provider' +insertinstalledpackage 'foo-multi1-1' 'all' '1' 'Provides: foo-provider +Source: foo-multi (1)' +insertinstalledpackage 'foo-multi1-2' 'all' '1' 'Provides: foo-provider +Source: foo-multi (2)' +insertinstalledpackage 'foo-multi1-3' 'all' '1' 'Provides: foo-provider +Source: foo-multi (3)' +insertinstalledpackage 'foo-multi2-1' 'all' '1' 'Provides: foo-provider +Source: foo-multi (1)' +insertinstalledpackage 'foo-multi2-2' 'all' '1' 'Provides: foo-provider +Source: foo-multi (2)' +insertinstalledpackage 'foo-multi2-3' 'all' '1' 'Provides: foo-provider +Source: foo-multi (3)' +insertinstalledpackage 'foo-plus-1' 'all' '1' 'Provides: foo-provider +Source: foo-plus (1)' +insertinstalledpackage 'foo-plus-2' 'all' '1' 'Provides: foo-provider +Source: foo-plus (2)' +insertinstalledpackage 'foo-plus-3' 'all' '1' 'Provides: foo-provider +Source: foo-plus (3)' +insertinstalledpackage 'foo-single-1' 'all' '1' 'Provides: foo-provider' +insertinstalledpackage 'foo-single-2' 'all' '1' 'Provides: foo-provider' + +testsuccess aptmark auto 'foo-*' +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + foo-multi1-1 foo-multi1-2 foo-multi2-1 foo-multi2-2 foo-plus-1 foo-plus-2 +0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded. +Remv foo-multi1-1 [1] +Remv foo-multi1-2 [1] +Remv foo-multi2-1 [1] +Remv foo-multi2-2 [1] +Remv foo-plus-1 [1] +Remv foo-plus-2 [1]' apt autoremove -s + + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + foo-multi1-1* foo-multi1-2* foo-multi2-1* foo-multi2-2* foo-plus-1* + foo-plus-2* +0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded. +Purg foo-multi1-1 [1] +Purg foo-multi1-2 [1] +Purg foo-multi2-1 [1] +Purg foo-multi2-2 [1] +Purg foo-plus-1 [1] +Purg foo-plus-2 [1]' apt autopurge -s + +testdpkgstatus 'pi' '1' 'unrelated' +testsuccess apt purge unrelated -y diff --git a/test/integration/test-apt-get-build-dep b/test/integration/test-apt-get-build-dep new file mode 100755 index 0000000..403de8f --- /dev/null +++ b/test/integration/test-apt-get-build-dep @@ -0,0 +1,149 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'stable' 'build-essential' 'i386' '1' +insertpackage 'stable' 'build-essential2' 'i386' '1' +insertpackage 'stable' 'build-depends' 'i386' '1' +insertpackage 'stable' 'build-depends-arch' 'i386' '1' +insertpackage 'stable' 'build-depends-indep' 'i386' '1' +insertinstalledpackage 'build-conflicts' 'i386' '1' +insertinstalledpackage 'build-conflicts-arch' 'i386' '1' +insertinstalledpackage 'build-conflicts-indep' 'i386' '1' + +setupaptarchive + +cat > foobar.dsc <<EOF +Format: 3.0 (native) +Source: foobar +Binary: foobar +Architecture: all +Version: 1 +Maintainer: Joe Sixpack <joe@example.org> +Build-Depends: build-depends (>= 1) +Build-Depends-Indep: build-depends-indep (>= 1) +Build-Depends-Arch: build-depends-arch (>= 1) +Build-Conflicts: build-conflicts (>= 1) +Build-Conflicts-Indep: build-conflicts-indep (>= 1) +Build-Conflicts-Arch: build-conflicts-arch (>= 1) +Standards-Version: 3.9.8 +EOF +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflicts build-conflicts-arch build-conflicts-indep +The following NEW packages will be installed: + build-depends build-depends-arch build-depends-indep build-essential +0 upgraded, 4 newly installed, 3 to remove and 0 not upgraded. +Remv build-conflicts [1] +Remv build-conflicts-arch [1] +Remv build-conflicts-indep [1] +Inst build-depends (1 stable [i386]) +Inst build-depends-arch (1 stable [i386]) +Inst build-depends-indep (1 stable [i386]) +Inst build-essential (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-depends-arch (1 stable [i386]) +Conf build-depends-indep (1 stable [i386]) +Conf build-essential (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc + +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflicts build-conflicts-arch build-conflicts-indep +The following NEW packages will be installed: + build-depends build-depends-arch build-depends-indep build-essential2 +0 upgraded, 4 newly installed, 3 to remove and 0 not upgraded. +Remv build-conflicts [1] +Remv build-conflicts-arch [1] +Remv build-conflicts-indep [1] +Inst build-depends (1 stable [i386]) +Inst build-depends-arch (1 stable [i386]) +Inst build-depends-indep (1 stable [i386]) +Inst build-essential2 (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-depends-arch (1 stable [i386]) +Conf build-depends-indep (1 stable [i386]) +Conf build-essential2 (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc -o APT::Build-Essential="build-essential2" + +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflicts build-conflicts-arch build-conflicts-indep +The following NEW packages will be installed: + build-depends build-depends-arch build-depends-indep +0 upgraded, 3 newly installed, 3 to remove and 0 not upgraded. +Remv build-conflicts [1] +Remv build-conflicts-arch [1] +Remv build-conflicts-indep [1] +Inst build-depends (1 stable [i386]) +Inst build-depends-arch (1 stable [i386]) +Inst build-depends-indep (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-depends-arch (1 stable [i386]) +Conf build-depends-indep (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc -o APT::Build-Essential="," + +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflicts build-conflicts-arch build-conflicts-indep +The following NEW packages will be installed: + build-depends build-depends-arch build-depends-indep build-essential + build-essential2 +0 upgraded, 5 newly installed, 3 to remove and 0 not upgraded. +Remv build-conflicts [1] +Remv build-conflicts-arch [1] +Remv build-conflicts-indep [1] +Inst build-depends (1 stable [i386]) +Inst build-depends-arch (1 stable [i386]) +Inst build-depends-indep (1 stable [i386]) +Inst build-essential (1 stable [i386]) +Inst build-essential2 (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-depends-arch (1 stable [i386]) +Conf build-depends-indep (1 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf build-essential2 (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc -o APT::Build-Essential::="build-essential2" + +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflicts build-conflicts-arch +The following NEW packages will be installed: + build-depends build-depends-arch build-essential +0 upgraded, 3 newly installed, 2 to remove and 0 not upgraded. +Remv build-conflicts [1] +Remv build-conflicts-arch [1] +Inst build-depends (1 stable [i386]) +Inst build-depends-arch (1 stable [i386]) +Inst build-essential (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-depends-arch (1 stable [i386]) +Conf build-essential (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc --arch-only + +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflicts build-conflicts-indep +The following NEW packages will be installed: + build-depends build-depends-indep build-essential +0 upgraded, 3 newly installed, 2 to remove and 0 not upgraded. +Remv build-conflicts [1] +Remv build-conflicts-indep [1] +Inst build-depends (1 stable [i386]) +Inst build-depends-indep (1 stable [i386]) +Inst build-essential (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-depends-indep (1 stable [i386]) +Conf build-essential (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc --indep-only diff --git a/test/integration/test-apt-get-build-dep-file b/test/integration/test-apt-get-build-dep-file new file mode 100755 index 0000000..dc405da --- /dev/null +++ b/test/integration/test-apt-get-build-dep-file @@ -0,0 +1,209 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'stable' 'debhelper' 'i386' '7' +insertpackage 'stable' 'build-essential' 'i386' '1' +insertpackage 'stable' 'build-depends' 'i386' '1' +insertsource 'stable' 'unrelated' 'any' '1' +insertinstalledpackage 'build-conflict' 'i386' '1' + +setupaptarchive + +msgmsg 'Test with' 'unsigned dsc' +cat > 2vcard_0.5-3.dsc <<EOF +Format: 1.0 +Source: 2vcard +Binary: 2vcard +Architecture: all +Version: 0.5-3 +Maintainer: Martin Albisetti <argentina@gmail.com> +Uploaders: Marcela Tiznado <mlt@debian.org> +Standards-Version: 3.8.0 +Build-Depends: debhelper (>= 5.0.37) +Build-Conflicts: build-conflict (<< 2) +Checksums-Sha1: + b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz + 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz +Checksums-Sha256: + efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz + 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz +Files: + f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz + 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz +EOF + +test2vcardbuilddep() { + local name="$1" + testsuccessequal "Note, using file './$name' to get the build dependencies +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + build-conflict +The following NEW packages will be installed: + build-essential debhelper +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv build-conflict [1] +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep -s ./$name +testfailure aptget build-dep --simulate $name +cd downloaded +testsuccess aptget build-dep --simulate ../$name +testsuccess aptget build-dep --simulate "$(readlink -f ../$name)" +cd .. +} +test2vcardbuilddep "2vcard_0.5-3.dsc" +cp "2vcard_0.5-3.dsc" "2VCard_0.5-3.dsc" +test2vcardbuilddep "2VCard_0.5-3.dsc" + +msgmsg 'Test with' 'signed dsc' +cat > 2vcard_0.5-3.dsc <<EOF +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +Format: 1.0 +Source: 2vcard +Binary: 2vcard +Architecture: all +Version: 0.5-3 +Maintainer: Martin Albisetti <argentina@gmail.com> +Uploaders: Marcela Tiznado <mlt@debian.org> +Standards-Version: 3.8.0 +Build-Depends: debhelper (>= 5.0.37) +Build-Conflicts: build-conflict (<< 2) +Checksums-Sha1: + b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz + 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz +Checksums-Sha256: + efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz + 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz +Files: + f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz + 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEARECAAYFAkijKhsACgkQsrBfRdYmq7aA2gCfaOW9riTYVQMx5ajKQVAcctlC +z2UAn1oXgTai6opwhVfkxrlmJ+iRxzuc +=4eRd +-----END PGP SIGNATURE----- +EOF +test2vcardbuilddep "2vcard_0.5-3.dsc" +cp "2vcard_0.5-3.dsc" "2VCard_0.5-3.dsc" +test2vcardbuilddep "2VCard_0.5-3.dsc" + + +msgmsg 'Test with' 'unpacked source dir' +mkdir -p foo-1.0/debian +cat > foo-1.0/debian/control <<'EOF' +Source: apturl +Section: admin +Priority: optional +Maintainer: Michael Vogt <mvo@ubuntu.com> +Build-Depends: debhelper (>= 7) +Build-Depends-Indep: +X-Python3-Version: >= 3.2 +Standards-Version: 3.9.3 + +Package: apturl-common +Architecture: any +Depends: ${python3:Depends}, + ${shlibs:Depends}, + ${misc:Depends}, + python3-apt, + python3-update-manager +Replaces: apturl (<< 0.3.6ubuntu2) +Description: install packages using the apt protocol - common data + AptUrl is a simple graphical application that takes an URL (which follows the + apt-protocol) as a command line option, parses it and carries out the + operations that the URL describes (that is, it asks the user if he wants the + indicated packages to be installed and if the answer is positive does so for + him). + . + This package contains the common data shared between the frontends. + +EOF + +testsuccessequal "Note, using directory './foo-1.0' to get the build dependencies +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-essential debhelper +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep --simulate ./foo-1.0 +testfailure aptget build-dep --simulate foo-1.0 +cd downloaded +testsuccess aptget build-dep --simulate ../foo-1.0 +testsuccess aptget build-dep --simulate "$(readlink -f ../foo-1.0)" +cd .. +cd foo-1.0 +testsuccess aptget build-dep --simulate './' +testsuccess aptget build-dep --simulate '.' +cd debian +testsuccess aptget build-dep --simulate './../' +testsuccess aptget build-dep --simulate '../' +testsuccess aptget build-dep --simulate '..' +cd ../.. + +testfailureequal 'E: Must specify at least one package to check builddeps for' aptget build-dep +testfailureequal 'E: No architecture information available for armel. See apt.conf(5) APT::Architectures for setup' aptget build-dep --simulate ./foo-1.0 -a armel +testfailureequal 'Reading package lists... +E: Unable to find a source package for foo' aptget build-dep --simulate foo + +msgmsg 'Test with a dsc' 'with comments' +cat > comments.dsc <<EOF +# I love comments +# I love them so much, I give them their own paragraph + +#This is my first package +Format: 3.0 (native) +Source: comments +Binary: comments +Architecture: all +Version: 1 +#Version: 2 +Maintainer: Joe Sixpack <joe@example.org> +Build-Depends: debhelper (>= 5), +# TODO: add more + build-depends (= 1), +Standards-Version: 3.9.6 +# This is the end… + +# or this? +EOF +testsuccessequal "Note, using file './comments.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-depends build-essential debhelper +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst build-depends (1 stable [i386]) +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep --simulate ./comments.dsc +testsuccessequal "Note, using file './comments.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +Execute external solver... +The following NEW packages will be installed: + build-depends build-essential debhelper +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst build-depends (1 stable [i386]) +Inst build-essential (1 stable [i386]) +Inst debhelper (7 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf build-essential (1 stable [i386]) +Conf debhelper (7 stable [i386])" aptget build-dep --simulate ./comments.dsc --solver apt diff --git a/test/integration/test-apt-get-changelog b/test/integration/test-apt-get-changelog new file mode 100755 index 0000000..9ac9b06 --- /dev/null +++ b/test/integration/test-apt-get-changelog @@ -0,0 +1,139 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +buildsimplenativepackage 'dpkg' 'native' '42' 'stable' +buildsimplenativepackage 'foo' 'all' '1.0' 'stable' +buildsimplenativepackage 'libbar' 'all' '1.0' 'stable' + +getlabelfromsuite() { echo 'Testcases'; } +getoriginfromsuite() { echo 'Debian'; } + +setupaptarchive --no-update +changetowebserver +testsuccess aptget update + +testsuccessequal "'https://metadata.ftp-master.debian.org/changelogs/main/f/foo/foo_1.0_changelog' foo.changelog +'https://metadata.ftp-master.debian.org/changelogs/main/libb/libbar/libbar_1.0_changelog' libbar.changelog" aptget changelog foo libbar --print-uris + +releasechanger() { + # modifying the Release files in lists… bad stuff. Good that this is only a test… + sed -i "s#^${1}: .*#${1}: ${2}#" $(find rootdir/var/lib/apt/lists -name '*Release') + rm -f rootdir/var/cache/apt/*.bin +} +releasechanger 'Origin' 'Ubuntu' +testsuccessequal "'https://changelogs.ubuntu.com/changelogs/pool/main/f/foo/foo_1.0/changelog' foo.changelog +'https://changelogs.ubuntu.com/changelogs/pool/main/libb/libbar/libbar_1.0/changelog' libbar.changelog" aptget changelog foo libbar --print-uris + +releasechanger 'Label' 'Debian' +testsuccessequal "'https://changelogs.ubuntu.com/changelogs/pool/main/f/foo/foo_1.0/changelog' foo.changelog +'https://changelogs.ubuntu.com/changelogs/pool/main/libb/libbar/libbar_1.0/changelog' libbar.changelog" aptget changelog foo libbar --print-uris + +testsuccessequal "'http://localhost:${APTHTTPPORT}/main/f/foo/foo_1.0.changelog' foo.changelog +'http://localhost:${APTHTTPPORT}/main/libb/libbar/libbar_1.0.changelog' libbar.changelog" aptget changelog foo libbar --print-uris -o Acquire::Changelogs::URI::Label::Debian="http://localhost:${APTHTTPPORT}/@CHANGEPATH@.changelog" + +sed -i '/^Origin: / a\ +Changelogs: http://example.org/@CHANGEPATH@-changelog' $(find rootdir/var/lib/apt/lists -name '*Release') +rm -f rootdir/var/cache/apt/*.bin + +testsuccessequal "'http://example.org/main/f/foo/foo_1.0-changelog' foo.changelog +'http://example.org/main/libb/libbar/libbar_1.0-changelog' libbar.changelog" aptget changelog foo libbar --print-uris -o Acquire::Changelogs::URI::Label::Debian="http://localhost:${APTHTTPPORT}/@CHANGEPATH@.changelog" + +testsuccessequal "'http://localhost:${APTHTTPPORT}/main/f/foo/foo_1.0.changelog' foo.changelog +'http://localhost:${APTHTTPPORT}/main/libb/libbar/libbar_1.0.changelog' libbar.changelog" aptget changelog foo libbar --print-uris -o Acquire::Changelogs::URI::Override::Label::Debian="http://localhost:${APTHTTPPORT}/@CHANGEPATH@.changelog" + +releasechanger 'Changelogs' 'no' +testfailuremsg 'E: Failed to fetch changelog:/foo.changelog Changelog unavailable for foo=1.0' aptget changelog foo -d + +sed -i '/^Changelogs: / d' $(find rootdir/var/lib/apt/lists -name '*Release') +releasechanger 'Label' 'Testcases' + +echo "Acquire::Changelogs::URI::Label::Testcases \"http://localhost:${APTHTTPPORT}/@CHANGEPATH@/change.txt\";" > rootdir/etc/apt/apt.conf.d/changelog.conf +testsuccessequal "'http://localhost:${APTHTTPPORT}/main/f/foo/foo_1.0/change.txt' foo.changelog +'http://localhost:${APTHTTPPORT}/main/libb/libbar/libbar_1.0/change.txt' libbar.changelog" aptget changelog foo libbar --print-uris + +echo "Acquire::Changelogs::URI::Label::Testcases \"http://localhost:${APTHTTPPORT}/pool/@CHANGEPATH@/changelog\";" > rootdir/etc/apt/apt.conf.d/changelog.conf +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog" aptget changelog foo --print-uris + + +testsuccess aptget changelog foo -qq +testfileequal 'rootdir/tmp/testsuccess.output' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" + +testsuccess aptget changelog foo libbar -qq +testfileequal 'rootdir/tmp/testsuccess.output' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog) +$(cat aptarchive/pool/main/libb/libbar/libbar_1.0/changelog)" + +testsuccess aptget changelog foo -d +testfilestats 'foo.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testfileequal 'foo.changelog' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" +rm -f foo.changelog + +testsuccess aptget changelog libbar foo -d +testfilestats 'libbar.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testfilestats 'foo.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testfileequal 'libbar.changelog' "$(cat aptarchive/pool/main/libb/libbar/libbar_1.0/changelog)" +testfileequal 'foo.changelog' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" +rm -f libbar.changelog foo.changelog + +# as such bogus, but can happen with multiple binaries from the same source +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog +'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog" aptget changelog foo foo --print-uris +testsuccess aptget changelog foo foo -qq +testfileequal 'rootdir/tmp/testsuccess.output' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog) +$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" +testsuccess aptget changelog foo foo -d +testfilestats 'foo.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testfileequal 'foo.changelog' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" +# we have the file already, confused? +testsuccess aptget changelog foo foo -d +testfilestats 'foo.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testfileequal 'foo.changelog' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" +echo 'bogus' > foo.changelog +touch -d 'now + 1 hour' foo.changelog +testsuccess aptget changelog foo foo -d +testfilestats 'foo.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testfileequal 'foo.changelog' "$(cat aptarchive/pool/main/f/foo/foo_1.0/changelog)" +echo -n 'bogus' > foo.changelog +touch -d "$(stat -c%y aptarchive/pool/main/f/foo/foo_1.0/changelog)" foo.changelog +testsuccess aptget changelog foo foo -d +testfilestats 'foo.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +testequal 'bogus1.0) stable; urgency=low' head -n 1 foo.changelog +rm -f foo.changelog + +# no @CHANGEPATH@ in the URI +testequal 'E: Failed to fetch changelog:/foo.changelog Changelog unavailable for foo=1.0' \ + aptget changelog foo -qq -d -o Acquire::Changelogs::URI::Label::Testcases="http://localhost:${APTHTTPPORT}/change.txt" +testfailure test -e foo.changelog + +testequal "E: Failed to fetch http://localhost:${APTHTTPPORT}/does/not/exist/main/f/foo/foo_1.0/change.txt Changelog unavailable for foo=1.0 (404 Not Found)" \ + aptget changelog foo -qq -d -o Acquire::Changelogs::URI::Label::Testcases="http://localhost:${APTHTTPPORT}/does/not/exist/@CHANGEPATH@/change.txt" +testfailure test -e foo.changelog + +testdpkgnotinstalled 'foo' +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog" apt changelog foo --print-uris -o Acquire::Changelogs::AlwaysOnline=false +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog" apt changelog foo --print-uris -o Acquire::Changelogs::AlwaysOnline=true + +testsuccess apt install dpkg -y +# at this moment, we still have the Releasefile claim to be origin:ubuntu +echo 'Acquire::Changelogs::AlwaysOnline::Origin::Ubuntu "false";' >> rootdir/etc/apt/apt.conf.d/nooriginchangelogs +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/d/dpkg/dpkg_42/changelog' dpkg.changelog" apt changelog dpkg --print-uris +testsuccessequal "'copy://${TMPWORKINGDIRECTORY}/rootdir/usr/share/doc/dpkg/changelog' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=false +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/d/dpkg/dpkg_42/changelog' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=true +testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/d/dpkg/dpkg_42/changelog' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=false -o Acquire::Changelogs::AlwaysOnline::Origin::Ubuntu=true +testsuccessequal "'copy://${TMPWORKINGDIRECTORY}/rootdir/usr/share/doc/dpkg/changelog' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=false -o Acquire::Changelogs::AlwaysOnline::Origin::Debian=true + +testsuccess apt changelog dpkg -d +testfilestats 'dpkg.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" +head -n 3 dpkg.changelog > dpkg.change +testfileequal 'dpkg.change' "$(apthelper cat-file 'rootdir/usr/share/doc/dpkg/changelog' | head -n 3)" +rm -f dpkg.change dpkg.changelog + +# no package specified +testfailureequal 'E: No packages found' aptget changelog +testfailureequal 'E: Unable to locate package clclclclc +E: No packages found' aptget changelog clclclclc diff --git a/test/integration/test-apt-get-clean b/test/integration/test-apt-get-clean new file mode 100755 index 0000000..d050732 --- /dev/null +++ b/test/integration/test-apt-get-clean @@ -0,0 +1,88 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'unstable' 'foo' 'all' '2' +insertpackage 'experimental' 'foo' 'all' '1:1' +insertinstalledpackage 'foo' 'all' '3' + +setupaptarchive --no-update + +mkdir -p rootdir/var/lib/apt/lists/lost+found +testsuccess apt update + +# nothing to do always works +testsuccess aptget clean +testsuccess aptget clean -s + +# generate some dirt and clean it up +generatedirt() { + touch rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en + mkdir -p rootdir/var/cache/apt/archives/lost+found + touch rootdir/var/cache/apt/archives/foo_1_all.deb + touch rootdir/var/cache/apt/archives/foo_1%3a1_all.deb + touch rootdir/var/cache/apt/archives/foo_2%3a1_all.deb + touch rootdir/var/cache/apt/archives/foo_2_all.deb + touch rootdir/var/cache/apt/archives/foo_3_all.deb + touch rootdir/var/cache/apt/archives/foo_4_all.deb +} + +generatedirt +testsuccess aptget autoclean +testsuccess test -e rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en +testsuccess test -e rootdir/var/cache/apt/archives/foo_1_all.deb +testsuccess test -e rootdir/var/cache/apt/archives/foo_1%3a1_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_2%3a1_all.deb +testsuccess test -e rootdir/var/cache/apt/archives/foo_2_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_3_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_4_all.deb + +generatedirt +testsuccess aptget clean +testfailure test -e rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en +testfailure test -e rootdir/var/cache/apt/archives/foo_1_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_1%3a1_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_2%3a1_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_2_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_3_all.deb +testfailure test -e rootdir/var/cache/apt/archives/foo_4_all.deb + +if [ "$(id -u)" != '0' ]; then + msgmsg 'No clean if lock can not be acquired' + touch rootdir/var/cache/apt/archives/foo_4_all.deb + touch rootdir/var/cache/apt/archives/lock + chmod 444 rootdir/var/cache/apt/archives/lock + testfailure apt clean + testsuccess test -e rootdir/var/cache/apt/archives/foo_4_all.deb + chmod 644 rootdir/var/cache/apt/archives/lock +fi + +directorygone() { + rm -rf "$1" + testsuccess apt autoclean + testfailure test -d "$1" + testsuccess apt clean + # clean creates an empty partial directory via GetLock + if [ "$(basename "$1")" = 'partial' ]; then + testsuccess test -d "$1" + else + testfailure test -d "$1" + fi +} +msgmsg 'Partial directory missing' +directorygone 'rootdir/var/cache/apt/archives/partial' +directorygone 'rootdir/var/lib/apt/lists/partial' + +msgmsg 'Archives directory missing' +directorygone 'rootdir/var/cache/apt/archives' +directorygone 'rootdir/var/lib/apt/lists' + +msgmsg 'apt directory missing' +directorygone 'rootdir/var/cache/apt' +directorygone 'rootdir/var/lib/apt' diff --git a/test/integration/test-apt-get-download b/test/integration/test-apt-get-download new file mode 100755 index 0000000..fc0e6cf --- /dev/null +++ b/test/integration/test-apt-get-download @@ -0,0 +1,113 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" +confighashes 'SHA512' + +buildsimplenativepackage 'apt' 'all' '1.0' 'stable' +buildsimplenativepackage 'apt' 'all' '2.0' 'unstable' +insertinstalledpackage 'vrms' 'all' '1.0' + +addtrap 'prefix' "umask $(umask);" +umask 0027 +setupaptarchive --no-update + +# directories should be readable by everyone +find aptarchive/dists -type d | while read dir; do + chmod o+rx "$dir" +done +# apt-ftparchive knows how to chmod files +find aptarchive/dists -name '*Packages*' -type f | while read file; do + testaccessrights "$file" '644' + chmod 640 "$file" +done +# created by the framework without special care +find aptarchive/dists -name '*Release*' -type f | while read file; do + testaccessrights "$file" '640' +done +if [ "$(id -u)" = '0' ]; then + # Release file can't be accessed by _apt + testsuccesswithnotice aptget update +fi + +#everything (too) permissive +find aptarchive/ -type f | while read file; do + chmod 777 "$file" +done +find incoming/ -type f | while read file; do + chmod 777 "$file" +done +testsuccess aptget update + +testdownload() { + local DEB="$1" + shift + msgtest "Test download of package file $DEB with" "$@" + testsuccess --nomsg aptget download "$@" -o Debug::pkgAcquire::Worker=1 -o Debug::pkgAcquire::Auth=1 + testsuccess test -f "$DEB" + testaccessrights "$DEB" '644' + rm -f "$DEB" +} + +# normal case as "root" +OLDPWD="$(pwd)" +cd downloaded +testdownload apt_2.0_all.deb apt +cd "$OLDPWD" + +# simulate normal user with non-existent root-owned directories +rm -rf rootdir/var/cache/apt/archives/ +mkdir rootdir/var/cache/apt/archives/ +addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/var/cache/apt/archives || true;" +chmod -R -w rootdir/var/cache/apt/archives + +OLDPWD="$(pwd)" +cd downloaded + +# normal case(es) +testdownload apt_1.0_all.deb apt/stable +testdownload apt_2.0_all.deb apt + +DEBFILE="$(readlink -f ../aptarchive)/pool/apt_2.0_all.deb" +testequal "'file://${DEBFILE}' apt_2.0_all.deb $(stat -c%s "$DEBFILE") SHA512:$(sha512sum "$DEBFILE" | cut -d' ' -f 1)" aptget download apt --print-uris + +# deb:677887 +testequal "E: Can't find a source to download version '1.0' of 'vrms:i386'" aptget download vrms --print-uris +testequal "E: Can't find a source to download version '1.0' of 'vrms:i386'" aptget download vrms + +# deb:736962 +testsuccess aptget download apt +testsuccess test -s apt_2.0_all.deb +testaccessrights 'apt_2.0_all.deb' '644' +testsuccess aptget download apt +testsuccess test -s apt_2.0_all.deb +testaccessrights 'apt_2.0_all.deb' '644' + +rm -f apt_1.0_all.deb apt_2.0_all.deb + +# deb:738103 +testdownload apt_2.0_all.deb apt apt apt/unstable apt=2.0 + +# FIXME: pick up already downloaded deb files for real +# restore "root" rights +#cd "$OLDPWD" +#chmod -f -R +w "$PWD/rootdir/var/cache/apt/archives" +#rm -rf rootdir/var/cache/apt/archives/ + +# file: debs aren't copied to archives, so change to http which obviously are +#changetowebserver +#testsuccess aptget update + +# test with already stored deb +#testsuccess aptget install -d apt +#testsuccess test -s rootdir/var/cache/apt/archives/apt_2.0_all.deb +#testaccessrights 'rootdir/var/cache/apt/archives/apt_2.0_all.deb' '644' +#mv aptarchive/pool/apt_2.0_all.deb aptarchive/pool/apt_2.0_all.deb.gone +#cd downloaded +#testdownload apt_2.0_all.deb apt +#cd "$OLDPWD" +#mv aptarchive/pool/apt_2.0_all.deb.gone aptarchive/pool/apt_2.0_all.deb diff --git a/test/integration/test-apt-get-install-deb b/test/integration/test-apt-get-install-deb new file mode 100755 index 0000000..844f1d7 --- /dev/null +++ b/test/integration/test-apt-get-install-deb @@ -0,0 +1,245 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +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: Sub-process Popen returned an error code (2) +E: Encountered a section with no Package: header +E: Problem with MergeList ${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' + +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 + +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' '' ' + +' + +echo 'Package: /pkg-/ +Pin: release a=experimental +Pin-Priority: 501' > rootdir/etc/apt/preferences.d/pinit + +testsuccess aptget install ./incoming/pkg-as-it-should-be_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_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 +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 +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_all.ddeb +testsuccess aptget install -y ./incoming/pkg-as-it-should-be_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_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' diff --git a/test/integration/test-apt-get-install-virtual-pkgs b/test/integration/test-apt-get-install-virtual-pkgs new file mode 100755 index 0000000..b2fd749 --- /dev/null +++ b/test/integration/test-apt-get-install-virtual-pkgs @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable' 'foo' 'amd64' '1' 'Provides: foo-prv' + +insertpackage 'unstable' 'baz1' 'amd64' '1' 'Provides: foo-prv1' +insertpackage 'unstable' 'foo1' 'amd64' '1' 'Provides: foo-prv1' + +insertpackage 'unstable' 'baz2' 'amd64' '1' 'Provides: foo-prv2' +insertpackage 'unstable' 'foo2' 'amd64' '2' 'Provides: foo-prv2:amd64' + +insertpackage 'unstable' 'baz3' 'amd64' '1' 'Provides: foo-prv3' +insertpackage 'unstable' 'foo3' 'i386' '2' 'Provides: foo-prv3:amd64' + +insertpackage 'unstable' 'baz4' 'amd64' '1' 'Provides: foo-prv4:amd64' +insertpackage 'unstable' 'foo4' 'i386' '2' 'Provides: foo-prv4:amd64' + +insertpackage 'experimental' 'baz5' 'amd64' '1' 'Provides: foo-prv5:amd64' +insertpackage 'experimental' 'foo5' 'i386' '2' 'Provides: foo-prv5:amd64' + +setupaptarchive + +testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'foo' instead of 'foo-prv' +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [amd64]) +Conf foo (1 unstable [amd64])" aptget install foo-prv -s + +testvirtuals() { + testfailureequal "Reading package lists... +Building dependency tree... +Package $1 is a virtual package provided by: + $3 + $2 +You should explicitly select one to install. + +E: Package '$1' has no installation candidate" aptget install $1 -s +} + +testvirtuals 'foo-prv1' 'baz1 1' 'foo1 1' +testvirtuals 'foo-prv2' 'baz2 1' 'foo2 2' +testvirtuals 'foo-prv3' 'baz3 1' 'foo3:i386 2' +testvirtuals 'foo-prv4' 'baz4 1' 'foo4:i386 2' +testvirtuals 'foo-prv5' 'baz5 1' 'foo5:i386 2' + +echo 'Package: * +Pin: release a=experimental +Pin-Priority: -1' > rootdir/etc/apt/preferences.d/experimental.pref + +testfailureequal "Reading package lists... +Building dependency tree... +Package foo-prv5 is a virtual package provided by: + foo5:i386 2 [Not candidate version] + baz5 1 [Not candidate version] + +E: Package 'foo-prv5' has no installation candidate" aptget install foo-prv5 -s diff --git a/test/integration/test-apt-get-source-arch b/test/integration/test-apt-get-source-arch new file mode 100755 index 0000000..ca586f4 --- /dev/null +++ b/test/integration/test-apt-get-source-arch @@ -0,0 +1,68 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" "amd64" + + +# different version for the individual arches +insertpackage 'stable' 'foo' 'amd64' '1.0' +insertsource 'stable' 'foo' 'amd64' '1.0' + +insertpackage 'stable' 'foo' 'i386' '1.0' +insertsource 'stable' 'foo' 'i386' '1.0' +insertpackage 'stable' 'foo' 'i386' '2.0' +insertsource 'stable' 'foo' 'i386' '2.0' + +insertpackage 'oldstable' 'foo' 'i386' '0.1' +insertsource 'oldstable' 'foo' 'i386' '0.1' +# just needed so that there is a release file entry for the test +insertpackage 'oldstable' 'unreleated' 'amd64' '0.1' + +setupaptarchive + +APTARCHIVE=$(readlink -f ./aptarchive) + +HEADER='Reading package lists...' +DOWNLOAD10="Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/foo_1.0.dsc' foo_1.0.dsc 11 SHA256:ed7c25c832596339bee13e4e7c45cf49f869b60d2bf57252f18191d75866c2a7 +'file://${APTARCHIVE}/foo_1.0.tar.gz' foo_1.0.tar.gz 14 SHA256:f3da8c6ebc62c8ef2dae439a498dddcdacc1a07f45ff67ad12f44b6e2353c239" + +# pick :amd64 +testsuccessequal "$HEADER +$DOWNLOAD10" aptget source -q --print-uris foo:amd64 + +# pick :i386 +testsuccessequal "$HEADER +Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/foo_2.0.dsc' foo_2.0.dsc 11 SHA256:0fcb803ffbeef26db884625aaf06e75f3eda5c994634980e7c20fd37ed1fc104 +'file://${APTARCHIVE}/foo_2.0.tar.gz' foo_2.0.tar.gz 14 SHA256:ca9b0b828ca22372502af2b80f61f0bd9063910ece9fc34eeaf9d9e31aa8195a" aptget source -q --print-uris foo:i386 + +# pick :i386 by release +testsuccessequal "$HEADER +Selected version '0.1' (oldstable) for foo +Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/foo_0.1.dsc' foo_0.1.dsc 11 SHA256:72af24b0290fe1d13a3e25fddd2633e43c87ff79d249bc850009e47bcce73565 +'file://${APTARCHIVE}/foo_0.1.tar.gz' foo_0.1.tar.gz 14 SHA256:ec748ad88a71f98bfdc012e1a7632377d05fe3ebbf9c0922e0691fe4d79c0585" aptget source -q --print-uris foo:i386/oldstable + +# pick :i386 by version +testsuccessequal "$HEADER +$DOWNLOAD10" aptget source -q --print-uris foo:i386=1.0 + +# error on unknown arch +testfailureequal "$HEADER +E: Can not find a package for architecture 'not-a-available-arch' +E: Unable to find a source package for foo:not-a-available-arch" aptget source -q --print-uris foo:not-a-available-arch + +# error on unavailable version for arch +testfailureequal "$HEADER +E: Can not find a package 'foo:amd64' with version '2.0' +E: Unable to find a source package for foo:amd64=2.0" aptget source -q --print-uris foo:amd64=2.0 + +# error on unavailable release for arch +testfailureequal "$HEADER +E: Can not find a package 'foo:amd64' with release 'oldstable' +E: Unable to find a source package for foo:amd64/oldstable" aptget source -q --print-uris foo:amd64/oldstable diff --git a/test/integration/test-apt-get-source-authenticated b/test/integration/test-apt-get-source-authenticated new file mode 100755 index 0000000..d5a4fac --- /dev/null +++ b/test/integration/test-apt-get-source-authenticated @@ -0,0 +1,33 @@ +#!/bin/sh +# +# Regression test for debian bug #749795. Ensure that we fail with +# an error if apt-get source foo will download a source that comes +# from an unauthenticated repository +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +# a "normal" package with source and binary +buildsimplenativepackage 'foo' 'all' '2.0' + +setupaptarchive --no-update + +APTARCHIVE="$(readlink -f ./aptarchive)" +find "$APTARCHIVE/dists/unstable" -name '*Release*' -delete + +# update without authenticated InRelease file +testwarning aptget update --allow-insecure-repositories + +# this all should fail +testfailure aptget install -y foo +cd downloaded +testfailure aptget source foo +testfailure test -e foo_2.0.dsc +# allow overriding the warning +testsuccess aptget source --allow-unauthenticated foo -o Debug::pkgAcquire::Worker=1 +testsuccess test -s foo_2.0.dsc -a -L foo_2.0.dsc diff --git a/test/integration/test-apt-get-source-multisources b/test/integration/test-apt-get-source-multisources new file mode 100755 index 0000000..06fe196 --- /dev/null +++ b/test/integration/test-apt-get-source-multisources @@ -0,0 +1,29 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'armhf' + +insertsource 'unstable' 'adduser' 'all' '3.113+nmu3' +insertsource 'stable' 'python-fll' 'all' '0.9.11' + +insertpackage 'unstable' 'adduser' 'all' '3.113+nmu3' +insertpackage 'stable' 'python-fll' 'all' '0.9.11' + +setupaptarchive + +APTARCHIVE=$(readlink -f ./aptarchive) + +HEADER='Reading package lists...' +testsuccessequal "$HEADER +Need to get 0 B/43 B of source archives. +'file://${APTARCHIVE}/adduser_3.113+nmu3.dsc' adduser_3.113+nmu3.dsc 22 SHA256:19cc1abe85063976bf71c033f62f3e6bf6621647fe44a6ee31ed687e3fa5cbb7 +'file://${APTARCHIVE}/python-fll_0.9.11.dsc' python-fll_0.9.11.dsc 21 SHA256:51429e835ded66abf6bbc157865af29920435e74aea2836ba1f46443feae9285" aptget source -qdy --print-uris --dsc-only adduser=3.113 python-fll=0.9.11 + +testsuccessequal "$HEADER +Need to get 0 B/43 B of source archives. +'file://${APTARCHIVE}/python-fll_0.9.11.dsc' python-fll_0.9.11.dsc 21 SHA256:51429e835ded66abf6bbc157865af29920435e74aea2836ba1f46443feae9285 +'file://${APTARCHIVE}/adduser_3.113+nmu3.dsc' adduser_3.113+nmu3.dsc 22 SHA256:19cc1abe85063976bf71c033f62f3e6bf6621647fe44a6ee31ed687e3fa5cbb7" aptget source -qdy --print-uris --dsc-only python-fll=0.9.11 adduser=3.113 diff --git a/test/integration/test-apt-get-update-sourceslist-warning b/test/integration/test-apt-get-update-sourceslist-warning new file mode 100755 index 0000000..a99356b --- /dev/null +++ b/test/integration/test-apt-get-update-sourceslist-warning @@ -0,0 +1,45 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' +setupaptarchive --no-update + +testsuccess apt update +testsuccess apt update --no-download + +echo 'deb ftp://ftp.tlh.debian.org/debian zurg main' > rootdir/etc/apt/sources.list.d/ftpshutdown.list +cat > rootdir/var/lib/apt/lists/ftp.tlh.debian.org_debian_dists_zurg_Release <<EOF +Origin: Debian +Label: Debian +Suite: unreleased +Codename: zurg +Date: Fri, 14 Jul 2017 11:34:35 +0000 +Architectures: amd64 +Components: main +Description: Debian x.y Zurg - Not Released +EOF +chmod 644 rootdir/var/lib/apt/lists/ftp.tlh.debian.org_debian_dists_zurg_Release + +testwarningequal "Reading package lists... +Building dependency tree... +All packages are up to date. +W: Debian shuts down public FTP services currently still used in your sources.list(5) as 'ftp://ftp.tlh.debian.org/debian/'. + See press release https://debian.org/News/2017/20170425 for details." apt update --no-download + + +echo 'deb http://apt:debian@ftp.tlh.debian.org/debian zurg main' > rootdir/etc/apt/sources.list.d/ftpshutdown.list +testsuccessequal "Reading package lists... +Building dependency tree... +All packages are up to date. +N: Usage of apt_auth.conf(5) should be preferred over embedding login information directly in the sources.list(5) entry for 'http://ftp.tlh.debian.org/debian'" apt update --no-download + + +echo 'deb tor+https://apt:debian@ftp.tlh.debian.org/debian zurg main' > rootdir/etc/apt/sources.list.d/ftpshutdown.list +testsuccessequal "Reading package lists... +Building dependency tree... +All packages are up to date. +N: Usage of apt_auth.conf(5) should be preferred over embedding login information directly in the sources.list(5) entry for 'tor+https://ftp.tlh.debian.org/debian'" apt update --no-download diff --git a/test/integration/test-apt-get-update-unauth-warning b/test/integration/test-apt-get-update-unauth-warning new file mode 100755 index 0000000..a0d7a59 --- /dev/null +++ b/test/integration/test-apt-get-update-unauth-warning @@ -0,0 +1,94 @@ +#!/bin/sh +# +# ensure we print warnings for unauthenticated repositories +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" +configcompression '.' 'gz' + +echo 'Acquire::Progress::Ignore::ShowErrorText "false";' > rootdir/etc/apt/apt.conf.d/99show-no-ignore-errors.conf + +# a "normal" package with source and binary +buildsimplenativepackage 'foo' 'all' '2.0' + +setupaptarchive --no-update + +APTARCHIVE="$(readlink -f ./aptarchive)" +find "$APTARCHIVE/dists/unstable" \( -name 'InRelease' -o -name 'Release.gpg' \) -delete +sed -i -n '/^SHA1:$/q;p' "${APTARCHIVE}/dists/unstable/Release" +testfailure aptget update +testwarning aptget update --allow-insecure-repositories + + +rm -rf rootdir/var/lib/apt/lists +find "$APTARCHIVE/dists/unstable" -name '*Release*' -delete +# update without authenticated files leads to warning +testfailureequal "Get:1 file:$APTARCHIVE unstable InRelease +Ign:1 file:$APTARCHIVE unstable InRelease +Get:2 file:$APTARCHIVE unstable Release +Err:2 file:$APTARCHIVE unstable Release + File not found - ${APTARCHIVE}/dists/unstable/Release (2: No such file or directory) +Reading package lists... +E: The repository 'file:$APTARCHIVE unstable Release' does not have a Release file. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update + +# no package foo +testsuccessequal 'Listing...' apt list foo +testequal 'auxfiles +lock +partial' ls rootdir/var/lib/apt/lists + +filesize() { + local CREATEDBY="$1" + shift + stat -c%s "$(aptget indextargets --no-release-info --format '$(URI)' "Created-By: $CREATEDBY" "$@" | cut -d'/' -f 3- ).gz" +} +# allow override +#aptget update --allow-insecure-repositories -o Debug::pkgAcquire::worker=1 +#exit +testwarningequal "Get:1 file:$APTARCHIVE unstable InRelease +Ign:1 file:$APTARCHIVE unstable InRelease +Get:2 file:$APTARCHIVE unstable Release +Ign:2 file:$APTARCHIVE unstable Release +Get:3 file:$APTARCHIVE unstable/main Sources +Ign:3 file:$APTARCHIVE unstable/main Sources +Get:4 file:$APTARCHIVE unstable/main i386 Packages +Ign:4 file:$APTARCHIVE unstable/main i386 Packages +Get:5 file:$APTARCHIVE unstable/main all Packages +Ign:5 file:$APTARCHIVE unstable/main all Packages +Get:6 file:$APTARCHIVE unstable/main Translation-en +Ign:6 file:$APTARCHIVE unstable/main Translation-en +Get:3 file:$APTARCHIVE unstable/main Sources +Ign:3 file:$APTARCHIVE unstable/main Sources +Get:4 file:$APTARCHIVE unstable/main i386 Packages +Ign:4 file:$APTARCHIVE unstable/main i386 Packages +Get:5 file:$APTARCHIVE unstable/main all Packages +Ign:5 file:$APTARCHIVE unstable/main all Packages +Get:6 file:$APTARCHIVE unstable/main Translation-en +Ign:6 file:$APTARCHIVE unstable/main Translation-en +Get:3 file:$APTARCHIVE unstable/main Sources +Ign:3 file:$APTARCHIVE unstable/main Sources +Get:4 file:$APTARCHIVE unstable/main i386 Packages +Ign:4 file:$APTARCHIVE unstable/main i386 Packages +Get:5 file:$APTARCHIVE unstable/main all Packages +Ign:5 file:$APTARCHIVE unstable/main all Packages +Get:6 file:$APTARCHIVE unstable/main Translation-en +Ign:6 file:$APTARCHIVE unstable/main Translation-en +Get:3 file:$APTARCHIVE unstable/main Sources [$(filesize 'Sources') B] +Get:4 file:$APTARCHIVE unstable/main i386 Packages [$(filesize 'Packages' 'Architecture: i386') B] +Get:5 file:$APTARCHIVE unstable/main all Packages [$(filesize 'Packages' 'Architecture: all') B] +Get:6 file:$APTARCHIVE unstable/main Translation-en [$(filesize 'Translations') B] +Reading package lists... +W: The repository 'file:$APTARCHIVE unstable Release' does not have a Release file. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update --allow-insecure-repositories +# ensure we can not install the package +testfailureequal "WARNING: The following packages cannot be authenticated! + foo +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y foo diff --git a/test/integration/test-apt-get-upgrade b/test/integration/test-apt-get-upgrade new file mode 100755 index 0000000..50a90ce --- /dev/null +++ b/test/integration/test-apt-get-upgrade @@ -0,0 +1,144 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +# simple case +insertpackage 'stable,installed' 'upgrade-simple' 'all' '1.0' +insertpackage 'unstable' 'upgrade-simple' 'all' '2.0' + +# upgrade with a new dependency +insertpackage 'stable,installed' 'upgrade-with-new-dep' 'all' '1.0' +insertpackage 'unstable' 'upgrade-with-new-dep' 'all' '2.0' 'Depends: new-dep' +insertpackage 'stable' 'new-dep' 'all' '1.0' + +# upgrade with conflict and a new pkg with higher priority than conflict +insertpackage 'stable,installed' 'upgrade-with-conflict' 'all' '1.0' +insertpackage 'unstable' 'upgrade-with-conflict' 'all' '2.0' 'Conflicts: conflicting-dep' 'standard' +insertpackage 'stable,installed' 'conflicting-dep' 'all' '1.0' + +# upgrade with conflict and a new pkg with higher priority than conflict +insertpackage 'stable,installed' 'init' 'all' '1' +insertpackage 'unstable' 'init' 'all' '2' 'Pre-Depends: systemd | sysvinit' +insertpackage 'unstable' 'systemd' 'all' '2' 'Conflicts: conflicting-dep' +insertpackage 'unstable' 'sysvinit' 'all' '2' + +setupaptarchive + +# Test if normal upgrade works as expected +UPGRADE='Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + init upgrade-with-conflict upgrade-with-new-dep +The following packages will be upgraded: + upgrade-simple +1 upgraded, 0 newly installed, 0 to remove and 3 not upgraded. +Inst upgrade-simple [1.0] (2.0 unstable [all]) +Conf upgrade-simple (2.0 unstable [all])' +testsuccessequal "$UPGRADE" aptget upgrade -s +testsuccessequal "$UPGRADE" apt upgrade -s --without-new-pkgs + +# Test if apt-get upgrade --with-new-pkgs works +UPGRADENEW='Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + new-dep +The following packages have been kept back: + init upgrade-with-conflict +The following packages will be upgraded: + upgrade-simple upgrade-with-new-dep +2 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst new-dep (1.0 stable [all]) +Inst upgrade-simple [1.0] (2.0 unstable [all]) +Inst upgrade-with-new-dep [1.0] (2.0 unstable [all]) +Conf new-dep (1.0 stable [all]) +Conf upgrade-simple (2.0 unstable [all]) +Conf upgrade-with-new-dep (2.0 unstable [all])' +testsuccessequal "$UPGRADENEW" aptget upgrade -s --with-new-pkgs +testsuccessequal "$UPGRADENEW" apt upgrade -s + +# Test if apt-get dist-upgrade works +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + conflicting-dep +The following NEW packages will be installed: + new-dep systemd +The following packages will be upgraded: + init upgrade-simple upgrade-with-conflict upgrade-with-new-dep +4 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv conflicting-dep [1.0] +Inst systemd (2 unstable [all]) +Conf systemd (2 unstable [all]) +Inst init [1] (2 unstable [all]) +Inst upgrade-with-conflict [1.0] (2.0 unstable [all]) +Inst new-dep (1.0 stable [all]) +Inst upgrade-simple [1.0] (2.0 unstable [all]) +Inst upgrade-with-new-dep [1.0] (2.0 unstable [all]) +Conf init (2 unstable [all]) +Conf upgrade-with-conflict (2.0 unstable [all]) +Conf new-dep (1.0 stable [all]) +Conf upgrade-simple (2.0 unstable [all]) +Conf upgrade-with-new-dep (2.0 unstable [all])' aptget -s dist-upgrade + +msgmsg 'make systemd a non-choice in the or-group and try again' +echo 'Package: systemd +Pin: release unstable +Pin-Priority: -1' > rootdir/etc/apt/preferences.d/nosystemd.pref + +testsuccessequal "$UPGRADE" aptget upgrade -s +testsuccessequal "$UPGRADE" apt upgrade -s --without-new-pkgs + +UPGRADENEW='Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + new-dep sysvinit +The following packages have been kept back: + upgrade-with-conflict +The following packages will be upgraded: + init upgrade-simple upgrade-with-new-dep +3 upgraded, 2 newly installed, 0 to remove and 1 not upgraded. +Inst sysvinit (2 unstable [all]) +Conf sysvinit (2 unstable [all]) +Inst init [1] (2 unstable [all]) +Inst new-dep (1.0 stable [all]) +Inst upgrade-simple [1.0] (2.0 unstable [all]) +Inst upgrade-with-new-dep [1.0] (2.0 unstable [all]) +Conf init (2 unstable [all]) +Conf new-dep (1.0 stable [all]) +Conf upgrade-simple (2.0 unstable [all]) +Conf upgrade-with-new-dep (2.0 unstable [all])' +testsuccessequal "$UPGRADENEW" aptget upgrade -s --with-new-pkgs +testsuccessequal "$UPGRADENEW" apt upgrade -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + conflicting-dep +The following NEW packages will be installed: + new-dep sysvinit +The following packages will be upgraded: + init upgrade-simple upgrade-with-conflict upgrade-with-new-dep +4 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv conflicting-dep [1.0] +Inst sysvinit (2 unstable [all]) +Conf sysvinit (2 unstable [all]) +Inst init [1] (2 unstable [all]) +Inst upgrade-with-conflict [1.0] (2.0 unstable [all]) +Inst new-dep (1.0 stable [all]) +Inst upgrade-simple [1.0] (2.0 unstable [all]) +Inst upgrade-with-new-dep [1.0] (2.0 unstable [all]) +Conf init (2 unstable [all]) +Conf upgrade-with-conflict (2.0 unstable [all]) +Conf new-dep (1.0 stable [all]) +Conf upgrade-simple (2.0 unstable [all]) +Conf upgrade-with-new-dep (2.0 unstable [all])' aptget -s dist-upgrade diff --git a/test/integration/test-apt-helper b/test/integration/test-apt-helper new file mode 100755 index 0000000..ae1ca74 --- /dev/null +++ b/test/integration/test-apt-helper @@ -0,0 +1,132 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +changetohttpswebserver + +echo 'foo' > aptarchive/foo +echo 'bar' > aptarchive/foo2 + +test_apt_helper_download() { + msgmsg 'Test with' "$1" + + msgtest 'apt-file download-file' 'md5sum' + testsuccess --nomsg apthelper download-file "${1}/foo" './downloaded/foo2' 'MD5Sum:d3b07384d113edec49eaa6238ad5ff00' + testfileequal ./downloaded/foo2 'foo' + + msgtest 'apt-file download-file' 'sha1' + testsuccess --nomsg apthelper download-file "${1}/foo" './downloaded/foo1' 'SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15' + testfileequal ./downloaded/foo1 'foo' + + msgtest 'apt-file download-file' 'sha256' + testsuccess --nomsg apthelper download-file "${1}/foo" './downloaded/foo3' 'SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c' + testfileequal ./downloaded/foo3 'foo' + + msgtest 'apt-file download-file' 'no-hash' + testsuccess --nomsg apthelper download-file "${1}/foo" './downloaded/foo4' + testfileequal ./downloaded/foo4 'foo' + + msgtest 'apt-file download-file' 'wrong md5sum' + testfailure --nomsg apthelper -qq download-file "${1}/foo" './downloaded/foo5' 'MD5Sum:aabbcc' + testfileequal rootdir/tmp/testfailure.output "E: Failed to fetch ${1}/foo Hash Sum mismatch + Hashes of expected file: + - MD5Sum:aabbcc [weak] + Hashes of received file: + - SHA512:0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6 + - SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c + - SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 [weak] + - MD5Sum:d3b07384d113edec49eaa6238ad5ff00 [weak] + - Filesize:4 [weak] + Last modification reported: $(lastmodification 'aptarchive/foo') +E: Download Failed" + testfileequal ./downloaded/foo5.FAILED 'foo' + + msgtest 'apt-file download-file' 'wrong sha256' + testfailure --nomsg apthelper -qq download-file "${1}/foo" './downloaded/foo6' 'SHA256:aabbcc' + testfileequal rootdir/tmp/testfailure.output "E: Failed to fetch ${1}/foo Hash Sum mismatch + Hashes of expected file: + - SHA256:aabbcc + Hashes of received file: + - SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c + - Filesize:4 [weak] + Last modification reported: $(lastmodification 'aptarchive/foo') +E: Download Failed" + testfileequal './downloaded/foo6.FAILED' 'foo' + + msgtest 'apt-file download-file' 'sha256 sha1' + testsuccess --nomsg apthelper download-file "${1}/foo" './downloaded/foo8' 'SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c' \ + "${1}/foo2" './downloaded/foo7' 'SHA1:e242ed3bffccdf271b7fbaf34ed72d089537b42f' + testfileequal './downloaded/foo8' 'foo' + testfileequal './downloaded/foo7' 'bar' + + msgtest 'apt-file download-file' 'md5sum sha1' + testsuccess --nomsg apthelper download-file "${1}/foo" './downloaded/foo9' 'MD5Sum:d3b07384d113edec49eaa6238ad5ff00' \ + "${1}/foo2" './downloaded/foo10' 'SHA1:e242ed3bffccdf271b7fbaf34ed72d089537b42f' + testfileequal './downloaded/foo9' 'foo' + testfileequal './downloaded/foo10' 'bar' +} + +setupproxydetect() { + local METH="$1" + shift + { + echo '#!/bin/sh -e' + echo "$@" + } > "${TMPWORKINGDIRECTORY}/apt-proxy-detect" + chmod 755 "${TMPWORKINGDIRECTORY}/apt-proxy-detect" + echo "Acquire::${METH}::${CONFNAME} \"${TMPWORKINGDIRECTORY}/apt-proxy-detect\";" > rootdir/etc/apt/apt.conf.d/02proxy-detect +} + +test_apt_helper_detect_proxy() { + msgmsg "apt-helper $CONFNAME" 'no proxy' + testsuccessequal "Using proxy '' for URL 'http://example.com/'" apthelper auto-detect-proxy http://example.com/ + setupproxydetect 'http' 'exit 0' + testsuccessequal "Using proxy '' for URL 'http://example.com/'" apthelper auto-detect-proxy http://example.com/ + setupproxydetect 'http' 'exit 1' + testfailureequal 'E: Sub-process ProxyAutoDetect returned an error code (1)' apthelper auto-detect-proxy http://example.com/ + setupproxydetect 'http' 'echo' + testwarningequal "Using proxy '' for URL 'http://example.com/' +W: ProxyAutoDetect command returned an empty line" apthelper auto-detect-proxy http://example.com/ + setupproxydetect 'http' 'echo DIRECT' + testsuccessequal "Using proxy 'DIRECT' for URL 'http://example.com/'" apthelper auto-detect-proxy http://example.com/ + chmod -x "${TMPWORKINGDIRECTORY}/apt-proxy-detect" + testfailureequal "E: ProxyAutoDetect command '${TMPWORKINGDIRECTORY}/apt-proxy-detect' can not be executed! - access (13: Permission denied)" apthelper auto-detect-proxy http://example.com/ + + msgmsg "apt-helper $CONFNAME" 'http proxy' + setupproxydetect 'http' 'echo "http://some-proxy"' + testsuccessequal "Using proxy 'http://some-proxy' for URL 'http://www.example.com/'" apthelper auto-detect-proxy http://www.example.com + testsuccessequal "Using proxy '' for URL 'https://ssl.example.com/'" apthelper auto-detect-proxy https://ssl.example.com + + msgmsg "apt-helper $CONFNAME" 'https proxy' + setupproxydetect 'https' 'echo "https://https-proxy"' + testsuccessequal "Using proxy '' for URL 'http://no-ssl.example.com/'" apthelper auto-detect-proxy http://no-ssl.example.com + testsuccessequal "Using proxy 'https://https-proxy' for URL 'https://ssl.example.com/'" apthelper auto-detect-proxy https://ssl.example.com + rm -f rootdir/etc/apt/apt.conf.d/02proxy-detect "${TMPWORKINGDIRECTORY}/apt-proxy-detect" +} + +test_apt_helper_download "http://localhost:${APTHTTPPORT}" +test_apt_helper_download "https://localhost:${APTHTTPSPORT}" +for CONFNAME in 'ProxyAutoDetect' 'Proxy-Auto-Detect' ; do + test_apt_helper_detect_proxy +done +msgmsg 'test various failure modes' +testfailureequal 'E: Invalid operation download' apthelper download +testfailureequal 'E: Must specify at least one pair url/filename' apthelper download-file +testfailureequal 'E: Must specify at least one pair url/filename' apthelper download-file 'http://example.org/' +testfailureequal 'E: Need one URL as argument' apthelper auto-detect-proxy +testfailureequal 'E: Must specify at least one SRV record' apthelper srv-lookup +testfailureequal 'E: GetSrvRec failed for localhost' apthelper -q=1 srv-lookup 'localhost' +testfailureequal "E: GetSrvRec failed for localhost:${APTHTTPPORT}" apthelper -q=1 srv-lookup "localhost:${APTHTTPPORT}" +testfailureequal "E: GetSrvRec failed for localhost:${APTHTTPSPORT}" apthelper -q=1 srv-lookup "localhost:${APTHTTPSPORT}" + +msgmsg 'apt-helper' 'drop-privs' +testfailureequal "E: No command given to run without privileges" apthelper drop-privs +testsuccess apthelper -- drop-privs true +testsuccess apthelper drop-privs -- true +DATE="$(date -u +'%Y-%m-%d')" +testsuccessequal "$DATE" apthelper drop-privs -- date -u -d "$DATE" +'%Y-%m-%d' diff --git a/test/integration/test-apt-helper-cat-file b/test/integration/test-apt-helper-cat-file new file mode 100755 index 0000000..a53a6b4 --- /dev/null +++ b/test/integration/test-apt-helper-cat-file @@ -0,0 +1,46 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment + +TESTTOOL="${BUILDDIRECTORY}/../test/interactive-helper/test_fileutl" +msgtest 'Check if we have build the test tool' "$TESTTOOL" +if [ -x "$TESTTOOL" ]; then + msgpass +else + msgskip 'not available' + exit 0 +fi + +cat >rootdir/etc/apt/apt.conf.d/rev-as-compressor <<EOF +APT::Compressor::rev { + Name "rev"; + Extension ".rev"; + Binary "rev"; + Cost "1"; +}; +EOF + +configcompression 'ALL' +cat >./test.txt <<EOF +This is a test. +EOF + +compressfile ./test.txt +while read compressor extension command; do + if [ "$compressor" = '.' ]; then + FILE='./test.txt' + else + FILE="./test.txt.${extension}" + fi + if [ -d /proc/self/fd ]; then + testsuccess runapt "${TESTTOOL}" "$FILE" + testequal '3' grep -c '/test.txt' rootdir/tmp/testsuccess.output + else + msgtest 'Test if /proc interface is available' + msgskip 'seems not' + fi + testsuccessequal "$(cat ./test.txt)" apthelper cat-file "$FILE" +done < "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" diff --git a/test/integration/test-apt-https-no-redirect b/test/integration/test-apt-https-no-redirect new file mode 100755 index 0000000..1c38809 --- /dev/null +++ b/test/integration/test-apt-https-no-redirect @@ -0,0 +1,48 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +insertpackage 'stable' 'apt' 'all' '1' +setupaptarchive --no-update + +echo 'alright' > aptarchive/working +changetohttpswebserver +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "http://localhost:${APTHTTPPORT}/" +webserverconfig 'aptwebserver::redirect::replace::/redirectme2/' "https://localhost:${APTHTTPSPORT}/" +echo 'Dir::Bin::Methods::https+http "http";' > rootdir/etc/apt/apt.conf.d/99add-https-http-method +echo 'Dir::Bin::Methods::foo+https "http";' > rootdir/etc/apt/apt.conf.d/99add-foo-https-method + +msgtest 'download of a file works via' 'http' +testsuccess --nomsg downloadfile "http://localhost:${APTHTTPPORT}/working" httpfile +testfileequal httpfile 'alright' + +msgtest 'download of a file works via' 'https' +testsuccess --nomsg downloadfile "https://localhost:${APTHTTPSPORT}/working" httpsfile +testfileequal httpsfile 'alright' +rm -f httpfile httpsfile + +msgtest 'download of http file works via' 'https+http' +testsuccess --nomsg downloadfile "https+http://localhost:${APTHTTPPORT}/working" httpfile +testfileequal httpfile 'alright' +rm -f httpfile + +msgtest 'download of a file does not work if' 'https redirected to http' +testfailure --nomsg downloadfile "https://localhost:${APTHTTPSPORT}/redirectme/working" redirectfile +msgtest 'libcurl has forbidden access in last request to' 'http resource' +testsuccess --nomsg grep -q -E -- "Redirection from https to 'http://.*' is forbidden" rootdir/tmp/testfailure.output +rm -f redirectfile + +msgtest 'download of a file does work if' 'https+http redirected to https' +testsuccess --nomsg downloadfile "https+http://localhost:${APTHTTPPORT}/redirectme2/working" redirectfile +testfileequal redirectfile 'alright' +rm -f redirectfile + +msgtest 'download of a file does work if' 'foo+https redirected to https' +testsuccess --nomsg downloadfile "foo+https://localhost:${APTHTTPSPORT}/redirectme2/working" redirectfile +testfileequal redirectfile 'alright' +rm -f redirectfile diff --git a/test/integration/test-apt-install-file-reltag b/test/integration/test-apt-install-file-reltag new file mode 100755 index 0000000..afbf9be --- /dev/null +++ b/test/integration/test-apt-install-file-reltag @@ -0,0 +1,94 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'foo' 'all' '2' 'Depends: foo-common (= 2)' +insertpackage 'unstable' 'foo-common' 'all' '2' +insertpackage 'unstable' 'baz' 'all' '1' +insertpackage 'experimental' 'foo' 'all' '5' 'Depends: foo-common (= 5)' +insertpackage 'experimental' 'foo-common' 'all' '5' 'Source: foo (5)' +insertpackage 'experimental' 'baz' 'all' '2' +setupaptarchive + +insertinstalledpackage 'build-essential' 'all' '1' + +cat > foobar.dsc <<EOF +Format: 3.0 (native) +Source: foobar +Binary: foobar +Architecture: all +Version: 1 +Maintainer: Joe Sixpack <joe@example.org> +Build-Depends: foo (= 5), baz +Standards-Version: 4.1.3 +EOF +buildsimplenativepackage 'foobar2' 'all' '1' 'unstable' 'Depends: foo (= 5), baz' + +ln -s "$(readlink -f ./incoming/foobar2_1_all.deb)" foobar.deb +mkdir -p foobar +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt build-dep "$(readlink -f ./foobar.dsc)" -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt install "$(readlink -f ./foobar.deb)" -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt build-dep ./foobar.dsc -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt install ./foobar.deb -s +cd foobar +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt build-dep ../foobar.dsc -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt install ../foobar.deb -s +cd .. + +SUCCESSDSC='The following NEW packages will be installed: + baz foo foo-common +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst baz (1 unstable [all]) +Inst foo-common (5 experimental [all]) +Inst foo (5 experimental [all]) +Conf baz (1 unstable [all]) +Conf foo-common (5 experimental [all]) +Conf foo (5 experimental [all])' +SUCCESSDEB='The following additional packages will be installed: + baz foo foo-common +The following NEW packages will be installed: + baz foo foo-common foobar2 +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Inst baz (1 unstable [all]) +Inst foo-common (5 experimental [all]) +Inst foo (5 experimental [all]) +Inst foobar2 (1 local-deb [all]) +Conf baz (1 unstable [all]) +Conf foo-common (5 experimental [all]) +Conf foo (5 experimental [all]) +Conf foobar2 (1 local-deb [all])' +testsuccessequal "Note, using file '$(readlink -f ./foobar.dsc)' to get the build dependencies +$SUCCESSDSC" apt build-dep "$(readlink -f ./foobar.dsc)/experimental" -s -q=2 +testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'foobar2' instead of '$(readlink -f ./foobar.deb)' +$SUCCESSDEB" apt install "$(readlink -f ./foobar.deb)/experimental" -s +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +$SUCCESSDSC" apt build-dep ./foobar.dsc/experimental -sq=2 +testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'foobar2' instead of './foobar.deb' +$SUCCESSDEB" apt install "./foobar.deb/experimental" -s +cd foobar +testsuccessequal "Note, using file '../foobar.dsc' to get the build dependencies +$SUCCESSDSC" apt build-dep ../foobar.dsc/experimental -sqq +testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'foobar2' instead of '../foobar.deb' +$SUCCESSDEB" apt install "../foobar.deb/experimental" -s +cd .. + +msgmsg 'fail with' 'incorrect release' +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt build-dep "$(readlink -f ./foobar.dsc)/stable" -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt install "$(readlink -f ./foobar.deb)/stable" -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt build-dep ./foobar.dsc/stable -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt install ./foobar.deb/stable -s +cd foobar +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt build-dep ../foobar.dsc/stable -s +testfailuremsg 'E: Unable to correct problems, you have held broken packages.' apt install ../foobar.deb/stable -s +cd .. diff --git a/test/integration/test-apt-keep-downloaded-pkgs b/test/integration/test-apt-keep-downloaded-pkgs new file mode 100755 index 0000000..c5f6295 --- /dev/null +++ b/test/integration/test-apt-keep-downloaded-pkgs @@ -0,0 +1,54 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +buildsimplenativepackage 'pkg1' 'all' '1.0' 'stable' +buildsimplenativepackage 'pkg2' 'all' '1.0' 'stable' +buildsimplenativepackage 'pkg3' 'all' '1.0' 'stable' +buildsimplenativepackage 'pkg4' 'all' '1.0' 'stable' + +# local (file) installs +setupaptarchive + +# a file:// "download" is not a real download and hence passes +testsuccess aptget install pkg1 --no-download --download-only -y +testfailure test -f rootdir/var/cache/apt/archives/pkg1_1.0_all.deb +testsuccess test -f aptarchive/pool/pkg1_1.0_all.deb + +# ensure that install from local sources does not remove debs +testsuccess aptget install pkg1 -o APT::Keep-Downloaded-Packages=false +testsuccess test -f aptarchive/pool/pkg1_1.0_all.deb +testfailure test -f rootdir/var/cache/apt/archives/pkg1_1.0_all.deb + +# now switch to http and downloading debs +changetowebserver +testsuccess aptget update + +# see if no-download really doesn't download the package +testfailuremsg 'E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?' aptget install pkg2 --no-download -y +testsuccess test -f aptarchive/pool/pkg2_1.0_all.deb +testfailure test -f rootdir/var/cache/apt/archives/pkg2_1.0_all.deb + +# ensure that the downloaded pkg is kept with "keep=true" +testsuccess aptget install pkg2 -o APT::Keep-Downloaded-Packages=true +testsuccess test -f aptarchive/pool/pkg2_1.0_all.deb +testsuccess test -f rootdir/var/cache/apt/archives/pkg2_1.0_all.deb + +# ensure that the downloaded pkg is removed when requested +testsuccess aptget install pkg3 -o APT::Keep-Downloaded-Packages=false +testsuccess test -f aptarchive/pool/pkg3_1.0_all.deb +# this was there before, keep it +testsuccess test -f rootdir/var/cache/apt/archives/pkg2_1.0_all.deb +# this got installed so we can remove it now +testfailure test -f rootdir/var/cache/apt/archives/pkg3_1.0_all.deb + + +# ensure that install from the download dir does not delete packages +mv aptarchive/pool/pkg4_1.0_all.deb rootdir/var/cache/apt/archives +testsuccess aptget install $(pwd)/rootdir/var/cache/apt/archives/pkg4_1.0_all.deb -o APT::Keep-Downloaded-Packages=false +testsuccess test -f $(pwd)/rootdir/var/cache/apt/archives/pkg4_1.0_all.deb diff --git a/test/integration/test-apt-key b/test/integration/test-apt-key new file mode 100755 index 0000000..a1e633c --- /dev/null +++ b/test/integration/test-apt-key @@ -0,0 +1,428 @@ +#!/bin/sh +set -e + +# apt-key is a shell script, so relatively prune to be effected by 'crazy' things: +# confuses config parser as there exists no way of escaping " currently. +#TMPDIR="$(mktemp -d)/This is \"fü\$\$ing cràzy\", \$(man man | head -n1 | cut -d' ' -f 1)\$!" +# gpg doesn't like | in path names – documented e.g. in the man gpg2 --agent-program +#TMPDIR="$(mktemp -d)/This is fü\$\$ing cràzy, \$(man man | head -n1 | cut -d' ' -f 1)\$!" +TMPDIR_ADD="This is fü\$\$ing cràzy, \$(apt -v)\$!" + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +chmod o+x "${TMPWORKINGDIRECTORY}/.." +configarchitecture 'amd64' + +insertpackage 'unstable' 'bar' 'i386' '1' +insertsource 'unstable' 'foo' 'all' '1' +setupaptarchive --no-update + +# start from a clean plate again +cleanplate() { + rm -rf "${ROOTDIR}/etc/apt/trusted.gpg.d/" "${ROOTDIR}/etc/apt/trusted.gpg" + mkdir "${ROOTDIR}/etc/apt/trusted.gpg.d/" +} +testmultigpg() { + testfailure --nomsg aptkey --quiet --readonly "$@" + testsuccess grep "^gpgv: Can't check signature" "${ROOTDIR}/tmp/testfailure.output" + testsuccess grep '^gpgv: Good signature from' "${ROOTDIR}/tmp/testfailure.output" +} +testaptkeyskeyring() { + local KEYRING="$1" + shift + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/aptkeylistkeyring.output" + if ! aptkey --keyring "$KEYRING" list --with-colon 2>/dev/null | grep '^pub' | cut -d':' -f 5 > "$OUTPUT"; then + echo -n > "$OUTPUT" + fi + testfileequal "$OUTPUT" "$(mapkeynametokeyid "$@")" +} +testsuccessempty() { + testempty "$@" +} +testrun() { + local EXT="${1:-gpg}" + local TESTSTATE="${2:-testsuccess}" + echo "APT::Key::ArchiveKeyring \"${KEYDIR}/joesixpack.pub.gpg\"; +APT::Key::RemovedKeys \"${KEYDIR}/rexexpired.pub.gpg\";" > "${ROOTDIR}/etc/apt/apt.conf.d/aptkey.conf" + + cleanplate + ln -sf "$(readlink -f "${KEYDIR}/joesixpack.pub.${EXT}")" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testaptkeys 'Joe Sixpack' + + ${TESTSTATE} aptkey list + msgtest 'Check that paths in list output are not' 'double-slashed' + testfailure --nomsg grep '//' "${ROOTDIR}/tmp/${TESTSTATE}.output" + + ${TESTSTATE} aptkey finger + msgtest 'Check that paths in finger output are not' 'double-slashed' + testfailure --nomsg grep '//' "${ROOTDIR}/tmp/${TESTSTATE}.output" + + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${KEYDIR}/joesixpack.pub.${EXT}.bak" + if [ "$TESTSTATE" = 'testwarning' ]; then + testwarning aptkey --fakeroot update + testsuccess grep '^gpg: key .*DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed$' "${ROOTDIR}/tmp/testwarning.output" + testsuccess grep '^W: .* are ignored as the file has an unsupported filetype' "${ROOTDIR}/tmp/testwarning.output" + else + testequalor2 'gpg: key DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed +gpg: Total number processed: 1 +gpg: unchanged: 1' 'gpg: key 5A90D141DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed +gpg: Total number processed: 1 +gpg: unchanged: 1' aptkey --fakeroot update + fi + testsuccess test -L "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${KEYDIR}/joesixpack.pub.${EXT}.bak" + + testaptkeys 'Joe Sixpack' + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg" + + ${TESTSTATE} aptkey --fakeroot add "${KEYDIR}/rexexpired.pub.${EXT}" + testfilestats "${ROOTDIR}/etc/apt/trusted.gpg" '%a' '=' '644' + + testaptkeys 'Rex Expired' 'Joe Sixpack' + + msgtest 'Check that Sixpack key can be' 'exported' + aptkey export 'Sixpack' > "${TMPWORKINGDIRECTORY}/aptkey.export" 2>/dev/null + aptkey --keyring "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" exportall > "${TMPWORKINGDIRECTORY}/aptkey.exportall" + testsuccess --nomsg cmp "${TMPWORKINGDIRECTORY}/aptkey.export" "${TMPWORKINGDIRECTORY}/aptkey.exportall" + testsuccess test -s "${TMPWORKINGDIRECTORY}/aptkey.export" + testsuccess test -s "${TMPWORKINGDIRECTORY}/aptkey.exportall" + + msgtest 'Check that multiple keys can be' 'exported' + aptkey export 'Sixpack' 'Expired' > "${TMPWORKINGDIRECTORY}/aptkey.export" 2>/dev/null + aptkey --keyring "${KEYDIR}/rexexpired.pub.${EXT}" \ + --keyring "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" exportall > "${TMPWORKINGDIRECTORY}/aptkey.exportall" + testsuccess --nomsg cmp "${TMPWORKINGDIRECTORY}/aptkey.export" "${TMPWORKINGDIRECTORY}/aptkey.exportall" + testsuccess test -s "${TMPWORKINGDIRECTORY}/aptkey.export" + testsuccess test -s "${TMPWORKINGDIRECTORY}/aptkey.exportall" + + msgtest 'Execute update again to trigger removal of' 'Rex Expired key' + ${TESTSTATE} --nomsg aptkey --fakeroot update + + testaptkeys 'Joe Sixpack' + + msgtest "Try to remove a key which exists, but isn't in the" 'forced keyring' + testsuccess --nomsg aptkey --fakeroot --keyring "${ROOTDIR}/etc/apt/trusted.gpg" del DBAC8DAE + + testaptkeys 'Joe Sixpack' + + ${TESTSTATE} aptkey --fakeroot del DBAC8DAE + "${TESTSTATE}empty" aptkey list + + ln -sf "$(readlink -f "${KEYDIR}/joesixpack.pub.${EXT}")" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testaptkeys 'Joe Sixpack' + msgtest "Remove a key from" 'forced keyring in trusted.d.gpg' + testsuccess --nomsg aptkey --fakeroot --keyring "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" del DBAC8DAE + testsuccess cmp -s "$(readlink -f "${KEYDIR}/joesixpack.pub.${EXT}")" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + "${TESTSTATE}empty" aptkey list + + cp -a "${KEYDIR}/marvinparanoid.pub.asc" "${ROOTDIR}/etc/foobar.pub" + testsuccess aptkey --fakeroot --keyring "${ROOTDIR}/etc/foobar.pub" add "${KEYDIR}/rexexpired.pub.asc" "${KEYDIR}/joesixpack.pub.gpg" + testfilestats "${ROOTDIR}/etc/foobar.pub" '%a' '=' '644' + testaptkeyskeyring "${ROOTDIR}/etc/foobar.pub" 'Marvin Paranoid' 'Rex Expired' 'Joe Sixpack' + "${TESTSTATE}empty" aptkey list + + msgtest 'Test key removal with' 'lowercase key ID' #keylength somewhere between 8byte and short + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del d141dbac8dae + "${TESTSTATE}empty" aptkey list + + if [ "$(id -u)" != '0' ]; then + msgtest 'Test key removal with' 'unreadable key' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + echo 'foobar' > "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + chmod 000 "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + testwarning --nomsg aptkey --fakeroot del d141dbac8dae + testwarning aptkey list + chmod 644 "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + rm -f "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + grep -v '^W: ' "${ROOTDIR}/tmp/testwarning.output" > "${ROOTDIR}/aptkeylist.output" || true + testempty cat "${ROOTDIR}/aptkeylist.output" + fi + + msgtest 'Test key removal with' 'single key in real file' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del DBAC8DAE + "${TESTSTATE}empty" aptkey list + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + + msgtest 'Test key removal with' 'different key specs' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + cp -a "${KEYDIR}/marvinparanoid.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/marvinparanoid.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del 0xDBAC8DAE 528144E2 + "${TESTSTATE}empty" aptkey list + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/marvinparanoid.${EXT}" + testsuccess cmp "${KEYDIR}/marvinparanoid.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/marvinparanoid.${EXT}~" + + msgtest 'Test key removal with' 'long key ID' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del 5A90D141DBAC8DAE + "${TESTSTATE}empty" aptkey list + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + + msgtest 'Test key removal with' 'fingerprint' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE + "${TESTSTATE}empty" aptkey list + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + + msgtest 'Test key removal with' 'spaced fingerprint' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del '34A8 E9D1 8DB3 20F3 67E8 EAA0 5A90 D141 DBAC 8DAE' + "${TESTSTATE}empty" aptkey list + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + + msgtest 'Test key removal with' 'single key in softlink' + cleanplate + ln -sf "$(readlink -f "${KEYDIR}/joesixpack.pub.${EXT}")" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del DBAC8DAE + "${TESTSTATE}empty" aptkey list + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess test -L "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + + cleanplate + ${TESTSTATE} aptkey --fakeroot add "${KEYDIR}/joesixpack.pub.${EXT}" + ln -sf "$(readlink -f "${KEYDIR}/marvinparanoid.pub.${EXT}")" "${KEYDIR}/marvin paránöid.pub.${EXT}" + ${TESTSTATE} aptkey --fakeroot add "${KEYDIR}/marvin paránöid.pub.${EXT}" + testaptkeys 'Joe Sixpack' 'Marvin Paranoid' + cp -a "${ROOTDIR}/etc/apt/trusted.gpg" "${KEYDIR}/testcase-multikey.pub.gpg" # store for reuse + aptkey --keyring "${KEYDIR}/testcase-multikey.pub.gpg" export > "${KEYDIR}/testcase-multikey.pub.asc" + + msgtest 'Test key removal with' 'multi key in real file' + cleanplate + cp -a "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del DBAC8DAE + testaptkeys 'Marvin Paranoid' + testsuccess cmp "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}~" + + msgtest 'Test key removal with' 'multi key in softlink' + cleanplate + ln -s "$(readlink -f "${KEYDIR}/testcase-multikey.pub.${EXT}")" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del DBAC8DAE + testaptkeys 'Marvin Paranoid' + testsuccess cmp "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}~" + testfailure test -L "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + testsuccess test -L "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}~" + + msgtest 'Test key removal with' 'multiple files including key' + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + cp -a "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + ${TESTSTATE} --nomsg aptkey --fakeroot del DBAC8DAE + testaptkeys 'Marvin Paranoid' + testfailure test -e "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + testsuccess cmp "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}~" + testsuccess cmp "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}~" + + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + cp -a "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + testaptkeys 'Joe Sixpack' 'Joe Sixpack' 'Marvin Paranoid' + msgtest 'Test merge-back of' 'added keys' + ${TESTSTATE} --nomsg aptkey adv --batch --yes --import "${KEYDIR}/rexexpired.pub.${EXT}" + testaptkeys 'Rex Expired' 'Joe Sixpack' 'Joe Sixpack' 'Marvin Paranoid' + + msgtest 'Test merge-back of' 'removed keys' + ${TESTSTATE} --nomsg aptkey adv --batch --yes --delete-keys 27CE74F9 + testaptkeys 'Joe Sixpack' 'Joe Sixpack' 'Marvin Paranoid' + + msgtest 'Test merge-back of' 'removed duplicate keys' + ${TESTSTATE} --nomsg aptkey adv --batch --yes --delete-keys DBAC8DAE + testaptkeys 'Marvin Paranoid' + + cleanplate + cp -a "${KEYDIR}/joesixpack.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/joesixpack.${EXT}" + cp -a "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + local SIGNATURE="${TMPWORKINGDIRECTORY}/signature" + msgtest 'Test signing a file' 'with a key' + echo 'Verify me. This is my signature.' > "$SIGNATURE" + echo 'lalalalala' > "${SIGNATURE}2" + testsuccess --nomsg aptkey --quiet --keyring "${KEYDIR}/marvinparanoid.pub.gpg" --secret-keyring "${KEYDIR}/marvinparanoid.sec" --readonly \ + adv --batch --yes --default-key 'Marvin' --armor --detach-sign --sign --output "${SIGNATURE}.gpg" "${SIGNATURE}" + testsuccess test -s "${SIGNATURE}.gpg" -a -s "${SIGNATURE}" + + msgtest 'Test verify a file' 'with no sig' + testfailure --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/testcase-multikey.pub.${EXT}" verify "${SIGNATURE}" "${SIGNATURE}2" + + for GPGV in '' 'gpgv' 'gpgv1' 'gpgv2'; do + echo "APT::Key::GPGVCommand \"$GPGV\";" > "${ROOTDIR}/etc/apt/apt.conf.d/00gpgvcmd" + if [ -n "$GPGV" ] && ! command dpkg -l gnupg1 2>&1 | grep -q '^ii'; then continue; fi + + msgtest 'Test verify a file' 'with all keys' + ${TESTSTATE} --nomsg aptkey --quiet --readonly verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + if [ "$(id -u)" != '0' ]; then + msgtest 'Test verify a file' 'with unreadable key' + echo 'foobar' > "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + chmod 000 "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + testwarning --nomsg aptkey --quiet --readonly verify "${SIGNATURE}.gpg" "${SIGNATURE}" + testwarning aptkey list + # check that apt users see warnings, too + rm -rf "${ROOTDIR}/var/lib/apt/lists" + testwarning apt update + + chmod 644 "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + rm -f "${ROOTDIR}/etc/apt/trusted.gpg.d/unreadablekey.${EXT}" + fi + + msgtest 'Test verify a file' 'with good keyring' + testsuccess --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/testcase-multikey.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test verify a file' 'with good keyrings 1' + testsuccess --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/joesixpack.pub.${EXT}" \ + --keyring "${KEYDIR}/marvinparanoid.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test verify a file' 'with good keyrings 2' + testsuccess --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/marvinparanoid.pub.${EXT}" \ + --keyring "${KEYDIR}/joesixpack.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a file' 'with bad keyring' + testfailure --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/joesixpack.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a file' 'with non-existing keyring' + testfailure --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/does-not-exist.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + testfailure test -e "${KEYDIR}/does-not-exist.pub.${EXT}" + + # note: this isn't how apts gpgv method implements keyid for verify + msgtest 'Test verify a file' 'with good keyid' + ${TESTSTATE} --nomsg aptkey --quiet --readonly --keyid 'Paranoid' verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a file' 'with bad keyid' + testfailure --nomsg aptkey --quiet --readonly --keyid 'Sixpack' verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a file' 'with non-existing keyid' + testfailure --nomsg aptkey --quiet --readonly --keyid 'Kalnischkies' verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test verify fails on' 'bad file' + testfailure --nomsg aptkey --quiet --readonly verify "${SIGNATURE}.gpg" "${SIGNATURE}2" + + # try to perform an entire update with this gpgv + rm -rf "${ROOTDIR}/var/lib/apt/lists" + ${TESTSTATE} apt update -o Test::Dir="${ROOTDIR}" + done + rm -f "${ROOTDIR}/etc/apt/apt.conf.d/00gpgvcmd" + + msgtest 'Test verify a file' 'with good keyring' + testsuccess --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/testcase-multikey.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + cleanplate + cat "${KEYDIR}/joesixpack.pub.gpg" "${KEYDIR}/marvinparanoid.pub.gpg" > "${KEYDIR}/double.pub.gpg" + cat "${KEYDIR}/joesixpack.pub.asc" "${KEYDIR}/marvinparanoid.pub.asc" > "${KEYDIR}/double.pub.asc" + cat "${KEYDIR}/joesixpack.sec" "${KEYDIR}/marvinparanoid.sec" > "${KEYDIR}/double.sec" + cp -a "${KEYDIR}/double.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/double.${EXT}" + cp -a "${KEYDIR}/testcase-multikey.pub.${EXT}" "${ROOTDIR}/etc/apt/trusted.gpg.d/multikey.${EXT}" + rm -f "${SIGNATURE}.gpg" + testsuccess aptkey --quiet --keyring "${KEYDIR}/double.pub.gpg" --secret-keyring "${KEYDIR}/double.sec" --readonly \ + adv --batch --yes -u 'Marvin' -u 'Joe' --armor --detach-sign --sign --output "${SIGNATURE}.gpg" "${SIGNATURE}" + testsuccess test -s "${SIGNATURE}.gpg" -a -s "${SIGNATURE}" + + for GPGV in '' 'gpgv' 'gpgv1' 'gpgv2'; do + echo "APT::Key::GPGVCommand \"$GPGV\";" > "${ROOTDIR}/etc/apt/apt.conf.d/00gpgvcmd" + if [ -n "$GPGV" ] && ! command dpkg -l gnupg1 2>&1 | grep -q '^ii'; then continue; fi + + msgtest 'Test verify a doublesigned file' 'with all keys' + ${TESTSTATE} --nomsg aptkey --quiet --readonly verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test verify a doublesigned file' 'with good keyring joe' + testmultigpg --keyring "${KEYDIR}/joesixpack.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test verify a doublesigned file' 'with good keyring marvin' + testmultigpg --keyring "${KEYDIR}/marvinparanoid.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a doublesigned file' 'with bad keyring' + testfailure --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/rexexpired.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a doublesigned file' 'with non-existing keyring' + testfailure --nomsg aptkey --quiet --readonly --keyring "${KEYDIR}/does-not-exist.pub.${EXT}" verify "${SIGNATURE}.gpg" "${SIGNATURE}" + testfailure test -e "${KEYDIR}/does-not-exist.pub.${EXT}" + + # note: this isn't how apts gpgv method implements keyid for verify + msgtest 'Test verify a doublesigned file' 'with good keyid' + testmultigpg --keyid 'Paranoid' verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a doublesigned file' 'with bad keyid' + testfailure --nomsg aptkey --quiet --readonly --keyid 'Rex' verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test fail verify a doublesigned file' 'with non-existing keyid' + testfailure --nomsg aptkey --quiet --readonly --keyid 'Kalnischkies' verify "${SIGNATURE}.gpg" "${SIGNATURE}" + + msgtest 'Test verify fails on' 'bad doublesigned file' + testfailure --nomsg aptkey --quiet --readonly verify "${SIGNATURE}.gpg" "${SIGNATURE}2" + done + rm -f "${ROOTDIR}/etc/apt/apt.conf.d/00gpgvcmd" +} + +setupgpgcommand() { + local GPGEXE; + if command dpkg -l gnupg1 2>&1 | grep -q '^ii'; then + if [ "$1" = '1' ]; then + GPGEXE='gpg1' + else + GPGEXE='gpg' + fi + else + if [ "$1" = '1' ]; then + GPGEXE='gpg' + else + GPGEXE='gpg2' + fi + fi + msgmsg 'Force tests to be run with' "$GPGEXE" + echo "APT::Key::GPGCommand \"$GPGEXE\";" > "${ROOTDIR}/etc/apt/apt.conf.d/00gpgcmd" + testsuccess aptkey --readonly adv --version + cp "${ROOTDIR}/tmp/testsuccess.output" "${TMPWORKINGDIRECTORY}/aptkey.version" + testsuccess grep "^gpg (GnuPG) $1\." "${TMPWORKINGDIRECTORY}/aptkey.version" +} + +(cd /; find "${TMPWORKINGDIRECTORY}/keys" -name '*.pub' -type f) | while read trusted; do + testsuccess aptkey --keyring "$trusted" adv --armor --export --output "${trusted}.asc" + cp -a "$trusted" "${trusted}.gpg" +done + +# run with default (whatever this is) in current CWD with relative paths +ROOTDIR="./rootdir" +KEYDIR="./keys" +testrun + +# run with … and up the game with a strange CWD & absolute paths +ROOTDIR="${TMPWORKINGDIRECTORY}/rootdir" +KEYDIR="${TMPWORKINGDIRECTORY}/keys" +mkdir inaccessible +cd inaccessible +chmod 600 ../inaccessible +testfilestats "${TMPWORKINGDIRECTORY}/inaccessible" '%a' '=' '600' + +setupgpgcommand '1' +testrun +setupgpgcommand '2' +testrun + +msgmsg 'Tests to be run with' 'asc files' +rm -f "${ROOTDIR}/etc/apt/apt.conf.d/00gpgcmd" +testrun 'asc' + +msgmsg 'Tests to be run with' 'bad files' +# don't let the plate be so clean anymore +cleanplate() { + rm -rf "${ROOTDIR}/etc/apt/trusted.gpg.d/" "${ROOTDIR}/etc/apt/trusted.gpg" + mkdir "${ROOTDIR}/etc/apt/trusted.gpg.d/" + touch "${ROOTDIR}/etc/apt/trusted.gpg.d/emptyfile.gpg" + touch "${ROOTDIR}/etc/apt/trusted.gpg.d/emptyfile.asc" + echo 'broken' > "${ROOTDIR}/etc/apt/trusted.gpg.d/brokenfile.gpg" + echo 'broken' > "${ROOTDIR}/etc/apt/trusted.gpg.d/brokenfile.asc" +} +testrun 'gpg' 'testwarning' diff --git a/test/integration/test-apt-key-net-update b/test/integration/test-apt-key-net-update new file mode 100755 index 0000000..b9f716e --- /dev/null +++ b/test/integration/test-apt-key-net-update @@ -0,0 +1,41 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" +changetowebserver + +# setup env +mkdir -p var/lib/apt/keyrings +mkdir -p usr/share/keyrings + +# install the fake master keyring +install -m0644 keys/test-master-keyring.pub usr/share/keyrings +echo "APT::Key::MasterKeyring \"${TMPWORKINGDIRECTORY}/usr/share/keyrings/test-master-keyring.pub\";" >> ./aptconfig.conf + +# setup archive-keyring +mkdir -p aptarchive/ubuntu/project +install -m0644 keys/test-archive-keyring.pub aptarchive/ubuntu/project/ +echo "APT::Key::ArchiveKeyringURI \"http://localhost:${APTHTTPPORT}/ubuntu/project/test-archive-keyring.pub\";" >> ./aptconfig.conf +echo 'APT::Key::Net-Update-Enabled "1";' >> ./aptconfig.conf + +# test against the "real" webserver +testsuccess aptkey --fakeroot net-update +testfailure grep 'not added' rootdir/tmp/testsuccess.output +testaptkeys 'oldarchive' 'newarchive' + +# now try a different one +# setup archive-keyring +mkdir -p aptarchive/ubuntu/project +install -m0644 keys/marvinparanoid.pub aptarchive/ubuntu/project/ +echo "APT::Key::ArchiveKeyringURI \"http://localhost:${APTHTTPPORT}/ubuntu/project/marvinparanoid.pub\";" >> ./aptconfig.conf +echo 'APT::Key::Net-Update-Enabled "1";' >> ./aptconfig.conf + +# test against the "real" webserver +testsuccessequal "Checking for new archive signing keys now +Key 'DE66AECA9151AFA1877EC31DE8525D47528144E2' not added. It is not signed with a master key" aptkey --fakeroot net-update + +testaptkeys 'oldarchive' 'newarchive' diff --git a/test/integration/test-apt-key-used-in-maintainerscript b/test/integration/test-apt-key-used-in-maintainerscript new file mode 100755 index 0000000..b5ed327 --- /dev/null +++ b/test/integration/test-apt-key-used-in-maintainerscript @@ -0,0 +1,43 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +unset APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE +configarchitecture 'native' +configdpkgnoopchroot + +buildingpkg() { + local PKG="$1" + shift + setupsimplenativepackage "$PKG" 'native' '1' 'unstable' "$@" + BUILDDIR="incoming/${PKG}-1" + echo '#!/bin/sh +apt-key list >/dev/null' > "${BUILDDIR}/debian/postinst" + buildpackage "$BUILDDIR" 'unstable' 'main' 'native' + rm -rf "$BUILDDIR" +} +buildingpkg 'aptkeyuser-nodepends' 'Depends: unrelated' +buildingpkg 'aptkeyuser-depends' 'Depends: gnupg' + +insertinstalledpackage 'unrelated' 'native' '1' +insertinstalledpackage 'gnupg' 'native' '1' +testdpkgnotinstalled 'aptkeyuser-depends' 'aptkeyuser-nodepends' + +testsuccess apt install ./incoming/aptkeyuser-depends_*.changes -y +cp rootdir/tmp/testsuccess.output apt.output +testdpkginstalled 'aptkeyuser-depends' +testfailure grep '^Warning: This will BREAK' apt.output +testsuccess grep '^Warning: apt-key' apt.output + +testsuccess apt install --with-source ./incoming/aptkeyuser-nodepends_*.changes aptkeyuser-nodepends -y +cp rootdir/tmp/testsuccess.output apt.output +testdpkginstalled 'aptkeyuser-nodepends' +testsuccess grep '^Warning: This will BREAK' apt.output +testsuccess grep '^Warning: apt-key' apt.output + +testsuccess aptkey list +cp rootdir/tmp/testsuccess.output aptkey.list +testsuccess grep '^Warning: apt-key' aptkey.list diff --git a/test/integration/test-apt-mark b/test/integration/test-apt-mark new file mode 100755 index 0000000..7a115b0 --- /dev/null +++ b/test/integration/test-apt-mark @@ -0,0 +1,154 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable' 'bar' 'amd64,i386' '1' +insertpackage 'unstable' 'uninstalled' 'all' '1' +insertpackage 'unstable' 'uninstalled-native' 'amd64' '1' + +insertinstalledpackage 'foo' 'all' '1' +insertinstalledpackage 'bar' 'amd64' '1' + +setupaptarchive + +# dpkg is "installed" by our test framework +testdpkginstalled dpkg + +testnoautopkg() { + testempty aptmark showauto + testempty aptcache -q=1 showauto + testsuccessequal 'bar +dpkg +foo' aptmark showmanual + testsuccessequal 'bar +foo' aptmark showmanual bar foo uninstalled +} +testfooisauto() { + testsuccessequal 'foo' aptmark showauto + testsuccessequal 'foo' aptcache -q=1 showauto + testsuccessequal 'foo' aptmark showauto foo + testsuccessequal 'foo' aptcache -q=1 showauto foo + testsuccessequal 'bar +dpkg' aptmark showmanual + testsuccessequal 'bar' aptmark showmanual bar +} +testmarkonpkgasauto() { + testsuccess $1 -q=1 $2 foo + testfooisauto + testsuccess $1 -q=1 $2 foo + testfooisauto + + testsuccess $1 -q=1 $3 foo + testnoautopkg + testsuccess $1 -q=1 $3 foo + testnoautopkg +} + +testfailureequal 'E: No packages found' aptmark auto +testfailureequal 'E: No packages found' aptmark manual + +testnoautopkg +testmarkonpkgasauto 'aptmark' 'auto' 'manual' +testmarkonpkgasauto 'aptmark' 'markauto' 'unmarkauto' +testmarkonpkgasauto 'aptget' 'markauto' 'unmarkauto' + +testnoholdpkg() { + testempty aptmark showhold + testempty aptmark showholds # typical "typo" + testempty aptmark showhold dpkg + testempty aptmark showholds dpkg +} +testpkgonhold() { + testsuccessequal "$1" aptmark showhold + testsuccessequal "$1" aptmark showholds + testsuccessequal "$1" aptmark showhold $1 + testsuccessequal "$1" aptmark showholds $1 +} +testmarkonepkgashold() { + testsuccess aptmark hold $1 + testpkgonhold $1 + testsuccess aptmark hold $1 + testpkgonhold $1 + testsuccess aptmark unhold $1 + testnoholdpkg + testsuccess aptmark unhold $1 + testnoholdpkg +} + +testfailureequal 'E: No packages found' aptmark hold +testfailureequal 'E: No packages found' aptmark unhold + +testnoholdpkg +testmarkonepkgashold 'foo' +testmarkonepkgashold 'bar' + +msgtest 'dpkg supports --merge-avail via' 'stdin' +if dpkg --merge-avail - < /dev/null >/dev/null 2>&1; then + msgpass +else + msgskip 'dpkg version too old' + exit 0 +fi + +testmarkonepkgashold 'uninstalled' +testmarkonepkgashold 'uninstalled-native' + +testsuccessequal 'uninstalled set on hold.' aptmark hold uninstalled +testsuccessequal 'uninstalled-native set on hold.' aptmark hold uninstalled-native +#FIXME: holds on uninstalled packages are not persistent in dpkg +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following NEW packages will be installed: + uninstalled uninstalled-native +The following held packages will be changed: + uninstalled-native +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst uninstalled (1 unstable [all]) +Inst uninstalled-native (1 unstable [amd64]) +Conf uninstalled (1 unstable [all]) +Conf uninstalled-native (1 unstable [amd64])' aptget install uninstalled uninstalled-native -s +testsuccess aptmark unhold uninstalled uninstalled-native + +testselections() { + testsuccess aptmark hold "$1" + testsuccessequal "$1" aptmark showholds "$1" + testsuccess aptmark unhold "$1" + testsuccessequal "$1" aptmark showinstalls "$1" + testsuccess aptmark hold "$1" + testsuccessequal "$1" aptmark showholds "$1" + testsuccess aptmark install "$1" + testsuccessequal "$1" aptmark showinstalls "$1" + testsuccess aptmark remove "$1" + testsuccessequal "$1" aptmark showremoves "$1" + testsuccess aptmark purge "$1" + testsuccessequal "$1" aptmark showpurges "$1" +} +testselections 'foo' +testselections 'bar' + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + bar* foo* +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +Purg bar [1] +Purg foo [1]' aptget dselect-upgrade -s + +testuninstalledselections() { + testsuccess aptmark hold "$1" + testsuccessequal "$1" aptmark showholds "$1" + testsuccess aptmark unhold "$1" + testsuccessequal "$1" aptmark showremoves "$1" + testsuccess aptmark hold "$1" + testsuccessequal "$1" aptmark showholds "$1" + testsuccess aptmark install "$1" + testsuccessequal "$1" aptmark showinstalls "$1" +} +testuninstalledselections 'uninstalled' +testuninstalledselections 'uninstalled-native' diff --git a/test/integration/test-apt-move-and-forget-manual-sections b/test/integration/test-apt-move-and-forget-manual-sections new file mode 100755 index 0000000..69a7d9f --- /dev/null +++ b/test/integration/test-apt-move-and-forget-manual-sections @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'native' + +aptconfig dump --no-empty --format '%v%n' APT::Move-Autobit-Sections > move-autobit.sections +testsuccess grep '^oldlibs$' move-autobit.sections + +buildsimplenativepackage 'libabc' 'native' '1' 'stable' '' '' 'libs' +buildsimplenativepackage 'libabc' 'native' '2' 'unstable' 'Depends: libdef' '' 'oldlibs' +buildsimplenativepackage 'libdef' 'native' '1' 'unstable' '' '' 'libs' +setupaptarchive + +testmarkedauto +testmarkedmanual 'dpkg' + +testsuccess aptget install libabc/stable -y +testdpkginstalled 'libabc' +testdpkgnotinstalled 'libdef' + +testmarkedmanual 'dpkg' 'libabc' +testmarkedauto + +testsuccess aptget dist-upgrade -y +testdpkginstalled 'libabc' 'libdef' + +testmarkedauto 'libabc' +testmarkedmanual 'dpkg' 'libdef' diff --git a/test/integration/test-apt-never-markauto-sections b/test/integration/test-apt-never-markauto-sections new file mode 100755 index 0000000..aa145d2 --- /dev/null +++ b/test/integration/test-apt-never-markauto-sections @@ -0,0 +1,86 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +aptconfig dump --no-empty --format '%v%n' APT::Never-MarkAuto-Sections > nevermarkauto.sections +testsuccess grep '^metapackages$' nevermarkauto.sections + +buildsimplenativepackage 'mydesktop' 'all' '1' 'unstable' 'Depends: mydesktop-core, foreignpkg +Recommends: notavailable' '' 'metapackages' +buildsimplenativepackage 'mydesktop-core' 'amd64' '1' 'unstable' 'Depends: bad-texteditor | texteditor, browser (>= 42), nosection, foreignpkg +Recommends: notavailable +Multi-Arch: foreign' '' 'metapackages' +buildsimplenativepackage 'browser' 'amd64' '41' 'stable' +buildsimplenativepackage 'browser' 'amd64' '42' 'unstable' +buildsimplenativepackage 'texteditor' 'amd64' '1' 'stable' +buildsimplenativepackage 'bad-texteditor' 'amd64' '1' 'stable' 'Depends: texteditor +Conflicts: mydesktop-core' +buildsimplenativepackage 'nosection' 'amd64' '1' 'stable' '' '' '<none>' +buildsimplenativepackage 'foreignpkg' 'i386' '1' 'stable' 'Multi-Arch: foreign' +setupaptarchive + +testsuccess aptcache show nosection +testfailure grep 'Section' rootdir/tmp/testsuccess.output +testequal 'dpkg' aptmark showmanual + +testsuccess aptget install mydesktop -y -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 + +testmarkedmanual 'dpkg' 'mydesktop' +testmarkedauto 'mydesktop-core' 'foreignpkg:i386' 'texteditor' 'browser' 'nosection' + +# if the remove is from a user, don't do manual-bit passing +testequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + browser foreignpkg:i386 mydesktop mydesktop-core nosection texteditor +0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded. +Remv mydesktop [1] +Remv mydesktop-core [1] +Remv browser [42] +Remv foreignpkg:i386 [1] +Remv nosection [1] +Remv texteditor [1]' aptget autoremove mydesktop -s + +testequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + mydesktop mydesktop-core texteditor +0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded. +Remv mydesktop [1] +Remv mydesktop-core [1] +Remv texteditor [1]' aptget autoremove texteditor -s #-o Debug::pkgDepCache::AutoInstall=1 -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 +testsuccess aptget autoremove texteditor -y + +testdpkgnotinstalled mydesktop mydesktop-core texteditor +testdpkginstalled browser + +testmarkedmanual 'browser' 'dpkg' 'foreignpkg:i386' 'nosection' +testmarkedauto + +# test that installed/upgraded auto-pkgs are not set to manual + +testsuccess aptget install browser=41 -y --allow-downgrades + +testmarkedmanual 'browser' 'dpkg' 'foreignpkg:i386' 'nosection' +testmarkedauto +testsuccess aptmark auto browser +testmarkedauto 'browser' +testsuccess aptmark auto nosection +testmarkedauto 'browser' 'nosection' +testmarkedmanual 'dpkg' 'foreignpkg:i386' + +# nosection should be auto, not manual, but is marked as such by the resolver +# removing mydesktop-core temporally… the resolver should be figuring out here +# that there is no point of removing mydesktop-core as its an unavoidable +# dependency of the user-requested mydesktop + +testsuccess aptget install mydesktop -y -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 -o Debug::pkgDepCache::AutoInstall=1 + +testmarkedmanual 'dpkg' 'foreignpkg:i386' 'mydesktop' 'nosection' +testmarkedauto 'browser' 'mydesktop-core' 'texteditor' diff --git a/test/integration/test-apt-progress-fd b/test/integration/test-apt-progress-fd new file mode 100755 index 0000000..4c19a7b --- /dev/null +++ b/test/integration/test-apt-progress-fd @@ -0,0 +1,80 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'testing' 'amd64' '0.1' 'stable' +buildsimplenativepackage 'testing' 'amd64' '0.8.15' 'stable' +buildsimplenativepackage 'testing2' 'amd64,i386' '0.8.15' 'stable' +setupaptarchive + +# install native +exec 3> apt-progress.log +testsuccess aptget install testing=0.1 -y -o APT::Status-Fd=3 +testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1 +dlstatus:1:100.0000:Retrieving file 1 of 1 +pmstatus:dpkg-exec:0.0000:Running dpkg +pmstatus:testing:0.0000:Preparing testing (amd64) +pmstatus:testing:20.0000:Unpacking testing (amd64) +pmstatus:testing:40.0000:Installing testing (amd64) +pmstatus:dpkg-exec:40.0000:Running dpkg +pmstatus:testing:40.0000:Preparing to configure testing (amd64) +pmstatus:testing:60.0000:Configuring testing (amd64) +pmstatus:testing:80.0000:Installed testing (amd64)' + +# upgrade +exec 3> apt-progress.log +testsuccess aptget install testing=0.8.15 -y -o APT::Status-Fd=3 +testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1 +dlstatus:1:100.0000:Retrieving file 1 of 1 +pmstatus:dpkg-exec:0.0000:Running dpkg +pmstatus:testing:0.0000:Preparing testing (amd64) +pmstatus:testing:20.0000:Unpacking testing (amd64) +pmstatus:testing:40.0000:Installing testing (amd64) +pmstatus:dpkg-exec:40.0000:Running dpkg +pmstatus:testing:40.0000:Preparing to configure testing (amd64) +pmstatus:testing:60.0000:Configuring testing (amd64) +pmstatus:testing:80.0000:Installed testing (amd64)' + +# reinstall +exec 3> apt-progress.log +testsuccess aptget install testing=0.8.15 --reinstall -y -o APT::Status-Fd=3 +testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1 +dlstatus:1:100.0000:Retrieving file 1 of 1 +pmstatus:dpkg-exec:0.0000:Running dpkg +pmstatus:testing:0.0000:Preparing testing (amd64) +pmstatus:testing:20.0000:Unpacking testing (amd64) +pmstatus:testing:40.0000:Installing testing (amd64) +pmstatus:dpkg-exec:40.0000:Running dpkg +pmstatus:testing:40.0000:Preparing to configure testing (amd64) +pmstatus:testing:60.0000:Configuring testing (amd64) +pmstatus:testing:80.0000:Installed testing (amd64)' + +# and remove +exec 3> apt-progress.log +testsuccess aptget remove testing -y -o APT::Status-Fd=3 +testfileequal './apt-progress.log' 'pmstatus:dpkg-exec:0.0000:Running dpkg +pmstatus:testing:0.0000:Preparing for removal of testing (amd64) +pmstatus:testing:33.3333:Removing testing (amd64) +pmstatus:testing:66.6667:Removing testing (amd64) +pmstatus:dpkg-exec:66.6667:Running dpkg' + +# install non-native and ensure we get proper progress info +exec 3> apt-progress.log +testsuccess aptget install testing2:i386 -y -o APT::Status-Fd=3 +testfileequal './apt-progress.log' 'dlstatus:1:0.0000:Retrieving file 1 of 1 +dlstatus:1:100.0000:Retrieving file 1 of 1 +pmstatus:dpkg-exec:0.0000:Running dpkg +pmstatus:testing2:0.0000:Preparing testing2 (i386) +pmstatus:testing2:20.0000:Unpacking testing2 (i386) +pmstatus:testing2:40.0000:Installing testing2 (i386) +pmstatus:dpkg-exec:40.0000:Running dpkg +pmstatus:testing2:40.0000:Preparing to configure testing2 (i386) +pmstatus:testing2:60.0000:Configuring testing2 (i386) +pmstatus:testing2:80.0000:Installed testing2 (i386)' + +rm -f apt-progress*.log diff --git a/test/integration/test-apt-progress-fd-conffile b/test/integration/test-apt-progress-fd-conffile new file mode 100755 index 0000000..9fb6fbe --- /dev/null +++ b/test/integration/test-apt-progress-fd-conffile @@ -0,0 +1,42 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +# old conffile +setupsimplenativepackage 'compiz-core' 'native' '1.0' 'unstable' +BUILDDIR='incoming/compiz-core-1.0' +mkdir -p "${BUILDDIR}/debian/compiz-core/etc" +echo 'foo=bar;' > "${BUILDDIR}/compiz.conf" +echo 'compiz.conf /etc/compiz.conf' >> "${BUILDDIR}/debian/install" +buildpackage "$BUILDDIR" 'unstable' 'main' 'native' +rm -rf "$BUILDDIR" + +# new conffile +setupsimplenativepackage 'compiz-core' 'native' '2.0' 'unstable' +BUILDDIR='incoming/compiz-core-2.0' +mkdir -p "${BUILDDIR}/debian/compiz-core/etc" +echo 'foo2=bar2;' > "${BUILDDIR}/compiz.conf" +echo 'compiz.conf /etc/compiz.conf' >> "${BUILDDIR}/debian/install" +buildpackage "$BUILDDIR" 'unstable' 'main' 'native' +rm -rf "$BUILDDIR" + +setupaptarchive + +testsuccess aptget install compiz-core=1.0 + +# fake conffile change +echo 'meep' >> rootdir/etc/compiz.conf/compiz.conf + +# FIXME: Is there really no way to see if dpkg actually prompts? +msgtest 'Test for successful execution of' 'apt-get install compiz-core=2.0' +exec 3> apt-progress.log +testsuccess --nomsg aptget install compiz-core=2.0 -o APT::Status-Fd=3 -o Dpkg::Use-Pty=false -o dpkg::options::='--force-confold' + +# and ensure there is a conffile message in the file +msgtest 'Test status fd for an included' 'pmconffile msg' +testsuccess --nomsg grep "pmconffile:/etc/compiz.conf/compiz.conf" apt-progress.log diff --git a/test/integration/test-apt-progress-fd-deb822 b/test/integration/test-apt-progress-fd-deb822 new file mode 100755 index 0000000..dd66e28 --- /dev/null +++ b/test/integration/test-apt-progress-fd-deb822 @@ -0,0 +1,58 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'testing' 'amd64' '0.1' 'stable' +buildsimplenativepackage 'testing' 'all' '0.8.15' 'stable' +buildsimplenativepackage 'testing2' 'amd64,i386' '0.8.15' 'stable' +setupaptarchive + +# install native +exec 3> apt-progress.log +testsuccess aptget install testing=0.1 -y -o APT::Status-deb822-Fd=3 + +testfileequal './apt-progress.log' 'Status: progress +Percent: 0.0000 +Message: Running dpkg + +Status: progress +Package: testing:amd64 +Percent: 0.0000 +Message: Preparing testing (amd64) + +Status: progress +Package: testing:amd64 +Percent: 20.0000 +Message: Unpacking testing (amd64) + +Status: progress +Package: testing:amd64 +Percent: 40.0000 +Message: Installing testing (amd64) + +Status: progress +Percent: 40.0000 +Message: Running dpkg + +Status: progress +Package: testing:amd64 +Percent: 40.0000 +Message: Preparing to configure testing (amd64) + +Status: progress +Package: testing:amd64 +Percent: 60.0000 +Message: Configuring testing (amd64) + +Status: progress +Package: testing:amd64 +Percent: 80.0000 +Message: Installed testing (amd64) +' + +rm -f apt-progress*.log diff --git a/test/integration/test-apt-progress-fd-error b/test/integration/test-apt-progress-fd-error new file mode 100755 index 0000000..39c1053 --- /dev/null +++ b/test/integration/test-apt-progress-fd-error @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +mkdir -p usr/bin +touch usr/bin/file-conflict + +buildsimplenativepackage 'foo1' 'native' '0.8.15' 'stable' '' 'pkg with file conflicts' '' '' 'usr/' +buildsimplenativepackage 'foo2' 'native' '0.8.15' 'stable' '' 'pkg with file conflicts' '' '' 'usr/' +insertinstalledpackage 'apport' 'native' '1' + +setupaptarchive + +exec 3> apt-progress.log +testfailure aptget install foo1 foo2 -y -o APT::Status-Fd=3 +msgtest 'Ensure correct error message' 'file-conflict' +testsuccess --nomsg grep "foo2_0.8.15_[^.]\+.deb:[0-9.]\+:trying to overwrite '/usr/bin/file-conflict', which is also in package foo1 0.8.15" apt-progress.log + +testsuccess test -s rootdir/var/crash/foo2.0.crash +testsuccess grep '^Package: foo2 0.8.15$' rootdir/var/crash/foo2.0.crash diff --git a/test/integration/test-apt-redirect-loop b/test/integration/test-apt-redirect-loop new file mode 100755 index 0000000..e1a8aee --- /dev/null +++ b/test/integration/test-apt-redirect-loop @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +echo 'alright' > aptarchive/working +changetohttpswebserver +webserverconfig 'aptwebserver::redirect::replace::/redirectme3/' '/redirectme/' +webserverconfig 'aptwebserver::redirect::replace::/redirectme2/' '/redirectme3/' +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' '/redirectme2/' + +testfailure apthelper download-file "http://localhost:${APTHTTPPORT}/redirectme/working" httpfile +testsuccess grep 'Redirection loop encountered' rootdir/tmp/testfailure.output + +testfailure apthelper download-file "https://localhost:${APTHTTPSPORT}/redirectme/working" httpsfile +testsuccess grep 'Redirection loop encountered' rootdir/tmp/testfailure.output diff --git a/test/integration/test-apt-showlist-orgroup-in-recommends b/test/integration/test-apt-showlist-orgroup-in-recommends new file mode 100755 index 0000000..a03c367 --- /dev/null +++ b/test/integration/test-apt-showlist-orgroup-in-recommends @@ -0,0 +1,200 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +# simple case +insertinstalledpackage 'aaa' 'all' '1' +insertinstalledpackage 'ddd' 'all' '1' +insertpackage 'unstable' 'aaa' 'all' '1' +insertpackage 'unstable' 'ddd' 'all' '1' +insertpackage 'unstable' 'yyy' 'all' '1' +insertpackage 'unstable' 'zzz' 'all' '1:1' +insertpackage 'unstable' 'simple' 'all' '1' 'Recommends: aaa, bbb +Suggests: ccc, ddd' +insertpackage 'unstable' 'orgroup' 'all' '1' 'Recommends: aaa | bbb +Suggests: ccc | ddd' +insertpackage 'unstable' 'orgroup2' 'all' '1' 'Recommends: xxx | yyy +Suggests: yyy | zzz' +insertpackage 'unstable' 'orgroup3' 'all' '1' 'Recommends: xxx | yyy +Suggests: yyy | zzz' +insertpackage 'unstable' 'orgroup4' 'all' '1' 'Recommends: xxx +Suggests: zzz' +insertpackage 'unstable' 'versionedor' 'all' '1' 'Recommends: aaa (>> 2) | bbb +Suggests: ccc | ddd (>> 2)' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + ccc +Recommended packages: + bbb +The following NEW packages will be installed: + simple +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst simple (1 unstable [all]) +Conf simple (1 unstable [all])' aptget install simple -s --install-recommends --install-suggests +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + ccc +Recommended packages: + bbb +The following NEW packages will be installed: + simple +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst simple (1 unstable [all]) +Conf simple (1 unstable [all])' aptget install simple -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + ccc +Recommended packages: + aaa bbb +The following packages will be REMOVED: + aaa +The following NEW packages will be installed: + simple +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv aaa [1] +Inst simple (1 unstable [all]) +Conf simple (1 unstable [all])' aptget install simple aaa- -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + orgroup +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup (1 unstable [all]) +Conf orgroup (1 unstable [all])' aptget install orgroup -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Recommended packages: + aaa | bbb +The following packages will be REMOVED: + aaa +The following NEW packages will be installed: + orgroup +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv aaa [1] +Inst orgroup (1 unstable [all]) +Conf orgroup (1 unstable [all])' aptget install orgroup aaa- -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + yyy | zzz +Recommended packages: + xxx | yyy +The following NEW packages will be installed: + orgroup2 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup2 (1 unstable [all]) +Conf orgroup2 (1 unstable [all])' aptget install orgroup2 -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + yyy | zzz +Recommended packages: + xxx | yyy +The following NEW packages will be installed: + orgroup2 orgroup3 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup2 (1 unstable [all]) +Inst orgroup3 (1 unstable [all]) +Conf orgroup2 (1 unstable [all]) +Conf orgroup3 (1 unstable [all])' aptget install orgroup2 orgroup3 -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + yyy | zzz zzz +Recommended packages: + xxx | yyy xxx +The following NEW packages will be installed: + orgroup2 orgroup4 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup2 (1 unstable [all]) +Inst orgroup4 (1 unstable [all]) +Conf orgroup2 (1 unstable [all]) +Conf orgroup4 (1 unstable [all])' aptget install orgroup2 orgroup4 -s --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + yyy (1) + | zzz (1:1) + zzz (1:1) +Recommended packages: + xxx + | yyy (1) + xxx +The following NEW packages will be installed: + orgroup2 (1) + orgroup4 (1) +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup2 (1 unstable [all]) +Inst orgroup4 (1 unstable [all]) +Conf orgroup2 (1 unstable [all]) +Conf orgroup4 (1 unstable [all])' aptget install orgroup2 orgroup4 -s -V --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + zzz (1:1) +Recommended packages: + xxx +The following NEW packages will be installed: + orgroup2 (1) + orgroup4 (1) + yyy (1) +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup2 (1 unstable [all]) +Inst orgroup4 (1 unstable [all]) +Inst yyy (1 unstable [all]) +Conf orgroup2 (1 unstable [all]) +Conf orgroup4 (1 unstable [all]) +Conf yyy (1 unstable [all])' aptget install orgroup2 orgroup4 yyy -s -V --no-install-recommends +testsuccessequal 'Reading package lists... +Building dependency tree... +Suggested packages: + ccc | ddd +Recommended packages: + aaa | bbb +The following NEW packages will be installed: + versionedor +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst versionedor (1 unstable [all]) +Conf versionedor (1 unstable [all])' aptget install versionedor -s --no-install-recommends + +SHOWSUGGEST='Reading package lists... +Building dependency tree... +Suggested packages: + zzz +Recommended packages: + xxx +The following NEW packages will be installed: + orgroup4 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup4 (1 unstable [all]) +Conf orgroup4 (1 unstable [all])' +INSTSUGGEST='Reading package lists... +Building dependency tree... +The following additional packages will be installed: + zzz +Recommended packages: + xxx +The following NEW packages will be installed: + orgroup4 zzz +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst orgroup4 (1 unstable [all]) +Inst zzz (1:1 unstable [all]) +Conf orgroup4 (1 unstable [all]) +Conf zzz (1:1 unstable [all])' +testsuccessequal "$SHOWSUGGEST" aptget install orgroup4 -s +testsuccessequal "$INSTSUGGEST" aptget install orgroup4 --install-suggests -s +echo 'Binary::apt-get::APT::Install-Suggests "true";' > rootdir/etc/apt/apt.conf.d/99binaryspecific.conf +testsuccessequal "$INSTSUGGEST" aptget install orgroup4 -s +testsuccessequal "$SHOWSUGGEST" apt install orgroup4 -s +testsuccessequal "$SHOWSUGGEST" aptget install orgroup4 -s --no-install-suggests diff --git a/test/integration/test-apt-source-and-build-dep b/test/integration/test-apt-source-and-build-dep new file mode 100755 index 0000000..24790a5 --- /dev/null +++ b/test/integration/test-apt-source-and-build-dep @@ -0,0 +1,250 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +# we need to insert a package into "unstable" so that a Release file is +# create for the test +insertpackage 'wheezy' 'build-essential' 'all' '1.0' + +# a "normal" package with source and binary +insertpackage 'unstable' 'foo' 'all' '2.0' +insertsource 'unstable' 'foo' 'all' '2.0' +insertpackage 'unstable' 'foo-common' 'all' '2.0' 'Source: foo (2.0)' +insertpackage 'experimental' 'foo' 'all' '5' 'Depends: foo-common (= 5)' +insertpackage 'experimental' 'foo-common' 'all' '5' 'Source: foo (5)' +insertsource 'experimental' 'foo-source' 'all' '42' 'Build-Depends: foo (= 5), baz' + +# binary packages with Source-field +insertpackage 'unstable,testing' 'bin' 'i386' '3-2+b1' 'Source: bin (3-2)' +insertsource 'unstable,testing' 'bin' 'any' '3-2' +insertpackage 'stable' 'bin' 'i386' '2-2+b1' 'Source: bin-backport (2-2)' +insertsource 'stable' 'bin-backport' 'any' '2-2' + +# its possible to have multiple src versions in the sources file, ensure +# to pick the correct one in this case (bts #731853) +insertsource 'stable' 'foo' 'all' '1.5' +insertsource 'stable' 'foo' 'all' '0.5' +insertpackage 'stable' 'foo' 'all' '1.0' +insertsource 'stable' 'foo' 'all' '1.0' + +# these packages exists only as sources, add two versions to ensure that +# apt will pick the higher version number (bts #731853) +insertsource 'wheezy' 'foo' 'all' '0.0.1' +insertsource 'wheezy' 'foo' 'all' '0.1' + +# the order of these versions is chosen to ensure that +# * apt will pick the one in the correct release, despite a higher version coming later and +# * apt will pick the highest version in a release, despite a lower version coming later. +# (bts #746412) +insertsource 'stable' 'baz' 'all' '1.0' +insertsource 'unstable' 'baz' 'all' '2.0' +insertsource 'unstable' 'baz' 'all' '1.5' +insertpackage 'unstable' 'baz' 'all' '2.0' +insertpackage 'experimental' 'baz' 'all' '5.0' + +# ensure we really have the situation we wanted (first 2.0 is foo above) +testequal 'Version: 2.0 +Version: 3-2 +Version: 2.0 +Version: 1.5' grep '^Version:' aptarchive/dists/unstable/main/source/Sources + +insertsource 'stable' 'bar' 'any' '1.1' 'Vcs-Browser: https://anonscm.debian.org/cgit/bar/bar.git +Vcs-Git: git://anonscm.debian.org/bar/bar.git -b debian/experimental' + +setupaptarchive + +APTARCHIVE=$(readlink -f ./aptarchive) + +# normal operation gets highest version number +HEADER='Reading package lists...' +DOWNLOAD1="Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/foo_1.0.dsc' foo_1.0.dsc 11 SHA256:ed7c25c832596339bee13e4e7c45cf49f869b60d2bf57252f18191d75866c2a7 +'file://${APTARCHIVE}/foo_1.0.tar.gz' foo_1.0.tar.gz 14 SHA256:f3da8c6ebc62c8ef2dae439a498dddcdacc1a07f45ff67ad12f44b6e2353c239" +DOWNLOAD2="Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/foo_2.0.dsc' foo_2.0.dsc 11 SHA256:0fcb803ffbeef26db884625aaf06e75f3eda5c994634980e7c20fd37ed1fc104 +'file://${APTARCHIVE}/foo_2.0.tar.gz' foo_2.0.tar.gz 14 SHA256:ca9b0b828ca22372502af2b80f61f0bd9063910ece9fc34eeaf9d9e31aa8195a" +DOWNLOAD3="Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/baz_1.0.dsc' baz_1.0.dsc 11 SHA256:322245f56092b466801dda62d79c8687bba9724af6d16d450d655d29e41d3d7b +'file://${APTARCHIVE}/baz_1.0.tar.gz' baz_1.0.tar.gz 14 SHA256:0870bc73164ff5ba1f52153fdcb48e140137f9c7c122d57592cea136a57f73c0" +DOWNLOAD4="Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/baz_2.0.dsc' baz_2.0.dsc 11 SHA256:47d062d29070b3f592d1c8aed8c1e7913804bbb67ca1d64877c8219dac5e0420 +'file://${APTARCHIVE}/baz_2.0.tar.gz' baz_2.0.tar.gz 14 SHA256:11c1b202c94a64ab6433d9f0ed5515fce1dc7b20e6bcf51cec9ef8b9455f5a41" +testsuccessequal "$HEADER +$DOWNLOAD2" apt source -q --print-uris foo +testsuccessequal "$HEADER +$DOWNLOAD2" apt source -q --print-uris foo foo +getbuilddep() { + echo 'Reading package lists...' + if [ -n "$2" ]; then + echo "$2" + fi + echo "${1} has no build depends. +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-essential +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst build-essential (1.0 wheezy [all]) +Conf build-essential (1.0 wheezy [all])" +} +testsuccessequal "$(getbuilddep 'foo')" apt build-dep foo -s + +# select by release: suite +testsuccessequal "$HEADER +Selected version '1.0' (stable) for foo +$DOWNLOAD1" apt source -q --print-uris foo/stable +testsuccessequal "$(getbuilddep 'foo' "Selected version '1.0' (stable) for foo")" apt build-dep foo/stable -s +testsuccessequal "$HEADER +Selected version '2.0' (unstable) for foo +$DOWNLOAD2" apt source -q --print-uris foo/unstable +testsuccessequal "$(getbuilddep 'foo' "Selected version '2.0' (unstable) for foo")" apt build-dep foo/unstable -s +testsuccessequal "$HEADER +Selected version '1.0' (stable) for foo +$DOWNLOAD1" apt source -q --print-uris foo -t stable +testsuccessequal "$(getbuilddep 'foo' "Selected version '1.0' (stable) for foo")" apt build-dep foo -t stable -s +testsuccessequal "$HEADER +Selected version '2.0' (unstable) for foo +$DOWNLOAD2" apt source -q --print-uris foo -t unstable +testsuccessequal "$(getbuilddep 'foo' "Selected version '2.0' (unstable) for foo")" apt build-dep foo -t unstable -s +testsuccessequal "$HEADER +Selected version '1.0' (stable) for baz +$DOWNLOAD3" apt source -q --print-uris baz -t stable +testsuccessequal "$(getbuilddep 'baz' "Selected version '1.0' (stable) for baz")" apt build-dep baz -t stable -s + +# select by release: codename +testsuccessequal "$HEADER +Selected version '2.0' (sid) for foo +$DOWNLOAD2" apt source -q --print-uris foo/sid +testsuccessequal "$(getbuilddep 'foo' "Selected version '2.0' (sid) for foo")" apt build-dep foo/sid -s +testsuccessequal "$HEADER +Selected version '2.0' (sid) for foo +$DOWNLOAD2" apt source -q --print-uris foo -t sid +testsuccessequal "$(getbuilddep 'foo' "Selected version '2.0' (sid) for foo")" apt build-dep foo -t sid -s +testsuccessequal "$HEADER +Selected version '2.0' (sid) for baz +$DOWNLOAD4" apt source -q --print-uris baz -t sid +testsuccessequal "$(getbuilddep 'baz' "Selected version '2.0' (sid) for baz")" apt build-dep baz -t sid -s + +# select by version +testsuccessequal "$HEADER +$DOWNLOAD1" apt source -q --print-uris foo=1.0 +testsuccessequal "$(getbuilddep 'foo')" apt build-dep foo=1.0 -s + +# select by release with no binary package (Bug#731102) but ensure to get +# highest version +DOWNLOAD01="Need to get 0 B/25 B of source archives. +'file://${APTARCHIVE}/foo_0.1.dsc' foo_0.1.dsc 11 SHA256:72af24b0290fe1d13a3e25fddd2633e43c87ff79d249bc850009e47bcce73565 +'file://${APTARCHIVE}/foo_0.1.tar.gz' foo_0.1.tar.gz 14 SHA256:ec748ad88a71f98bfdc012e1a7632377d05fe3ebbf9c0922e0691fe4d79c0585" +testsuccessequal "$HEADER +Selected version '0.1' (wheezy) for foo +$DOWNLOAD01" apt source -q --print-uris foo/wheezy +testsuccessequal "$(getbuilddep 'foo' "Selected version '0.1' (wheezy) for foo")" apt build-dep foo/wheezy -s + +# unavailable one +testfailureequal "$HEADER +E: Can not find version '9.9-not-there' of package 'foo' +E: Unable to find a source package for foo" apt source -q --print-uris foo=9.9-not-there +testfailureequal "Reading package lists... +E: Can not find version '9.9-not-there' of package 'foo' +E: Unable to find a source package for foo=9.9-not-there" apt build-dep -s foo=9.9-not-there + +# version and release +DOWNLOAD001="Need to get 0 B/29 B of source archives. +'file://${APTARCHIVE}/foo_0.0.1.dsc' foo_0.0.1.dsc 13 SHA256:649dfe03bbb70cebdfe7c6bf9036f9f2472510b8f52e823bdf5ade362ebaa76f +'file://${APTARCHIVE}/foo_0.0.1.tar.gz' foo_0.0.1.tar.gz 16 SHA256:ab7ba789d178362ecc808e49705e2338988a7f5b9410ec11a6c9555c017de907" +testsuccessequal "$HEADER +$DOWNLOAD001" apt source -q --print-uris -t unstable foo=0.0.1 +testsuccessequal "$(getbuilddep 'foo')" apt build-dep foo=0.0.1 -s + +testsuccessequal "$HEADER +Need to get 0 B/25 B of source archives. +Fetch source foo" apt source -q -s foo +testsuccessequal "$(getbuilddep 'foo')" apt build-dep foo -s + +testfailureequal 'E: Must specify at least one package to fetch source for' apt source +testfailureequal 'E: Must specify at least one package to check builddeps for' apt build-dep + +testsuccessequal "Reading package lists... +NOTICE: 'bar' packaging is maintained in the 'Git' version control system at: +git://anonscm.debian.org/bar/bar.git -b debian/experimental +Please use: +git clone git://anonscm.debian.org/bar/bar.git -b debian/experimental +to retrieve the latest (possibly unreleased) updates to the package. +Need to get 0 B/25 B of source archives. +Fetch source bar" apt source bar -s +testsuccessequal "$(getbuilddep 'bar')" apt build-dep bar -s + +testsuccessequal "$HEADER +Need to get 0 B/25 B of source archives. +Fetch source bin" apt source bin -s -q +testsuccessequal "$(getbuilddep 'bin')" apt build-dep bin -s +testsuccessequal "$HEADER +Selected version '3-2' (unstable) for bin +Need to get 0 B/25 B of source archives. +Fetch source bin" apt source bin/unstable -s -q +testsuccessequal "$(getbuilddep 'bin' "Selected version '3-2' (unstable) for bin")" apt build-dep bin/unstable -s +testsuccessequal "$HEADER +Picking 'bin-backport' as source package instead of 'bin' +Selected version '2-2' (stable) for bin-backport +Need to get 0 B/43 B of source archives. +Fetch source bin-backport" apt source bin/stable -s -q +testsuccessequal "$(getbuilddep 'bin-backport' "Picking 'bin-backport' as source package instead of 'bin' +Selected version '2-2' (stable) for bin-backport")" apt build-dep bin/stable -s + +testsuccess apt install foo/experimental -s +testfailure apt build-dep foo-source -s +testsuccessequal "Reading package lists... +Selected version '42' (experimental) for foo-source +Reading package lists... +Building dependency tree... +Selected version '5' (experimental [all]) for 'foo' because of 'src:foo-source' +Selected version '5' (experimental [all]) for 'foo-common' because of 'foo' +The following NEW packages will be installed: + baz build-essential foo foo-common +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Inst baz (2.0 unstable [all]) +Inst build-essential (1.0 wheezy [all]) +Inst foo-common (5 experimental [all]) +Inst foo (5 experimental [all]) +Conf baz (2.0 unstable [all]) +Conf build-essential (1.0 wheezy [all]) +Conf foo-common (5 experimental [all]) +Conf foo (5 experimental [all])" apt build-dep foo-source/experimental -s +testsuccessequal "Reading package lists... +Selected version '42' (experimental) for foo-source +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + baz build-essential foo foo-common +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Inst baz (5.0 experimental [all]) +Inst build-essential (1.0 wheezy [all]) +Inst foo-common (5 experimental [all]) +Inst foo (5 experimental [all]) +Conf baz (5.0 experimental [all]) +Conf build-essential (1.0 wheezy [all]) +Conf foo-common (5 experimental [all]) +Conf foo (5 experimental [all])" apt build-dep foo-source -t experimental -s +# this checks that mentioning the source pkg baz has no influence on the binary package baz +testsuccessequal "Reading package lists... +Selected version '42' (experimental) for foo-source +Selected version '2.0' (unstable) for baz +baz has no build depends. +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + baz build-essential foo foo-common +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Inst baz (5.0 experimental [all]) +Inst build-essential (1.0 wheezy [all]) +Inst foo-common (5 experimental [all]) +Inst foo (5 experimental [all]) +Conf baz (5.0 experimental [all]) +Conf build-essential (1.0 wheezy [all]) +Conf foo-common (5 experimental [all]) +Conf foo (5 experimental [all])" apt build-dep foo-source baz/unstable -t experimental -s diff --git a/test/integration/test-apt-sources-deb822 b/test/integration/test-apt-sources-deb822 new file mode 100755 index 0000000..8ffe0ab --- /dev/null +++ b/test/integration/test-apt-sources-deb822 @@ -0,0 +1,361 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +LISTS='rootdir/etc/apt/sources.list.d/test.list' +ABSLISTS="$(readlink -f $LISTS)" +SOURCES='rootdir/etc/apt/sources.list.d/test.sources' +BASE='# some comment +# that contains a : as well +#Types: meep + +# a free-standing comment appears + +Types: deb +#Types: deb-src +URIs: http://ftp.debian.org/debian +Suites: stable +Components: main +Description: summary +# comments are ignored + and the long part' + +msgcleantest() { + rm -f $LISTS $SOURCES + msgtest "$@" +} + +msgcleantest 'Test sources.list' 'old style' +echo "deb http://ftp.debian.org/debian stable main" > $LISTS +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style with tabs' +echo "deb http://ftp.debian.org/debian stable main" > $LISTS +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style with forgotten end for options' +echo "deb [trusted=yes arch+=armel,powerpc http://ftp.debian.org/debian stable main" > $LISTS +testfailureequal --nomsg "E: Malformed entry 1 in list file $ABSLISTS ([option] not assignment) +E: The list of sources could not be read." aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style with stray ] instead of options' +echo "deb ] http://ftp.debian.org/debian stable main" > $LISTS +testfailureequal --nomsg "E: Malformed entry 1 in list file $ABSLISTS (URI parse) +E: The list of sources could not be read." aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style options no key' +echo "deb [=test] http://ftp.debian.org/debian stable main" > $LISTS +testfailureequal --nomsg "E: Malformed entry 1 in list file $ABSLISTS ([option] no key) +E: The list of sources could not be read." aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style options no value' +echo "deb [test=] http://ftp.debian.org/debian stable main" > $LISTS +testfailureequal --nomsg "E: Malformed entry 1 in list file $ABSLISTS ([option] no value) +E: The list of sources could not be read." aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style with options' +echo "deb [trusted=yes arch+=armel,powerpc] http://ftp.debian.org/debian stable main" > $LISTS +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-armel/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-armel_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style with comments' +echo "deb http://ftp.debian.org/debian stable main # non-free" > $LISTS +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test sources.list' 'old style with option comments' +echo "deb [trusted=yes#yeahreally] http://ftp.debian.org/debian stable main # non-free" > $LISTS +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test sources.list' 'simple deb822' +echo "$BASE" > $SOURCES +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test deb822 with' 'two entries' +# Two entries +echo "$BASE" > $SOURCES +echo "" >> $SOURCES +echo "$BASE" | sed s/stable/unstable/ >> $SOURCES +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/unstable/InRelease' ftp.debian.org_debian_dists_unstable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/unstable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_unstable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 " aptget update --print-uris + +# two suite entries +msgcleantest 'Test deb822 with' 'two Suite entries' +echo "$BASE" | sed -e "s/stable/stable unstable/" > $SOURCES +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/unstable/InRelease' ftp.debian.org_debian_dists_unstable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/unstable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_unstable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test deb822' 'architecture option' +echo "$BASE" > $SOURCES +echo "Architectures: amd64 armel" >> $SOURCES +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-armel/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-armel_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +msgcleantest 'Test old-style' 'suite arch variable' +echo 'deb http://ftp.tlh.debian.org/universe unstable/binary-$(ARCH)/' > $LISTS +testsuccessequal --nomsg "'http://ftp.tlh.debian.org/universe/unstable/binary-i386/InRelease' ftp.tlh.debian.org_universe_unstable_binary-i386_InRelease 0 +'http://ftp.tlh.debian.org/universe/unstable/binary-i386/Packages.xz' ftp.tlh.debian.org_universe_unstable_binary-i386_Packages 0 +'http://ftp.tlh.debian.org/universe/unstable/binary-i386/en.xz' ftp.tlh.debian.org_universe_unstable_binary-i386_en 0 " aptget update --print-uris + +msgcleantest 'Test deb822' 'suite arch variable' +echo 'Types: deb +URIs: http://ftp.tlh.debian.org/universe +Suites: stable/binary-$(ARCH)/' > $SOURCES +testsuccessequal --nomsg "'http://ftp.tlh.debian.org/universe/stable/binary-i386/InRelease' ftp.tlh.debian.org_universe_stable_binary-i386_InRelease 0 +'http://ftp.tlh.debian.org/universe/stable/binary-i386/Packages.xz' ftp.tlh.debian.org_universe_stable_binary-i386_Packages 0 +'http://ftp.tlh.debian.org/universe/stable/binary-i386/en.xz' ftp.tlh.debian.org_universe_stable_binary-i386_en 0 " aptget update --print-uris + +msgcleantest 'Test old-style sources.list file which has' 'malformed dist' +echo "deb http://ftp.debian.org" > $LISTS +testfailureequal --nomsg "E: Malformed entry 1 in list file $TMPWORKINGDIRECTORY/$LISTS (Suite) +E: The list of sources could not be read." aptget update --print-uris + +msgcleantest 'Test deb822 sources.list file which has' 'malformed URI' +echo "Types: deb +Suites: stable +" > $SOURCES +testfailureequal --nomsg "E: Malformed entry 1 in sources file $TMPWORKINGDIRECTORY/$SOURCES (URI) +E: The list of sources could not be read." aptget update --print-uris + +# with Enabled: false +echo "$BASE" > $SOURCES +echo "Enabled: no" >> $SOURCES +testempty aptget update --print-uris + +# multiple URIs +msgcleantest 'Test deb822 sources.list file which has' 'Multiple URIs work' +echo "$BASE" | sed -e 's#http://ftp.debian.org/debian#http://ftp.debian.org/debian http://ftp.de.debian.org/debian#' > $SOURCES +testsuccessequal --nomsg "'http://ftp.de.debian.org/debian/dists/stable/InRelease' ftp.de.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.de.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.de.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.de.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.de.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.de.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.de.debian.org_debian_dists_stable_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +# multiple Type in one field +msgcleantest 'Test deb822 sources.list file which has' 'Multiple Types work' +echo "$BASE" | sed -e 's#Types: deb#Types: deb deb-src#' > $SOURCES +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/source/Sources.xz' ftp.debian.org_debian_dists_stable_main_source_Sources 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 " aptget update --print-uris + +# a Suite +msgcleantest 'Test deb822 sources.list file which has' 'an exact path and no sections' +cat > $SOURCES <<EOF +Types: deb +URIs: http://emacs.naquadah.org +Suites: stable/ +EOF +testsuccessequal --nomsg "'http://emacs.naquadah.org/stable/InRelease' emacs.naquadah.org_stable_InRelease 0 +'http://emacs.naquadah.org/stable/Packages.xz' emacs.naquadah.org_stable_Packages 0 +'http://emacs.naquadah.org/stable/en.xz' emacs.naquadah.org_stable_en 0 " aptget update --print-uris + +# multivalue -Add/-Remove +msgcleantest 'Test deb822 sources.list file which has' '-Add/-Remove multivalues' +echo "$BASE" > $SOURCES +echo "Languages-Remove: en" >> $SOURCES +echo "Architectures-Add: armel" >> $SOURCES +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-armel/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-armel_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 " aptget update --print-uris + +msgcleantest 'Test deb822 sources with' 'multiline multivalues' +cat > "$SOURCES" <<EOF +Types: deb + deb-src +URIs: + http://ftp.debian.org/debian + http://ftp.debian.org/debian2 +Suites: stable + sid +Components: + main + contrib non-free +Architectures: amd64 + armhf powerpc +EOF +testsuccessequal --nomsg "'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 +'http://ftp.debian.org/debian/dists/sid/InRelease' ftp.debian.org_debian_dists_sid_InRelease 0 +'http://ftp.debian.org/debian2/dists/stable/InRelease' ftp.debian.org_debian2_dists_stable_InRelease 0 +'http://ftp.debian.org/debian2/dists/sid/InRelease' ftp.debian.org_debian2_dists_sid_InRelease 0 +'http://ftp.debian.org/debian/dists/stable/main/source/Sources.xz' ftp.debian.org_debian_dists_stable_main_source_Sources 0 +'http://ftp.debian.org/debian/dists/stable/contrib/source/Sources.xz' ftp.debian.org_debian_dists_stable_contrib_source_Sources 0 +'http://ftp.debian.org/debian/dists/stable/non-free/source/Sources.xz' ftp.debian.org_debian_dists_stable_non-free_source_Sources 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-armhf/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-armhf_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/stable/contrib/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_stable_contrib_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/stable/contrib/binary-armhf/Packages.xz' ftp.debian.org_debian_dists_stable_contrib_binary-armhf_Packages 0 +'http://ftp.debian.org/debian/dists/stable/contrib/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_stable_contrib_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/stable/contrib/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_contrib_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/contrib/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_contrib_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/stable/non-free/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_stable_non-free_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/stable/non-free/binary-armhf/Packages.xz' ftp.debian.org_debian_dists_stable_non-free_binary-armhf_Packages 0 +'http://ftp.debian.org/debian/dists/stable/non-free/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_stable_non-free_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/stable/non-free/binary-all/Packages.xz' ftp.debian.org_debian_dists_stable_non-free_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/stable/non-free/i18n/Translation-en.xz' ftp.debian.org_debian_dists_stable_non-free_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/sid/main/source/Sources.xz' ftp.debian.org_debian_dists_sid_main_source_Sources 0 +'http://ftp.debian.org/debian/dists/sid/contrib/source/Sources.xz' ftp.debian.org_debian_dists_sid_contrib_source_Sources 0 +'http://ftp.debian.org/debian/dists/sid/non-free/source/Sources.xz' ftp.debian.org_debian_dists_sid_non-free_source_Sources 0 +'http://ftp.debian.org/debian/dists/sid/main/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_sid_main_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/sid/main/binary-armhf/Packages.xz' ftp.debian.org_debian_dists_sid_main_binary-armhf_Packages 0 +'http://ftp.debian.org/debian/dists/sid/main/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_sid_main_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/sid/main/binary-all/Packages.xz' ftp.debian.org_debian_dists_sid_main_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/sid/main/i18n/Translation-en.xz' ftp.debian.org_debian_dists_sid_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/sid/contrib/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_sid_contrib_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/sid/contrib/binary-armhf/Packages.xz' ftp.debian.org_debian_dists_sid_contrib_binary-armhf_Packages 0 +'http://ftp.debian.org/debian/dists/sid/contrib/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_sid_contrib_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/sid/contrib/binary-all/Packages.xz' ftp.debian.org_debian_dists_sid_contrib_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/sid/contrib/i18n/Translation-en.xz' ftp.debian.org_debian_dists_sid_contrib_i18n_Translation-en 0 +'http://ftp.debian.org/debian/dists/sid/non-free/binary-amd64/Packages.xz' ftp.debian.org_debian_dists_sid_non-free_binary-amd64_Packages 0 +'http://ftp.debian.org/debian/dists/sid/non-free/binary-armhf/Packages.xz' ftp.debian.org_debian_dists_sid_non-free_binary-armhf_Packages 0 +'http://ftp.debian.org/debian/dists/sid/non-free/binary-powerpc/Packages.xz' ftp.debian.org_debian_dists_sid_non-free_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian/dists/sid/non-free/binary-all/Packages.xz' ftp.debian.org_debian_dists_sid_non-free_binary-all_Packages 0 +'http://ftp.debian.org/debian/dists/sid/non-free/i18n/Translation-en.xz' ftp.debian.org_debian_dists_sid_non-free_i18n_Translation-en 0 +'http://ftp.debian.org/debian2/dists/stable/main/source/Sources.xz' ftp.debian.org_debian2_dists_stable_main_source_Sources 0 +'http://ftp.debian.org/debian2/dists/stable/contrib/source/Sources.xz' ftp.debian.org_debian2_dists_stable_contrib_source_Sources 0 +'http://ftp.debian.org/debian2/dists/stable/non-free/source/Sources.xz' ftp.debian.org_debian2_dists_stable_non-free_source_Sources 0 +'http://ftp.debian.org/debian2/dists/stable/main/binary-amd64/Packages.xz' ftp.debian.org_debian2_dists_stable_main_binary-amd64_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/main/binary-armhf/Packages.xz' ftp.debian.org_debian2_dists_stable_main_binary-armhf_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/main/binary-powerpc/Packages.xz' ftp.debian.org_debian2_dists_stable_main_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/main/binary-all/Packages.xz' ftp.debian.org_debian2_dists_stable_main_binary-all_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/main/i18n/Translation-en.xz' ftp.debian.org_debian2_dists_stable_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian2/dists/stable/contrib/binary-amd64/Packages.xz' ftp.debian.org_debian2_dists_stable_contrib_binary-amd64_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/contrib/binary-armhf/Packages.xz' ftp.debian.org_debian2_dists_stable_contrib_binary-armhf_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/contrib/binary-powerpc/Packages.xz' ftp.debian.org_debian2_dists_stable_contrib_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/contrib/binary-all/Packages.xz' ftp.debian.org_debian2_dists_stable_contrib_binary-all_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/contrib/i18n/Translation-en.xz' ftp.debian.org_debian2_dists_stable_contrib_i18n_Translation-en 0 +'http://ftp.debian.org/debian2/dists/stable/non-free/binary-amd64/Packages.xz' ftp.debian.org_debian2_dists_stable_non-free_binary-amd64_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/non-free/binary-armhf/Packages.xz' ftp.debian.org_debian2_dists_stable_non-free_binary-armhf_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/non-free/binary-powerpc/Packages.xz' ftp.debian.org_debian2_dists_stable_non-free_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/non-free/binary-all/Packages.xz' ftp.debian.org_debian2_dists_stable_non-free_binary-all_Packages 0 +'http://ftp.debian.org/debian2/dists/stable/non-free/i18n/Translation-en.xz' ftp.debian.org_debian2_dists_stable_non-free_i18n_Translation-en 0 +'http://ftp.debian.org/debian2/dists/sid/main/source/Sources.xz' ftp.debian.org_debian2_dists_sid_main_source_Sources 0 +'http://ftp.debian.org/debian2/dists/sid/contrib/source/Sources.xz' ftp.debian.org_debian2_dists_sid_contrib_source_Sources 0 +'http://ftp.debian.org/debian2/dists/sid/non-free/source/Sources.xz' ftp.debian.org_debian2_dists_sid_non-free_source_Sources 0 +'http://ftp.debian.org/debian2/dists/sid/main/binary-amd64/Packages.xz' ftp.debian.org_debian2_dists_sid_main_binary-amd64_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/main/binary-armhf/Packages.xz' ftp.debian.org_debian2_dists_sid_main_binary-armhf_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/main/binary-powerpc/Packages.xz' ftp.debian.org_debian2_dists_sid_main_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/main/binary-all/Packages.xz' ftp.debian.org_debian2_dists_sid_main_binary-all_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/main/i18n/Translation-en.xz' ftp.debian.org_debian2_dists_sid_main_i18n_Translation-en 0 +'http://ftp.debian.org/debian2/dists/sid/contrib/binary-amd64/Packages.xz' ftp.debian.org_debian2_dists_sid_contrib_binary-amd64_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/contrib/binary-armhf/Packages.xz' ftp.debian.org_debian2_dists_sid_contrib_binary-armhf_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/contrib/binary-powerpc/Packages.xz' ftp.debian.org_debian2_dists_sid_contrib_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/contrib/binary-all/Packages.xz' ftp.debian.org_debian2_dists_sid_contrib_binary-all_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/contrib/i18n/Translation-en.xz' ftp.debian.org_debian2_dists_sid_contrib_i18n_Translation-en 0 +'http://ftp.debian.org/debian2/dists/sid/non-free/binary-amd64/Packages.xz' ftp.debian.org_debian2_dists_sid_non-free_binary-amd64_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/non-free/binary-armhf/Packages.xz' ftp.debian.org_debian2_dists_sid_non-free_binary-armhf_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/non-free/binary-powerpc/Packages.xz' ftp.debian.org_debian2_dists_sid_non-free_binary-powerpc_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/non-free/binary-all/Packages.xz' ftp.debian.org_debian2_dists_sid_non-free_binary-all_Packages 0 +'http://ftp.debian.org/debian2/dists/sid/non-free/i18n/Translation-en.xz' ftp.debian.org_debian2_dists_sid_non-free_i18n_Translation-en 0 " aptget update --print-uris + +EXPECTEDUK="'http://ftp.uk.debian.org/debian/dists/stretch/InRelease' ftp.uk.debian.org_debian_dists_stretch_InRelease 0 +'http://ftp.uk.debian.org/debian/dists/stretch/main/source/Sources.xz' ftp.uk.debian.org_debian_dists_stretch_main_source_Sources 0 +'http://ftp.uk.debian.org/debian/dists/stretch/contrib/source/Sources.xz' ftp.uk.debian.org_debian_dists_stretch_contrib_source_Sources 0 +'http://ftp.uk.debian.org/debian/dists/stretch/non-free/source/Sources.xz' ftp.uk.debian.org_debian_dists_stretch_non-free_source_Sources 0 +'http://ftp.uk.debian.org/debian/dists/stretch/main/binary-i386/Packages.xz' ftp.uk.debian.org_debian_dists_stretch_main_binary-i386_Packages 0 +'http://ftp.uk.debian.org/debian/dists/stretch/main/binary-all/Packages.xz' ftp.uk.debian.org_debian_dists_stretch_main_binary-all_Packages 0 +'http://ftp.uk.debian.org/debian/dists/stretch/main/i18n/Translation-en.xz' ftp.uk.debian.org_debian_dists_stretch_main_i18n_Translation-en 0 +'http://ftp.uk.debian.org/debian/dists/stretch/contrib/binary-i386/Packages.xz' ftp.uk.debian.org_debian_dists_stretch_contrib_binary-i386_Packages 0 +'http://ftp.uk.debian.org/debian/dists/stretch/contrib/binary-all/Packages.xz' ftp.uk.debian.org_debian_dists_stretch_contrib_binary-all_Packages 0 +'http://ftp.uk.debian.org/debian/dists/stretch/contrib/i18n/Translation-en.xz' ftp.uk.debian.org_debian_dists_stretch_contrib_i18n_Translation-en 0 +'http://ftp.uk.debian.org/debian/dists/stretch/non-free/binary-i386/Packages.xz' ftp.uk.debian.org_debian_dists_stretch_non-free_binary-i386_Packages 0 +'http://ftp.uk.debian.org/debian/dists/stretch/non-free/binary-all/Packages.xz' ftp.uk.debian.org_debian_dists_stretch_non-free_binary-all_Packages 0 +'http://ftp.uk.debian.org/debian/dists/stretch/non-free/i18n/Translation-en.xz' ftp.uk.debian.org_debian_dists_stretch_non-free_i18n_Translation-en 0 " + +msgcleantest 'Test deb822 sources.list file comments' 'top' +cat > $SOURCES <<EOF +#NOTE: Most preferred source listed first! + + +#=== NEW MULTI-LINE FORMAT =============== +Types: deb deb-src +URIs:http://ftp.uk.debian.org/debian/ +Suites: stretch +Components: main contrib non-free +EOF +testsuccessequal --nomsg "$EXPECTEDUK" aptget update --print-uris + +msgcleantest 'Test deb822 sources.list file comments' 'bottom' +cat > $SOURCES <<EOF +Types: deb deb-src +URIs:http://ftp.uk.debian.org/debian/ +Suites: stretch +Components: main contrib non-free +#=== NEW MULTI-LINE FORMAT =============== + + +#NOTE: Most preferred source listed first! +EOF +testsuccessequal --nomsg "$EXPECTEDUK" aptget update --print-uris + +msgcleantest 'Test deb822 sources.list file comments' 'both' +cat > $SOURCES <<EOF +#=== NEW MULTI-LINE FORMAT =============== + + +#NOTE: Most preferred source listed first! +Types: deb deb-src +URIs:http://ftp.uk.debian.org/debian/ +Suites: stretch +Components: main contrib non-free +#=== NEW MULTI-LINE FORMAT =============== + + +#NOTE: Most preferred source listed first! +EOF +testsuccessequal --nomsg "$EXPECTEDUK" aptget update --print-uris + + +msgcleantest 'Test deb822 sources.list file comments' 'empty' +cat > $SOURCES <<EOF +#=== NEW MULTI-LINE FORMAT =============== + + +EOF +testempty aptget update --print-uris diff --git a/test/integration/test-apt-tagfile-fields-order b/test/integration/test-apt-tagfile-fields-order new file mode 100755 index 0000000..4af58aa --- /dev/null +++ b/test/integration/test-apt-tagfile-fields-order @@ -0,0 +1,82 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment + +dpkg_field_ordered_list() { + local FIELDS="$(perl -e " +use Dpkg::Control; +use Dpkg::Control::Fields; +foreach \$f (field_ordered_list(${1})) { + print \"\$f\\n\"; +}" | sort -u)" + if [ -z "$FIELDS" ]; then + msgfail 'Could not get fields via libdpkg-perl' + fi + echo "$FIELDS" +} + +comparelsts() { + local DIFFOUTPUT="$(diff -u apt.lst dpkg.lst || true)" + if echo "$DIFFOUTPUT" | grep -q '^+[^+]'; then + echo + echo "$DIFFOUTPUT" | grep '^[+-][^+-]' + msgfail + else + msgpass + fi +} + +msgtest 'Check that apt knows all fields dpkg orders in' 'Packages' +dpkg_field_ordered_list 'CTRL_INDEX_PKG' > dpkg.lst +sed -ne 's#^ "\(.*\)",.*$#\1#p' "${SOURCEDIRECTORY}/apt-pkg/tagfile-order.c" | sed -n '/^Package$/,/^Package$/ p' | head -n -1 | sort -u > apt.lst +comparelsts + +msgtest 'Check that apt knows all fields dpkg orders in' 'status' +dpkg_field_ordered_list 'CTRL_FILE_STATUS' > dpkg.lst +comparelsts + +msgtest 'Check that apt knows all fields dpkg orders in' 'DEBIAN/control' +dpkg_field_ordered_list 'CTRL_PKG_DEB' > dpkg.lst +comparelsts + +msgtest 'Check that apt knows all fields dpkg orders in' 'Sources' +dpkg_field_ordered_list 'CTRL_INDEX_SRC' > dpkg.lst +echo 'Package' > apt.tmp +sed -ne 's#^ "\(.*\)",.*$#\1#p' "${SOURCEDIRECTORY}/apt-pkg/tagfile-order.c" | sed '/^Package$/,/^Package$/ d' >> apt.tmp +sort -u apt.tmp > apt.lst +comparelsts + +msgtest 'Check that apt knows all fields dpkg orders in' 'dsc' +dpkg_field_ordered_list 'CTRL_PKG_SRC' > dpkg.lst +comparelsts + +# HACK, but there is no good way to acquire sources in tests and/or to remember to run this regular manually +if [ "$USER" = 'david' ]; then + msgtest 'Check if we have somewhere the sources of' 'dpkg' + DPKGSOURCE="$(locate dpkg/lib/dpkg/parse.c | head -n 1 || true)" + if [ -z "$DPKGSOURCE" ]; then + msgskip 'Not found' + else + msgpass + msgtest 'Check that apt knows about all fields' 'dpkg parses' + sed -n 's#^.*FIELD("\(.*\)").*$#\1#p' "${DPKGSOURCE}" | sort -u > dpkg.lst + sed -ne 's#^ "\(.*\)",.*$#\1#p' "${SOURCEDIRECTORY}/apt-pkg/tagfile-order.c" | sed -n '/^Package$/,/^Package$/ p' | head -n -1 | sort -u > apt.lst + comparelsts + fi + + msgtest 'Check if we have somewhere the sources of' 'dak' + DAKSOURCE="$(locate dak/setup/core-init.d/080_metadatakeys | head -n 1 || true)" + if [ -z "$DAKSOURCE" ]; then + msgskip 'Not found' + else + msgpass + msgtest 'Check that apt knows about all fields' 'dak knows' + # dak mixes both, so we can only check with the mixed one as well + sed -ne "s#^.* VALUES ('\(.*\)', \(.*\)).*\$#\1 \2#p" "${DAKSOURCE}" | cut -d ' ' -f 1 | sort -u > dpkg.lst + sed -ne 's#^ "\(.*\)",.*$#\1#p' "${SOURCEDIRECTORY}/apt-pkg/tagfile-order.c" | sort -u > apt.lst + comparelsts + fi +fi diff --git a/test/integration/test-apt-translation-has-no-packages b/test/integration/test-apt-translation-has-no-packages new file mode 100755 index 0000000..3c07af3 --- /dev/null +++ b/test/integration/test-apt-translation-has-no-packages @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Due to corruption (local or network) a user might end up with a +# Translation-$lang file on disk that is actually a Packages file. In this +# case apt used to generate invalid package versions out of the +# Translation-$lang file (i.e. apt-cache policy foo) would show a version +# coming out of a Translation file. Downloading this versions fails as +# there is no acquire method available for the package +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "amd64" + +buildsimplenativepackage 'foo' 'all' '1.0' +setupaptarchive + +APTARCHIVE="$(readlink -f ./aptarchive)" + +# corrupt the Translation-en file to look like a regular Packages file +rm rootdir/var/cache/apt/*.bin +cp "$APTARCHIVE/dists/unstable/main/binary-amd64/Packages" \ + rootdir/var/lib/apt/lists/*Translation-en + +# ensure that there is no Version for the package foo generated out of +# the corrupted Translation-en file +testsuccessequal "foo: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 file:$APTARCHIVE unstable/main all Packages" aptcache policy foo diff --git a/test/integration/test-apt-update-disappeared-component b/test/integration/test-apt-update-disappeared-component new file mode 100755 index 0000000..7c7dd77 --- /dev/null +++ b/test/integration/test-apt-update-disappeared-component @@ -0,0 +1,45 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'foobar' 'all' '1' + +APTARCHIVE="file:$(readlink -f ./aptarchive) unstable InRelease" +setupaptarchive --no-update +sed -i -e 's#main\s*$#main contrib non-free sub/component#' rootdir/etc/apt/sources.list.d/* + +# if no Component info is available we assume all are supported, which means +# that non-existent Packages files are assumed to be missing because they are +# empty (as the repository is declaring support for them via Architectures) +testwarningmsg "W: Skipping acquire of configured file 'contrib/source/Sources' as repository '${APTARCHIVE}' does not seem to provide it (sources.list entry misspelt?) +W: Skipping acquire of configured file 'non-free/source/Sources' as repository '${APTARCHIVE}' does not seem to provide it (sources.list entry misspelt?) +W: Skipping acquire of configured file 'sub/component/source/Sources' as repository '${APTARCHIVE}' does not seem to provide it (sources.list entry misspelt?)" apt update + +sed -i -e '/^Codename: / a\ +Components: main contrib' $(find ./aptarchive -name 'Release') +signreleasefiles + +testwarningmsg "W: Skipping acquire of configured file 'contrib/source/Sources' as repository '${APTARCHIVE}' does not seem to provide it (sources.list entry misspelt?) +W: Skipping acquire of configured file 'non-free/source/Sources' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'sub/component/source/Sources' as repository '${APTARCHIVE}' doesn't have the component 'sub/component' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'non-free/binary-amd64/Packages' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'non-free/binary-all/Packages' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'non-free/i18n/Translation-en' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'sub/component/binary-amd64/Packages' as repository '${APTARCHIVE}' doesn't have the component 'sub/component' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'sub/component/binary-all/Packages' as repository '${APTARCHIVE}' doesn't have the component 'sub/component' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'sub/component/i18n/Translation-en' as repository '${APTARCHIVE}' doesn't have the component 'sub/component' (component misspelt in sources.list?)" apt update + +# the field looks like this e.g. for security.debian.org sources +sed -i -e 's#^Components:.*$#Components: updates/main updates/contrib sub/component#' $(find ./aptarchive -name 'Release') +signreleasefiles + +testwarningmsg "W: Skipping acquire of configured file 'contrib/source/Sources' as repository '${APTARCHIVE}' does not seem to provide it (sources.list entry misspelt?) +W: Skipping acquire of configured file 'non-free/source/Sources' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'sub/component/source/Sources' as repository '${APTARCHIVE}' does not seem to provide it (sources.list entry misspelt?) +W: Skipping acquire of configured file 'non-free/binary-amd64/Packages' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'non-free/binary-all/Packages' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?) +W: Skipping acquire of configured file 'non-free/i18n/Translation-en' as repository '${APTARCHIVE}' doesn't have the component 'non-free' (component misspelt in sources.list?)" apt update diff --git a/test/integration/test-apt-update-empty-files b/test/integration/test-apt-update-empty-files new file mode 100755 index 0000000..24e40f9 --- /dev/null +++ b/test/integration/test-apt-update-empty-files @@ -0,0 +1,47 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' +configcompression '.' 'gz' + +insertpackage 'unstable' 'apt' 'amd64' '1' +# this automatically gives us an empty Sources file + +setupaptarchive --no-update + +msgmsg 'Test with file' +rm -rf rootdir/var/lib/apt/lists +testsuccess apt update -o Debug::pkgAcquire::Worker=1 +cp rootdir/tmp/testsuccess.output apt.output +testfailure grep '%0a\(Alt\)\?Filename:%20/.*/Sources\(\.gz\)\?%0a' apt.output +testempty find rootdir/var/lib/apt/lists -name '*_Sources' + +msgmsg 'Test with http' +changetowebserver +rm -rf rootdir/var/lib/apt/lists +testsuccess apt update -o Debug::pkgAcquire::Worker=1 +cp rootdir/tmp/testsuccess.output apt.output +testfailure grep 'http:600.*Sources' apt.output +testempty find rootdir/var/lib/apt/lists -name '*_Sources' + +msgmsg 'Test lists-cleanup on newly empty' +rm -rf rootdir/var/lib/apt/lists +insertsource 'unstable' 'apt' 'any' '1' +compressfile aptarchive/dists/unstable/main/source/Sources +generatereleasefiles +signreleasefiles +testsuccess apt update -o Debug::pkgAcquire::Worker=1 +cp rootdir/tmp/testsuccess.output apt.output +testsuccess grep 'http:600.*Sources' apt.output +echo -n > aptarchive/dists/unstable/main/source/Sources +compressfile aptarchive/dists/unstable/main/source/Sources +generatereleasefiles 'now + 1hour' +signreleasefiles +testsuccess apt update -o Debug::pkgAcquire::Worker=1 -o APT::Get::List-Cleanup=0 -o Debug::Acquire::Transaction=1 +cp rootdir/tmp/testsuccess.output apt.output +testfailure grep 'http:600.*Sources' apt.output +testempty find rootdir/var/lib/apt/lists -name '*_Sources' diff --git a/test/integration/test-apt-update-expected-size b/test/integration/test-apt-update-expected-size new file mode 100755 index 0000000..32fa039 --- /dev/null +++ b/test/integration/test-apt-update-expected-size @@ -0,0 +1,99 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' +configcompression '.' 'gz' + +insertpackage 'unstable' 'apt' 'i386' '1.0' + +export APT_DONT_SIGN='' +setupaptarchive --no-update +cp -a aptarchive/dists aptarchive/dists.good + +test_inreleasetoobig() { + # make InRelease really big to trigger fallback + dd if=/dev/zero of=aptarchive/dists/unstable/InRelease bs=1M count=2 2>/dev/null + touch -d '+1hour' aptarchive/dists/unstable/InRelease + testsuccess aptget update -o Apt::Get::List-Cleanup=0 -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0 + msgtest 'Check that the max write warning is triggered' + cp rootdir/tmp/testsuccess.output update.output + testsuccess --nomsg grep -q 'File has unexpected size' update.output + rm -f update.output + # ensure the failed InRelease file got renamed + testsuccess ls rootdir/var/lib/apt/lists/partial/*InRelease.FAILED + testfailure test -e rootdir/var/lib/apt/lists/partial/Old.FAILED +} + +test_packagestoobig() { + insertpackage 'unstable' 'foo' 'i386' '1.0' + buildaptarchivefromfiles '+1 hour' + signreleasefiles + # append junk at the end of the Packages.gz/Packages + SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages.gz)" + find aptarchive/dists -name 'Packages*' | while read pkg; do + echo "1234567890" >> "$pkg" + touch -d '+1hour' "$pkg" + done + NEW_SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages.gz)" + testfailuremsg "E: Failed to fetch ${1}/dists/unstable/main/binary-i386/Packages.gz File has unexpected size ($NEW_SIZE != $SIZE). Mirror sync in progress? +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::Transaction=0 + testsuccess ls rootdir/var/lib/apt/lists/partial/*Packages*.FAILED + testfailure test -e rootdir/var/lib/apt/lists/partial/Old.FAILED +} + +test_packagestoosmall() { + insertpackage 'unstable' 'foo' 'i386' '1.0' + buildaptarchivefromfiles '+1 hour' + signreleasefiles + # replace Packages.gz/Packages with short junk + SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages.gz)" + find aptarchive/dists -name 'Packages*' | while read pkg; do + echo "1234567890" > "$pkg" + touch -d '+1hour' "$pkg" + done + NEW_SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages.gz)" + testfailuremsg "E: Failed to fetch ${1}/dists/unstable/main/binary-i386/Packages.gz File is smaller than expected ($NEW_SIZE < $SIZE). Mirror sync in progress? +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::Transaction=0 + testsuccess ls rootdir/var/lib/apt/lists/partial/*Packages*.FAILED + testfailure test -e rootdir/var/lib/apt/lists/partial/Old.FAILED +} + + +methodtest() { + # less complicated test setup this way + webserverconfig 'aptwebserver::support::modified-since' 'false' "$1" + webserverconfig 'aptwebserver::support::last-modified' 'false' "$1" # curl is clever and sees hits here also + + msgmsg 'Test with' "$1" 'and clean start' + rm -rf rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists.good aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists + # normal update works fine + testsuccess aptget update + touch rootdir/var/lib/apt/lists/partial/Old.FAILED + mv rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists.good + # starting fresh works + test_inreleasetoobig "$1" + rm -rf aptarchive/dists rootdir/var/lib/apt/lists + cp -a aptarchive/dists.good aptarchive/dists + test_packagestoobig "$1" + + msgmsg 'Test with' "$1" 'and existing old data' + rm -rf aptarchive/dists rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists.good rootdir/var/lib/apt/lists + cp -a aptarchive/dists.good aptarchive/dists + test_inreleasetoobig "$1" + rm -rf aptarchive/dists rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists.good rootdir/var/lib/apt/lists + cp -a aptarchive/dists.good aptarchive/dists + test_packagestoobig "$1" +} + +changetowebserver +methodtest "http://localhost:${APTHTTPPORT}" + +changetohttpswebserver +methodtest "https://localhost:${APTHTTPSPORT}" diff --git a/test/integration/test-apt-update-failure-propagation b/test/integration/test-apt-update-failure-propagation new file mode 100755 index 0000000..44f2e70 --- /dev/null +++ b/test/integration/test-apt-update-failure-propagation @@ -0,0 +1,90 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'foo' 'all' '1' 'stable' +buildsimplenativepackage 'foo' 'all' '2' 'sid' +setupaptarchive --no-update + +NEWMETHODS="$(readlink -f rootdir)/usr/lib/apt/methods" +OLDMETHODS="$(readlink -f rootdir/usr/lib/apt/methods)" +rm "$NEWMETHODS" +mkdir "$NEWMETHODS" +backupIFS="$IFS" +IFS="$(printf "\n\b")" +for METH in $(find "$OLDMETHODS" -maxdepth 1 ! -type d); do + ln -s "$OLDMETHODS/$(basename "$METH")" "$NEWMETHODS" +done +IFS="$backupIFS" + +changetohttpswebserver +for FILE in rootdir/etc/apt/sources.list.d/*-sid-* ; do + sed -i -e 's#https:#http:#' -e "s#:${APTHTTPSPORT}/#:${APTHTTPPORT}/#" "$FILE" +done + +pretest() { + msgmsg "$@" + rm -rf rootdir/var/lib/apt/lists + testsuccessequal 'N: Unable to locate package foo' aptcache policy foo +} +pretest 'initialize test' 'update' +testsuccess aptget update +testsuccessequal "foo: + Installed: (none) + Candidate: 2 + Version table: + 2 500 + 500 http://localhost:${APTHTTPPORT} sid/main all Packages + 1 500 + 500 https://localhost:${APTHTTPSPORT} stable/main all Packages" aptcache policy foo + +pretest 'not found' 'release files' +mv aptarchive/dists/stable aptarchive/dists/stable.good +testfailuremsg "E: The repository 'https://localhost:${APTHTTPSPORT} stable Release' does not have a Release file. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update +testfailuremsg "E: The repository 'https://localhost:${APTHTTPSPORT} stable Release' does not have a Release file. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update + +mv aptarchive/dists/stable.good aptarchive/dists/stable +posttest() { + testsuccessequal "foo: + Installed: (none) + Candidate: 2 + Version table: + 2 500 + 500 http://localhost:${APTHTTPPORT} sid/main all Packages" aptcache policy foo +} +posttest + +pretest 'method disabled' 'https' +echo 'Dir::Bin::Methods::https "false";' > rootdir/etc/apt/apt.conf.d/99disable-https +testfailuremsg "E: The method 'https' is explicitly disabled via configuration. +N: If you meant to use Tor remember to use tor+https instead of https. +E: Failed to fetch https://localhost:${APTHTTPSPORT}/dists/stable/InRelease +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update +rm -f rootdir/etc/apt/apt.conf.d/99disable-https +posttest + +pretest 'method not installed' 'https' +rm "${NEWMETHODS}/https" +testfailuremsg "E: The method driver ${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/methods/https could not be found. +N: Is the package apt-transport-https installed? +E: Failed to fetch https://localhost:${APTHTTPSPORT}/dists/stable/InRelease +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update +posttest + +pretest 'https connection refused' 'doom port' +for FILE in rootdir/etc/apt/sources.list.d/*-stable-* ; do + # lets see how many testservers run also Doom + sed -i -e "s#:${APTHTTPSPORT}/#:666/#" "$FILE" +done +testwarning aptget update -o Dir::Bin::Methods::https="${OLDMETHODS}/https" +testsuccess grep '^W: Failed to fetch https://localhost:666/dists/stable/InRelease ' rootdir/tmp/testwarning.output +testequal 'W: Some index files failed to download. They have been ignored, or old ones used instead.' tail -n 1 rootdir/tmp/testwarning.output +posttest diff --git a/test/integration/test-apt-update-file b/test/integration/test-apt-update-file new file mode 100755 index 0000000..8da4ec3 --- /dev/null +++ b/test/integration/test-apt-update-file @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Ensure that we do not modify file:/// uris (regression test for +# CVE-2014-0487 +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "amd64" +configcompression 'bz2' 'gz' +confighashes 'SHA512' + +insertpackage 'unstable' 'foo' 'all' '1' +insertpackage 'unstable' 'bar' 'amd64' '1' +insertsource 'unstable' 'foo' 'all' '1' + +setupaptarchive --no-update +logcurrentarchivedirectory + +# ensure the archive is not writable +addtrap 'prefix' 'chmod 755 aptarchive/dists/unstable/main/binary-all;' +if [ "$(id -u)" = '0' ]; then + # too deep to notice it, but it also unlikely that files in the same repo have different permissions + chmod 500 aptarchive/dists/unstable/main/binary-all + testfailure aptget update + rm -rf rootdir/var/lib/apt/lists + chmod 755 aptarchive/dists/unstable/main/binary-all + testsuccess aptget update + rm -rf rootdir/var/lib/apt/lists + chmod 511 aptarchive/dists/ + testsuccess aptget update + rm -rf rootdir/var/lib/apt/lists + chmod 510 aptarchive/dists/ + testsuccesswithnotice aptget update + rm -rf rootdir/var/lib/apt/lists + chmod 500 aptarchive/dists/ + testsuccesswithnotice aptget update + chmod 755 aptarchive/dists/ +else + testsuccess aptget update +fi +mv rootdir/var/lib/apt/lists/_* rootdir/var/lib/apt/lists/partial +chmod 555 aptarchive/dists/unstable/main/binary-all +testsuccess aptget update -o Debug::pkgAcquire::Worker=1 +cp -a rootdir/tmp/testsuccess.output rootdir/tmp/update.output +testsuccess grep '%0aAlt-Filename:%20' rootdir/tmp/update.output + +# the release files aren't an IMS-hit, but the indexes are +redatereleasefiles '+1 hour' + +# we don't download the index if it isn't updated +testsuccess aptget update -o Debug::pkgAcquire::Auth=1 +# file:/ isn't shown in the log, so see if it was downloaded anyhow +cp -a rootdir/tmp/testsuccess.output rootdir/tmp/update.output +canary="SHA512:$(bzcat aptarchive/dists/unstable/main/binary-all/Packages.bz2 | sha512sum |cut -f1 -d' ')" +testfailure grep -- "$canary" rootdir/tmp/update.output + +testfoo() { + # foo is still available + testsuccess aptget install -s foo + testsuccess aptcache showsrc foo + testsuccess aptget source foo --print-uris +} +testfoo + +# the release file is new again, the index still isn't, but it is somehow gone now from disk +redatereleasefiles '+2 hour' +find rootdir/var/lib/apt/lists -name '*_Packages*' -delete + +testsuccess aptget update -o Debug::pkgAcquire::Auth=1 +# file:/ isn't shown in the log, so see if it was downloaded anyhow +cp -a rootdir/tmp/testsuccess.output rootdir/tmp/update.output +canary="SHA512:$(bzcat aptarchive/dists/unstable/main/binary-all/Packages.bz2 | sha512sum |cut -f1 -d' ')" +testsuccess grep -- "$canary" rootdir/tmp/update.output + +testfoo diff --git a/test/integration/test-apt-update-filesize-mismatch b/test/integration/test-apt-update-filesize-mismatch new file mode 100755 index 0000000..26b670d --- /dev/null +++ b/test/integration/test-apt-update-filesize-mismatch @@ -0,0 +1,54 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' +configcompression 'gz' + +insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'testing' 'foo2' 'all' '1' +insertsource 'testing' 'foo' 'all' '1' +insertsource 'testing' 'foo2' 'all' '1' + +setupaptarchive --no-update +changetowebserver + +find aptarchive \( -name 'Packages' -o -name 'Sources' -o -name 'Translation-en' \) -delete +for release in $(find aptarchive -name 'Release'); do + cp "$release" "${release}.backup" +done + +testsuccess aptget update +testsuccess aptcache show foo +testsuccess aptget install foo -s + +for get in $(sed -n 's#^GET /\([^ ]\+\.gz\) HTTP.\+$#\1#p' aptarchive/webserver.log.client*.log); do + for ext in '' '.gz'; do + COMPRESSFILE="$get" + get="${get}${ext}" + FILE="$(basename "$get" '.gz')" + msgmsg 'Test filesize mismatch with file' "$FILE" + rm -rf rootdir/var/lib/apt/lists + + for release in $(find aptarchive -name 'Release'); do + SIZE="$(awk "/$FILE\$/ { print \$2; exit }" "${release}.backup")" + sed "s# $SIZE # $(($SIZE + 111)) #" "${release}.backup" > "$release" + done + signreleasefiles + + testfailure aptget update -o Debug::pkgAcquire::Worker=1 + cp rootdir/tmp/testfailure.output rootdir/tmp/update.output + if [ -z "$ext" ]; then + testsuccess grep -E "$(basename "$COMPRESSFILE" '.gz').*Hash Sum mismatch" rootdir/tmp/update.output + else + testsuccess grep -E "$(basename "$COMPRESSFILE" '.gz').*File has unexpected size" rootdir/tmp/update.output + fi + testfailure aptcache show foo + testfailure aptget install foo -s + + testfailure aptcache show bar + testfailure aptget install bar -s + done +done diff --git a/test/integration/test-apt-update-hashsum-mismatch b/test/integration/test-apt-update-hashsum-mismatch new file mode 100755 index 0000000..48d041a --- /dev/null +++ b/test/integration/test-apt-update-hashsum-mismatch @@ -0,0 +1,39 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' +configcompression 'gz' + +insertpackage 'testing' 'foo' 'all' '1' +insertpackage 'testing' 'foo2' 'all' '1' +insertsource 'testing' 'foo' 'all' '1' +insertsource 'testing' 'foo2' 'all' '1' + +setupaptarchive --no-update +changetowebserver + +find aptarchive \( -name 'Packages' -o -name 'Sources' -o -name 'Translation-en' \) -delete + +testsuccess aptget update +testsuccess aptcache show foo +testsuccess aptget install foo -s + +for get in $(sed -n 's#^GET /\([^ ]\+\.gz\) HTTP.\+$#\1#p' aptarchive/webserver.log.client*.log); do + msgmsg 'Test hashsum mismatch with file' "$get" + breakfiles "aptarchive/${get}" + rm -rf rootdir/var/lib/apt/lists + + testfailure aptget update + cp rootdir/tmp/testfailure.output rootdir/tmp/update.output + testsuccess grep -E "$(basename "$get" '.gz').*Hash Sum mismatch" rootdir/tmp/update.output + testfailure aptcache show foo + testfailure aptget install foo -s + + testfailure aptcache show bar + testfailure aptget install bar -s + + unbreakfiles "aptarchive/${get}" +done diff --git a/test/integration/test-apt-update-hooks b/test/integration/test-apt-update-hooks new file mode 100755 index 0000000..d81ef29 --- /dev/null +++ b/test/integration/test-apt-update-hooks @@ -0,0 +1,49 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' +confighashes 'SHA512' + +insertpackage 'unstable' 'foo' 'i386' '1.0' +insertpackage 'testing' 'foo' 'i386' '1.0' + +setupaptarchive --no-update +APTARCHIVE="$(readlink -f ./aptarchive)" + +signreleasefiles 'Joe Sixpack' + +echo 'APT::Update::Post-Invoke-Success { "echo SUCCESS"; };' >> rootdir/etc/apt/apt.conf.d/display-success.conf +echo 'APT::Update::Post-Invoke { "echo RUN"; };' >> rootdir/etc/apt/apt.conf.d/display-success.conf + + +msgmsg "All sources OK => run Post-Invoke-Success and Post-Invoke" +testsuccess aptget update +cp rootdir/tmp/testsuccess.output aptupdate.output +testsuccess grep "RUN" aptupdate.output +testsuccess grep "SUCCESS" aptupdate.output + +msgmsg "Some sources broken => run Post-Invoke-Success and Post-Invoke" +sed -i -e '/^ / d' -e '/^SHA512:/ d' "$APTARCHIVE/dists/unstable/Release" +testsuccess rm "$(aptget indextargets 'Created-By: Packages' 'Suite: testing' --format '$(FILENAME)')" +signreleasefiles +listcurrentlistsdirectory > lists.before +testfailure apt update +cp rootdir/tmp/testfailure.output aptupdate.output +listcurrentlistsdirectory > lists.after +testfailure cmp lists.before lists.after +testsuccess grep "RUN" aptupdate.output +testsuccess grep "SUCCESS" aptupdate.output + +msgmsg "All sources broken => run Post-Invoke" +sed -i -e '/^ / d' -e '/^SHA512:/ d' "$APTARCHIVE/dists/testing/Release" +signreleasefiles +mv lists.after lists.before +testfailure apt update +cp rootdir/tmp/testfailure.output aptupdate.output +testfileequal lists.before "$(listcurrentlistsdirectory)" +testsuccess grep "RUN" aptupdate.output +testfailure grep "SUCCESS" aptupdate.output diff --git a/test/integration/test-apt-update-ims b/test/integration/test-apt-update-ims new file mode 100755 index 0000000..1894c3a --- /dev/null +++ b/test/integration/test-apt-update-ims @@ -0,0 +1,192 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'unrelated' 'all' '0.5~squeeze1' +insertpackage 'unstable' 'unrelated2' 'amd64' '0.5~squeeze1' +insertsource 'unstable' 'unrelated' 'all' '0.5~squeeze1' + +export APT_DONT_SIGN="" +setupaptarchive --no-update +logcurrentarchivedirectory +changetowebserver + +runtest() { + local APTOPT="" + if [ -n "$1" ]; then + APTOPT='--allow-insecure-repositories' + else + APTOPT='--no-allow-insecure-repositories' + fi + + rm -rf rootdir/var/lib/apt/lists/ + + local TEST="test${1:-success}" + $TEST aptget update $APTOPT -o Debug::pkgAcquire::Worker=1 + if [ "$1" = 'failure' ]; then + # accept the outdated Release file so we can check Hit behaviour + "test${2:-success}" aptget update -o Acquire::Min-ValidTime=9999999 $APTOPT + fi + listcurrentlistsdirectory > listsdir.lst + testsuccess grep '_Packages\(\.[0-9a-z]\+\)\?$' listsdir.lst + testsuccess grep '_Sources\(\.[0-9a-z]\+\)\?$' listsdir.lst + testsuccess grep '_Translation-en\(\.[0-9a-z]\+\)\?$' listsdir.lst + + # ensure no leftovers in partial + testfailure ls 'rootdir/var/lib/apt/lists/partial/*' + + # check that I-M-S header is kept in redirections + echo "$EXPECT" | sed -e 's#(invalid since [^)]\+)#(invalid since)#' > expected.output + $TEST aptget update -o Debug::pkgAcquire::Worker=0 -o Debug::Acquire::http=0 $APTOPT + sed -i -e 's#(invalid since [^)]\+)#(invalid since)#' rootdir/tmp/${TEST}.output + testequal "$(cat expected.output)" cat rootdir/tmp/${TEST}.output + testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + + # ensure that we still do a hash check for other files on ims hit of Release + if grep -q '^Hit:[0-9]\+ .* InRelease$' expected.output || ! grep -q '^Ign:[0-9]\+ .* Release\(\.gpg\)\?$' expected.output; then + $TEST aptget update -o Debug::Acquire::gpgv=1 $APTOPT + cp rootdir/tmp/${TEST}.output goodsign.output + testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + testsuccess grep '^Got GOODSIG ' goodsign.output + fi + + # ensure no leftovers in partial + testfailure ls 'rootdir/var/lib/apt/lists/partial/*' +} + +msgmsg 'InRelease' +EXPECT="Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Reading package lists..." +echo 'Acquire::GzipIndexes "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest +echo 'Acquire::GzipIndexes "1";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest + +msgmsg 'Release/Release.gpg' +EXPECT="Ign:1 http://localhost:${APTHTTPPORT} unstable InRelease + 404 Not Found +Hit:2 http://localhost:${APTHTTPPORT} unstable Release +Reading package lists..." +find aptarchive -name 'InRelease' -delete +logcurrentarchivedirectory +echo 'Acquire::GzipIndexes "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest +echo 'Acquire::GzipIndexes "1";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest + +msgmsg 'Release only' +EXPECT="Ign:1 http://localhost:${APTHTTPPORT} unstable InRelease + 404 Not Found +Hit:2 http://localhost:${APTHTTPPORT} unstable Release +Ign:3 http://localhost:${APTHTTPPORT} unstable Release.gpg + 404 Not Found +Reading package lists... +W: The repository 'http://localhost:${APTHTTPPORT} unstable Release' is not signed. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details." +find aptarchive -name 'Release.gpg' -delete +logcurrentarchivedirectory +echo 'Acquire::GzipIndexes "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'warning' +echo 'Acquire::GzipIndexes "1";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'warning' + + +# make the release file old +find aptarchive -name '*Release' -exec sed -i \ + -e "s#^Date: .*\$#Date: $(date -ud '-2 weeks' '+%a, %d %b %Y %H:%M:%S %Z')#" \ + -e '/^Valid-Until: / d' -e "/^Date: / a\ +Valid-Until: $(date -ud '-1 weeks' '+%a, %d %b %Y %H:%M:%S %Z')" '{}' \; +signreleasefiles +logcurrentarchivedirectory + +msgmsg 'expired InRelease' +EXPECT="Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease +Reading package lists... +E: Release file for http://localhost:${APTHTTPPORT}/dists/unstable/InRelease is expired (invalid since). Updates for this repository will not be applied." +echo 'Acquire::GzipIndexes "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'failure' +echo 'Acquire::GzipIndexes "1";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'failure' + +msgmsg 'expired Release/Release.gpg' +EXPECT="Ign:1 http://localhost:${APTHTTPPORT} unstable InRelease + 404 Not Found +Hit:2 http://localhost:${APTHTTPPORT} unstable Release +Reading package lists... +E: Release file for http://localhost:${APTHTTPPORT}/dists/unstable/Release is expired (invalid since). Updates for this repository will not be applied." +find aptarchive -name 'InRelease' -delete +logcurrentarchivedirectory +echo 'Acquire::GzipIndexes "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'failure' +echo 'Acquire::GzipIndexes "1";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'failure' + +msgmsg 'expired Release only' +EXPECT="Ign:1 http://localhost:${APTHTTPPORT} unstable InRelease + 404 Not Found +Hit:2 http://localhost:${APTHTTPPORT} unstable Release +Ign:3 http://localhost:${APTHTTPPORT} unstable Release.gpg + 404 Not Found +Reading package lists... +W: The repository 'http://localhost:${APTHTTPPORT} unstable Release' is not signed. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details. +E: Release file for http://localhost:${APTHTTPPORT}/dists/unstable/Release is expired (invalid since). Updates for this repository will not be applied." +find aptarchive -name 'Release.gpg' -delete +logcurrentarchivedirectory +echo 'Acquire::GzipIndexes "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'failure' 'warning' +echo 'Acquire::GzipIndexes "1";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'failure' 'warning' + + +msgmsg 'no Release at all' +EXPECT="Ign:1 http://localhost:${APTHTTPPORT} unstable InRelease + 404 Not Found +Ign:2 http://localhost:${APTHTTPPORT} unstable Release + 404 Not Found +Ign:3 http://localhost:${APTHTTPPORT} unstable/main Sources + 404 Not Found +Ign:4 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages + 404 Not Found +Ign:5 http://localhost:${APTHTTPPORT} unstable/main all Packages + 404 Not Found +Ign:6 http://localhost:${APTHTTPPORT} unstable/main Translation-en + 404 Not Found +Ign:3 http://localhost:${APTHTTPPORT} unstable/main Sources + 404 Not Found +Ign:4 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages + 404 Not Found +Ign:5 http://localhost:${APTHTTPPORT} unstable/main all Packages + 404 Not Found +Ign:6 http://localhost:${APTHTTPPORT} unstable/main Translation-en + 404 Not Found +Ign:3 http://localhost:${APTHTTPPORT} unstable/main Sources + 404 Not Found +Ign:4 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages + 404 Not Found +Ign:5 http://localhost:${APTHTTPPORT} unstable/main all Packages + 404 Not Found +Ign:6 http://localhost:${APTHTTPPORT} unstable/main Translation-en + 404 Not Found +Hit:3 http://localhost:${APTHTTPPORT} unstable/main Sources +Hit:4 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages +Hit:5 http://localhost:${APTHTTPPORT} unstable/main all Packages +Hit:6 http://localhost:${APTHTTPPORT} unstable/main Translation-en +Reading package lists... +W: The repository 'http://localhost:${APTHTTPPORT} unstable Release' does not have a Release file. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details." +find aptarchive -name '*Release*' -delete +logcurrentarchivedirectory +echo 'Acquire::GzipIndexes "0"; +Acquire::PDiffs "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'warning' +echo 'Acquire::GzipIndexes "1"; +Acquire::PDiffs "0";' > rootdir/etc/apt/apt.conf.d/02compressindex +runtest 'warning' diff --git a/test/integration/test-apt-update-nofallback b/test/integration/test-apt-update-nofallback new file mode 100755 index 0000000..d7e30ba --- /dev/null +++ b/test/integration/test-apt-update-nofallback @@ -0,0 +1,274 @@ +#!/bin/sh +# +# ensure we never fallback from a signed to a unsigned repo +# +# hash checks are done in +# +set -e + +simulate_mitm_and_inject_evil_package() +{ + redatereleasefiles '+1 hour' + rm -f "$APTARCHIVE/dists/unstable/InRelease" "$APTARCHIVE/dists/unstable/Release.gpg" + inject_evil_package +} + +inject_evil_package() +{ + cat > "$APTARCHIVE/dists/unstable/main/binary-i386/Packages" <<EOF +Package: evil +Installed-Size: 29 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Version: 1.0 +Filename: pool/evil_1.0_all.deb +Size: 1270 +Description: an autogenerated evil package +EOF + # avoid ims hit + touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages + compressfile aptarchive/dists/unstable/main/binary-i386/Packages +} + +assert_update_is_refused_and_last_good_state_used() +{ + testfailuremsg "E: The repository 'file:${APTARCHIVE} unstable Release' is no longer signed. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update + + assert_repo_is_intact +} + +assert_repo_is_intact() +{ + testsuccessequal "dpkg/now 1.16.2+fake all [installed,local] +foo/unstable 2.0 all" apt list -qq + testsuccess aptget install -y -s foo + testfailure aptget install -y evil + testsuccess aptget source foo --print-uris + + LISTDIR=rootdir/var/lib/apt/lists + testempty find "$LISTDIR" -name 'InRelease' -o -name 'Release.gpg' +} + +setupaptarchive_with_lists_clean() +{ + setupaptarchive --no-update + rm -rf rootdir/var/lib/apt/lists +} + +test_from_inrelease_to_unsigned() +{ + export APT_DONT_SIGN='Release.gpg' + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + simulate_mitm_and_inject_evil_package + assert_update_is_refused_and_last_good_state_used + testfileequal lists.before "$(listcurrentlistsdirectory)" +} + +test_from_release_gpg_to_unsigned() +{ + export APT_DONT_SIGN='InRelease' + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + simulate_mitm_and_inject_evil_package + assert_update_is_refused_and_last_good_state_used + testfileequal lists.before "$(listcurrentlistsdirectory)" +} + +test_from_inrelease_to_unsigned_with_override() +{ + export APT_DONT_SIGN='Release.gpg' + # setup archive with InRelease file + setupaptarchive_with_lists_clean + testsuccess aptget update + + # simulate moving to a unsigned but otherwise valid repo + simulate_mitm_and_inject_evil_package + generatereleasefiles '+2 hours' + find "$APTARCHIVE" -name '*Packages*' -exec touch -d '+2 hours' {} \; + + # and ensure we can update to it (with enough force) + testfailure apt update + testfailure aptget update + testfailure aptget update --allow-insecure-repositories + testfailure aptget update --no-allow-insecure-repositories + sed -i 's#^deb\(-src\)\? #deb\1 [allow-downgrade-to-insecure=yes] #' rootdir/etc/apt/sources.list.d/* + testfailure aptget update --no-allow-insecure-repositories + testfailure apt update + testwarning apt update --allow-insecure-repositories \ + -o Debug::pkgAcquire::Worker=1 -o Debug::pkgAcquire::Auth=1 + sed -i 's#^deb\(-src\)\? \[allow-downgrade-to-insecure=yes\] #deb\1 #' rootdir/etc/apt/sources.list.d/* + # but that the individual packages are still considered untrusted + testfailureequal "WARNING: The following packages cannot be authenticated! + evil +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y evil +} + +test_from_inrelease_to_norelease_with_override() +{ + # setup archive with InRelease file + setupaptarchive_with_lists_clean + testsuccess aptget update + + # simulate moving to a unsigned but otherwise valid repo + simulate_mitm_and_inject_evil_package + find "$APTARCHIVE" -name '*Release*' -delete + find "$APTARCHIVE" -name '*Packages*' -exec touch -d '+2 hours' {} \; + + # and ensure we can update to it (with enough force) + testfailure aptget update + testfailure aptget update --allow-insecure-repositories + testwarning aptget update --allow-insecure-repositories \ + -o Acquire::AllowDowngradeToInsecureRepositories=1 -o Debug::pkgAcquire::Worker=1 -o Debug::pkgAcquire::Auth=1 + # but that the individual packages are still considered untrusted + testfailureequal "WARNING: The following packages cannot be authenticated! + evil +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y evil +} + +test_cve_2012_0214() +{ + # see https://bugs.launchpad.net/ubuntu/+source/apt/+bug/947108 + # + # it was possible to MITM the download so that InRelease/Release.gpg + # are not delivered (404) and a altered Release file was send + # + # apt left the old InRelease file in /var/lib/apt/lists and downloaded + # the unauthenticated Release file too giving the false impression that + # Release was authenticated + # + # Note that this is pretty much impossible nowadays because: + # a) InRelease is left as is, not split to InRelease/Release as it was + # in the old days + # b) we refuse to go from signed->unsigned + # + # Still worth having a regression test the simulates the condition + + export APT_DONT_SIGN='Release.gpg' + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # do what CVE-2012-0214 did + rm -f "$APTARCHIVE/dists/unstable/InRelease" "$APTARCHIVE/dists/unstable/Release.gpg" + inject_evil_package + # build valid Release file + aptftparchive -qq release ./aptarchive > aptarchive/dists/unstable/Release + + assert_update_is_refused_and_last_good_state_used + testfileequal lists.before "$(listcurrentlistsdirectory)" + + # ensure there is no _Release file downloaded + testfailure ls rootdir/var/lib/apt/lists/*_Release +} + +test_subvert_inrelease() +{ + export APT_DONT_SIGN='Release.gpg' + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # replace InRelease with something else + mv "$APTARCHIVE/dists/unstable/Release" "$APTARCHIVE/dists/unstable/InRelease" + + testfailuremsg "E: Failed to fetch file://${APTARCHIVE}/dists/unstable/InRelease Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?) +E: The repository 'file:${APTARCHIVE} unstable InRelease' is no longer signed. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update + + # ensure we keep the repo + testfileequal lists.before "$(listcurrentlistsdirectory)" + assert_repo_is_intact +} + +test_inrelease_to_invalid_inrelease() +{ + export APT_DONT_SIGN='Release.gpg' + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # now remove InRelease and subvert Release do no longer verify + sed -i 's/^Codename:.*/Codename: evil!/' "$APTARCHIVE/dists/unstable/InRelease" + inject_evil_package + + testwarningequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file:${APTARCHIVE} unstable InRelease: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + # ensure we keep the repo + testfailure grep 'evil' rootdir/var/lib/apt/lists/*InRelease + testfileequal lists.before "$(listcurrentlistsdirectory)" + assert_repo_is_intact +} + +test_release_gpg_to_invalid_release_release_gpg() +{ + export APT_DONT_SIGN='InRelease' + setupaptarchive_with_lists_clean + testsuccess aptget update + listcurrentlistsdirectory > lists.before + + # now subvert Release do no longer verify + echo "Some evil data" >> "$APTARCHIVE/dists/unstable/Release" + inject_evil_package + + testwarningequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file:${APTARCHIVE} unstable Release: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +W: Failed to fetch file:${APTARCHIVE}/dists/unstable/Release.gpg The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfailure grep 'evil' rootdir/var/lib/apt/lists/*Release + testfileequal lists.before "$(listcurrentlistsdirectory)" + assert_repo_is_intact +} + + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +# a "normal" package with source and binary +buildsimplenativepackage 'foo' 'all' '2.0' + +# setup the archive and ensure we have a single package that installs fine +setupaptarchive +APTARCHIVE="$(readlink -f ./aptarchive)" +assert_repo_is_intact + +# test the various cases where a repo may go from signed->unsigned +msgmsg "test_from_inrelease_to_unsigned" +test_from_inrelease_to_unsigned + +msgmsg "test_from_release_gpg_to_unsigned" +test_from_release_gpg_to_unsigned + +# ensure we do not regress on CVE-2012-0214 +msgmsg "test_cve_2012_0214" +test_cve_2012_0214 + +# ensure InRelease can not be subverted +msgmsg "test_subvert_inrelease" +test_subvert_inrelease + +# ensure we revert to last good state if InRelease does not verify +msgmsg "test_inrelease_to_invalid_inrelease" +test_inrelease_to_invalid_inrelease + +# ensure we revert to last good state if Release/Release.gpg does not verify +msgmsg "test_release_gpg_to_invalid_release_release_gpg" +test_release_gpg_to_invalid_release_release_gpg + +# ensure we can override the downgrade error +msgmsg "test_from_inrelease_to_unsigned_with_override" +test_from_inrelease_to_unsigned_with_override +msgmsg "test_from_inrelease_to_norelease_with_override" +test_from_inrelease_to_norelease_with_override diff --git a/test/integration/test-apt-update-not-modified b/test/integration/test-apt-update-not-modified new file mode 100755 index 0000000..c6dbb8d --- /dev/null +++ b/test/integration/test-apt-update-not-modified @@ -0,0 +1,183 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' 'i386' +confighashes 'SHA256' + +insertpackage 'unstable' 'apt' 'amd64,i386' '1.0' + +export APT_DONT_SIGN='' +setupaptarchive --no-update + +methodtest() { + msgmsg 'Test InRelease with' "$1" + rm -rf rootdir/var/lib/apt/lists + cp -a aptarchive/dists aptarchive/dists.good + # get our cache populated + testsuccess aptget update + listcurrentlistsdirectory > listsdir.lst + + # hit again with a good cache + testsuccessequal "Hit:1 $1 unstable InRelease +Reading package lists..." aptget update + testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + + # drop an architecture, which means the file should be gone now + configarchitecture 'i386' + sed '/_binary-amd64_Packages/ d' listsdir.lst > listsdir-without-amd64.lst + testsuccessequal "Hit:1 $1 unstable InRelease +Reading package lists..." aptget update + testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)" + + # readd arch so its downloaded again… + configarchitecture 'amd64' 'i386' + # … but oh noes, hashsum mismatch! + SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') + breakfiles aptarchive/dists/unstable/main/binary-amd64/Packages.gz + testfailureequal "Hit:1 $1 unstable InRelease +Get:2 $1 unstable/main amd64 Packages [$SIZE B] +Err:2 $1 unstable/main amd64 Packages + Hash Sum mismatch + Hashes of expected file: + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak') [weak] + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak' | cut -d' ' -f 1) + Hashes of received file: + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1) + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') [weak] + Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') + Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease') +Reading package lists... +E: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz Hash Sum mismatch + Hashes of expected file: + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak') [weak] + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak' | cut -d' ' -f 1) + Hashes of received file: + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1) + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') [weak] + Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') + Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease') +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update + testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)" + rm -rf aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists + + # … now everything is fine again + testsuccessequal "Hit:1 $1 unstable InRelease +Get:2 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') B] +Reading package lists..." aptget update + testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + + webserverconfig 'aptwebserver::support::modified-since' 'false' + webserverconfig 'aptwebserver::support::last-modified' 'false' + testsuccessequal "Get:1 $1 unstable InRelease [$(stat -c '%s' 'aptarchive/dists/unstable/InRelease') B] +Reading package lists..." aptget update + webserverconfig 'aptwebserver::support::modified-since' 'true' + webserverconfig 'aptwebserver::support::last-modified' 'true' + + msgmsg 'Test Release.gpg with' "$1" + rm -rf rootdir/var/lib/apt/lists + find aptarchive/dists -name 'InRelease' -delete + # get our cache populated + testsuccess aptget update + listcurrentlistsdirectory > listsdir.lst + + # hit again with a good cache + testsuccessequal "Ign:1 $1 unstable InRelease + 404 Not Found +Hit:2 $1 unstable Release +Reading package lists..." aptget update + testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + + # drop an architecture, which means the file should be gone now + configarchitecture 'i386' + sed '/_binary-amd64_Packages/ d' listsdir.lst > listsdir-without-amd64.lst + testsuccessequal "Ign:1 $1 unstable InRelease + 404 Not Found +Hit:2 $1 unstable Release +Reading package lists..." aptget update + testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)" + + # readd arch so its downloaded again… + configarchitecture 'amd64' 'i386' + # … but oh noes, hashsum mismatch! + SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') + breakfiles 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' + testfailureequal "Ign:1 $1 unstable InRelease + 404 Not Found +Hit:2 $1 unstable Release +Get:4 $1 unstable/main amd64 Packages [$SIZE B] +Err:4 $1 unstable/main amd64 Packages + Hash Sum mismatch + Hashes of expected file: + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak') [weak] + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak' | cut -d' ' -f 1) + Hashes of received file: + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1) + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') [weak] + Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') + Release file created at: $(releasefiledate 'aptarchive/dists/unstable/Release') +Reading package lists... +E: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz Hash Sum mismatch + Hashes of expected file: + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak') [weak] + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.bak' | cut -d' ' -f 1) + Hashes of received file: + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1) + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') [weak] + Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') + Release file created at: $(releasefiledate 'aptarchive/dists/unstable/Release') +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update + testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)" + rm -rf aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists + find aptarchive/dists -name 'InRelease' -delete + + # … now everything is fine again + testsuccessequal "Ign:1 $1 unstable InRelease + 404 Not Found +Hit:2 $1 unstable Release +Get:4 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') B] +Reading package lists..." aptget update + testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + + webserverconfig 'aptwebserver::support::modified-since' 'false' + webserverconfig 'aptwebserver::support::last-modified' 'false' + testsuccessequal "Ign:1 $1 unstable InRelease + 404 Not Found +Get:2 $1 unstable Release [$(stat -c '%s' 'aptarchive/dists/unstable/Release') B] +Reading package lists..." aptget update + webserverconfig 'aptwebserver::support::modified-since' 'true' + webserverconfig 'aptwebserver::support::last-modified' 'true' + + rm -rf aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists + + # new release file, but the indexes are the same + redatereleasefiles '+2 hours' + + rm -rf rootdir/var/lib/apt/lists.good + cp -a rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists.good + testsuccessequal "Get:1 $1 unstable InRelease [$(stat -c '%s' 'aptarchive/dists/unstable/InRelease') B] +Reading package lists..." aptget update + + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists.good rootdir/var/lib/apt/lists + find rootdir/var/lib/apt/lists -name '*_Packages*' -delete + testsuccessequal "Get:1 $1 unstable InRelease [$(stat -c '%s' 'aptarchive/dists/unstable/InRelease') B] +Get:2 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') B] +Get:3 $1 unstable/main i386 Packages [$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-i386/Packages.gz') B] +Reading package lists..." aptget update + + rm -rf aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists +} + +changetowebserver +methodtest "http://localhost:${APTHTTPPORT}" + +changetohttpswebserver +methodtest "https://localhost:${APTHTTPSPORT}" diff --git a/test/integration/test-apt-update-releaseinfo-changes b/test/integration/test-apt-update-releaseinfo-changes new file mode 100755 index 0000000..ee36c46 --- /dev/null +++ b/test/integration/test-apt-update-releaseinfo-changes @@ -0,0 +1,94 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'earth' 'human' 'all' '1' + +getoriginfromsuite() { echo -n 'Earth'; } +getlabelfromsuite() { echo -n 'Blue Planet'; } +getcodenamefromsuite() { echo -n 'home'; } +getreleaseversionfromsuite() { echo -n '1.0'; } +getnotautomaticfromsuite() { echo -n 'yes'; } +getbutautomaticupgradesfromsuite() { echo -n 'yes'; } +setupaptarchive --no-update +testsuccess aptget update + +cp -a aptarchive/dists aptarchive/dists.bak +cp -a rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists.bak +APTARCHIVE="$(readlink -f './aptarchive')" + +sed -i -e 's#^Origin: Earth#Origin: Mars#' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Origin' value from 'Earth' to 'Mars' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update +testfailure apt update --allow-releaseinfo-change-label +testsuccesswithnotice apt update --allow-releaseinfo-change +testequal "All packages are up to date. +N: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Origin' value from 'Earth' to 'Mars'" tail -n 2 rootdir/tmp/testsuccesswithnotice.output + +rm -rf rootdir/var/lib/apt/lists +cp -a rootdir/var/lib/apt/lists.bak rootdir/var/lib/apt/lists +sed -i -e 's#^Label: Blue#Label: Red#' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Origin' value from 'Earth' to 'Mars' +E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Label' value from 'Blue Planet' to 'Red Planet' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update +testfailure apt update --allow-releaseinfo-change-label +testfailuremsg "N: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Origin' value from 'Earth' to 'Mars' +E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Label' value from 'Blue Planet' to 'Red Planet' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update --allow-releaseinfo-change-origin +testsuccess apt update --allow-releaseinfo-change-origin --allow-releaseinfo-change-label -o quiet::ReleaseInfoChange=true + +# version changes are allowed by default +sed -i -e 's#^Version: 1#Version: 2#' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Version' value from '1.0' to '2.0' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update --no-allow-releaseinfo-change-version +testsuccesswithnotice apt update +testequal "All packages are up to date. +N: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Version' value from '1.0' to '2.0'" tail -n 2 rootdir/tmp/testsuccesswithnotice.output + +sed -i -e 's#^Codename: home#Codename: colony#' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Codename' value from 'home' to 'colony' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update --no-allow-releaseinfo-change-codename +testsuccesswithnotice apt update --allow-releaseinfo-change-codename +testequal "All packages are up to date. +N: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Codename' value from 'home' to 'colony'" tail -n 2 rootdir/tmp/testsuccesswithnotice.output + +sed -i -e '/^ButAutomaticUpgrades: / d' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its default priority for apt_preferences(5) from 100 to 1. +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update +testsuccesswithnotice apt update --allow-releaseinfo-change +testequal "All packages are up to date. +N: Repository 'file:$APTARCHIVE earth InRelease' changed its default priority for apt_preferences(5) from 100 to 1." tail -n 2 rootdir/tmp/testsuccesswithnotice.output + +sed -i -e '/^NotAutomatic: / d' -e '/^Codename: / a\ +Release-Notes: https://example.org/mars/release-notes' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its default priority for apt_preferences(5) from 1 to 500. +N: More information about this can be found online in the Release notes at: https://example.org/mars/release-notes +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update +testsuccesswithnotice apt update --allow-releaseinfo-change-defaultpin +testequal "All packages are up to date. +N: Repository 'file:$APTARCHIVE earth InRelease' changed its default priority for apt_preferences(5) from 1 to 500. +N: More information about this can be found online in the Release notes at: https://example.org/mars/release-notes" tail -n 3 rootdir/tmp/testsuccesswithnotice.output + +# Suite testing also needs codename adjustment, otherwise complaints about +# mismatch between sources.list and Release file. +sed -i -e 's#^Suite: earth#Suite: mars#' $(find ./aptarchive -name 'Release') +sed -i -e 's#^Codename: colony#Codename: earth#' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailuremsg "E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Suite' value from 'earth' to 'mars' +E: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Codename' value from 'colony' to 'earth' +N: More information about this can be found online in the Release notes at: https://example.org/mars/release-notes +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details." apt update --no-allow-releaseinfo-change-suite +testsuccesswithnotice apt update --allow-releaseinfo-change-codename +testequal "N: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Suite' value from 'earth' to 'mars' +N: Repository 'file:$APTARCHIVE earth InRelease' changed its 'Codename' value from 'colony' to 'earth' +N: More information about this can be found online in the Release notes at: https://example.org/mars/release-notes" tail -n 3 rootdir/tmp/testsuccesswithnotice.output diff --git a/test/integration/test-apt-update-reporting b/test/integration/test-apt-update-reporting new file mode 100755 index 0000000..cecf23a --- /dev/null +++ b/test/integration/test-apt-update-reporting @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +for i in $(seq 100); do + insertpackage 'unstable' "foo-$i" 'all' '1.0' + insertsource 'unstable' "foo-$i" 'all' '1.0' +done + +setupaptarchive --no-update +changetowebserver + +aptget update -o Debug::Acquire::Progress=1 2>progress.log >ignore.out + +has_progress() { + prev_percent=0.0 + while read line; do + percent="$(echo "$line"|cut -b2-6)" + # need to cut the decimal point and digits because sh can not do + # float compare + if [ "${percent%%.*}" -lt "${prev_percent%%.*}" ]; then + cat progress.log + return 1 + fi + prev_percent="$percent" + done < progress.log + return 0 +} + +msgtest "Testing that progress does not go backward" +testsuccess --nomsg has_progress diff --git a/test/integration/test-apt-update-rollback b/test/integration/test-apt-update-rollback new file mode 100755 index 0000000..ea431c8 --- /dev/null +++ b/test/integration/test-apt-update-rollback @@ -0,0 +1,219 @@ +#!/bin/sh +# +# test that apt-get update is transactional +# +set -e + +avoid_ims_hit() { + touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages* + touch -d '+1hour' aptarchive/dists/unstable/main/source/Sources* + touch -d '+1hour' aptarchive/dists/unstable/*Release* + + touch -d '-1hour' rootdir/var/lib/apt/lists/* +} + +create_fresh_archive() +{ + rm -rf aptarchive/* + rm -f rootdir/var/lib/apt/lists/_* rootdir/var/lib/apt/lists/partial/* + + insertpackage 'unstable' 'old' 'all' '1.0' + + setupaptarchive --no-update +} + +add_new_package() { + insertpackage 'unstable' 'new' 'all' '1.0' + insertsource 'unstable' 'new' 'all' '1.0' + + setupaptarchive --no-update "$@" +} + +break_repository_sources_index() { + mv "$APTARCHIVE/dists/unstable/main/source/Sources.gz" "$APTARCHIVE/dists/unstable/main/source/Sources.gz.orig" + printf 'xxx' > "$APTARCHIVE/dists/unstable/main/source/Sources" + compressfile "$APTARCHIVE/dists/unstable/main/source/Sources" "$@" +} + +start_with_good_inrelease() { + create_fresh_archive + testsuccess aptget update + listcurrentlistsdirectory > lists.before + testsuccessequal 'dpkg/now 1.16.2+fake all [installed,local] +old/unstable 1.0 all' apt list -qq +} + +test_inrelease_to_new_inrelease() { + msgmsg 'Test InRelease to new InRelease works fine' + start_with_good_inrelease + + add_new_package '+1hour' + testsuccess aptget update -o Debug::Acquire::Transaction=1 + testsuccessequal 'dpkg/now 1.16.2+fake all [installed,local] +new/unstable 1.0 all +old/unstable 1.0 all' apt list -qq +} + +test_inrelease_to_broken_hash_reverts_all() { + msgmsg 'Test InRelease to broken InRelease reverts everything' + start_with_good_inrelease + + add_new_package '+1hour' + # break the Sources file + break_repository_sources_index '+1hour' + + # test the error condition + testfailureequal "E: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources.gz Hash Sum mismatch + Hashes of expected file: + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz.orig') [weak] + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz.orig' | cut -d' ' -f 1) + Hashes of received file: + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz' | cut -d' ' -f 1) + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz') [weak] + Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/source/Sources.gz') + Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease') +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + # ensure that the Packages file is also rolled back + testfileequal lists.before "$(listcurrentlistsdirectory)" + testfailureequal "E: Unable to locate package new" aptget install new -s -qq +} + +test_inrelease_to_valid_release() { + msgmsg 'Test InRelease to valid Release' + start_with_good_inrelease + + add_new_package '+1hour' + # switch to a unsigned repo now + rm -f "$APTARCHIVE/dists/unstable/InRelease" "$APTARCHIVE/dists/unstable/Release.gpg" + + # update fails + testfailureequal "E: The repository 'file:${APTARCHIVE} unstable Release' is no longer signed." aptget update -qq + + # test that security downgrade was not successful + testfileequal lists.before "$(listcurrentlistsdirectory)" + testsuccess aptget install old -s + testfailure aptget install new -s + testnotempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_InRelease' + testempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_Release' +} + +test_inrelease_to_release_reverts_all() { + msgmsg 'Test InRelease to broken Release reverts everything' + start_with_good_inrelease + + # switch to a unsigned repo now + add_new_package '+1hour' + rm -f "$APTARCHIVE/dists/unstable/InRelease" "$APTARCHIVE/dists/unstable/Release.gpg" + + # break it + break_repository_sources_index '+1hour' + + # ensure error + testfailureequal "E: The repository 'file:${APTARCHIVE} unstable Release' is no longer signed." aptget update -qq # -o Debug::acquire::transaction=1 + + # ensure that the Packages file is also rolled back + testfileequal lists.before "$(listcurrentlistsdirectory)" + testsuccess aptget install old -s + testfailure aptget install new -s + testnotempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_InRelease' + testempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_Release' +} + +test_unauthenticated_to_invalid_inrelease() { + msgmsg 'Test UnAuthenticated to invalid InRelease reverts everything' + create_fresh_archive + rm -f "$APTARCHIVE/dists/unstable/InRelease" "$APTARCHIVE/dists/unstable/Release.gpg" + + testwarning aptget update --allow-insecure-repositories + listcurrentlistsdirectory > lists.before + testfailureequal "WARNING: The following packages cannot be authenticated! + old +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y old + + # go to authenticated but not correct + add_new_package '+1hour' + break_repository_sources_index '+1hour' + + testfailureequal "E: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources.gz Hash Sum mismatch + Hashes of expected file: + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz.orig') [weak] + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz.orig' | cut -d' ' -f 1) + Hashes of received file: + - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz' | cut -d' ' -f 1) + - Filesize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz') [weak] + Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/source/Sources.gz') + Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease') +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfileequal lists.before "$(listcurrentlistsdirectory)" + testempty find "${ROOTDIR}/var/lib/apt/lists" -maxdepth 1 -name '*_InRelease' + testfailureequal "WARNING: The following packages cannot be authenticated! + old +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y old +} + +test_inrelease_to_unauth_inrelease() { + msgmsg 'Test InRelease to InRelease without good sig' + start_with_good_inrelease + + signreleasefiles 'Marvin Paranoid' + + testwarningequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file:${APTARCHIVE} unstable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2 +W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2 +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfileequal lists.before "$(listcurrentlistsdirectory)" + testnotempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_InRelease' +} + +test_inrelease_to_broken_gzip() { + msgmsg "Test InRelease to broken gzip" + start_with_good_inrelease + + break_repository_sources_index '+1hour' + generatereleasefiles '+2hours' + signreleasefiles + + # append junk at the end of the compressed file + echo "lala" >> "$APTARCHIVE/dists/unstable/main/source/Sources.gz" + touch -d '+2min' "$APTARCHIVE/dists/unstable/main/source/Sources.gz" + # remove uncompressed file to avoid fallback + rm "$APTARCHIVE/dists/unstable/main/source/Sources" + + testfailure aptget update + testsuccess grep 'Hash Sum mismatch' rootdir/tmp/testfailure.output + testfileequal lists.before "$(listcurrentlistsdirectory)" +} + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" +export APT_DONT_SIGN='Release.gpg' + +APTARCHIVE="$(readlink -f ./aptarchive)" +ROOTDIR="${TMPWORKINGDIRECTORY}/rootdir" +APTARCHIVE_LISTS="$(echo "$APTARCHIVE" | tr "/" "_" )" + +# test the following cases: +# - InRelease -> broken InRelease revert to previous state +# - empty lists dir and broken remote leaves nothing on the system +# - InRelease -> hashsum mismatch for one file reverts all files to previous state +# - Release/Release.gpg -> hashsum mismatch +# - InRelease -> Release with hashsum mismatch revert entire state and kills Release +# - Release -> InRelease with broken Sig/Hash removes InRelease +# going from Release/Release.gpg -> InRelease and vice versa +# - unauthenticated -> invalid InRelease + +# stuff to do: +# - ims-hit +# - gzip-index tests + +test_inrelease_to_new_inrelease +test_inrelease_to_broken_hash_reverts_all +test_inrelease_to_valid_release +test_inrelease_to_release_reverts_all +test_unauthenticated_to_invalid_inrelease +test_inrelease_to_unauth_inrelease +test_inrelease_to_broken_gzip diff --git a/test/integration/test-apt-update-simple b/test/integration/test-apt-update-simple new file mode 100755 index 0000000..ccf7197 --- /dev/null +++ b/test/integration/test-apt-update-simple @@ -0,0 +1,33 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'foo' 'all' '1' +insertpackage 'unstable' 'bar' 'amd64' '1' +insertpackage 'unstable' 'bar' 'i386' '1' +insertsource 'unstable' 'foo' 'all' '1' + +sed -e 's#^Description-en:#Description-de:#' \ + aptarchive/dists/unstable/main/i18n/Translation-en > aptarchive/dists/unstable/main/i18n/Translation-de + +setupaptarchive --no-update +changetowebserver + +# the framework modifies some configs to ensure testability, +# at the expense of creating an environment which doesn't always +# reflect apts "normal" behavior on a "normal" system +echo 'Acquire::IndexTargets::Randomized "true"; +Acquire::Languages { "environment"; "en"; "de"; }; +' > rootdir/etc/apt/apt.conf.d/restore-simplicity + +testempty aptget indextargets +testsuccess aptget update +testequal 'main/source/Sources +main/binary-amd64/Packages +main/binary-all/Packages +main/i18n/Translation-en +main/i18n/Translation-de' aptget indextargets --format '$(METAKEY)' diff --git a/test/integration/test-apt-update-stale b/test/integration/test-apt-update-stale new file mode 100755 index 0000000..a863458 --- /dev/null +++ b/test/integration/test-apt-update-stale @@ -0,0 +1,44 @@ +#!/bin/sh +# +# Ensure that a MITM can not stale the Packages/Sources without +# raising a error message. Note that the Release file is protected +# via the "Valid-Until" header +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'foo' 'i386' '1.0' + +setupaptarchive --no-update +changetowebserver + +echo "Acquire::Languages \"none\";" > rootdir/etc/apt/apt.conf.d/00nolanguages +testsuccess aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::http=1 +listcurrentlistsdirectory > lists.before + +# insert new version +mkdir aptarchive/dists/unstable/main/binary-i386/saved +cp -p aptarchive/dists/unstable/main/binary-i386/Packages* \ + aptarchive/dists/unstable/main/binary-i386/saved +insertpackage 'unstable' 'foo' 'i386' '2.0' +touch -d '+1 hour' aptarchive/dists/unstable/main/binary-i386/Packages +compressfile aptarchive/dists/unstable/main/binary-i386/Packages +# ensure that we do not get a I-M-S hit for the Release file + +generatereleasefiles '+1hour' +signreleasefiles + +# but now only deliver the previous Packages file instead of the new one +# (simulating a stale attack) +cp -p aptarchive/dists/unstable/main/binary-i386/saved/Packages* \ + aptarchive/dists/unstable/main/binary-i386/ + +# ensure this raises an error +testfailure aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::http=1 +testsuccess grep 'File has unexpected size' rootdir/tmp/testfailure.output +testfileequal lists.before "$(listcurrentlistsdirectory)" diff --git a/test/integration/test-apt-update-transactions b/test/integration/test-apt-update-transactions new file mode 100755 index 0000000..1f30d77 --- /dev/null +++ b/test/integration/test-apt-update-transactions @@ -0,0 +1,85 @@ +#!/bin/sh +set -e + +# ensure that an update will only succeed entirely or not at all + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' +configcompression '.' 'gz' + +insertpackage 'unstable' 'foo' 'i386' '1.0' +insertsource 'unstable' 'foo' 'i386' '1.0' + +setupaptarchive --no-update + +breakfile() { + breakfiles "$1" "${1}.gz" +} +restorefile() { + unbreakfiles "$1" "${1}.gz" +} + +testrun() { + rm -rf aptarchive/dists.good + cp -a aptarchive/dists aptarchive/dists.good + insertpackage 'unstable' 'bar' 'i386' '1.0' + insertsource 'unstable' 'bar' 'i386' '1.0' + buildaptarchivefromfiles '+1 hour' + + # produce an unsigned repository + find aptarchive \( -name 'Release.gpg' -o -name 'InRelease' \) -delete + testfailure aptget update --no-allow-insecure-repositories + testfileequal "$1" "$(listcurrentlistsdirectory)" + + # signed but broken + signreleasefiles + + onehashbroken() { + rm -rf rootdir/var/lib/apt/lists/partial + testfailure aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::http=1 + # each file generates two messages with this string + testequal '2' grep --count 'Hash Sum mismatch' rootdir/tmp/testfailure.output + testfileequal "$1" "$(listcurrentlistsdirectory)" + } + + breakfile aptarchive/dists/unstable/main/binary-i386/Packages + onehashbroken "$1" + restorefile aptarchive/dists/unstable/main/binary-i386/Packages + + breakfile aptarchive/dists/unstable/main/source/Sources + onehashbroken "$1" + restorefile aptarchive/dists/unstable/main/source/Sources + + rm -rf aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists +} + +testsetup() { + msgmsg 'Test with no initial data over' "$1" + rm -rf rootdir/var/lib/apt/lists + mkdir -p rootdir/var/lib/apt/lists/partial + listcurrentlistsdirectory > listsdir.lst + testrun 'listsdir.lst' + + msgmsg 'Test with initial data over' "$1" + rm -rf rootdir/var/lib/apt/lists + testsuccess aptget update -o Debug::pkgAcquire::Worker=1 + listcurrentlistsdirectory > listsdir.lst + testrun 'listsdir.lst' +} + +testsetup 'file' + +changetowebserver +webserverconfig 'aptwebserver::support::modified-since' 'false' "$1" +webserverconfig 'aptwebserver::support::last-modified' 'false' "$1" # curl is clever and sees hits here also +webserverconfig 'aptwebserver::response-header::Accept-Ranges' 'none' "$1" + +testsetup 'http' + +changetohttpswebserver + +testsetup 'https' diff --git a/test/integration/test-apt-update-unauth b/test/integration/test-apt-update-unauth new file mode 100755 index 0000000..ef1e4ec --- /dev/null +++ b/test/integration/test-apt-update-unauth @@ -0,0 +1,80 @@ +#!/bin/sh +# +# Ensure that when going from unauthenticated to authenticated all +# files are checked again +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +umask 022 + +setupenvironment +configarchitecture "i386" +configcompression '.' 'xz' + +insertpackage 'unstable' 'foo' 'i386' '1.0' +insertsource 'unstable' 'foo' 'any' '1.0' + +setupaptarchive --no-update +changetowebserver + +# FIXME: +# - also check the unauth -> auth success case, i.e. that all files are +# reverified +runtest() { + # start unauthenticated + rm -rf rootdir/var/lib/apt/lists/ + find aptarchive/ -name '*Release*' -delete + + testwarning aptget update --allow-insecure-repositories + + # become authenticated + generatereleasefiles + signreleasefiles + + # move uncompressed away + mv aptarchive/dists/unstable/main/binary-i386/Packages \ + aptarchive/dists/unstable/main/binary-i386/Packages.uncompressed + + # and ensure we re-check the downloaded data + + # change the local packages file + PKGS=$(ls rootdir/var/lib/apt/lists/*Packages*) + echo "meep" > $PKGS + listcurrentlistsdirectory > lists.before + + # update and ensure all is reverted on the hashsum failure + testfailure aptget update -o Debug::Acquire::Transaction=1 -o Debug::pkgAcquire::Auth=1 -o Debug::pkgAcquire::worker=0 -o Debug::acquire::http=0 + + # ensure we have before what we have after + msgtest 'Check rollback on going from' 'unauth -> auth' + listcurrentlistsdirectory > lists.after + if cmp lists.before lists.after; then + msgpass + else + echo >&2 + echo >&2 '### Output of previous apt-get update ###' + cat >&2 rootdir/tmp/testfailure.output || true + echo >&2 '### Changes in the lists-directory: ###' + diff -u >&2 lists.before lists.after || true + echo >&2 '### Contents of the lists-directory: ###' + ls -l rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists/partial || true + msgfail + fi + + # move uncompressed back for release file + mv aptarchive/dists/unstable/main/binary-i386/Packages.uncompressed \ + aptarchive/dists/unstable/main/binary-i386/Packages +} + +for COMPRESSEDINDEXES in 'false' 'true'; do + echo "Acquire::GzipIndexes \"$COMPRESSEDINDEXES\";" > rootdir/etc/apt/apt.conf.d/compressindexes + if $COMPRESSEDINDEXES; then + msgmsg 'Run tests with GzipIndexes enabled' + else + msgmsg 'Run tests with GzipIndexes disabled' + fi + runtest +done diff --git a/test/integration/test-apt-update-weak-hashes b/test/integration/test-apt-update-weak-hashes new file mode 100755 index 0000000..c44ab9a --- /dev/null +++ b/test/integration/test-apt-update-weak-hashes @@ -0,0 +1,202 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' +confighashes 'MD5' +export APT_DONT_SIGN='' + +insertpackage 'unstable' 'foo' 'i386' '1.0' +insertsource 'unstable' 'foo' 'any' '1.0' + +setupaptarchive --no-update +APTARCHIVE="$(readlink -f ./aptarchive)" + +testnopkg() { + testnopackage "$@" + testnosrcpackage "$@" +} +testbadpkg() { + testempty find rootdir/var/lib/apt/lists -maxdepth 1 -name '*InRelease' -o -name '*Release.gpg' + testnotempty find rootdir/var/lib/apt/lists -maxdepth 1 -name '*Release' + testnotempty apt show "$@" + testnotempty apt showsrc "$@" + testfailureequal "WARNING: The following packages cannot be authenticated! + $* +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y "$@" + testfailureequal "WARNING: The following packages cannot be authenticated! + $* +E: Some packages could not be authenticated" aptget source -qq "$@" +} + +testrun() { + local TYPE="$1" + local FILENAME="$2" + shift 2 + local MANGLED="$(readlink -f ./rootdir)/var/lib/apt/lists/partial/$(echo "$FILENAME" | sed 's#/#_#g')" + msgmsg "$TYPE contains only weak hashes" + confighashes 'MD5' + generatereleasefiles + signreleasefiles + preparetest + if [ -z "$1" ]; then + listcurrentlistsdirectory > lists.before + testfailuremsg "W: No Hash entry in Release file ${MANGLED} which is considered strong enough for security purposes +E: The repository 'file:${APTARCHIVE} unstable $(basename "$FILENAME")' provides only weak security information. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update + testfileequal lists.before "$(listcurrentlistsdirectory)" + testnopkg 'foo' + else + testwarningmsg "W: No Hash entry in Release file ${MANGLED} which is considered strong enough for security purposes +W: The repository 'file:${APTARCHIVE} unstable $(basename "$FILENAME")' provides only weak security information. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update "$@" + testbadpkg 'foo' + fi + + msgmsg "$TYPE contains only weak hashes, but source allows weak" + sed -i 's#^deb\(-src\)\? #deb\1 [allow-weak=yes] #' rootdir/etc/apt/sources.list.d/* + genericprepare + testwarningmsg "W: No Hash entry in Release file ${MANGLED} which is considered strong enough for security purposes +W: The repository 'file:${APTARCHIVE} unstable $(basename "$FILENAME")' provides only weak security information. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update "$@" + testbadpkg 'foo' + sed -i 's#^deb\(-src\)\? \[allow-weak=yes\] #deb\1 #' rootdir/etc/apt/sources.list.d/* + + msgmsg "$TYPE contains no hashes" + generatereleasefiles + sed -i -e '/^ / d' -e '/^MD5Sum:/ d' "$APTARCHIVE/dists/unstable/Release" + signreleasefiles + preparetest + if [ -z "$1" ]; then + listcurrentlistsdirectory > lists.before + testfailuremsg "W: No Hash entry in Release file ${MANGLED} +E: The repository 'file:${APTARCHIVE} unstable $(basename "$FILENAME")' provides only weak security information. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update + testfileequal lists.before "$(listcurrentlistsdirectory)" + testnopkg 'foo' + else + testwarningmsg "W: No Hash entry in Release file ${MANGLED} +W: The repository 'file:${APTARCHIVE} unstable $(basename "$FILENAME")' provides only weak security information. +N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update "$@" + testbadpkg 'foo' + fi + + msgmsg "$TYPE contains only weak hashes for some files" + confighashes 'MD5' 'SHA256' + generatereleasefiles + sed -i '/^ [0-9a-fA-Z]\{64\} .*Sources$/d' "$APTARCHIVE/dists/unstable/Release" + signreleasefiles + preparetest + if [ -z "$1" ]; then + testwarningmsg "W: Skipping acquire of configured file 'main/source/Sources' as repository 'file:${APTARCHIVE} unstable InRelease' provides only weak security information for it" apt update + testnosrcpackage foo + else + rm -f rootdir/var/lib/apt/lists/partial/* + testsuccess apt update "$@" + testnotempty apt showsrc foo + fi + testsuccess apt show foo +} + +genericprepare() { + rm -rf rootdir/var/lib/apt/lists + mkdir -p rootdir/var/lib/apt/lists/partial + touch rootdir/var/lib/apt/lists/lock + local RELEASEGPG="$(readlink -f ./rootdir)/var/lib/apt/lists/partial/$(echo "${APTARCHIVE}/dists/unstable/Release.gpg" | sed 's#/#_#g')" + touch "$RELEASEGPG" + chmod 644 "$RELEASEGPG" + local INRELEASE="$(readlink -f ./rootdir)/var/lib/apt/lists/partial/$(echo "${APTARCHIVE}/dists/unstable/InRelease" | sed 's#/#_#g')" + touch "$INRELEASE" + chmod 644 "$INRELEASE" +} +preparetest() { + rm -f "${APTARCHIVE}/dists/unstable/Release" "${APTARCHIVE}/dists/unstable/Release.gpg" + genericprepare +} +testrun 'InRelease' "${APTARCHIVE}/dists/unstable/InRelease" +testrun 'InRelease' "${APTARCHIVE}/dists/unstable/InRelease" --allow-weak-repositories -o APT::Get::List-Cleanup=0 + +preparetest() { + rm -f "${APTARCHIVE}/dists/unstable/InRelease" + genericprepare +} +testrun 'Release+Release.gpg' "${APTARCHIVE}/dists/unstable/Release" +testrun 'Release+Release.gpg' "${APTARCHIVE}/dists/unstable/Release" --allow-weak-repositories -o APT::Get::List-Cleanup=0 + +preparetest() { + rm -f "${APTARCHIVE}/dists/unstable/InRelease" "${APTARCHIVE}/dists/unstable/Release.gpg" + genericprepare +} + +msgmsg 'Moving between Release files with good and bad hashes' +rm -rf rootdir/var/lib/apt/lists +confighashes 'MD5' +generatereleasefiles 'now - 7 days' +signreleasefiles +testfailure apt update +testnopkg 'foo' +testwarning apt update --allow-weak-repositories +testbadpkg 'foo' + +confighashes 'MD5' 'SHA256' +rm -rf aptarchive/dists +insertpackage 'unstable' 'foo2' 'i386' '1.0' +insertsource 'unstable' 'foo2' 'any' '1.0' +setupaptarchive --no-update 'now - 5 days' +testsuccess apt update +testnopkg foo +testnotempty find rootdir/var/lib/apt/lists -maxdepth 1 -name '*InRelease' -o -name '*Release.gpg' +testnotempty apt show foo2 +testnotempty apt showsrc foo2 + +confighashes 'MD5' +rm -rf aptarchive/dists +insertpackage 'unstable' 'foo3' 'i386' '1.0' +insertsource 'unstable' 'foo3' 'any' '1.0' +setupaptarchive --no-update 'now - 3 days' +testfailure apt update +testnopkg foo +testnopkg foo3 +testnotempty find rootdir/var/lib/apt/lists -maxdepth 1 -name '*InRelease' -o -name '*Release.gpg' +testnotempty apt show foo2 +testnotempty apt showsrc foo2 +testwarning apt update --allow-weak-repositories +testnopkg foo2 +testbadpkg foo3 + +msgmsg 'Working with packages guarded only by weak hashes' +confighashes 'MD5' +rm -rf aptarchive/dists +buildsimplenativepackage 'foo4' 'i386' '1' 'unstable' +setupaptarchive --no-update +testfailure apt update +confighashes 'SHA256' +generatereleasefiles 'now - 1 day' +signreleasefiles +testsuccess apt update +cd downloaded +testfailure apt download foo4 +cp ../rootdir/tmp/testfailure.output download.output +testfailure grep 'Hash Sum mismatch' download.output +testsuccess grep 'Insufficient information' download.output + +testsuccess apt install foo4 -s +testfailure apt install foo4 -dy +cp ../rootdir/tmp/testfailure.output install.output +testfailure grep 'Hash Sum mismatch' install.output +testsuccess grep 'Insufficient information' download.output + +testsuccess apt source foo4 +cp ../rootdir/tmp/testsuccess.output source.output +testsuccess grep 'Skipping download of file' source.output +testfailure test -e foo4_1.dsc +testfailure test -e foo4_1.tar.* +cd .. diff --git a/test/integration/test-architecture-specification-parsing b/test/integration/test-architecture-specification-parsing new file mode 100755 index 0000000..2319938 --- /dev/null +++ b/test/integration/test-architecture-specification-parsing @@ -0,0 +1,120 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment + +# we need this construct here as it isn't really possible to fake native arch for dpkg-* tools +NATIVE="$(command dpkg --print-architecture)" +configarchitecture "${NATIVE}" 'armel' + +buildsimplenativepackage 'pkg-arch-foo' "$NATIVE" '1.0' 'stable' "Build-Depends: foo [${NATIVE} !${NATIVE}] +Depends: foo [${NATIVE} !${NATIVE}]" +buildsimplenativepackage 'pkg-arch-no-foo' "$NATIVE" '1.0' 'stable' "Build-Depends: foo [!${NATIVE} ${NATIVE}] +Depends: foo [!${NATIVE} ${NATIVE}]" +buildsimplenativepackage 'pkg-arch-foo-unrelated-no' "$NATIVE" '1.0' 'stable' "Build-Depends: foo [!someos-any ${NATIVE}] +Depends: foo [!someos-any ${NATIVE}]" +buildsimplenativepackage 'pkg-arch-foo-unrelated-no2' "$NATIVE" '1.0' 'stable' "Build-Depends: foo [${NATIVE} !someos-any] +Depends: foo [${NATIVE} !someos-any]" +buildsimplenativepackage 'no-depends' 'armel' '1.0' 'stable' 'Build-Depends: foo [armeb], bar [arm] +Depends: foo [armeb], bar [arm]' + +buildsimplenativepackage 'foo' "$NATIVE" '1.0' 'stable' + +insertinstalledpackage 'build-essential' 'all' '11.5' 'Multi-Arch: foreign' + +setupaptarchive + +testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + foo pkg-arch-foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 stable [${NATIVE}]) +Inst pkg-arch-foo (1.0 stable [${NATIVE}]) +Conf foo (1.0 stable [${NATIVE}]) +Conf pkg-arch-foo (1.0 stable [${NATIVE}])" aptget install pkg-arch-foo -s + +testsuccessequal "Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + pkg-arch-no-foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst pkg-arch-no-foo (1.0 stable [${NATIVE}]) +Conf pkg-arch-no-foo (1.0 stable [${NATIVE}])" aptget install pkg-arch-no-foo -s + +testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + foo pkg-arch-foo-unrelated-no +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 stable [${NATIVE}]) +Inst pkg-arch-foo-unrelated-no (1.0 stable [${NATIVE}]) +Conf foo (1.0 stable [${NATIVE}]) +Conf pkg-arch-foo-unrelated-no (1.0 stable [${NATIVE}])" aptget install pkg-arch-foo-unrelated-no -s + +testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + foo pkg-arch-foo-unrelated-no2 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 stable [${NATIVE}]) +Inst pkg-arch-foo-unrelated-no2 (1.0 stable [${NATIVE}]) +Conf foo (1.0 stable [${NATIVE}]) +Conf pkg-arch-foo-unrelated-no2 (1.0 stable [${NATIVE}])" aptget install pkg-arch-foo-unrelated-no2 -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 stable [${NATIVE}]) +Conf foo (1.0 stable [${NATIVE}])" aptget build-dep pkg-arch-foo -s + +testsuccessequal 'Reading package lists... +pkg-arch-no-foo has no build depends. +Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget build-dep pkg-arch-no-foo -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 stable [${NATIVE}]) +Conf foo (1.0 stable [${NATIVE}])" aptget build-dep pkg-arch-foo-unrelated-no -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 stable [${NATIVE}]) +Conf foo (1.0 stable [${NATIVE}])" aptget build-dep pkg-arch-foo-unrelated-no2 -s + +testsuccessequal 'Reading package lists... +no-depends has no build depends. +Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget build-dep no-depends -s + +# this is not really testing APT - more that dpkg is in line with us +configarchitecture 'amd64' 'armel' +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + no-depends:armel +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst no-depends:armel (1.0 stable [armel]) +Conf no-depends:armel (1.0 stable [armel])' aptget install no-depends -s diff --git a/test/integration/test-authentication-basic b/test/integration/test-authentication-basic new file mode 100755 index 0000000..211c73e --- /dev/null +++ b/test/integration/test-authentication-basic @@ -0,0 +1,127 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'foo' 'all' '1' +setupaptarchive --no-update + +changetohttpswebserver --authorization="$(printf '%s' 'star@irc:hunter2' | base64 )" + +echo 'See, when YOU type hunter2, it shows to us as *******' > aptarchive/bash +echo 'Debug::Acquire::netrc "true";' > rootdir/etc/apt/apt.conf.d/netrcdebug.conf + +testauthfailure() { + testfailure apthelper download-file "${1}/bash" ./downloaded/bash + # crappy test, but http and https output are wastely different… + testsuccess grep 401 rootdir/tmp/testfailure.output + testfailure test -s ./downloaded/bash +} + +testauthsuccess() { + testsuccess apthelper download-file "${1}/bash" ./downloaded/bash + testfileequal ./downloaded/bash "$(cat aptarchive/bash)" + testfilestats ./downloaded/bash '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644" + rm -f ./downloaded/bash + + # lets see if got/retains acceptable permissions + if [ -n "$AUTHCONF" ]; then + if [ "$(id -u)" = '0' ]; then + testfilestats "$AUTHCONF" '%U:%G:%a' '=' "_apt:$(id -gn):600" + else + testfilestats "$AUTHCONF" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:600" + fi + fi + + rm -rf rootdir/var/lib/apt/lists + if expr index "$1" '@' >/dev/null; then + testsuccesswithnotice aptget update + else + testsuccess aptget update + fi + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Conf foo (1 unstable [all])' aptget install foo -s +} + +authfile() { + local AUTHCONF="${2:-rootdir/etc/apt/auth.conf}" + mkdir -p "$(dirname "$AUTHCONF")" + rm -f "$AUTHCONF" + printf '%s' "$1" > "$AUTHCONF" + chmod 600 "$AUTHCONF" +} + +runtest() { + # unauthorized fails + authfile '' + testauthfailure "$1" + + # good auth + authfile 'machine localhost +login star@irc +password hunter2' + testauthsuccess "$1" + + # bad auth + authfile 'machine localhost +login anonymous +password hunter2' + testauthfailure "$1" + + # 2 stanzas: unmatching + good auth + authfile 'machine debian.org +login debian +password jessie + +machine localhost +login star@irc +password hunter2' + testauthsuccess "$1" + + # delete file, make sure it fails; add auth.conf.d snippet, works again. + rm rootdir/etc/apt/auth.conf + testauthfailure "$1" + + authfile 'machine localhost +login star@irc +password hunter2' rootdir/etc/apt/auth.conf.d/myauth.conf + testauthsuccess "$1" + rm rootdir/etc/apt/auth.conf.d/myauth.conf +} + +msgmsg 'server basic auth' +rewritesourceslist "http://localhost:${APTHTTPPORT}" +runtest "http://localhost:${APTHTTPPORT}" +rewritesourceslist "http://star%40irc:hunter2@localhost:${APTHTTPPORT}" +authfile '' +testauthsuccess "http://star%40irc:hunter2@localhost:${APTHTTPPORT}" +rewritesourceslist "https://localhost:${APTHTTPSPORT}" +runtest "https://localhost:${APTHTTPSPORT}" +rewritesourceslist "http://localhost:${APTHTTPPORT}" + +msgmsg 'proxy to server basic auth' +webserverconfig 'aptwebserver::request::absolute' 'uri' +# using ip instead of localhost avoids picking up the auth for the repo +# for the proxy as well as we serve them both over the same server… +export http_proxy="http://127.0.0.1:${APTHTTPPORT}" +runtest "http://localhost:${APTHTTPPORT}" +unset http_proxy + +msgmsg 'proxy basic auth to server basic auth' +webserverconfig 'aptwebserver::proxy-authorization' "$(printf 'moon:deer2' | base64)" +export http_proxy="http://moon:deer2@localhost:${APTHTTPPORT}" +runtest "http://localhost:${APTHTTPPORT}" + +msgmsg 'proxy basic auth to server' +authfile '' +webserverconfig 'aptwebserver::authorization' '' +testauthsuccess "http://localhost:${APTHTTPPORT}" diff --git a/test/integration/test-bug-254770-segfault-if-cache-not-buildable b/test/integration/test-bug-254770-segfault-if-cache-not-buildable new file mode 100755 index 0000000..6f6e1ab --- /dev/null +++ b/test/integration/test-bug-254770-segfault-if-cache-not-buildable @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +msgtest 'Test run as' 'non-root' +if [ "$(id -u)" = '0' ]; then + msgskip 'root has by definition no problems accessing files' + exit 0 +else + msgpass +fi + +setupenvironment +configarchitecture "i386" +setupaptarchive + +addtrap 'prefix' 'chmod a+x rootdir/var/lib/dpkg;' +chmod a-x rootdir/var/lib/dpkg + +testsegfault() { + msgtest "No segfault in" "$*" + local TEST="$("$@" 2>&1 | grep -v 'E:')" + if [ -z "$TEST" ]; then + msgpass + else + echo + echo "$TEST" + msgfail + fi +} + +echo 'quiet 2;' > rootdir/etc/apt/apt.conf.d/00be-quiet + +testsegfault aptcache gencaches +testsegfault aptcache showpkg +testsegfault aptcache showsrc +testsegfault aptcache stats +testsegfault aptcache dump +testsegfault aptcache dumpavail +testsegfault aptcache unmet +testsegfault aptcache search +testsegfault aptcache show apt +testsegfault aptcache depends apt +testsegfault aptcache rdepends apt +testsegfault aptcache pkgnames apt +testsegfault aptcache dotty apt +testsegfault aptcache xvcg apt +testsegfault aptcache policy apt + +testsegfault aptget update +testsegfault aptget upgrade +testsegfault aptget dselect-upgrade +testsegfault aptget dist-upgrade +testsegfault aptget install apt +testsegfault aptget remove apt +testsegfault aptget purge apt +testsegfault aptget source apt +testsegfault aptget build-dep apt +testsegfault aptget check +testsegfault aptget clean +testsegfault aptget autoclean +testsegfault aptget autoremove diff --git a/test/integration/test-bug-330162-encoded-tar-header b/test/integration/test-bug-330162-encoded-tar-header new file mode 100755 index 0000000..b779bbc --- /dev/null +++ b/test/integration/test-bug-330162-encoded-tar-header @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +msgtest 'Test apt-ftparchive with encoded tar header package' +cp "$TESTDIR/deb-bug-330162-encoded-tar-header.deb" aptarchive/ +testsuccess aptftparchive packages aptarchive/ diff --git a/test/integration/test-bug-407511-fail-invalid-default-release b/test/integration/test-bug-407511-fail-invalid-default-release new file mode 100755 index 0000000..0e1b5ef --- /dev/null +++ b/test/integration/test-bug-407511-fail-invalid-default-release @@ -0,0 +1,66 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'cool' 'all' '1.0-1' + +getcodenamefromsuite() { + if [ "$SUITE" = 'unstable' ]; then + echo -n 'sid' + else + echo -n "$SUITE" + fi +} +getreleaseversionfromsuite() { + if [ "$SUITE" = 'unstable' ]; then + echo -n '42.0' + else + echo -n '0.8.15' + fi +} + +getlabelfromsuite() { + if [ "$SUITE" = 'unstable' ]; then + echo -n 'UnstableTestcases' + else + echo -n 'Testcases' + fi +} + +setupaptarchive + +passdist() { + msgtest 'Test that target-release is accepted' $1 + testsuccess --nomsg aptget dist-upgrade -t $1 + msgtest 'Test that target-release pins with' $1 + aptcache policy -t $1 | grep -q ' 990' && msgpass || msgfail +} + +faildist() { + msgtest 'Test that target-release is refused' $1 + testfailure --nomsg aptget dist-upgrade -t $1 +} + +msgtest 'Test that no default-release is active in this test' 'setup' +aptcache policy | grep -q ' 990' && msgfall || msgpass + +passdist unstable +passdist sid +faildist sidd +faildist stable +passdist 42.0 +passdist 42.* +passdist 42* +passdist 4*.0 +faildist 21.0 +faildist 21* +# we accept, but don't validate the following +passdist a=unstable +passdist n=sid +passdist v=42.0 +passdist c=main +passdist l=UnstableTestcases diff --git a/test/integration/test-bug-470115-new-and-tighten-recommends b/test/integration/test-bug-470115-new-and-tighten-recommends new file mode 100755 index 0000000..f27990e --- /dev/null +++ b/test/integration/test-bug-470115-new-and-tighten-recommends @@ -0,0 +1,174 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertinstalledpackage 'cool' 'all' '1' +insertinstalledpackage 'stuff' 'all' '1' +insertinstalledpackage 'coolstuff' 'all' '1' + +insertpackage 'unstable' 'cool' 'all' '2' +insertpackage 'unstable' 'stuff' 'all' '2' +insertpackage 'unstable' 'coolstuff' 'all' '2' +insertpackage 'unstable' 'super' 'all' '2' + +insertinstalledpackage 'tighten-cool' 'all' '1' 'Recommends: cool (>= 1)' +insertpackage 'unstable' 'tighten-cool' 'all' '2' 'Recommends: cool (>= 2)' + +insertinstalledpackage 'tighten-coolorstuff' 'all' '1' 'Recommends: cool (>= 1) | stuff (>= 1)' +insertpackage 'unstable' 'tighten-coolorstuff' 'all' '2' 'Recommends: stuff (>= 2) | cool (>= 2)' + +insertinstalledpackage 'tighten-coolorstuff2' 'all' '1' 'Recommends: cool (>= 1) | stuff (>= 1)' +insertpackage 'unstable' 'tighten-coolorstuff2' 'all' '2' 'Recommends: stuff2 (>= 2) | cool (>= 2)' + +insertinstalledpackage 'newrec-cool' 'all' '1' +insertpackage 'unstable' 'newrec-cool' 'all' '2' 'Recommends: cool (>= 2)' + +insertinstalledpackage 'newrec-super' 'all' '1' +insertpackage 'unstable' 'newrec-super' 'all' '2' 'Recommends: super' + +insertinstalledpackage 'newrec-coolorstuff' 'all' '1' +insertpackage 'unstable' 'newrec-coolorstuff' 'all' '2' 'Recommends: cool (>= 2) | stuff (>= 2)' + +insertinstalledpackage 'cool-gone' 'all' '1' 'Recommends: cool (>= 1) | stuff (>= 2)' +insertpackage 'unstable' 'cool-gone' 'all' '2' 'Recommends: stuff (>= 2)' + +insertinstalledpackage 'super-overtake' 'all' '1' 'Recommends: cool | super, stuff | super' +insertpackage 'unstable' 'super-overtake' 'all' '2' 'Recommends: stuff (>= 3) | super, super | cool (>= 2)' + +insertinstalledpackage 'upgrade-over-new' 'all' '1' 'Recommends: cool' +insertpackage 'unstable' 'upgrade-over-new' 'all' '2' 'Recommends: cool (>= 2) | super' + +insertinstalledpackage 'now-satisfiable' 'all' '1' 'Recommends: cool (>= 3)' +insertpackage 'unstable' 'now-satisfiable' 'all' '2' 'Recommends: cool (>= 2)' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cool +The following packages will be upgraded: + cool tighten-cool +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst cool [1] (2 unstable [all]) +Inst tighten-cool [1] (2 unstable [all]) +Conf cool (2 unstable [all]) +Conf tighten-cool (2 unstable [all])' aptget install tighten-cool -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + stuff +The following packages will be upgraded: + stuff tighten-coolorstuff +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst stuff [1] (2 unstable [all]) +Inst tighten-coolorstuff [1] (2 unstable [all]) +Conf stuff (2 unstable [all]) +Conf tighten-coolorstuff (2 unstable [all])' aptget install tighten-coolorstuff -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cool +The following packages will be upgraded: + cool tighten-coolorstuff2 +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst cool [1] (2 unstable [all]) +Inst tighten-coolorstuff2 [1] (2 unstable [all]) +Conf cool (2 unstable [all]) +Conf tighten-coolorstuff2 (2 unstable [all])' aptget install tighten-coolorstuff2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cool +The following packages will be upgraded: + cool newrec-cool +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst cool [1] (2 unstable [all]) +Inst newrec-cool [1] (2 unstable [all]) +Conf cool (2 unstable [all]) +Conf newrec-cool (2 unstable [all])' aptget install newrec-cool -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + super +The following NEW packages will be installed: + super +The following packages will be upgraded: + newrec-super +1 upgraded, 1 newly installed, 0 to remove and 12 not upgraded. +Inst newrec-super [1] (2 unstable [all]) +Inst super (2 unstable [all]) +Conf newrec-super (2 unstable [all]) +Conf super (2 unstable [all])' aptget install newrec-super -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cool +The following packages will be upgraded: + cool newrec-coolorstuff +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst cool [1] (2 unstable [all]) +Inst newrec-coolorstuff [1] (2 unstable [all]) +Conf cool (2 unstable [all]) +Conf newrec-coolorstuff (2 unstable [all])' aptget install newrec-coolorstuff -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + stuff +The following packages will be upgraded: + cool-gone stuff +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst cool-gone [1] (2 unstable [all]) +Inst stuff [1] (2 unstable [all]) +Conf cool-gone (2 unstable [all]) +Conf stuff (2 unstable [all])' aptget install cool-gone -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + super +The following NEW packages will be installed: + super +The following packages will be upgraded: + super-overtake +1 upgraded, 1 newly installed, 0 to remove and 12 not upgraded. +Inst super (2 unstable [all]) +Inst super-overtake [1] (2 unstable [all]) +Conf super (2 unstable [all]) +Conf super-overtake (2 unstable [all])' aptget install super-overtake -s + +# if super would be in front, we would get a new here as it is new and +# the first option in an or-group should be the preferred one… +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cool +The following packages will be upgraded: + cool upgrade-over-new +2 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. +Inst cool [1] (2 unstable [all]) +Inst upgrade-over-new [1] (2 unstable [all]) +Conf cool (2 unstable [all]) +Conf upgrade-over-new (2 unstable [all])' aptget install upgrade-over-new -s + +# the recommends wasn't used before so while we could do it now, +# the user doesn't seem to need it so avoid upgrading it +testsuccessequal 'Reading package lists... +Building dependency tree... +Recommended packages: + cool +The following packages will be upgraded: + now-satisfiable +1 upgraded, 0 newly installed, 0 to remove and 12 not upgraded. +Inst now-satisfiable [1] (2 unstable [all]) +Conf now-satisfiable (2 unstable [all])' aptget install now-satisfiable -s diff --git a/test/integration/test-bug-507998-dist-upgrade-recommends b/test/integration/test-bug-507998-dist-upgrade-recommends new file mode 100755 index 0000000..b546874 --- /dev/null +++ b/test/integration/test-bug-507998-dist-upgrade-recommends @@ -0,0 +1,26 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'tshark' 'amd64' '1.0.4-1' 'Depends: wireshark-common' +insertinstalledpackage 'wireshark-common' 'amd64' '1.0.4-1' 'Recommends: wireshark (>= 1.0.4-1) | tshark (>= 1.0.4-1)' +insertpackage 'unstable' 'tshark' 'amd64' '1.2.1-2' 'Depends: wireshark-common (= 1.2.1-2)' +insertpackage 'unstable' 'wireshark-common' 'amd64' '1.2.1-2' 'Recommends: wireshark (>= 1.2.1-2) | tshark (>= 1.2.1-2)' +insertpackage 'unstable' 'wireshark' 'amd64' '1.2.1-2' 'Depends: wireshark-common (= 1.2.1-2)' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + tshark wireshark-common +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst wireshark-common [1.0.4-1] (1.2.1-2 unstable [amd64]) +Inst tshark [1.0.4-1] (1.2.1-2 unstable [amd64]) +Conf wireshark-common (1.2.1-2 unstable [amd64]) +Conf tshark (1.2.1-2 unstable [amd64])' aptget dist-upgrade -s diff --git a/test/integration/test-bug-543966-downgrade-below-1000-pin b/test/integration/test-bug-543966-downgrade-below-1000-pin new file mode 100755 index 0000000..db81b7c --- /dev/null +++ b/test/integration/test-bug-543966-downgrade-below-1000-pin @@ -0,0 +1,90 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'base-files' 'all' '5.0.0' +insertinstalledpackage 'base-files' 'all' '5.0.0-1' + +setupaptarchive + +STATUS=$(readlink -f rootdir/var/lib/dpkg/status) +APTARCHIVE="$(readlink -f aptarchive)" + +testsuccessequal "base-files: + Installed: 5.0.0-1 + Candidate: 5.0.0-1 + Version table: + *** 5.0.0-1 100 + 100 $STATUS + 5.0.0 500 + 500 file:${APTARCHIVE} unstable/main all Packages" aptcache policy base-files -o apt::pin=0 + +writepin() { + echo "Package: $1 +Pin: release a=unstable +Pin-Priority: $2" > rootdir/etc/apt/preferences +} + + + +testpinning() { + local PKGPINPRIO='' + local REPPINPRIO='' + if [ "$1" != '*' ]; then + PKGPINPRIO='' + REPPINPRIO=' 500' + fi + writepin "$1" '99' + testsuccessequal "base-files: + Installed: 5.0.0-1 + Candidate: 5.0.0-1 + Version table: + *** 5.0.0-1 100 + 100 $STATUS + 5.0.0 ${PKGPINPRIO:-99} + ${REPPINPRIO:- 99} file:${APTARCHIVE} unstable/main all Packages" aptcache policy base-files -o apt::pin=99 + + writepin "$1" '100' + testsuccessequal "base-files: + Installed: 5.0.0-1 + Candidate: 5.0.0-1 + Version table: + *** 5.0.0-1 100 + 100 $STATUS + 5.0.0 ${PKGPINPRIO:-100} + ${REPPINPRIO:- 100} file:${APTARCHIVE} unstable/main all Packages" aptcache policy base-files -o apt::pin=100 + + writepin "$1" '999' + testsuccessequal "base-files: + Installed: 5.0.0-1 + Candidate: 5.0.0-1 + Version table: + *** 5.0.0-1 100 + 100 $STATUS + 5.0.0 ${PKGPINPRIO:-999} + ${REPPINPRIO:- 999} file:${APTARCHIVE} unstable/main all Packages" aptcache policy base-files -o apt::pin=999 + + writepin "$1" '1000' + testsuccessequal "base-files: + Installed: 5.0.0-1 + Candidate: 5.0.0 + Version table: + *** 5.0.0-1 100 + 100 $STATUS + 5.0.0 ${PKGPINPRIO:-1000} + ${REPPINPRIO:-1000} file:${APTARCHIVE} unstable/main all Packages" aptcache policy base-files -o apt::pin=1000 +} + +msgmsg 'Tests with generic-form pin' +testpinning '*' +msgmsg 'Tests with specific-form pin' +testpinning 'base-files' +msgmsg 'Tests with specific-form pin with glob' +testpinning 'base-fil*' +msgmsg 'Tests with specific-form pin with regex' +testpinning '/^base-f[iI]les$/' diff --git a/test/integration/test-bug-549968-install-depends-of-not-installed b/test/integration/test-bug-549968-install-depends-of-not-installed new file mode 100755 index 0000000..fab67c4 --- /dev/null +++ b/test/integration/test-bug-549968-install-depends-of-not-installed @@ -0,0 +1,28 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'libc6' 'all' '1.0' +insertpackage 'unstable' 'coolstuff' 'all' '1.0' 'Recommends: extracoolstuff' +insertpackage 'unstable' 'extracoolstuff' 'all' '1.0' 'Depends: libc6' + +setupaptarchive + +# We check the Markers here as the autoremove nuker will also +# prevent it, but to late - its better to fail earlier +testsuccessequal "Reading package lists... +Building dependency tree... + MarkInstall coolstuff:i386 < none -> 1.0 @un puN IPb > FU=1 + Ignore MarkInstall of extracoolstuff:i386 < none | 1.0 @hn puH > as its mode (Keep) is protected +Package 'extracoolstuff' is not installed, so not removed +Recommended packages: + extracoolstuff +The following NEW packages will be installed: + coolstuff +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst coolstuff (1.0 unstable [all]) +Conf coolstuff (1.0 unstable [all])" aptget install coolstuff extracoolstuff- -o Debug::pkgDepCache::Marker=1 -s diff --git a/test/integration/test-bug-590041-prefer-non-virtual-packages b/test/integration/test-bug-590041-prefer-non-virtual-packages new file mode 100755 index 0000000..1b1e3aa --- /dev/null +++ b/test/integration/test-bug-590041-prefer-non-virtual-packages @@ -0,0 +1,54 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' 'armel' + +pkglibc6="Package: libc6 +Architecture: armel +Version: 2.11.2-2~0.3 +Description: Embedded GNU C Library: Shared libraries +Description-md5: b8c1e0561b75e2dc6b6482a99079c3e4 +Filename: pool/main/e/eglibc/libc6_2.11.2-2_armel.deb +Installed-Size: 9740 +MD5sum: f5b878ce5fb8aa01a7927fa1460df537 +Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> +Priority: required +SHA1: 0464d597dfbf949e8c17a42325b1f93fb4914afd +SHA256: faca4a3d9ccff57568abf41f6cb81ddd835be7b5d8b0161e2d5f9a7f26aae3c0 +Section: libs +Size: 4178958 +" + +pkglibdb1="Package: libdb1 +Architecture: i386 +Version: 2.1.3-13~0.3 +Replaces: libc6 (<< 2.2.5-13~0.3) +Description: The Berkeley database routines [glibc 2.0/2.1 compatibility] +Description-md5: de1876f7fe7f7709a110875e145e38a8 +Filename: pool/main/d/db1-compat/libdb1-compat_2.1.3-13_armel.deb +Installed-Size: 136 +MD5sum: 4043f176ab2b40b0c01bc1211b8c103c +Maintainer: Colin Watson <cjwatson@debian.org> +Priority: extra +SHA1: b9396fdd2e3e8d1d4ba9e74e7346075852d85666 +SHA256: f17decaa28d1db3eeb9eb17bebe50d437d293a509bcdd7cdfd3ebb56f5de3cea +Section: oldlibs +Size: 44168 +" + +cat >aptarchive/Packages <<EOF +$pkglibc6 +$pkglibdb1 +EOF + +setupaptarchive + +testnopackage libc6:i386 +testsuccessequal "$pkglibc6" aptcache show libc6:armel +testsuccessequal "$pkglibc6" aptcache show libc6 +testsuccessequal "$pkglibdb1" aptcache show libdb1:i386 +testnopackage libdb1:armel +testsuccessequal "$pkglibdb1" aptcache show libdb1 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 new file mode 100755 index 0000000..7610752 --- /dev/null +++ b/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order @@ -0,0 +1,96 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" +setupaptarchive + +pkgbasefile="Package: base-files +Status: install ok installed +Essential: yes +Priority: required +Section: admin +Installed-Size: 472 +Maintainer: Santiago Vila <sanvila@debian.org> +Architecture: i386 +Version: 5.8 +Replaces: base, dpkg (<= 1.15.0), miscutils +Provides: base +Filename: pool/main/b/base-files/base-files_5.8_i386.deb +Size: 73986 +MD5sum: 8489687ce10e656babd467c9ee389349 +Description-de: Verschiedene Dateien für das Basis-System von Debian" + +predependsgawk() { + cp "$TESTDIR/$(echo "$(basename "$0")" | sed 's/test-/status-/')" rootdir/var/lib/dpkg/status + echo "$pkgbasefile +Pre-Depends: $1 +" >> rootdir/var/lib/dpkg/status + testsuccessequal "Inst gawk (1:3.1.7.dfsg-5 localhost [i386]) +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') +} + +predependsgawk "gawk | mawk" +predependsgawk "mawk | gawk" + +predependsgawk "aawk | mawk | gawk" +predependsgawk "aawk | gawk | mawk" + +predependsgawk "gawk | awk" +predependsgawk "aawk | gawk | awk" + +predependsgawk "mawk | awk" + +predependsgawk "awk | gawk" +predependsgawk "awk | gawk | aawk" + +predependsgawk "awk | mawk" + +predependsgawk "aawk | awk" +predependsgawk "awk | aawk" + +predependsgawk "awk" + +predependsgawk2() { + 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 diff --git a/test/integration/test-bug-591882-conkeror b/test/integration/test-bug-591882-conkeror new file mode 100755 index 0000000..6b90343 --- /dev/null +++ b/test/integration/test-bug-591882-conkeror @@ -0,0 +1,77 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +UPGRADEFAIL="Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + conkeror libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9 +The following NEW packages will be installed: + gcc-4.4-base libavahi-client3 libavahi-common-data libavahi-common3 libc-bin + libdatrie1 libdb4.7 libdb4.8 libdbus-1-3 libgssapi-krb5-2 libjasper1 + libk5crypto3 libkrb5-3 libkrb5support0 liblzma2 libpam-modules libpam0g + libuuid1 libxcb-atom1 libxcb-aux0 libxcb-event1 libxml2 passwd + sensible-utils shared-mime-info xz-utils +The following packages will be upgraded: + coreutils debconf debconf-i18n debianutils defoma dpkg file fontconfig + fontconfig-config libacl1 libatk1.0-0 libattr1 libbz2-1.0 libc6 libcairo2 + libcomerr2 libcups2 libexpat1 libfontconfig1 libfreetype6 libgcc1 + libgcrypt11 libgdbm3 libglib2.0-0 libgnutls26 libgpg-error0 libgtk2.0-0 + libgtk2.0-common libhunspell-1.2-0 libice6 libjpeg62 libkeyutils1 + liblocale-gettext-perl libmagic1 libncurses5 libnewt0.52 libnspr4-0d + libnss3-1d libpango1.0-0 libpango1.0-common libpcre3 libpixman-1-0 + libpng12-0 libpopt0 libselinux1 libslang2 libsm6 libsqlite3-0 + libstartup-notification0 libstdc++6 libtasn1-3 libtext-charwidth-perl + libtext-iconv-perl libtext-wrapi18n-perl libthai-data libthai0 libtiff4 + libx11-6 libx11-data libxau6 libxcb-render-util0 libxcb-render0 libxcb1 + libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3 libxft2 + libxi6 libxinerama1 libxrandr2 libxrender1 libxt6 lsb-base ncurses-bin perl + perl-base perl-modules readline-common sed ttf-dejavu-core ucf whiptail + x11-common zlib1g +87 upgraded, 26 newly installed, 5 to remove and 0 not upgraded. +Need to get 0 B/54.4 MB of archives. +After this operation, 12.4 MB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." + +UPGRADESUCCESS="Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9 +The following NEW packages will be installed: + gcc-4.4-base libasound2 libavahi-client3 libavahi-common-data + libavahi-common3 libc-bin libdatrie1 libdb4.7 libdb4.8 libdbus-1-3 + libgssapi-krb5-2 libjasper1 libk5crypto3 libkrb5-3 libkrb5support0 liblzma2 + libmozjs2d libpam-modules libpam0g libreadline6 libuuid1 libxcb-atom1 + libxcb-aux0 libxcb-event1 libxml2 passwd sensible-utils shared-mime-info + xulrunner-1.9.1 xz-utils +The following packages will be upgraded: + conkeror coreutils debconf debconf-i18n debianutils defoma dpkg file + fontconfig fontconfig-config libacl1 libatk1.0-0 libattr1 libbz2-1.0 libc6 + libcairo2 libcomerr2 libcups2 libexpat1 libfontconfig1 libfreetype6 libgcc1 + libgcrypt11 libgdbm3 libglib2.0-0 libgnutls26 libgpg-error0 libgtk2.0-0 + libgtk2.0-common libhunspell-1.2-0 libice6 libjpeg62 libkeyutils1 + liblocale-gettext-perl libmagic1 libncurses5 libnewt0.52 libnspr4-0d + libnss3-1d libpango1.0-0 libpango1.0-common libpcre3 libpixman-1-0 + libpng12-0 libpopt0 libselinux1 libslang2 libsm6 libsqlite3-0 + libstartup-notification0 libstdc++6 libtasn1-3 libtext-charwidth-perl + libtext-iconv-perl libtext-wrapi18n-perl libthai-data libthai0 libtiff4 + libx11-6 libx11-data libxau6 libxcb-render-util0 libxcb-render0 libxcb1 + libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3 libxft2 + libxi6 libxinerama1 libxrandr2 libxrender1 libxt6 lsb-base ncurses-bin perl + perl-base perl-modules readline-common sed ttf-dejavu-core ucf whiptail + x11-common zlib1g +88 upgraded, 30 newly installed, 4 to remove and 0 not upgraded. +Need to get 0 B/62.9 MB of archives. +After this operation, 36.0 MB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." + +# Test that the old behavior can be restored with the option +testfailureequal "$UPGRADEFAIL" aptget dist-upgrade --trivial-only -o pkgProblemResolver::FixByInstall=0 +testfailureequal "$UPGRADESUCCESS" aptget dist-upgrade --trivial-only #-o pkgProblemResolver::FixByInstall=0 diff --git a/test/integration/test-bug-593360-modifiers-in-names b/test/integration/test-bug-593360-modifiers-in-names new file mode 100755 index 0000000..dc9a152 --- /dev/null +++ b/test/integration/test-bug-593360-modifiers-in-names @@ -0,0 +1,69 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + g++ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst g++ (4:4.4.5-1 localhost [i386]) +Conf g++ (4:4.4.5-1 localhost [i386])' aptget install g++ -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'g++' is not installed, so not removed +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove g++ -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + g++ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst g++ (4:4.4.5-1 localhost [i386]) +Conf g++ (4:4.4.5-1 localhost [i386])' aptget install g+++ -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + g++ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst g++ (4:4.4.5-1 localhost [i386]) +Conf g++ (4:4.4.5-1 localhost [i386])' aptget purge g+++ -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt (0.8.8 localhost [all]) +Conf apt (0.8.8 localhost [all])' aptget install apt -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt+ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt+ (0.8.8 localhost [all]) +Conf apt+ (0.8.8 localhost [all])' aptget install apt+ -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt+ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt+ (0.8.8 localhost [all]) +Conf apt+ (0.8.8 localhost [all])' aptget install apt++ -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt+ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt+ (0.8.8 localhost [all]) +Conf apt+ (0.8.8 localhost [all])' aptget purge apt++ -s diff --git a/test/integration/test-bug-595691-empty-and-broken-archive-files b/test/integration/test-bug-595691-empty-and-broken-archive-files new file mode 100755 index 0000000..d71bd2c --- /dev/null +++ b/test/integration/test-bug-595691-empty-and-broken-archive-files @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +buildaptarchive +touch aptarchive/Packages +setupflataptarchive + +failureupdate() { + rm -rf rootdir/var/lib/apt + testfailure aptget update --allow-insecure-repositories + testsuccess grep "^E: Failed to fetch store:${1} Empty files can't be valid archives$" rootdir/tmp/testfailure.output +} +successupdate() { + rm -rf rootdir/var/lib/apt + testwarning aptget update --allow-insecure-repositories +} + +createemptyarchive() { + find aptarchive/ \( -name "Packages*" -o -name "en*" \) -type f -delete + touch aptarchive/Packages + echo -n "" | $COMPRESSOR_CMD > aptarchive/${1}.$COMPRESS + find aptarchive -name '*Release*' -delete + rm -f aptarchive/Packages +} + +createemptyfile() { + find aptarchive/ \( -name "Packages*" -o -name "en*" \) -type f -delete + touch aptarchive/Packages aptarchive/${1}.$COMPRESS + find aptarchive -name '*Release*' -delete + rm -f aptarchive/Packages +} + +testoverfile() { + local APTARCHIVE="$(readlink -f ./aptarchive)" + forcecompressor "$1" + + msgmsg 'archive over file' "Packages.$COMPRESS" + createemptyarchive 'Packages' + successupdate + createemptyfile 'Packages' + failureupdate "$(readlink -f rootdir/var/lib/apt/lists/partial/$(echo "$APTARCHIVE" | sed -e 's#/#_#g')_Packages.${COMPRESS})" +} + +testoverhttp() { + forcecompressor "$1" + + msgmsg 'archive over http' "Packages.$COMPRESS" + createemptyarchive 'Packages' + successupdate + createemptyfile 'Packages' + failureupdate "$(readlink -f rootdir/var/lib/apt/lists/partial/localhost:${APTHTTPPORT}_Packages.${COMPRESS})" +} + +forallsupportedcompressors testoverfile + +# do the same again with http instead of file +changetowebserver + +forallsupportedcompressors testoverhttp diff --git a/test/integration/test-bug-596498-trusted-unsigned-repo b/test/integration/test-bug-596498-trusted-unsigned-repo new file mode 100755 index 0000000..4d0e3dc --- /dev/null +++ b/test/integration/test-bug-596498-trusted-unsigned-repo @@ -0,0 +1,75 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +buildsimplenativepackage 'cool' 'i386' '1.0' 'unstable' + +msgmsg 'default setup' +setupaptarchive + +aptgetupdate() { + rm -rf rootdir/var/lib/apt/ rootdir/var/cache/apt/*.bin + ${1:-testwarning} aptget update --allow-insecure-repositories +} + +PKGTEXT="$(aptget install cool --assume-no -d | head -n 8)" +DOWNLOG="$(echo "$PKGTEXT" | tail -n 1)" +PKGTEXT="$(echo "$PKGTEXT" | head -n 7)" +DEBFILE='rootdir/etc/apt/sources.list.d/apt-test-unstable-*.list' + +testsuccessequal "$PKGTEXT +$DOWNLOG +Download complete and in download only mode" aptget install cool --assume-no -d + +testsuccessequal "$PKGTEXT +$DOWNLOG +Download complete and in download only mode" aptget install cool --assume-no -d --allow-unauthenticated + +msgmsg 'sources marked trusted=no' +sed -i -e 's#\(deb\(-src\)\?\) #\1 [trusted=no] #' $DEBFILE +aptgetupdate 'testsuccess' + +testfailureequal "$PKGTEXT +WARNING: The following packages cannot be authenticated! + cool +Install these packages without verification? [y/N] N +E: Some packages could not be authenticated" aptget install cool --assume-no -d + +configarchitecture 'amd64' 'i386' +testequal "$(echo "$PKGTEXT" | sed 's#cool$#cool:i386#g') +WARNING: The following packages cannot be authenticated! + cool:i386 +Authentication warning overridden. +$DOWNLOG +Download complete and in download only mode" aptget install cool:i386 --assume-no -d --allow-unauthenticated +configarchitecture 'i386' + +find aptarchive/ \( -name 'Release.gpg' -o -name 'InRelease' \) -delete +msgmsg 'unsigned repo' +sed -i -e 's#\(deb\(-src\)\?\) \[trusted=no\] #\1 #' $DEBFILE +aptgetupdate + +testfailureequal "$PKGTEXT +WARNING: The following packages cannot be authenticated! + cool +Install these packages without verification? [y/N] N +E: Some packages could not be authenticated" aptget install cool --assume-no -d + +testsuccessequal "$PKGTEXT +WARNING: The following packages cannot be authenticated! + cool +Authentication warning overridden. +$DOWNLOG +Download complete and in download only mode" aptget install cool --assume-no -d --allow-unauthenticated + +msgmsg 'sources marked trusted=yes' +sed -i -e 's#\(deb\(-src\)\?\) #\1 [trusted=yes] #' $DEBFILE +aptgetupdate 'testsuccess' + +testsuccessequal "$PKGTEXT +$DOWNLOG +Download complete and in download only mode" aptget install cool --assume-no -d diff --git a/test/integration/test-bug-598669-install-postfix-gets-exim-heavy b/test/integration/test-bug-598669-install-postfix-gets-exim-heavy new file mode 100755 index 0000000..e7e4093 --- /dev/null +++ b/test/integration/test-bug-598669-install-postfix-gets-exim-heavy @@ -0,0 +1,19 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +testfailureequal "Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + exim4 exim4-daemon-light +The following NEW packages will be installed: + postfix +0 upgraded, 1 newly installed, 2 to remove and 0 not upgraded. +Need to get 0 B/1326 kB of archives. +After this operation, 2236 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install postfix --trivial-only diff --git a/test/integration/test-bug-601961-install-info b/test/integration/test-bug-601961-install-info new file mode 100755 index 0000000..1094438 --- /dev/null +++ b/test/integration/test-bug-601961-install-info @@ -0,0 +1,38 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +testfailureequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + findutils +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + findutils +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +After this operation, 1745 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget remove findutils --trivial-only + +testfailureequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + install-info +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +After this operation, 262 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget remove install-info --trivial-only + +testfailureequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + essentialpkg findutils +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + findutils essentialpkg (due to findutils) +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +After this operation, 2007 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget remove essentialpkg --trivial-only diff --git a/test/integration/test-bug-602412-dequote-redirect b/test/integration/test-bug-602412-dequote-redirect new file mode 100755 index 0000000..3db7b5e --- /dev/null +++ b/test/integration/test-bug-602412-dequote-redirect @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable' +buildsimplenativepackage 'unrelated2' 'all' '0.5~squeeze1' 'unstable' +insertinstalledpackage 'unrelated2' 'all' '0.1' + +setupaptarchive --no-update +changetowebserver -o aptwebserver::redirect::replace::/pool/=/newpool/ \ + -o aptwebserver::redirect::replace::/dists/=/newdists/ + +mv aptarchive/pool aptarchive/newpool +mv aptarchive/dists aptarchive/newdists + +testrun() { + msgmsg "Test $1 redirection works in method boundaries" "$2" + msgtest 'Test redirection works in' 'apt-get update' + testsuccess --nomsg aptget update + + # check that I-M-S header is kept in redirections + testsuccessequal "Hit:1 $2 unstable InRelease +Reading package lists..." aptget update + + msgtest 'Test redirection works in' 'package download' + testsuccess --nomsg aptget install unrelated --download-only -y +} + +for CODE in 301 302 307 308; do + webserverconfig 'aptwebserver::redirect::httpcode' "$CODE" + rm -f aptarchive/webserver.log.client*.log + testrun "$CODE" "http://localhost:${APTHTTPPORT}" + testsuccess grep "^HTTP/1.1 $CODE " aptarchive/webserver.log.client*.log + rm -rf rootdir/var/lib/apt/lists rootdir/var/cache/apt/archives +done + +changetohttpswebserver + +for CODE in 301 302 307 308; do + webserverconfig 'aptwebserver::redirect::httpcode' "$CODE" + rm -f aptarchive/webserver.log.client*.log + testrun "$CODE" "https://localhost:${APTHTTPSPORT}" + testsuccess grep "^HTTP/1.1 $CODE " aptarchive/webserver.log.client*.log + rm -rf rootdir/var/lib/apt/lists rootdir/var/cache/apt/archives +done + +testsuccess apt update +testsuccess aptget install unrelated --download-only +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + unrelated +The following packages have been kept back: + unrelated2 +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst unrelated (0.5~squeeze1 unstable [all]) +Conf unrelated (0.5~squeeze1 unstable [all])' aptget dist-upgrade unrelated --no-download --fix-missing -s +testsuccess aptget dist-upgrade unrelated --no-download --fix-missing -y +testdpkginstalled unrelated diff --git a/test/integration/test-bug-604222-new-and-autoremove b/test/integration/test-bug-604222-new-and-autoremove new file mode 100755 index 0000000..b8faf4f --- /dev/null +++ b/test/integration/test-bug-604222-new-and-autoremove @@ -0,0 +1,121 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'stable' 'dummy-archive' 'i386' '0.invalid.0' 'Depends: libavcodec52, libvtk5-dev | libopenal-dev' +insertpackage 'stable' 'libavcodec52' 'i386' '4:0.5.2-6' 'Conflicts: libvtk5-dev' +insertpackage 'stable' 'libopenal-dev' 'i386' '1:1.12.854-2' +insertpackage 'stable' 'libvtk5-dev' 'i386' '5.4.2-8' 'Depends: libvtk5.4 (= 5.4.2-8)' +insertpackage 'stable' 'libvtk5.4' 'i386' '5.4.2-8' 'Depends: libavcodec52 (>= 4:0.5.1-1)' + +insertpackage 'stable' 'gwenview' 'i386' '4:16.08.0-1' 'Depends: libkf5kipi-bin, libkf5kipi-data' +insertpackage 'stable' 'libkf5kipi-bin' 'i386' '4:16.08.0-1' +insertpackage 'stable' 'libkf5kipi-data' 'i386' '4:16.08.0-1' 'Breaks: libkipi-data' +insertpackage 'stable' 'libkipi-data' 'i386' '4:15.08.0-1' '' 'important' + +setupaptarchive + +cp -a rootdir/var/lib/dpkg/status rootdir/var/lib/dpkg/status.backup +insertinstalledpackage 'libvtk5.4' 'i386' '5.4.2-7' +testsuccess aptmark markauto 'libvtk5.4' +testmarkedauto 'libvtk5.4' + +AUTOREMOVE='apt autoremove' +if [ -n "$SUDO_USER" ]; then + AUTOREMOVE="sudo $AUTOREMOVE" +fi + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following package was automatically installed and is no longer required: + libvtk5.4 +Use '$AUTOREMOVE' to remove it. +The following NEW packages will be installed: + libavcodec52 +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst libavcodec52 (4:0.5.2-6 stable [i386]) +Conf libavcodec52 (4:0.5.2-6 stable [i386])" aptget install libavcodec52 -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +1 package was automatically installed and is no longer required. +Use '$AUTOREMOVE' to remove it. +The following NEW packages will be installed: + libavcodec52 +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst libavcodec52 (4:0.5.2-6 stable [i386]) +Conf libavcodec52 (4:0.5.2-6 stable [i386])" aptget install libavcodec52 -s -o APT::Get::HideAutoRemove=small + +testfailureequal "Reading package lists... +Building dependency tree... +Reading state information... +The following package was automatically installed and is no longer required: + libvtk5.4 +Use '$AUTOREMOVE' to remove it. +The following additional packages will be installed: + libavcodec52 libopenal-dev libvtk5.4 +The following NEW packages will be installed: + dummy-archive libavcodec52 libopenal-dev +The following packages will be upgraded: + libvtk5.4 +1 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +After this operation, 129 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install dummy-archive --trivial-only +testequal "Reading package lists... +Building dependency tree... +Reading state information... +1 package was automatically installed and is no longer required. +Use '$AUTOREMOVE' to remove it. +The following additional packages will be installed: + libavcodec52 libopenal-dev libvtk5.4 +The following NEW packages will be installed: + dummy-archive libavcodec52 libopenal-dev +The following packages will be upgraded: + libvtk5.4 +1 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +After this operation, 129 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install dummy-archive --trivial-only -o APT::Get::HideAutoRemove=small + +cp rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status +rm -f rootdir/var/lib/apt/extended_states + +CONFLICTING='Reading package lists... +Building dependency tree... + MarkInstall dummy-archive:i386 < none -> 0.invalid.0 @un puN Ib > FU=1 + MarkInstall libavcodec52:i386 < none -> 4:0.5.2-6 @un uN > FU=0 + MarkInstall libvtk5-dev:i386 < none -> 5.4.2-8 @un uN Ib > FU=0 + MarkInstall libvtk5.4:i386 < none -> 5.4.2-8 @un uN > FU=0 + MarkKeep libvtk5-dev:i386 < none -> 5.4.2-8 @un uN > FU=0 + MarkKeep libvtk5-dev:i386 < none -> 5.4.2-8 @un uN > FU=0 + MarkDelete libvtk5.4:i386 < none -> 5.4.2-8 @un ugN > FU=0 +The following additional packages will be installed: + libavcodec52 libopenal-dev +The following NEW packages will be installed: + dummy-archive libavcodec52 libopenal-dev +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +After this operation, 129 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' + +testfailureequal "$CONFLICTING" aptget install dummy-archive --trivial-only -o Debug::pkgDepCache::Marker=1 -o APT::Get::HideAutoRemove=0 +testfailureequal "$CONFLICTING" aptget install dummy-archive --trivial-only -o Debug::pkgDepCache::Marker=1 -o APT::Get::HideAutoRemove=1 +testfailureequal "$CONFLICTING" aptget install dummy-archive --trivial-only -o Debug::pkgDepCache::Marker=1 -o APT::Get::HideAutoRemove=small + +insertinstalledpackage 'my-metapackage' 'i386' '1' 'Depends: gwenview' +insertinstalledpackage 'gwenview' 'i386' '4:15.08.0-1' 'Depends: libkipi-data +Recommends: foobar' # trigger policy brokenness to avoid optimisation +insertinstalledpackage 'libkipi-data' 'i386' '4:15.08.0-1' '' 'important' +testsuccess aptmark markauto 'gwenview' + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following packages have been kept back: + gwenview +0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded." apt dist-upgrade -s diff --git a/test/integration/test-bug-604401-files-are-directories b/test/integration/test-bug-604401-files-are-directories new file mode 100755 index 0000000..4261d54 --- /dev/null +++ b/test/integration/test-bug-604401-files-are-directories @@ -0,0 +1,67 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +test ! -e rootdir/etc/apt/apt.conf || mv rootdir/etc/apt/apt.conf rootdir/etc/apt/apt.conf.d/000move-away-apt.conf + +msgtest "Directory instead of a file as apt.conf ignored" +mkdir -p rootdir/etc/apt/apt.conf +testsuccess --nomsg aptconfig dump +rmdir rootdir/etc/apt/apt.conf + +msgtest "Good link instead of a file as apt.conf ignored" +echo 'Test::APT::Link "good";' > rootdir/etc/apt/good-link.conf +ln -s rootdir/etc/apt/good-link.conf rootdir/etc/apt/apt.conf +testempty aptconfig shell TestLink 'Test::APT::Link' +rm rootdir/etc/apt/apt.conf + +msgtest "Broken link instead of a file as apt.conf ignored" +ln -s /tmp/doesnt-exist rootdir/etc/apt/apt.conf +testsuccess --nomsg aptconfig dump +rm rootdir/etc/apt/apt.conf + + +test ! -e rootdir/etc/apt/sources.list || mv rootdir/etc/apt/sources.list rootdir/etc/apt/sources.list.d/000move-away-sources.list + +msgtest "Directory instead of a file as sources.list ignored" +mkdir -p rootdir/etc/apt/sources.list +testsuccess --nomsg aptget update --print-uris +rmdir rootdir/etc/apt/sources.list + +msgtest "Good link instead of a file as sources.list ignored" +echo 'deb file:///tmp/debian sid main' > rootdir/etc/apt/good-link.list +ln -s rootdir/etc/apt/good-link.list rootdir/etc/apt/sources.list +testempty aptget update --print-uris +rm rootdir/etc/apt/sources.list + +msgtest "Broken link instead of a file as sources.list ignored" +ln -s /tmp/doesnt-exist rootdir/etc/apt/sources.list +testempty aptget update --print-uris +rm rootdir/etc/apt/sources.list + + +test ! -e rootdir/etc/apt/preferences || mv rootdir/etc/apt/preferences rootdir/etc/apt/preferences.d/000move-away-preferences + +msgtest "Directory instead of a file as preferences ignored" +mkdir -p rootdir/etc/apt/preferences +testsuccess --nomsg aptcache policy +rmdir rootdir/etc/apt/preferences + +msgtest "Good link instead of a file as preferences ignored" +echo 'Package: apt +Pin: release a=now +Pin-Value: 1000' > rootdir/etc/apt/good-link.pref +ln -s rootdir/etc/apt/good-link.pref rootdir/etc/apt/preferences +testsuccess aptcache policy +testfailure grep '1000 ' rootdir/tmp/testsucess.output +rm rootdir/etc/apt/preferences + +msgtest "Broken link instead of a file as preferences ignored" +ln -s /tmp/doesnt-exist rootdir/etc/apt/preferences +testsuccess --nomsg aptcache policy +rm rootdir/etc/apt/preferences diff --git a/test/integration/test-bug-605394-versioned-or-groups b/test/integration/test-bug-605394-versioned-or-groups new file mode 100755 index 0000000..43f35f7 --- /dev/null +++ b/test/integration/test-bug-605394-versioned-or-groups @@ -0,0 +1,30 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +testfailureequal "Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + php5 php5-cgi +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/5715 kB of archives. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget dist-upgrade --trivial-only + +msgtest "Solution process doesn't involve" 'apache2-mpm-prefork' + +if aptget dist-upgrade --trivial-only -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::Marker=1 2>&1 | grep apache2-mpm-prefork > /dev/null; then + msgfail +else + msgpass +fi + +# the Packages file includes only MD5 +testfailure aptget dist-upgrade -y +testsuccess grep 'Insufficient information available to perform this download securely' rootdir/tmp/testfailure.output diff --git a/test/integration/test-bug-611729-mark-as-manual b/test/integration/test-bug-611729-mark-as-manual new file mode 100755 index 0000000..63f8245 --- /dev/null +++ b/test/integration/test-bug-611729-mark-as-manual @@ -0,0 +1,96 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +buildsimplenativepackage "peace-dpkg" "all" "1.0" "stable" + +buildsimplenativepackage "a" "all" "1.0" "stable" "Depends: b" +buildsimplenativepackage "b" "all" "1.0" "stable" +buildsimplenativepackage "c" "all" "1.0" "stable" "Depends: b" + +setupaptarchive + +# dpkg freaks out if the last package is removed so keep one around +testsuccess aptget install peace-dpkg -y +testdpkginstalled peace-dpkg +testmarkedauto + +testsuccess aptget install a -y +testdpkginstalled a b +testdpkgnotinstalled c +testmarkedauto 'b' + +testsuccess aptget remove a -y +testdpkgnotinstalled a c +testdpkginstalled b +testmarkedauto 'b' + +testsuccess aptget install c -y +testdpkgnotinstalled a +testdpkginstalled b c +testmarkedauto 'b' + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +b is already the newest version (1.0). +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget install b --only-upgrade +testmarkedauto 'b' + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +b is already the newest version (1.0). +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget install b -d +testmarkedauto 'b' + +rm rootdir/var/log/apt/history.log + +testsuccess aptget install b --reinstall -y +testdpkgnotinstalled a +testdpkginstalled b c +testmarkedauto 'b' + +sed -i rootdir/var/log/apt/history.log -e '/^Commandline: / d' -e '/^Start-Date: / d' -e '/^End-Date: / d' +if [ -n "$SUDO_USER" ] && [ "$(id -u "$SUDO_USER")" -gt 0 ]; then + testfileequal 'rootdir/var/log/apt/history.log' " +Requested-By: $SUDO_USER ($(id -u "$SUDO_USER")) +Reinstall: b:i386 (1.0)" +else + testfileequal 'rootdir/var/log/apt/history.log' ' +Reinstall: b:i386 (1.0)' +fi + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +b is already the newest version (1.0). +b set to manually installed. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget install b +testmarkedauto + +testsuccess aptget remove b -y +testdpkgnotinstalled a b c +testmarkedauto + +testsuccess aptget install a b -y +testdpkginstalled a b +testdpkgnotinstalled c +testmarkedauto + +testsuccess aptget purge a b -y +testdpkgnotinstalled a b c +testmarkedauto + +testsuccess aptget install b c -y +testdpkgnotinstalled a +testdpkginstalled b c +testmarkedauto + +testsuccess aptget install a -y +testdpkginstalled a b c +testmarkedauto diff --git a/test/integration/test-bug-612099-multiarch-conflicts b/test/integration/test-bug-612099-multiarch-conflicts new file mode 100755 index 0000000..bc57395 --- /dev/null +++ b/test/integration/test-bug-612099-multiarch-conflicts @@ -0,0 +1,225 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' 'amd64' + +buildsimplenativepackage 'libc6' 'i386' '1.0' 'stable' +buildsimplenativepackage 'libc6' 'amd64' '1.0' 'stable' +buildsimplenativepackage 'libc6' 'all' '2.0' 'testing' + +buildsimplenativepackage 'foobar' 'i386' '1.0' 'stable' 'Depends: libc6' +buildsimplenativepackage 'foobar' 'amd64' '1.0' 'stable' 'Depends: libc6' + +setupaptarchive + +testsuccess aptget install libc6:i386 -t stable -y +testdpkginstalled libc6:i386 +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + libc6 +The following NEW packages will be installed: + libc6:amd64 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libc6 [1.0] +Inst libc6:amd64 (1.0 stable [amd64]) +Conf libc6:amd64 (1.0 stable [amd64])' aptget install libc6:amd64 -s -t stable + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following NEW packages will be installed: + foobar +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar (1.0 stable [i386]) +Conf foobar (1.0 stable [i386])' aptget install foobar -st stable + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following additional packages will be installed: + libc6:amd64 +The following packages will be REMOVED: + libc6 +The following NEW packages will be installed: + foobar:amd64 libc6:amd64 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv libc6 [1.0] +Inst libc6:amd64 (1.0 stable [amd64]) +Inst foobar:amd64 (1.0 stable [amd64]) +Conf libc6:amd64 (1.0 stable [amd64]) +Conf foobar:amd64 (1.0 stable [amd64])' aptget install foobar:amd64 -st stable + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [i386]) for 'foobar' +The following NEW packages will be installed: + foobar +The following packages will be upgraded: + libc6 +1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 [1.0] (2.0 testing [all]) +Inst foobar (1.0 stable [i386]) +Conf libc6 (2.0 testing [all]) +Conf foobar (1.0 stable [i386])" aptget install foobar/stable libc6 -st testing + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following packages will be upgraded: + libc6 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 [1.0] (2.0 testing [all]) +Conf libc6 (2.0 testing [all])' aptget upgrade -t testing -s +# FIXME: on amd64 systems this test wouldn't run with a real upgrade +# as APT (here i386) disagree about the native architecture, so +# we fake it here: +#aptget upgrade -y -qq >/dev/null 2>&1 +testsuccess aptget purge libc6 -y +testsuccess aptget install libc6:i386 -y +testdpkginstalled libc6:all + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [i386]) for 'foobar' +The following NEW packages will be installed: + foobar +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar (1.0 stable [i386]) +Conf foobar (1.0 stable [i386])" aptget install foobar/stable -st testing + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [amd64]) for 'foobar:amd64' +The following additional packages will be installed: + libc6:amd64 +The following packages will be REMOVED: + libc6 +The following NEW packages will be installed: + foobar:amd64 libc6:amd64 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv libc6 [2.0] +Inst libc6:amd64 (1.0 stable [amd64]) +Inst foobar:amd64 (1.0 stable [amd64]) +Conf libc6:amd64 (1.0 stable [amd64]) +Conf foobar:amd64 (1.0 stable [amd64])" aptget install foobar:amd64/stable -st testing + + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [i386]) for 'libc6' +The following packages will be DOWNGRADED: + libc6 +0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 0 not upgraded. +Inst libc6 [2.0] (1.0 stable [i386]) +Conf libc6 (1.0 stable [i386])" aptget install libc6/stable -s + + +buildsimplenativepackage 'libc6-same' 'i386' '1.0' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'libc6-same' 'amd64' '1.0' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'libc6-same' 'all' '2.0' 'testing' + +buildsimplenativepackage 'foobar-same' 'i386' '1.0' 'stable' 'Depends: libc6-same' +buildsimplenativepackage 'foobar-same' 'amd64' '1.0' 'stable' 'Depends: libc6-same' + +setupaptarchive + +testsuccess aptget install libc6-same:i386 -t stable -y +testdpkginstalled libc6-same:i386 + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following NEW packages will be installed: + foobar-same +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar-same (1.0 stable [i386]) +Conf foobar-same (1.0 stable [i386])' aptget install foobar-same -st stable + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following additional packages will be installed: + libc6-same:amd64 +The following NEW packages will be installed: + foobar-same:amd64 libc6-same:amd64 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6-same:amd64 (1.0 stable [amd64]) +Inst foobar-same:amd64 (1.0 stable [amd64]) +Conf libc6-same:amd64 (1.0 stable [amd64]) +Conf foobar-same:amd64 (1.0 stable [amd64])' aptget install foobar-same:amd64 -st stable + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following NEW packages will be installed: + libc6-same:amd64 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libc6-same:amd64 (1.0 stable [amd64]) +Conf libc6-same:amd64 (1.0 stable [amd64])' aptget install libc6-same:amd64 -s -t stable + +# FIXME: We should test installing libc6-same:amd64 here, but dpkg doesn't allow it currently + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following packages will be upgraded: + libc6-same +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst libc6-same [1.0] (2.0 testing [all]) +Conf libc6-same (2.0 testing [all])' aptget upgrade -t testing -s +# FIXME: on amd64 systems this test wouldn't run with a real upgrade +# as APT (here i386) disagree about the native architecture, so +# we fake it here: +#aptget upgrade -y -qq >/dev/null 2>&1 +testsuccess aptget purge libc6-same -y +testsuccess aptget install libc6-same:i386 -y +testdpkginstalled libc6-same:all + + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [i386]) for 'libc6-same' +The following packages will be DOWNGRADED: + libc6-same +0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 0 not upgraded. +Inst libc6-same [2.0] (1.0 stable [i386]) +Conf libc6-same (1.0 stable [i386])" aptget install libc6-same/stable -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [i386]) for 'foobar-same' +The following NEW packages will be installed: + foobar-same +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foobar-same (1.0 stable [i386]) +Conf foobar-same (1.0 stable [i386])" aptget install foobar-same/stable -st testing + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Selected version '1.0' (stable [amd64]) for 'foobar-same:amd64' +The following additional packages will be installed: + libc6-same:amd64 +The following packages will be REMOVED: + libc6-same +The following NEW packages will be installed: + foobar-same:amd64 libc6-same:amd64 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv libc6-same [2.0] +Inst libc6-same:amd64 (1.0 stable [amd64]) +Inst foobar-same:amd64 (1.0 stable [amd64]) +Conf libc6-same:amd64 (1.0 stable [amd64]) +Conf foobar-same:amd64 (1.0 stable [amd64])" aptget install foobar-same:amd64/stable -st testing diff --git a/test/integration/test-bug-612557-garbage-upgrade b/test/integration/test-bug-612557-garbage-upgrade new file mode 100755 index 0000000..d232c44 --- /dev/null +++ b/test/integration/test-bug-612557-garbage-upgrade @@ -0,0 +1,60 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'unrelated' 'all' '1:3.3.0-2' +insertpackage 'unstable' 'python-uno' 'all' '1:3.3.0-2' 'Depends: libreoffice-common' +insertpackage 'unstable' 'libreoffice-common' 'all' '1:3.3.0-2' 'Conflicts: openoffice.org-common' + +setupaptarchive + +touch rootdir/var/lib/apt/extended_states +testsuccess aptmark markauto python-uno openoffice.org-common +#aptmark unmarkauto openoffice.org-emailmerge +testmarkedauto python-uno openoffice.org-common + +testfailureequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following additional packages will be installed: + libreoffice-common +The following packages will be REMOVED: + openoffice.org-common openoffice.org-emailmerge +The following NEW packages will be installed: + libreoffice-common +The following packages will be upgraded: + python-uno +1 upgraded, 1 newly installed, 2 to remove and 0 not upgraded. +After this operation, 53.2 MB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget --trivial-only install python-uno + +testsuccess aptmark markauto openoffice.org-emailmerge +testmarkedauto python-uno openoffice.org-common openoffice.org-emailmerge + +testfailureequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following additional packages will be installed: + libreoffice-common +The following packages will be REMOVED: + openoffice.org-common openoffice.org-emailmerge +The following NEW packages will be installed: + libreoffice-common +The following packages will be upgraded: + python-uno +1 upgraded, 1 newly installed, 2 to remove and 0 not upgraded. +After this operation, 53.2 MB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget --trivial-only install python-uno + +testfailureequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + openoffice.org-common openoffice.org-emailmerge python-uno +0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded. +After this operation, 53.3 MB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget autoremove --trivial-only diff --git a/test/integration/test-bug-612958-use-dpkg-multiarch-config b/test/integration/test-bug-612958-use-dpkg-multiarch-config new file mode 100755 index 0000000..54200ff --- /dev/null +++ b/test/integration/test-bug-612958-use-dpkg-multiarch-config @@ -0,0 +1,83 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +testpass() { + msgtest 'Test architecture handling success' "$1 with $2" + rm -f archs.conf + aptconfig dump --no-empty --format='%V%n' APT::Architectures > archs.conf + testsuccess --nomsg grep "^$2\$" archs.conf +} + +testfail() { + msgtest 'Test architecture handling failure' "$1 with $2" + rm -f archs.conf + aptconfig dump --no-empty --format='%V%n' APT::Architectures > archs.conf + testfailure --nomsg grep "^$2\$" archs.conf +} + +testpass 'no config' 'i386' +testfail 'no config' 'amd64' +testfail 'no config' 'armel' + +CONFFILE=rootdir/etc/apt/apt.conf.d/99multiarch +echo '#clear APT::Architectures;' >> $CONFFILE +echo 'APT::Architectures:: "i386";' >> $CONFFILE +echo 'APT::Architectures:: "amd64";' >> $CONFFILE + +testpass 'apt config' 'i386' +testpass 'apt config' 'amd64' +testfail 'apt config' 'armel' + +echo 'APT::Architectures:: "armel";' >> $CONFFILE + +testpass 'apt config' 'armel' + +rm $CONFFILE + +echo '#clear APT::Architectures;' >> $CONFFILE +echo 'APT::Architectures "i386,amd64";' >> $CONFFILE + +testpass 'apt config' 'i386' +testpass 'apt config' 'amd64' +testfail 'apt config' 'armel' + +rm $CONFFILE + +echo '#clear APT::Architectures;' >> $CONFFILE +echo 'Dir::Bin::dpkg "./dpkg-printer";' >> $CONFFILE + +echo '#! /bin/sh +echo "amd64"' > ./dpkg-printer +chmod +x ./dpkg-printer + +testpass 'dpkg config' 'i386' +testpass 'dpkg config' 'amd64' +testfail 'dpkg config' 'armel' + +echo '#! /bin/sh +echo "amd64 armel"' > ./dpkg-printer + +testpass 'dpkg config' 'i386' +testpass 'dpkg config' 'amd64' +testpass 'dpkg config' 'armel' + +echo '#! /bin/sh +echo "amd64 +armel"' > ./dpkg-printer + +testpass 'dpkg config' 'i386' +testpass 'dpkg config' 'amd64' +testpass 'dpkg config' 'armel' + +echo '#! /bin/sh +echo "amd64 +i386"' > ./dpkg-printer + +testpass 'dpkg config' 'i386' +testpass 'dpkg config' 'amd64' +testfail 'dpkg config' 'armel' diff --git a/test/integration/test-bug-613420-new-garbage-dependency b/test/integration/test-bug-613420-new-garbage-dependency new file mode 100755 index 0000000..b225bd6 --- /dev/null +++ b/test/integration/test-bug-613420-new-garbage-dependency @@ -0,0 +1,56 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'libreoffice' 'all' '1:3.3.1~rc1-2' 'Depends: libreoffice-core' +insertpackage 'unstable' 'libreoffice-core' 'all' '1:3.3.1~rc1-2' 'Conflicts: openoffice.org-core' +insertpackage 'unstable' 'libreoffice-officebean' 'all' '1:3.3.1~rc1-2' 'Depends: libreoffice-core' +insertpackage 'unstable' 'openoffice.org-officebean' 'all' '1:3.3.0-5' 'Depends: libreoffice-officebean' + +setupaptarchive + +touch rootdir/var/lib/apt/extended_states +testsuccess aptmark markauto openoffice.org-officebean +testmarkedauto openoffice.org-officebean +AUTOREMOVE='apt autoremove' +if [ -n "$SUDO_USER" ]; then + AUTOREMOVE="sudo $AUTOREMOVE" +fi + +testfailureequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages were automatically installed and are no longer required: + libreoffice-officebean openoffice.org-officebean +Use '$AUTOREMOVE' to remove them. +The following additional packages will be installed: + libreoffice-core libreoffice-officebean openoffice.org-officebean +The following packages will be REMOVED: + openoffice.org-core +The following NEW packages will be installed: + libreoffice libreoffice-core libreoffice-officebean +The following packages will be upgraded: + openoffice.org-officebean +1 upgraded, 3 newly installed, 1 to remove and 0 not upgraded. +After this operation, 126 MB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation." aptget install libreoffice --trivial-only +testequal "Reading package lists... +Building dependency tree... +Reading state information... +2 packages were automatically installed and are no longer required. +Use '$AUTOREMOVE' to remove them. +The following additional packages will be installed: + libreoffice-core libreoffice-officebean openoffice.org-officebean +The following packages will be REMOVED: + openoffice.org-core +The following NEW packages will be installed: + libreoffice libreoffice-core libreoffice-officebean +The following packages will be upgraded: + openoffice.org-officebean +1 upgraded, 3 newly installed, 1 to remove and 0 not upgraded. +After this operation, 126 MB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation." aptget install libreoffice --trivial-only -o APT::Get::HideAutoRemove=small diff --git a/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted b/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted new file mode 100755 index 0000000..533cf77 --- /dev/null +++ b/test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted @@ -0,0 +1,68 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +buildsimplenativepackage 'cool' 'i386' '1.0' 'unstable' + +setupaptarchive --no-update + +testfileexists() { + msgtest 'Test for existence of file' "$1" + test -e "$1" && msgpass || msgfail + rm -f "$1" +} + +testfilemissing() { + msgtest 'Test for non-existence of file' "$1" + test -e "$1" && msgfail || msgpass + rm -f "$1" +} + +testrun() { + rm -rf rootdir/var/lib/apt + cd downloaded + + if [ "$1" = 'trusted' ]; then + testsuccess aptget update + + testsuccess aptget download cool + testfileexists 'cool_1.0_i386.deb' + + testsuccess aptget download cool --allow-unauthenticated + testfileexists 'cool_1.0_i386.deb' + else + testwarning aptget update --allow-insecure-repositories + + testfailure aptget download cool + testfilemissing 'cool_1.0_i386.deb' + + testsuccess aptget download cool --allow-unauthenticated + testfileexists 'cool_1.0_i386.deb' + fi + + mv ../aptarchive/pool/cool_1.0_i386.deb ../aptarchive/pool/cool_1.0_i386.deb.bak + echo 'this is not a good package' > ../aptarchive/pool/cool_1.0_i386.deb + testfailure aptget download cool + testfilemissing cool_1.0_i386.deb + + testfailure aptget download cool --allow-unauthenticated # unauthenticated doesn't mean unchecked + testfilemissing cool_1.0_i386.deb + + rm -f ../aptarchive/pool/cool_1.0_i386.deb + mv ../aptarchive/pool/cool_1.0_i386.deb.bak ../aptarchive/pool/cool_1.0_i386.deb + testsuccess aptget download cool --allow-unauthenticated + testfileexists 'cool_1.0_i386.deb' + cd - >/dev/null +} + +testrun 'trusted' + +find aptarchive/ \( -name 'Release.gpg' -o -name 'InRelease' \) -delete +testrun 'untrusted' + +changetowebserver +testrun 'untrusted' diff --git a/test/integration/test-bug-618288-multiarch-same-lockstep b/test/integration/test-bug-618288-multiarch-same-lockstep new file mode 100755 index 0000000..eeecb40 --- /dev/null +++ b/test/integration/test-bug-618288-multiarch-same-lockstep @@ -0,0 +1,41 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'libsame' 'i386,amd64' '1' 'Multi-Arch: same' 'required' +insertinstalledpackage 'apt' 'i386' '1' 'Depends: libsame (= 1) +Essential: yes' 'required' +insertinstalledpackage 'apt2' 'amd64' '1' 'Depends: libsame (= 1) +Essential: yes' 'required' +buildsimplenativepackage 'libsame' 'i386,amd64' '2' 'unstable' 'Multi-Arch: same' '' 'required' +buildsimplenativepackage 'apt' 'i386' '2' 'unstable' 'Depends: libsame (= 2)' '' 'required' +buildsimplenativepackage 'apt2' 'amd64' '2' 'unstable' 'Depends: libsame (= 2)' '' 'required' + +setupaptarchive +testsuccess aptget dist-upgrade -s -o Debug::pkgPackageManager=1 + +# order in switch libsame:{amd64,i386} are unpacked is irrelevant, as both are installed - but we need to do it together +OUTPUT=rootdir/tmp/testsuccess.output +LS_U_AMD="$(grep -o -n '^Inst libsame ' $OUTPUT | cut -d: -f1)" +LS_U_INT="$(grep -o -n '^Inst libsame:i386 ' $OUTPUT | cut -d: -f1)" +LS_C_AMD="$(grep -o -n '^Conf libsame ' $OUTPUT | cut -d: -f1)" +LS_C_INT="$(grep -o -n '^Conf libsame:i386 ' $OUTPUT | cut -d: -f1)" + +msgtest 'Test if' 'libsame:amd64 unpack before configure' +test "$LS_U_AMD" -lt "$LS_C_AMD" && msgpass || msgfail + +msgtest 'Test if' 'libsame:i386 unpack before configure' +test "$LS_U_INT" -lt "$LS_C_INT" && msgpass || msgfail + +msgtest 'Test if' 'libsame:amd64 unpack is before libsame:i386 configure' +test "$LS_U_AMD" -lt "$LS_C_INT" && msgpass || msgfail + +msgtest 'Test if' 'libsame:i386 unpack is before libsame:amd64 configure' +test "$LS_U_INT" -lt "$LS_C_AMD" && msgpass || msgfail + +# lets see if it really does work out +testsuccess apt dist-upgrade -y diff --git a/test/integration/test-bug-618848-always-respect-user-requests b/test/integration/test-bug-618848-always-respect-user-requests new file mode 100755 index 0000000..fa190a9 --- /dev/null +++ b/test/integration/test-bug-618848-always-respect-user-requests @@ -0,0 +1,32 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertinstalledpackage 'libdb4.8' 'all' '1.0' +insertinstalledpackage 'exim4' 'all' '1.0' 'Depends: exim4-daemon-light | exim4-daemon-heavy' +insertinstalledpackage 'exim4-daemon-light' 'all' '1.0' 'Depends: libdb4.8' +insertpackage 'unstable' 'exim4-daemon-heavy' 'all' '1.0' 'Depends: libdb4.8' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... + MarkDelete libdb4.8:i386 < 1.0 @ii pmK > FU=1 + MarkDelete exim4-daemon-light:i386 < 1.0 @ii mK Ib > FU=0 + MarkInstall exim4-daemon-heavy:i386 < none -> 1.0 @un uN Ib > FU=0 + Ignore MarkInstall of libdb4.8:i386 < 1.0 @ii pmR > as its mode (Delete) is protected + MarkDelete exim4-daemon-heavy:i386 < none -> 1.0 @un uN Ib > FU=0 + MarkDelete exim4:i386 < 1.0 @ii mK Ib > FU=0 +The following packages will be REMOVED: + exim4 exim4-daemon-light libdb4.8 + MarkDelete exim4:i386 < 1.0 @ii K > FU=1 +0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded. +Remv exim4 [1.0] + MarkDelete exim4-daemon-light:i386 < 1.0 @ii K > FU=1 +Remv exim4-daemon-light [1.0] + MarkDelete libdb4.8:i386 < 1.0 @ii K > FU=1 +Remv libdb4.8 [1.0]' aptget remove libdb4.8 -s -o Debug::pkgDepCache::Marker=1 diff --git a/test/integration/test-bug-623443-fail-on-bad-proxies b/test/integration/test-bug-623443-fail-on-bad-proxies new file mode 100755 index 0000000..d91a3ab --- /dev/null +++ b/test/integration/test-bug-623443-fail-on-bad-proxies @@ -0,0 +1,34 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable' + +setupaptarchive --no-update +changetowebserver + +testsuccess apt update +rm -rf rootdir/var/lib/apt/lists + +export http_proxy=enrico:password@proxy-cache.localnet:3128 +testfailure apt update +unset http_proxy +testsuccess grep 'Unsupported proxy configured' rootdir/tmp/testfailure.output + +changetohttpswebserver + +testsuccess apt update +rm -rf rootdir/var/lib/apt/lists + +export http_proxy=enrico:password@proxy-cache.localnet:3128 +testfailure apt update +unset http_proxy +testsuccess grep 'Unsupported proxy configured' rootdir/tmp/testfailure.output + +echo 'Acquire::http::Proxy "foo://example.org"; +Acquire::https::Proxy "DIRECT";' > rootdir/etc/apt/apt.conf.d/proxy.conf +testsuccess apt update diff --git a/test/integration/test-bug-624218-Translation-file-handling b/test/integration/test-bug-624218-Translation-file-handling new file mode 100755 index 0000000..c116278 --- /dev/null +++ b/test/integration/test-bug-624218-Translation-file-handling @@ -0,0 +1,171 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'unrelated' 'i386' '1' +insertpackage 'unstable' 'ancientstuff' 'all' '1' +insertpackage 'unstable' 'boringstuff' 'all' '1' '' '' 'shared short description' +insertpackage 'unstable' 'coolstuff' 'all' '1' +insertpackage 'unstable' 'dullstuff' 'all' '1' '' '' 'shared short description' +insertpackage 'unstable' 'evilstuff' 'all' '1' +insertpackage 'unstable' 'foostuff' 'all' '1' '' '' 'shared short description' +insertpackage 'unstable' 'goodstuff' 'all' '1' +insertpackage 'unstable' "longdesc" 'all' '1' '' '' "$(for i in $(seq 0 100); do printf '%s' 'lorem ipsum '; done)" + +setupaptarchive --no-update +changetowebserver + +testsuccess aptget update +PKGORDER='coolstuff foostuff coolstuff foostuff' +msgtest 'Prepare expectation for' 'aptcache show' +if aptcache show $PKGORDER | grep -v '^ ' > aptcacheshow.out 2>&1; then + msgpass +else + cat aptcacheshow.out || true + msgfail +fi +testsuccessequal '4' grep -c '^Package: ' aptcacheshow.out +msgtest 'Prepare expectation for' 'apt show' +if apt show $PKGORDER | grep -v -e '^ ' -e '^[A-Z][a-z]\+-Size: ' > aptshow.out 2>&1; then + msgpass +else + cat aptshow.out || true + msgfail +fi +testsuccessequal '4' grep -c '^Package: ' aptshow.out +rm -rf rootdir/var/lib/apt/lists + +checkaptshow() { + testsuccess aptcache show $PKGORDER + sed -i -e 's#^Description: #Description-en: #' rootdir/tmp/testsuccess.output + testequal "$(cat aptcacheshow.out) +" grep -v '^ ' rootdir/tmp/testsuccess.output + + testsuccess apt show $PKGORDER + sed -i -e 's#^Description-en: #Description: #' rootdir/tmp/testsuccess.output + testequal "$(cat aptshow.out) +" grep -v -e '^ ' -e '^[A-Z][a-z]\+-Size: ' rootdir/tmp/testsuccess.output + + if [ -n "$(ls rootdir/var/lib/apt/lists/*Translation* 2>/dev/null)" ]; then + testsuccess find rootdir/var/lib/apt/lists/ -name '*Translation*' -delete + + testsuccess aptcache show $PKGORDER + sed -i -e 's#^Description: #Description-en: #' rootdir/tmp/testsuccess.output + testequal "$(cat aptcacheshow.out) +" grep -v '^ ' rootdir/tmp/testsuccess.output + + testsuccess apt show $PKGORDER + sed -i -e 's#^Description-en: #Description: #' rootdir/tmp/testsuccess.output + testequal "$(cat aptshow.out) +" grep -v -e '^ ' -e '^[A-Z][a-z]\+-Size: ' rootdir/tmp/testsuccess.output + fi +} + +translationslisted() { + msgtest 'No download of non-existent locals' "$1" + export LC_ALL="" + testsuccess --nomsg aptget update -o Acquire::Languages=en + testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists + + msgtest 'Download of existent locals' "$1" + testsuccess --nomsg aptget update + cp rootdir/tmp/testsuccess.output testsuccess.output + testsuccess grep -q -e 'Translation-en ' testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists + + msgtest 'Download of en in LC_ALL=C' "$1" + export LC_ALL=C + testsuccess --nomsg aptget update + cp rootdir/tmp/testsuccess.output testsuccess.output + testsuccess grep -q -e 'Translation-en ' testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists + unset LC_ALL + + msgtest 'Download of en as forced language' "$1" + testsuccess --nomsg aptget update -o Acquire::Languages=en + cp rootdir/tmp/testsuccess.output testsuccess.output + testsuccess grep -q -e 'Translation-en ' testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists + + msgtest 'Download of nothing else in forced language' "$1" + testsuccess --nomsg aptget update -o Acquire::Languages=en + testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists + + msgtest 'Download no Translation- if forced language is non-existent' "$1" + testsuccess --nomsg aptget update -o Acquire::Languages=ast_DE + testfailure grep -q -e 'Translation-' rootdir/tmp/testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists + + msgtest 'Download of nothing if none is forced' "$1" + testsuccess --nomsg aptget update -o Acquire::Languages=none + testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output + checkaptshow + rm -rf rootdir/var/lib/apt/lists +} + +translationslisted 'with full Index' + +# No Release file at all, so no records about Translation files +# (fallback to guessing) +find aptarchive \( -name 'Release' -o -name 'InRelease' \) -delete +echo 'Acquire::AllowInsecureRepositories "true";' > rootdir/etc/apt/apt.conf.d/allow-insecure-repositories.conf + +msgtest 'Download of en as forced language' 'without Index' +testwarning --nomsg aptget update -o Acquire::Languages=en +testsuccess grep -q -e 'Translation-en ' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists + +msgtest 'Download of nothing else in forced language' 'without Index' +testwarning --nomsg aptget update -o Acquire::Languages=en +testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists + +msgtest 'Download of ast_DE as forced language' 'without Index' +testwarning --nomsg aptget update -o Acquire::Languages=ast_DE +testsuccess grep -q -e 'Translation-ast_DE$' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists + +msgtest 'Download of nothing else in forced language' 'without Index' +testwarning --nomsg aptget update -o Acquire::Languages=ast_DE +testfailure grep -q -e 'Translation-[^a][^s]' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists + +msgtest 'Download of nothing if none is forced' 'without Index' +testwarning --nomsg aptget update -o Acquire::Languages=none +testfailure grep -q -e 'Translation' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists + +mkdir -p rootdir/var/lib/apt/lists +touch rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-ast_DE + +msgtest 'Download of builtin files' 'without Index' +testwarning --nomsg aptget update +testsuccess grep -q -e 'Translation-ast_DE' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists + +mkdir -p rootdir/var/lib/apt/lists +touch rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_i18n_Translation-ast_DE + +msgtest 'Download of nothing (even builtin) if none is forced' 'without Index' +testwarning --nomsg aptget update -o Acquire::Languages=none +testfailure grep -q -e 'Translation' rootdir/tmp/testwarning.output +checkaptshow +rm -rf rootdir/var/lib/apt/lists diff --git a/test/integration/test-bug-632221-cross-dependency-satisfaction b/test/integration/test-bug-632221-cross-dependency-satisfaction new file mode 100755 index 0000000..d52652c --- /dev/null +++ b/test/integration/test-bug-632221-cross-dependency-satisfaction @@ -0,0 +1,348 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'armel' + +insertinstalledpackage 'build-essential' 'all' '11.5' 'Multi-Arch: foreign' + +insertpackage 'unstable' 'doxygen' 'amd64,armel' '1.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'libc6' 'amd64,armel' '1.0' 'Multi-Arch: same' +insertpackage 'unstable' 'libc6-dev' 'amd64,armel' '1.0' 'Depends: libc6 +Multi-Arch: same' +insertpackage 'unstable' 'libfwibble1' 'amd64,armel' '1.0' 'Depends: libc6 +Multi-Arch: same' +insertpackage 'unstable' 'libfwibble-dev' 'amd64,armel' '1.0' 'Depends: libfwibble1' +insertpackage 'unstable' 'cool' 'amd64,armel' '1.0' 'Multi-Arch: allowed' +insertpackage 'unstable' 'amdboot' 'amd64' '1.0' +insertpackage 'unstable' 'foreigner' 'amd64,armel' '1.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'arm-stuff' 'armel' '1.0' +insertpackage 'unstable' 'linux-stuff' 'amd64,armel' '1.0' + +insertsource 'unstable' 'apt' 'any' '0.8.15' 'Build-Depends: doxygen, libc6-dev, libc6-dev:native, cool:any, amdboot:amd64, foreigner, libfwibble-dev, arm-stuff [eabi-any-any-arm gnueabi-any-arm] | linux-stuff [ linux-any]' + +insertsource 'unstable' 'forbidden-no' 'any' '1' 'Build-Depends: amdboot:any' +insertsource 'unstable' 'forbidden-same' 'any' '1' 'Build-Depends: libc6:any' +insertsource 'unstable' 'forbidden-foreign' 'any' '1' 'Build-Depends: doxygen:any' + +insertpackage 'unstable' 'specific' 'amd64' '1.0' 'Depends: libc6:amd64' +insertpackage 'unstable' 'specific' 'armel' '1.0' 'Depends: libc6:armel' + +insertsource 'unstable' 'source-specific-amd64' 'amd64' '1' 'Build-Depends: specific:amd64' +insertsource 'unstable' 'source-specific-armel' 'armel' '1' 'Build-Depends: specific:armel' + +setupaptarchive + +testfailureequal 'Reading package lists... +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: + builddeps:forbidden-no:armel : Depends: amdboot:any but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget build-dep forbidden-no -s -a armel +testfailureequal 'Reading package lists... +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: + builddeps:forbidden-same:armel : Depends: libc6:any but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget build-dep forbidden-same -s -a armel +testfailureequal 'Reading package lists... +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: + builddeps:forbidden-foreign:armel : Depends: doxygen:any but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget build-dep forbidden-foreign -s -a armel + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libc6 specific +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 (1.0 unstable [amd64]) +Inst specific (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf specific (1.0 unstable [amd64])' aptget build-dep source-specific-amd64 -s +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libc6 specific +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 (1.0 unstable [amd64]) +Inst specific (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf specific (1.0 unstable [amd64])' aptget build-dep source-specific-amd64 -s -a armel + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libc6:armel specific:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6:armel (1.0 unstable [armel]) +Inst specific:armel (1.0 unstable [armel]) +Conf libc6:armel (1.0 unstable [armel]) +Conf specific:armel (1.0 unstable [armel])' aptget build-dep source-specific-armel -s +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libc6:armel specific:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6:armel (1.0 unstable [armel]) +Inst specific:armel (1.0 unstable [armel]) +Conf libc6:armel (1.0 unstable [armel]) +Conf specific:armel (1.0 unstable [armel])' aptget build-dep source-specific-armel -s -a armel + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot cool doxygen foreigner libc6 libc6-dev libfwibble-dev libfwibble1 + linux-stuff +0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst cool (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst foreigner (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [amd64]) +Inst libfwibble1 (1.0 unstable [amd64]) +Inst libfwibble-dev (1.0 unstable [amd64]) +Inst linux-stuff (1.0 unstable [amd64]) +Conf amdboot (1.0 unstable [amd64]) +Conf cool (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf foreigner (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [amd64]) +Conf libfwibble1 (1.0 unstable [amd64]) +Conf libfwibble-dev (1.0 unstable [amd64]) +Conf linux-stuff (1.0 unstable [amd64])' aptget build-dep apt -s + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot arm-stuff:armel cool doxygen foreigner libc6 libc6:armel libc6-dev + libc6-dev:armel libfwibble-dev:armel libfwibble1:armel +0 upgraded, 11 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst arm-stuff:armel (1.0 unstable [armel]) +Inst cool (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst foreigner (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6:armel (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [amd64]) +Inst libc6-dev:armel (1.0 unstable [armel]) +Inst libfwibble1:armel (1.0 unstable [armel]) +Inst libfwibble-dev:armel (1.0 unstable [armel]) +Conf amdboot (1.0 unstable [amd64]) +Conf arm-stuff:armel (1.0 unstable [armel]) +Conf cool (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf foreigner (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6:armel (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [amd64]) +Conf libc6-dev:armel (1.0 unstable [armel]) +Conf libfwibble1:armel (1.0 unstable [armel]) +Conf libfwibble-dev:armel (1.0 unstable [armel])' aptget build-dep apt -s -a armel + +configarchitecture 'armel' 'amd64' + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot:amd64 arm-stuff cool doxygen foreigner libc6 libc6-dev + libfwibble-dev libfwibble1 +0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst arm-stuff (1.0 unstable [armel]) +Inst cool (1.0 unstable [armel]) +Inst doxygen (1.0 unstable [armel]) +Inst foreigner (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [armel]) +Inst libfwibble1 (1.0 unstable [armel]) +Inst libfwibble-dev (1.0 unstable [armel]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf arm-stuff (1.0 unstable [armel]) +Conf cool (1.0 unstable [armel]) +Conf doxygen (1.0 unstable [armel]) +Conf foreigner (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [armel]) +Conf libfwibble1 (1.0 unstable [armel]) +Conf libfwibble-dev (1.0 unstable [armel])' aptget build-dep apt -s + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot:amd64 cool doxygen foreigner libc6 libc6:amd64 libc6-dev + libc6-dev:amd64 libfwibble-dev:amd64 libfwibble1:amd64 linux-stuff:amd64 +0 upgraded, 11 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst cool (1.0 unstable [armel]) +Inst doxygen (1.0 unstable [armel]) +Inst foreigner (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6:amd64 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [armel]) +Inst libc6-dev:amd64 (1.0 unstable [amd64]) +Inst libfwibble1:amd64 (1.0 unstable [amd64]) +Inst libfwibble-dev:amd64 (1.0 unstable [amd64]) +Inst linux-stuff:amd64 (1.0 unstable [amd64]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf cool (1.0 unstable [armel]) +Conf doxygen (1.0 unstable [armel]) +Conf foreigner (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6:amd64 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [armel]) +Conf libc6-dev:amd64 (1.0 unstable [amd64]) +Conf libfwibble1:amd64 (1.0 unstable [amd64]) +Conf libfwibble-dev:amd64 (1.0 unstable [amd64]) +Conf linux-stuff:amd64 (1.0 unstable [amd64])' aptget build-dep apt -s -a amd64 + +configarchitecture 'amd64' 'armel' + +insertinstalledpackage 'cool' 'amd64' '0.5' +insertinstalledpackage 'foreigner' 'armel' '0.5' + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot doxygen libc6 libc6-dev libfwibble-dev libfwibble1 linux-stuff +The following packages will be upgraded: + foreigner:armel +1 upgraded, 7 newly installed, 0 to remove and 1 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst foreigner:armel [0.5] (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [amd64]) +Inst libfwibble1 (1.0 unstable [amd64]) +Inst libfwibble-dev (1.0 unstable [amd64]) +Inst linux-stuff (1.0 unstable [amd64]) +Conf amdboot (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf foreigner:armel (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [amd64]) +Conf libfwibble1 (1.0 unstable [amd64]) +Conf libfwibble-dev (1.0 unstable [amd64]) +Conf linux-stuff (1.0 unstable [amd64])' aptget build-dep apt -s + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot arm-stuff:armel doxygen libc6 libc6:armel libc6-dev libc6-dev:armel + libfwibble-dev:armel libfwibble1:armel +The following packages will be upgraded: + cool +1 upgraded, 9 newly installed, 0 to remove and 1 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst arm-stuff:armel (1.0 unstable [armel]) +Inst cool [0.5] (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6:armel (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [amd64]) +Inst libc6-dev:armel (1.0 unstable [armel]) +Inst libfwibble1:armel (1.0 unstable [armel]) +Inst libfwibble-dev:armel (1.0 unstable [armel]) +Conf amdboot (1.0 unstable [amd64]) +Conf arm-stuff:armel (1.0 unstable [armel]) +Conf cool (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6:armel (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [amd64]) +Conf libc6-dev:armel (1.0 unstable [armel]) +Conf libfwibble1:armel (1.0 unstable [armel]) +Conf libfwibble-dev:armel (1.0 unstable [armel])' aptget build-dep apt -s -a armel + +configarchitecture 'armel' 'amd64' + +# cool 0.5 is not M-A: allowed, so amd64 is not acceptable +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + cool:amd64 +The following NEW packages will be installed: + amdboot:amd64 arm-stuff cool doxygen libc6 libc6-dev libfwibble-dev + libfwibble1 +0 upgraded, 8 newly installed, 1 to remove and 1 not upgraded. +Remv cool:amd64 [0.5] +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst arm-stuff (1.0 unstable [armel]) +Inst cool (1.0 unstable [armel]) +Inst doxygen (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [armel]) +Inst libfwibble1 (1.0 unstable [armel]) +Inst libfwibble-dev (1.0 unstable [armel]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf arm-stuff (1.0 unstable [armel]) +Conf cool (1.0 unstable [armel]) +Conf doxygen (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [armel]) +Conf libfwibble1 (1.0 unstable [armel]) +Conf libfwibble-dev (1.0 unstable [armel])' aptget build-dep apt -s + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot:amd64 doxygen libc6 libc6:amd64 libc6-dev libc6-dev:amd64 + libfwibble-dev:amd64 libfwibble1:amd64 linux-stuff:amd64 +The following packages will be upgraded: + cool:amd64 foreigner +2 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst cool:amd64 [0.5] (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [armel]) +Inst foreigner [0.5] (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6:amd64 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [armel]) +Inst libc6-dev:amd64 (1.0 unstable [amd64]) +Inst libfwibble1:amd64 (1.0 unstable [amd64]) +Inst libfwibble-dev:amd64 (1.0 unstable [amd64]) +Inst linux-stuff:amd64 (1.0 unstable [amd64]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf cool:amd64 (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [armel]) +Conf foreigner (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6:amd64 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [armel]) +Conf libc6-dev:amd64 (1.0 unstable [amd64]) +Conf libfwibble1:amd64 (1.0 unstable [amd64]) +Conf libfwibble-dev:amd64 (1.0 unstable [amd64]) +Conf linux-stuff:amd64 (1.0 unstable [amd64])' aptget build-dep apt -s -a amd64 diff --git a/test/integration/test-bug-633350-do-not-kill-last-char-in-Release b/test/integration/test-bug-633350-do-not-kill-last-char-in-Release new file mode 100755 index 0000000..d7dd261 --- /dev/null +++ b/test/integration/test-bug-633350-do-not-kill-last-char-in-Release @@ -0,0 +1,16 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'cool' 'amd64' '1.0' + +export APT_DONT_SIGN='InRelease' +setupaptarchive --no-update + +echo 'NotAutomatic: yes' >> aptarchive/dists/unstable/Release +signreleasefiles +testsuccess aptget update diff --git a/test/integration/test-bug-64141-install-dependencies-for-on-hold b/test/integration/test-bug-64141-install-dependencies-for-on-hold new file mode 100755 index 0000000..7bbb9bf --- /dev/null +++ b/test/integration/test-bug-64141-install-dependencies-for-on-hold @@ -0,0 +1,46 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'native' 'strange-arch' + +insertpackage 'unstable' 'unrelated' 'strange-arch' '1' + +insertinstalledpackage 'apt' 'native' '0.8.9' 'Depends: libc6 (>= 2.3.4)' +insertinstalledpackage 'libc6' 'native' '2.4.1-1' +insertinstalledpackage 'oldcrap' 'all' '1-1' + +insertpackage 'unstable' 'apt' 'native' '0.8.10' 'Depends: libc6 (>= 2.10), libdb4.8 +Breaks: oldcrap' +insertpackage 'unstable' 'libc6' 'native' '2.11.2-7' +insertpackage 'unstable' 'libdb4.8' 'native' '4.8.30-3' + +setupaptarchive + +testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + oldcrap +The following NEW packages will be installed: + libdb4.8 +The following packages will be upgraded: + apt libc6 +2 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only + +testsuccess aptmark hold apt + +testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + apt +The following packages will be upgraded: + libc6 +1 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only -o Test='hold-back-apt' diff --git a/test/integration/test-bug-657695-resolver-breaks-on-virtuals b/test/integration/test-bug-657695-resolver-breaks-on-virtuals new file mode 100755 index 0000000..366113a --- /dev/null +++ b/test/integration/test-bug-657695-resolver-breaks-on-virtuals @@ -0,0 +1,52 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'xserver-xorg-core' 'amd64' '2:1.7.6-2ubuntu7.10' +for i in $(seq 1 50); do + insertinstalledpackage "xserver-xorg-video-driver$i" 'amd64' '1.0' 'Provides: xserver-xorg-video-6' +done + +insertpackage 'unstable' 'xserver-xorg-core' 'amd64' '2:1.11.3-0ubuntu9' 'Breaks: xserver-xorg-video-6' + + +setupaptarchive + +testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + xserver-xorg-video-driver1 xserver-xorg-video-driver10 + xserver-xorg-video-driver11 xserver-xorg-video-driver12 + xserver-xorg-video-driver13 xserver-xorg-video-driver14 + xserver-xorg-video-driver15 xserver-xorg-video-driver16 + xserver-xorg-video-driver17 xserver-xorg-video-driver18 + xserver-xorg-video-driver19 xserver-xorg-video-driver2 + xserver-xorg-video-driver20 xserver-xorg-video-driver21 + xserver-xorg-video-driver22 xserver-xorg-video-driver23 + xserver-xorg-video-driver24 xserver-xorg-video-driver25 + xserver-xorg-video-driver26 xserver-xorg-video-driver27 + xserver-xorg-video-driver28 xserver-xorg-video-driver29 + xserver-xorg-video-driver3 xserver-xorg-video-driver30 + xserver-xorg-video-driver31 xserver-xorg-video-driver32 + xserver-xorg-video-driver33 xserver-xorg-video-driver34 + xserver-xorg-video-driver35 xserver-xorg-video-driver36 + xserver-xorg-video-driver37 xserver-xorg-video-driver38 + xserver-xorg-video-driver39 xserver-xorg-video-driver4 + xserver-xorg-video-driver40 xserver-xorg-video-driver41 + xserver-xorg-video-driver42 xserver-xorg-video-driver43 + xserver-xorg-video-driver44 xserver-xorg-video-driver45 + xserver-xorg-video-driver46 xserver-xorg-video-driver47 + xserver-xorg-video-driver48 xserver-xorg-video-driver49 + xserver-xorg-video-driver5 xserver-xorg-video-driver50 + xserver-xorg-video-driver6 xserver-xorg-video-driver7 + xserver-xorg-video-driver8 xserver-xorg-video-driver9 +The following packages will be upgraded: + xserver-xorg-core +1 upgraded, 0 newly installed, 50 to remove and 0 not upgraded. +After this operation, 2150 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only diff --git a/test/integration/test-bug-661537-build-profiles-support b/test/integration/test-bug-661537-build-profiles-support new file mode 100755 index 0000000..d24484d --- /dev/null +++ b/test/integration/test-bug-661537-build-profiles-support @@ -0,0 +1,161 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' 'armel' + +insertinstalledpackage 'build-essential' 'all' '0' 'Multi-Arch: foreign' + +insertpackage 'unstable' 'foo' 'all' '1.0' +insertpackage 'unstable' 'bar' 'all' '1.0' + +insertsource 'unstable' 'buildprofiles' 'any' '1' 'Build-Depends: foo (>= 1.0) [i386 arm] <!stage1 !cross>, bar' + +# table from https://wiki.debian.org/BuildProfileSpec +insertsource 'unstable' 'spec-1' 'any' '1' 'Build-Depends: foo <!stage1>' +insertsource 'unstable' 'spec-2' 'any' '1' 'Build-Depends: foo <stage1>' +insertsource 'unstable' 'spec-3' 'any' '1' 'Build-Depends: foo <!stage1 !notest>' +insertsource 'unstable' 'spec-4' 'any' '1' 'Build-Depends: foo <stage1 notest>' +insertsource 'unstable' 'spec-5' 'any' '1' 'Build-Depends: foo <!stage1 notest>' +insertsource 'unstable' 'spec-6' 'any' '1' 'Build-Depends: foo <stage1 !notest>' +insertsource 'unstable' 'spec-7' 'any' '1' 'Build-Depends: foo <stage1> <!notest>' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [all]) +Conf bar (1.0 unstable [all])' aptget build-dep buildprofiles -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [all]) +Inst foo (1.0 unstable [all]) +Conf bar (1.0 unstable [all]) +Conf foo (1.0 unstable [all])' aptget build-dep buildprofiles -s -o APT::Architecture=i386 + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [all]) +Conf bar (1.0 unstable [all])' aptget build-dep buildprofiles -s -o APT::Architecture=armel + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [all]) +Conf bar (1.0 unstable [all])' aptget build-dep buildprofiles -s -o APT::Architecture=i386 -P stage1 + +KEEP='Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [all]) +Conf foo (1.0 unstable [all])' +setdrop() { + DROP="Reading package lists... +$1 has no build depends. +Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." +} + +msgtest 'Check if version of installed dpkg is high enough for' 'build profiles support' +if dpkg --compare-versions "$(dpkg_version)" 'ge' '1.17.14'; then + msgpass + testwithdpkg() { + msgtest "Test with" "dpkg-checkbuilddeps -d '$1' -P '$2'" + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwithdpkg.output" + if dpkgcheckbuilddeps -d "$1" -P "$2" /dev/null >$OUTPUT 2>&1; then + if [ "$3" = "$DROP" ]; then + msgpass + else + cat $OUTPUT + msgfail + fi + else + if [ "$3" = "$KEEP" ]; then + msgpass + else + cat $OUTPUT + msgfail + fi + fi + } +else + msgskip + testwithdpkg() { + msgtest "Test with" "dpkg-checkbuilddeps -d '$1' -P '$2'" + msgskip + } +fi + +testprofile() { + if [ -n "$3" ]; then + testequal "$4" aptget build-dep "$1" -s -P "$3" + export DEB_BUILD_PROFILES="$(echo "$3" | tr ',' ' ')" + testequal "$4" aptget build-dep "$1" -s -o with::environment=1 + unset DEB_BUILD_PROFILES + else + testequal "$4" aptget build-dep "$1" -s + fi + testwithdpkg "$2" "$3" "$4" +} + +testsuccess aptcache gencaches +setdrop 'spec-1' +testprofile 'spec-1' 'foo <!stage1>' '' "$KEEP" +testprofile 'spec-1' 'foo <!stage1>' 'stage1' "$DROP" +testprofile 'spec-1' 'foo <!stage1>' 'notest' "$KEEP" +testprofile 'spec-1' 'foo <!stage1>' 'stage1,notest' "$DROP" + +setdrop 'spec-2' +testprofile 'spec-2' 'foo <stage1>' '' "$DROP" +testprofile 'spec-2' 'foo <stage1>' 'stage1' "$KEEP" +testprofile 'spec-2' 'foo <stage1>' 'notest' "$DROP" +testprofile 'spec-2' 'foo <stage1>' 'stage1,notest' "$KEEP" + +setdrop 'spec-3' +testprofile 'spec-3' 'foo <!stage1 !notest>' '' "$KEEP" +testprofile 'spec-3' 'foo <!stage1 !notest>' 'stage1' "$DROP" +testprofile 'spec-3' 'foo <!stage1 !notest>' 'notest' "$DROP" +testprofile 'spec-3' 'foo <!stage1 !notest>' 'stage1,notest' "$DROP" + +setdrop 'spec-4' +testprofile 'spec-4' 'foo <stage1 notest>' '' "$DROP" +testprofile 'spec-4' 'foo <stage1 notest>' 'stage1' "$DROP" +testprofile 'spec-4' 'foo <stage1 notest>' 'notest' "$DROP" +testprofile 'spec-4' 'foo <stage1 notest>' 'stage1,notest' "$KEEP" + +setdrop 'spec-5' +testprofile 'spec-5' 'foo <!stage1 notest>' '' "$DROP" +testprofile 'spec-5' 'foo <!stage1 notest>' 'stage1' "$DROP" +testprofile 'spec-5' 'foo <!stage1 notest>' 'notest' "$KEEP" +testprofile 'spec-5' 'foo <!stage1 notest>' 'stage1,notest' "$DROP" + +setdrop 'spec-6' +testprofile 'spec-6' 'foo <stage1 !notest>' '' "$DROP" +testprofile 'spec-6' 'foo <stage1 !notest>' 'stage1' "$KEEP" +testprofile 'spec-6' 'foo <stage1 !notest>' 'notest' "$DROP" +testprofile 'spec-6' 'foo <stage1 !notest>' 'stage1,notest' "$DROP" + +setdrop 'spec-7' +testprofile 'spec-7' 'foo <stage1> <!notest>' '' "$KEEP" +testprofile 'spec-7' 'foo <stage1> <!notest>' 'stage1' "$KEEP" +testprofile 'spec-7' 'foo <stage1> <!notest>' 'notest' "$DROP" +testprofile 'spec-7' 'foo <stage1> <!notest>' 'stage1,notest' "$KEEP" diff --git a/test/integration/test-bug-673536-pre-depends-breaks-loop b/test/integration/test-bug-673536-pre-depends-breaks-loop new file mode 100755 index 0000000..a4cf669 --- /dev/null +++ b/test/integration/test-bug-673536-pre-depends-breaks-loop @@ -0,0 +1,36 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'native' + +buildsimplenativepackage 'advanced' 'native' '1' 'stable' +buildsimplenativepackage 'advanced' 'native' '2' 'unstable' 'Pre-Depends: basic' +buildsimplenativepackage 'basic' 'native' '2' 'unstable' 'Pre-Depends: common' + +buildsimplenativepackage 'common' 'native' '2~conflict' 'unstable-conflict' 'Conflicts: advanced (<= 1)' +buildsimplenativepackage 'common' 'native' '2~break' 'unstable-break' 'Breaks: advanced (<= 1)' + +setupaptarchive + +# we check with 'real' packages here as the simulation reports a 'Conf broken' +# which is technical correct for the simulation, but testing errormsg is ugly + +cp -a rootdir/var/lib/dpkg/status dpkg.status.backup + +testloopbreak() { + cp -a dpkg.status.backup rootdir/var/lib/dpkg/status + rm -f rootdir/var/lib/apt/extended_states + + testsuccess aptget install advanced=1 -y -t "$1" + testdpkginstalled advanced + testdpkgnotinstalled basic common + + testsuccess aptget dist-upgrade -y -t "$1" + testdpkginstalled advanced basic common +} + +testloopbreak 'unstable-break' +testloopbreak 'unstable-conflict' diff --git a/test/integration/test-bug-675449-essential-are-protected b/test/integration/test-bug-675449-essential-are-protected new file mode 100755 index 0000000..69f6c2a --- /dev/null +++ b/test/integration/test-bug-675449-essential-are-protected @@ -0,0 +1,103 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'pkg-native' 'amd64' '1' 'Multi-Arch: foreign +Essential: yes' +insertinstalledpackage 'pkg-foreign' 'i386' '1' 'Multi-Arch: foreign +Essential: yes' +insertinstalledpackage 'pkg-none-native' 'amd64' '1' 'Essential: yes' +insertinstalledpackage 'pkg-none-foreign' 'i386' '1' 'Essential: yes' + +insertpackage 'unstable' 'pkg-native' 'amd64,i386' '2' 'Multi-Arch: foreign +Essential: yes' +insertpackage 'unstable' 'pkg-foreign' 'amd64,i386' '2' 'Multi-Arch: foreign +Depends: pkg-depends-new +Essential: yes' +insertpackage 'unstable' 'pkg-none-native' 'amd64,i386' '2' 'Essential: yes' +insertpackage 'unstable' 'pkg-none-foreign' 'amd64,i386' '2' 'Essential: yes +Depends: pkg-depends-new' + +insertpackage 'unstable' 'pkg-none-new' 'amd64,i386' '2' 'Essential: yes' +insertpackage 'unstable' 'pkg-depends-new' 'amd64,i386' '2' 'Essential: yes' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkg-native* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + pkg-native +0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded. +Purg pkg-native [1]' aptget purge pkg-native -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkg-foreign:i386* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + pkg-foreign:i386 +0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded. +Purg pkg-foreign:i386 [1]' aptget purge pkg-foreign:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkg-none-native* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + pkg-none-native +0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded. +Purg pkg-none-native [1]' aptget purge pkg-none-native -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkg-none-foreign:i386* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + pkg-none-foreign:i386 +0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded. +Purg pkg-none-foreign:i386 [1]' aptget purge pkg-none-foreign:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + pkg-depends-new:i386 pkg-none-new +The following packages will be upgraded: + pkg-foreign:i386 pkg-native pkg-none-foreign:i386 pkg-none-native +4 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst pkg-depends-new:i386 (2 unstable [i386]) +Conf pkg-depends-new:i386 (2 unstable [i386]) +Inst pkg-foreign:i386 [1] (2 unstable [i386]) +Conf pkg-foreign:i386 (2 unstable [i386]) +Inst pkg-native [1] (2 unstable [amd64]) +Conf pkg-native (2 unstable [amd64]) +Inst pkg-none-foreign:i386 [1] (2 unstable [i386]) +Conf pkg-none-foreign:i386 (2 unstable [i386]) +Inst pkg-none-native [1] (2 unstable [amd64]) +Conf pkg-none-native (2 unstable [amd64]) +Inst pkg-none-new (2 unstable [amd64]) +Conf pkg-none-new (2 unstable [amd64])' aptget dist-upgrade -s + +insertinstalledpackage 'foo' 'amd64' '1' 'Depends: libfoo +Essential: yes' +insertinstalledpackage 'libfoo' 'amd64' '1' +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + foo* libfoo* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + foo libfoo (due to foo) +0 upgraded, 0 newly installed, 2 to remove and 4 not upgraded. +Purg foo [1] +Purg libfoo [1]' aptget purge libfoo -s diff --git a/test/integration/test-bug-679371-apt-get-autoclean-multiarch b/test/integration/test-bug-679371-apt-get-autoclean-multiarch new file mode 100755 index 0000000..47e5aa1 --- /dev/null +++ b/test/integration/test-bug-679371-apt-get-autoclean-multiarch @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'pkgall' 'all' '1' 'stable' +buildsimplenativepackage 'pkgnative' 'amd64' '1' 'stable' +buildsimplenativepackage 'pkgforeign' 'i386' '1' 'stable' + +setupaptarchive + +changetowebserver + +testsuccess aptget update +testsuccess aptget install pkgall pkgnative pkgforeign -y + +# if we work with an old dpkg, pkgforeign will be listed differently, +# so test with aptcache for install status instead +testdpkginstalled pkgall pkgnative +testsuccess aptcache show pkgforeign/installed + +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information...' aptget autoclean -s diff --git a/test/integration/test-bug-680041-apt-mark-holds-correctly b/test/integration/test-bug-680041-apt-mark-holds-correctly new file mode 100755 index 0000000..49bb21b --- /dev/null +++ b/test/integration/test-bug-680041-apt-mark-holds-correctly @@ -0,0 +1,76 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'pkgarch' 'amd64' '1' +insertinstalledpackage 'pkgall' 'all' '1' + +insertpackage 'unstable' 'pkgarch' 'amd64' '2' +insertpackage 'unstable' 'pkgall' 'all' '2' + +setupaptarchive + +runtests() { + testempty aptmark showhold + + testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + pkgall pkgarch +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only + + testsuccessequal 'pkgarch set on hold.' aptmark hold pkgarch + testsuccessequal 'pkgarch' aptmark showhold + + testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + pkgarch +The following packages will be upgraded: + pkgall +1 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only + + testsuccessequal 'Canceled hold on pkgarch.' aptmark unhold pkgarch + testempty aptmark showhold + + testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + pkgall pkgarch +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only + + testsuccessequal 'pkgall set on hold.' aptmark hold pkgall + testsuccessequal 'pkgall' aptmark showhold + + testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + pkgall +The following packages will be upgraded: + pkgarch +1 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. +After this operation, 0 B of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only + + testsuccessequal 'Canceled hold on pkgall.' aptmark unhold pkgall + testempty aptmark showhold +} +# single-arch +runtests +# multi-arch +configarchitecture 'amd64' 'i386' +runtests diff --git a/test/integration/test-bug-683786-build-dep-on-virtual-packages b/test/integration/test-bug-683786-build-dep-on-virtual-packages new file mode 100755 index 0000000..831e1f8 --- /dev/null +++ b/test/integration/test-bug-683786-build-dep-on-virtual-packages @@ -0,0 +1,107 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'armel' + +insertinstalledpackage 'build-essential' 'all' '11.5' 'Multi-Arch: foreign' + +insertpackage 'unstable' 'po-debconf' 'all' '1' +insertsource 'unstable' 'dash' 'any' '1' 'Build-Depends: po-debconf' +insertpackage 'unstable' 'make-po-debconf-pure-virtual' 'armel' '1' 'Depends: po-debconf' + +insertsource 'unstable' 'diffutils' 'any' '1' 'Build-Depends: texi2html' + +insertpackage 'unstable' 'libselinux1-dev' 'amd64' '1' 'Provides: libselinux-dev' +insertsource 'unstable' 'sed' 'any' '1' 'Build-Depends: libselinux-dev' + +insertpackage 'unstable' 'libsehurd1-dev' 'amd64,armel' '1' 'Provides: libsehurd-dev' +insertsource 'unstable' 'sed2' 'any' '1' 'Build-Depends: libsehurd-dev' + +setupaptarchive + +testsuccessequal 'Package: po-debconf:armel +Versions: + +Reverse Depends: + make-po-debconf-pure-virtual:armel,po-debconf:armel +Dependencies: +Provides: +Reverse Provides: ' aptcache showpkg po-debconf:armel +testsuccessequal 'N: Unable to locate package texi2html:armel' aptcache showpkg texi2html:armel + +testsuccessequal 'Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + po-debconf +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst po-debconf (1 unstable [all]) +Conf po-debconf (1 unstable [all])' aptget build-dep dash -s + +testfailureequal 'Reading package lists... +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: + builddeps:dash:armel : Depends: po-debconf:armel but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget build-dep -aarmel dash -s +testfailureequal 'Reading package lists... +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: + builddeps:diffutils:armel : Depends: texi2html:armel but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget build-dep -aarmel diffutils -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libselinux1-dev +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libselinux1-dev (1 unstable [amd64]) +Conf libselinux1-dev (1 unstable [amd64])" aptget build-dep sed -s + +testfailureequal 'Reading package lists... +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: + builddeps:sed:armel : Depends: libselinux-dev:armel but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget build-dep -aarmel sed -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsehurd1-dev +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsehurd1-dev (1 unstable [amd64]) +Conf libsehurd1-dev (1 unstable [amd64])" aptget build-dep sed2 -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsehurd1-dev:armel +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsehurd1-dev:armel (1 unstable [armel]) +Conf libsehurd1-dev:armel (1 unstable [armel])" aptget build-dep -aarmel sed2 -s diff --git a/test/integration/test-bug-686346-package-missing-architecture b/test/integration/test-bug-686346-package-missing-architecture new file mode 100755 index 0000000..d28600a --- /dev/null +++ b/test/integration/test-bug-686346-package-missing-architecture @@ -0,0 +1,113 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'pkgb' 'none' '1' +insertinstalledpackage 'pkgd' 'none' '1' +insertpackage 'unstable' 'pkga' 'amd64' '2' 'Depends: pkgb' +insertpackage 'unstable' 'pkgb' 'amd64' '2' +insertpackage 'unstable' 'pkgc' 'amd64' '1' 'Conflicts: pkgb' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkgb:none +The following NEW packages will be installed: + pkgc +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv pkgb:none [1] +Inst pkgc (1 unstable [amd64]) +Conf pkgc (1 unstable [amd64])' aptget install pkgc -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + pkgb +The following packages will be REMOVED: + pkgb:none +The following NEW packages will be installed: + pkga pkgb +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv pkgb:none [1] +Inst pkgb (2 unstable [amd64]) +Inst pkga (2 unstable [amd64]) +Conf pkgb (2 unstable [amd64]) +Conf pkga (2 unstable [amd64])' aptget install pkga -s + +# do not automatically change from none-arch to whatever-arch as +# this breaks other none packages and dpkg has this ruleset as +# this difference seems so important that it has to be maintained … +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade -s + +# pkgd has no update with an architecture +testdpkginstalled pkgd +msgtest 'Test apt-get purge' 'pkgd' +testsuccess --nomsg aptget purge pkgd -y +testdpkgnotinstalled pkgd + +# there is a pkgb with an architecture +testdpkginstalled pkgb +msgtest 'Test apt-get purge' 'pkgb:none' +testsuccess --nomsg aptget purge pkgb:none -y +testdpkgnotinstalled pkgb + +# check that dependencies are created after the none package exists in the cache +rm rootdir/var/cache/apt/*.bin +insertinstalledpackage 'pkgb' 'none' '1' +insertinstalledpackage 'pkgf' 'none' '1' 'Conflicts: pkgb' +insertinstalledpackage 'pkgg' 'amd64' '1' 'Conflicts: pkgb' +insertinstalledpackage 'pkgb' 'amd64' '2' +testequalor2 "Reading package lists... +Building dependency tree... +Reading state information... +You might want to run 'apt --fix-broken install' to correct these. +The following packages have unmet dependencies: + pkgb : Conflicts: pkgb:none but 1 is installed + pkgb:none : Conflicts: pkgb but 2 is installed + pkgf:none : Conflicts: pkgb:none but 1 is installed + Conflicts: pkgb but 2 is installed + pkgg : Conflicts: pkgb but 2 is installed + Conflicts: pkgb:none but 1 is installed +E: Unmet dependencies. Try using --fix-broken." "Reading package lists... +Building dependency tree... +Reading state information... +You might want to run 'apt --fix-broken install' to correct these. +The following packages have unmet dependencies: + pkgb : Conflicts: pkgb:none but 1 is installed + pkgb:none : Conflicts: pkgb but 2 is installed + pkgf:none : Conflicts: pkgb but 2 is installed + Conflicts: pkgb:none but 1 is installed + pkgg : Conflicts: pkgb but 2 is installed + Conflicts: pkgb:none but 1 is installed +E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution)." aptget check + +# check that dependencies are generated for none-packages +rm rootdir/var/lib/dpkg/status +insertinstalledpackage 'pkgx' 'none' '1' +insertinstalledpackage 'pkgy' 'none' '1' 'Depends: pkgz, pkgx (>= 1)' +insertinstalledpackage 'pkgz' 'none' '1' +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + pkgx:none* pkgy:none* +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +Purg pkgy:none [1] +Purg pkgx:none [1]' aptget purge pkgx -s +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + pkgy:none* pkgz:none* +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +Purg pkgy:none [1] +Purg pkgz:none [1]' aptget purge pkgz -s diff --git a/test/integration/test-bug-689582-100-char-long-path-names b/test/integration/test-bug-689582-100-char-long-path-names new file mode 100755 index 0000000..290654b --- /dev/null +++ b/test/integration/test-bug-689582-100-char-long-path-names @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +mkdir aptarchive/testpkg +cd aptarchive/testpkg + +for i in $(seq 98 102); do + touch "$(printf "%0${i}d" "$i")" +done +tar zcf data.tar.gz 00* + +echo 'Package: testpkg +Version: 1-1 +Architecture: all +Maintainer: Joe Sixpack <joe@example.org> +Description: Package for test +Section: debug +Priority: extra' > control +tar zcf control.tar.gz control + +echo '2.0' > debian-binary +ar cr ../testpkg.deb debian-binary control.tar.gz data.tar.gz + +cd - > /dev/null + +testsuccessequal '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102 testpkg +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101 testpkg +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 testpkg +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099 testpkg +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098 testpkg' aptftparchive contents aptarchive/ diff --git a/test/integration/test-bug-691453-apt-cache-search-multi-pattern b/test/integration/test-bug-691453-apt-cache-search-multi-pattern new file mode 100755 index 0000000..8aa6ca7 --- /dev/null +++ b/test/integration/test-bug-691453-apt-cache-search-multi-pattern @@ -0,0 +1,33 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'native' + +insertpackage 'unstable' 'foobar' 'native' '1' '' '' 'funky tool' +insertpackage 'unstable' 'coolstuff' 'native' '1' '' '' 'funky tool just like foo and bar' +insertpackage 'unstable' 'foo' 'native' '1' '' '' 'tool best used with bar' +insertpackage 'unstable' 'bar' 'native' '1' '' '' 'tool best used with foo' +insertpackage 'unstable' 'baz' 'native' '1' 'Provides: bar' '' 'alternative tool best used with foo' + +setupaptarchive + +# in this special case the following queries should be equal +FOOBAR='foobar - funky tool +coolstuff - funky tool just like foo and bar +foo - tool best used with bar +bar - tool best used with foo +baz - alternative tool best used with foo' + +testsuccessequal "$FOOBAR" aptcache search foo +testsuccessequal "$FOOBAR" aptcache search bar +testsuccessequal "$FOOBAR" aptcache search foo bar + +testsuccessequal 'foobar - funky tool +foo - tool best used with bar' aptcache search -n foo +testsuccessequal 'foobar - funky tool +bar - tool best used with foo +baz - alternative tool best used with foo' aptcache search -n bar +testsuccessequal 'foobar - funky tool' aptcache search -n foo bar diff --git a/test/integration/test-bug-709560-set-candidate-release b/test/integration/test-bug-709560-set-candidate-release new file mode 100755 index 0000000..43eea36 --- /dev/null +++ b/test/integration/test-bug-709560-set-candidate-release @@ -0,0 +1,36 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'experimental' 'foo' 'all' '2.0' 'Depends: foo-dep (= 2.1)' +insertpackage 'experimental' 'foo-dep' 'all' '2.1' + + +( +cat <<EOF +Package: * +Pin: release a=experimental +Pin-Priority: -10 +EOF +) > rootdir/etc/apt/preferences + + +setupaptarchive + +testsuccessequal "Reading package lists... +Building dependency tree... +Selected version '2.0' (experimental [all]) for 'foo' +Selected version '2.1' (experimental [all]) for 'foo-dep' because of 'foo' +The following additional packages will be installed: + foo-dep +The following NEW packages will be installed: + foo foo-dep +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo-dep (2.1 experimental [all]) +Inst foo (2.0 experimental [all]) +Conf foo-dep (2.1 experimental [all]) +Conf foo (2.0 experimental [all])" aptget install -q0 -s foo/experimental diff --git a/test/integration/test-bug-712116-dpkg-pre-install-pkgs-hook-multiarch b/test/integration/test-bug-712116-dpkg-pre-install-pkgs-hook-multiarch new file mode 100755 index 0000000..9c96bbe --- /dev/null +++ b/test/integration/test-bug-712116-dpkg-pre-install-pkgs-hook-multiarch @@ -0,0 +1,152 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'toolkit' 'all' '1' 'stable' 'Multi-Arch: foreign' +buildsimplenativepackage 'toolkit' 'amd64' '2' 'unstable' 'Multi-Arch: foreign' +buildsimplenativepackage 'libsame' 'i386,amd64' '1' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'libsame' 'i386,amd64' '2' 'unstable' 'Multi-Arch: same' +buildsimplenativepackage 'stuff' 'i386,amd64' '1' 'stable' 'Depends: libsame (= 1), toolkit (= 1)' +buildsimplenativepackage 'stuff' 'i386,amd64' '2' 'unstable' 'Depends: libsame (= 2), toolkit (= 2)' + +setupsimplenativepackage 'confpkg' 'amd64' '1' 'unstable' +BUILDDIR='incoming/confpkg-1' +echo 'foo "bar";' > ${BUILDDIR}/pkg.conf +echo 'pkg.conf /etc/pkg.conf' >> ${BUILDDIR}/debian/install +buildpackage "$BUILDDIR" 'unstable' 'main' 'amd64' +rm -rf "$BUILDDIR" + +setupaptarchive + +hook='pre-install-pkgs' + +enablehookversion() { + echo "#!/bin/sh +FD=0 +echo -n > ${hook}-v${1}.list +if [ -n \"${2}\" ]; then + FD=\$APT_HOOK_INFO_FD + if [ "\$FD" != \"${2}\" ]; then echo \"ERROR: Information is not on requested FD: \$FD != ${2}\" >> ${hook}-v${1}.list; fi +fi +while read </dev/fd/\$FD line; do + if echo \"\$line\" | grep -Fq '**'; then + echo \"\$line\" + fi +done >> ${hook}-v${1}.list" > ${hook}-v${1}.sh + chmod +x ${hook}-v${1}.sh + echo "dpkg::${hook}:: \"./${hook}-v${1}.sh --foo -bar\"; +DPkg::Tools::options::\"./${hook}-v${1}.sh\"::Version \"$1\";" > rootdir/etc/apt/apt.conf.d/hook-v$1 + if [ -n "$2" ]; then + echo "DPkg::Tools::options::\"./${hook}-v${1}.sh\"::InfoFD \"${2}\";" >> rootdir/etc/apt/apt.conf.d/hook-v$1 + fi +} + +observehook() { + rm -f ${hook}-v2.list ${hook}-v3.list + msgtest 'Observe hooks while' "$*" + testsuccess --nomsg aptget "$@" -y --allow-downgrades --planner $planner -o Debug::pkgDPkgProgressReporting=1 + # different planners have different orders – we don't care in this test here + if [ -e ${hook}-v2.list ]; then + sort < ${hook}-v2.list > ${hook}-v2.list.new + mv ${hook}-v2.list.new ${hook}-v2.list + fi + if [ -e ${hook}-v3.list ]; then + sort < ${hook}-v3.list > ${hook}-v3.list.new + mv ${hook}-v3.list.new ${hook}-v3.list + fi +} + +testrun() { + observehook install stuff -t stable + testfileequal "${hook}-v2.list" 'libsame - < 1 **CONFIGURE** +stuff - < 1 **CONFIGURE** +toolkit - < 1 **CONFIGURE**' + testfileequal "${hook}-v3.list" 'libsame - - none < 1 amd64 same **CONFIGURE** +stuff - - none < 1 amd64 none **CONFIGURE** +toolkit - - none < 1 all foreign **CONFIGURE**' + + observehook install stuff -t unstable + testfileequal "${hook}-v2.list" 'libsame 1 < 2 **CONFIGURE** +stuff 1 < 2 **CONFIGURE** +toolkit 1 < 2 **CONFIGURE**' + testfileequal "${hook}-v3.list" 'libsame 1 amd64 same < 2 amd64 same **CONFIGURE** +stuff 1 amd64 none < 2 amd64 none **CONFIGURE** +toolkit 1 all foreign < 2 amd64 foreign **CONFIGURE**' + + observehook install stuff:i386 -t unstable + testfileequal "${hook}-v2.list" 'libsame - < 2 **CONFIGURE** +stuff - < 2 **CONFIGURE** +stuff 2 > - **REMOVE**' + testfileequal "${hook}-v3.list" 'libsame - - none < 2 i386 same **CONFIGURE** +stuff - - none < 2 i386 none **CONFIGURE** +stuff 2 amd64 none > - - none **REMOVE**' + + observehook remove libsame + testfileequal "${hook}-v2.list" 'libsame 2 > - **REMOVE**' + testfileequal "${hook}-v3.list" 'libsame 2 amd64 same > - - none **REMOVE**' + + observehook install stuff:i386/stable libsame:i386/stable toolkit/stable + testfileequal "${hook}-v2.list" 'libsame 2 > 1 **CONFIGURE** +stuff 2 > 1 **CONFIGURE** +toolkit 2 > 1 **CONFIGURE**' + testfileequal "${hook}-v3.list" 'libsame 2 i386 same > 1 i386 same **CONFIGURE** +stuff 2 i386 none > 1 i386 none **CONFIGURE** +toolkit 2 amd64 foreign > 1 all foreign **CONFIGURE**' + + observehook install 'libsame:*' + testfileequal "${hook}-v2.list" 'libsame - < 2 **CONFIGURE** +libsame 1 < 2 **CONFIGURE** +stuff 1 < 2 **CONFIGURE** +toolkit 1 < 2 **CONFIGURE**' + testfileequal "${hook}-v3.list" 'libsame - - none < 2 amd64 same **CONFIGURE** +libsame 1 i386 same < 2 i386 same **CONFIGURE** +stuff 1 i386 none < 2 i386 none **CONFIGURE** +toolkit 1 all foreign < 2 amd64 foreign **CONFIGURE**' + + observehook purge stuff:i386 'libsame:*' toolkit + testfileequal "${hook}-v2.list" 'libsame 2 > - **REMOVE** +libsame 2 > - **REMOVE** +stuff 2 > - **REMOVE** +toolkit 2 > - **REMOVE**' + testfileequal "${hook}-v3.list" 'libsame 2 amd64 same > - - none **REMOVE** +libsame 2 i386 same > - - none **REMOVE** +stuff 2 i386 none > - - none **REMOVE** +toolkit 2 amd64 foreign > - - none **REMOVE**' + + observehook install confpkg + testfileequal "${hook}-v2.list" 'confpkg - < 1 **CONFIGURE**' + testfileequal "${hook}-v3.list" 'confpkg - - none < 1 amd64 none **CONFIGURE**' + + observehook remove confpkg + testfileequal "${hook}-v2.list" 'confpkg 1 > - **REMOVE**' + testfileequal "${hook}-v3.list" 'confpkg 1 amd64 none > - - none **REMOVE**' + + msgtest 'Conffiles of package remained after remove' 'confpkg' + dpkg -l confpkg | grep -q '^rc' && msgpass || msgfail + + observehook purge confpkg + testfileequal "${hook}-v2.list" 'confpkg 1 > - **REMOVE**' + testfileequal "${hook}-v3.list" 'confpkg 1 amd64 none > - - none **REMOVE**' + + msgtest 'Conffiles are gone after purge' 'confpkg' + dpkg -l confpkg 2>/dev/null | grep -q '^rc' && msgfail || msgpass +} + +runwithplanner() +{ + msgmsg 'Running with planner' "$1" + planner="$1" + enablehookversion 2 + enablehookversion 3 + testrun + + enablehookversion 2 13 + enablehookversion 3 13 + testrun +} + +runwithplanner 'apt' diff --git a/test/integration/test-bug-712435-missing-descriptions b/test/integration/test-bug-712435-missing-descriptions new file mode 100755 index 0000000..c231993 --- /dev/null +++ b/test/integration/test-bug-712435-missing-descriptions @@ -0,0 +1,162 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +PACKAGESTANZA='Version: 0.9.7.8 +Installed-Size: 3270 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: amd64 +Filename: pool/main/a/apt/apt_0.9.7.8_amd64.deb +MD5sum: 3a622acda41620df50aa22a9fac6f32e' + +DESCRIPTION='Description: commandline package manager + This APT has Super Cow Powers.' + +TRANSDESCRIPTION='Description-en: commandline package manager + This APT has translated Super Cow Powers.' + +echo "Package: apt-normal +$PACKAGESTANZA +$DESCRIPTION +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +Package: apt-both-below +$PACKAGESTANZA +$DESCRIPTION +$TRANSDESCRIPTION +Description-md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + +Package: apt-both-middle +$PACKAGESTANZA +$DESCRIPTION +Description-md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +$TRANSDESCRIPTION + +Package: apt-both-top +$PACKAGESTANZA +Description-md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +$DESCRIPTION +$TRANSDESCRIPTION + +Package: apt-trans +$PACKAGESTANZA +$TRANSDESCRIPTION +Description-md5: cccccccccccccccccccccccccccccccc + +Package: apt-md5 +$PACKAGESTANZA +Description-md5: dddddddddddddddddddddddddddddddd + +Package: apt-none +$PACKAGESTANZA + +Package: apt-intermixed +$PACKAGESTANZA +$DESCRIPTION +X-Some-Flag: yes +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +Package: apt-intermixed2 +$PACKAGESTANZA +$DESCRIPTION +X-Some-Flag: yes +$TRANSDESCRIPTION +X-Foo-Flag: Something with a Description +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +X-Bar-Flag: no + +Package: apt-intermixed3 +$PACKAGESTANZA +$DESCRIPTION +X-Some-Flag: yes +$TRANSDESCRIPTION +X-Foo-Flag: Something with a Description +X-Bar-Flag: no +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" > aptarchive/Packages + + +setupaptarchive + +testsuccessequal "Package: apt-normal +$PACKAGESTANZA +$DESCRIPTION +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +" aptcache show apt-normal + +for variant in 'below' 'middle' 'top'; do + testsuccessequal "Package: apt-both-$variant +$PACKAGESTANZA +$TRANSDESCRIPTION +Description-md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +" aptcache show apt-both-$variant +done + +testsuccessequal "Package: apt-trans +$PACKAGESTANZA +$TRANSDESCRIPTION +Description-md5: cccccccccccccccccccccccccccccccc +" aptcache show apt-trans + +testsuccessequal "Package: apt-md5 +$PACKAGESTANZA +Description-md5: dddddddddddddddddddddddddddddddd +" aptcache show apt-md5 + +testsuccessequal "Package: apt-none +$PACKAGESTANZA +" aptcache show apt-none + +testsuccessequal "Package: apt-intermixed +$PACKAGESTANZA +$DESCRIPTION +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +X-Some-Flag: yes +" aptcache show apt-intermixed + +testsuccessequal "Package: apt-intermixed2 +$PACKAGESTANZA +$TRANSDESCRIPTION +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +X-Some-Flag: yes +X-Foo-Flag: Something with a Description +X-Bar-Flag: no +" aptcache show apt-intermixed2 + +testsuccessequal "Package: apt-intermixed3 +$PACKAGESTANZA +$TRANSDESCRIPTION +Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +X-Some-Flag: yes +X-Foo-Flag: Something with a Description +X-Bar-Flag: no +" aptcache show apt-intermixed3 + +msgtest 'Test that no description does not destroy' 'showpkg' +aptcache showpkg apt-none | sed 's#/tmp/.*_aptarchive_#/tmp/aptarchive_#' >showpkg.explosion && msgpass || msgfail +testfileequal showpkg.explosion 'Package: apt-none +Versions: +0.9.7.8 (/tmp/aptarchive_Packages) + + +Reverse Depends: +Dependencies: +0.9.7.8 - +Provides: +0.9.7.8 - +Reverse Provides: ' + +testempty aptcache search nonexistentstring + +# packages without a description can't be found +testsuccessequal 'apt-normal - commandline package manager +apt-both-below - commandline package manager +apt-both-middle - commandline package manager +apt-both-top - commandline package manager +apt-trans - commandline package manager +apt-intermixed - commandline package manager +apt-intermixed2 - commandline package manager +apt-intermixed3 - commandline package manager' aptcache search apt diff --git a/test/integration/test-bug-717891-abolute-uris-for-proxies b/test/integration/test-bug-717891-abolute-uris-for-proxies new file mode 100755 index 0000000..5f1b754 --- /dev/null +++ b/test/integration/test-bug-717891-abolute-uris-for-proxies @@ -0,0 +1,53 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable' + +setupaptarchive +changetowebserver --request-absolute='uri' + +msgtest 'Check that absolute paths are' 'not accepted' +testfailure --nomsg aptget update --allow-insecure-repositories + +echo "Acquire::http::Proxy \"http://localhost:${APTHTTPPORT}\";" > rootdir/etc/apt/apt.conf.d/99proxy + +msgtest 'Check that requests to proxies are' 'absolute uris via config' +testsuccess --nomsg aptget update + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + unrelated +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst unrelated (0.5~squeeze1 unstable [all]) +Conf unrelated (0.5~squeeze1 unstable [all])' aptget install unrelated -s + +rm -f rootdir/etc/apt/apt.conf.d/99proxy +echo "Acquire::http::Proxy-Auto-Detect \"${TMPWORKINGDIRECTORY}/apt-proxy-detect\";" > rootdir/etc/apt/apt.conf.d/02proxy-detect +cat > "${TMPWORKINGDIRECTORY}/apt-proxy-detect" <<EOF +#!/bin/sh +set -e +echo "http://localhost:${APTHTTPPORT}" +EOF +chmod 755 "${TMPWORKINGDIRECTORY}/apt-proxy-detect" + +msgtest 'Check that requests to proxies are' 'absolute uris via auto-detect' +testsuccess aptget update -o Debug::Acquire::http=1 + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + unrelated +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst unrelated (0.5~squeeze1 unstable [all]) +Conf unrelated (0.5~squeeze1 unstable [all])' aptget install unrelated -s + +chmod 444 "${TMPWORKINGDIRECTORY}/apt-proxy-detect" +msgtest 'Check that non-executable proxy commands result in' 'permission error' +testfailure --nomsg aptget update +testsuccess grep 'can not be executed' rootdir/tmp/testfailure.output diff --git a/test/integration/test-bug-718329-support-data.tar-uncompressed b/test/integration/test-bug-718329-support-data.tar-uncompressed new file mode 100755 index 0000000..9318025 --- /dev/null +++ b/test/integration/test-bug-718329-support-data.tar-uncompressed @@ -0,0 +1,34 @@ +#!/bin/sh +set -e + +art() { + ar t "$@" | grep -v control.tar +} + +test_process_package_with_compression() { + COMPRESSOR="$1" + DATA_TAR="$2" + + msgmsg "Testing apt-ftparchive with compression type: $COMPRESSOR" + + buildsimplenativepackage 'pkg' 'all' '1.0' '' '' 'some descr' '' '' '' "$COMPRESSOR" + testsuccessequal "debian-binary +$DATA_TAR" art incoming/pkg_1.0_all.deb + + testequal "Package: pkg" echo "$(aptftparchive packages incoming/|grep ^Package)" + + testsuccessequal "usr/bin/pkg-all pkg +usr/share/doc/pkg/FEATURES pkg +usr/share/doc/pkg/changelog pkg +usr/share/doc/pkg/copyright pkg" aptftparchive contents incoming/ + + rm -rf incoming/* +} + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +test_process_package_with_compression "gzip" "data.tar.gz" +test_process_package_with_compression "none" "data.tar" +test_process_package_with_compression "xz" "data.tar.xz" diff --git a/test/integration/test-bug-719263-print-uris-removes-authentication b/test/integration/test-bug-719263-print-uris-removes-authentication new file mode 100755 index 0000000..e79e691 --- /dev/null +++ b/test/integration/test-bug-719263-print-uris-removes-authentication @@ -0,0 +1,42 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'unrelated' 'all' '1' +buildsimplenativepackage 'unrelated' 'all' '2' 'unstable' + +setupaptarchive + +testnoact() { + cp -a rootdir/var/lib/dpkg/status rootdir/var/lib/dpkg/status-backup-noact + touch rootdir/var/lib/apt/extended_states + testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be upgraded: + unrelated +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst unrelated [1] (2 unstable [all]) +Conf unrelated (2 unstable [all])' aptget install unrelated -s + testsuccess aptget install unrelated -y + testdpkginstalled unrelated + rm -rf rootdir/var/cache/apt/*.bin + cp -a rootdir/var/lib/dpkg/status-backup-noact rootdir/var/lib/dpkg/status +} + +testnoact +testsuccess aptget update --print-uris +testnoact + +# same thing, just not with InRelease this time +rm -rf rootdir/var/lib/apt/lists +testsuccess aptget update -o Acquire::TryInRelease=0 + +testnoact +testsuccess aptget update --print-uris -o Acquire::TryInRelease=0 +testnoact diff --git a/test/integration/test-bug-720597-build-dep-purge b/test/integration/test-bug-720597-build-dep-purge new file mode 100755 index 0000000..4b36989 --- /dev/null +++ b/test/integration/test-bug-720597-build-dep-purge @@ -0,0 +1,65 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment + +# we need this construct here as it isn't really possible to fake native arch for dpkg-* tools +NATIVE="$(command dpkg --print-architecture)" +configarchitecture $NATIVE + +insertinstalledpackage 'build-essential' 'all' '11.5' 'Multi-Arch: foreign' +insertinstalledpackage 'pkga' 'all' '1' +buildsimplenativepackage 'pkgb' "$NATIVE" '1' 'stable' 'Conflicts: pkga' +buildsimplenativepackage 'pkgc' "$NATIVE" '1' 'stable' 'Build-Depends: pkgb' + +setupaptarchive + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkga +The following NEW packages will be installed: + pkgb +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv pkga [1] +Inst pkgb (1 stable [$NATIVE]) +Conf pkgb (1 stable [$NATIVE])" aptget build-dep pkgc -s + +testsuccessequal "Reading package lists... +Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + pkga* +The following NEW packages will be installed: + pkgb +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Purg pkga [1] +Inst pkgb (1 stable [$NATIVE]) +Conf pkgb (1 stable [$NATIVE])" aptget build-dep pkgc -s --purge + +testsuccessequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' apt autoremove -s +testdpkgnotinstalled pkgb +testsuccess apt build-dep pkgc -y -o Debug::pkgDepCache::AutoInstall=1 -o Debug::pkgDepCache::Marker=1 +testdpkginstalled pkgb +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' apt autoremove -s +testsuccess apt purge pkgb pkgc -y +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' apt autoremove -s +testsuccess apt build-dep pkgc -y -o APT::Get::Build-Dep-Automatic=true +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + pkgb +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv pkgb [1]' apt autoremove -s diff --git a/test/integration/test-bug-722207-print-uris-even-if-very-quiet b/test/integration/test-bug-722207-print-uris-even-if-very-quiet new file mode 100755 index 0000000..8d17507 --- /dev/null +++ b/test/integration/test-bug-722207-print-uris-even-if-very-quiet @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'apt' 'all' '1' +insertpackage 'unstable' 'apt' 'all' '2' +insertsource 'unstable' 'apt' 'all' '2' +insertsource 'unstable' 'apt2' 'all' '1' + +getoriginfromsuite() { echo 'Debian'; } +setupaptarchive + +APTARCHIVE=$(readlink -f ./aptarchive) + +testsuccessequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget upgrade -qq --print-uris +testsuccessequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget dist-upgrade -qq --print-uris +testsuccessequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget install apt -qq --print-uris +testsuccessequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 SHA256:0000000000000000000000000000000000000000000000000000000000000000" aptget download apt -qq --print-uris +testsuccessequal "'file://${APTARCHIVE}/apt_2.dsc' apt_2.dsc 9 SHA256:7776436a6d741497f1cd958014e1a05b352224231428152aae39da3c17fd2fd4 +'file://${APTARCHIVE}/apt_2.tar.gz' apt_2.tar.gz 12 SHA256:f57f565eabe3fde0ec6e6e0bcc8db1d86fe2b4d6344a380a23520ddbb7728e99" aptget source apt -qq --print-uris +testsuccessequal "'https://metadata.ftp-master.debian.org/changelogs/main/a/apt/apt_2_changelog' apt.changelog" aptget changelog apt -qq --print-uris + +testsuccessequal "'file://${APTARCHIVE}/apt_2.dsc' apt_2.dsc 9 SHA256:7776436a6d741497f1cd958014e1a05b352224231428152aae39da3c17fd2fd4 +'file://${APTARCHIVE}/apt_2.tar.gz' apt_2.tar.gz 12 SHA256:f57f565eabe3fde0ec6e6e0bcc8db1d86fe2b4d6344a380a23520ddbb7728e99 +'file://${APTARCHIVE}/apt2_1.dsc' apt2_1.dsc 10 SHA256:5693ba5efbfa21216f13661d344611aabe70ce3c343554ab46d4d9c24fdfd13a +'file://${APTARCHIVE}/apt2_1.tar.gz' apt2_1.tar.gz 13 SHA256:1464c609fd09934c270ec629020d5e248b080607f715e47ef088cc8ab8480541" aptget source apt apt2 -qq --print-uris diff --git a/test/integration/test-bug-723586-any-stripped-in-single-arch b/test/integration/test-bug-723586-any-stripped-in-single-arch new file mode 100755 index 0000000..38eb026 --- /dev/null +++ b/test/integration/test-bug-723586-any-stripped-in-single-arch @@ -0,0 +1,54 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'python3' 'all' '3.2.3-6' + +insertpackage 'unstable' 'python3' 'amd64' '3.3.2-16' 'Multi-Arch: allowed' +insertpackage 'stable' 'python3-gnupg' 'all' '0.3.5-2' 'Depends: python3:any (>= 3.2.3-3~)' + +insertpackage 'unstable' 'python-mips' 'amd64' '3' 'Depends: python3:mips' + +setupaptarchive + +INSTALLLOG='Reading package lists... +Building dependency tree... +The following additional packages will be installed: + python3 +The following NEW packages will be installed: + python3-gnupg +The following packages will be upgraded: + python3 +1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst python3 [3.2.3-6] (3.3.2-16 unstable [amd64]) +Inst python3-gnupg (0.3.5-2 stable [all]) +Conf python3 (3.3.2-16 unstable [amd64]) +Conf python3-gnupg (0.3.5-2 stable [all])' + +FAILLOG='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: + python-mips : Depends: python3:mips but it is not installable +E: Unable to correct problems, you have held broken packages.' + +testsuccessequal "$INSTALLLOG" aptget install python3-gnupg -s +aptcache showpkg python3 > showpkg.log +testfailureequal "$FAILLOG" aptget install python-mips -s + +# same test, but this time in a multi-arch environment +configarchitecture 'amd64' 'armhf' +rm rootdir/var/cache/apt/*.bin + +testsuccessequal "$INSTALLLOG" aptget install python3-gnupg -s +testsuccessequal "$(cat showpkg.log)" aptcache showpkg python3 +testfailureequal "$FAILLOG" aptget install python-mips -s diff --git a/test/integration/test-bug-723705-tagfile-truncates-fields b/test/integration/test-bug-723705-tagfile-truncates-fields new file mode 100755 index 0000000..bfa3598 --- /dev/null +++ b/test/integration/test-bug-723705-tagfile-truncates-fields @@ -0,0 +1,33 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +setupaptarchive + +aptget install --print-uris -y cdebconf-newt-terminal cdebconf-gtk-terminal 2>&1 | sed "s#file://${TMPWORKINGDIRECTORY}#file:///tmp#g" > filename.log + +testfileequal filename.log "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cdebconf-gtk-udeb cdebconf-newt-udeb cdebconf-udeb libc6-udeb + libglib2.0-udeb libgtk2.0-0-udeb libvte9-udeb +The following NEW packages will be installed: + cdebconf-gtk-terminal cdebconf-gtk-udeb cdebconf-newt-terminal + cdebconf-newt-udeb cdebconf-udeb libc6-udeb libglib2.0-udeb libgtk2.0-0-udeb + libvte9-udeb +0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/4774 kB of archives. +After this operation, 19.8 MB of additional disk space will be used. +'file:///tmp/aptarchive/pool/main/c/cdebconf/cdebconf-udeb_0.185_amd64.udeb' cdebconf-udeb_0.185_amd64.udeb 77376 MD5Sum:e3883706fdbf54c2e5ea959c92b2d37f +'file:///tmp/aptarchive/pool/main/c/cdebconf/cdebconf-gtk-udeb_0.185_amd64.udeb' cdebconf-gtk-udeb_0.185_amd64.udeb 27278 MD5Sum:a1bbbc1d4fb8e0615b5621abac021924 +'file:///tmp/aptarchive/pool/main/c/cdebconf/cdebconf-newt-udeb_0.185_amd64.udeb' cdebconf-newt-udeb_0.185_amd64.udeb 19192 MD5Sum:de27807f56dae2f2403b3322d5fe6bd2 +'file:///tmp/aptarchive/pool/main/g/glib2.0/libglib2.0-udeb_2.36.4-1_amd64.udeb' libglib2.0-udeb_2.36.4-1_amd64.udeb 1714604 MD5Sum:72da029f1bbb36057d874f1f82a5d00a +'file:///tmp/aptarchive/pool/main/e/eglibc/libc6-udeb_2.17-92+b1_amd64.udeb' libc6-udeb_2.17-92+b1_amd64.udeb 1056000 MD5Sum:7fd7032eeeecf7f76eff79a0543fbd72 +'file:///tmp/aptarchive/pool/main/g/gtk+2.0/libgtk2.0-0-udeb_2.24.20-1_amd64.udeb' libgtk2.0-0-udeb_2.24.20-1_amd64.udeb 1643046 MD5Sum:25513478eb2e02e5766c0eea0b411ca9 +'file:///tmp/aptarchive/pool/main/v/vte/libvte9-udeb_0.28.2-5_amd64.udeb' libvte9-udeb_1%3a0.28.2-5_amd64.udeb 216968 MD5Sum:7da7201effaf5ced19abd9d0b45aa2c6 +'file:///tmp/aptarchive/pool/main/c/cdebconf-terminal/cdebconf-gtk-terminal_0.22_amd64.udeb' cdebconf-gtk-terminal_0.22_amd64.udeb 14734 MD5Sum:f9c3a7354560cb88e0396e2b7ba54363 +'file:///tmp/aptarchive/pool/main/c/cdebconf-terminal/cdebconf-newt-terminal_0.22_amd64.udeb' cdebconf-newt-terminal_0.22_amd64.udeb 4538 MD5Sum:20db6152fce5081fcbf49c7c08f21246" diff --git a/test/integration/test-bug-728500-tempdir b/test/integration/test-bug-728500-tempdir new file mode 100755 index 0000000..37661d1 --- /dev/null +++ b/test/integration/test-bug-728500-tempdir @@ -0,0 +1,23 @@ +#!/bin/sh + +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'coolstuff' 'all' '1.0' + +setupaptarchive +changetowebserver + +msgtest 'Test apt-get update with incorrect' 'TMPDIR' + +export TMPDIR=/does-not-exists +testsuccess aptget update -o Debug::Acquire::gpg=1 +unset TMPDIR + +testsuccessequal 'coolstuff +dpkg' aptcache pkgnames +testsuccess ls rootdir/var/lib/apt/lists/*InRelease diff --git a/test/integration/test-bug-732746-preferences b/test/integration/test-bug-732746-preferences new file mode 100755 index 0000000..d3bbdad --- /dev/null +++ b/test/integration/test-bug-732746-preferences @@ -0,0 +1,32 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertinstalledpackage 'bar' 'i386' '1.0' + +cat > rootdir/etc/apt/preferences << EOF +# random test comment header + +# commented out by puppy^Wpuppet +#Package: foo +#Pin: origin "ftp.debian.org" +#Pin: 800 + +Package: bar +Pin: version 1.0 +Pin-Priority: 700 + +#Package: bar +#Pin: version 1.0 +#Pin: 800 +EOF + +testsuccessequal "Reading package lists... +Building dependency tree..." aptget check + +msgtest "Ensure policy is applied" +aptcache policy bar|grep -q "*** 1.0 700" && msgpass || msgfail diff --git a/test/integration/test-bug-733028-gpg-resource-limit b/test/integration/test-bug-733028-gpg-resource-limit new file mode 100755 index 0000000..69baf4e --- /dev/null +++ b/test/integration/test-bug-733028-gpg-resource-limit @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'foobar' 'all' '1' + +setupaptarchive --no-update + +for i in $(seq 1 50); do + touch rootdir/etc/apt/trusted.gpg.d/emptykey-${i}.gpg +done +testaptkeys 'Joe Sixpack' + +testsuccess aptget update +msgtest 'Test for no gpg errors/warnings in' 'apt-get update' +if grep -iq 'GPG' rootdir/tmp/testsuccess.output; then + cat rootdir/tmp/testsuccess.output + msgfail +else + msgpass +fi diff --git a/test/integration/test-bug-734922-apt-showsrc-duplicate b/test/integration/test-bug-734922-apt-showsrc-duplicate new file mode 100755 index 0000000..d4370e2 --- /dev/null +++ b/test/integration/test-bug-734922-apt-showsrc-duplicate @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +# foo is identical, show it only once in showsrc +insertpackage "unstable" "foo" "i386" "1.0" +insertpackage "testing" "foo" "i386" "1.0" +insertsource "unstable" "foo" "i386" "1.0" +insertsource "testing" "foo" "i386" "1.0" + +# bar is different, show twice +insertsource "unstable" "bar" "i386" "1.0" +insertsource "testing" "bar" "i386" "2.0" + +setupaptarchive + +# ensure "foo" is not shown twice +aptcache showsrc foo bar|grep ^Package: > out.txt +testequal "Package: foo +Package: bar +Package: bar" cat out.txt diff --git a/test/integration/test-bug-735967-lib32-to-i386-unavailable b/test/integration/test-bug-735967-lib32-to-i386-unavailable new file mode 100755 index 0000000..3b705d5 --- /dev/null +++ b/test/integration/test-bug-735967-lib32-to-i386-unavailable @@ -0,0 +1,91 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' 'amd64' + +insertpackage 'unstable' 'lib32nss-mdns' 'amd64' '0.10-6' 'Depends: libnss-mdns-i386 (= 0.10-6)' +insertpackage 'unstable' 'libnss-mdns' 'amd64,i386' '0.10-6' 'Multi-Arch: same +Breaks: lib32nss-mdns (<< 0.10-6)' +insertpackage 'unstable' 'libnss-mdns-i386' 'i386' '0.10-6' 'Multi-Arch: foreign +Depends: libnss-mdns' +# introduce some dummies so that there are versions, but none works +insertpackage 'unstable' 'libnss-mdns-i386' 'amd64' '0.1-6' +insertpackage 'experimental' 'libnss-mdns-amd64' 'i386,amd64' '0.10-6' 'Provides: libnss-mdns-i386' + +insertpackage 'unstable' 'foo' 'amd64' '1' 'Depends: libfoo' +insertpackage 'unstable' 'libfoo' 'amd64' '1' 'Depends: libfoo-bin' +insertpackage 'unstable' 'libfoo-bin' 'i386' '0.10-6' 'Multi-Arch: foreign' + +insertinstalledpackage 'lib32nss-mdns' 'amd64' '0.9-1' +insertinstalledpackage 'libnss-mdns' 'amd64' '0.9-1' + +insertinstalledpackage 'i-make-packages-important' 'all' '1' 'Depends: libnss-mdns' + +setupaptarchive --no-update + +# make libnss-mdns-i386 unavailable +configarchitecture 'amd64' +testsuccess aptget update + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + lib32nss-mdns +The following packages will be upgraded: + libnss-mdns +1 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv lib32nss-mdns [0.9-1] +Inst libnss-mdns [0.9-1] (0.10-6 unstable [amd64]) +Conf libnss-mdns (0.10-6 unstable [amd64])' aptget dist-upgrade -s + +testfailureequal '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 : Depends: libfoo but it is not going to be installed +E: Unable to correct problems, you have held broken packages.' aptget install foo -s + +# activate multiarch +configarchitecture 'amd64' 'i386' +testsuccess aptget update + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + libnss-mdns:i386 libnss-mdns-i386:i386 +The following packages will be upgraded: + lib32nss-mdns libnss-mdns +2 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst lib32nss-mdns [0.9-1] (0.10-6 unstable [amd64]) [] +Inst libnss-mdns [0.9-1] (0.10-6 unstable [amd64]) [] +Inst libnss-mdns:i386 (0.10-6 unstable [i386]) [] +Inst libnss-mdns-i386:i386 (0.10-6 unstable [i386]) +Conf lib32nss-mdns (0.10-6 unstable [amd64]) +Conf libnss-mdns (0.10-6 unstable [amd64]) +Conf libnss-mdns:i386 (0.10-6 unstable [i386]) +Conf libnss-mdns-i386:i386 (0.10-6 unstable [i386])' aptget dist-upgrade -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libfoo libfoo-bin:i386 +The following NEW packages will be installed: + foo libfoo libfoo-bin:i386 +0 upgraded, 3 newly installed, 0 to remove and 2 not upgraded. +Inst libfoo-bin:i386 (0.10-6 unstable [i386]) +Inst libfoo (1 unstable [amd64]) +Inst foo (1 unstable [amd64]) +Conf libfoo-bin:i386 (0.10-6 unstable [i386]) +Conf libfoo (1 unstable [amd64]) +Conf foo (1 unstable [amd64])' aptget install foo -s diff --git a/test/integration/test-bug-737130-multicompress-file-modes b/test/integration/test-bug-737130-multicompress-file-modes new file mode 100755 index 0000000..2ae5166 --- /dev/null +++ b/test/integration/test-bug-737130-multicompress-file-modes @@ -0,0 +1,30 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +cat >aptarchive/ftparchive.conf <<EOF +Dir { ArchiveDir "$(pwd)/aptarchive"; CacheDir "$(pwd)/aptarchive"; }; +Default { Translation::Compress ". gzip bzip2 xz"; FileMode 0644; }; +tree "dists/sid" { + Sections "main"; + Architectures "i386"; + LongDescription "false"; +}; +EOF +mkdir -p aptarchive/dists/sid/main/binary-i386 +mkdir -p aptarchive/dists/sid/main/i18n +testsuccess aptftparchive generate aptarchive/ftparchive.conf +i18n=aptarchive/dists/sid/main/i18n +for comp in '' .gz .bz2 .xz; do + msgtest 'Test apt-ftparchive file mode is 644 for' "Translation-en$comp" + FILEMODE="$(stat --format %a "$i18n/Translation-en$comp")" + if [ "$FILEMODE" != '644' ]; then + msgfail "Mode was '$FILEMODE'!" + else + msgpass + fi +done diff --git a/test/integration/test-bug-738785-switch-protocol b/test/integration/test-bug-738785-switch-protocol new file mode 100755 index 0000000..471d12e --- /dev/null +++ b/test/integration/test-bug-738785-switch-protocol @@ -0,0 +1,50 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +buildsimplenativepackage 'apt' 'all' '1.0' 'stable' + +# setup http redirecting to https +getlabelfromsuite() { echo 'Testcases'; } +setupaptarchive --no-update +changetohttpswebserver -o 'aptwebserver::support::http=false' +webserverconfig 'aptwebserver::redirect::replace::/downgrademe/' "http://localhost:${APTHTTPPORT}/" +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "https://localhost:${APTHTTPSPORT}/" +sed -i -e "s#:${APTHTTPSPORT}/#:${APTHTTPPORT}/redirectme#" -e 's# https:# http:#' rootdir/etc/apt/sources.list.d/* + +testsuccess aptget update -o Debug::Acquire::http=1 -o Debug::Acquire::https=1 -o Debug::pkgAcquire::Worker=1 + +msgtest 'Test that the webserver does not answer' 'http requests' +downloadfile "http://localhost:${APTHTTPPORT}/pool/main/a/apt/apt_1.0/changelog" changelog >/dev/null 2>&1 && msgfail || msgpass + +echo "Acquire::Changelogs::URI::Label::Testcases \"http://localhost:${APTHTTPPORT}/redirectme/pool/@CHANGEPATH@/changelog\";" > rootdir/etc/apt/apt.conf.d/changelog.conf +testsuccessequal "'http://localhost:${APTHTTPPORT}/redirectme/pool/main/a/apt/apt_1.0/changelog' apt.changelog" aptget changelog apt --print-uris + +cd downloaded +testsuccess aptget changelog apt -d +testsuccess test -s apt.changelog +rm -f apt.changelog + +testsuccess aptget download apt +testsuccess test -s apt_1.0_all.deb +rm apt_1.0_all.deb +cd - >/dev/null + +testsuccess aptget install apt -y +testdpkginstalled 'apt' + +cd downloaded +testfailureequal "E: The method 'https' is explicitly disabled via configuration. +N: If you meant to use Tor remember to use tor+https instead of https." aptget download apt -o Dir::Bin::Methods::https=false +testfailure test -e apt_1.0_all.deb +cd - >/dev/null + +# check that downgrades from https to http are not allowed +webserverconfig 'aptwebserver::support::http' 'true' +sed -i -e "s#:${APTHTTPPORT}/redirectme#:${APTHTTPSPORT}/downgrademe#" -e 's# http:# https:#' rootdir/etc/apt/sources.list.d/* +testfailure aptget update --allow-insecure-repositories -o Acquire::https::Timeout=1 -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::https=1 diff --git a/test/integration/test-bug-740843-versioned-up-down-breaks b/test/integration/test-bug-740843-versioned-up-down-breaks new file mode 100755 index 0000000..69adcef --- /dev/null +++ b/test/integration/test-bug-740843-versioned-up-down-breaks @@ -0,0 +1,57 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'foo-driver' 'amd64' '1' 'Depends: libfoo (= 1) +Recommends: libgl1-foo-glx (= 1) +Breaks: libgl1-foo-glx (<< 1), libgl1-foo-glx (>> 1)' +insertinstalledpackage 'libgl1-foo-glx' 'amd64,i386' '1' 'Depends: libfoo (= 1) +Multi-Arch: same' +insertinstalledpackage 'libfoo' 'amd64,i386' '1' 'Multi-Arch: same' + +buildsimplenativepackage 'foo-driver' 'amd64' '2' 'stable' 'Depends: libfoo (= 2) +Recommends: libgl1-foo-glx (= 2) +Breaks: libgl1-foo-glx (<< 2), libgl1-foo-glx (>> 2)' +buildsimplenativepackage 'libgl1-foo-glx' 'amd64,i386' '2' 'stable' 'Depends: libfoo (= 2) +Multi-Arch: same' +buildsimplenativepackage 'libfoo' 'amd64,i386' '2' 'stable' 'Multi-Arch: same' + +setupaptarchive + +testequalor2 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + foo-driver libfoo libfoo:i386 libgl1-foo-glx libgl1-foo-glx:i386 +5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst libgl1-foo-glx [1] (2 stable [amd64]) [libgl1-foo-glx:amd64 on libgl1-foo-glx:i386] [libgl1-foo-glx:i386 on libgl1-foo-glx:amd64] [foo-driver:amd64 on libgl1-foo-glx:amd64] [libgl1-foo-glx:i386 foo-driver:amd64 ] +Inst libgl1-foo-glx:i386 [1] (2 stable [i386]) [foo-driver:amd64 on libgl1-foo-glx:amd64] [foo-driver:amd64 on libgl1-foo-glx:i386] [foo-driver:amd64 ] +Inst foo-driver [1] (2 stable [amd64]) [] +Inst libfoo:i386 [1] (2 stable [i386]) [libfoo:amd64 on libfoo:i386] [libfoo:i386 on libfoo:amd64] [libfoo:amd64 ] +Inst libfoo [1] (2 stable [amd64]) +Conf libgl1-foo-glx (2 stable [amd64]) +Conf libgl1-foo-glx:i386 (2 stable [i386]) +Conf foo-driver (2 stable [amd64]) +Conf libfoo:i386 (2 stable [i386]) +Conf libfoo (2 stable [amd64])' 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + foo-driver libfoo libfoo:i386 libgl1-foo-glx libgl1-foo-glx:i386 +5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst libgl1-foo-glx [1] (2 stable [amd64]) [foo-driver:amd64 on libgl1-foo-glx:amd64] [libgl1-foo-glx:amd64 on libgl1-foo-glx:i386] [libgl1-foo-glx:i386 on libgl1-foo-glx:amd64] [foo-driver:amd64 libgl1-foo-glx:i386 ] +Inst libgl1-foo-glx:i386 [1] (2 stable [i386]) [foo-driver:amd64 on libgl1-foo-glx:amd64] [foo-driver:amd64 on libgl1-foo-glx:i386] [foo-driver:amd64 ] +Inst foo-driver [1] (2 stable [amd64]) [] +Inst libfoo:i386 [1] (2 stable [i386]) [libfoo:amd64 on libfoo:i386] [libfoo:i386 on libfoo:amd64] [libfoo:amd64 ] +Inst libfoo [1] (2 stable [amd64]) +Conf libgl1-foo-glx (2 stable [amd64]) +Conf libgl1-foo-glx:i386 (2 stable [i386]) +Conf foo-driver (2 stable [amd64]) +Conf libfoo:i386 (2 stable [i386]) +Conf libfoo (2 stable [amd64])' aptget dist-upgrade -s + +testsuccess aptget dist-upgrade -y -o Debug::pkgPackageManager=1 -o Debug::pkgOrderList=1 diff --git a/test/integration/test-bug-745036-new-foreign-invalidates-cache b/test/integration/test-bug-745036-new-foreign-invalidates-cache new file mode 100755 index 0000000..6207bad --- /dev/null +++ b/test/integration/test-bug-745036-new-foreign-invalidates-cache @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable,installed' 'cool-foo' 'amd64' '1.0' 'Depends: foo' +insertpackage 'unstable,installed' 'foo' 'amd64' '1.0' 'Multi-Arch: foreign' + +setupaptarchive + +testsuccess aptget check -s + +configarchitecture 'amd64' 'i386' +testfailureequal 'E: The package cache was built for different architectures: amd64 vs amd64,i386' aptget check -s -o pkgCacheFile::Generate=false + +testsuccess aptget check -s + +insertinstalledpackage 'awesome-foo' 'i386' '1.0' 'Depends: foo' + +testsuccess aptget check -s + +testsuccess aptget update --no-download + +testsuccess aptget check -s diff --git a/test/integration/test-bug-745046-candidate-propagation-fails b/test/integration/test-bug-745046-candidate-propagation-fails new file mode 100755 index 0000000..64aaa6a --- /dev/null +++ b/test/integration/test-bug-745046-candidate-propagation-fails @@ -0,0 +1,39 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'gedit' 'amd64' '1' + +insertpackage 'unstable' 'gedit' 'amd64' '1' +insertpackage 'experimental' 'gedit' 'amd64' '2' 'Depends: common (>= 2)' + +setupaptarchive + +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2' (experimental [amd64]) for 'gedit' +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: + gedit : Depends: common (>= 2) but it is not installable +E: Unable to correct problems, you have held broken packages." aptget install gedit/experimental -sq=0 + +insertinstalledpackage 'common' 'amd64' '2' + +testsuccessequal "Reading package lists... +Building dependency tree... +Selected version '2' (experimental [amd64]) for 'gedit' +The following packages will be upgraded: + gedit +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst gedit [1] (2 experimental [amd64]) +Conf gedit (2 experimental [amd64])" aptget install gedit/experimental -sq=0 diff --git a/test/integration/test-bug-747261-arch-specific-conflicts b/test/integration/test-bug-747261-arch-specific-conflicts new file mode 100755 index 0000000..e137043 --- /dev/null +++ b/test/integration/test-bug-747261-arch-specific-conflicts @@ -0,0 +1,46 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'sparc' 'armel' + +insertinstalledpackage 'foobar' 'armel' '1' +msgtest 'Check that dpkg supports' 'arch-specific dependencies' +if ! dpkgcheckbuilddeps -d 'foobar:armel' /dev/null 2>/dev/null >/dev/null; then + dpkgcheckbuilddeps -d 'foobar:armel' /dev/null || true + msgskip + exit 0 +else + msgpass +fi + +buildsimplenativepackage 'libc6' 'amd64,sparc,armel' '1' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'libc6-i386' 'amd64' '1' 'stable' 'Conflicts: libc6:sparc' + +setupaptarchive + +testsuccess aptget install 'libc6:amd64' 'libc6:sparc' -y +testdpkginstalled 'libc6:amd64' 'libc6:sparc' +testdpkgnotinstalled 'libc6-i386' 'libc6:armel' + +testsuccess aptget install libc6-i386 -y +testdpkginstalled 'libc6:amd64' 'libc6-i386' +testdpkgnotinstalled 'libc6:sparc' 'libc6:armel' + +testsuccess aptget install libc6:armel -y +testdpkginstalled 'libc6:amd64' 'libc6:armel' 'libc6-i386' +testdpkgnotinstalled 'libc6:sparc' + +testsuccess aptget install libc6:sparc -y +testdpkginstalled 'libc6:amd64' 'libc6:armel' 'libc6:sparc' +testdpkgnotinstalled 'libc6-i386' + +testsuccess aptget purge 'libc6:*' 'libc6-i386' -y +testdpkgnotinstalled 'libc6:amd64' 'libc6:armel' 'libc6:sparc' 'libc6-i386' + +# check that (the actually simpler) single arch is fine, too +configarchitecture 'amd64' +testfailure aptget install libc6:sparc -s +testsuccess aptget install libc6 libc6-i386 -y diff --git a/test/integration/test-bug-753297-upgradable b/test/integration/test-bug-753297-upgradable new file mode 100755 index 0000000..353728d --- /dev/null +++ b/test/integration/test-bug-753297-upgradable @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +cat > rootdir/etc/apt/preferences <<EOF +Package: * +Pin: release testing +Pin-Priority: 600 + +Package: * +Pin: release unstable +Pin-Priority: 1 +EOF + +insertpackage 'testing,installed' 'foo' 'all' '1' +insertpackage 'testing-updates' 'foo' 'all' '2' +insertpackage 'unstable' 'foo' 'all' '3' + +insertinstalledpackage 'bar' 'all' '1' +insertpackage 'testing' 'bar' 'all' '2' + +setupaptarchive + +testsuccessequal "Listing... +bar/testing 2 all [upgradable from: 1] +N: There is 1 additional version. Please use the '-a' switch to see it" apt list --upgradable + +testsuccessequal "Listing... +bar/testing 2 all [upgradable from: 1] +dpkg/now 1.16.2+fake all [installed,local] +foo/testing,now 1 all [installed]" apt list diff --git a/test/integration/test-bug-758153-versioned-provides-support b/test/integration/test-bug-758153-versioned-provides-support new file mode 100755 index 0000000..fb8ed39 --- /dev/null +++ b/test/integration/test-bug-758153-versioned-provides-support @@ -0,0 +1,387 @@ +#!/bin/sh +set -e + +# dpkg implements versioned provides in commit 5bb02fe80e9f40dcad9703a72f67cf615ff217b5 +# but previous versions seem to allow parsing, working and ignoring it. + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'webapp' 'all' '1' 'Depends: httpd' +insertinstalledpackage 'webserver' 'all' '1' 'Provides: httpd' + +insertpackage 'unstable' 'webapp' 'all' '2' 'Depends: httpd (>= 2)' +insertpackage 'unstable' 'webserver' 'amd64' '2' 'Provides: httpd (= 2)' +insertpackage 'unstable' 'foreign-webserver' 'i386' '2' 'Multi-Arch: foreign +Provides: httpd (= 2)' + +insertpackage 'experimental' 'webapp' 'all' '3' 'Depends: httpd (>= 1.5)' +insertpackage 'experimental' 'webserver' 'amd64' '3' 'Provides: httpd (= 3)' + +insertpackage 'experimental' 'foreign-webserver' 'i386' '4' 'Multi-Arch: foreign +Provides: httpd (= 4)' +insertpackage 'experimental' 'cool-webapp' 'all' '4' 'Depends: httpd (>= 4)' + +# arch-qualified provides, see #777071 +insertpackage 'unstable' 'foo' 'all' '1' 'Provides: bar:i386' +insertpackage 'unstable' 'baz' 'i386,amd64' '1' 'Depends: bar' +insertpackage 'experimental' 'baz' 'i386,amd64' '2' 'Depends: bar:i386' +insertpackage 'experimental' 'baz-broken' 'i386' '2' 'Depends: bar:amd64' + +insertpackage 'unstable' 'next' 'amd64' '1' 'Multi-Arch: foreign +Provides: next (= 2)' +insertpackage 'unstable' 'needsrealnext' 'amd64,i386' '2' 'Depends: next (>= 2)' + +insertpackage 'unstable' 'virtualnext2' 'amd64' '1' 'Multi-Arch: foreign +Provides: next2 (= 2)' +insertpackage 'unstable' 'needsnext2' 'amd64,i386' '2' 'Depends: next2 (>= 2)' + +insertpackage 'unstable' 'virtualnext3' 'amd64' '1' 'Multi-Arch: no +Provides: next3 (= 2)' +insertpackage 'unstable' 'needsnext3' 'amd64,i386' '2' 'Depends: next3 (>= 2)' + +insertpackage 'unstable' 'selfprov' 'amd64' '2' 'Provides: selfprov (= 1)' +insertpackage 'unstable' 'needsselfprov1' 'amd64' '1' 'Depends: selfprov (= 1)' +insertpackage 'unstable' 'needsselfprov2' 'amd64' '1' 'Depends: selfprov (= 2)' +insertpackage 'unstable' 'needsselfprov12' 'amd64' '1' 'Depends: selfprov (= 1), selfprov (= 2)' +insertpackage 'unstable' 'needsselfprov123' 'amd64' '1' 'Depends: selfprov (= 1), selfprov (= 2), selfprov (= 3)' + +setupaptarchive + +SOMEPACKAGESCOULDNOT='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:' + +for binary in 'aptget' 'apt'; do + for method in 'upgrade' 'dist-upgrade'; do + for solver in 'internal' 'apt'; do + if [ "$solver" = 'apt' ]; then + HEADER='Execute external solver...' + else + HEADER='Calculating upgrade...' + fi + testsuccessequal "Reading package lists... +Building dependency tree... +$HEADER +The following packages will be upgraded: + webapp webserver +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst webserver [1] (2 unstable [amd64]) +Inst webapp [1] (2 unstable [all]) +Conf webserver (2 unstable [amd64]) +Conf webapp (2 unstable [all])" $binary $method -s --solver $solver + done + done +done + +for solver in 'internal' 'apt'; do + msgmsg 'Testing with solver' "$solver" + HEADER_PRE='Reading package lists... +Building dependency tree...' + HEADER_POST='Execute external solver...' + HEADER="${HEADER_PRE}" + if [ "$solver" = 'apt' ]; then + HEADER="${HEADER} +${HEADER_POST}" + fi + testsuccessequal "$HEADER +The following packages will be upgraded: + webapp webserver +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst webserver [1] (2 unstable [amd64]) +Inst webapp [1] (2 unstable [all]) +Conf webserver (2 unstable [amd64]) +Conf webapp (2 unstable [all])" aptget install webapp webserver -s --solver $solver + + testsuccessequal "$HEADER +The following packages will be upgraded: + webapp webserver +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst webserver [1] (2 unstable [amd64]) +Inst webapp [1] (3 experimental [all]) +Conf webserver (2 unstable [amd64]) +Conf webapp (3 experimental [all])" aptget install webapp=3 webserver -s --solver $solver + + testsuccessequal "$HEADER +The following packages will be upgraded: + webapp webserver +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst webserver [1] (3 experimental [amd64]) +Inst webapp [1] (2 unstable [all]) +Conf webserver (3 experimental [amd64]) +Conf webapp (2 unstable [all])" aptget install webapp webserver=3 -s --solver $solver + + testsuccessequal "$HEADER +The following NEW packages will be installed: + foreign-webserver:i386 +The following packages will be upgraded: + webapp +1 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst foreign-webserver:i386 (2 unstable [i386]) +Inst webapp [1] (2 unstable [all]) +Conf foreign-webserver:i386 (2 unstable [i386]) +Conf webapp (2 unstable [all])" aptget install webapp foreign-webserver:i386 -s --solver $solver + + testsuccessequal "$HEADER +The following NEW packages will be installed: + foreign-webserver:i386 +The following packages will be upgraded: + webapp +1 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst foreign-webserver:i386 (2 unstable [i386]) +Inst webapp [1] (3 experimental [all]) +Conf foreign-webserver:i386 (2 unstable [i386]) +Conf webapp (3 experimental [all])" aptget install webapp=3 foreign-webserver:i386 -s --solver $solver + + testsuccessequal "$HEADER +The following NEW packages will be installed: + foreign-webserver:i386 +The following packages will be upgraded: + webapp +1 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst foreign-webserver:i386 (4 experimental [i386]) +Inst webapp [1] (2 unstable [all]) +Conf foreign-webserver:i386 (4 experimental [i386]) +Conf webapp (2 unstable [all])" aptget install webapp foreign-webserver:i386=4 -s --solver $solver + + if [ "$solver" = 'apt' ]; then + WEBAPP_ERR="$HEADER +The solver encountered an error of type: ERR_UNSOLVABLE +The following information might help you to understand what is wrong: +The following packages have unmet dependencies: + cool-webapp : Depends: httpd (>= 4) + +$SOMEPACKAGESCOULDNOT + cool-webapp : Depends: httpd (>= 4) +E: External solver failed with: The following packages have unmet dependencies:" + else + WEBAPP_ERR="$HEADER +$SOMEPACKAGESCOULDNOT + cool-webapp : Depends: httpd (>= 4) +E: Unable to correct problems, you have held broken packages." + fi + testfailureequal "$WEBAPP_ERR" aptget install cool-webapp -s --solver $solver + testfailureequal "$WEBAPP_ERR" aptget install cool-webapp foreign-webserver:i386 -s --solver $solver + + testsuccessequal "$HEADER +The following NEW packages will be installed: + cool-webapp foreign-webserver:i386 +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst foreign-webserver:i386 (4 experimental [i386]) +Inst cool-webapp (4 experimental [all]) +Conf foreign-webserver:i386 (4 experimental [i386]) +Conf cool-webapp (4 experimental [all])" aptget install cool-webapp foreign-webserver:i386=4 -s --solver $solver + + testsuccessequal "$HEADER +The following additional packages will be installed: + foo +The following NEW packages will be installed: + baz:i386 foo +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst foo (1 unstable [all]) +Inst baz:i386 (1 unstable [i386]) +Conf foo (1 unstable [all]) +Conf baz:i386 (1 unstable [i386])" aptget install baz:i386 -s --solver $solver + + if [ "$solver" = 'apt' ]; then + testfailureequal "$HEADER +The solver encountered an error of type: ERR_UNSOLVABLE +The following information might help you to understand what is wrong: +The following packages have unmet dependencies: + baz : Depends: bar but it is not installable + +$SOMEPACKAGESCOULDNOT + baz : Depends: bar but it is not installable +E: External solver failed with: The following packages have unmet dependencies:" aptget install baz:amd64 -s --solver $solver + else + testfailureequal "$HEADER +$SOMEPACKAGESCOULDNOT + baz : Depends: bar but it is not installable +E: Unable to correct problems, you have held broken packages." aptget install baz:amd64 -s --solver $solver + fi + + HEADER="${HEADER_PRE} +Selected version '2' (experimental [amd64]) for 'baz'" + if [ "$solver" = 'apt' ]; then + HEADER="${HEADER} +${HEADER_POST}" + fi + testsuccessequal "$HEADER +The following additional packages will be installed: + foo +The following NEW packages will be installed: + baz foo +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst foo (1 unstable [all]) +Inst baz (2 experimental [amd64]) +Conf foo (1 unstable [all]) +Conf baz (2 experimental [amd64])" aptget install baz/experimental -s --solver $solver + + HEADER="${HEADER_PRE} +Selected version '2' (experimental [i386]) for 'baz:i386'" + if [ "$solver" = 'apt' ]; then + HEADER="${HEADER} +${HEADER_POST}" + fi + testsuccessequal "$HEADER +The following additional packages will be installed: + foo +The following NEW packages will be installed: + baz:i386 foo +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst foo (1 unstable [all]) +Inst baz:i386 (2 experimental [i386]) +Conf foo (1 unstable [all]) +Conf baz:i386 (2 experimental [i386])" aptget install baz:i386/experimental -s --solver $solver + + if [ "$solver" = 'apt' ]; then + HEADER="${HEADER_PRE} +${HEADER_POST}" + else + HEADER="${HEADER_PRE}" + fi + + if [ "$solver" = 'apt' ]; then + testfailureequal "$HEADER +The solver encountered an error of type: ERR_UNSOLVABLE +The following information might help you to understand what is wrong: +The following packages have unmet dependencies: + baz-broken:i386 : Depends: bar:amd64 but it is not installable + +$SOMEPACKAGESCOULDNOT + baz-broken:i386 : Depends: bar:amd64 but it is not installable +E: External solver failed with: The following packages have unmet dependencies:" aptget install baz-broken -s --solver $solver + else + testfailureequal "$HEADER +$SOMEPACKAGESCOULDNOT + baz-broken:i386 : Depends: bar:amd64 but it is not installable +E: Unable to correct problems, you have held broken packages." aptget install baz-broken -s --solver $solver + fi + + testsuccessequal "$HEADER +The following additional packages will be installed: + next +The following NEW packages will be installed: + needsrealnext next +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst next (1 unstable [amd64]) +Inst needsrealnext (2 unstable [amd64]) +Conf next (1 unstable [amd64]) +Conf needsrealnext (2 unstable [amd64])" aptget install needsrealnext -s --solver $solver + + testsuccessequal "$HEADER +The following additional packages will be installed: + next +The following NEW packages will be installed: + needsrealnext:i386 next +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst next (1 unstable [amd64]) +Inst needsrealnext:i386 (2 unstable [i386]) +Conf next (1 unstable [amd64]) +Conf needsrealnext:i386 (2 unstable [i386])" aptget install needsrealnext:i386 -s --solver $solver + + testsuccessequal "$HEADER +The following additional packages will be installed: + virtualnext2 +The following NEW packages will be installed: + needsnext2 virtualnext2 +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst virtualnext2 (1 unstable [amd64]) +Inst needsnext2 (2 unstable [amd64]) +Conf virtualnext2 (1 unstable [amd64]) +Conf needsnext2 (2 unstable [amd64])" aptget install needsnext2 -s --solver $solver + + testsuccessequal "$HEADER +The following additional packages will be installed: + virtualnext2 +The following NEW packages will be installed: + needsnext2:i386 virtualnext2 +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst virtualnext2 (1 unstable [amd64]) +Inst needsnext2:i386 (2 unstable [i386]) +Conf virtualnext2 (1 unstable [amd64]) +Conf needsnext2:i386 (2 unstable [i386])" aptget install needsnext2:i386 -s --solver $solver + + testsuccessequal "$HEADER +The following additional packages will be installed: + virtualnext3 +The following NEW packages will be installed: + needsnext3 virtualnext3 +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst virtualnext3 (1 unstable [amd64]) +Inst needsnext3 (2 unstable [amd64]) +Conf virtualnext3 (1 unstable [amd64]) +Conf needsnext3 (2 unstable [amd64])" aptget install needsnext3 -s --solver $solver + + if [ "$solver" = 'apt' ]; then + testfailureequal "$HEADER +The solver encountered an error of type: ERR_UNSOLVABLE +The following information might help you to understand what is wrong: +The following packages have unmet dependencies: + needsnext3:i386 : Depends: next3:i386 (>= 2) but it is not installable + +$SOMEPACKAGESCOULDNOT + needsnext3:i386 : Depends: next3:i386 (>= 2) but it is not installable +E: External solver failed with: The following packages have unmet dependencies:" aptget install needsnext3:i386 -s --solver $solver + else + testfailureequal "$HEADER +$SOMEPACKAGESCOULDNOT + needsnext3:i386 : Depends: next3:i386 (>= 2) but it is not installable +E: Unable to correct problems, you have held broken packages." aptget install needsnext3:i386 -s --solver $solver + fi + + testsuccessequal "$HEADER +The following additional packages will be installed: + selfprov +The following NEW packages will be installed: + needsselfprov1 selfprov +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst selfprov (2 unstable [amd64]) +Inst needsselfprov1 (1 unstable [amd64]) +Conf selfprov (2 unstable [amd64]) +Conf needsselfprov1 (1 unstable [amd64])" aptget install needsselfprov1 -s --solver $solver + testsuccessequal "$HEADER +The following additional packages will be installed: + selfprov +The following NEW packages will be installed: + needsselfprov2 selfprov +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst selfprov (2 unstable [amd64]) +Inst needsselfprov2 (1 unstable [amd64]) +Conf selfprov (2 unstable [amd64]) +Conf needsselfprov2 (1 unstable [amd64])" aptget install needsselfprov2 -s --solver $solver + testsuccessequal "$HEADER +The following additional packages will be installed: + selfprov +The following NEW packages will be installed: + needsselfprov12 selfprov +0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst selfprov (2 unstable [amd64]) +Inst needsselfprov12 (1 unstable [amd64]) +Conf selfprov (2 unstable [amd64]) +Conf needsselfprov12 (1 unstable [amd64])" aptget install needsselfprov12 -s --solver $solver + if [ "$solver" = 'apt' ]; then + testfailureequal "$HEADER +The solver encountered an error of type: ERR_UNSOLVABLE +The following information might help you to understand what is wrong: +The following packages have unmet dependencies: + needsselfprov123 : Depends: selfprov (= 3) + +$SOMEPACKAGESCOULDNOT + needsselfprov123 : Depends: selfprov (= 1) + Depends: selfprov (= 2) + Depends: selfprov (= 3) +E: External solver failed with: The following packages have unmet dependencies:" aptget install needsselfprov123 -s --solver $solver + else + testfailureequal "$HEADER +$SOMEPACKAGESCOULDNOT + needsselfprov123 : Depends: selfprov (= 3) +E: Unable to correct problems, you have held broken packages." aptget install needsselfprov123 -s --solver $solver + fi +done diff --git a/test/integration/test-bug-762160-relpath b/test/integration/test-bug-762160-relpath new file mode 100755 index 0000000..6a800aa --- /dev/null +++ b/test/integration/test-bug-762160-relpath @@ -0,0 +1,17 @@ +#!/bin/sh +# regression test for bug #762160 where apt-get update fails when a +# relative directory is given +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'foo' 'all' '1' +setupaptarchive +changetowebserver + +testsuccess aptget update -o Dir=./rootdir +testsuccess aptget update -o Dir=./rootdir diff --git a/test/integration/test-bug-767891-force-essential-important b/test/integration/test-bug-767891-force-essential-important new file mode 100755 index 0000000..7a23de5 --- /dev/null +++ b/test/integration/test-bug-767891-force-essential-important @@ -0,0 +1,100 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'apt' 'amd64' '1' +insertinstalledpackage 'foo' 'amd64,i386' '1' 'Multi-Arch: same' +insertinstalledpackage 'bar' 'amd64' '1' 'Provides: foo' + +insertpackage 'unstable' 'foo2' 'amd64,i386' '1' 'Multi-Arch: same' + +setupaptarchive + +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + apt* bar* foo* foo:i386* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + apt +0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded. +Purg apt [1] +Purg bar [1] +Purg foo [1] +Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s + +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + apt* bar* foo* foo:i386* +0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded. +Purg apt [1] +Purg bar [1] +Purg foo [1] +Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceEssential='' + +msgmsg 'foo:i386 got the Important flag' +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + apt* bar* foo* foo:i386* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + foo foo:i386 +0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded. +Purg apt [1] +Purg bar [1] +Purg foo [1] +Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceEssential='foo' + +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + apt* bar* foo* foo:i386* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + apt foo foo:i386 +0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded. +Purg apt [1] +Purg bar [1] +Purg foo [1] +Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceEssential::='foo' + +msgmsg 'essentials only from native' +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + foo2 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo2 (1 unstable [amd64]) +Conf foo2 (1 unstable [amd64])' apt full-upgrade -s -o pkgCacheGen::ForceEssential::='foo2' + +msgmsg 'important only effects installed' +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + apt* bar* foo* foo:i386* +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + apt foo foo:i386 +0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded. +Purg apt [1] +Purg bar [1] +Purg foo [1] +Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceImportant::='foo' +rm -f rootdir/var/cache/apt/*.bin +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' apt full-upgrade -s -o pkgCacheGen::ForceImportant::='foo2' diff --git a/test/integration/test-bug-769609-triggers-still-pending-after-run b/test/integration/test-bug-769609-triggers-still-pending-after-run new file mode 100755 index 0000000..ce2c193 --- /dev/null +++ b/test/integration/test-bug-769609-triggers-still-pending-after-run @@ -0,0 +1,75 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +msgtest 'Check if installed dpkg supports' 'noawait trigger' +if dpkg --compare-versions "$(dpkg_version)" 'ge' '1.16.1'; then + msgpass +else + msgskip 'dpkg version too old' + exit 0 +fi +configdpkgnoopchroot + +buildtriggerpackages() { + local TYPE="$1" + setupsimplenativepackage "triggerable-$TYPE" 'all' '1.0' 'unstable' "Depends: trigdepends-$TYPE" + BUILDDIR="incoming/triggerable-${TYPE}-1.0" + cat >"${BUILDDIR}/debian/postinst" <<EOF +#!/bin/sh +if [ "\$1" = 'triggered' ]; then + echo "TRIGGER IS RUNNING" +fi +EOF + echo "$TYPE /usr/share/doc" > "${BUILDDIR}/debian/triggers" + buildpackage "$BUILDDIR" 'unstable' 'main' 'native' + rm -rf "$BUILDDIR" + buildsimplenativepackage "trigdepends-$TYPE" 'all' '1.0' 'unstable' +} + +#buildtriggerpackages 'interest' +buildtriggerpackages 'interest-noawait' +buildsimplenativepackage "trigstuff" 'all' '1.0' 'unstable' + +setupaptarchive + +runtests() { + local TYPE="$1" + msgmsg 'Working with trigger type' "$TYPE" + testsuccess aptget install triggerable-$TYPE -y + cp rootdir/tmp/testsuccess.output terminal.output + testsuccess grep '^REWRITE ' terminal.output + testdpkginstalled triggerable-$TYPE trigdepends-$TYPE + + testsuccess aptget install trigdepends-$TYPE -y --reinstall + cp rootdir/tmp/testsuccess.output terminal.output + testsuccess grep '^REWRITE ' terminal.output + testsuccess grep 'TRIGGER IS RUNNING' terminal.output + testdpkginstalled triggerable-$TYPE trigdepends-$TYPE + + testsuccess aptget install trigstuff -y + cp rootdir/tmp/testsuccess.output terminal.output + testsuccess grep '^REWRITE ' terminal.output + testsuccess grep 'TRIGGER IS RUNNING' terminal.output + testdpkginstalled triggerable-$TYPE trigdepends-$TYPE trigstuff + + testsuccess aptget purge trigstuff -y + cp rootdir/tmp/testsuccess.output terminal.output + testsuccess grep '^REWRITE ' terminal.output + testsuccess grep 'TRIGGER IS RUNNING' terminal.output + testdpkginstalled triggerable-$TYPE trigdepends-$TYPE + testdpkgnotinstalled trigstuff + + testsuccess aptget purge trigdepends-$TYPE -y + cp rootdir/tmp/testsuccess.output terminal.output + testfailure grep '^REWRITE ' terminal.output + testfailure grep 'TRIGGER IS RUNNING' terminal.output + testdpkgnotinstalled triggerable-$TYPE trigdepends-$TYPE +} +#runtests 'interest' +runtests 'interest-noawait' diff --git a/test/integration/test-bug-770291-reinstall b/test/integration/test-bug-770291-reinstall new file mode 100755 index 0000000..a1caf25 --- /dev/null +++ b/test/integration/test-bug-770291-reinstall @@ -0,0 +1,98 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable,installed' 'libc6' 'i386' '1' +insertpackage 'unstable,installed' 'libselinux1' 'i386' '1' + +cp rootdir/var/lib/dpkg/status dpkg.status + +insertpackage 'unstable,installed' 'init' 'i386' '1' 'Depends: systemd-sysv +Essential: yes' +insertpackage 'unstable,installed' 'systemd-sysv' 'i386' '215-5+b1' 'Depends: systemd (= 215-5+b1) +Pre-Depends: systemd' +# fun fact: we need these two pre-depends to get systemd ordered before systemd-sysv as +# many pre-depends mean: do early (as they are a pain, so get them out of the way early) +insertpackage 'unstable,installed' 'systemd' 'i386' '215-5+b1' 'Pre-Depends: libc6, libselinux1' + +# depends loop +insertpackage 'unstable,installed' 'dependsa' 'i386' '1' 'Depends: dependsb +Essential: yes' +insertpackage 'unstable,installed' 'dependsb' 'i386' '1' 'Depends: dependsa +Essential: yes' + +# pre-depends loop +insertpackage 'unstable,installed' 'predependsa' 'i386' '1' 'Pre-Depends: predependsb +Essential: yes' +insertpackage 'unstable,installed' 'predependsb' 'i386' '1' 'Pre-Depends: predependsa +Essential: yes' + +# pre-depends-to-depends loop +insertpackage 'unstable,installed' 'predependsdependsa' 'i386' '1' 'Pre-Depends: predependsdependsb +Essential: yes' +insertpackage 'unstable,installed' 'predependsdependsb' 'i386' '1' 'Depends: predependsdependsa +Essential: yes' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded. +Inst systemd [215-5+b1] (215-5+b1 unstable [i386]) +Conf systemd (215-5+b1 unstable [i386]) +Inst systemd-sysv [215-5+b1] (215-5+b1 unstable [i386]) +Conf systemd-sysv (215-5+b1 unstable [i386])' aptget install --reinstall systemd systemd-sysv -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded. +Inst dependsa [1] (1 unstable [i386]) +Inst dependsb [1] (1 unstable [i386]) +Conf dependsb (1 unstable [i386]) +Conf dependsa (1 unstable [i386])' aptget install --reinstall dependsa dependsb -s + +# there is a chance dpkg can actually do these, BUT this depends on the maintainerscripts (not) present +# which is very risky to depend on (and apt doesn't know about that anyhow). +testfailure aptget install --reinstall predependsa predependsb -s -o Debug::pkgPackageManager=1 +testsuccess grep "^E: Couldn't configure predependsa:i386, probably a dependency cycle.$" rootdir/tmp/testfailure.output + +# FIXME: the error message is a catch all here, not like the one above +testfailure aptget install --reinstall predependsdependsa predependsdependsb -s -o Debug::pkgPackageManager=1 +testsuccess grep "^E: Could not configure 'predependsdependsb:i386'. $" rootdir/tmp/testfailure.output + + +msgmsg 'While we are at it, lets try these loops without reinstall as well' +cp dpkg.status rootdir/var/lib/dpkg/status + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + systemd systemd-sysv +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst systemd (215-5+b1 unstable [i386]) +Conf systemd (215-5+b1 unstable [i386]) +Inst systemd-sysv (215-5+b1 unstable [i386]) +Conf systemd-sysv (215-5+b1 unstable [i386])' aptget install systemd systemd-sysv -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + dependsa dependsb +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst dependsa (1 unstable [i386]) [] +Inst dependsb (1 unstable [i386]) +Conf dependsb (1 unstable [i386]) +Conf dependsa (1 unstable [i386])' aptget install dependsa dependsb -s + +# there is a chance dpkg can actually do these, BUT this depends on the maintainerscripts (not) present +# which is very risky to depend on (and apt doesn't know about that anyhow). +testfailure aptget install predependsa predependsb -s -o Debug::pkgPackageManager=1 +testsuccess grep "^E: Couldn't configure predependsa:i386, probably a dependency cycle.$" rootdir/tmp/testfailure.output + +# FIXME: the error message is a catch all here, not like the one above +testfailure aptget install predependsdependsa predependsdependsb -s -o Debug::pkgPackageManager=1 +testsuccess grep "^E: Could not configure 'predependsdependsb:i386'. $" rootdir/tmp/testfailure.output diff --git a/test/integration/test-bug-778375-server-has-no-reason-phrase b/test/integration/test-bug-778375-server-has-no-reason-phrase new file mode 100755 index 0000000..e04f485 --- /dev/null +++ b/test/integration/test-bug-778375-server-has-no-reason-phrase @@ -0,0 +1,43 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +echo 'found' > aptarchive/working +changetohttpswebserver -o 'aptwebserver::redirect::replace::/redirectme/=/' \ + -o 'aptwebserver::httpcode::200=200' -o 'aptwebserver::httpcode::404=404' \ + -o 'aptwebserver::httpcode::301=301' +webserverconfig 'aptwebserver::empty-response-header::' 'foobar' +webserverconfig 'aptwebserver::response-header::HTTP-Trigger-Field' 'bug' +webserverconfig 'aptwebserver::response-header::Httputter-Trigger-Field' 'bug' + +testdownload() { + rm -f downfile + msgtest "download of a $1 via" "${3%%:*}" + $2 --nomsg downloadfile "$3" downfile + + cp rootdir/tmp/testsuccess.output download.log + #looking for "HTTP server doesn't give Reason-Phrase for 200" + testsuccess grep 'give Reason-Phrase for' download.log + + if [ "$2" = 'testsuccess' ]; then + testfileequal downfile 'found' + else + testfailure test -e downfile + fi +} + +runtest() { + testdownload 'file works' 'testsuccess' "$1/working" + testdownload 'file via redirect works' 'testsuccess' "$1/redirectme/working" + + testdownload 'non-existent file fails' 'testfailure' "$1/failing" + testdownload 'non-existent file via redirect fails' 'testfailure' "$1/redirectme/failing" +} + +runtest "http://localhost:${APTHTTPPORT}" +runtest "https://localhost:${APTHTTPSPORT}" diff --git a/test/integration/test-bug-782777-single-arch-weirdness b/test/integration/test-bug-782777-single-arch-weirdness new file mode 100755 index 0000000..41be1e7 --- /dev/null +++ b/test/integration/test-bug-782777-single-arch-weirdness @@ -0,0 +1,72 @@ +#!/bin/sh +# Ensure that the order in which packages are in the binary cache +# does not effect if they can be found or not +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'abar' 'i386' '1' +insertpackage 'unstable' 'foobar' 'i386' '1' 'Depends: abar:amd64, zfoo:amd64' +insertpackage 'unstable' 'zfoo' 'i386' '1' + +setupaptarchive + +testrun() { + rm -f rootdir/var/lib/apt/extended_states + + testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + abar zfoo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst abar (1 unstable [i386]) +Inst zfoo (1 unstable [i386]) +Conf abar (1 unstable [i386]) +Conf zfoo (1 unstable [i386])' aptget install abar zfoo -s + + testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + abar zfoo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst abar (1 unstable [i386]) +Inst zfoo (1 unstable [i386]) +Conf abar (1 unstable [i386]) +Conf zfoo (1 unstable [i386])' aptget install abar:i386 zfoo:i386 -s + + testequal "Reading package lists... +Building dependency tree... +Package abar:amd64 is not available, but is referred to by another package. +This may mean that the package is missing, has been obsoleted, or +is only available from another source + +Package zfoo:amd64 is not available, but is referred to by another package. +This may mean that the package is missing, has been obsoleted, or +is only available from another source + +E: Package 'abar:amd64' has no installation candidate +E: Package 'zfoo:amd64' has no installation candidate" aptget install abar:amd64 zfoo:amd64 -s + + cp -f rootdir/var/lib/dpkg/status status.backup + insertinstalledpackage 'abar' 'i386' '1' + insertinstalledpackage 'zfoo' 'i386' '1' + + testequal 'abar +zfoo' aptmark showmanual abar zfoo + testequal 'abar set to automatically installed. +zfoo set to automatically installed.' aptmark auto abar zfoo + testempty aptmark showmanual abar zfoo + testequal 'abar +zfoo' aptmark showauto abar zfoo + + mv -f status.backup rootdir/var/lib/dpkg/status +} + +msgmsg 'Single-Arch testrun' +testrun +msgmsg 'Multi-Arch testrun' +configarchitecture 'i386' 'amd64' +testrun diff --git a/test/integration/test-bug-796070-downgrade-realpkg b/test/integration/test-bug-796070-downgrade-realpkg new file mode 100755 index 0000000..1013247 --- /dev/null +++ b/test/integration/test-bug-796070-downgrade-realpkg @@ -0,0 +1,23 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +buildsimplenativepackage 'apt' 'all' '1.0.10.1' 'stable' 'Depends: libapt-pkg4.16 (>= 1.0.10.1)' +buildsimplenativepackage 'libapt-pkg4.16' 'all' '1.0.10.1' 'stable' 'Breaks: apt (<< 0.9.4~), libapt-inst1.5 (<< 0.9.9~)' +buildsimplenativepackage 'libapt-pkg5.0' 'all' '1.1~exp9' 'unstable' 'Breaks: apt (<< 1.1~exp4), libapt-inst1.5 (<< 0.9.9~)' +buildsimplenativepackage 'apt' 'all' '1.1~exp9' 'unstable' 'Depends: libapt-pkg5.0' + +setupaptarchive + +# Check with the APT name, aka essential +testsuccess aptget install apt -t stable -y +testsuccess aptget dist-upgrade -y + +testsuccess aptget install apt/stable -y --allow-downgrades -o Debug::pkgPackageManager=1 #-o Debug::pkgDpkgPM=1 +testdpkginstalled apt libapt-pkg4.16 +testdpkgnotinstalled libapt-pkg5.0 diff --git a/test/integration/test-bug-796070-downgrade-simulate b/test/integration/test-bug-796070-downgrade-simulate new file mode 100755 index 0000000..61ecc87 --- /dev/null +++ b/test/integration/test-bug-796070-downgrade-simulate @@ -0,0 +1,67 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'apt' 'all' '1.0.10.1' 'Depends: libapt-pkg4.16 (>= 1.0.10.1)' +insertinstalledpackage 'libapt-pkg4.16' 'all' '1.0.10.1' 'Breaks: apt (<< 0.9.4~), libapt-inst1.5 (<< 0.9.9~)' +insertinstalledpackage 'libapt-pkg5.0' 'all' '1.1~exp9' 'Breaks: apt (<< 1.1~exp4), libapt-inst1.5 (<< 0.9.9~)' +insertinstalledpackage 'apt' 'all' '1.1~exp9' 'Depends: libapt-pkg5.0' + +insertpackage 'unstable' 'napt' 'all' '1.0.10.1' 'Depends: nlibapt-pkg4.16 (>= 1.0.10.1)' +insertinstalledpackage 'nlibapt-pkg4.16' 'all' '1.0.10.1' 'Breaks: napt (<< 0.9.4~), nlibapt-inst1.5 (<< 0.9.9~)' +insertinstalledpackage 'nlibapt-pkg5.0' 'all' '1.1~exp9' 'Breaks: napt (<< 1.1~exp4), nlibapt-inst1.5 (<< 0.9.9~)' +insertinstalledpackage 'napt' 'all' '1.1~exp9' 'Depends: nlibapt-pkg5.0' + +insertpackage 'unstable' 'eapt' 'all' '1.0.10.1' 'Depends: elibapt-pkg4.16 (>= 1.0.10.1) +Essential: yes' +insertinstalledpackage 'elibapt-pkg4.16' 'all' '1.0.10.1' 'Breaks: eapt (<< 0.9.4~), elibapt-inst1.5 (<< 0.9.9~)' +insertinstalledpackage 'elibapt-pkg5.0' 'all' '1.1~exp9' 'Breaks: eapt (<< 1.1~exp4), elibapt-inst1.5 (<< 0.9.9~)' +insertinstalledpackage 'eapt' 'all' '1.1~exp9' 'Depends: elibapt-pkg5.0 +Essential: yes' + + +setupaptarchive + + +# Check with a normal package +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + nlibapt-pkg5.0 +The following packages will be DOWNGRADED: + napt +0 upgraded, 0 newly installed, 1 downgraded, 1 to remove and 0 not upgraded. +Remv nlibapt-pkg5.0 [1.1~exp9] [napt:i386 ] +Inst napt [1.1~exp9] (1.0.10.1 unstable [all]) +Conf napt (1.0.10.1 unstable [all])' apt install -s napt=1.0.10.1 + + +# Check with Essential +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + elibapt-pkg5.0 +The following packages will be DOWNGRADED: + eapt +0 upgraded, 0 newly installed, 1 downgraded, 1 to remove and 0 not upgraded. +Inst eapt [1.1~exp9] (1.0.10.1 unstable [all]) [elibapt-pkg5.0:i386 on eapt:i386] [elibapt-pkg5.0:i386 ] +Remv elibapt-pkg5.0 [1.1~exp9] +Conf eapt (1.0.10.1 unstable [all])' apt install -s eapt=1.0.10.1 + + +# Check with the APT name, aka essential +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libapt-pkg5.0 +The following packages will be DOWNGRADED: + apt +0 upgraded, 0 newly installed, 1 downgraded, 1 to remove and 0 not upgraded. +Inst apt [1.1~exp9] (1.0.10.1 unstable [all]) [libapt-pkg5.0:i386 on apt:i386] [libapt-pkg5.0:i386 ] +Remv libapt-pkg5.0 [1.1~exp9] +Conf apt (1.0.10.1 unstable [all])' apt install -s apt=1.0.10.1 diff --git a/test/integration/test-bug-807012-mixed-case-package-names b/test/integration/test-bug-807012-mixed-case-package-names new file mode 100755 index 0000000..4f003ab --- /dev/null +++ b/test/integration/test-bug-807012-mixed-case-package-names @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +TMPDIR=$(readlink -f .) + +insertinstalledpackage 'worldofgoo' 'all' '1' +insertpackage 'unstable' 'WorldOfGoo' 'all' '1' + +setupaptarchive + +testsuccessequal "worldofgoo: + Installed: 1 + Candidate: 1 + Version table: + *** 1 500 + 500 file:${TMPDIR}/aptarchive unstable/main all Packages + 100 ${TMPDIR}/rootdir/var/lib/dpkg/status" \ + aptcache policy worldofgoo diff --git a/test/integration/test-bug-814139-pickup-of-different-cache-states b/test/integration/test-bug-814139-pickup-of-different-cache-states new file mode 100755 index 0000000..dffeb73 --- /dev/null +++ b/test/integration/test-bug-814139-pickup-of-different-cache-states @@ -0,0 +1,60 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'build-essential' 'amd64' '1' + +buildsimplenativepackage 'foo' 'all' '1' 'stable' 'Build-Depends: bar' +buildsimplenativepackage 'bar' 'all' '1' 'stable' + +setupaptarchive + +cp rootdir/var/lib/dpkg/status status.backup + +testrun() { + cp status.backup rootdir/var/lib/dpkg/status + cleanup + testdpkgnotinstalled 'bar' + testsuccess aptget build-dep foo -y + testdpkginstalled 'bar' + cleanup + cd downloaded + testsuccess aptget source foo + testsuccess test -s foo_1.tar.* -a -s foo_1.dsc + rm foo_1.tar.* foo_1.dsc + testsuccess test -d foo-1 + rm -rf foo-1 + cd .. + cleanup + testsuccess aptget install foo -y +} + +msgmsg 'Caches fully up-to-date' +cleanup() { + rm -f rootdir/var/cache/apt/*.bin + testsuccess aptcache gencaches +} +testrun + +msgmsg 'pkgcache.bin is missing' +cleanup() { + rm -f rootdir/var/cache/apt/*.bin + testsuccess aptcache gencaches + rm rootdir/var/cache/apt/pkgcache.bin +} +testrun + +msgmsg 'Caches are not writeable' +rm rootdir/var/cache/apt/*.bin +addtrap 'prefix' 'chmod 755 rootdir/var/cache/apt;' +chmod 555 rootdir/var/cache/apt +testsuccess aptcache gencaches +cleanup() { + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/cache/apt" '%a' '=' '555' +} +testrun diff --git a/test/integration/test-bug-818628-unreadable-source b/test/integration/test-bug-818628-unreadable-source new file mode 100755 index 0000000..e7ad26d --- /dev/null +++ b/test/integration/test-bug-818628-unreadable-source @@ -0,0 +1,94 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' +cat rootdir/etc/apt/apt.conf.d/01multiarch.conf >> $(getaptconfig) + +if [ "$(id -u)" = '0' ]; then + msgskip 'Tests for unreadable files do not work as root' + exit 0 +fi + +insertinstalledpackage 'foo' 'amd64' '1' +insertpackage 'unstable' 'foo' 'amd64' '2' + +setupaptarchive --no-update + +touch rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.list +touch rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.sources +touch rootdir/etc/apt/apt.conf.d/unreadable.conf +touch rootdir/etc/apt/preferences.d/unreadable.pref + +addtrap 'prefix' "chmod -R +r '$(escape_shell "$TMPWORKINGDIRECTORY")/rootdir/etc/apt';" +chmod -r rootdir/etc/apt/trusted.gpg.d +testfailure apt update +chmod +r rootdir/etc/apt/trusted.gpg.d +testsuccess apt update +testsuccess apt policy foo +testsuccess apt search foo +testsuccessequal "Listing... +foo/unstable 2 amd64 [upgradable from: 1] +N: There is 1 additional version. Please use the '-a' switch to see it" apt list --upgradable + +runthemall() { + local ERR="$1" + local ERRNOTICEVER="$1${2- +N: There is 1 additional version. Please use the '-a' switch to see it}" + local ERRNOTICEREC="$1${2- +N: There is 1 additional record. Please use the '-a' switch to see it}" + testwarningmsg "$ERR" aptcache policy + testwarningmsg "$ERR" aptcache policy foo + testwarningmsg "$ERR" aptcache depends foo + testwarningmsg "$ERR" aptcache rdepends foo + testwarningmsg "$ERR" aptcache search foo + testwarningmsg "$ERR" apt policy + testwarningmsg "$ERR" apt policy foo + testwarningmsg "$ERR" apt depends foo + testwarningmsg "$ERR" apt rdepends foo + testwarningmsg "$ERR" apt search foo + testwarningmsg "$ERRNOTICEVER" apt list --upgradable + testwarningmsg "$ERRNOTICEREC" apt show foo + testwarningmsg "$ERRNOTICEREC" aptcache show foo --no-all-versions + testwarningmsg "$ERR" aptmark auto foo + testwarningmsg "$ERR" aptmark manual foo + testwarningmsg "$ERR" aptmark auto foo +} +echo 'Apt::Cmd::Disable-Script-Warning "true";' >> aptconfig.conf + +msgmsg 'Unreadable one-line-style sources file' +chmod -r rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.list +runthemall "W: Unable to read $TMPWORKINGDIRECTORY/rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.list - open (13: Permission denied)" +chmod +r rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.list + +msgmsg 'Unreadable deb822-style sources file' +chmod -r rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.sources +runthemall "W: Unable to read $TMPWORKINGDIRECTORY/rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.sources - open (13: Permission denied)" +chmod +r rootdir/etc/apt/sources.list.d/apt-test-unstable-deb-src.sources + +msgmsg 'Unreadable config file' +chmod -r rootdir/etc/apt/apt.conf.d/unreadable.conf +runthemall "W: Unable to read ${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/unreadable.conf - open (13: Permission denied)" +chmod +r rootdir/etc/apt/apt.conf.d/unreadable.conf + +msgmsg 'Unreadable preferences file' +chmod -r rootdir/etc/apt/preferences.d/unreadable.pref +runthemall "W: Unable to read ${TMPWORKINGDIRECTORY}/rootdir/etc/apt/preferences.d/unreadable.pref - open (13: Permission denied)" +chmod +r rootdir/etc/apt/preferences.d/unreadable.pref + +msgmsg 'Unreadable sources directory' +chmod -r rootdir/etc/apt/sources.list.d +runthemall "W: Unable to read $TMPWORKINGDIRECTORY/rootdir/etc/apt/sources.list.d/ - opendir (13: Permission denied)" "" +chmod +r rootdir/etc/apt/sources.list.d + +msgmsg 'Unreadable config directory' +chmod -r rootdir/etc/apt/apt.conf.d +runthemall "W: Unable to read ${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/ - opendir (13: Permission denied)" +chmod +r rootdir/etc/apt/apt.conf.d + +msgmsg 'Unreadable preferences directory' +chmod -r rootdir/etc/apt/preferences.d +runthemall "W: Unable to read ${TMPWORKINGDIRECTORY}/rootdir/etc/apt/preferences.d/ - opendir (13: Permission denied)" +chmod +r rootdir/etc/apt/preferences.d diff --git a/test/integration/test-bug-829651 b/test/integration/test-bug-829651 new file mode 100755 index 0000000..976bb04 --- /dev/null +++ b/test/integration/test-bug-829651 @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +if [ "$(id -u)" = '0' ]; then + msgskip 'Tests for unreadable files do not work as root' + exit 0 +fi + +insertinstalledpackage 'foo' 'amd64' '1' +insertpackage 'unstable' 'foo' 'amd64' '2' + +setupaptarchive + + +testsuccess aptget indextargets + +aptget clean +chmod -r rootdir/var/lib/dpkg/status + +testfailureequal "E: Could not open file ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status - open (13: Permission denied) +E: Problem opening ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status +E: The package lists or status file could not be parsed or opened." aptget indextargets diff --git a/test/integration/test-bug-835094-configure-before-purge b/test/integration/test-bug-835094-configure-before-purge new file mode 100755 index 0000000..16a196c --- /dev/null +++ b/test/integration/test-bug-835094-configure-before-purge @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'kernel' 'amd64' '1' 'unstable' 'Depends: initramfs-tools | linux-initramfs-tool' + +#buildsimplenativepackage 'initramfs-tools' 'amd64' '1.0.16' 'unstable' 'Provides: linux-initramfs-tool' +setupsimplenativepackage 'initramfs-tools' 'amd64' '1' 'unstable' 'Provides: linux-initramfs-tool' +BUILDDIR='incoming/initramfs-tools-1' +mkdir -p "${BUILDDIR}/debian/initramfs-tools/etc" +echo 'foo2=bar2;' > "${BUILDDIR}/init.conf" +echo 'init.conf /etc/init.conf' >> "${BUILDDIR}/debian/install" +buildpackage "$BUILDDIR" 'unstable' 'main' 'native' +rm -rf "$BUILDDIR" + +buildsimplenativepackage 'dracut' 'amd64' '1' 'unstable' 'Provides: linux-initramfs-tool +Conflicts: initramfs-tools' + +setupaptarchive + +testdpkgnotinstalled 'kernel' 'initramfs-tools' 'dracut' +testsuccess apt install kernel -y +testdpkginstalled 'kernel' 'initramfs-tools' +testsuccess test -s rootdir/etc/init.conf +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + initramfs-tools* +The following NEW packages will be installed: + dracut +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Purg initramfs-tools [1] [kernel:amd64 ] +Inst dracut (1 unstable [amd64]) +Conf dracut (1 unstable [amd64])' apt install --purge dracut -s +testsuccess apt install --purge dracut -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 +testsuccess apt install --purge dracut -y +testdpkginstalled 'kernel' 'dracut' +testdpkgnotinstalled 'initramfs-tools' +testsuccess test ! -s rootdir/etc/init.conf diff --git a/test/integration/test-bug-838779-untrusted-to-trusted-Release-hit b/test/integration/test-bug-838779-untrusted-to-trusted-Release-hit new file mode 100755 index 0000000..5023475 --- /dev/null +++ b/test/integration/test-bug-838779-untrusted-to-trusted-Release-hit @@ -0,0 +1,48 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'foo' 'all' '1' 'stable' + +export APT_DONT_SIGN='' +setupaptarchive --no-update + +changetowebserver + +testsuccess aptget update +testdpkgnotinstalled 'foo' +testsuccess apt install foo -y +testdpkginstalled 'foo' +testsuccess apt purge foo -y +testdpkgnotinstalled 'foo' + +msgmsg 'Untrusted to trusted hit' 'InRelease' +rm -rf rootdir/var/lib/apt/lists rootdir/var/cache/apt/archives +mv rootdir/etc/apt/trusted.gpg.d rootdir/etc/apt/trusted.gpg.d-bak +testfailure aptget update +testwarning aptget update --allow-insecure-repositories +testfailure apt install foo -y +testdpkgnotinstalled 'foo' +mv rootdir/etc/apt/trusted.gpg.d-bak rootdir/etc/apt/trusted.gpg.d +testsuccess aptget update +testsuccess apt install foo -y +testdpkginstalled 'foo' +testsuccess apt purge foo -y +testdpkgnotinstalled 'foo' + +msgmsg 'Untrusted to trusted hit' 'Release.gpg' +find aptarchive -name 'InRelease' -delete +rm -rf rootdir/var/lib/apt/lists rootdir/var/cache/apt/archives +mv rootdir/etc/apt/trusted.gpg.d rootdir/etc/apt/trusted.gpg.d-bak +testfailure aptget update +testwarning aptget update --allow-insecure-repositories +testfailure apt install foo -y +testdpkgnotinstalled 'foo' +mv rootdir/etc/apt/trusted.gpg.d-bak rootdir/etc/apt/trusted.gpg.d +testsuccess aptget update +testsuccess apt install foo -y +testdpkginstalled 'foo' diff --git a/test/integration/test-bug-841874-warning-for-mismatching-distribution b/test/integration/test-bug-841874-warning-for-mismatching-distribution new file mode 100755 index 0000000..7502eef --- /dev/null +++ b/test/integration/test-bug-841874-warning-for-mismatching-distribution @@ -0,0 +1,49 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'testing' 'foo' 'all' '1' + +getcodenamefromsuite() { echo -n 'stretch'; } +setupaptarchive --no-update +APTARCHIVE="$(readlink -f './aptarchive')" +ln -s "${APTARCHIVE}/dists/testing" "${APTARCHIVE}/dists/stretch" +ln -s "${APTARCHIVE}/dists/testing" "${APTARCHIVE}/dists/zurg" + +testfailure apt show foo +testsuccess apt update +testsuccess apt show foo + +rm -rf rootdir/var/lib/apt/lists +sed -i -e 's#testing#stretch#g' rootdir/etc/apt/sources.list.d/* +testsuccess apt update +testsuccess apt show foo + +rm -rf rootdir/var/lib/apt/lists +sed -i -e 's#stretch#zurg#g' rootdir/etc/apt/sources.list.d/* +testwarningmsg "W: Conflicting distribution: file:$APTARCHIVE zurg InRelease (expected zurg but got stretch)" apt update +testsuccess apt show foo + +# check that 'foo/bar' is rewritten to 'foo' while we are at it +rm -rf rootdir/var/lib/apt/lists +sed -i -e 's#zurg#stretch/updates#g' rootdir/etc/apt/sources.list.d/* +testfailure apt update +testfailure apt show foo +ln -s "${APTARCHIVE}/dists/testing" "${APTARCHIVE}/dists/stretch/updates" +testsuccess apt update +testsuccess apt show foo + +# … but only if needed +rm -rf rootdir/var/lib/apt/lists +sed -i -e 's#stretch#buster#g' rootdir/etc/apt/sources.list.d/* +sed -i -e 's#^Codename: stretch$#Codename: buster/updates#g' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailure apt update +testfailure apt show foo +ln -s "${APTARCHIVE}/dists/testing" "${APTARCHIVE}/dists/buster" +testsuccess apt update +testsuccess apt show foo diff --git a/test/integration/test-bug-869859-retry-downloads b/test/integration/test-bug-869859-retry-downloads new file mode 100755 index 0000000..86203f7 --- /dev/null +++ b/test/integration/test-bug-869859-retry-downloads @@ -0,0 +1,55 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'testpkg' 'all' '1' 'stable' + +setupaptarchive --no-update +changetowebserver +testsuccess apt update + +cd downloaded +testsuccess apt download testpkg +testsuccess test -f testpkg_1_all.deb +rm -f testpkg_1_all.deb + +msgmsg 'Fail after too many retries' +webserverconfig 'aptwebserver::failrequest' '429' +webserverconfig 'aptwebserver::failrequest::pool/testpkg_1_all.deb' '99' +testfailure apt download testpkg -o acquire::retries=3 +testfailure test -f testpkg_1_all.deb + +msgmsg 'Success in the third try' +webserverconfig 'aptwebserver::failrequest::pool/testpkg_1_all.deb' '2' +testsuccess apt download testpkg -o acquire::retries=3 +testsuccess test -f testpkg_1_all.deb +rm -f testpkg_1_all.deb + +msgmsg 'Do not try everything again, hard failures keep hard failures' +webserverconfig 'aptwebserver::failrequest' '404' +webserverconfig 'aptwebserver::failrequest::pool/testpkg_1_all.deb' '2' +testfailure apt download testpkg -o acquire::retries=3 +testfailure test -f testpkg_1_all.deb + +cat ../rootdir/etc/apt/sources.list.d/apt-test-*.list > ../rootdir/etc/apt/sources.list.d/00http-source.list +changetohttpswebserver + +msgmsg 'Check download from alternative sources if first failed' +webserverconfig 'aptwebserver::failrequest::pool/testpkg_1_all.deb' '0' +testsuccess apt update +testsuccess apt download testpkg -o acquire::retries=0 +testsuccess test -f testpkg_1_all.deb +rm -f testpkg_1_all.deb + +# we make the first source fail by disabling http support +webserverconfig 'aptwebserver::support::http' 'false' +testsuccess apt download testpkg -o acquire::retries=0 +cp ../rootdir/tmp/testsuccess.output alt.output +testsuccess grep '^ 400 Bad Request' alt.output +testsuccess test -f testpkg_1_all.deb +rm -f testpkg_1_all.deb diff --git a/test/integration/test-bug-870675-hang-on-unsupported-method b/test/integration/test-bug-870675-hang-on-unsupported-method new file mode 100755 index 0000000..0d79b8f --- /dev/null +++ b/test/integration/test-bug-870675-hang-on-unsupported-method @@ -0,0 +1,26 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +changetowebserver + +echo 'foo' > aptarchive/foobar +echo 'bar' > aptarchive/foobar2 + +testsuccess apthelper download-file "http://localhost:${APTHTTPPORT}/foobar" ./downloaded/foobar 'SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15' +rm -f ./downloaded/foobar +testsuccess apthelper download-file "http://localhost:${APTHTTPPORT}/foobar" ./downloaded/foobar 'SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15' \ + "http://localhost:${APTHTTPPORT}/foobar2" ./downloaded/foobar2 'SHA1:e242ed3bffccdf271b7fbaf34ed72d089537b42f' +rm -f ./downloaded/foobar ./downloaded/foobar2 + +testfailure apthelper download-file "foo://localhost:${APTHTTPPORT}/foobar" ./downloaded/foobar 'SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15' +testsuccess grep 'The method driver .*/foo could not be found' rootdir/tmp/testfailure.output +rm -f ./downloaded/foobar +testfailure apthelper download-file "foo://localhost:${APTHTTPPORT}/foobar" ./downloaded/foobar 'SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15' \ + "foo://localhost:${APTHTTPPORT}/foobar2" ./downloaded/foobar2 'SHA1:e242ed3bffccdf271b7fbaf34ed72d089537b42f' +testsuccess grep 'The method driver .*/foo could not be found' rootdir/tmp/testfailure.output +rm -f ./downloaded/foobar ./downloaded/foobar2 diff --git a/test/integration/test-bug-872963-apt-ftparchive-disable-hashes b/test/integration/test-bug-872963-apt-ftparchive-disable-hashes new file mode 100755 index 0000000..ff01246 --- /dev/null +++ b/test/integration/test-bug-872963-apt-ftparchive-disable-hashes @@ -0,0 +1,40 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment + +touch aptarchive/apt_1.5~rc1.tar.xz +cat >> aptarchive/apt_1.5~rc1.dsc << EOF +Format: 3.0 (native) +Source: apt +Binary: apt +Architecture: any all +Version: 1.5~rc1 +Build-Depends: foo +Package-List: + apt deb admin important arch=any +Checksums-Sha1: + 332b354b0c7cbd936a4a95f3ce149aa03677cabf 2095076 apt_1.5~rc1.tar.xz +Checksums-Sha256: + 14d09b2c1e13f9a70aac3322987ff26f36c53010639763573c9aa4987e52e47a 2095076 apt_1.5~rc1.tar.xz +Checksums-Sha512: + 4f570c10c3fd549b2e27db4481fbc1ebebed52bd06a8ba7c0716b3917a8452bb3d3cd4fbb02561e02af09b1973a65a4cc69a42c21e858b1d5c3caa970aea4fd4 2095076 apt_1.5~rc1.tar.xz +Files: + 7ea24e77b6203e08ca4158831df26825 2095076 apt_1.5~rc1.tar.xz +EOF + + +rm rootdir/etc/apt/apt.conf.d/* + +for HASH in MD5 SHA1 SHA256 SHA512; do + testsuccess aptftparchive -qq sources -o APT::FTPArchive::$HASH=false "aptarchive/" + cp rootdir/tmp/testsuccess.output aptarchive/Sources + if [ "$HASH" = "MD5" ]; then + testfailure grep "Files:" aptarchive/Sources + else + testfailure grep -i "$HASH:" aptarchive/Sources + fi +done diff --git a/test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components b/test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components new file mode 100755 index 0000000..6eb4e04 --- /dev/null +++ b/test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'stable' 'foo' 'all' '1' +insertpackage 'stable' 'bar' 'all' '1' '' '' '' 'main/debian-installer/others' +insertpackage 'stable-backports' 'foo' 'all' '1+sb' +insertpackage 'stable-backports' 'bar' 'all' '1+sb' '' '' '' 'main/debian-installer/others' + +find aptarchive/dists -path '*/debian-installer/i18n/Translation-en*' -delete + +setupaptarchive --no-update +sed -i -e '/^Codename: / a\ +Components: main contrib' $(find ./aptarchive -name 'Release') +signreleasefiles + +testsuccess aptget update + +sed -i -e 's# main\w*$# main main/debian-installer#' rootdir/etc/apt/sources.list.d/* + +testsuccess aptget update diff --git a/test/integration/test-bug-921685-binary-detached-signature b/test/integration/test-bug-921685-binary-detached-signature new file mode 100755 index 0000000..df86319 --- /dev/null +++ b/test/integration/test-bug-921685-binary-detached-signature @@ -0,0 +1,22 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'foo' 'all' '1' + +buildaptarchive +setupdistsaptarchive + +for RELEASE in $(find aptarchive -name 'Release'); do + # note the missing --armor + dosigning "keys/joesixpack" --detach-sign --sign --output "${RELEASE}.gpg" "${RELEASE}" +done + +testfailure apt show foo +testfailure aptget update +testsuccess grep 'W: .* Detached signature file .* is in unsupported binary format' rootdir/tmp/testfailure.output +testfailure apt show foo diff --git a/test/integration/test-bug-lp1347721-dpkg-ordering b/test/integration/test-bug-lp1347721-dpkg-ordering new file mode 100755 index 0000000..3c31974 --- /dev/null +++ b/test/integration/test-bug-lp1347721-dpkg-ordering @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +# ensure we find a valid ordering +testsuccess aptget dist-upgrade -s diff --git a/test/integration/test-bug-lp1445239-download-loop b/test/integration/test-bug-lp1445239-download-loop new file mode 100755 index 0000000..6802840 --- /dev/null +++ b/test/integration/test-bug-lp1445239-download-loop @@ -0,0 +1,28 @@ +#!/bin/sh +# +# this is a regression test for LP: #1445239 where a partial download can +# trigger an endless hang of the download method +# + +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +changetowebserver + +TESTFILE='aptarchive/testfile' +dd if=/dev/zero of=$TESTFILE bs=100k count=1 2>/dev/null + +DOWNLOADLOG='rootdir/tmp/testdownloadfile.log' + +TARGET=./downloaded/testfile-downloaded +dd if=/dev/zero of=$TARGET bs=99k count=1 2>/dev/null +if ! downloadfile http://localhost:${APTHTTPPORT}/testfile "$TARGET" > "$DOWNLOADLOG"; then + cat >&2 "$DOWNLOADLOG" + msgfail +else + msgpass +fi diff --git a/test/integration/test-bug-lp1550741-heisestate b/test/integration/test-bug-lp1550741-heisestate new file mode 100755 index 0000000..76fdcb8 --- /dev/null +++ b/test/integration/test-bug-lp1550741-heisestate @@ -0,0 +1,48 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'module-init-tools' 'amd64' '1.0' 'Depends: libkmod2 (= 21-1)' +insertpackage 'unstable' 'libkmod2' 'amd64' '0.22-1' +insertinstalledpackage 'module-init-tools' 'amd64' '0.1' + +setupaptarchive + +# this test only works if the python-apt is build against the same +# ABI version as the apt we are testing here +PYAPT_LIB_VER=$(runpython3 -c 'import apt_pkg;print(apt_pkg.LIB_VERSION)' 2>/dev/null || true) +if [ ! -f $LIBRARYPATH/libapt-pkg.so.$PYAPT_LIB_VER ]; then + msgskip "python-apt build with the wrong library version: $PYAPT_LIB_VER" + exit 0 +fi + +# we can not test this using our normal sh tests +cat > test.py <<EOF +#!/usr/bin/python3 +import sys +import apt +def in_valid_state(pkg): + return (pkg.marked_keep or + pkg.marked_install or + pkg.marked_upgrade or + pkg.marked_delete or + pkg.marked_downgrade or + pkg.marked_reinstall) +# main +cache=apt.Cache() +pkgname="module-init-tools" +if not in_valid_state(cache[pkgname]): + print("the test is broken, %s should be in a valid state" % pkgname) + sys.exit(99) +cache.upgrade(True) +if not in_valid_state(cache[pkgname]): + print("package %s is in a heisen-state" % pkgname) + sys.exit(2) + +EOF +testsuccess runpython3 test.py diff --git a/test/integration/test-bug-lp1562402-nomark-removals-as-keep b/test/integration/test-bug-lp1562402-nomark-removals-as-keep new file mode 100755 index 0000000..6e8225a --- /dev/null +++ b/test/integration/test-bug-lp1562402-nomark-removals-as-keep @@ -0,0 +1,39 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'maas-common' 'all' '2.0.0~alpha4+bzr4843-0ubuntu1~xenial2' +insertpackage 'unstable' 'maas-region-controller-min' 'amd64' '2.0.0~alpha4+bzr4837-0ubuntu1~xenial1' 'Depends: maas-common (= 2.0.0~alpha4+bzr4837-0ubuntu1~xenial1)' +insertpackage 'unstable' 'maas-region-api' 'amd64' '2.0.0~alpha4+bzr4843-0ubuntu1~xenial2' 'Depends: maas-common (= 2.0.0~alpha4+bzr4843-0ubuntu1~xenial2)\nConflicts: maas-region-controller-min\nProvides: maas-region-controller-min' +insertpackage 'unstable' 'maas-region-controller' 'all' '2.0.0~alpha4+bzr4843-0ubuntu1~xenial2' 'Depends: maas-region-api (= 2.0.0~alpha4+bzr4843-0ubuntu1~xenial2)' + +insertinstalledpackage 'maas-common' 'all' '2.0.0~alpha3+bzr4810-0ubuntu1' +insertinstalledpackage 'maas-region-controller-min' 'amd64' '2.0.0~alpha3+bzr4810-0ubuntu1' 'Depends: maas-common (= 2.0.0~alpha3+bzr4810-0ubuntu1)' +insertinstalledpackage 'maas-region-controller' 'all' '2.0.0~alpha3+bzr4810-0ubuntu1' 'Depends: maas-region-controller-min (= 2.0.0~alpha3+bzr4810-0ubuntu1)' + +setupaptarchive + +testsuccess aptget dist-upgrade -s -o Debug::pkgDepCache::AutoInstall=true -o Debug::pkgPackageManager=yes -o Debug::pkgProblemResolver=yes +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + maas-region-controller-min +The following NEW packages will be installed: + maas-region-api +The following packages will be upgraded: + maas-common maas-region-controller +2 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Inst maas-region-controller [2.0.0~alpha3+bzr4810-0ubuntu1] (2.0.0~alpha4+bzr4843-0ubuntu1~xenial2 unstable [all]) [] +Remv maas-region-controller-min [2.0.0~alpha3+bzr4810-0ubuntu1] [] +Inst maas-common [2.0.0~alpha3+bzr4810-0ubuntu1] (2.0.0~alpha4+bzr4843-0ubuntu1~xenial2 unstable [all]) [] +Inst maas-region-api (2.0.0~alpha4+bzr4843-0ubuntu1~xenial2 unstable [amd64]) +Conf maas-region-controller (2.0.0~alpha4+bzr4843-0ubuntu1~xenial2 unstable [all]) +Conf maas-common (2.0.0~alpha4+bzr4843-0ubuntu1~xenial2 unstable [all]) +Conf maas-region-api (2.0.0~alpha4+bzr4843-0ubuntu1~xenial2 unstable [amd64])' \ +aptget dist-upgrade -s diff --git a/test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative b/test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative new file mode 100755 index 0000000..7f8e4ad --- /dev/null +++ b/test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative @@ -0,0 +1,58 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + + +insertpackage 'stable' 'build-depends' 'i386' '1' +insertpackage 'stable' 'foo' 'i386' '1' +insertinstalledpackage 'build-essential' 'i386' '1' + +setupaptarchive + +# This used to be interpreted as build-depends | foo +cat > foobar.dsc <<EOF +Format: 3.0 (native) +Source: foobar +Binary: foobar +Architecture: all +Version: 1 +Maintainer: Joe Sixpack <joe@example.org> +Build-Depends: build-depends [i386] | build-depends [amd64], foo +Standards-Version: 3.9.8 +EOF +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-depends foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst build-depends (1 stable [i386]) +Inst foo (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf foo (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc + + +# This caused a segmentation fault +cat > foobar.dsc <<EOF +Format: 3.0 (native) +Source: foobar +Binary: foobar +Architecture: all +Version: 1 +Maintainer: Joe Sixpack <joe@example.org> +Build-Depends: build-depends [i386] | build-depends [amd64] +Standards-Version: 3.9.8 +EOF +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-depends +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst build-depends (1 stable [i386]) +Conf build-depends (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc diff --git a/test/integration/test-bug-multiarch-upgrade b/test/integration/test-bug-multiarch-upgrade new file mode 100755 index 0000000..38e7053 --- /dev/null +++ b/test/integration/test-bug-multiarch-upgrade @@ -0,0 +1,29 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'libcups2' 'amd64' '1' 'Multi-Arch: same' +insertinstalledpackage 'libcups2' 'i386' '1' 'Multi-Arch: same' + +insertpackage 'unstable' 'libcups2' 'amd64' '0' 'Multi-Arch: same' +insertpackage 'unstable' 'libcups2' 'amd64' '2' 'Multi-Arch: same' +insertpackage 'unstable' 'libcups2' 'i386' '0' 'Multi-Arch: same' +insertpackage 'unstable' 'libcups2' 'i386' '2' 'Multi-Arch: same' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libcups2 +The following packages will be upgraded: + libcups2 libcups2:i386 +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst libcups2 [1] (2 unstable [amd64]) [libcups2:amd64 on libcups2:i386] [libcups2:i386 on libcups2:amd64] [libcups2:i386 ] +Inst libcups2:i386 [1] (2 unstable [i386]) +Conf libcups2 (2 unstable [amd64]) +Conf libcups2:i386 (2 unstable [i386])' aptget install -s libcups2:i386 diff --git a/test/integration/test-cachecontainer-architecture-specification b/test/integration/test-cachecontainer-architecture-specification new file mode 100755 index 0000000..6557468 --- /dev/null +++ b/test/integration/test-cachecontainer-architecture-specification @@ -0,0 +1,123 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'armel' + +#insertinstalledpackage 'xserver-xorg-core' 'amd64' '2:1.7.6-2ubuntu7.10' +insertpackage 'unstable' 'libsame' 'armel,amd64' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'foo' 'all' '1' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Conf libsame (1 unstable [amd64])' aptget -s install libsame +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame:armel +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame:armel (1 unstable [armel]) +Conf libsame:armel (1 unstable [armel])' aptget -s install libsame:armel +testfailureequal 'Reading package lists... +Building dependency tree... +E: Unable to locate package libsame:armhf' aptget -s install libsame:armhf +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Conf libsame (1 unstable [amd64])' aptget -s install libsame:amd64 +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame libsame:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Inst libsame:armel (1 unstable [armel]) +Conf libsame (1 unstable [amd64]) +Conf libsame:armel (1 unstable [armel])' aptget -s install libsame:armel libsame:amd64 +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame libsame:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Inst libsame:armel (1 unstable [armel]) +Conf libsame (1 unstable [amd64]) +Conf libsame:armel (1 unstable [armel])' aptget -s install libsame:* +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Conf libsame (1 unstable [amd64])' aptget -s install libsame:any +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame libsame:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Inst libsame:armel (1 unstable [armel]) +Conf libsame (1 unstable [amd64]) +Conf libsame:armel (1 unstable [armel])' aptget -s install libsame:a* +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Conf libsame (1 unstable [amd64])' aptget -s install libsame:linux-any +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libsame libsame:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libsame (1 unstable [amd64]) +Inst libsame:armel (1 unstable [armel]) +Conf libsame (1 unstable [amd64]) +Conf libsame:armel (1 unstable [armel])' aptget -s install libsame:linux-* +testfailureequal 'Reading package lists... +Building dependency tree... +E: Unable to locate package libsame:windows-any' aptget -s install libsame:windows-any + +testfailureequal 'Reading package lists... +Building dependency tree... +E: Unable to locate package foo:armel' aptget -s install foo:armel +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Conf foo (1 unstable [all])' aptget -s install foo +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Conf foo (1 unstable [all])' aptget -s install foo:all +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Conf foo (1 unstable [all])' aptget -s install foo:amd64 +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Conf foo (1 unstable [all])' aptget -s install foo:native diff --git a/test/integration/test-compressed-indexes b/test/integration/test-compressed-indexes new file mode 100755 index 0000000..858bf11 --- /dev/null +++ b/test/integration/test-compressed-indexes @@ -0,0 +1,180 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configcompression 'ALL' +configarchitecture 'i386' +LOWCOSTEXT='lz4' + +buildsimplenativepackage 'testpkg' 'i386' '1.0' + +buildaptarchive +setupdistsaptarchive +# fake a pdiff setup as apt wouldn't try pdiffs otherwise +find aptarchive -name 'Packages' -o -name 'Sources' | while read file; do + mkdir "${file}.diff" + PATCHINDEX="${file}.diff/Index" + echo 'SHA1-Current: adc83b19e793491b1c6ea0fd8b46cd9f32e592fc 0 +SHA1-History: + adc83b19e793491b1c6ea0fd8b46cd9f32e592fc 33053002 2010-08-18-2013.28 + ecfd1b19e793491b1c6ea123eabdcd9f32e592fc 33053001 2010-08-18-2013.29 +SHA1-Patches: + abc1fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28 + dfe3444ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.29' > $PATCHINDEX +done +generatereleasefiles +signreleasefiles + +testrun() { + local F + msgtest 'Check if all index files are' "${1:-uncompressed}" + if [ "$1" = 'compressed' ]; then + ! test -e rootdir/var/lib/apt/lists/*i386_Packages || F=1 + ! test -e rootdir/var/lib/apt/lists/*_Sources || F=1 + ! test -e rootdir/var/lib/apt/lists/*_Translation-en || F=1 + test -e rootdir/var/lib/apt/lists/*i386_Packages.$LOWCOSTEXT || F=1 + test -e rootdir/var/lib/apt/lists/*_Sources.$LOWCOSTEXT || F=1 + test -e rootdir/var/lib/apt/lists/*_Translation-en.$LOWCOSTEXT || F=1 + # there is no point in trying pdiff if we have compressed indexes + # as we can't patch compressed files (well, we can, but what is the point?) + ! test -e rootdir/var/lib/apt/lists/*diff_Index || F=1 + else + # clear the faked pdiff indexes so the glob below works + rm -f rootdir/var/lib/apt/lists/*diff_Index + test -e rootdir/var/lib/apt/lists/*i386_Packages || F=1 + test -e rootdir/var/lib/apt/lists/*_Sources || F=1 + test -e rootdir/var/lib/apt/lists/*_Translation-en || F=1 + ! test -e rootdir/var/lib/apt/lists/*i386_Packages.* || F=1 + ! test -e rootdir/var/lib/apt/lists/*_Sources.* || F=1 + ! test -e rootdir/var/lib/apt/lists/*_Translation-en.* || F=1 + fi + if [ -n "$F" ]; then + cat rootdir/tmp/testsuccess.output + ls -laR rootdir/var/lib/apt/lists/ + msgfail + else + msgpass + fi + msgtest 'Check if package is downloadable' + cd downloaded + testsuccess --nomsg aptget download testpkg + msgtest 'deb file is present'; testsuccess --nomsg test -f testpkg_1.0_i386.deb + rm -f testpkg_1.0_i386.deb + cd - >/dev/null + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + testpkg +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst testpkg (1.0 unstable [i386]) +Conf testpkg (1.0 unstable [i386])' aptget install testpkg -s -o Debug::pkgAcquire::Auth=0 -o Debug::pkgAcquire::Worker=0 + rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin + testsuccessequal "$GOODSHOW" aptcache show testpkg + testsuccessequal "$GOODSHOW" aptcache show testpkg + rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin + testsuccessequal "$GOODPOLICY" aptcache policy testpkg + testsuccessequal "$GOODPOLICY" aptcache policy testpkg + rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin + testsuccessequal "$GOODSHOWSRC" aptcache showsrc testpkg + testsuccessequal "$GOODSHOWSRC" aptcache showsrc testpkg + aptget clean + msgtest 'Check if the source is aptgetable' + cd downloaded + testsuccess --nomsg aptget source testpkg + testsuccess test -s testpkg_1.0.dsc + testsuccess test -d testpkg-1.0 + rm -rf testpkg-1.0* + cd - >/dev/null + testsuccessequal "$(aptcache show testpkg -o Acquire::Languages=none) +" aptcache dumpavail +} + +echo 'Dir::Log::Planner "/dev/null"; +Debug::pkgAcquire::worker "true"; +debug::pkgAcquire::Auth "true"; +Debug::pkgAcquire::Diffs "true"; +Debug::Acquire::http "true";' > rootdir/etc/apt/apt.conf.d/99debugconf + +testovermethod() { + forcecompressor $2 + + for INDEX in 'false' 'true'; do + rm -rf rootdir/var/lib/apt/lists + echo "Acquire::GzipIndexes \"${INDEX}\";" > rootdir/etc/apt/apt.conf.d/02compressindex + local INDCOMP + if [ "$INDEX" = 'false' -o "$1" = 'cdrom' ]; then + INDCOMP='uncompressed' + else + INDCOMP='compressed' + echo 'APT::Compressor::lz4::Name "lz4";' >> rootdir/etc/apt/apt.conf.d/02compressindex + fi + + msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX" + if [ "${1}" = 'cdrom' ]; then + testsuccess aptcdrom add </dev/null + fi + testsuccess aptget update + testrun "$INDCOMP" + + if [ "${1}" != 'cdrom' ]; then + testsuccess aptget update -o Acquire::Pdiffs=1 + msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX (update unchanged with pdiffs)" + testrun "$INDCOMP" + + testsuccess aptget update -o Acquire::Pdiffs=0 + msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX (update unchanged without pdiffs)" + testrun "$INDCOMP" + fi + + rm rootdir/etc/apt/apt.conf.d/02compressindex + done +} + +testsuccess aptget update +GOODSHOW="$(aptcache show testpkg) +" +test $(echo "$GOODSHOW" | grep -e '^Package: testpkg' -e '^Version: 1.0' -e '^Architecture: i386' | wc -l) -eq 3 || msgdie 'show is broken' +testsuccessequal "$GOODSHOW" aptcache show testpkg +GOODSHOWSRC="$(aptcache showsrc testpkg) +" +test $(echo "$GOODSHOWSRC" | grep -e '^Package: testpkg' -e '^Format: 3.0 (native)' -e '^Checksums-Sha256:' | wc -l) -eq 3 || msgdie 'showsrc is broken' +testsuccessequal "$GOODSHOWSRC" aptcache showsrc testpkg +GOODPOLICY="$(aptcache policy testpkg)" +test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 file:/' | wc -l) -eq 4 || msgdie 'file policy is broken' +testsuccessequal "$GOODPOLICY" aptcache policy testpkg +forallsupportedcompressors testovermethod 'file' + +rewritesourceslist "copy://${TMPWORKINGDIRECTORY}/aptarchive" +rm -rf rootdir/var/lib/apt/lists +testsuccess aptget update +GOODPOLICY="$(aptcache policy testpkg)" +test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 copy:/' | wc -l) -eq 4 || msgdie 'copy policy is broken' +testsuccessequal "$GOODPOLICY" aptcache policy testpkg +forallsupportedcompressors testovermethod 'copy' + +changetowebserver +rm -rf rootdir/var/lib/apt/lists +testsuccess aptget update +GOODPOLICY="$(aptcache policy testpkg)" +test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 http://' | wc -l) -eq 4 || msgdie 'http policy is broken' +testsuccessequal "$GOODPOLICY" aptcache policy testpkg +forallsupportedcompressors testovermethod 'http' + +changetohttpswebserver +rm -rf rootdir/var/lib/apt/lists +testsuccess aptget update +GOODPOLICY="$(aptcache policy testpkg)" +test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 https://' | wc -l) -eq 4 || msgdie 'https policy is broken' +testsuccessequal "$GOODPOLICY" aptcache policy testpkg +forallsupportedcompressors testovermethod 'https' + +changetocdrom 'Debian APT Testdisk 0.8.15' +rm -rf rootdir/var/lib/apt/lists +testsuccess aptcdrom add </dev/null +GOODPOLICY="$(aptcache policy testpkg)" +test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 cdrom://' | wc -l) -eq 4 || msgdie 'cdrom policy is broken' +testsuccessequal "$GOODPOLICY" aptcache policy testpkg +forallsupportedcompressors testovermethod 'cdrom' diff --git a/test/integration/test-conflicts-loop b/test/integration/test-conflicts-loop new file mode 100755 index 0000000..5b6e446 --- /dev/null +++ b/test/integration/test-conflicts-loop @@ -0,0 +1,33 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertinstalledpackage 'openjdk-6-jre' 'i386' '6b16-1.8-0ubuntu1' +insertpackage 'unstable' 'openjdk-6-jre' 'i386' '6b20-1.9.8-0ubuntu1~10.04.1' 'Conflicts: openjdk-6-jre-headless (<< 6b17~pre3-1), openjdk-6-jre-lib (<< 6b17~pre3-1)' +insertinstalledpackage 'openjdk-6-jre-lib' 'i386' '6b16-1.8-0ubuntu1' +insertpackage 'unstable' 'openjdk-6-jre-lib' 'i386' '6b20-1.9.8-0ubuntu1~10.04.1' 'Conflicts: openjdk-6-jre (<< 6b17~pre3-1), openjdk-6-jre-headless (<< 6b17~pre3-1)' +insertinstalledpackage 'openjdk-6-jre-headless' 'i386' '6b16-1.8-0ubuntu1' +insertpackage 'unstable' 'openjdk-6-jre-headless' 'i386' '6b20-1.9.8-0ubuntu1~10.04.1' 'Conflicts: openjdk-6-jre (<< 6b17~pre3-1), openjdk-6-jre-lib (<< 6b17~pre3-1)' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib +3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Remv openjdk-6-jre-headless [6b16-1.8-0ubuntu1] +Remv openjdk-6-jre-lib [6b16-1.8-0ubuntu1] +Inst openjdk-6-jre [6b16-1.8-0ubuntu1] (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) +Inst openjdk-6-jre-lib [6b16-1.8-0ubuntu1] (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) +Conf openjdk-6-jre-lib (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) +Conf openjdk-6-jre (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) +Inst openjdk-6-jre-headless [6b16-1.8-0ubuntu1] (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386]) +Conf openjdk-6-jre-headless (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386])' aptget dist-upgrade -s -o APT::Immediate-Configure-All=true + +testsuccess aptget dist-upgrade -s diff --git a/test/integration/test-conflicts-real-multiarch-same b/test/integration/test-conflicts-real-multiarch-same new file mode 100755 index 0000000..73f7b9a --- /dev/null +++ b/test/integration/test-conflicts-real-multiarch-same @@ -0,0 +1,50 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable' 'virtual-provider' 'amd64,i386' '2' 'Provides: virtual +Conflicts: virtual +Multi-Arch: same' +insertpackage 'unstable' 'real' 'amd64,i386' '2' 'Conflicts: real +Multi-Arch: same' +insertpackage 'unstable' 'real-provider' 'amd64,i386' '2' 'Provides: real-provider +Conflicts: real-provider +Multi-Arch: same' +setupaptarchive + +testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'virtual-provider' instead of 'virtual' +Note, selecting 'virtual-provider:i386' instead of 'virtual:i386' +The following NEW packages will be installed: + virtual-provider virtual-provider:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst virtual-provider (2 unstable [amd64]) +Inst virtual-provider:i386 (2 unstable [i386]) +Conf virtual-provider (2 unstable [amd64]) +Conf virtual-provider:i386 (2 unstable [i386])" aptget install virtual:* -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + real real:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst real (2 unstable [amd64]) +Inst real:i386 (2 unstable [i386]) +Conf real (2 unstable [amd64]) +Conf real:i386 (2 unstable [i386])' aptget install real:* -s + +# ensure that we are not confused by the provides +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + real-provider real-provider:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst real-provider (2 unstable [amd64]) +Inst real-provider:i386 (2 unstable [i386]) +Conf real-provider (2 unstable [amd64]) +Conf real-provider:i386 (2 unstable [i386])' aptget install real-provider:* -s diff --git a/test/integration/test-crossgrades b/test/integration/test-crossgrades new file mode 100755 index 0000000..6398e7e --- /dev/null +++ b/test/integration/test-crossgrades @@ -0,0 +1,82 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' 'amd64' 'armel' +configdpkgnoopchroot + +buildsimplenativepackage 'unrelated' 'amd64' '1' 'stable' +buildsimplenativepackage 'crosser' 'i386,armel' '1' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'crosser' 'amd64' '2' 'unstable' +buildsimplenativepackage 'crosser' 'i386,armel' '3' 'experimental' 'Multi-Arch: same' +setupaptarchive + +singleinstance() { + testsuccess apt install crosser:i386=1 unrelated:amd64 -y --planner $1 + testdpkginstalled 'crosser:i386' 'unrelated' + + testsuccess apt install crosser:amd64 -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 --purge --planner $1 + cp -a rootdir/tmp/testsuccess.output crosser.output + testfailure grep -- '--remove.*crosser.*' crosser.output + testfailure grep -- '--purge' crosser.output + testsuccess apt install crosser:amd64 unrelated:amd64- -y -o Dpkg::Use-Pty=0 --purge -o Debug::pkgDPkgProgressReporting=1 --planner $1 + testdpkgnotinstalled 'crosser:i386' 'unrelated' + testdpkginstalled 'crosser:amd64' + + testsuccess apt install crosser:armel=3 -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 --purge --planner $1 + cp -a rootdir/tmp/testsuccess.output crosser.output + testsuccess grep -- '--remove.*crosser.*' crosser.output + testsuccess grep -- '--purge' crosser.output + testsuccess apt install crosser:armel=3 -y -o Debug::pkgDPkgProgressReporting=1 -o Dpkg::Use-Pty=0 --purge --planner $1 + testdpkgnotinstalled 'crosser:i386' 'crosser:amd64' 'unrelated' + testdpkginstalled 'crosser:armel' + + testsuccess apt install crosser=1 -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 --purge --planner $1 --allow-downgrades + cp -a rootdir/tmp/testsuccess.output crosser.output + testsuccess grep -- '--remove.*crosser.*' crosser.output + testsuccess grep -- '--purge' crosser.output + testsuccess apt install crosser=1 -y -o Debug::pkgDPkgProgressReporting=1 -o Dpkg::Use-Pty=0 --purge --planner $1 --allow-downgrades + testdpkgnotinstalled 'crosser:armel' 'crosser:amd64' 'unrelated' + testdpkginstalled 'crosser:i386' + + testsuccess apt purge crosser:i386 -y --planner $1 + testdpkgnotinstalled 'crosser:i386' +} +singleinstance 'internal' +singleinstance 'apt' + +multiinstance() { + testsuccess apt install crosser:i386=1 crosser:armel=1 unrelated:amd64 -y --planner $1 + testdpkginstalled 'crosser:i386' 'crosser:armel' 'unrelated' + + testsuccess apt install crosser:amd64 -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 --purge --planner $1 + cp -a rootdir/tmp/testsuccess.output crosser.output + testsuccess grep -- '--remove.*crosser.*' crosser.output + testsuccess grep -- '--purge' crosser.output + testsuccess apt install crosser:amd64 unrelated:amd64- -y -o Dpkg::Use-Pty=0 --purge -o Debug::pkgDPkgProgressReporting=1 --planner $1 + testdpkgnotinstalled 'crosser:i386' 'crosser:armel' 'unrelated' + testdpkginstalled 'crosser:amd64' + + testsuccess apt install crosser:i386 crosser:armel -t experimental -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 --purge --planner $1 + cp -a rootdir/tmp/testsuccess.output crosser.output + testsuccess grep -- '--remove.*crosser.*' crosser.output + testsuccess grep -- '--purge' crosser.output + testsuccess apt install crosser:i386 crosser:armel -t experimental -y -o Debug::pkgDPkgProgressReporting=1 -o Dpkg::Use-Pty=0 --purge --planner $1 + testdpkgnotinstalled 'crosser:amd64' 'unrelated' + testdpkginstalled 'crosser:i386' 'crosser:armel' + + testsuccess apt install crosser:i386- crosser:armel=1 -y -o Debug::pkgDpkgPm=1 -o Dpkg::Use-Pty=0 --purge --planner $1 --allow-downgrades + cp -a rootdir/tmp/testsuccess.output crosser.output + testsuccess grep -- '--remove.*crosser.*' crosser.output + testsuccess grep -- '--purge' crosser.output + testsuccess apt install crosser:i386- crosser:armel=1 -y -o Debug::pkgDPkgProgressReporting=1 -o Dpkg::Use-Pty=0 --purge --planner $1 --allow-downgrades + testdpkgnotinstalled 'crosser:amd64' 'crosser:i386' 'unrelated' + testdpkginstalled 'crosser:armel' + + testsuccess apt purge crosser:armel -y --planner $1 -o Debug::pkgDPkgProgressReporting=1 + testdpkgnotinstalled 'crosser:i386' 'crosser:armel' 'crosser:amd64' 'unrelated' +} +multiinstance 'internal' diff --git a/test/integration/test-cve-2013-1051-InRelease-parsing b/test/integration/test-cve-2013-1051-InRelease-parsing new file mode 100755 index 0000000..1f0cbda --- /dev/null +++ b/test/integration/test-cve-2013-1051-InRelease-parsing @@ -0,0 +1,71 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertpackage 'stable' 'good-pkg' 'all' '1.0' + +setupaptarchive + +changetowebserver +ARCHIVE="http://localhost:${APTHTTPPORT}" +msgtest 'Initial apt-get update should work with' 'InRelease' +testsuccess --nomsg aptget update + +# check that the setup is correct +testsuccessequal "good-pkg: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 ${ARCHIVE} stable/main all Packages" aptcache policy good-pkg + +# now exchange to the Packages file, note that this could be +# done via MITM too +insertpackage 'stable' 'bad-mitm' 'all' '1.0' + +# this builds compressed files and a new (unsigned) Release +buildaptarchivefromfiles '+1hour' + +# add a space into the BEGIN PGP SIGNATURE PART/END PGP SIGNATURE part +# to trick apt - this is still legal to gpg(v) +sed -i '/^-----BEGIN PGP SIGNATURE-----/,/^-----END PGP SIGNATURE-----/ s/^$/ /g' aptarchive/dists/stable/InRelease + +# we append the (evil unsigned) Release file to the (good signed) InRelease +cat aptarchive/dists/stable/Release >> aptarchive/dists/stable/InRelease +touch -d '+1hour' aptarchive/dists/stable/InRelease + +# ensure the update doesn't load bad data as good data +# Note that we will pick up the InRelease itself as we download no other +# indexes which would trigger a hashsum mismatch, but we ignore the 'bad' +# part of the InRelease +listcurrentlistsdirectory | sed '/_InRelease/ d' > listsdir.lst +msgtest 'apt-get update should ignore unsigned data in the' 'InRelease' +testwarningequal "Get:1 http://localhost:${APTHTTPPORT} stable InRelease [$(stat -c%s aptarchive/dists/stable/InRelease) B] +Err:1 http://localhost:${APTHTTPPORT} stable InRelease + Splitting up ${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial/localhost:${APTHTTPPORT}_dists_stable_InRelease into data and signature failed +Reading package lists... +W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://localhost:${APTHTTPPORT} stable InRelease: Splitting up ${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial/localhost:${APTHTTPPORT}_dists_stable_InRelease into data and signature failed +W: Failed to fetch http://localhost:${APTHTTPPORT}/dists/stable/InRelease Splitting up ${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial/localhost:${APTHTTPPORT}_dists_stable_InRelease into data and signature failed +W: Some index files failed to download. They have been ignored, or old ones used instead." --nomsg aptget update +testfileequal './listsdir.lst' "$(listcurrentlistsdirectory | sed '/_InRelease/ d')" + +# ensure there is no package +testfailureequal 'Reading package lists... +Building dependency tree... +E: Unable to locate package bad-mitm' aptget install bad-mitm -s + +# and verify that its not picked up +testsuccessequal 'N: Unable to locate package bad-mitm' aptcache policy bad-mitm + +# and that the right one is used +testsuccessequal "good-pkg: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 ${ARCHIVE} stable/main all Packages" aptcache policy good-pkg diff --git a/test/integration/test-cve-2018-0501-mirror-alternatives b/test/integration/test-cve-2018-0501-mirror-alternatives new file mode 100755 index 0000000..f154547 --- /dev/null +++ b/test/integration/test-cve-2018-0501-mirror-alternatives @@ -0,0 +1,31 @@ +#!/bin/sh +set -e +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +buildsimplenativepackage 'foo' 'all' '1' 'stable' +setupaptarchive --no-update +changetohttpswebserver + +# User has mirror method configured in apt >= 1.6~alpha6 & +# Eve has enough MITM control over the network to +# a) have the mirror file include at least two mirrors and +# b) can send her bad InRelease files for both mirrors +sed -i -e 's# https:# mirror+https:#' -e 's#/ stable#/mirror.txt stable#' rootdir/etc/apt/sources.list.d/*-stable-* +echo "http://localhost:${APTHTTPPORT} +https://localhost:${APTHTTPSPORT}" > aptarchive/mirror.txt + +# real Eve would do something worse… +sed -i "/^Date: / a\ +Evil: yes" $(find ./aptarchive -name 'Release' -o -name 'InRelease') + +# progress display shows that the InRelease file was bad, +# but it is used anyhow as the bad file causes a fallback to +# a request to the second mirror which completes successful +# causing apt to believe the verify completed successfully… +testfailure apt update +testfailure grep '^Evil:' rootdir/var/lib/apt/lists/*Release +testfailure apt show foo diff --git a/test/integration/test-cve-2019-3462-Release.gpg-payload b/test/integration/test-cve-2019-3462-Release.gpg-payload new file mode 100755 index 0000000..fd0f967 --- /dev/null +++ b/test/integration/test-cve-2019-3462-Release.gpg-payload @@ -0,0 +1,43 @@ +#!/bin/sh +set -e + +# This is not covered by the CVE and harmless by itself, but used in +# the exploit and while harmless it is also pointless to allow it + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +export APT_DONT_SIGN='InRelease' + +insertpackage 'unstable' 'foo' 'all' '1' +setupaptarchive +rm -rf rootdir/var/lib/apt/lists + +verify() { + testfailure apt update + testsuccess grep '^ Detached signature file' rootdir/tmp/testfailure.output + testfailure apt show foo +} + +msgmsg 'Payload after detached signature' +find aptarchive -name 'Release.gpg' | while read FILE; do + cp -a "$FILE" "${FILE}.bak" + echo "evil payload" >> "$FILE" +done +verify + +msgmsg 'Payload in-between detached signatures' +find aptarchive -name 'Release.gpg' | while read FILE; do + cat "${FILE}.bak" >> "$FILE" +done +verify + +msgmsg 'Payload before detached signature' +find aptarchive -name 'Release.gpg' | while read FILE; do + echo "evil payload" > "$FILE" + cat "${FILE}.bak" >> "$FILE" +done +verify diff --git a/test/integration/test-cve-2019-3462-dequote-injection b/test/integration/test-cve-2019-3462-dequote-injection new file mode 100755 index 0000000..a1adec6 --- /dev/null +++ b/test/integration/test-cve-2019-3462-dequote-injection @@ -0,0 +1,66 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +# build two uncompressed packages +buildsimplenativepackage 'alpha' 'all' '1' 'unstable' '' '' 'section' 'optional' '' 'none' + +setupaptarchive --no-update +ORIGINAL_SHA256=$(sha256sum aptarchive/pool/alpha_1_all.deb | awk '{print $1}') +ORIGINAL_SIZE=$(wc -c aptarchive/pool/alpha_1_all.deb | awk '{print $1}') +SHA256="DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF" +changetowebserver + +webserverconfig aptwebserver::redirect::replace::alpha_1_all.deb "beeta_1_all.deb%250a%250a201%2520URI%2520Done%250aURI:%2520http://localhost:${APTHTTPPORT}/pool/beeta_1_all.deb%250aFilename:%2520${TMPWORKINGDIRECTORY}/rootdir/var/cache/apt/archives/partial/alpha_1_all.deb%250aSize:%252020672%250aLast-Modified:%2520Fri,%252018%2520Jan%25202019%252009:52:02%2520+0000%250aSHA256-Hash:%2520${SHA256}%250aChecksum-FileSize-Hash:%252012345%250a%250a%0a" + + +testsuccess apt update -o debug::http=1 -o debug::pkgacquire::worker=1 + + +testfailureequal "Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + alpha +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Need to get 20.7 kB of archives. +After this operation, 11.3 kB of additional disk space will be used. +Err:1 http://localhost:${APTHTTPPORT} unstable/main all alpha all 1 + SECURITY: URL redirect target contains control characters, rejecting. +E: Failed to fetch http://localhost:${APTHTTPPORT}/pool/alpha_1_all.deb SECURITY: URL redirect target contains control characters, rejecting. +E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?" aptget install alpha + + + +# For reference, the following is the original reproducer/bug. It has +# been disabled using exit 0, as it will fail in fixed versions. +exit 0 + +testfailureequal "Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + alpha +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Need to get 20.7 kB of archives. +After this operation, 11.3 kB of additional disk space will be used. +Err:1 http://localhost:${APTHTTPPORT} unstable/main all alpha all 1 + Hash Sum mismatch + Hashes of expected file: + - SHA256:$ORIGINAL_SHA256 + - Filesize:$ORIGINAL_SIZE [weak] + Hashes of received file: + - SHA256:DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF + - Filesize:12345 [weak] + Last modification reported: Fri, 18 Jan 2019 09:52:02 +0000 +E: Failed to fetch http://localhost:${APTHTTPPORT}/pool/beeta_1_all.deb Hash Sum mismatch + Hashes of expected file: + - SHA256:$ORIGINAL_SHA256 + - Filesize:$ORIGINAL_SIZE [weak] + Hashes of received file: + - SHA256:DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF + - Filesize:12345 [weak] + Last modification reported: Fri, 18 Jan 2019 09:52:02 +0000 +E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?" aptget install alpha diff --git a/test/integration/test-cve-2020-27350 b/test/integration/test-cve-2020-27350 new file mode 100755 index 0000000..a32bf95 --- /dev/null +++ b/test/integration/test-cve-2020-27350 @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "amd64" + +${APTTESTHELPERSBINDIR}/createdeb-cve-2020-27350 crash crash.deb +testequal "E: Invalid archive member header" runapt ${APTTESTHELPERSBINDIR}/testdeb ./crash.deb + +${APTTESTHELPERSBINDIR}/createdeb-cve-2020-27350 loop loop.deb +testequal "E: Invalid archive member header" runapt ${APTTESTHELPERSBINDIR}/testdeb ./loop.deb + +${APTTESTHELPERSBINDIR}/createdeb-cve-2020-27350 long-name long-name.deb +testequal "E: Long name to large: 67108865 bytes > 1048576 bytes" runapt ${APTTESTHELPERSBINDIR}/extract-control long-name.deb control + +${APTTESTHELPERSBINDIR}/createdeb-cve-2020-27350 long-link long-link.deb +testequal "E: Long name to large: 67108865 bytes > 1048576 bytes" runapt ${APTTESTHELPERSBINDIR}/extract-control long-link.deb control + +${APTTESTHELPERSBINDIR}/createdeb-cve-2020-27350 long-control long-control.deb +testequal "E: Control file too large: 67108865 > 67108864 bytes" runapt ${APTTESTHELPERSBINDIR}/extract-control long-control.deb control + +${APTTESTHELPERSBINDIR}/createdeb-cve-2020-27350 too-long-control too-long-control.deb +testequal "E: Tar member too large: $((128 * 1024 * 1024 * 1024 + 1)) > $((128 * 1024 * 1024 * 1024)) bytes" runapt ${APTTESTHELPERSBINDIR}/extract-control too-long-control.deb control diff --git a/test/integration/test-different-methods-for-same-source b/test/integration/test-different-methods-for-same-source new file mode 100755 index 0000000..791a84c --- /dev/null +++ b/test/integration/test-different-methods-for-same-source @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'stable' 'foo' 'all' '1' +insertsource 'stable' 'foo' 'all' '1' +setupaptarchive --no-update + +changetowebserver +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "http://localhost:${APTHTTPPORT}/" + +echo 'Dir::Bin::Methods::http-ng "http";' > rootdir/etc/apt/apt.conf.d/99add-http-ng-method +sed -i -e 's# http:# http-ng:#' $(find rootdir/etc/apt/sources.list.d -name '*-deb-src.list') + +testsuccess apt update -o Debug::Acquire::http-ng=1 +cp rootdir/tmp/testsuccess.output update.log +# all requests are folded into the first Release file +testsuccess grep ' http-ng://' update.log +testfailure grep ' http://' update.log +# see if method-specific debug was enabled +testsuccess grep '^Answer for: http-ng:' update.log + +rm -rf rootdir/var/lib/apt/lists +sed -i -e "s#:${APTHTTPPORT}/#:${APTHTTPPORT}/redirectme#" rootdir/etc/apt/sources.list.d/* +testsuccess apt update -o Debug::Acquire::http-ng=1 +cp rootdir/tmp/testsuccess.output update.log +# all requests are folded into the first Release file +testsuccess grep ' http-ng://' update.log +testfailure grep '^[^L].* http://' update.log +# see if method-specific debug was enabled +testsuccess grep '^Answer for: http-ng:' update.log diff --git a/test/integration/test-disappearing-packages b/test/integration/test-disappearing-packages new file mode 100755 index 0000000..f3fed04 --- /dev/null +++ b/test/integration/test-disappearing-packages @@ -0,0 +1,92 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'old-pkg' 'amd64' '1' 'stable' + +setupsimplenativepackage 'new-pkg' 'amd64' '2' 'unstable' 'Provides: old-pkg +Replaces: old-pkg +Conflicts: old-pkg (<< 2)' +BUILDDIR='incoming/new-pkg-2' +echo '/usr/share/doc/new-pkg /usr/share/doc/old-pkg' > "${BUILDDIR}/debian/new-pkg.links" +buildpackage "$BUILDDIR" 'unstable' 'main' +rm -rf "$BUILDDIR" + +setupsimplenativepackage 'old-pkg' 'all' '2' 'unstable' 'Depends: new-pkg' +BUILDDIR='incoming/old-pkg-2' +echo '/usr/share/doc/new-pkg /usr/share/doc/old-pkg' > "${BUILDDIR}/debian/old-pkg.links" +echo " +override_dh_link: + rm -rf debian/old-pkg/usr/share/doc/old-pkg/ + dh_link" >> "${BUILDDIR}/debian/rules" +buildpackage "$BUILDDIR" 'unstable' 'main' +rm -rf "$BUILDDIR" + +setupsimplenativepackage 'super-new-pkg' 'i386' '3' 'experimental' 'Provides: new-pkg +Replaces: new-pkg +Conflicts: new-pkg (<< 3)' +BUILDDIR='incoming/super-new-pkg-3' +echo '/usr/share/doc/super-new-pkg /usr/share/doc/old-pkg' > "${BUILDDIR}/debian/super-new-pkg.links" +echo '/usr/share/doc/super-new-pkg /usr/share/doc/new-pkg' >> "${BUILDDIR}/debian/super-new-pkg.links" +buildpackage "$BUILDDIR" 'experimental' 'main' +rm -rf "$BUILDDIR" + +setupsimplenativepackage 'new-pkg' 'all' '3' 'experimental' 'Depends: super-new-pkg' +BUILDDIR='incoming/new-pkg-3' +echo '/usr/share/doc/super-new-pkg /usr/share/doc/old-pkg' > "${BUILDDIR}/debian/new-pkg.links" +echo '/usr/share/doc/super-new-pkg /usr/share/doc/new-pkg' >> "${BUILDDIR}/debian/new-pkg.links" +echo " +override_dh_link: + rm -rf debian/new-pkg/usr/share/doc/new-pkg/ + dh_link" >> "${BUILDDIR}/debian/rules" +buildpackage "$BUILDDIR" 'experimental' 'main' +rm -rf "$BUILDDIR" + +setupaptarchive + +msgmsg 'Let a package disappear' 'old-pkg' +testsuccess aptget install old-pkg=1 --trivial-only +testmarkedauto # old-pkg is manual installed +testsuccess aptget dist-upgrade -y +testdpkgnotinstalled old-pkg +cp rootdir/tmp/testsuccess.output disappear.output +testsuccessequal 'The following package disappeared from your system as +all files have been overwritten by other packages: + old-pkg +Note: This is done automatically and on purpose by dpkg.' tail -n 4 disappear.output + +sed -i rootdir/var/log/apt/history.log -e '/^Commandline: / d' -e '/^Start-Date: / d' -e '/^End-Date: / d' -e "s#:$(getarchitecture 'native') #:native #" +if [ -n "$SUDO_USER" ] && [ "$(id -u "$SUDO_USER")" -gt 0 ]; then + testfileequal 'rootdir/var/log/apt/history.log' " +Requested-By: $SUDO_USER ($(id -u "$SUDO_USER")) +Install: old-pkg:native (1) + +Requested-By: $SUDO_USER ($(id -u "$SUDO_USER")) +Install: new-pkg:native (2, automatic) +Upgrade: old-pkg:native (1, 2) +Disappeared: old-pkg (1)" +else + testfileequal 'rootdir/var/log/apt/history.log' ' +Install: old-pkg:native (1) + +Install: new-pkg:native (2, automatic) +Upgrade: old-pkg:native (1, 2) +Disappeared: old-pkg (1)' +fi + +testmarkedauto # new-pkg should have get the manual flag from old-pkg + +msgmsg 'Let a package disappear which let the previous disappear' 'new-pkg' +testsuccess aptget dist-upgrade -y -t experimental +testdpkgnotinstalled new-pkg +cp rootdir/tmp/testsuccess.output disappear.output +testsuccessequal 'The following package disappeared from your system as +all files have been overwritten by other packages: + new-pkg +Note: This is done automatically and on purpose by dpkg.' tail -n 4 disappear.output + +testmarkedauto diff --git a/test/integration/test-dpkg-assert-multi-arch b/test/integration/test-dpkg-assert-multi-arch new file mode 100755 index 0000000..a99f320 --- /dev/null +++ b/test/integration/test-dpkg-assert-multi-arch @@ -0,0 +1,104 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildsimplenativepackage 'native-pkg' 'amd64' '1.0' 'stable' +buildsimplenativepackage 'foreign-pkg' 'i386' '0.5' 'stable' 'Multi-Arch: foreign' +buildsimplenativepackage 'same-lib' 'amd64,i386' '0.5' 'stable' 'Multi-Arch: same' +buildsimplenativepackage 'all-pkg' 'all' '2.0' 'stable' +buildsimplenativepackage 'all-foreign-pkg' 'all' '2.0' 'stable' 'Multi-Arch: foreign' + +setupaptarchive + +testqualifier() { + msgtest 'Test with' $1 'for correct qualifier mode' $2 + #aptget install $1 -qq -o Debug::pkgDPkgPM=1 || true + aptget install $1 -qq -o Debug::pkgDPkgPM=1 -o Dpkg::ExplicitLastConfigure=1 -o PackageManager::Configure=all > testqualifier.output 2>&1 || true + GIVEN="$(grep -v -- '--unpack' testqualifier.output | sed -ne 's/^.*--[rpc][^ ]* \([^ ]*\).*$/\1/p')" + if [ "$GIVEN" = "$2" ]; then + msgpass + else + cat >&2 testqualifier.output + echo >&2 + echo >&2 "$GIVEN" + msgfail + fi +} + +msgmsg 'non-multiarch or "ubuntus" old multiarchified dpkg' +echo 'Dir::Bin::dpkg "./dpkg-wrapper";' > rootdir/etc/apt/apt.conf.d/99dpkgwrapper +cat > ./dpkg-wrapper <<EOF +#! /bin/sh +if echo "\$*" | grep -q -- "--assert-multi-arch"; then + echo >&2 'dpkg: Fehler: unbekannte Option --assert-multi-arch' + echo >&1 'dpkg: Info: unbekannte Option --assert-multi-arch' + exit 2 +fi +exec "\$@" +EOF +chmod +x ./dpkg-wrapper + +testqualifier 'native-pkg' 'native-pkg' +testqualifier 'native-pkg:amd64' 'native-pkg' +testqualifier 'foreign-pkg' 'foreign-pkg:i386' +testqualifier 'foreign-pkg:i386' 'foreign-pkg:i386' +testqualifier 'same-lib' 'same-lib' +testqualifier 'same-lib:amd64' 'same-lib' +testqualifier 'same-lib:i386' 'same-lib:i386' +testqualifier 'all-pkg' 'all-pkg' +testqualifier 'all-pkg:amd64' 'all-pkg' +testqualifier 'all-foreign-pkg' 'all-foreign-pkg' +testqualifier 'all-foreign-pkg:amd64' 'all-foreign-pkg' +insertinstalledpackage 'all-pkg' 'amd64' '1.0' +insertinstalledpackage 'all-foreign-pkg' 'amd64' '1.0' 'Multi-Arch: foreign' +testqualifier 'all-pkg' 'all-pkg' +testqualifier 'all-pkg:amd64' 'all-pkg' +testqualifier 'all-foreign-pkg' 'all-foreign-pkg' +testqualifier 'all-foreign-pkg:amd64' 'all-foreign-pkg' +insertinstalledpackage 'always-all-pkg' 'all' '1.0' +insertinstalledpackage 'always-all-foreign-pkg' 'all' '1.0' 'Multi-Arch: foreign' +testqualifier 'all-pkg-' 'all-pkg' +testqualifier 'all-foreign-pkg-' 'all-foreign-pkg' +testqualifier 'always-all-pkg-' 'always-all-pkg' +testqualifier 'always-all-foreign-pkg-' 'always-all-foreign-pkg' + +msgmsg 'multiarch dpkg (new interface version)' +rm rootdir/var/lib/dpkg/status +touch rootdir/var/lib/dpkg/status +echo 'Dir::Bin::dpkg "./dpkg-wrapper";' > rootdir/etc/apt/apt.conf.d/99dpkgwrapper +cat > ./dpkg-wrapper <<EOF +#! /bin/sh +if echo "\$*" | grep -q -- "--assert-multi-arch"; then + exit 0 +fi +exec "\$@" +EOF +chmod +x ./dpkg-wrapper + +testqualifier 'native-pkg' 'native-pkg:amd64' +testqualifier 'native-pkg:amd64' 'native-pkg:amd64' +testqualifier 'foreign-pkg' 'foreign-pkg:i386' +testqualifier 'foreign-pkg:i386' 'foreign-pkg:i386' +testqualifier 'same-lib' 'same-lib:amd64' +testqualifier 'same-lib:amd64' 'same-lib:amd64' +testqualifier 'same-lib:i386' 'same-lib:i386' +testqualifier 'all-pkg' 'all-pkg:all' +testqualifier 'all-pkg:amd64' 'all-pkg:all' +testqualifier 'all-foreign-pkg' 'all-foreign-pkg:all' +testqualifier 'all-foreign-pkg:amd64' 'all-foreign-pkg:all' +insertinstalledpackage 'all-pkg' 'amd64' '1.0' +insertinstalledpackage 'all-foreign-pkg' 'amd64' '1.0' 'Multi-Arch: foreign' +testqualifier 'all-pkg' 'all-pkg:all' +testqualifier 'all-pkg:amd64' 'all-pkg:all' +testqualifier 'all-foreign-pkg' 'all-foreign-pkg:all' +testqualifier 'all-foreign-pkg:amd64' 'all-foreign-pkg:all' +insertinstalledpackage 'always-all-pkg' 'all' '1.0' +insertinstalledpackage 'always-all-foreign-pkg' 'all' '1.0' 'Multi-Arch: foreign' +testqualifier 'all-pkg-' 'all-pkg:amd64' +testqualifier 'all-foreign-pkg-' 'all-foreign-pkg:amd64' +testqualifier 'always-all-pkg-' 'always-all-pkg:all' +testqualifier 'always-all-foreign-pkg-' 'always-all-foreign-pkg:all' diff --git a/test/integration/test-dpkg-normalization b/test/integration/test-dpkg-normalization new file mode 100755 index 0000000..cfcb90d --- /dev/null +++ b/test/integration/test-dpkg-normalization @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'spaces' 'i386' '1.0' 'Depends: spaces (= 1.0)' +insertpackage 'unstable' 'spaces' 'i386' '1.0' 'Depends: spaces (= 1.0)' +insertpackage 'unstable' 'lessequal' 'i386' '1.0' 'Depends: spaces (>= 1.0)' +insertpackage 'unstable' 'lessequal' 'i386' '1.0' 'Depends: spaces (> 1.0)' +insertpackage 'unstable' 'zero-epoch' 'i386' '1.0' 'Depends: spaces (< 0:1.0.0)' +insertpackage 'unstable' 'zero-epoch' 'i386' '1.0' 'Depends: spaces (< 1.0.0)' +insertpackage 'unstable' 'zero-epoch' 'i386' '0:1.0' 'Depends: spaces (< 0:1.0.0)' + +setupaptarchive + +testsuccessequal "spaces: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages" aptcache policy spaces + +testsuccessequal "lessequal: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages" aptcache policy lessequal + + + +testsuccessequal "zero-epoch: + Installed: (none) + Candidate: 1.0 + Version table: + 1.0 500 + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages + 500 file:$TMPWORKINGDIRECTORY/aptarchive unstable/main i386 Packages" aptcache policy zero-epoch diff --git a/test/integration/test-dpkg-path b/test/integration/test-dpkg-path new file mode 100755 index 0000000..b17b594 --- /dev/null +++ b/test/integration/test-dpkg-path @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' +configdpkgnoopchroot + +# create a bunch of test pkgs +createtestpkg() { + setupsimplenativepackage "testpkg-$1" 'native' '1.0' 'unstable' + BUILDDIR="incoming/testpkg-$1-1.0" + echo '#!/bin/sh +echo PATH=$PATH' > "${BUILDDIR}/debian/preinst" + buildpackage "$BUILDDIR" 'unstable' 'main' 'native' + rm -rf "$BUILDDIR" +} + +createtestpkg 'one' +createtestpkg 'two' + +setupaptarchive + + +# Inherit from environment +testsuccess aptget install testpkg-one -y -o DPkg::Path="" +cp rootdir/tmp/testsuccess.output apt.log +testsuccess grep "PATH=$PATH" apt.log + +# Set a custom value +testsuccess aptget install testpkg-two -y -o DPkg::Path="foobar:$PATH" +cp rootdir/tmp/testsuccess.output apt.log +testsuccess grep "PATH=foobar:$PATH" apt.log diff --git a/test/integration/test-essential-force-loopbreak b/test/integration/test-essential-force-loopbreak new file mode 100755 index 0000000..f585e9c --- /dev/null +++ b/test/integration/test-essential-force-loopbreak @@ -0,0 +1,54 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +insertinstalledpackage 'sysvinit' 'native' '1' 'Essential: yes' + +buildsimplenativepackage 'sysvinit' 'native' '2' 'sid' 'Pre-Depends: sysvinit-core | systemd-sysv +Essential: yes' +buildsimplenativepackage 'sysvinit-core' 'native' '2' 'sid' + +buildsimplenativepackage 'systemd-sysv' 'native' '2~conflict' 'sid-conflict' 'Conflicts: sysvinit (<< 2) +Breaks: sysvinit-core' + +buildsimplenativepackage 'systemd-sysv' 'native' '2~break' 'sid-break' 'Breaks: sysvinit (<< 2), sysvinit-core' + +setupaptarchive + +cp -a rootdir/var/lib/dpkg/status dpkg.status.backup + +testforcebreak() { + cp -a dpkg.status.backup rootdir/var/lib/dpkg/status + rm -f rootdir/var/lib/apt/extended_states + testfailureequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + sysvinit +The following NEW packages will be installed: + systemd-sysv +The following packages will be upgraded: + sysvinit +1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +E: This installation run will require temporarily removing the essential package sysvinit:$(getarchitecture 'native') due to a Conflicts/Pre-Depends loop. This is often bad, but if you really want to do it, activate the APT::Force-LoopBreak option. +E: Internal Error, Could not early remove sysvinit:$(dpkg --print-architecture) (2)" aptget install systemd-sysv -t "$1" -s + # ensure that really nothing happens + testfailure aptget install systemd-sysv -y -t "$1" + testdpkginstalled 'sysvinit' + testdpkgnotinstalled 'systemd-sysv' + + # with enough force however … + cp -a dpkg.status.backup rootdir/var/lib/dpkg/status + testsuccess aptget install systemd-sysv -y -t "$1" -o APT::Force-LoopBreak=1 -o Debug::pkgDpkgPm=1 + cp rootdir/tmp/testsuccess.output apt.output + testsuccess grep -- '--force-remove-essential --remove sysvinit' apt.output + testsuccess aptget install systemd-sysv -y -t "$1" -o APT::Force-LoopBreak=1 + testdpkginstalled 'sysvinit' 'systemd-sysv' +} + +testforcebreak 'sid-conflict' +testforcebreak 'sid-break' diff --git a/test/integration/test-external-dependency-solver-protocol b/test/integration/test-external-dependency-solver-protocol new file mode 100755 index 0000000..2c451d5 --- /dev/null +++ b/test/integration/test-external-dependency-solver-protocol @@ -0,0 +1,294 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'cool' 'all' '1' +insertinstalledpackage 'stuff' 'all' '1' +insertinstalledpackage 'somestuff' 'all' '1' 'Depends: cool, stuff' + +insertpackage 'unstable' 'cool' 'all' '2' 'Multi-Arch: foreign' +insertpackage 'unstable' 'stuff' 'all' '2' 'Multi-Arch: foreign' +insertpackage 'unstable' 'coolstuff' 'i386,amd64' '2' 'Depends: cool, stuff' +insertpackage 'unstable' 'awesome' 'all' '2' 'Multi-Arch: foreign +Conflicts: badstuff' +insertpackage 'unstable' 'badstuff' 'all' '2' 'Multi-Arch: foreign +Conflicts: awesome' +insertpackage 'unstable' 'awesomecoolstuff' 'i386' '2' 'Depends: coolstuff, awesome' + +insertpackage 'experimental' 'cool' 'all' '3' 'Multi-Arch: foreign' +insertpackage 'experimental' 'stuff' 'all' '3' 'Multi-Arch: foreign' +insertpackage 'experimental' 'coolstuff' 'i386,amd64' '3' 'Depends: cool, stuff' + +setupaptarchive + +testsuccess aptget install --solver apt coolstuff -s +testempty find . -name 'edsp.last.*' +echo 'Dir::Log::Solver "edsp.last.xz";' > rootdir/etc/apt/apt.conf.d/log-edsp.conf + +testfailure aptget install --solver dump coolstuff -s +testsuccess grep 'ERR_NO_FILENAME' rootdir/tmp/testfailure.output +testfailure test -s rootdir/var/log/apt/edsp.last.xz +export APT_EDSP_DUMP_FILENAME="/nonexistent/apt/edsp.dump" +testfailure aptget install --solver dump coolstuff -s +testsuccess grep 'ERR_CREATE_FILE' rootdir/tmp/testfailure.output +testfailure test -s rootdir/var/log/apt/edsp.last.xz +export APT_EDSP_DUMP_FILENAME="${TMPWORKINGDIRECTORY}/downloaded/dump.edsp" + +testfailureequal 'Reading package lists... +Building dependency tree... +Execute external solver... +The solver encountered an error of type: ERR_JUST_DUMPING +The following information might help you to understand what is wrong: +I am too dumb, i can just dump! +Please use one of my friends instead! + +E: External solver failed with: I am too dumb, i can just dump!' aptget install --solver dump coolstuff -s +testfailure test -s rootdir/var/log/apt/edsp.last.xz +testsuccess test -s "$APT_EDSP_DUMP_FILENAME" + +testsuccessequal 'Reading package lists... +Building dependency tree... +Execute external solver... +The following NEW packages will be installed: + coolstuff +0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst coolstuff (2 unstable [amd64]) +Conf coolstuff (2 unstable [amd64])' aptget install --solver apt coolstuff -s +testsuccess test -s rootdir/var/log/apt/edsp.last.xz +sed -i -e 's#^Solver: dump$#Solver: apt#' "$APT_EDSP_DUMP_FILENAME" +testequal "$(cat "$APT_EDSP_DUMP_FILENAME") +" apthelper cat-file rootdir/var/log/apt/edsp.last.xz +cp rootdir/var/log/apt/edsp.last.xz rootdir/var/log/apt/edsp.last.xz.1 +rm -f "$APT_EDSP_DUMP_FILENAME" + +testsuccessequal 'Reading package lists... +Building dependency tree... +Execute external solver... +The following NEW packages will be installed: + coolstuff +0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst coolstuff (3 experimental [amd64]) +Conf coolstuff (3 experimental [amd64])' aptget install --solver apt coolstuff -s -t experimental +testfailure cmp rootdir/var/log/apt/edsp.last.xz rootdir/var/log/apt/edsp.last.xz.1 + +testsuccessequal "Reading package lists... +Building dependency tree... +Selected version '3' (experimental [amd64]) for 'coolstuff' +Execute external solver... +The following NEW packages will be installed: + coolstuff +0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst coolstuff (3 experimental [amd64]) +Conf coolstuff (3 experimental [amd64])" aptget install --solver apt coolstuff/experimental -sq=0 + +testsuccessequal 'Reading package lists... +Building dependency tree... +Execute external solver... +The following NEW packages will be installed: + coolstuff +0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. +Inst coolstuff (3 experimental [amd64]) +Conf coolstuff (3 experimental [amd64])' aptget install --solver apt coolstuff=3 -sq=0 + +testsuccessequal 'Reading package lists... +Building dependency tree... +Execute external solver... +The following packages will be REMOVED: + somestuff +0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded. +Remv somestuff [1]' aptget autoremove --solver apt somestuff -s +testsuccess aptmark auto cool stuff +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +Execute external solver... +The following packages will be REMOVED: + cool somestuff stuff +0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded. +Remv somestuff [1] +Remv cool [1] +Remv stuff [1]' aptget autoremove --solver apt somestuff -s + +AUTOREMOVE='apt autoremove' +if [ -n "$SUDO_USER" ]; then + AUTOREMOVE="sudo $AUTOREMOVE" +fi +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Execute external solver... +The following package was automatically installed and is no longer required: + stuff +Use '$AUTOREMOVE' to remove it. +The following packages will be REMOVED: + cool* somestuff* +0 upgraded, 0 newly installed, 2 to remove and 1 not upgraded. +Purg somestuff [1] +Purg cool [1]" aptget purge --solver apt cool -s + +testsuccess aptget install awesomecoolstuff:i386 -s +testsuccess aptget install --solver apt awesomecoolstuff:i386 -s + +rm -f "$APT_EDSP_DUMP_FILENAME" +testfailure aptget install --solver dump awesomecoolstuff:i386 -s +testsuccess test -s "$APT_EDSP_DUMP_FILENAME" +testequal 'Install: awesomecoolstuff:i386' grep :i386 "$APT_EDSP_DUMP_FILENAME" +testfailure grep -e ':amd64' -e 'Architecture: any' "$APT_EDSP_DUMP_FILENAME" + +testsuccess aptget dist-upgrade -s +testsuccess aptget dist-upgrade -s --solver apt + +testsuccess aptget upgrade -s +testsuccess aptget upgrade -s --solver apt + +testfailure aptget install awesome badstuff -s +testfailure aptget install awesome badstuff -s --solver apt +testsuccess grep 'ERR_UNSOLVABLE' rootdir/tmp/testfailure.output +msgtest 'A resolving error is format as' 'valid parseable EDSP error' +if dpkg-checkbuilddeps -d 'dctrl-tools' /dev/null >/dev/null 2>&1; then + if apthelper cat-file rootdir/var/log/apt/edsp.last.xz | aptinternalsolver > solver.result 2>&1; then + testsuccess --nomsg grep-dctrl -FError ERR -- solver.result + else + msgfail + fi +else + msgskip 'dctrl-tools not installed' +fi +configarchitecture 'armel' +testfailure aptget install --solver apt awesomecoolstuff:i386 -s +msgtest 'An invalid EDSP file generates a' 'hard error' +if printf "%b\n" "Request: This is a test\nFoo: bar\n\n" | aptinternalsolver > solver.result 2>&1; then + cat solver.result + msgfail +else + msgpass +fi +msgtest 'Test direct calling is okay for' 'apt-internal-solver' +cat "$APT_EDSP_DUMP_FILENAME" | aptinternalsolver > solver.result 2>&1 || true +if [ "$(tail -n2 solver.result | head -n1 )" = "Message: Done" ]; then + msgpass +else + cat solver.result + msgfail +fi +testsuccess grep '^APT-ID: 1$' "$APT_EDSP_DUMP_FILENAME" +sed -i -e 's#^APT-ID: 1$#APT-ID: 10000#' "$APT_EDSP_DUMP_FILENAME" +cat "$APT_EDSP_DUMP_FILENAME" | aptinternalsolver > solver.result 2>&1 || true +testsuccessequal 'Message: Done +' tail -n2 solver.result +rm -f "$APT_EDSP_DUMP_FILENAME" + +testsuccess aptinternalsolver scenario +testsuccessequal 'Package: stuff +Architecture: all +Version: 3 +APT-ID: 1 +Multi-Arch: foreign +Source: stuff +Source-Version: 3 +Priority: optional +Section: other +APT-Release: + a=experimental,n=experimental,c=main,b=all +APT-Pin: 1 + +Package: stuff +Architecture: all +Version: 2 +APT-ID: 3 +Multi-Arch: foreign +Source: stuff +Source-Version: 2 +Priority: optional +Section: other +APT-Release: + a=unstable,n=sid,c=main,b=all +APT-Pin: 500 +APT-Candidate: yes + +Package: stuff +Architecture: all +Version: 1 +APT-ID: 8 +Source: stuff +Source-Version: 1 +Priority: optional +Section: other +Installed: yes +APT-Pin: 100 +' aptinternalsolver scenario stuff + +cat > rootdir/usr/lib/apt/solvers/explicitremove << EOF +#!/bin/sh +set -e +while read line; do + if [ "APT-ID" = "\${line%:*}" ]; then + cat << APT +Install: \${line#*:} + +Remove: \${line#*:} + +APT + fi +done +EOF +chmod +x rootdir/usr/lib/apt/solvers/explicitremove +testfailure apt full-upgrade -s --solver explicitremove +testsuccess grep 'had a previous stanza' rootdir/tmp/testfailure.output + +cat > rootdir/usr/lib/apt/solvers/removeall << EOF +#!/bin/sh +set -e +while read line; do + if [ "APT-ID" = "\${line%:*}" ]; then + cat << APT +Remove: \${line#*:} + +APT + fi +done +EOF +chmod +x rootdir/usr/lib/apt/solvers/removeall +testwarning apt full-upgrade -s --solver removeall +testsuccess grep "which isn't installed!" rootdir/tmp/testwarning.output + +cat > rootdir/usr/lib/apt/solvers/installall << EOF +#!/bin/sh +set -e +while read line; do + if [ "APT-ID" = "\${line%:*}" ]; then + cat << APT +Install: \${line#*:} + +APT + fi +done +EOF +chmod +x rootdir/usr/lib/apt/solvers/installall +testfailure apt full-upgrade -s --solver installall +testsuccess grep "is already installed!" rootdir/tmp/testfailure.output + +testsolverfailuremsg() { + local SOLVER="rootdir/usr/lib/apt/solvers/$1" + echo "$2" > "$SOLVER" + chmod +x "$SOLVER" + testfailuremsg "$3" apt full-upgrade -s --solver $1 +} + +testsolverfailuremsg 'exit0withmsg' "#!/bin/sh +echo 'Error: instant-exit +Message: This solver exits instantly' +exit 0" 'E: External solver failed with: This solver exits instantly' + +testsolverfailuremsg 'exit1withoutmsg' "#!/bin/sh +exit 1" 'E: Sub-process exit1withoutmsg returned an error code (1)' + +testsolverfailuremsg 'exit1withmsg' "#!/bin/sh +echo 'Error: instant-exit +Message: This solver exits instantly' +exit 1" 'E: External solver failed with: This solver exits instantly +E: Sub-process exit1withmsg returned an error code (1)' diff --git a/test/integration/test-external-installation-planner-protocol b/test/integration/test-external-installation-planner-protocol new file mode 100755 index 0000000..1d9abc9 --- /dev/null +++ b/test/integration/test-external-installation-planner-protocol @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'libfoo' 'amd64' '3' 'experimental' 'Multi-Arch: same' +buildsimplenativepackage 'foo' 'all' '3' 'experimental' 'Depends: newstuff' +buildsimplenativepackage 'foo' 'all' '2' 'unstable' 'Depends: libfoo:amd64, stuff +Conflicts: bar, libfoo:i386 +Recommends: unrelated' +buildsimplenativepackage 'libfoo' 'amd64' '2' 'unstable' 'Multi-Arch: same' +buildsimplenativepackage 'unrelated-2' 'amd64' '2' 'unstable' +insertinstalledpackage 'foo' 'all' '1' +insertinstalledpackage 'bar' 'all' '1' +insertinstalledpackage 'stuff' 'all' '1' +insertinstalledpackage 'unrelated-1' 'all' '1' + +setupaptarchive --no-update + +EIPPLOG="${TMPWORKINGDIRECTORY}/rootdir/var/log/apt/eipp.log" +echo "Dir::Log::Planner \"$EIPPLOG\";" > ./rootdir/etc/apt/apt.conf.d/eipp-logging + +testsuccess apt update +export APT_EDSP_DUMP_FILENAME="${TMPWORKINGDIRECTORY}/downloaded/dump.eipp" +testfailure test -r "$EIPPLOG" +testfailure aptget install foo --planner dump -y +testfailure test -r "$EIPPLOG" +testfailure grep 'unrelated-2' "$APT_EDSP_DUMP_FILENAME" +testsuccessequal '2' grep -c '^Package: foo$' "$APT_EDSP_DUMP_FILENAME" +testsuccessequal '1' grep -c '^Package: libfoo$' "$APT_EDSP_DUMP_FILENAME" +testsuccessequal 'Planner: dump' grep '^Planner: ' "$APT_EDSP_DUMP_FILENAME" + +testsuccess aptget install foo -s +testsuccess aptget install foo -y +testsuccess test -r "$EIPPLOG" +testsuccessequal 'Request: EIPP 0.1 +Architecture: amd64 +Architectures: amd64 +Remove: bar:amd64 +Install: libfoo:amd64 foo:amd64 +Planner: internal' head -n 6 "$EIPPLOG" +aptinternalplanner < "$EIPPLOG" > planner.log || true +testsuccessequal 'Remove: 7 +Unpack: 2 +Unpack: 4' grep -e '^Unpack:' -e '^Install:' -e '^Configure:' -e '^Remove:' planner.log + +rm -f "$EIPPLOG" +testsuccess aptget install foo -s --reinstall +testsuccess aptget install foo -y --reinstall +testsuccess test -r "$EIPPLOG" +testsuccessequal 'Request: EIPP 0.1 +Architecture: amd64 +Architectures: amd64 +ReInstall: foo:amd64 +Planner: internal' head -n 5 "$EIPPLOG" +aptinternalplanner < "$EIPPLOG" > planner.log || true +testsuccessequal 'Unpack: 4' grep -e '^Unpack:' -e '^Install:' -e '^Configure:' -e '^Remove:' planner.log + +rm -f "$EIPPLOG" +testsuccess aptget purge foo -s +testsuccess aptget purge foo -y +testsuccess test -r "$EIPPLOG" +testsuccessequal 'Request: EIPP 0.1 +Architecture: amd64 +Architectures: amd64 +Remove: foo:amd64 +Planner: internal' head -n 5 "$EIPPLOG" +aptinternalplanner < "$EIPPLOG" > planner.log || true +testsuccessequal 'Remove: 4' grep -e '^Unpack:' -e '^Install:' -e '^Configure:' -e '^Remove:' planner.log + +testplannerfailuremsg() { + local PLANNER="rootdir/usr/lib/apt/planners/$1" + echo "$2" > "$PLANNER" + chmod +x "$PLANNER" + testfailuremsg "$3" apt install foo -s --planner $1 +} + +testplannerfailuremsg 'exit0withmsg' "#!/bin/sh +echo 'Error: instant-exit +Message: This planner exits instantly' +exit 0" 'E: External planner failed with: This planner exits instantly' + +testplannerfailuremsg 'exit1withoutmsg' "#!/bin/sh +exit 1" 'E: Sub-process exit1withoutmsg returned an error code (1)' + +testplannerfailuremsg 'exit1withmsg' "#!/bin/sh +echo 'Error: instant-exit +Message: This planner exits instantly' +exit 1" 'E: External planner failed with: This planner exits instantly +E: Sub-process exit1withmsg returned an error code (1)' diff --git a/test/integration/test-failing-maintainer-scripts b/test/integration/test-failing-maintainer-scripts new file mode 100755 index 0000000..8cf2380 --- /dev/null +++ b/test/integration/test-failing-maintainer-scripts @@ -0,0 +1,91 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' +configdpkgnoopchroot + +# create a bunch of failures +createfailure() { + setupsimplenativepackage "failure-$1" 'native' '1.0' 'unstable' 'Depends: dependee' + BUILDDIR="incoming/failure-$1-1.0" + echo '#!/bin/sh +exit 29' > "${BUILDDIR}/debian/$1" + buildpackage "$BUILDDIR" 'unstable' 'main' 'native' + rm -rf "$BUILDDIR" +} + +buildsimplenativepackage 'dependee' 'native' '1.0' 'unstable' +createfailure 'preinst' +createfailure 'postinst' +createfailure 'prerm' +createfailure 'postrm' + +setupaptarchive + +# setup some pre- and post- invokes to check the output isn't garbled later +APTHOOK="${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apthook" +echo '#!/bin/sh +echo "$1: START" +echo "$1: MaiN" +echo "$1: ENd"' > "$APTHOOK" +chmod +x "$APTHOOK" +echo "DPKG::Pre-Invoke:: \"${APTHOOK} PRE\"; +DPKG::Post-Invoke:: \"${APTHOOK} POST\";" > rootdir/etc/apt/apt.conf.d/99apthooks + +testmyfailure() { + local PROGRESS='rootdir/tmp/progress.log' + exec 3> "$PROGRESS" + testfailure "$@" -o APT::Status-Fd=3 + msgtest 'Test for failure message of maintainerscript in' 'console log' + local TEST='rootdir/tmp/testfailure.output' + if grep -q 'exit status 29' "$TEST"; then + msgpass + else + cat "$TEST" + msgfail + fi + msgtest 'Test for proper execution of invoke scripts in' 'console log' + if grep -q '^PRE: START$' "$TEST" && + grep -q '^PRE: MaiN$' "$TEST" && + grep -q '^PRE: ENd$' "$TEST" && + grep -q '^POST: START$' "$TEST" && + grep -q '^POST: MaiN$' "$TEST" && + grep -q '^POST: ENd$' "$TEST"; then + msgpass + else + cat "$TEST" + msgfail + fi + msgtest 'Test for failure message of maintainerscript in' 'progress log' + if grep -q '^pmerror:.\+exit status 29$' "$PROGRESS"; then + msgpass + else + cat "$PROGRESS" + msgfail + fi + testmarkedauto 'dependee' +} + +cp -a rootdir/var/lib/dpkg/status rootdir/var/lib/dpkg/status.backup +testmyfailure aptget install failure-preinst -y +cp -a rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status +testmyfailure aptget install failure-postinst -y +cp -a rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status +testsuccess aptget install failure-prerm -y +testdpkginstalled failure-prerm +testmyfailure aptget purge failure-prerm -y +cp -a rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status +testsuccess aptget install failure-postrm -y +testdpkginstalled failure-postrm +testmyfailure aptget purge failure-postrm -y + +# FIXME: test with output going to a PTY as it usually does +if false; then + cp -a rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status + apt install dependee -y || true + apt install failure-postinst -y || true +fi diff --git a/test/integration/test-frontend-lock b/test/integration/test-frontend-lock new file mode 100755 index 0000000..939344a --- /dev/null +++ b/test/integration/test-frontend-lock @@ -0,0 +1,80 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertinstalledpackage 'package1' 'i386' '1.0' +insertinstalledpackage 'package2' 'i386' '1.0' +insertinstalledpackage 'package3' 'i386' '1.0' +insertinstalledpackage 'package4' 'i386' '1.0' +insertinstalledpackage 'package5' 'i386' '1.0' +insertinstalledpackage 'package6' 'i386' '1.0' +buildsimplenativepackage 'foo' 'all' '1' + +setupaptarchive + +buildsimplenativepackage 'bar' 'all' '1' + + +# Checks that the correct variable is set +msgmsg 'Post-Invoke script has DPKG_FRONTEND_LOCKED set' +testsuccess aptget -q -y -o Dpkg::Post-Invoke::="echo DPKG_FRONTEND_LOCKED=\$DPKG_FRONTEND_LOCKED" remove package1 +cp rootdir/tmp/testsuccess.output install.output +testsuccess grep DPKG_FRONTEND_LOCKED=true install.output + +msgmsg 'Pre-Invoke script has DPKG_FRONTEND_LOCKED set' +testsuccess aptget -q -y -o Dpkg::Pre-Invoke::="echo DPKG_FRONTEND_LOCKED=\$DPKG_FRONTEND_LOCKED" remove package2 +cp rootdir/tmp/testsuccess.output install.output +testsuccess grep DPKG_FRONTEND_LOCKED=true install.output + +msgmsg 'Pre-Install-Pkgs script has DPKG_FRONTEND_LOCKED set' +testsuccess aptget -q -y -o DPkg::Pre-Install-Pkgs::="echo DPKG_FRONTEND_LOCKED=\$DPKG_FRONTEND_LOCKED" remove package3 +cp rootdir/tmp/testsuccess.output install.output +testsuccess grep DPKG_FRONTEND_LOCKED=true install.output + + +# Check that the frontend lock is hold by apt-get +msgmsg 'Post-Invoke script runs while frontend is locked' +testfailure aptget -q -y -o Dpkg::Post-Invoke::="apt-get remove" remove package4 +cp rootdir/tmp/testfailure.output install.output +testsuccess grep "E: Unable to acquire the dpkg frontend lock (${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/lock-frontend), is another process using it?" install.output +testsuccess grep "E: Problem executing scripts DPkg::Post-Invoke 'apt-get remove'" install.output + +msgmsg 'Pre-Invoke script runs while frontend is locked' +testfailure aptget -q -y -o Dpkg::Pre-Invoke::="apt-get remove" remove package5 +cp rootdir/tmp/testfailure.output install.output +testsuccess grep "E: Unable to acquire the dpkg frontend lock (${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/lock-frontend), is another process using it?" install.output +testsuccess grep "E: Problem executing scripts DPkg::Pre-Invoke 'apt-get remove'" install.output + +msgmsg 'Pre-Install-Pkgs runs while frontend is locked' +testfailure aptget -q -y -o DPkg::Pre-Install-Pkgs::="apt-get remove" remove package6 +cp rootdir/tmp/testfailure.output install.output +testsuccess grep "E: Unable to acquire the dpkg frontend lock (${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/lock-frontend), is another process using it?" install.output +testsuccess grep "E: Sub-process apt-get remove returned an error code (100)" install.output +testsuccess grep "Failure running script apt-get remove" install.output + + +# Applied test case from DonKult +msgmsg 'Applied case of frontend locking' +cat > ./post-invoke <<EOF +#!/bin/sh +set -e +#export DPKG_FRONTEND_LOCKED=true +${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg -i ${TMPWORKINGDIRECTORY}/incoming/bar_1_all.deb +EOF +chmod +x ./post-invoke +echo "dpkg::post-invoke:: \"${TMPWORKINGDIRECTORY}/post-invoke\";" > rootdir/etc/apt/apt.conf.d/01dpkgpostinvoke + +testdpkgnotinstalled 'foo' 'bar' +testsuccess apt show foo +testfailure apt show bar + +testsuccess apt install foo -s +testdpkgnotinstalled 'foo' 'bar' + +testsuccess apt install foo +testdpkginstalled 'foo' 'bar' diff --git a/test/integration/test-github-111-invalid-armember b/test/integration/test-github-111-invalid-armember new file mode 100755 index 0000000..1e095ee --- /dev/null +++ b/test/integration/test-github-111-invalid-armember @@ -0,0 +1,88 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "amd64" +setupaptarchive + +# this used to crash, but it should treat it as an invalid member header +touch ' ' +ar -q test.deb ' ' +testsuccessequal "E: Invalid archive member header" ${APTTESTHELPERSBINDIR}/testdeb test.deb + + +rm test.deb +touch 'x' +ar -q test.deb 'x' +testsuccessequal "E: This is not a valid DEB archive, missing 'debian-binary' member" ${APTTESTHELPERSBINDIR}/testdeb test.deb + + +# <name><size> [ other fields] - name is not nul terminated here, it ends in . +msgmsg "Unterminated ar member name" +printf '!<arch>\0120123456789ABCDE.A123456789A.01234.01234.0123456.012345678.0.' > test.deb +testsuccessequal "E: Invalid archive member header" ${APTTESTHELPERSBINDIR}/testdeb test.deb + + +# unused source code for generating $tar below +maketar() { + cat > maketar.c << EOF + #include <stdio.h> + #include <string.h> + struct tar { + char Name[100]; + char Mode[8]; + char UserID[8]; + char GroupID[8]; + char Size[12]; + char MTime[12]; + char Checksum[8]; + char LinkFlag; + char LinkName[100]; + char MagicNumber[8]; + char UserName[32]; + char GroupName[32]; + char Major[8]; + char Minor[8]; + }; + + int main(void) + { + union { + struct tar t; + char buf[512]; + } t; + for (int i = 0; i < sizeof(t.buf); i++) + t.buf[i] = '7'; + memcpy(t.t.Name, "unterminatedName", 16); + memcpy(t.t.UserName, "userName", 8); + memcpy(t.t.GroupName, "thisIsAGroupNamethisIsAGroupName", 32); + t.t.LinkFlag = 'X'; // I AM BROKEN + memcpy(t.t.Size, "000000000000", sizeof(t.t.Size)); + memset(t.t.Checksum,' ',sizeof(t.t.Checksum)); + + unsigned long sum = 0; + for (int i = 0; i < sizeof(t.buf); i++) + sum += t.buf[i]; + + int written = sprintf(t.t.Checksum, "%lo", sum); + for (int i = written; i < sizeof(t.t.Checksum); i++) + t.t.Checksum[i] = ' '; + fwrite(t.buf, sizeof(t.buf), 1, stdout); + } +EOF + + gcc maketar.c -o maketar -Wall + ./maketar +} + + +# +tar="unterminatedName77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777700000000000077777777777773544 X777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777userName777777777777777777777777thisIsAGroupNamethisIsAGroupName777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777" +printf '%s' "$tar" | gzip > control.tar.gz +cp control.tar.gz data.tar.gz +touch debian-binary +rm test.deb +ar -q test.deb debian-binary control.tar.gz data.tar.gz +testsuccessequal "W: Unknown TAR header type 88" ${APTTESTHELPERSBINDIR}/testdeb test.deb diff --git a/test/integration/test-github-23-too-long-dependency-line b/test/integration/test-github-23-too-long-dependency-line new file mode 100755 index 0000000..d514303 --- /dev/null +++ b/test/integration/test-github-23-too-long-dependency-line @@ -0,0 +1,17 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "amd64" +setupaptarchive + + +testsuccessequal "network-manager-strongswan: + Installed: 1.3.1-14 + Candidate: 1.3.1-14 + Version table: + *** 1.3.1-14 500 + 500 file:${TMPWORKINGDIRECTORY}/aptarchive Packages + 100 ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status" aptcache policy network-manager-strongswan diff --git a/test/integration/test-handle-redirect-as-used-mirror-change b/test/integration/test-handle-redirect-as-used-mirror-change new file mode 100755 index 0000000..a6f8b78 --- /dev/null +++ b/test/integration/test-handle-redirect-as-used-mirror-change @@ -0,0 +1,94 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' +configcompression '.' 'gz' + +buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable' + +export APT_DONT_SIGN='' +setupaptarchive --no-update +changetowebserver +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "http://0.0.0.0:${APTHTTPPORT}/" +rewritesourceslist "http://localhost:${APTHTTPPORT}/redirectme" + +testsuccessequal "Get:1 http://0.0.0.0:${APTHTTPPORT} unstable InRelease [$(stat -c %s aptarchive/dists/unstable/InRelease) B] +Get:2 http://0.0.0.0:${APTHTTPPORT} unstable/main Sources [$(stat -c %s aptarchive/dists/unstable/main/source/Sources.gz) B] +Get:3 http://0.0.0.0:${APTHTTPPORT} unstable/main all Packages [$(stat -c %s aptarchive/dists/unstable/main/binary-all/Packages.gz) B] +Get:4 http://0.0.0.0:${APTHTTPPORT} unstable/main Translation-en [$(stat -c %s aptarchive/dists/unstable/main/i18n/Translation-en.gz) B] +Reading package lists..." aptget update + +grepwebserverlogs() { + testsuccess grep -h "$1" aptarchive/webserver.log.client*.log + shift + sort rootdir/tmp/testsuccess.output > aptwebserver.log + testfileequal 'aptwebserver.log' "$@" +} + +# ensure we asked the redirector only once +grepwebserverlogs '^Location:' "Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease" + +testsuccessequal "Hit:1 http://0.0.0.0:${APTHTTPPORT} unstable InRelease +Reading package lists..." aptget update + +grepwebserverlogs '^Location:' "Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease +Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease" + +rm -rf rootdir/var/lib/apt/lists +testsuccess apt update -o Debug::Acquire::http=1 -o Acquire::SameMirrorForAllIndexes=0 +grepwebserverlogs '^Location:' "Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease +Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease +Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease +Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.gz +Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.gz +Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/main/source/Sources.gz" + +cd downloaded +testsuccess apthelper download-file "http://localhost:${APTHTTPPORT}/redirectme/dists/unstable/InRelease" inrelease +testsuccess test -s inrelease +cd - >/dev/null + +webserverconfig "aptwebserver::redirect::replace::http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease" "http://0.0.0.0:${APTHTTPPORT}/storage/dists/unstable/InRelease" +mkdir -p aptarchive/storage/dists/unstable +mv aptarchive/dists/unstable/InRelease aptarchive/storage/dists/unstable +rm -rf rootdir/var/lib/apt/lists +testsuccessequal "Get:1 http://0.0.0.0:${APTHTTPPORT}/storage unstable InRelease [$(stat -c %s aptarchive/storage/dists/unstable/InRelease) B] +Ign:2 http://0.0.0.0:${APTHTTPPORT}/storage unstable/main Sources + 404 Not Found +Ign:3 http://0.0.0.0:${APTHTTPPORT}/storage unstable/main all Packages + 404 Not Found +Ign:4 http://0.0.0.0:${APTHTTPPORT}/storage unstable/main Translation-en + 404 Not Found +Get:2 http://0.0.0.0:${APTHTTPPORT} unstable/main Sources [$(stat -c %s aptarchive/dists/unstable/main/source/Sources.gz) B] +Get:3 http://0.0.0.0:${APTHTTPPORT} unstable/main all Packages [$(stat -c %s aptarchive/dists/unstable/main/binary-all/Packages.gz) B] +Get:4 http://0.0.0.0:${APTHTTPPORT} unstable/main Translation-en [$(stat -c %s aptarchive/dists/unstable/main/i18n/Translation-en.gz) B] +Reading package lists... +Building dependency tree... +All packages are up to date." apt update + +find aptarchive -name 'InRelease' -delete +rm -rf rootdir/var/lib/apt/lists + +testsuccessequal "Ign:1 http://0.0.0.0:${APTHTTPPORT}/storage unstable InRelease + 404 Not Found +Get:2 http://0.0.0.0:${APTHTTPPORT} unstable Release [$(stat -c %s aptarchive/dists/unstable/Release) B] +Get:3 http://0.0.0.0:${APTHTTPPORT} unstable Release.gpg [$(stat -c %s aptarchive/dists/unstable/Release.gpg) B] +Get:4 http://0.0.0.0:${APTHTTPPORT} unstable/main Sources [$(stat -c %s aptarchive/dists/unstable/main/source/Sources.gz) B] +Get:5 http://0.0.0.0:${APTHTTPPORT} unstable/main all Packages [$(stat -c %s aptarchive/dists/unstable/main/binary-all/Packages.gz) B] +Get:6 http://0.0.0.0:${APTHTTPPORT} unstable/main Translation-en [$(stat -c %s aptarchive/dists/unstable/main/i18n/Translation-en.gz) B] +Reading package lists..." aptget update + +testsuccessequal "Ign:1 http://0.0.0.0:${APTHTTPPORT}/storage unstable InRelease + 404 Not Found +Hit:2 http://0.0.0.0:${APTHTTPPORT} unstable Release +Reading package lists..." aptget update + +rm -rf rootdir/var/lib/apt/lists +find aptarchive -name 'Release.gpg' -delete +find aptarchive -name 'Release' -delete +testfailure aptget update +testwarning aptget update --allow-insecure-repositories +testsuccess grep 'does not have a Release file' rootdir/tmp/testwarning.output diff --git a/test/integration/test-handling-broken-orgroups b/test/integration/test-handling-broken-orgroups new file mode 100755 index 0000000..564ea88 --- /dev/null +++ b/test/integration/test-handling-broken-orgroups @@ -0,0 +1,108 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'cool' 'all' '1.0-1' +insertpackage 'unstable' 'stuff' 'all' '1.0-1' +insertpackage 'unstable' 'coolstuff' 'all' '1.0-1' 'Depends: cool | stuff' +insertpackage 'unstable' 'coolstuff2' 'all' '1.0-1' 'Depends: cool2 | stuff' +insertpackage 'unstable' 'coolstuff-broken' 'all' '1.0-1' 'Depends: cool2 | stuff2' +insertpackage 'unstable' 'coolstuff-brokenrec' 'all' '1.0-1' 'Recommends: cool2 | stuff2' +insertpackage 'unstable' 'coolstuff-conflict' 'all' '1.0-1' 'Depends: cool | stuff +Conflicts: cool' +insertpackage 'unstable' 'coolstuff-provided' 'all' '1.0-1' 'Depends: cool2 | stuff-abi' +insertpackage 'unstable' 'extrastuff' 'all' '1.0-1' 'Provides: stuff-abi' + +insertpackage 'unstable' 'coolstuff-provided-broken' 'all' '1.0-1' 'Depends: cool2 | stuff-abi-2' +insertpackage 'unstable' 'extrastuff' 'all' '1.0-1' 'Depends: stuff2 +Provides: stuff-abi-2' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + cool +The following NEW packages will be installed: + cool coolstuff +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst cool (1.0-1 unstable [all]) +Inst coolstuff (1.0-1 unstable [all]) +Conf cool (1.0-1 unstable [all]) +Conf coolstuff (1.0-1 unstable [all])' aptget install coolstuff -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + stuff +The following NEW packages will be installed: + coolstuff2 stuff +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst stuff (1.0-1 unstable [all]) +Inst coolstuff2 (1.0-1 unstable [all]) +Conf stuff (1.0-1 unstable [all]) +Conf coolstuff2 (1.0-1 unstable [all])' aptget install coolstuff2 -s + +testfailureequal '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: + coolstuff-broken : Depends: cool2 but it is not installable or + stuff2 but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget install coolstuff-broken -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +Recommended packages: + cool2 | stuff2 +The following NEW packages will be installed: + coolstuff-brokenrec +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst coolstuff-brokenrec (1.0-1 unstable [all]) +Conf coolstuff-brokenrec (1.0-1 unstable [all])' aptget install coolstuff-brokenrec -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + stuff +The following NEW packages will be installed: + coolstuff-conflict stuff +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst stuff (1.0-1 unstable [all]) +Inst coolstuff-conflict (1.0-1 unstable [all]) +Conf stuff (1.0-1 unstable [all]) +Conf coolstuff-conflict (1.0-1 unstable [all])' aptget install coolstuff-conflict -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + extrastuff +The following NEW packages will be installed: + coolstuff-provided extrastuff +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst extrastuff (1.0-1 unstable [all]) +Inst coolstuff-provided (1.0-1 unstable [all]) +Conf extrastuff (1.0-1 unstable [all]) +Conf coolstuff-provided (1.0-1 unstable [all])' aptget install coolstuff-provided -s + +testfailureequal '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: + coolstuff-provided-broken : Depends: cool2 but it is not installable or + stuff-abi-2 +E: Unable to correct problems, you have held broken packages.' aptget install coolstuff-provided-broken -s diff --git a/test/integration/test-hashsum-verification b/test/integration/test-hashsum-verification new file mode 100755 index 0000000..a514b85 --- /dev/null +++ b/test/integration/test-hashsum-verification @@ -0,0 +1,82 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +buildaptarchive +setupflataptarchive +changetowebserver + +prepare() { + local DATE="${2:-now}" + if [ "$DATE" = 'now' -a "$1" = "${PKGFILE}-new" ]; then + DATE='now + 6 days' + fi + for release in $(find rootdir/var/lib/apt/lists 2> /dev/null); do + touch -d 'now - 6 hours' "$release" + done + cp "$1" aptarchive/Packages + find aptarchive -name 'Release' -delete + compressfile aptarchive/Packages + # create Release file with incorret checksums + cat > aptarchive/Release <<EOF +Date: Fri, 05 Aug 2011 09:22:08 UTC +MD5Sum: + x15c483ac486f5dbe95095c7ec08626f 760 Packages + x0579797df4792164a17305fb0b317e9 546 Packages.bz2 + xc532a82873d2206b4e4503e92d167bd 489 Packages.gz + x4d1d25661377dd4bb95a1736e2624d3 527 Packages.lzma + xf1cc221194edbaa943d2375d6f44a88 572 Packages.xz +SHA1: + x0d3317839cf68cd40c28f0bddca8d2ce5a29cad 760 Packages + xffddf046ad8dfd8338a355d76fb08d143c8b636 546 Packages.bz2 + xa27a3df51ca4474b880a6594c4811957079b613 489 Packages.gz + x9d7bba4e6fa927a34dcd797694c2893c21f1004 527 Packages.lzma + x7d988fe59cf67298828e5299a15d329c0f00f1b 572 Packages.xz +SHA256: + x5a47d72f6b97bfa164b23326b6ad3cb019b5c6cc73769f8c0187616933d1b2b 760 Packages + x617252f5bfe3e9126352c7c2f8122d9c3b2c5e1a6c8a9616d62adc0ed164172 546 Packages.bz2 + xc6abc6fe9a4fcf0758ec5366dfd19bcba90af026a7017c3f6198c59eccd8ef5 489 Packages.gz + xb306e66e5e6a7169c8d281a888539d1fdca9cecc99ae605717df579d5b9c166 527 Packages.lzma + x9585d0e66b74c9385727fbea11fea9ab33c716b18a32f3036f037a2b9b57120 572 Packages.xz +EOF +} + +PKGFILE="${TESTDIR}/$(echo "$(basename $0)" | sed 's#^test-#Packages-#')" + +runtest() { + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + + # test signed release file + msgtest 'apt-get update gets the expected hashsum mismatch' + testfailure aptget update + testsuccess grep "Hash Sum mismatch" rootdir/tmp/testfailure.output + msgtest 'No package from the source available' + testfailureequal --nomsg 'N: Unable to locate package apt +E: No packages found' aptcache show apt + msgtest 'No Packages file in /var/lib/apt/lists' + testempty find rootdir/var/lib/apt/lists -maxdepth 1 -name '*Package*' + + # now with the unsigned Release file + rm -rf rootdir/var/lib/apt/lists + rm -f aptarchive/InRelease aptarchive/Release.gpg + msgtest 'unsigned apt-get update gets the expected hashsum mismatch' + testfailure --nomsg aptget update --allow-insecure-repositories + testsuccess grep "Hash Sum mismatch" rootdir/tmp/testfailure.output +} + +for COMPRESSEDINDEXES in 'false' 'true'; do + echo "Acquire::GzipIndexes \"$COMPRESSEDINDEXES\";" > rootdir/etc/apt/apt.conf.d/compressindexes + if $COMPRESSEDINDEXES; then + msgmsg 'Run tests with GzipIndexes enabled' + else + msgmsg 'Run tests with GzipIndexes disabled' + fi + runtest +done diff --git a/test/integration/test-http-pipeline-messup b/test/integration/test-http-pipeline-messup new file mode 100755 index 0000000..95e890b --- /dev/null +++ b/test/integration/test-http-pipeline-messup @@ -0,0 +1,56 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +# try a little harder to create a size mismatch +buildsimplenativepackage 'pkg0' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none' +buildsimplenativepackage 'pkga' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none' +buildsimplenativepackage 'pkgb' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none' +buildsimplenativepackage 'pkgc' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none' +buildsimplenativepackage 'pkgd' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none' + +setupaptarchive --no-update + +# simulate (and be a predictable) pipeline mess-up by the server/proxy +changetowebserver \ + -o 'aptwebserver::overwrite::.*pkga.*::filename=/pool/pkgd_1.0_all.deb' \ + -o 'aptwebserver::overwrite::.*pkgc.*::filename=/pool/pkgb_1.0_all.deb' \ + -o 'aptwebserver::overwrite::.*pkgb.*::filename=/pool/pkgc_1.0_all.deb' \ + -o 'aptwebserver::overwrite::.*pkgd.*::filename=/pool/pkga_1.0_all.deb' + +echo 'Debug::Acquire::http "true"; +Debug::pkgAcquire::Worker "true";' > rootdir/etc/apt/apt.conf.d/99debug + +testsuccess aptget update + +cd downloaded +# messup is bigger than pipeline: checks if fixup isn't trying too hard +testfailure aptget download pkga pkgb pkgc pkgd -o Acquire::http::Pipeline-Depth=2 +for pkg in 'pkga' 'pkgd'; do + testfailure test -f ${pkg}_1.0_all.deb +done +for pkg in 'pkgb' 'pkgc'; do + testsuccess test -f ${pkg}_1.0_all.deb + testsuccess cmp ../incoming/${pkg}_1.0_all.deb ${pkg}_1.0_all.deb + rm -f ${pkg}_1.0_all.deb +done + +# ensure that pipeling is enabled for rest of this test +echo 'Acquire::http::Pipeline-Depth 10;' > ../rootdir/etc/apt/apt.conf.d/99enable-pipeline + +# the output is a bit strange: it looks like it has downloaded pkga 4 times +testwarning aptget download pkg0 pkga pkgb pkgc pkgd +for pkg in 'pkg0' 'pkga' 'pkgb' 'pkgc' 'pkgd'; do + testsuccess test -f ${pkg}_1.0_all.deb + testsuccess cmp ../incoming/${pkg}_1.0_all.deb ${pkg}_1.0_all.deb + rm -f ${pkg}_1.0_all.deb +done + +# while hashes will pass (as none are available), sizes will not match, so failure +# checks that no hashes means that pipeline depth is ignored as we can't fixup +testfailure aptget download pkga pkgb pkgc pkgd --allow-unauthenticated -o Acquire::ForceHash=ROT26 diff --git a/test/integration/test-ignore-provides-if-versioned-breaks b/test/integration/test-ignore-provides-if-versioned-breaks new file mode 100755 index 0000000..ebcbecf --- /dev/null +++ b/test/integration/test-ignore-provides-if-versioned-breaks @@ -0,0 +1,150 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' 'amd64' + +insertpackage 'unstable' 'unrlated' 'all' '1.0' + +insertinstalledpackage 'foo' 'i386' '2.0' +insertpackage 'unstable' 'foo' 'i386' '4.0' +insertpackage 'unstable' 'foo-provider' 'i386' '1.0' 'Provides: foo' +insertpackage 'unstable' 'foo-breaker-3' 'i386' '1.0' 'Breaks: foo (<< 3.0)' +insertpackage 'unstable' 'foo-breaker-2' 'i386' '1.0' 'Breaks: foo (<< 2.0)' +insertpackage 'unstable' 'foo-breaker-none' 'i386' '1.0' 'Breaks: foo' + +insertinstalledpackage 'foo-foreign' 'amd64' '2.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'foo-foreign' 'amd64' '4.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'foo-foreign-provider' 'i386' '1.0' 'Provides: foo-foreign' +insertpackage 'unstable' 'foo-foreign-breaker-3' 'i386' '1.0' 'Breaks: foo-foreign (<< 3.0)' +insertpackage 'unstable' 'foo-foreign-breaker-2' 'i386' '1.0' 'Breaks: foo-foreign (<< 2.0)' +insertpackage 'unstable' 'foo-foreign-breaker-none' 'i386' '1.0' 'Breaks: foo-foreign' + +insertinstalledpackage 'foo-same' 'i386,amd64' '2.0' 'Multi-Arch: same' +insertpackage 'unstable' 'foo-same' 'i386,amd64' '4.0' 'Multi-Arch: same' +insertpackage 'unstable' 'foo-same-provider' 'i386' '1.0' 'Provides: foo-same' +insertpackage 'unstable' 'foo-same-breaker-3' 'i386' '1.0' 'Breaks: foo-same (<< 3.0)' +insertpackage 'unstable' 'foo-same-breaker-2' 'i386' '1.0' 'Breaks: foo-same (<< 2.0)' +insertpackage 'unstable' 'foo-same-breaker-none' 'i386' '1.0' 'Breaks: foo-same' + + + +setupaptarchive + +testfailureequal '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-breaker-none : Breaks: foo +E: Unable to correct problems, you have held broken packages.' aptget install foo-provider foo-breaker-none -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-breaker-2 foo-provider +0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded. +Inst foo-breaker-2 (1.0 unstable [i386]) +Inst foo-provider (1.0 unstable [i386]) +Conf foo-breaker-2 (1.0 unstable [i386]) +Conf foo-provider (1.0 unstable [i386])' aptget install foo-provider foo-breaker-2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + foo-breaker-3 foo-provider +The following packages will be upgraded: + foo +1 upgraded, 2 newly installed, 0 to remove and 3 not upgraded. +Inst foo [2.0] (4.0 unstable [i386]) +Inst foo-breaker-3 (1.0 unstable [i386]) +Inst foo-provider (1.0 unstable [i386]) +Conf foo (4.0 unstable [i386]) +Conf foo-breaker-3 (1.0 unstable [i386]) +Conf foo-provider (1.0 unstable [i386])' aptget install foo-provider foo-breaker-3 -s + +testfailureequal '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-foreign-breaker-none : Breaks: foo-foreign +E: Unable to correct problems, you have held broken packages.' aptget install foo-foreign-provider foo-foreign-breaker-none -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-foreign-breaker-2 foo-foreign-provider +0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded. +Inst foo-foreign-breaker-2 (1.0 unstable [i386]) +Inst foo-foreign-provider (1.0 unstable [i386]) +Conf foo-foreign-breaker-2 (1.0 unstable [i386]) +Conf foo-foreign-provider (1.0 unstable [i386])' aptget install foo-foreign-provider foo-foreign-breaker-2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo-foreign:amd64 +The following NEW packages will be installed: + foo-foreign-breaker-3 foo-foreign-provider +The following packages will be upgraded: + foo-foreign:amd64 +1 upgraded, 2 newly installed, 0 to remove and 3 not upgraded. +Inst foo-foreign:amd64 [2.0] (4.0 unstable [amd64]) +Inst foo-foreign-breaker-3 (1.0 unstable [i386]) +Inst foo-foreign-provider (1.0 unstable [i386]) +Conf foo-foreign:amd64 (4.0 unstable [amd64]) +Conf foo-foreign-breaker-3 (1.0 unstable [i386]) +Conf foo-foreign-provider (1.0 unstable [i386])' aptget install foo-foreign-provider foo-foreign-breaker-3 -s + +testfailureequal '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-same-breaker-none : Breaks: foo-same +E: Unable to correct problems, you have held broken packages.' aptget install foo-same-provider foo-same-breaker-none -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-same-breaker-2 foo-same-provider +0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded. +Inst foo-same-breaker-2 (1.0 unstable [i386]) +Inst foo-same-provider (1.0 unstable [i386]) +Conf foo-same-breaker-2 (1.0 unstable [i386]) +Conf foo-same-provider (1.0 unstable [i386])' aptget install foo-same-provider foo-same-breaker-2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo-same foo-same:amd64 +The following NEW packages will be installed: + foo-same-breaker-3 foo-same-provider +The following packages will be upgraded: + foo-same foo-same:amd64 +2 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst foo-same [2.0] (4.0 unstable [i386]) [foo-same:i386 on foo-same:amd64] [foo-same:amd64 on foo-same:i386] [foo-same:amd64 ] +Inst foo-same:amd64 [2.0] (4.0 unstable [amd64]) +Inst foo-same-breaker-3 (1.0 unstable [i386]) +Inst foo-same-provider (1.0 unstable [i386]) +Conf foo-same (4.0 unstable [i386]) +Conf foo-same:amd64 (4.0 unstable [amd64]) +Conf foo-same-breaker-3 (1.0 unstable [i386]) +Conf foo-same-provider (1.0 unstable [i386])' aptget install foo-same-provider foo-same-breaker-3 -s diff --git a/test/integration/test-ignore-provides-if-versioned-conflicts b/test/integration/test-ignore-provides-if-versioned-conflicts new file mode 100755 index 0000000..3243cfb --- /dev/null +++ b/test/integration/test-ignore-provides-if-versioned-conflicts @@ -0,0 +1,150 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' 'amd64' + +insertpackage 'unstable' 'unrlated' 'all' '1.0' + +insertinstalledpackage 'foo' 'i386' '2.0' +insertpackage 'unstable' 'foo' 'i386' '4.0' +insertpackage 'unstable' 'foo-provider' 'i386' '1.0' 'Provides: foo' +insertpackage 'unstable' 'foo-breaker-3' 'i386' '1.0' 'Conflicts: foo (<< 3.0)' +insertpackage 'unstable' 'foo-breaker-2' 'i386' '1.0' 'Conflicts: foo (<< 2.0)' +insertpackage 'unstable' 'foo-breaker-none' 'i386' '1.0' 'Conflicts: foo' + +insertinstalledpackage 'foo-foreign' 'amd64' '2.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'foo-foreign' 'amd64' '4.0' 'Multi-Arch: foreign' +insertpackage 'unstable' 'foo-foreign-provider' 'i386' '1.0' 'Provides: foo-foreign' +insertpackage 'unstable' 'foo-foreign-breaker-3' 'i386' '1.0' 'Conflicts: foo-foreign (<< 3.0)' +insertpackage 'unstable' 'foo-foreign-breaker-2' 'i386' '1.0' 'Conflicts: foo-foreign (<< 2.0)' +insertpackage 'unstable' 'foo-foreign-breaker-none' 'i386' '1.0' 'Conflicts: foo-foreign' + +insertinstalledpackage 'foo-same' 'i386,amd64' '2.0' 'Multi-Arch: same' +insertpackage 'unstable' 'foo-same' 'i386,amd64' '4.0' 'Multi-Arch: same' +insertpackage 'unstable' 'foo-same-provider' 'i386' '1.0' 'Provides: foo-same' +insertpackage 'unstable' 'foo-same-breaker-3' 'i386' '1.0' 'Conflicts: foo-same (<< 3.0)' +insertpackage 'unstable' 'foo-same-breaker-2' 'i386' '1.0' 'Conflicts: foo-same (<< 2.0)' +insertpackage 'unstable' 'foo-same-breaker-none' 'i386' '1.0' 'Conflicts: foo-same' + + + +setupaptarchive + +testfailureequal '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-breaker-none : Conflicts: foo +E: Unable to correct problems, you have held broken packages.' aptget install foo-provider foo-breaker-none -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-breaker-2 foo-provider +0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded. +Inst foo-breaker-2 (1.0 unstable [i386]) +Inst foo-provider (1.0 unstable [i386]) +Conf foo-breaker-2 (1.0 unstable [i386]) +Conf foo-provider (1.0 unstable [i386])' aptget install foo-provider foo-breaker-2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + foo-breaker-3 foo-provider +The following packages will be upgraded: + foo +1 upgraded, 2 newly installed, 0 to remove and 3 not upgraded. +Inst foo [2.0] (4.0 unstable [i386]) +Inst foo-breaker-3 (1.0 unstable [i386]) +Inst foo-provider (1.0 unstable [i386]) +Conf foo (4.0 unstable [i386]) +Conf foo-breaker-3 (1.0 unstable [i386]) +Conf foo-provider (1.0 unstable [i386])' aptget install foo-provider foo-breaker-3 -s + +testfailureequal '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-foreign-breaker-none : Conflicts: foo-foreign +E: Unable to correct problems, you have held broken packages.' aptget install foo-foreign-provider foo-foreign-breaker-none -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-foreign-breaker-2 foo-foreign-provider +0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded. +Inst foo-foreign-breaker-2 (1.0 unstable [i386]) +Inst foo-foreign-provider (1.0 unstable [i386]) +Conf foo-foreign-breaker-2 (1.0 unstable [i386]) +Conf foo-foreign-provider (1.0 unstable [i386])' aptget install foo-foreign-provider foo-foreign-breaker-2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo-foreign:amd64 +The following NEW packages will be installed: + foo-foreign-breaker-3 foo-foreign-provider +The following packages will be upgraded: + foo-foreign:amd64 +1 upgraded, 2 newly installed, 0 to remove and 3 not upgraded. +Inst foo-foreign:amd64 [2.0] (4.0 unstable [amd64]) +Inst foo-foreign-breaker-3 (1.0 unstable [i386]) +Inst foo-foreign-provider (1.0 unstable [i386]) +Conf foo-foreign:amd64 (4.0 unstable [amd64]) +Conf foo-foreign-breaker-3 (1.0 unstable [i386]) +Conf foo-foreign-provider (1.0 unstable [i386])' aptget install foo-foreign-provider foo-foreign-breaker-3 -s + +testfailureequal '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-same-breaker-none : Conflicts: foo-same +E: Unable to correct problems, you have held broken packages.' aptget install foo-same-provider foo-same-breaker-none -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-same-breaker-2 foo-same-provider +0 upgraded, 2 newly installed, 0 to remove and 4 not upgraded. +Inst foo-same-breaker-2 (1.0 unstable [i386]) +Inst foo-same-provider (1.0 unstable [i386]) +Conf foo-same-breaker-2 (1.0 unstable [i386]) +Conf foo-same-provider (1.0 unstable [i386])' aptget install foo-same-provider foo-same-breaker-2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo-same foo-same:amd64 +The following NEW packages will be installed: + foo-same-breaker-3 foo-same-provider +The following packages will be upgraded: + foo-same foo-same:amd64 +2 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. +Inst foo-same [2.0] (4.0 unstable [i386]) [foo-same:i386 on foo-same:amd64] [foo-same:amd64 on foo-same:i386] [foo-same:amd64 ] +Inst foo-same:amd64 [2.0] (4.0 unstable [amd64]) +Inst foo-same-breaker-3 (1.0 unstable [i386]) +Inst foo-same-provider (1.0 unstable [i386]) +Conf foo-same (4.0 unstable [i386]) +Conf foo-same:amd64 (4.0 unstable [amd64]) +Conf foo-same-breaker-3 (1.0 unstable [i386]) +Conf foo-same-provider (1.0 unstable [i386])' aptget install foo-same-provider foo-same-breaker-3 -s diff --git a/test/integration/test-implicit-conflicts-real-not-virtual b/test/integration/test-implicit-conflicts-real-not-virtual new file mode 100755 index 0000000..02bd442 --- /dev/null +++ b/test/integration/test-implicit-conflicts-real-not-virtual @@ -0,0 +1,56 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable-mp' 'crda' 'i386,amd64' '1.1.1-1ubuntu4mp' 'Provides: wireless-crda +Multi-Arch: foreign' +insertpackage 'unstable-m' 'crda' 'i386,amd64' '1.1.1-1ubuntu4m' 'Multi-Arch: foreign' +insertpackage 'unstable-p' 'crda' 'i386,amd64' '1.1.1-1ubuntu4p' 'Provides: wireless-crda' +insertpackage 'unstable' 'wireless-crda' 'i386,amd64' '1.16' + + +insertinstalledpackage 'wireless-crda' 'amd64' '1.14' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + crda +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst crda (1.1.1-1ubuntu4m unstable-m [amd64]) +Conf crda (1.1.1-1ubuntu4m unstable-m [amd64])' aptget install crda -s -t unstable-m + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + crda +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst crda (1.1.1-1ubuntu4p unstable-p [amd64]) +Conf crda (1.1.1-1ubuntu4p unstable-p [amd64])' aptget install crda -s -t unstable-p + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + crda +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst crda (1.1.1-1ubuntu4mp unstable-mp [amd64]) +Conf crda (1.1.1-1ubuntu4mp unstable-mp [amd64])' aptget install crda -s -t unstable-mp + +rm rootdir/var/lib/dpkg/status +insertinstalledpackage 'crda' 'amd64' '1.1.1-1ubuntu4mp' 'Provides: wireless-crda +Conflicts: wireless-crda (<< 1.15) +Replaces: wireless-crda ( << 1.15) +Multi-arch: foreign' + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + wireless-crda +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst wireless-crda (1.16 unstable [amd64]) +Conf wireless-crda (1.16 unstable [amd64])' aptget install wireless-crda -s -t unstable diff --git a/test/integration/test-kernel-helper-autoremove b/test/integration/test-kernel-helper-autoremove new file mode 100755 index 0000000..8cde343 --- /dev/null +++ b/test/integration/test-kernel-helper-autoremove @@ -0,0 +1,181 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +CURRENTKERNEL="linux-image-$(uname -r | tr '[A-Z]' '[a-z]')" +insertinstalledpackage "$CURRENTKERNEL" 'amd64' '5-1' +# debug packages do not need our protection +insertinstalledpackage "${CURRENTKERNEL}-dbg" 'amd64' '5-1' +# but other kernel flavours should be protected +insertinstalledpackage "${CURRENTKERNEL}-686-pae" 'i386' '5-1' +insertinstalledpackage "${CURRENTKERNEL}-rt" 'amd64' '5-1' +# some more versions +insertinstalledpackage 'linux-image-1.0.0-2-generic' 'amd64' '1.0.0-2' +insertinstalledpackage 'linux-image-100.0.0-1-generic' 'amd64' '100.0.0-1' +# kernel metapackages should be ignored +insertinstalledpackage 'linux-image-amd64' 'amd64' '200-1' +insertinstalledpackage 'linux-image-686-pae' 'i386' '300-1' +# ensure that the '.' is really a dot and not a wildcard +insertinstalledpackage 'linux-headers-1000000-1-generic' 'amd64' '100.0.0-1' +# ensure that the '+' is really a plus and not a regexp quantifier +insertinstalledpackage "${CURRENTKERNEL}+variant" 'amd64' '5-1' + +testsuccess aptmark auto "$CURRENTKERNEL" "${CURRENTKERNEL}-dbg" "${CURRENTKERNEL}-686-pae:i386" "${CURRENTKERNEL}-rt" \ + 'linux-image-1.0.0-2-generic' 'linux-image-100.0.0-1-generic' 'linux-headers-1000000-1-generic' "${CURRENTKERNEL}+variant" +testsuccess aptmark hold "${CURRENTKERNEL}-rt" + +testprotected() { + rm -f rootdir/etc/apt/apt.conf.d/01autoremove-kernels protected.list + + testsuccess runapt sh "${TESTDIR}/../../debian/apt.auto-removal.sh" "$@" + testfailure test -s rootdir/tmp/testsuccess.output + + msgtest 'Check kernel autoremoval protection list' 'is created' + testsuccess --nomsg test -e rootdir/etc/apt/apt.conf.d/01autoremove-kernels + testfilestats 'rootdir/etc/apt/apt.conf.d/01autoremove-kernels' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:444" + + msgtest 'Check kernel autoremoval protection list' 'can be dumped' + testsuccess --nomsg aptconfig dump --no-empty --format '%v%n' 'APT::NeverAutoRemove' + cp rootdir/tmp/testsuccess.output protected.list + + msgtest 'Check kernel autoremoval protection list' 'can be parsed' + testfailure --nomsg grep '^[A-Z]: ' protected.list + + msgtest 'Check kernel autoremoval protection list includes' 'most recent kernel' + testsuccess --nomsg grep '^\^linux-image-100\\\.0\\\.0-1-generic\$$' protected.list + + msgtest 'Check kernel autoremoval protection list includes' 'running kernel' + testsuccess --nomsg grep "^\\^linux-image-$(uname -r | tr '[A-Z]' '[a-z]' | sed -e 's#\.#\\\\.#g')\\\$\$" protected.list + + msgtest 'Check kernel autoremoval protection list does not include' 'metapackages' + testfailure --nomsg grep -e '^\^linux-image-amd64\$$' -e '^\^linux-image-686-pae\$$' -e ':i386' protected.list +} + +AUTOREMOVE='apt autoremove' +if [ -n "$SUDO_USER" ]; then + AUTOREMOVE="sudo $AUTOREMOVE" +fi +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages were automatically installed and are no longer required: + linux-headers-1000000-1-generic (100.0.0-1) + linux-image-1.0.0-2-generic (1.0.0-2) + linux-image-100.0.0-1-generic (100.0.0-1) + $CURRENTKERNEL (5-1) + ${CURRENTKERNEL}+variant (5-1) + ${CURRENTKERNEL}-686-pae:i386 (5-1) + ${CURRENTKERNEL}-dbg (5-1) +Use '$AUTOREMOVE' to remove them. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -sV +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages were automatically installed and are no longer required: + linux-headers-1000000-1-generic (100.0.0-1) + linux-image-1.0.0-2-generic (1.0.0-2) + linux-image-100.0.0-1-generic (100.0.0-1) + $CURRENTKERNEL (5-1) + ${CURRENTKERNEL}+variant (5-1) + ${CURRENTKERNEL}-686-pae:i386 (5-1) + ${CURRENTKERNEL}-dbg (5-1) + ${CURRENTKERNEL}-rt (5-1) +Use '$AUTOREMOVE' to remove them. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -sV --ignore-hold +testequal "Reading package lists... +Building dependency tree... +Reading state information... +7 packages were automatically installed and are no longer required. +Use '$AUTOREMOVE' to remove them. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s -o APT::Get::HideAutoRemove=small +testequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + linux-headers-1000000-1-generic (100.0.0-1) + linux-image-1.0.0-2-generic (1.0.0-2) + linux-image-100.0.0-1-generic (100.0.0-1) + $CURRENTKERNEL (5-1) + ${CURRENTKERNEL}+variant (5-1) + ${CURRENTKERNEL}-686-pae:i386 (5-1) + ${CURRENTKERNEL}-dbg (5-1) +0 upgraded, 0 newly installed, 7 to remove and 0 not upgraded. +Remv linux-headers-1000000-1-generic [100.0.0-1] +Remv linux-image-1.0.0-2-generic [1.0.0-2] +Remv linux-image-100.0.0-1-generic [100.0.0-1] +Remv $CURRENTKERNEL [5-1] +Remv ${CURRENTKERNEL}+variant [5-1] +Remv ${CURRENTKERNEL}-686-pae:i386 [5-1] +Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -sV + +msgmsg "run without parameter" +testprotected +msgtest 'Check kernel autoremoval protection list does not include' 'old kernel' +testfailure --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-generic\$$' protected.list +export COLUMNS=99999 +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + linux-headers-1000000-1-generic linux-image-1.0.0-2-generic ${CURRENTKERNEL}-dbg +0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded. +Remv linux-headers-1000000-1-generic [100.0.0-1] +Remv linux-image-1.0.0-2-generic [1.0.0-2] +Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s +unset COLUMNS + +msgmsg "install unknown kernel" +# even if installed/uname reports a kernel which we can't find via dpkg, +# ensure that we still protect it just in case as these are kernels we +# know for sure without complicated detection mechanisms +testprotected 1.0.0-2-ungeneric +msgtest 'Check kernel autoremoval protection list does not include' 'old kernel' +testfailure --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-generic\$$' protected.list +msgtest 'Check kernel autoremoval protection list does include' 'unknown installed kernel' +testsuccess --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-ungeneric\$$' protected.list +export COLUMNS=9 +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + linux-headers-1000000-1-generic + linux-image-1.0.0-2-generic + ${CURRENTKERNEL}-dbg +0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded. +Remv linux-headers-1000000-1-generic [100.0.0-1] +Remv linux-image-1.0.0-2-generic [1.0.0-2] +Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s +unset COLUMNS + +msgmsg "install an old kernel" +testprotected 1.0.0-2-generic +msgtest 'Check kernel autoremoval protection list includes' 'installed kernel' +testsuccess --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-generic\$$' protected.list +export COLUMNS=9 +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + linux-headers-1000000-1-generic + ${CURRENTKERNEL}-dbg +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +Remv linux-headers-1000000-1-generic [100.0.0-1] +Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s +unset COLUMNS + +# rt kernel was put on hold while the protected list was generated +testsuccess aptmark unhold "${CURRENTKERNEL}-rt" +export COLUMNS=99999 +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + linux-headers-1000000-1-generic ${CURRENTKERNEL}-dbg +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +Remv linux-headers-1000000-1-generic [100.0.0-1] +Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s +unset COLUMNS diff --git a/test/integration/test-method-connect b/test/integration/test-method-connect new file mode 100755 index 0000000..b35f96d --- /dev/null +++ b/test/integration/test-method-connect @@ -0,0 +1,13 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment + +cd downloaded +testfailureequal 'Err:1 http://vwakviie2ienjx6t.onion/ + Direct connection to .onion domains is blocked by default. If you meant to use Tor remember to use tor+http instead of http. +E: Failed to fetch http://vwakviie2ienjx6t.onion/ Direct connection to .onion domains is blocked by default. If you meant to use Tor remember to use tor+http instead of http. +E: Download Failed' apthelper download-file 'http://vwakviie2ienjx6t.onion/' ftp.debian.org.html diff --git a/test/integration/test-method-gpgv b/test/integration/test-method-gpgv new file mode 100755 index 0000000..bfa5af4 --- /dev/null +++ b/test/integration/test-method-gpgv @@ -0,0 +1,185 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +cat > faked-apt-key <<EOF +#!/bin/sh +set -e +find_gpgv_status_fd() { + while [ -n "\$1" ]; do + if [ "\$1" = '--status-fd' ]; then + shift + echo "\$1" + break + fi + shift + done +} +GPGSTATUSFD="\$(find_gpgv_status_fd "\$@")" +cat >&\${GPGSTATUSFD} gpgv.output +cat gpgv.output +EOF +chmod +x faked-apt-key + +testgpgv() { + echo "$4" > gpgv.output + msgtest "$1" "$2" + gpgvmethod >method.output 2>&1 || true + testsuccess --nomsg grep "^ $2\$" method.output + msgtest 'The reported signedby key is' "${3:-empty}" + testsuccess --nomsg grep "^ Signed-By:\s\+$3\$" method.output +} + +testrun() { + testgpgv 'Good signed with long keyid' 'Good: GOODSIG 5A90D141DBAC8DAE' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE!' '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2016-09-01 1472742625 0 4 0 1 11 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + testgpgv 'Good signed with fingerprint' 'Good: GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE!' '[GNUPG:] GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2016-09-01 1472742625 0 4 0 1 11 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + + testgpgv 'Good subkey signed with long keyid' 'Good: GOODSIG 5B6896415D44C43E' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE, 4281DEDBD466EAE8C1F4157E5B6896415D44C43E!' '[GNUPG:] GOODSIG 5B6896415D44C43E Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E 2018-08-16 1534459673 0 4 0 1 11 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + testgpgv 'Good subkey signed with fingerprint' 'Good: GOODSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE, 4281DEDBD466EAE8C1F4157E5B6896415D44C43E!' '[GNUPG:] GOODSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E 2018-08-16 1534459673 0 4 0 1 11 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + + testgpgv 'Untrusted signed with long keyid' 'Worthless: 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' '' '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2016-09-01 1472742625 0 4 0 1 1 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + testsuccess grep '^\s\+Good:\s\+$' method.output + testgpgv 'Untrusted signed with fingerprint' 'Worthless: 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' '' '[GNUPG:] GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2016-09-01 1472742625 0 4 0 1 1 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + testsuccess grep '^\s\+Good:\s\+$' method.output + + testgpgv 'Weak signed with long keyid' 'Good: GOODSIG 5A90D141DBAC8DAE' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE!' '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2016-09-01 1472742625 0 4 0 1 2 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + testsuccess grep '^Message: Signature by key 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE uses weak digest algorithm (SHA1)$' method.output + testgpgv 'Weak signed with fingerprint' 'Good: GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE!' '[GNUPG:] GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2016-09-01 1472742625 0 4 0 1 2 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' + testsuccess grep '^Message: Signature by key 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE uses weak digest algorithm (SHA1)$' method.output + + testgpgv 'No Pubkey with long keyid' 'NoPubKey: NO_PUBKEY E8525D47528144E2' '' '[GNUPG:] ERRSIG E8525D47528144E2 1 11 00 1472744666 9 +[GNUPG:] NO_PUBKEY E8525D47528144E2' + testgpgv 'No Pubkey with fingerprint' 'NoPubKey: NO_PUBKEY DE66AECA9151AFA1877EC31DE8525D47528144E2' '' '[GNUPG:] ERRSIG DE66AECA9151AFA1877EC31DE8525D47528144E2 1 11 00 1472744666 9 +[GNUPG:] NO_PUBKEY DE66AECA9151AFA1877EC31DE8525D47528144E2' + + testgpgv 'Expired key with long keyid' 'Worthless: EXPKEYSIG 4BC0A39C27CE74F9 Rex Expired <rex@example.org>' '' '[GNUPG:] EXPKEYSIG 4BC0A39C27CE74F9 Rex Expired <rex@example.org> +[GNUPG:] VALIDSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 2016-09-01 1472742629 0 4 0 1 11 00 891CC50E605796A0C6E733F74BC0A39C27CE74F9' + testgpgv 'Expired key with fingerprint' 'Worthless: EXPKEYSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 Rex Expired <rex@example.org>' '' '[GNUPG:] EXPKEYSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 Rex Expired <rex@example.org> +[GNUPG:] VALIDSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 2016-09-01 1472742629 0 4 0 1 11 00 891CC50E605796A0C6E733F74BC0A39C27CE74F9' +} + +echo 'Test' > message.data +cat >message.sig <<EOF +-----BEGIN PGP SIGNATURE----- + +iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt +cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l +3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg +X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k +V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx +pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns +JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq +=TB1F +-----END PGP SIGNATURE----- +EOF + + +gpgvmethod() { + echo "601 Configuration +Config-Item: Debug::Acquire::gpgv=1 +Config-Item: Dir::Bin::apt-key=./faked-apt-key +Config-Item: APT::Hashes::SHA1::Weak=true + +600 URI Acquire +URI: file://${TMPWORKINGDIRECTORY}/message.sig +Filename: ${TMPWORKINGDIRECTORY}/message.data +" | runapt "${METHODSDIR}/gpgv" +} +testrun + +gpgvmethod() { + echo "601 Configuration +Config-Item: Debug::Acquire::gpgv=1 +Config-Item: Dir::Bin::apt-key=./faked-apt-key +Config-Item: APT::Hashes::SHA1::Weak=true + +600 URI Acquire +URI: file://${TMPWORKINGDIRECTORY}/message.sig +Filename: ${TMPWORKINGDIRECTORY}/message.data +Signed-By: /dev/null,34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE +" | runapt "${METHODSDIR}/gpgv" +} +testrun + +gpgvmethod() { + echo "601 Configuration +Config-Item: Debug::Acquire::gpgv=1 +Config-Item: Dir::Bin::apt-key=./faked-apt-key +Config-Item: APT::Hashes::SHA1::Weak=true + +600 URI Acquire +URI: file://${TMPWORKINGDIRECTORY}/message.sig +Filename: ${TMPWORKINGDIRECTORY}/message.data +Signed-By: 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE,/dev/null +" | runapt "${METHODSDIR}/gpgv" +} +testrun + +testgpgv 'Good signed with long keyid but not signed-by key' 'NoPubKey: GOODSIG 4BC0A39C27CE74F9' '' '[GNUPG:] GOODSIG 4BC0A39C27CE74F9 Rex Expired <rex@example.org> +[GNUPG:] VALIDSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 2016-09-01 1472742625 0 4 0 1 11 00 891CC50E605796A0C6E733F74BC0A39C27CE74F9' +testsuccess grep '^\s\+Good:\s\+$' method.output +testsuccess grep 'verified because the public key is not available: GOODSIG' method.output +testgpgv 'Good signed with fingerprint but not signed-by key' 'NoPubKey: GOODSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9' '' '[GNUPG:] GOODSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 Rex Expired <rex@example.org> +[GNUPG:] VALIDSIG 891CC50E605796A0C6E733F74BC0A39C27CE74F9 2016-09-01 1472742625 0 4 0 1 11 00 891CC50E605796A0C6E733F74BC0A39C27CE74F9' +testsuccess grep '^\s\+Good:\s\+$' method.output +testsuccess grep 'verified because the public key is not available: GOODSIG' method.output + +gpgvmethod() { + echo "601 Configuration +Config-Item: Debug::Acquire::gpgv=1 +Config-Item: Dir::Bin::apt-key=./faked-apt-key +Config-Item: APT::Hashes::SHA1::Weak=true + +600 URI Acquire +URI: file://${TMPWORKINGDIRECTORY}/message.sig +Filename: ${TMPWORKINGDIRECTORY}/message.data +Signed-By: 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE! +" | runapt "${METHODSDIR}/gpgv" +} +testgpgv 'Exact matched subkey signed with long keyid' 'Good: GOODSIG 5A90D141DBAC8DAE' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE!' '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2018-08-16 1534459673 0 4 0 1 11 00 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' +testgpgv 'Exact matched subkey signed with fingerprint' 'Good: GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' '34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE!' '[GNUPG:] GOODSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2018-08-16 1534459673 0 4 0 1 11 00 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' + +testgpgv 'Exact unmatched subkey signed with long keyid' 'NoPubKey: GOODSIG 5B6896415D44C43E' '' '[GNUPG:] GOODSIG 5B6896415D44C43E Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E 2018-08-16 1534459673 0 4 0 1 11 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' +testsuccess grep '^\s\+Good:\s\+$' method.output +testsuccess grep 'verified because the public key is not available: GOODSIG' method.output +testgpgv 'Exact unmatched subkey signed with fingerprint' 'NoPubKey: GOODSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' '' '[GNUPG:] GOODSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 4281DEDBD466EAE8C1F4157E5B6896415D44C43E 2018-08-16 1534459673 0 4 0 1 11 00 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE' +testsuccess grep '^\s\+Good:\s\+$' method.output +testsuccess grep 'verified because the public key is not available: GOODSIG' method.output + +insertpackage 'unstable' 'foo' 'all' '1' +setupaptarchive --no-update + +echo '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2018-08-16 1534459673 0 4 0 1 11 00 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' > gpgv.output +testsuccess apt update -o Dir::Bin::apt-key="./faked-apt-key" -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 +rm -rf rootdir/var/lib/apt/lists + +echo '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Sebastian Subkey <subkey@example.org>' > gpgv.output +testfailure apt update -o Dir::Bin::apt-key="./faked-apt-key" -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 +rm -rf rootdir/var/lib/apt/lists + +echo '[GNUPG:] VALIDSIG 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE 2018-08-16 1534459673 0 4 0 1 11 00 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' > gpgv.output +testfailure apt update -o Dir::Bin::apt-key="./faked-apt-key" -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 +rm -rf rootdir/var/lib/apt/lists + +echo '[GNUPG:] GOODSIG 5A90D141DBAC8DAE Sebastian Subkey <subkey@example.org> +[GNUPG:] VALIDSIG 0000000000000000000000000000000000000000 2018-08-16 1534459673 0 4 0 1 11 00 4281DEDBD466EAE8C1F4157E5B6896415D44C43E' > gpgv.output +testfailure apt update -o Dir::Bin::apt-key="./faked-apt-key" -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 +rm -rf rootdir/var/lib/apt/lists diff --git a/test/integration/test-method-mirror b/test/integration/test-method-mirror new file mode 100755 index 0000000..56c9a10 --- /dev/null +++ b/test/integration/test-method-mirror @@ -0,0 +1,255 @@ +#!/bin/sh +set -e +umask 0 + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +umask 022 + +setupenvironment +configarchitecture "i386" + +buildsimplenativepackage 'foo' 'all' '1' 'stable' +buildsimplenativepackage 'foo' 'all' '2' 'unstable' +setupaptarchive --no-update +changetowebserver +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "http://localhost:${APTHTTPPORT}/" +addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/var/lib/apt/lists || true;" +mkdir -m 755 -p rootdir/var/lib/apt +touch rootdir/var/lib/apt/extended_states + +testrundownload_internal_debs() { + local WORKDIR="$1" + shift + if [ "$WORKDIR" != '.' ]; then cd "$WORKDIR"; fi + while [ -n "$1" ]; do + if [ "$1" = 'foo=1' ]; then shift; continue; fi + local fndeb="$(echo "$1" | tr '=' '_')_all.deb" + testsuccess test -e "$fndeb" + rm -f "$fndeb" + shift + done + if [ "$WORKDIR" != '.' ]; then cd - >/dev/null; fi +} +testrundownload_internal() { + cd downloaded + testsuccess apt install --download-only -o Debug::NoLocking=true -y "$@" + testrundownload_internal_debs '../rootdir/var/cache/apt/archives' "$@" + msgtest 'Repeat the download only install test with' 'aptitude' + if dpkg-checkbuilddeps -d 'aptitude' /dev/null >/dev/null 2>&1; then + if aptitude install --download-only -o Debug::NoLocking=true -y "$@" > ../rootdir/tmp/aptitude.log 2>&1; then + msgpass + else + msgfail + cat >&2 ../rootdir/tmp/aptitude.log + fi + testrundownload_internal_debs '../rootdir/var/cache/apt/archives' "$@" + else + msgskip 'not installed' + fi + testsuccess apt download "$@" -o Debug::pkgAcquire::Worker=1 + testrundownload_internal_debs '.' "$@" + testempty find . -name '*mirror*' + cd .. +} +testrundownload() { + if [ "$(id -u)" = '0' ]; then + testrundownload_internal "$@" + else + mkdir -p rootdir/var/cache/apt/archives/partial + echo 'Debug::SetupAPTPartialDirectory::AssumeGood "true";' > rootdir/etc/apt/apt.conf.d/assumegooddirs.conf + chmod -f 555 rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists/auxfiles rootdir/var/lib/apt/lists/partial + testrundownload_internal "$@" + testnotempty find rootdir/var/lib/apt/lists/auxfiles + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/auxfiles" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:555" + + chmod -f 755 rootdir/var/lib/apt/lists/auxfiles + rm -f rootdir/var/lib/apt/lists/auxfiles/* + chmod -f 555 rootdir/var/lib/apt/lists/auxfiles + testrundownload_internal "$@" + testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/auxfiles" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:555" + testempty find rootdir/var/lib/apt/lists/auxfiles ! -type d + + chmod -f 755 rootdir/var/lib/apt/lists + rm -rf rootdir/var/lib/apt/lists/auxfiles + chmod -f 555 rootdir/var/lib/apt/lists + testrundownload_internal "$@" + chmod -f 755 rootdir/var/lib/apt/lists + testsuccess test ! -d rootdir/var/lib/apt/lists/auxfiles + rm -f rootdir/etc/apt/apt.conf.d/assumegooddirs.conf + fi +} +testrun() { + rm -rf rootdir/var/lib/apt/lists + testsuccess apt update #-o Debug::Acquire::mirror=1 -o Debug::Acquire::http=1 -o Debug::pkgAcquire::Worker=1 + cp -a rootdir/tmp/testsuccess.output aptupdate.output + test -z "$1" || testempty find rootdir/var/lib/apt/lists -maxdepth 1 -name "$1" -type f + test -z "$2" || testnotempty find rootdir/var/lib/apt/lists -maxdepth 1 -name "$2" -type f + testsuccess apt show foo=1 + testrundownload 'foo=1' 'foo=2' +} + +msgmsg 'basic setup' +testrun '' '' + +msgmsg 'redirect setup' +sed -i -e 's#/ stable#/redirectme stable#' rootdir/etc/apt/sources.list.d/*-stable-* +testrun '' '*_redirectme_*' + +msgmsg 'mirror file does not exist' +sed -i -e 's# http:# mirror:#' -e 's#/redirectme stable#/mirror.txt stable#' rootdir/etc/apt/sources.list.d/*-stable-* +testfailure apt update + +echo "http://localhost:${APTHTTPPORT}" > aptarchive/mirror.txt + +msgmsg 'stable mirror setup' +testrun '*_redirectme_stable_*' '*_mirror.txt_*' + +msgmsg 'all mirror setup' +sed -i -e 's# http:# mirror:#' -e 's#/ unstable#/mirror.txt unstable#' rootdir/etc/apt/sources.list.d/* +testrun '*_redirectme_stable_*' '*_mirror.txt_*' + +msgmsg 'all mirror+http setup' +sed -i -e 's# mirror:# mirror+http:#' rootdir/etc/apt/sources.list.d/* +testrun '*_redirectme_*' '*_mirror.txt_*' + +msgmsg 'stable gzipped redirect setup' +echo "http://localhost:${APTHTTPPORT}/redirectme" > aptarchive/mirror.txt +compressfile aptarchive/mirror.txt +sed -i -e 's#/mirror\.txt stable#/mirror.txt.gz stable#' rootdir/etc/apt/sources.list.d/*-stable-* +testrun '*_redirectme_*' '*_mirror.txt.gz_*' + +msgmsg 'all mirrored via file' +APTARCHIVE="$(readlink -f ./aptarchive)" +sed -i -e "s#mirror+http://localhost:${APTHTTPPORT}#mirror+file:${APTARCHIVE}#" rootdir/etc/apt/sources.list.d/* +testrun '*_localhost_*' '*_aptarchive_mirror.txt.gz_*' + +msgmsg 'fallback mirrors are used if needed' 'as usual' +sed -i -e 's#/mirror\.txt\.gz stable#/mirror.txt stable#' rootdir/etc/apt/sources.list.d/* +echo "http://localhost:${APTHTTPPORT}/failure2 priority:3 +http://localhost:${APTHTTPPORT}/redirectme priority:2 +http://localhost:${APTHTTPPORT}/failure priority:1" > aptarchive/mirror.txt +testrun '*_localhost_*' '*_aptarchive_mirror.txt_*' +testsuccessequal "Get:1 file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Ign:2 http://localhost:${APTHTTPPORT}/failure stable InRelease + 404 Not Found +Ign:3 http://localhost:${APTHTTPPORT}/failure unstable InRelease + 404 Not Found" head -n 5 aptupdate.output + +msgmsg 'fallback mirrors are used if needed' 'by tags' +echo "http://localhost:${APTHTTPPORT}/failure2 priority:1 release:stable +http://localhost:${APTHTTPPORT}/redirectme priority:2 +http://localhost:${APTHTTPPORT}/failure priority:1 release:unstable" > aptarchive/mirror.txt +testrun '*_localhost_*' '*_aptarchive_mirror.txt_*' +testsuccessequal "Get:1 file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Ign:2 http://localhost:${APTHTTPPORT}/failure2 stable InRelease + 404 Not Found +Ign:3 http://localhost:${APTHTTPPORT}/failure unstable InRelease + 404 Not Found" head -n 5 aptupdate.output + +changetohttpswebserver +rm -f rootdir/etc/apt/sources.list.d/*-stable-* +msgmsg 'fallback mirrors are used if needed' 'random' +echo "http://localhost:${APTHTTPPORT}/failure2 priority:1 +http://localhost:${APTHTTPPORT}/redirectme priority:2 +https://localhost:${APTHTTPSPORT}/failure priority:1 +http://localhost:${APTHTTPPORT}/unused-failure1 +http://localhost:${APTHTTPPORT}/unused-failure2 +http://localhost:${APTHTTPPORT}/unused-failure3 +http://localhost:${APTHTTPPORT}/unused-failure4 +http://localhost:${APTHTTPPORT}/unused-failure5 +http://localhost:${APTHTTPPORT}/unused-failure6 +http://localhost:${APTHTTPPORT}/unused-failure7 +http://localhost:${APTHTTPPORT}/unused-failure8 +http://localhost:${APTHTTPPORT}/unused-failure9 +" > aptarchive/mirror.txt +testequalor2 "Get:1 file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Ign:2 http://localhost:${APTHTTPPORT}/failure2 unstable InRelease + 404 Not Found +Ign:2 https://localhost:${APTHTTPSPORT}/failure unstable InRelease + 404 Not Found +Hit:2 http://localhost:${APTHTTPPORT}/redirectme unstable InRelease +Reading package lists... +Building dependency tree... +Reading state information... +All packages are up to date." "Get:1 file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Ign:2 https://localhost:${APTHTTPSPORT}/failure unstable InRelease + 404 Not Found +Ign:2 http://localhost:${APTHTTPPORT}/failure2 unstable InRelease + 404 Not Found +Hit:2 http://localhost:${APTHTTPPORT}/failure2 unstable InRelease +Reading package lists... +Building dependency tree... +Reading state information... +All packages are up to date." apt update +testfailure grep '/unused-failure' aptarchive/webserver.log + +msgmsg 'Mirrors can be filtered by' 'type' +echo "http://localhost:${APTHTTPPORT}/failure +http://localhost:${APTHTTPPORT}/redirectme type:deb +" > aptarchive/mirror.txt +testfailure apt update +testrundownload 'foo=2' + +msgmsg 'The prefix for the mirrorlist is' 'passed on' +echo 'Dir::Bin::Methods::foo+mirror+file "mirror"; +Dir::Bin::Methods::foo+mirror+http "mirror"; +Dir::Bin::Methods::foo+http "http"; +Dir::Bin::Methods::foo+https "https"; +' > rootdir/etc/apt/apt.conf.d/99add-foo-method +echo "http://localhost:${APTHTTPPORT}/redirectme +" > aptarchive/mirror.txt +testsuccessequal "Get:1 file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Hit:2 http://localhost:${APTHTTPPORT}/redirectme unstable InRelease +Reading package lists... +Building dependency tree... +Reading state information... +All packages are up to date." apt update +testrundownload 'foo=2' +sed -i -e 's# mirror+# foo+mirror+#' rootdir/etc/apt/sources.list.d/* +testfailure apt update +testsuccess grep 'package apt-transport-foo installed' rootdir/tmp/testfailure.output +echo 'Dir::Bin::Methods::foo+file "file";' >> rootdir/etc/apt/apt.conf.d/99add-foo-method +testsuccessequal "Get:1 foo+file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Hit:2 foo+http://localhost:${APTHTTPPORT}/redirectme unstable InRelease +Reading package lists... +Building dependency tree... +Reading state information... +All packages are up to date." apt update +testrundownload 'foo=2' + +echo "file:/nonexistent/apt/archive priority:1 +http://localhost:${APTHTTPPORT}/redirectme +" > aptarchive/mirror.txt +testsuccessequal "Get:1 foo+file:${APTARCHIVE}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Get:2 foo+file:/nonexistent/apt/archive unstable InRelease +Ign:2 foo+file:/nonexistent/apt/archive unstable InRelease + File not found - /nonexistent/apt/archive/dists/unstable/InRelease (2: No such file or directory) +Hit:2 foo+http://localhost:${APTHTTPPORT}/redirectme unstable InRelease +Reading package lists... +Building dependency tree... +Reading state information... +All packages are up to date." apt update +sed -i -e "s#+file:${APTARCHIVE}#+http://localhost:${APTHTTPPORT}#" rootdir/etc/apt/sources.list.d/* +testsuccess apt update +testrundownload 'foo=2' + +testsuccessequal "Get:1 foo+http://localhost:${APTHTTPPORT}/mirror.txt Mirrorlist [$(stat -c%s 'aptarchive/mirror.txt') B] +Hit:2 foo+http://localhost:${APTHTTPPORT}/redirectme unstable InRelease +Reading package lists... +Building dependency tree... +Reading state information... +All packages are up to date." apt update +testrundownload 'foo=2' + +echo "https://localhost:${APTHTTPSPORT}/ +http://localhost:${APTHTTPPORT}/redirectme" > aptarchive/mirror.txt +rm -rf rootdir/var/lib/apt/lists +sed -i -e "s# foo+# [signed-by=$(readlink -f ./keys/joesixpack.pub)] foo+#g" rootdir/etc/apt/sources.list.d/apt-test-unstable-deb* +testsuccess apt update +testrundownload 'foo=2' + +rm -rf rootdir/var/lib/apt/lists +sed -i -e "s# \[signed-by=[^]]\+\] foo+# [signed-by=$(readlink -f ./keys/marvinparanoid.pub)] foo+#g" rootdir/etc/apt/sources.list.d/apt-test-unstable-deb* +testfailure apt update diff --git a/test/integration/test-method-rred b/test/integration/test-method-rred new file mode 100755 index 0000000..5a885e9 --- /dev/null +++ b/test/integration/test-method-rred @@ -0,0 +1,197 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +echo 'Package: coolstuff +Version: 0.8.15 +Description: collection of stuff + A lot, too much to iterate all, but at least this: + - stuff + - more stuff + - even more stuff + . + And a cow. + +Package: oldstuff +Version: 0-1 +Description: collection of outdated stuff + A lot, but of no use nowadays, but at least this: + - stuff + - more stuff + - even more stuff + . + And a dog.' > Packages + +testrred() { + msgtest "$1" "$2" + if [ -z "$3" ]; then + echo -n '' > Packages.ed + else + echo "$3" > Packages.ed + fi + rred() { + cat Packages | runapt "${METHODSDIR}/rred" "$@" + } + testsuccessequal "$4" --nomsg rred -f Packages.ed + testsuccess runapt "${METHODSDIR}/rred" -t Packages Packages-patched Packages.ed + testfileequal Packages-patched "$4" +} + +testrred 'Remove' 'first line' '1d' "$(tail -n +2 ./Packages)" +testrred 'Remove' 'empty line' '10d' "$(head -n 9 ./Packages) +$(tail -n 9 ./Packages)" +testrred 'Remove' 'line in a paragraph' '5d' "$(head -n 4 ./Packages) +$(tail -n 14 ./Packages)" +testrred 'Remove' 'last line' '19d' "$(head -n -1 ./Packages)" +testrred 'Remove' 'multiple single lines' '17d +7d' "$(sed -e '/^ - even more stuff$/ d' ./Packages)" +testrred 'Remove' 'first paragraph' '1,10d' "$(tail -n 9 ./Packages)" +testrred 'Remove' 'a few lines in the middle' '5,14d' "$(head -n 4 ./Packages) +$(tail -n 5 ./Packages)" +testrred 'Remove' 'second paragraph' '10,19d' "$(head -n 9 ./Packages)" +testrred 'Mass Remove' 'all stuff lines' '15,17d +13d +11d +5,7d +3d +1d' "$(sed '/stuff/ d' ./Packages)" + +testrred 'Single line add' 'first line' '0a +Format: 3.0 (native) +.' "Format: 3.0 (native) +$(cat ./Packages)" +testrred 'Single line add' 'last line' '19a +Multi-Arch: foreign +.' "$(cat ./Packages) +Multi-Arch: foreign" +testrred 'Single line add' 'middle' '9a +Multi-Arch: foreign +.' "$(head -n 9 ./Packages) +Multi-Arch: foreign +$(tail -n 10 ./Packages)" + +testrred 'Multi line add' 'first line' '0a +Format: 3.0 (native) +Source: apt +.' "Format: 3.0 (native) +Source: apt +$(cat ./Packages)" +testrred 'Multi line add' 'last line' '19a +Multi-Arch: foreign +Homepage: https://debian.org +.' "$(cat ./Packages) +Multi-Arch: foreign +Homepage: https://debian.org" +testrred 'Multi line add' 'middle' '9a +Multi-Arch: foreign +Homepage: https://debian.org +.' "$(head -n 9 ./Packages) +Multi-Arch: foreign +Homepage: https://debian.org +$(tail -n 10 ./Packages)" + +testrred 'Single line change' 'first line' '1c +Package: supercoolstuff +.' "Package: supercoolstuff +$(tail -n +2 ./Packages)" +testrred 'Single line change' 'in the middle' '9c + And a super cow. +.' "$(head -n 8 ./Packages) + And a super cow. +$(tail -n 10 ./Packages)" +testrred 'Single line change' 'an empty line' '10c + +.' "$(head -n 9 ./Packages) + +$(tail -n 9 ./Packages)" +testrred 'Single line change' 'a spacy line' '10c + +.' "$(head -n 9 ./Packages) + +$(tail -n 9 ./Packages)" +testrred 'Single line change' 'last line' '19c + And a cat. +.' "$(head -n -1 ./Packages) + And a cat." + +testrred 'Multi line change' 'exchange' '5,7c + - good stuff + - more good stuff + - even more good stuff +.' "$(head -n 4 ./Packages) + - good stuff + - more good stuff + - even more good stuff +$(tail -n 12 ./Packages)" +testrred 'Multi line change' 'less' '5,7c + - good stuff + - more good stuff +.' "$(head -n 4 ./Packages) + - good stuff + - more good stuff +$(tail -n 12 ./Packages)" +testrred 'Multi line change' 'more' '5,7c + - good stuff + - more good stuff + - even more good stuff + - bonus good stuff +.' "$(head -n 4 ./Packages) + - good stuff + - more good stuff + - even more good stuff + - bonus good stuff +$(tail -n 12 ./Packages)" + +failrred() { + msgtest 'Failure caused by' "$1" + echo "$2" > Packages.ed + rred() { + cat Packages | runapt "${METHODSDIR}/rred" "$@" + } + testfailure --nomsg rred -f Packages.ed + testfailure runapt "${METHODSDIR}/rred" -t Packages Packages-patched Packages.ed +} + +failrred 'Bogus content' '<html> +</html>' + +# not a problem per-se, but we want our parser to be really strict +failrred 'Empty patch file' '' +failrred 'Empty line patch file' ' +' +failrred 'Empty line before command' ' +1d' +failrred 'Empty line after command' '1d +' +failrred 'Empty line between commands' '17d + +7d' +failrred 'Empty spaces lines before command' ' +1d' +failrred 'Empty spaces lines after command' '1d + ' +failrred 'Empty spaces lines between commands' '17d + +7d' + +# the line before the first one can't be deleted/changed +failrred 'zero line delete' '0d' +failrred 'zero line change' '0c +Package: supercoolstuff +.' +# and this makes no sense at all +failrred 'negative line delete' '-1d' +failrred 'negative line change' '-1c +Package: supercoolstuff +.' +failrred 'negative line add' '-1a +Package: supercoolstuff +.' +failrred 'Wrong order of commands' '7d +17d' +failrred 'End before start' '7,6d' diff --git a/test/integration/test-multiarch-allowed b/test/integration/test-multiarch-allowed new file mode 100755 index 0000000..98555bc --- /dev/null +++ b/test/integration/test-multiarch-allowed @@ -0,0 +1,302 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +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' '1' 'Depends: coolfoo, coolbar' +insertpackage 'unstable' 'needscoolfooany' 'amd64' '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 +testfailureequal "$BADPREFIX +The following packages have unmet dependencies: + needsfoo:i386 : Depends: foo:i386 but it is not going to be installed +E: Unable to correct problems, you have held broken packages." aptget install needsfoo:i386 foo:amd64 -s +testfailureequal "$BADPREFIX +The following packages have unmet dependencies: + needsfoo : Depends: foo but it is not going to be installed +E: Unable to correct problems, you have held broken packages." aptget install needsfoo foo:i386 -s + +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' + +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." +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() { + 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 + # the message differs slightly between single and multiarch + testfailuremsg 'E: Unable to correct problems, you have held broken packages.' aptget install foo hatesfooany -s + 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 +} +solveableinsinglearch2 +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 +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 +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 + +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 + testsuccessequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + coolfoo +The following NEW packages will be installed: + coolfoo needscoolfooany +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst coolfoo (1 unstable [amd64]) +Inst needscoolfooany (1 unstable [amd64]) +Conf coolfoo (1 unstable [amd64]) +Conf needscoolfooany (1 unstable [amd64])" aptget install needscoolfooany -s + 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 + 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 + 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 +} +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 + +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:any' + +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: + coolfoo:armel +The following NEW packages will be installed: + coolfoo needscoolfoover0 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv coolfoo:armel [1] [bar-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 diff --git a/test/integration/test-multiarch-foreign b/test/integration/test-multiarch-foreign new file mode 100755 index 0000000..713b27b --- /dev/null +++ b/test/integration/test-multiarch-foreign @@ -0,0 +1,287 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' 'armel' + +insertpackage 'unstable' 'cool-foo' 'amd64,i386' '1.0' 'Depends: foo' +insertpackage 'unstable' 'cool-foo-x64' 'amd64' '1.0' 'Depends: foo:amd64' +insertpackage 'unstable' 'cool-foo-x32' 'amd64' '1.0' 'Depends: foo:i386' +insertpackage 'unstable' 'hates-foo' 'amd64,i386' '1.0' 'Conflicts: foo' +insertpackage 'unstable' 'hates-foo-x64' 'amd64' '1.0' 'Conflicts: foo:amd64' +insertpackage 'unstable' 'hates-foo-x32' 'amd64' '1.0' 'Conflicts: foo:i386' +insertpackage 'unstable' 'foo' 'amd64,i386,armel' '1.0' 'Multi-Arch: foreign' + +insertpackage 'unstable' 'cool-bar' 'amd64,i386' '1.0' 'Depends: bar-provider' +insertpackage 'unstable' 'cool-bar-x64' 'amd64' '1.0' 'Depends: bar-provider:amd64' +insertpackage 'unstable' 'cool-bar-x32' 'amd64' '1.0' 'Depends: bar-provider:i386' +insertpackage 'unstable' 'hates-bar' 'amd64,i386' '1.0' 'Conflicts: bar-provider' +insertpackage 'unstable' 'hates-bar-x64' 'amd64' '1.0' 'Conflicts: bar-provider:amd64' +insertpackage 'unstable' 'hates-bar-x32' 'amd64' '1.0' 'Conflicts: bar-provider:i386' +insertpackage 'unstable' 'bar' 'amd64,i386,armel' '1.0' 'Provides: bar-provider +Multi-Arch: foreign' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + cool-foo:i386 foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [amd64]) +Inst cool-foo:i386 (1.0 unstable [i386]) +Conf foo (1.0 unstable [amd64]) +Conf cool-foo:i386 (1.0 unstable [i386])' aptget install cool-foo:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + cool-foo foo:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo:i386 (1.0 unstable [i386]) +Inst cool-foo (1.0 unstable [amd64]) +Conf foo:i386 (1.0 unstable [i386]) +Conf cool-foo (1.0 unstable [amd64])' aptget install cool-foo:amd64 foo:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + cool-foo foo:armel +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo:armel (1.0 unstable [armel]) +Inst cool-foo (1.0 unstable [amd64]) +Conf foo:armel (1.0 unstable [armel]) +Conf cool-foo (1.0 unstable [amd64])' aptget install cool-foo:amd64 foo:armel -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar +The following NEW packages will be installed: + bar cool-bar:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [amd64]) +Inst cool-bar:i386 (1.0 unstable [i386]) +Conf bar (1.0 unstable [amd64]) +Conf cool-bar:i386 (1.0 unstable [i386])' aptget install cool-bar:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar:i386 cool-bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar:i386 (1.0 unstable [i386]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar:i386 (1.0 unstable [i386]) +Conf cool-bar (1.0 unstable [amd64])' aptget install cool-bar:amd64 bar:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar:armel cool-bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar:armel (1.0 unstable [armel]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar:armel (1.0 unstable [armel]) +Conf cool-bar (1.0 unstable [amd64])' aptget install cool-bar:amd64 bar:armel -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'bar:i386' instead of 'bar-provider:i386' +The following NEW packages will be installed: + bar:i386 cool-bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar:i386 (1.0 unstable [i386]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar:i386 (1.0 unstable [i386]) +Conf cool-bar (1.0 unstable [amd64])" aptget install cool-bar bar-provider:i386 -s + +satisfiable_in_singlearch() { + testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + cool-foo foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [amd64]) +Inst cool-foo (1.0 unstable [amd64]) +Conf foo (1.0 unstable [amd64]) +Conf cool-foo (1.0 unstable [amd64])' aptget install cool-foo:amd64 -s + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + cool-foo foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [amd64]) +Inst cool-foo (1.0 unstable [amd64]) +Conf foo (1.0 unstable [amd64]) +Conf cool-foo (1.0 unstable [amd64])' aptget install cool-foo:amd64 foo:amd64 -s + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar +The following NEW packages will be installed: + bar cool-bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [amd64]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar (1.0 unstable [amd64]) +Conf cool-bar (1.0 unstable [amd64])' aptget install cool-bar:amd64 -s + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar cool-bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [amd64]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar (1.0 unstable [amd64]) +Conf cool-bar (1.0 unstable [amd64])' aptget install cool-bar:amd64 bar:amd64 -s + + testsuccessequal "Reading package lists... +Building dependency tree... +Note, selecting 'bar' instead of 'bar-provider' +The following NEW packages will be installed: + bar cool-bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [amd64]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar (1.0 unstable [amd64]) +Conf cool-bar (1.0 unstable [amd64])" aptget install cool-bar bar-provider -s + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + cool-foo-x64 foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [amd64]) +Inst cool-foo-x64 (1.0 unstable [amd64]) +Conf foo (1.0 unstable [amd64]) +Conf cool-foo-x64 (1.0 unstable [amd64])' aptget install cool-foo-x64 -s +} + +hatersgonnahate() { + 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: +' + testfailureequal "$BADPREFIX +The following packages have unmet dependencies: + hates-foo : Conflicts: foo + Conflicts: foo:i386 + Conflicts: foo:armel +E: Unable to correct problems, you have held broken packages." aptget install $1 hates-foo -s + testfailureequal "$BADPREFIX +The following packages have unmet dependencies: + $2 : Conflicts: foo:$4 +E: Unable to correct problems, you have held broken packages." aptget install $1 $2 -s + testsuccessequal "Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + $1 $3 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst $1 (1.0 unstable [$4]) +Inst $3 (1.0 unstable [amd64]) +Conf $1 (1.0 unstable [$4]) +Conf $3 (1.0 unstable [amd64])" aptget install $1 $3 -s +} +hatersgonnahate 'foo' 'hates-foo-x64' 'hates-foo-x32' 'amd64' +hatersgonnahate 'foo:i386' 'hates-foo-x32' 'hates-foo-x64' 'i386' + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo:i386 +The following NEW packages will be installed: + cool-foo-x32 foo:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo:i386 (1.0 unstable [i386]) +Inst cool-foo-x32 (1.0 unstable [amd64]) +Conf foo:i386 (1.0 unstable [i386]) +Conf cool-foo-x32 (1.0 unstable [amd64])' aptget install cool-foo-x32 -s + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar:i386 +The following NEW packages will be installed: + bar:i386 cool-bar-x32 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar:i386 (1.0 unstable [i386]) +Inst cool-bar-x32 (1.0 unstable [amd64]) +Conf bar:i386 (1.0 unstable [i386]) +Conf cool-bar-x32 (1.0 unstable [amd64])' aptget install cool-bar-x32 -s + + testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar +The following NEW packages will be installed: + bar cool-bar-x64 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1.0 unstable [amd64]) +Inst cool-bar-x64 (1.0 unstable [amd64]) +Conf bar (1.0 unstable [amd64]) +Conf cool-bar-x64 (1.0 unstable [amd64])' aptget install cool-bar-x64 -s + + +satisfiable_in_singlearch + +msgmsg 'switch to single architecture' +configarchitecture 'amd64' + +satisfiable_in_singlearch + +msgmsg 'switch to multi-arch with barbarian architecture' + +insertinstalledpackage 'foo' 'armhf' '1.0' 'Multi-Arch: foreign' +insertinstalledpackage 'bar' 'armhf' '1.0' 'Provides: bar-provider +Multi-Arch: foreign' +insertinstalledpackage 'bar-needer' 'armhf' '1.0' 'Depends: bar-provider' + +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:armhf +The following NEW packages will be installed: + cool-foo foo +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv foo:armhf [1.0] +Inst foo (1.0 unstable [amd64]) +Inst cool-foo (1.0 unstable [amd64]) +Conf foo (1.0 unstable [amd64]) +Conf cool-foo (1.0 unstable [amd64])' aptget install cool-foo -s +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar +The following packages will be REMOVED: + bar:armhf +The following NEW packages will be installed: + bar cool-bar +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv bar:armhf [1.0] [bar-needer:armhf ] +Inst bar (1.0 unstable [amd64]) +Inst cool-bar (1.0 unstable [amd64]) +Conf bar (1.0 unstable [amd64]) +Conf cool-bar (1.0 unstable [amd64])' aptget install cool-bar -s + +# a barbarian doesn't satisfy another either +insertinstalledpackage 'bar-needer2' 's390x' '1.0' 'Depends: bar-provider' +testfailure aptget check diff --git a/test/integration/test-no-fds-leaked-to-maintainer-scripts b/test/integration/test-no-fds-leaked-to-maintainer-scripts new file mode 100755 index 0000000..85b3d0e --- /dev/null +++ b/test/integration/test-no-fds-leaked-to-maintainer-scripts @@ -0,0 +1,179 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' 'i386' +configdpkgnoopchroot + +if [ ! -e /proc/self/fd ]; then + msgskip "needs /proc/self/fd" + exit 0 +fi + +setupsimplenativepackage "fdleaks" 'all' '1.0' 'unstable' +BUILDDIR="incoming/fdleaks-1.0" +for script in 'preinst' 'postinst' 'prerm' 'postrm'; do + cat > ${BUILDDIR}/debian/$script << EOF +#!/bin/sh +if [ -e '$(pwd)/rootdir/tmp/read_stdin' ]; then + read line; + echo "STDIN: -\$line-" +fi +ls -l /proc/self/fd/ +EOF +done +buildpackage "$BUILDDIR" 'unstable' 'main' 'native' +rm -rf "$BUILDDIR" + +PKGNAME='fdleaks:all' +if dpkg --compare-versions "$(dpkg_version)" 'lt' '1.16.2'; then + PKGNAME='fdleaks' +fi + +setupaptarchive + +rm -f rootdir/var/log/dpkg.log rootdir/var/log/apt/term.log +testsuccess aptget install -y fdleaks -qq < /dev/null + +checkfdleak() { + msgtest 'Check if fds were not' "leaked: expect $1" + if [ "$(grep 'root root' rootdir/tmp/testsuccess.output | wc -l)" = "$1" ]; then + msgpass + else + echo + cat rootdir/tmp/testsuccess.output + msgfail + fi +} +checkinstall() { + checkfdleak 8 + + cp rootdir/tmp/testsuccess.output terminal.output + tail -n +3 rootdir/var/log/apt/term.log | head -n -1 > terminal.log + testfileequal 'terminal.log' "$(cat terminal.output)" + + testequalor2 "startup archives unpack +install $PKGNAME <none> 1.0 +status half-installed $PKGNAME 1.0 +status unpacked $PKGNAME 1.0 +startup packages configure +configure $PKGNAME 1.0 <none> +status unpacked $PKGNAME 1.0 +status half-configured $PKGNAME 1.0 +status installed $PKGNAME 1.0" "startup archives unpack +install $PKGNAME <none> 1.0 +status half-installed $PKGNAME 1.0 +status unpacked $PKGNAME 1.0 +status unpacked $PKGNAME 1.0 +startup packages configure +configure $PKGNAME 1.0 <none> +status unpacked $PKGNAME 1.0 +status half-configured $PKGNAME 1.0 +status installed $PKGNAME 1.0" cut -f 3- -d' ' rootdir/var/log/dpkg.log +} +checkinstall + +rm -f rootdir/var/log/dpkg.log rootdir/var/log/apt/term.log +testsuccess aptget purge -y fdleaks -qq +checkpurge() { + checkfdleak 12 + + cp rootdir/tmp/testsuccess.output terminal.output + tail -n +3 rootdir/var/log/apt/term.log | head -n -1 > terminal.log + testfileequal 'terminal.log' "$(cat terminal.output)" + + if dpkg --compare-versions "$(dpkg_version)" 'ge' '1.18.11'; then + testequalor2 "startup packages remove +status installed $PKGNAME 1.0 +remove $PKGNAME 1.0 <none> +status half-configured $PKGNAME 1.0 +status half-installed $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +startup packages configure +startup packages purge +purge $PKGNAME 1.0 <none> +status config-files $PKGNAME 1.0 +status not-installed $PKGNAME <none> +startup packages configure" "startup packages remove +status installed $PKGNAME 1.0 +remove $PKGNAME 1.0 <none> +status half-configured $PKGNAME 1.0 +status half-installed $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +startup packages configure +startup packages purge +purge $PKGNAME 1.0 <none> +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status not-installed $PKGNAME <none> +startup packages configure" cut -f 3- -d' ' rootdir/var/log/dpkg.log + else + testequalor2 "startup packages remove +status installed $PKGNAME 1.0 +remove $PKGNAME 1.0 <none> +status half-configured $PKGNAME 1.0 +status half-installed $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +startup packages configure +startup packages purge +remove $PKGNAME 1.0 <none> +purge $PKGNAME 1.0 <none> +status config-files $PKGNAME 1.0 +status not-installed $PKGNAME <none> +startup packages configure" "startup packages remove +status installed $PKGNAME 1.0 +remove $PKGNAME 1.0 <none> +status half-configured $PKGNAME 1.0 +status half-installed $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +startup packages configure +startup packages purge +remove $PKGNAME 1.0 <none> +purge $PKGNAME 1.0 <none> +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status config-files $PKGNAME 1.0 +status not-installed $PKGNAME <none> +startup packages configure" cut -f 3- -d' ' rootdir/var/log/dpkg.log + fi + testequalor2 "dpkg-query: no packages found matching ${PKGNAME}" "No packages found matching ${PKGNAME}." dpkg -l "$PKGNAME" +} +checkpurge + +msgtest 'setsid provided is new enough to support' '-w' +if dpkg-checkbuilddeps -d 'util-linux (>= 2.24.2-1)' /dev/null >/dev/null 2>&1; then + msgpass +else + msgskip "$(command dpkg -l util-linux)" + exit +fi + +rm -f rootdir/var/log/dpkg.log rootdir/var/log/apt/term.log +testsuccess runapt command setsid -w "${BUILDDIRECTORY}/apt-get" install -y fdleaks -qq < /dev/null +checkinstall + +rm -f rootdir/var/log/dpkg.log rootdir/var/log/apt/term.log +testsuccess runapt command setsid -w "${BUILDDIRECTORY}/apt-get" purge -y fdleaks -qq +checkpurge + +touch rootdir/tmp/read_stdin + +rm -f rootdir/var/log/dpkg.log rootdir/var/log/apt/term.log +for i in $(seq 1 10); do echo "$i"; done | testsuccess aptget install -y fdleaks -qq +checkinstall +testequal '2' grep -c '^STDIN: ' rootdir/var/log/apt/term.log + +rm -f rootdir/var/log/dpkg.log rootdir/var/log/apt/term.log +yes '' | testsuccess runapt command setsid -w "${BUILDDIRECTORY}/apt-get" purge -y fdleaks -qq +checkpurge +testequal '3' grep -c '^STDIN: ' rootdir/var/log/apt/term.log diff --git a/test/integration/test-package-reinstallation b/test/integration/test-package-reinstallation new file mode 100755 index 0000000..0b48c0a --- /dev/null +++ b/test/integration/test-package-reinstallation @@ -0,0 +1,23 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertinstalledpackage 'libc-bin' 'i386' '2.13-8' 'Replaces: libc6' +insertpackage 'unstable' 'libc-bin' 'i386' '2.13-8' 'Replaces: libc6' +insertinstalledpackage 'libc6' 'i386' '2.13-8' 'Depends: libc-bin (= 2.13-8)' +insertpackage 'unstable' 'libc6' 'i386' '2.13-8' 'Depends: libc-bin (= 2.13-8)' +insertinstalledpackage 'apt' 'i386' '0.8.15' 'Depends: libc6' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded. +Inst libc-bin [2.13-8] (2.13-8 unstable [i386]) +Conf libc-bin (2.13-8 unstable [i386]) +Inst libc6 [2.13-8] (2.13-8 unstable [i386]) +Conf libc6 (2.13-8 unstable [i386])' aptget install --reinstall libc6 libc-bin -s diff --git a/test/integration/test-packages-require-authorization b/test/integration/test-packages-require-authorization new file mode 100755 index 0000000..527497c --- /dev/null +++ b/test/integration/test-packages-require-authorization @@ -0,0 +1,61 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'cool' 'amd64' '1.0' + +export APT_DONT_SIGN='InRelease' +setupaptarchive --no-update +changetowebserver + +echo 'Packages-Require-Authorization: yes' >> aptarchive/dists/unstable/Release +signreleasefiles + +testsuccess aptget update +testsuccessequal "Package files: + 100 ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status + release a=now +-32768 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages + release a=unstable,n=sid,c=main,b=amd64 + origin localhost +Pinned packages:" aptcache policy + +mkdir rootdir/etc/apt/auth.conf.d +cat > rootdir/etc/apt/auth.conf.d/myauth.conf << EOF +machine localhost +login username +password usersPassword +EOF + + +testsuccessequal "Package files: + 100 ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status + release a=now + 500 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages + release a=unstable,n=sid,c=main,b=amd64 + origin localhost +Pinned packages:" aptcache policy + + +cat > rootdir/etc/apt/preferences.d/myauth.pref << EOF +Package: * +Pin: origin localhost +Pin-Priority: 990 + +Package: cool +Pin: origin localhost +Pin-Priority: 990 +EOF + +testsuccessequal "Package files: + 100 ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status + release a=now + 990 http://localhost:${APTHTTPPORT} unstable/main amd64 Packages + release a=unstable,n=sid,c=main,b=amd64 + origin localhost +Pinned packages: + cool -> 1.0 with priority 990" aptcache policy diff --git a/test/integration/test-parse-all-archs-into-cache b/test/integration/test-parse-all-archs-into-cache new file mode 100755 index 0000000..7485431 --- /dev/null +++ b/test/integration/test-parse-all-archs-into-cache @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'bar' 'i386' '1' 'Depends: foo' +insertpackage 'unstable' 'foo' 'i386' '1' 'Multi-Arch: foreign +Depends: libfoo1' +insertpackage 'unstable' 'libfoo1' 'i386' '1' 'Multi-Arch: same' +insertpackage 'experimental' 'foo' 'i386' '2' 'Multi-Arch: foreign +Depends: libfoo1 (>= 2)' +insertpackage 'experimental' 'libfoo1' 'i386' '2' 'Multi-Arch: same' + +# note: the system has amd64 not configured! +insertinstalledpackage 'foo' 'amd64' '1' 'Multi-Arch: foreign +Depends: libfoo1' + +setupaptarchive + +testfailureequal "Reading package lists... +Building dependency tree... +You might want to run 'apt --fix-broken install' to correct these. +The following packages have unmet dependencies: + foo:amd64 : Depends: libfoo1:amd64 but it is not installable +E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution)." aptget check -s + +insertinstalledpackage 'libfoo1' 'amd64' '1' 'Multi-Arch: same' + +testsuccessequal 'Reading package lists... +Building dependency tree...' aptget check -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libfoo1 +The following packages will be REMOVED: + foo:amd64 +The following NEW packages will be installed: + foo libfoo1 +0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded. +Remv foo:amd64 [1] +Inst libfoo1 (1 unstable [i386]) +Inst foo (1 unstable [i386]) +Conf libfoo1 (1 unstable [i386]) +Conf foo (1 unstable [i386])' aptget install foo -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Selected version '2' (experimental [i386]) for 'foo' +Selected version '2' (experimental [i386]) for 'libfoo1' because of 'foo' +The following additional packages will be installed: + libfoo1 +The following packages will be REMOVED: + foo:amd64 libfoo1:amd64 +The following NEW packages will be installed: + foo libfoo1 +0 upgraded, 2 newly installed, 2 to remove and 0 not upgraded. +Remv foo:amd64 [1] +Remv libfoo1:amd64 [1] +Inst libfoo1 (2 experimental [i386]) +Inst foo (2 experimental [i386]) +Conf libfoo1 (2 experimental [i386]) +Conf foo (2 experimental [i386])" aptget install foo/experimental -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo libfoo1 +The following packages will be REMOVED: + foo:amd64 +The following NEW packages will be installed: + bar foo libfoo1 +0 upgraded, 3 newly installed, 1 to remove and 0 not upgraded. +Remv foo:amd64 [1] +Inst libfoo1 (1 unstable [i386]) +Inst foo (1 unstable [i386]) +Inst bar (1 unstable [i386]) +Conf libfoo1 (1 unstable [i386]) +Conf foo (1 unstable [i386]) +Conf bar (1 unstable [i386])' aptget install bar -s + +configarchitecture 'i386' 'amd64' + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + bar +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1 unstable [i386]) +Conf bar (1 unstable [i386])' aptget install bar -s diff --git a/test/integration/test-partial-file-support b/test/integration/test-partial-file-support new file mode 100755 index 0000000..88fa913 --- /dev/null +++ b/test/integration/test-partial-file-support @@ -0,0 +1,157 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +changetowebserver + +copysource() { + dd if="$1" bs=1 count="$2" of="$3" 2>/dev/null + touch -d "$(stat --format '%y' "${TESTFILE}")" "$3" +} + +DOWNLOADLOG='rootdir/tmp/testdownloadfile.log' + +testdownloadfile() { + rm -f "$DOWNLOADLOG" + msgtest "Testing download of file $2 with" "$1 $5" + if ! downloadfile "$2" "$3" "$5" > "$DOWNLOADLOG"; then + cat >&2 "$DOWNLOADLOG" + msgfail + else + msgpass + fi + sed -e '/^ <- / s#%20# #g' -e '/^ <- / s#%0a#\n#g' "$DOWNLOADLOG" | grep '^.*-Hash: ' > receivedhashes.log || true + testsuccess test -s receivedhashes.log + local HASHES_OK=0 + local HASHES_BAD=0 + while read field hash; do + local EXPECTED + case "$field" in + 'MD5Sum-Hash:') EXPECTED="$(md5sum "$TESTFILE" | cut -d' ' -f 1)";; + 'SHA1-Hash:') EXPECTED="$(sha1sum "$TESTFILE" | cut -d' ' -f 1)";; + 'SHA256-Hash:') EXPECTED="$(sha256sum "$TESTFILE" | cut -d' ' -f 1)";; + 'SHA512-Hash:') EXPECTED="$(sha512sum "$TESTFILE" | cut -d' ' -f 1)";; + 'Checksum-FileSize-Hash:') + #filesize is too weak to check for != + if [ "$4" = '=' ]; then + EXPECTED="$(stat -c '%s' "$TESTFILE")" + else + continue + fi + ;; + *) continue;; + esac + if [ "$4" = '=' ]; then + msgtest 'Test downloaded file for correct' "$field" + else + msgtest 'Test downloaded file does not match in' "$field" + fi + if [ "$EXPECTED" "$4" "$hash" ]; then + msgpass + HASHES_OK=$((HASHES_OK+1)); + else + msgfail "expected: $EXPECTED ; got: $hash" + HASHES_BAD=$((HASHES_BAD+1)); + fi + done < receivedhashes.log + msgtest 'At least one good hash and no bad ones' + if [ $HASHES_OK -eq 0 ] || [ $HASHES_BAD -ne 0 ]; then + cat >&2 "$DOWNLOADLOG" + msgfail + else + msgpass + fi +} + +TESTFILE='aptarchive/testfile' +cp -a "${TESTDIR}/framework" "$TESTFILE" +cp -a "${TESTDIR}/framework" "${TESTFILE}2" + +followuprequest() { + local DOWN='./downloaded/testfile' + + copysource $TESTFILE 1M $DOWN + testdownloadfile 'completely downloaded file' "${1}/testfile" "$DOWN" '=' + testwebserverlaststatuscode '416' "$DOWNLOADLOG" + + webserverconfig 'aptwebserver::support::content-range' 'false' + copysource $TESTFILE 1M $DOWN + testdownloadfile 'completely downloaded file' "${1}/testfile" "$DOWN" '=' "SHA256:$(sha256sum "$TESTFILE" | cut -d' ' -f 1)" + testwebserverlaststatuscode '416' "$DOWNLOADLOG" + webserverconfig 'aptwebserver::support::content-range' 'true' + + copysource $TESTFILE 1M $DOWN + copysource "${TESTFILE}2" 20 "${DOWN}2" + msgtest 'Testing download of files with' 'completely downloaded file + partial file' + testsuccess --nomsg apthelper -o Debug::Acquire::${1%%:*}=1 -o Debug::pkgAcquire::Worker=1 \ + download-file "$1/testfile" "$DOWN" '' "$1/testfile2" "${DOWN}2" + testwebserverlaststatuscode '206' 'rootdir/tmp/testsuccess.output' + testsuccess diff -u "$TESTFILE" "${DOWN}" + testsuccess diff -u "${DOWN}" "${DOWN}2" +} + +testrun() { + webserverconfig 'aptwebserver::support::range' 'true' + webserverconfig 'aptwebserver::response-header::Accept-Ranges' 'bytes' + local DOWN='./downloaded/testfile' + + copysource $TESTFILE 0 $DOWN + testdownloadfile 'no data' "${1}/testfile" "$DOWN" '=' + testwebserverlaststatuscode '200' "$DOWNLOADLOG" + + copysource $TESTFILE 20 $DOWN + testdownloadfile 'valid partial data' "${1}/testfile" "$DOWN" '=' + testwebserverlaststatuscode '206' "$DOWNLOADLOG" + + copysource /dev/zero 20 $DOWN + testdownloadfile 'invalid partial data' "${1}/testfile" "$DOWN" '!=' + testwebserverlaststatuscode '206' "$DOWNLOADLOG" + + webserverconfig 'aptwebserver::closeOnError' 'false' + followuprequest "$1" + webserverconfig 'aptwebserver::closeOnError' 'true' + followuprequest "$1" + webserverconfig 'aptwebserver::closeOnError' 'false' + + copysource /dev/zero 1M $DOWN + testdownloadfile 'too-big partial file' "${1}/testfile" "$DOWN" '=' + testwebserverlaststatuscode '200' "$DOWNLOADLOG" + + copysource /dev/zero 20 $DOWN + touch $DOWN + testdownloadfile 'old data' "${1}/testfile" "$DOWN" '=' + testwebserverlaststatuscode '200' "$DOWNLOADLOG" + + if [ "${1%%:*}" = 'https' ] && expr match "$1" "^.*/redirectme$" >/dev/null; then + webserverconfig 'aptwebserver::response-header::Accept-Ranges' 'none' + else + webserverconfig 'aptwebserver::support::range' 'false' + fi + + copysource $TESTFILE 20 $DOWN + testdownloadfile 'no server support' "${1}/testfile" "$DOWN" '=' + testwebserverlaststatuscode '200' "$DOWNLOADLOG" +} + +serverconfigs() { + msgmsg "${1%%:*}: Test with Content-Length" + webserverconfig 'aptwebserver::chunked-transfer-encoding' 'false' + testrun "$1" + msgmsg "${1%%:*}: Test with Transfer-Encoding: chunked" + webserverconfig 'aptwebserver::chunked-transfer-encoding' 'true' + testrun "$1" +} + +serverconfigs "http://localhost:${APTHTTPPORT}" + +changetohttpswebserver + +serverconfigs "https://localhost:${APTHTTPSPORT}" + +webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "https://localhost:${APTHTTPSPORT}/" +serverconfigs "https://localhost:${APTHTTPSPORT}/redirectme" +serverconfigs "http://localhost:${APTHTTPPORT}/redirectme" diff --git a/test/integration/test-pdiff-usage b/test/integration/test-pdiff-usage new file mode 100755 index 0000000..c5726dd --- /dev/null +++ b/test/integration/test-pdiff-usage @@ -0,0 +1,417 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' +LOWCOSTEXT='lz4' + +buildaptarchive +setupflataptarchive +changetowebserver + +cat >rootdir/etc/apt/apt.conf.d/contents.conf <<EOF +Acquire::IndexTargets::deb::Contents { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE)/\$(COMPONENT) \$(ARCHITECTURE) Contents"; + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + flatMetaKey "Contents-\$(ARCHITECTURE)"; + flatDescription "\$(RELEASE) \$(ARCHITECTURE) Contents"; +}; +EOF + +PKGFILE="${TESTDIR}/$(echo "$(basename $0)" | sed 's#^test-#Packages-#')" +echo 'contents for stuff' > aptarchive/Contents-i386 +compressfile aptarchive/Contents-i386 +echo 'hacked' > aptarchive/hacked-i386 +compressfile aptarchive/hacked-i386 + +wasmergeused() { + if echo "$*" | grep -q -- '-o test::cannot-use-pdiff=1'; then + find rootdir/var/lib/apt/lists/partial -name '*-patched*' -delete + fi + + testsuccess apt update "$@" + #apt update "$@" 2>&1 | tee rootdir/tmp/testsuccess.output + + msgtest 'No intermediate patch files' 'still exist' + local EDS="$(find rootdir/var/lib/apt/lists -name '*.ed' -o -name '*.ed.*')" + if [ -z "$EDS" ]; then + msgpass + else + echo + echo "$EDS" + msgfail + fi + + if echo "$*" | grep -q -- '-o test::cannot-use-pdiff=1'; then + msgtest 'Check if pdiff was' 'not used' + cp -a rootdir/tmp/testsuccess.output rootdir/tmp/aptupdate.output + testsuccess --nomsg grep "^Ign:.* Packages\.diff/Index" rootdir/tmp/aptupdate.output + return; + fi + + msgtest 'Check if the right pdiff merger was used' + if grep -q '^pkgAcqIndexMergeDiffs::Done(): rred' rootdir/tmp/testsuccess.output; then + if echo "$*" | grep -q -- '-o Acquire::PDiffs::Merge=1'; then + msgpass + else + msgfail "Merge shouldn't have been used, but was" + fi + elif echo "$*" | grep -q -- '-o Acquire::PDiffs::Merge=1'; then + msgfail "Merge should have been used, but wasn't" + else + msgpass + fi + + testequal '1' grep -c rred:601 rootdir/tmp/testsuccess.output +} + +testrun() { + configcompression '.' 'xz' + msgmsg "Testcase: setup the base with: $*" + find aptarchive -name 'Packages*' -type f -delete + cp "${PKGFILE}" aptarchive/Packages + compressfile 'aptarchive/Packages' + generatereleasefiles + signreleasefiles + rm -rf aptarchive/Packages.diff rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists-bak + testsuccess aptget update "$@" + cp -a rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists-bak + testnopackage newstuff + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt oldstuff + configcompression '.' 'gz' + + # see if the code deals properly with leftover partial files + partialleftovers + + msgmsg "Testcase: apply with one patch: $*" + find aptarchive -name 'Packages*' -type f -delete + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e "${PKGFILE}" "${PKGFILE}-new" > "${PATCHFILE}" || true + cat "$PATCHFILE" | gzip > "${PATCHFILE}.gz" + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA256-Current: $(sha256sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE") +SHA256-Download: + d2a1b33187ed2d248eeae3b1223ea71791ea35f2138a713ed371332a6421f467 197 2010-08-18-2013.28.gz + $(sha256sum "${PATCHFILE}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE}.gz") $(basename "${PATCHFILE}.gz")" > "$PATCHINDEX" + + generatereleasefiles '+1hour' + signreleasefiles + find aptarchive -name 'Packages*' -type f -delete + wasmergeused "$@" + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: apply with compressed Index and one patch: $*" + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + cat "$PATCHINDEX" | gzip > "${PATCHINDEX}.gz" + generatereleasefiles '+1hour' + signreleasefiles + find aptarchive -name 'Packages*' -type f -delete + rm "$PATCHINDEX" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + wasmergeused "$@" + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: apply with by-hash compressed Index and one patch: $*" + local NORMAL="$(readlink -f "./aptarchive/Packages.diff")" + local BYHASH="${NORMAL}/by-hash/SHA256" + mkdir -p "${BYHASH}" + find "${NORMAL}/" -maxdepth 1 -name "Index*" -exec mv '{}' "$BYHASH" \; + ln -s "${BYHASH}/Index.gz" "${BYHASH}/$(sha256sum "${BYHASH}/Index.gz" | cut -f1 -d' ')" + echo 'foobar' > "${BYHASH}/$(sha256sum "$PATCHFILE" | cut -f1 -d' ')" + echo 'foobar' > "${BYHASH}/$(sha256sum "${PATCHFILE}.gz" | cut -f1 -d' ')" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + wasmergeused "$@" -o Acquire::By-Hash=force + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: SHA1-only patches are not used: $*" + find aptarchive -name 'Packages*' -type f -delete + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e "${PKGFILE}" "${PKGFILE}-new" > "${PATCHFILE}" || true + cat "$PATCHFILE" | gzip > "${PATCHFILE}.gz" + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA1-Current: $(sha1sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") +SHA1-History: + 9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28 + $(sha1sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") +SHA1-Patches: + 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28 + $(sha1sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE") +SHA1-Download: + 2365ac0ac57cde3d43c63145e8251a3bd5410213 197 2010-08-18-2013.28.gz + $(sha1sum "${PATCHFILE}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE}.gz") $(basename "${PATCHFILE}.gz")" > "$PATCHINDEX" + generatereleasefiles '+1hour' + signreleasefiles + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + wasmergeused "$@" -o test::cannot-use-pdiff=1 + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: no download-hashes patches are not used: $*" + find aptarchive -name 'Packages*' -type f -delete + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e "${PKGFILE}" "${PKGFILE}-new" > "${PATCHFILE}" || true + cat "$PATCHFILE" | gzip > "${PATCHFILE}.gz" + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA256-Current: $(sha256sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE")" > "$PATCHINDEX" + generatereleasefiles '+1hour' + signreleasefiles + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + wasmergeused "$@" -o test::cannot-use-pdiff=1 + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: apply with two patches: $*" + cp "${PKGFILE}-new" aptarchive/Packages + echo ' +Package: futurestuff +Version: 1.0 +Architecture: i386 +Maintainer: Joe Sixpack <joe@example.org> +Installed-Size: 202 +Filename: pool/futurestuff_1.0_i386.deb +Size: 202200 +SHA256: b46fd154615edaae5ba33c56a5cc0e7deaef23e2da3e4f129727fd660f28f050 +Description: some cool and shiny future stuff + This package will appear in the next^2 mirror update +Description-md5: d5f89fbbc2ce34c455dfee9b67d82b6b' >> aptarchive/Packages + + compressfile 'aptarchive/Packages' + PATCHFILE2="aptarchive/Packages.diff/$(date -d 'now + 1hour' '+%Y-%m-%d-%H%M.%S')" + diff -e "${PKGFILE}-new" aptarchive/Packages > "${PATCHFILE2}" || true + cat "$PATCHFILE2" | gzip > "${PATCHFILE2}.gz" + echo "SHA256-Current: $(sha256sum aptarchive/Packages | cut -d' ' -f 1) $(stat -c%s aptarchive/Packages) +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") + $(sha256sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") $(basename "${PATCHFILE2}") +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE") + $(sha256sum "${PATCHFILE2}" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE2}") $(basename "${PATCHFILE2}") +SHA256-Download: + d2a1b33187ed2d248eeae3b1223ea71791ea35f2138a713ed371332a6421f467 197 2010-08-18-2013.28.gz + $(sha256sum "${PATCHFILE}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE}.gz") $(basename "${PATCHFILE}.gz") + $(sha256sum "${PATCHFILE2}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE2}.gz") $(basename "${PATCHFILE2}.gz")" > "$PATCHINDEX" + + generatereleasefiles '+2hour' + signreleasefiles + cp -a aptarchive/Packages Packages-future + find aptarchive -name 'Packages*' -type f -delete + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + wasmergeused "$@" + testnopackage oldstuff + testsuccessequal "$(cat Packages-future) +" aptcache show apt newstuff futurestuff + + # we reuse the archive state of the previous test here + msgmsg "Testcase: pdiff handling is stopped if transaction fails $*" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + cp Packages-future aptarchive/Packages + rm -f rootdir/var/lib/apt/lists/*_Contents-* + webserverconfig 'aptwebserver::overwrite::.*Contents-.*::filename' '/hacked-i386.gz' + # This should work in at least 4% of the cases... + for i in $(seq 25); do + testfailure apt update "$@" + if ! grep 'rred:600' rootdir/tmp/testfailure.output; then + break + fi + done + webserverconfig 'aptwebserver::overwrite::.*Contents-.*::filename' '/Contents-i386.gz' + cp rootdir/tmp/testfailure.output patchdownload.output + testfailure grep 'rred:600' patchdownload.output + testnopackage newstuff futurestuff + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt oldstuff + + # we reuse the entire state of the previous test here + msgmsg "Testcase: good files from previous fails are picked up from partial: $*" + wasmergeused "$@" + testfailure grep '^GET /Packages.diff/Index HTTP/1.1' rootdir/tmp/testsuccess.output + testnopackage oldstuff + testsuccessequal "$(cat Packages-future) +" aptcache show apt newstuff futurestuff + + # we reuse the archive state of the previous test here + msgmsg "Testcase: downloading a patch fails, but successful fallback: $*" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + cp Packages-future aptarchive/Packages + rm "${PATCHFILE}.gz" + testsuccess apt update "$@" + cp rootdir/tmp/testsuccess.output patchdownload.output + testsuccess grep '^Falling back to normal index file acquire' patchdownload.output + testnopackage oldstuff + testsuccessequal "$(cat Packages-future) +" aptcache show apt newstuff futurestuff + + msgmsg "Testcase: patch applying fails, but successful fallback: $*" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e "${PKGFILE}" "${PKGFILE}-new" > "${PATCHFILE}" || true + cat "$PATCHFILE" | gzip > "${PATCHFILE}.gz" + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA256-Current: $(sha256sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE") +SHA256-Download: + d2a1b33187ed2d248eeae3b1223ea71791ea35f2138a713ed371332a6421f467 197 2010-08-18-2013.28.gz + $(sha256sum "${PATCHFILE}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE}.gz") $(basename "${PATCHFILE}.gz")" > "$PATCHINDEX" + breakfiles "$PATCHFILE" "${PATCHFILE}.gz" + generatereleasefiles '+1hour' + signreleasefiles + testsuccess apt update "$@" + cp -f rootdir/tmp/testsuccess.output rootdir/tmp/aptupdate.output + testsuccess grep 'Hash Sum mismatch' rootdir/tmp/aptupdate.output + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: pdiff patch bigger than index itself: $*" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + # the general testcode checks for leftovers in partial, but as this file + # is never touched in this test as it exits earlier its not a leftover… + rm -f rootdir/var/lib/apt/lists/partial/localhost:${APTHTTPPORT}_Packages + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e "${PKGFILE}" "${PKGFILE}-new" > "${PATCHFILE}" || true + cat "$PATCHFILE" | gzip > "${PATCHFILE}.gz" + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA256-Current: $(sha256sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE") +SHA256-Download: + d2a1b33187ed2d248eeae3b1223ea71791ea35f2138a713ed371332a6421f467 197 2010-08-18-2013.28.gz + $(sha256sum "${PATCHFILE}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE}.gz")000 $(basename "${PATCHFILE}.gz")" > "$PATCHINDEX" + generatereleasefiles '+1hour' + signreleasefiles + wasmergeused "$@" -o test::cannot-use-pdiff=1 + testsuccess grep 'bytes, but limit is' rootdir/tmp/aptupdate.output + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff + + msgmsg "Testcase: pdiff index failed to download: $*" + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + cp "${PKGFILE}-new" aptarchive/Packages + compressfile 'aptarchive/Packages' + mkdir -p aptarchive/Packages.diff + PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)" + diff -e "${PKGFILE}" "${PKGFILE}-new" > "${PATCHFILE}" || true + cat "$PATCHFILE" | gzip > "${PATCHFILE}.gz" + PATCHINDEX='aptarchive/Packages.diff/Index' + echo "SHA256-Current: $(sha256sum "${PKGFILE}-new" | cut -d' ' -f 1) $(stat -c%s "${PKGFILE}-new") +SHA256-History: + 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28 + $(sha256sum "$PKGFILE" | cut -d' ' -f 1) $(stat -c%s "$PKGFILE") $(basename "$PATCHFILE") +SHA256-Patches: + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28 + $(sha256sum "$PATCHFILE" | cut -d' ' -f 1) $(stat -c%s "$PATCHFILE") $(basename "$PATCHFILE") +SHA256-Download: + d2a1b33187ed2d248eeae3b1223ea71791ea35f2138a713ed371332a6421f467 197 2010-08-18-2013.28.gz + $(sha256sum "${PATCHFILE}.gz" | cut -d' ' -f 1) $(stat -c%s "${PATCHFILE}.gz") $(basename "${PATCHFILE}.gz")" > "$PATCHINDEX" + generatereleasefiles '+1hour' + signreleasefiles + # we let it fail by removing the files so the webserver reports 404 + rm -f "$PATCHINDEX" "$PATCHFILE" "${PATCHFILE}.gz" + wasmergeused "$@" -o test::cannot-use-pdiff=1 + testsuccess grep '400%20URI%20Failure.*FailReason.*HttpError404.*Packages\.diff/Index' rootdir/tmp/aptupdate.output + testnopackage oldstuff + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt newstuff +} +echo 'Debug::pkgAcquire::Diffs "true"; +Debug::Acquire::Transaction "true"; +Debug::pkgAcquire::Worker "true"; +Debug::Acquire::http "true"; +Debug::pkgAcquire "true"; +Debug::Acquire::rred "true";' > rootdir/etc/apt/apt.conf.d/rreddebug.conf + +testcase() { + testrun -o Acquire::PDiffs::Merge=0 -o APT::Get::List-Cleanup=1 "$@" + testrun -o Acquire::PDiffs::Merge=1 -o APT::Get::List-Cleanup=1 "$@" + testrun -o Acquire::PDiffs::Merge=0 -o APT::Get::List-Cleanup=0 "$@" + testrun -o Acquire::PDiffs::Merge=1 -o APT::Get::List-Cleanup=0 "$@" +} +generatepartialleftovers() { + for f in "$@"; do + cat "${PKGFILE}" "${PKGFILE}" > "rootdir/var/lib/apt/lists-bak/partial/localhost:${APTHTTPPORT}_${f}" + printf '\n\nInvalid\nStanza: yes\n\n' >> "rootdir/var/lib/apt/lists-bak/partial/localhost:${APTHTTPPORT}_${f}" + done +} + +partialleftovers() { generatepartialleftovers 'Packages' 'Packages-patched'; } +aptautotest_apt_update() { aptautotest_aptget_update "$@"; testsuccess test -e "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_Packages"; } +testcase -o Acquire::IndexTargets::deb::Packages::KeepCompressed=false +partialleftovers() { generatepartialleftovers "Packages.${LOWCOSTEXT}" "Packages-patched.${LOWCOSTEXT}"; } +aptautotest_apt_update() { aptautotest_aptget_update "$@"; testsuccess test -e "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_Packages.$LOWCOSTEXT"; } +testcase -o Acquire::IndexTargets::deb::Packages::KeepCompressed=true + + +partialleftovers() { generatepartialleftovers "redirectme_Packages.${LOWCOSTEXT}" "redirectme_Packages-patched.${LOWCOSTEXT}"; } +# redirect the InRelease file only – the other files are auto-redirected by apt +webserverconfig 'aptwebserver::redirect::replace::/redirectme/I' "http://0.0.0.0:${APTHTTPPORT}/I" +rewritesourceslist "http://localhost:${APTHTTPPORT}/redirectme" +aptautotest_apt_update() { + aptautotest_aptget_update "$@" + testsuccess test -e "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_redirectme_Packages.$LOWCOSTEXT" + testempty find rootdir/var/lib/apt/lists -type f \! \( -name lock -o -name '*_redirectme_*' \) +} +testcase -o Acquire::IndexTargets::deb::Packages::KeepCompressed=true diff --git a/test/integration/test-pin-non-existent-package b/test/integration/test-pin-non-existent-package new file mode 100755 index 0000000..06103fd --- /dev/null +++ b/test/integration/test-pin-non-existent-package @@ -0,0 +1,75 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'rapt' 'i386' '0.8.15' +insertpackage 'unstable' 'arch' 'i386' '1.0' + +setupaptarchive + +testcandidate() { + msgtest "Test that the Candidate for $1 is" $2 + if [ "$(aptcache policy $1 | grep '^ Candidate:')" = " Candidate: $2" ]; then + msgpass + else + echo + aptcache policy $1 + msgfail + fi +} + +testcandidate rapt '0.8.15' +testsuccessequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only + +echo 'Package: rapt +Pin: release a=unstable +Pin-Priority: -1' > rootdir/etc/apt/preferences + +testcandidate rapt '(none)' +testsuccessequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only + +echo ' +Package: doesntexist +Pin: release a=unstable +Pin-Priority: 1000' >> rootdir/etc/apt/preferences + +testcandidate rapt '(none)' + +echo ' +Package: rapt +Pin: release a=unstable +Pin-Priority: 1000' >> rootdir/etc/apt/preferences + +testcandidate rapt '(none)' +testsuccessequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only + +echo 'Package: arch:amd64 +Pin: release a=unstable +Pin-Priority: -1' > rootdir/etc/apt/preferences + +testcandidate arch '1.0' + +echo ' +Package: arch:i386 +Pin: release a=unstable +Pin-Priority: -1' >> rootdir/etc/apt/preferences + +testcandidate arch '(none)' + diff --git a/test/integration/test-policy-pinning b/test/integration/test-policy-pinning new file mode 100755 index 0000000..b871f72 --- /dev/null +++ b/test/integration/test-policy-pinning @@ -0,0 +1,433 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +buildaptarchive +setupflataptarchive + +STATUS=$(readlink -f rootdir/var/lib/dpkg/status) +APTARCHIVE=$(readlink -f aptarchive) + +testequalpolicy() { + local SP="$1" + local AP="$2" + shift 2 + testsuccessequal "Package files: + $(echo "$SP" | awk '{ printf("%3s\n",$0) }') ${STATUS} + release a=now + $(echo "$AP" | awk '{ printf("%3s\n",$0) }') file:${APTARCHIVE} Packages + release c= +Pinned packages:" aptcache policy "$@" +} + +testglobalpolicy() { + aptgetupdate + + testequalpolicy 100 500 + testequalpolicy 990 500 -t now + + sed -i aptarchive/Release -e 1i"NotAutomatic: yes" + aptgetupdate + + testequalpolicy 100 1 -o Test=NotAutomatic + testequalpolicy 990 1 -o Test=NotAutomatic -t now + + sed -i aptarchive/Release -e 1i"ButAutomaticUpgrades: yes" + aptgetupdate + + testequalpolicy 100 100 -o Test=ButAutomaticUpgrades + testequalpolicy 990 100 -o Test=ButAutomaticUpgrades -t now + + sed -i aptarchive/Release -e 's#NotAutomatic: yes#NotAutomatic: no#' -e '/ButAutomaticUpgrades: / d' + aptgetupdate + + testequalpolicy 100 500 -o Test=Automatic + testequalpolicy 990 500 -o Test=Automatic -t now + + sed -i aptarchive/Release -e '/NotAutomatic: / d' -e '/ButAutomaticUpgrades: / d' +} + +msgmsg 'Test with not signed archive' +aptgetupdate() { + rm -rf rootdir/var/lib/apt + testwarning aptget update --allow-insecure-repositories +} +testglobalpolicy + +msgmsg 'Test with signed but no key in trusted' +aptgetupdate() { + rm -rf rootdir/var/lib/apt + signreleasefiles 'Marvin Paranoid' + testwarning aptget update --allow-insecure-repositories +} +testglobalpolicy + +# much the same tests will be executed below in more detail again for this one +msgmsg 'Test with signed and valid key' +aptgetupdate() { + rm -rf rootdir/var/lib/apt + signreleasefiles 'Joe Sixpack' + testsuccess aptget update +} +testglobalpolicy + +msgmsg 'Test with specific packages' + +buildsimplenativepackage "coolstuff" "all" "1.0" "stable" +buildsimplenativepackage "coolstuff" "all" "2.0~bpo1" "backports" + +setupaptarchive + +testsuccessequal "coolstuff: + Installed: (none) + Candidate: 2.0~bpo1 + Version table: + 2.0~bpo1 500 + 500 file:${APTARCHIVE} backports/main all Packages + 1.0 500 + 500 file:${APTARCHIVE} stable/main all Packages" apt policy '^cool.*' + +testequalpolicycoolstuff() { + local INSTALLED="${1:-(none)}" + local CANDIDATE="${2:-(none)}" + local AB="$3" + local AS="$4" + local PB="$5" + local IS="" + local IB="" + local SB="" + local SS="" + [ "$1" = "2.0~bpo1" ] && IB="***" && SB=" + 100 $STATUS" || IB=" " + [ "$1" = "1.0" ] && IS="***" && SS=" + 100 $STATUS" || IS=" " + local BPO1ARCHIVE="" + local BPO2ARCHIVE="" + if [ ! "$7" = "2.0~bpo2" ]; then + BPO1PIN="$AB" + BPO1ARCHIVE=" $(echo "$AB" | awk '{ printf("%3s\n",$0) }') file:${APTARCHIVE} backports/main all Packages" + else + BPO2ARCHIVE=" + 2.0~bpo2 $AB + $(echo "$AB" | awk '{ printf("%3s\n",$0) }') file:${APTARCHIVE} backports/main all Packages" + SB="$(echo "$SB" | tail -n 1)" + shift + fi + shift 6 + testsuccessequal "coolstuff: + Installed: $INSTALLED + Candidate: $CANDIDATE + Version table:${BPO2ARCHIVE} + $IB 2.0~bpo1 $PB +${BPO1ARCHIVE}$SB + $IS 1.0 $AS + $(echo "$AS" | awk '{ printf("%3s\n",$0) }') file:${APTARCHIVE} stable/main all Packages$SS" \ + aptcache policy coolstuff -o Policy=${INSTALLED}-${CANDIDATE}-${AB}-${AS}-${PB} $* +} + +testequalpolicycoolstuff "" "2.0~bpo1" 500 500 500 "" +testequalpolicycoolstuff "" "1.0" 500 990 500 "" -t stable +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 990 "" -t backports +echo "Package: * +Pin: release n=backports +Pin-Priority: 200" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "1.0" 200 500 200 "" -o Test=GlobalPin +testequalpolicycoolstuff "" "1.0" 200 990 200 "" -o Test=GlobalPin -t stable +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 990 "" -o Test=GlobalPin -t backports +echo "Package: * +Pin: release n=backports +Pin-Priority: 600" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "2.0~bpo1" 600 500 600 "" -o Test=GlobalPin +testequalpolicycoolstuff "" "1.0" 600 990 600 "" -o Test=GlobalPin -t stable +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 200" > rootdir/etc/apt/preferences +#FIXME: policy can't differentiate between two sources where one has a package specific pin in place +# testequalpolicycoolstuff "" "1.0" 500 500 200 "2.0~bpo1" -o Test=PackagePin +# testequalpolicycoolstuff "" "1.0" 990 500 200 "2.0~bpo1" -o Test=PackagePin -t backports +testequalpolicycoolstuff "" "1.0" 500 990 200 "2.0~bpo1" -o Test=PackagePin -t stable +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 600" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "2.0~bpo1" 500 500 600 "2.0~bpo1" -o Test=PackagePin +testequalpolicycoolstuff "" "1.0" 500 990 600 "2.0~bpo1" -o Test=PackagePin -t stable +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 600 "2.0~bpo1" -o Test=PackagePin -t backports + +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: -1" > rootdir/etc/apt/preferences +# testequalpolicycoolstuff "" "1.0" 500 500 -1 "2.0~bpo1" -o Test=PackagePin +# testequalpolicycoolstuff "" "1.0" 990 500 -1 "2.0~bpo1" -o Test=PackagePin -t backports +# testequalpolicycoolstuff "" "1.0" 500 990 -1 "2.0~bpo1" -o Test=PackagePin -t stable + +rm rootdir/etc/apt/preferences +sed -i aptarchive/dists/backports/Release -e 1i"NotAutomatic: yes" +signreleasefiles +aptgetupdate + +testequalpolicycoolstuff "" "1.0" 1 500 1 "" -o Test=NotAutomatic +testequalpolicycoolstuff "" "1.0" 1 990 1 "" -o Test=NotAutomatic -t stable +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 990 "" -o Test=NotAutomatic -t backports +echo "Package: * +Pin: release n=backports +Pin-Priority: 200" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "1.0" 200 500 200 "" -o Test=NotAutomatic +echo "Package: * +Pin: release n=backports +Pin-Priority: 600" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "2.0~bpo1" 600 500 600 "" -o Test=NotAutomatic +testequalpolicycoolstuff "" "1.0" 600 990 600 "" -o Test=NotAutomatic -t stable +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 200" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "1.0" 1 500 200 "2.0~bpo1" -o Test=NotAutomatic +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 600" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "2.0~bpo1" 1 500 600 "2.0~bpo1" -o Test=NotAutomatic +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 600 "2.0~bpo1" -o Test=NotAutomatic -t backports +testequalpolicycoolstuff "" "1.0" 1 990 600 "2.0~bpo1" -o Test=NotAutomatic -t stable + +rm rootdir/etc/apt/preferences +sed -i aptarchive/dists/backports/Release -e 1i"ButAutomaticUpgrades: yes" +signreleasefiles +aptgetupdate + +testequalpolicycoolstuff "" "1.0" 100 500 100 "" -o Test=ButAutomaticUpgrades +testequalpolicycoolstuff "" "1.0" 100 990 100 "" -o Test=ButAutomaticUpgrades -t stable +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 990 "" -o Test=ButAutomaticUpgrades -t backports +echo "Package: * +Pin: release n=backports +Pin-Priority: 200" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "1.0" 200 500 200 "" -o Test=ButAutomaticUpgrades +echo "Package: * +Pin: release n=backports +Pin-Priority: 600" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "2.0~bpo1" 600 500 600 "" -o Test=ButAutomaticUpgrades +testequalpolicycoolstuff "" "1.0" 600 990 600 "" -o Test=ButAutomaticUpgrades -t stable +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 200" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "1.0" 100 500 200 "2.0~bpo1" -o Test=ButAutomaticUpgrades +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 600" > rootdir/etc/apt/preferences +testequalpolicycoolstuff "" "2.0~bpo1" 100 500 600 "2.0~bpo1" -o Test=ButAutomaticUpgrades +testequalpolicycoolstuff "" "2.0~bpo1" 990 500 600 "2.0~bpo1" -o Test=ButAutomaticUpgrades -t backports +testequalpolicycoolstuff "" "1.0" 100 990 600 "2.0~bpo1" -o Test=ButAutomaticUpgrades -t stable + +rm rootdir/etc/apt/preferences +testsuccess aptget install coolstuff -y +testequalpolicycoolstuff "1.0" "1.0" 100 500 100 "" -o Test=ButAutomaticUpgrades +testsuccess aptget dist-upgrade -y +testequalpolicycoolstuff "1.0" "1.0" 100 500 100 "" -o Test=ButAutomaticUpgrades +testequalpolicycoolstuff "1.0" "1.0" 100 990 100 "" -o Test=ButAutomaticUpgrades -t stable +testequalpolicycoolstuff "1.0" "2.0~bpo1" 990 500 990 "" -o Test=ButAutomaticUpgrades -t backports + +testsuccess aptget install coolstuff -t backports -y +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 100 500 100 "" -o Test=ButAutomaticUpgrades +testsuccess aptget dist-upgrade -y +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 100 500 100 "" -o Test=ButAutomaticUpgrades +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 100 990 100 "" -o Test=ButAutomaticUpgrades -t stable +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 990 500 990 "" -o Test=ButAutomaticUpgrades -t backports + +rm incoming/backports.main.pkglist incoming/backports.main.srclist +buildsimplenativepackage "coolstuff" "all" "2.0~bpo2" "backports" +setupaptarchive --no-update + +sed -i aptarchive/dists/backports/Release -e 1i"NotAutomatic: yes" +signreleasefiles +aptgetupdate + +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 1 500 100 "" "2.0~bpo2" -o Test=NotAutomatic +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 1 990 100 "" "2.0~bpo2" -o Test=NotAutomatic -t stable +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo2" 990 500 100 "" "2.0~bpo2" -o Test=NotAutomatic -t backports + +sed -i aptarchive/dists/backports/Release -e 1i"ButAutomaticUpgrades: yes" +signreleasefiles +aptgetupdate + +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo2" 100 500 100 "" "2.0~bpo2" -o Test=ButAutomaticUpgrades +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo2" 100 990 100 "" "2.0~bpo2" -o Test=ButAutomaticUpgrades -t stable +testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo2" 990 500 100 "" "2.0~bpo2" -o Test=ButAutomaticUpgrades -t backports + + +tmppath=$(readlink -f .) + +# Check 16-bit integers +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 32767 +" > rootdir/etc/apt/preferences + +testsuccess aptget install -s coolstuff -o PinPriority=32767 + +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: -32768 +" > rootdir/etc/apt/preferences +testsuccess aptget install -s coolstuff -o PinPriority=-32768 + +# Check for 32-bit integers +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 32768 +" > rootdir/etc/apt/preferences + +testfailureequal "Reading package lists... +E: ${tmppath}/rootdir/etc/apt/preferences: Value 32768 is outside the range of valid pin priorities (-32768 to 32767)" \ + aptget install -s coolstuff -o PinPriority=32768 + + +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: -32769 +" > rootdir/etc/apt/preferences + +testfailureequal "Reading package lists... +E: ${tmppath}/rootdir/etc/apt/preferences: Value -32769 is outside the range of valid pin priorities (-32768 to 32767)" \ + aptget install -s coolstuff -o PinPriority=-32769 + +# Check for 64-bit integers + +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 2147483648 +" > rootdir/etc/apt/preferences + +testfailureequal "Reading package lists... +E: Cannot convert 2147483648 to integer: out of range +E: ${tmppath}/rootdir/etc/apt/preferences: Value 2147483648 is outside the range of valid pin priorities (-32768 to 32767)" \ + aptget install -s coolstuff -o PinPriority=2147483648 + +# Check that short-max/min is a valid pin +currentpin() { +echo "Package: * +Pin: release n=backports +Pin-Priority: $1 +" > rootdir/etc/apt/preferences +testsuccessequal "coolstuff: + Installed: 2.0~bpo1 + Candidate: $2 + Version table: + 2.0~bpo2 ${3:-$1} + ${3:-$1} file:${tmppath}/aptarchive backports/main all Packages + *** 2.0~bpo1 100 + 100 ${tmppath}/rootdir/var/lib/dpkg/status + 1.0 500 + 500 file:${tmppath}/aptarchive stable/main all Packages" apt policy coolstuff +} +currentpin '32767' '2.0~bpo2' +currentpin '-32768' '2.0~bpo1' '-32767' +currentpin '-32767' '2.0~bpo1' '-32767' + +# Check for 0 +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 0 +" > rootdir/etc/apt/preferences + +testfailureequal "Reading package lists... +E: No priority (or zero) specified for pin" \ + aptget install -s coolstuff -o PinPriority=0 + +# Check with comments +echo "#Package: coolstuff +#Pin: release n=backports +#Pin-Priority: 0 + +# Test + +Package: coolstuff +Pin: release n=backports +#Pin: release n=unstable +#Pin-Priority: 999 +Pin-Priority: 999 +#Pin-Priority: 999" > rootdir/etc/apt/preferences + +testsuccessequal "coolstuff: + Installed: 2.0~bpo1 + Candidate: 2.0~bpo2 + Version table: + 2.0~bpo2 999 + 100 file:${tmppath}/aptarchive backports/main all Packages + *** 2.0~bpo1 100 + 100 ${tmppath}/rootdir/var/lib/dpkg/status + 1.0 500 + 500 file:${tmppath}/aptarchive stable/main all Packages" aptcache policy coolstuff + + +# Check for override pins + +# Normal pins: First one wins +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 990 + +Package: coolstuff +Pin: release n=backports +Pin-Priority: 991 +" > rootdir/etc/apt/preferences + +testsuccessequal "coolstuff: + Installed: 2.0~bpo1 + Candidate: 2.0~bpo2 + Version table: + 2.0~bpo2 990 + 100 file:${tmppath}/aptarchive backports/main all Packages + *** 2.0~bpo1 100 + 100 ${tmppath}/rootdir/var/lib/dpkg/status + 1.0 500 + 500 file:${tmppath}/aptarchive stable/main all Packages" aptcache policy coolstuff + + +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: 990 + +Package: * +Pin: release n=backports +Pin-Priority: never +" > rootdir/etc/apt/preferences + +testsuccessequal "coolstuff: + Installed: 2.0~bpo1 + Candidate: 2.0~bpo1 + Version table: + 2.0~bpo2 -32768 + -32768 file:${tmppath}/aptarchive backports/main all Packages + *** 2.0~bpo1 100 + 100 ${tmppath}/rootdir/var/lib/dpkg/status + 1.0 500 + 500 file:${tmppath}/aptarchive stable/main all Packages" aptcache policy coolstuff + + +msgmsg "Check that local-only versions can be pinned correctly (LP: #1821308)" +echo "Package: coolstuff +Pin: version 2.0~bpo1 +Pin-Priority: 1000" > rootdir/etc/apt/preferences +testsuccessequal "coolstuff: + Installed: 2.0~bpo1 + Candidate: 2.0~bpo1 + Version table: + 2.0~bpo2 100 + 100 file:${tmppath}/aptarchive backports/main all Packages + *** 2.0~bpo1 1000 + 100 ${tmppath}/rootdir/var/lib/dpkg/status + 1.0 500 + 500 file:${tmppath}/aptarchive stable/main all Packages" aptcache policy coolstuff + +# Check for 0 +echo "Package: coolstuff +Pin: release n=backports +Pin-Priority: never +" > rootdir/etc/apt/preferences + +testfailureequal "Reading package lists... +E: ${tmppath}/rootdir/etc/apt/preferences: The special 'Pin-Priority: never' can only be used for 'Package: *' records" \ + aptget install -s coolstuff -o PinPriority=0 diff --git a/test/integration/test-prefer-higher-priority-providers b/test/integration/test-prefer-higher-priority-providers new file mode 100755 index 0000000..7c3f323 --- /dev/null +++ b/test/integration/test-prefer-higher-priority-providers @@ -0,0 +1,106 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'native' + +insertpackage 'unstable' 'foo' 'all' '1' 'Provides: stuff' 'important' +insertpackage 'unstable' 'bar' 'all' '1' 'Provides: stuff' 'optional' +insertpackage 'unstable' 'baz' 'all' '1' 'Provides: stuff' 'extra' +insertpackage 'unstable' 'awesome' 'all' '1' 'Depends: stuff' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +The following NEW packages will be installed: + awesome foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Inst awesome (1 unstable [all]) +Conf foo (1 unstable [all]) +Conf awesome (1 unstable [all])' aptget install awesome -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + awesome foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Inst awesome (1 unstable [all]) +Conf foo (1 unstable [all]) +Conf awesome (1 unstable [all])' aptget install awesome foo -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'bar' is not installed, so not removed +Package 'baz' is not installed, so not removed +The following additional packages will be installed: + foo +The following NEW packages will be installed: + awesome foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1 unstable [all]) +Inst awesome (1 unstable [all]) +Conf foo (1 unstable [all]) +Conf awesome (1 unstable [all])" aptget install awesome bar- baz- -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'foo' is not installed, so not removed +The following additional packages will be installed: + bar +The following NEW packages will be installed: + awesome bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1 unstable [all]) +Inst awesome (1 unstable [all]) +Conf bar (1 unstable [all]) +Conf awesome (1 unstable [all])" aptget install awesome foo- -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'foo' is not installed, so not removed +Package 'baz' is not installed, so not removed +The following additional packages will be installed: + bar +The following NEW packages will be installed: + awesome bar +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst bar (1 unstable [all]) +Inst awesome (1 unstable [all]) +Conf bar (1 unstable [all]) +Conf awesome (1 unstable [all])" aptget install awesome foo- baz- -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'foo' is not installed, so not removed +Package 'bar' is not installed, so not removed +The following additional packages will be installed: + baz +The following NEW packages will be installed: + awesome baz +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst baz (1 unstable [all]) +Inst awesome (1 unstable [all]) +Conf baz (1 unstable [all]) +Conf awesome (1 unstable [all])" aptget install awesome foo- bar- -s + +testfailureequal "Reading package lists... +Building dependency tree... +Package 'foo' is not installed, so not removed +Package 'bar' is not installed, so not removed +Package 'baz' is not installed, so not removed +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: + awesome : Depends: stuff +E: Unable to correct problems, you have held broken packages." aptget install awesome foo- bar- baz- -s diff --git a/test/integration/test-prefer-native-architecture-over-higher-priority b/test/integration/test-prefer-native-architecture-over-higher-priority new file mode 100755 index 0000000..d21836b --- /dev/null +++ b/test/integration/test-prefer-native-architecture-over-higher-priority @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'arm64' + +insertpackage 'unstable' 'm4' 'amd64' '1' 'Multi-Arch: foreign' 'optional' +insertpackage 'unstable' 'm4' 'arm64' '1' 'Multi-Arch: foreign' 'standard' +insertpackage 'unstable' 'autoconf' 'all' '1' 'Depends: m4' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + m4 +The following NEW packages will be installed: + autoconf m4 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst m4 (1 unstable [amd64]) +Inst autoconf (1 unstable [all]) +Conf m4 (1 unstable [amd64]) +Conf autoconf (1 unstable [all])' aptget install autoconf -s diff --git a/test/integration/test-prevent-markinstall-multiarch-same-versionscrew b/test/integration/test-prevent-markinstall-multiarch-same-versionscrew new file mode 100755 index 0000000..a45c0d5 --- /dev/null +++ b/test/integration/test-prevent-markinstall-multiarch-same-versionscrew @@ -0,0 +1,130 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' 'armel' + +insertpackage 'stable' 'allarchs' 'all' '1' +insertpackage 'unstable' 'allarchs' 'all' '2' + +insertpackage 'stable,installed' 'fine' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'fine' 'amd64,i386' '2' 'Multi-Arch: same' +insertpackage 'experimental' 'fine' 'amd64,i386' '3' 'Multi-Arch: same' + +insertinstalledpackage 'fine-installed' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'stable' 'fine-installed' 'i386,amd64,armel' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'fine-installed' 'i386,amd64' '2' 'Multi-Arch: same' +insertpackage 'experimental' 'fine-installed' 'i386,amd64' '3' 'Multi-Arch: same' + +insertpackage 'stable,installed' 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'out-of-sync-native' 'amd64' '2' 'Multi-Arch: same' + +insertpackage 'stable,installed' 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'out-of-sync-foreign' 'i386' '2' 'Multi-Arch: same' + +insertinstalledpackage 'out-of-sync-gone-native' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'stable' 'out-of-sync-gone-native' 'i386' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'out-of-sync-gone-native' 'i386' '2' 'Multi-Arch: same' + +insertinstalledpackage 'out-of-sync-gone-foreign' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'stable' 'out-of-sync-gone-foreign' 'amd64' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'out-of-sync-gone-foreign' 'amd64' '2' 'Multi-Arch: same' + +insertpackage 'stable' 'libsame2' 'i386' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'libsame2' 'amd64' '2' 'Multi-Arch: same' +insertpackage 'unstable' 'depender2' 'all' '2' 'Depends: libsame2 (= 2)' +insertpackage 'stable' 'libsame3' 'i386' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'libsame3' 'i386,amd64' '3' 'Multi-Arch: same' +insertpackage 'unstable' 'depender3' 'all' '3' 'Depends: libsame3 (= 3)' +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + out-of-sync-gone-foreign:i386 out-of-sync-gone-native +The following packages have been kept back: + out-of-sync-foreign:i386 out-of-sync-native +The following packages will be upgraded: + fine fine:i386 fine-installed fine-installed:i386 out-of-sync-gone-foreign + out-of-sync-gone-native:i386 +6 upgraded, 0 newly installed, 2 to remove and 2 not upgraded. +Remv out-of-sync-gone-foreign:i386 [1] +Remv out-of-sync-gone-native [1] +Inst fine [1] (2 unstable [amd64]) [fine:amd64 on fine:i386] [fine:i386 on fine:amd64] [fine:i386 ] +Inst fine:i386 [1] (2 unstable [i386]) +Inst fine-installed [1] (2 unstable [amd64]) [fine-installed:amd64 on fine-installed:i386] [fine-installed:i386 on fine-installed:amd64] [fine-installed:i386 ] +Inst fine-installed:i386 [1] (2 unstable [i386]) +Inst out-of-sync-gone-foreign [1] (2 unstable [amd64]) +Inst out-of-sync-gone-native:i386 [1] (2 unstable [i386]) +Conf fine (2 unstable [amd64]) +Conf fine:i386 (2 unstable [i386]) +Conf fine-installed (2 unstable [amd64]) +Conf fine-installed:i386 (2 unstable [i386]) +Conf out-of-sync-gone-foreign (2 unstable [amd64]) +Conf out-of-sync-gone-native:i386 (2 unstable [i386])' aptget dist-upgrade -s #-o Debug::pkgDepCache::Marker=1 + +echo 'Package: fine:* fine-installed:* +Pin: release a=experimental +Pin-Priority: 500' > rootdir/etc/apt/preferences.d/experimental.pref + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + out-of-sync-gone-foreign:i386 out-of-sync-gone-native +The following packages have been kept back: + out-of-sync-foreign:i386 out-of-sync-native +The following packages will be upgraded: + fine fine:i386 fine-installed fine-installed:i386 out-of-sync-gone-foreign + out-of-sync-gone-native:i386 +6 upgraded, 0 newly installed, 2 to remove and 2 not upgraded. +Remv out-of-sync-gone-foreign:i386 [1] +Remv out-of-sync-gone-native [1] +Inst fine [1] (3 experimental [amd64]) [fine:amd64 on fine:i386] [fine:i386 on fine:amd64] [fine:i386 ] +Inst fine:i386 [1] (3 experimental [i386]) +Inst fine-installed [1] (3 experimental [amd64]) [fine-installed:amd64 on fine-installed:i386] [fine-installed:i386 on fine-installed:amd64] [fine-installed:i386 ] +Inst fine-installed:i386 [1] (3 experimental [i386]) +Inst out-of-sync-gone-foreign [1] (2 unstable [amd64]) +Inst out-of-sync-gone-native:i386 [1] (2 unstable [i386]) +Conf fine (3 experimental [amd64]) +Conf fine:i386 (3 experimental [i386]) +Conf fine-installed (3 experimental [amd64]) +Conf fine-installed:i386 (3 experimental [i386]) +Conf out-of-sync-gone-foreign (2 unstable [amd64]) +Conf out-of-sync-gone-native:i386 (2 unstable [i386])' aptget dist-upgrade -s #-o Debug::pkgDepCache::Marker=1 + +rm rootdir/var/lib/dpkg/status +insertinstalledpackage 'libsame2' 'i386' '1' 'Multi-Arch: same' +insertinstalledpackage 'libsame3' 'i386' '1' 'Multi-Arch: same' + +# the error message isn't great, but better than nothing, right? +testfailureequal '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: + depender2 : Depends: libsame2 (= 2) but it is not going to be installed +E: Unable to correct problems, you have held broken packages.' aptget install depender2 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libsame3:i386 libsame3 +The following NEW packages will be installed: + depender3 libsame3 +The following packages will be upgraded: + libsame3:i386 +1 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libsame3:i386 [1] (3 unstable [i386]) +Inst libsame3 (3 unstable [amd64]) +Inst depender3 (3 unstable [all]) +Conf libsame3:i386 (3 unstable [i386]) +Conf libsame3 (3 unstable [amd64]) +Conf depender3 (3 unstable [all])' aptget install depender3 -s diff --git a/test/integration/test-provides-gone-with-upgrade b/test/integration/test-provides-gone-with-upgrade new file mode 100755 index 0000000..5249ea0 --- /dev/null +++ b/test/integration/test-provides-gone-with-upgrade @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertinstalledpackage 'apt' 'i386' '0.8.14' 'Provides: libapt-pkg4.10' +insertpackage 'unstable' 'apt' 'i386' '0.8.15' 'Depends: libapt-pkg4.10' +insertpackage 'unstable' 'libapt-pkg4.10' 'i386' '0.8.15' 'Breaks: apt (<< 0.8.15) +Replaces: apt (<< 0.8.15)' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + libapt-pkg4.10 +The following packages will be upgraded: + apt +1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt [0.8.14] (0.8.15 unstable [i386]) [] +Inst libapt-pkg4.10 (0.8.15 unstable [i386]) +Conf libapt-pkg4.10 (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386])' aptget dist-upgrade -s diff --git a/test/integration/test-release-candidate-switching b/test/integration/test-release-candidate-switching new file mode 100755 index 0000000..945f680 --- /dev/null +++ b/test/integration/test-release-candidate-switching @@ -0,0 +1,443 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'libc6' 'i386' '2.11.2-7+sid' +insertpackage 'unstable' 'phonon-backend-xine' 'i386' '4:4.6.0really4.4.2-1+sid' 'Provides: phonon-backend' +insertpackage 'unstable' 'phonon-backend-xine2' 'i386' '4:4.6.0really4.4.2-1+sid' +insertpackage 'unstable' 'phonon-backend-xine3' 'i386' '4:4.6.0really4.4.2-1+sid' +insertpackage 'unstable' 'phonon-backend-xine4' 'i386' '4:4.6.0really4.4.2-1+sid' +insertpackage 'unstable' 'phonon-backend-null' 'i386' '4:4.20.0+sid' 'Provides: phonon-backend' +insertpackage 'unstable' 'intermediatepkg' 'all' '1.0' + +insertpackage 'unstable' 'amarok-common' 'all' '2.3.1-1+sid' +insertpackage 'unstable' 'amarok-utils' 'i386' '2.3.1-1+sid' +insertpackage 'unstable' 'libmtp8' 'i386' '0.3.1+sid' +insertpackage 'unstable' 'amarok' 'i386' '2.3.1-1+sid' 'Depends: amarok-common (= 2.3.1-1+sid), amarok-utils (= 2.3.1-1+sid), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' + +insertpackage 'experimental' 'amarok-common' 'all' '2.3.2-2+exp' +insertpackage 'experimental' 'amarok-utils' 'i386' '2.3.2-2+exp' +insertpackage 'experimental' 'libmtp8' 'i386' '0.3.3+exp' +insertpackage 'experimental' 'phonon-backend-xine' 'i386' '5:4.6.0+exp' 'Provides: phonon-backend' +insertpackage 'experimental' 'phonon-backend-xine2' 'i386' '5:4.6.0+exp' 'Depends: uninstallablepkg +Provides: phonon-backend-broken' +insertpackage 'experimental' 'phonon-backend-xine3' 'i386' '5:4.6.0+exp' 'Depends: intermediatepkg (>= 1.5)' +insertpackage 'experimental' 'phonon-backend-xine4' 'i386' '5:4.6.0+exp' 'Depends: intermediateuninstallablepkg (= 2.0) +Provides: phonon-backend-broken' +insertpackage 'experimental' 'intermediatepkg' 'all' '2.0' 'Depends: libc6' +insertpackage 'experimental' 'intermediateuninstallablepkg' 'all' '2.0' 'Depends: uninstallablepkg' +insertpackage 'experimental' 'phonon-backend-null' 'i386' '5:4.20.0+exp' 'Provides: phonon-backend' +insertpackage 'experimental' 'amarok' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), amarok-utils (= 2.3.2-2+exp), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' + +insertpackage 'experimental2' 'phonon-backend-xine' 'i386' '5:4.00.0+exp' 'Provides: phonon-backend' +insertpackage 'experimental2' 'amarok-less' 'i386' '2.3.2-2+exp' 'Depends: amarok-common, phonon-backend-xine (>= 5:4.00.0+exp), libmtp8, libc6, amarok-utils' +insertpackage 'experimental' 'amarok-higher' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine (>= 5:4.6.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' + +insertpackage 'experimental' 'amarok-null' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine (= 1:1.0-1) | phonon-backend, libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-null2' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-null (= 1:1.0-1) | phonon-backend, libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine2' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine2 (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine3' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine3 (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine4' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine4 (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-broken' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-broken | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' + +insertpackage 'experimental' 'amarok-recommends' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp) +Recommends: amarok-utils (= 2.3.2-2+exp), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' +insertpackage 'experimental' 'amarok-recommends2' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp) +Recommends: amarok-utils (= 2.30.2-2+exp), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' + +insertpackage 'experimental' 'uninstallablepkg' 'all' '1.0' 'Depends: libmtp8 (>= 10:0.20.1), amarok-utils (= 2.3.2-2+exp)' + +setupaptarchive + +testfailureequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + amarok-common (2.3.1-1+sid) + amarok-utils (2.3.1-1+sid) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok (2.3.1-1+sid) + amarok-common (2.3.1-1+sid) + amarok-utils (2.3.1-1+sid) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok --trivial-only -V + +testfailureequal "Reading package lists... +Building dependency tree... +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.3+exp) + phonon-backend-xine (5:4.6.0+exp) +The following NEW packages will be installed: + amarok (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.3+exp) + phonon-backend-xine (5:4.6.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok -t experimental --trivial-only -V + +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok/experimental --trivial-only -V + +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-null' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4:4.20.0+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-null (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4:4.20.0+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-null/experimental --trivial-only -V + +# do not select the same version multiple times +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-null (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. +After this operation, 301 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok/experimental amarok-null/experimental --trivial-only -V + +# … but thighten the version if needed +# in theory, the second line is wrong, but printing the right version is too much of a hassle +# (we have to check if later in the Changed list is another change and if so use this version +# instead of the current candidate) - and it wouldn't be (really) useful anyway… +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental2 [i386]) for 'amarok-less' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-less' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-higher' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-higher' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-higher' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-higher' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (5:4.6.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-higher (2.3.2-2+exp) + amarok-less (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (5:4.6.0+exp) +0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. +After this operation, 301 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-less/experimental2 amarok-higher/experimental --trivial-only -V + +# phonon-backend-null can't be used directly, but as it provides it is still fine… +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null2' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-null2' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null2' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4:4.20.0+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-null2 (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4:4.20.0+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-null2/experimental --trivial-only -V + +# if an or-group satisfier is already found, do not set others +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-xine' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (5:4.6.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (5:4.6.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine/experimental --trivial-only -V + +# … but proceed testing if the first doesn't work out +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine2' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine2' +Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine2' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine2' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (5:4.20.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine2 (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (5:4.20.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine2/experimental --trivial-only -V + +# sometimes, the second level need to be corrected, too +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine3' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine3' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine3' because of 'amarok-xine3' +Selected version '2.0' (experimental [all]) for 'intermediatepkg' because of 'phonon-backend-xine3' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine3' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + intermediatepkg (2.0) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine3 (5:4.6.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine3 (2.3.2-2+exp) + intermediatepkg (2.0) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine3 (5:4.6.0+exp) +0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. +After this operation, 301 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine3/experimental --trivial-only -V + +# … but proceed testing if the first doesn't work out even in second deep +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine4' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine4' +Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine4' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine4' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (5:4.20.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine4 (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (5:4.20.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine4/experimental --trivial-only -V + +# providers can be broken, too +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-broken' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-broken' +Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-broken' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-broken' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (5:4.20.0+exp) +The following NEW packages will be installed: + amarok-broken (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (5:4.20.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-broken/experimental --trivial-only -V + +# switch the candidate for recommends too if they should be installed +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-recommends' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-recommends (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-recommends/experimental --trivial-only -V -o APT::Install-Recommends=1 + +# … or not if not +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) +Recommended packages: + amarok-utils (2.3.1-1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) + | phonon-backend + libmtp8 (0.3.1+sid) + libc6 (2.11.2-7+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-recommends (2.3.2-2+exp) +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +After this operation, 86.0 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-recommends/experimental --trivial-only -V -o APT::Install-Recommends=0 + +# but broken recommends are not the end of the world +# FIXME: the version output for recommend packages is a bit strange… but what would be better? +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends2' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends2' +The following additional packages will be installed: + amarok-common (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +Recommended packages: + amarok-utils (2.3.1-1+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-recommends2 (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. +After this operation, 215 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-recommends2/experimental --trivial-only -V -o APT::Install-Recommends=1 + +# if one depends doesn't work, we don't need to look deeper… +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '1.0' (experimental [all]) for 'uninstallablepkg' +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: + uninstallablepkg : Depends: libmtp8 (>= 10:0.20.1) but it is not going to be installed + Depends: amarok-utils (= 2.3.2-2+exp) but 2.3.1-1+sid is to be installed +E: Unable to correct problems, you have held broken packages." aptget install uninstallablepkg/experimental --trivial-only -V + +insertinstalledpackage 'libmtp8' 'i386' '1' +insertinstalledpackage 'amarok' 'i386' '3' 'Depends: amarok-common (= 3), libmtp8 (>= 1)' +insertinstalledpackage 'amarok-common' 'all' '3' +# note that libmtp8 isn't downgraded as there is no need +testfailureequal "Reading package lists... +Building dependency tree... +Selected version '2.3.1-1+sid' (unstable [i386]) for 'amarok' +Selected version '2.3.1-1+sid' (unstable [all]) for 'amarok-common' because of 'amarok' +The following additional packages will be installed: + amarok-common (2.3.1-1+sid) + amarok-utils (2.3.1-1+sid) + libc6 (2.11.2-7+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok-utils (2.3.1-1+sid) + libc6 (2.11.2-7+sid) + phonon-backend-xine (4:4.6.0really4.4.2-1+sid) +The following packages will be DOWNGRADED: + amarok (3 => 2.3.1-1+sid) + amarok-common (3 => 2.3.1-1+sid) +0 upgraded, 3 newly installed, 2 downgraded, 0 to remove and 0 not upgraded. +After this operation, 129 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." apt install amarok/sid --trivial-only -V diff --git a/test/integration/test-releasefile-date b/test/integration/test-releasefile-date new file mode 100755 index 0000000..a985074 --- /dev/null +++ b/test/integration/test-releasefile-date @@ -0,0 +1,46 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'wheezy' 'apt' 'all' '0.8.15' + +getlabelfromsuite() { + echo -n 'Testcases' +} + +setupaptarchive --no-update + +runtest() { + local MSG="$1" + msgtest "Release file is $MSG as it has" "$2" + rm -rf rootdir/var/lib/apt/lists + generatereleasefiles "$3" + signreleasefiles + shift 3 + if [ "$MSG" = 'accepted' ]; then + testsuccess --nomsg aptget update "$@" + testfailure grep -q 'is not valid yet' rootdir/tmp/testsuccess.output + else + testfailure --nomsg aptget update "$@" + testsuccess grep -q 'is not valid yet' rootdir/tmp/testfailure.output + fi +} + + +runtest 'accepted' 'no date' '' +runtest 'accepted' 'ok date' 'now + 1 hour' +runtest 'rejected' 'date to far in the future' 'now + 12 hours' +runtest 'accepted' 'date to far in the future, but accepted via option' 'now + 12 hours' -o Acquire::Max-FutureTime=86400 + +sed -i -e 's#\(deb\(-src\)\?\) #\1 [check-date=no] #' rootdir/etc/apt/sources.list.d/* +runtest 'accepted' 'bad Date but overridden by sources option' 'now + 1 day' + +sed -i -e 's#\(deb\(-src\)\?\) \[.*\] #\1 [date-max-future=86400] #' rootdir/etc/apt/sources.list.d/* +runtest 'accepted' 'Date allowed via sources list option via sources option' 'now + 12 hours' + +sed -i -e 's#\(deb\(-src\)\?\) \[.*\] #\1 [date-max-future=86405] #' rootdir/etc/apt/sources.list.d/* +runtest 'rejected' 'Date further in the future than allowed by sources.list option' 'now + 2 day' diff --git a/test/integration/test-releasefile-date-older b/test/integration/test-releasefile-date-older new file mode 100755 index 0000000..e38ddc3 --- /dev/null +++ b/test/integration/test-releasefile-date-older @@ -0,0 +1,104 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'wheezy' 'apt' 'all' '0.8.15' + +setupaptarchive --no-update + +# we don't complain as the server could have just sent a 'Hit' here and this +# 'downgrade attack' is usually performed by out-of-sync mirrors. Valid-Until +# catches the 'real' downgrade attacks (expect that it finds stale mirrors). +# Scaring users with an error here serves hence no point. + +msgmsg 'InRelease file is silently rejected if' 'new Date is before old Date' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' 'now + 7 days' +signreleasefiles +testsuccess aptget update +listcurrentlistsdirectory > listsdir.lst +redatereleasefiles 'now - 2 days' +testsuccess aptget update +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + +msgmsg 'Release.gpg file is silently rejected if' 'new Date is before old Date' +export APT_DONT_SIGN='InRelease' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' 'now + 7 days' +signreleasefiles +testsuccess aptget update +listcurrentlistsdirectory > listsdir.lst +redatereleasefiles 'now - 2 days' +testsuccess aptget update +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" +unset APT_DONT_SIGN + +msgmsg 'Crisscross InRelease/Release.gpg file is silently rejected if' 'new Date is before old Date' +export APT_DONT_SIGN='Release.gpg' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' 'now + 7 days' +signreleasefiles +testsuccess aptget update +export APT_DONT_SIGN='InRelease' +listcurrentlistsdirectory > listsdir.lst +redatereleasefiles 'now - 2 days' +testsuccess aptget update +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" +unset APT_DONT_SIGN + +msgmsg 'Crisscross Release.gpg/InRelease file is silently rejected if' 'new Date is before old Date' +export APT_DONT_SIGN='InRelease' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' 'now + 7 days' +signreleasefiles +find aptarchive -name 'InRelease' -delete +testsuccess aptget update +export APT_DONT_SIGN='Release.gpg' +listcurrentlistsdirectory > listsdir.lst +redatereleasefiles 'now - 2 days' +testsuccess aptget update +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" +unset APT_DONT_SIGN + +msgmsg 'Release file has' 'no Date and no Valid-Until field' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' +sed -i '/^Date: / d' $(find ./aptarchive -name 'Release') +signreleasefiles +testwarning aptget update +listcurrentlistsdirectory > listsdir.lst +# have no effect as Date is unknown +testwarning aptget update -o Acquire::Min-ValidTime=$((3600*24*30)) +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" +testwarning aptget update -o Acquire::Max-ValidTime=1 +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" +sed -i '/^Codename: / a\ +Another-Field: yes' $(find aptarchive/ -name 'Release') +touch -d 'now + 1 day' $(find aptarchive/ -name 'Release') +signreleasefiles "${2:-Joe Sixpack}" +testwarning aptget update +testsuccess cmp $(find aptarchive/ -name 'InRelease') $(find rootdir/var/lib/apt/ -name '*_InRelease') + +msgmsg 'Release file has' 'no Date field, but Valid-Until expired' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' 'now - 2 days' +sed -i '/^Date: / d' $(find ./aptarchive -name 'Release') +signreleasefiles +testfailure aptget update +listcurrentlistsdirectory > listsdir.lst +# have no effect as Date is unknown +testfailure aptget update -o Acquire::Min-ValidTime=$((3600*24*30)) +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" +testfailure aptget update -o Acquire::Max-ValidTime=1 +testfileequal 'listsdir.lst' "$(listcurrentlistsdirectory)" + +msgmsg 'Release file has' 'no Date field, but Valid-Until is good' +rm -rf rootdir/var/lib/apt/lists +generatereleasefiles 'now' 'now + 2 days' +sed -i '/^Date: / d' $(find ./aptarchive -name 'Release') +signreleasefiles +testwarning aptget update diff --git a/test/integration/test-releasefile-valid-until b/test/integration/test-releasefile-valid-until new file mode 100755 index 0000000..b18dde2 --- /dev/null +++ b/test/integration/test-releasefile-valid-until @@ -0,0 +1,57 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'wheezy' 'apt' 'all' '0.8.15' + +getlabelfromsuite() { + echo -n 'Testcases' +} + +setupaptarchive --no-update + +runtest() { + local MSG="$1" + msgtest "Release file is $MSG as it has" "$2" + rm -rf rootdir/var/lib/apt/lists + generatereleasefiles "$3" "$4" + signreleasefiles + shift 4 + if [ "$MSG" = 'accepted' ]; then + testsuccess --nomsg aptget update "$@" + testfailure grep -q 'is expired' rootdir/tmp/testsuccess.output + else + testfailure --nomsg aptget update "$@" + testsuccess grep -q 'is expired' rootdir/tmp/testfailure.output + fi +} + +runtest 'accepted' 'no Until' '' '' +runtest 'accepted' 'no Until and good Max-Valid' '' '' -o Acquire::Max-ValidTime=3600 +runtest 'rejected' 'no Until, but bad Max-Valid' 'now - 2 days' '' -o Acquire::Max-ValidTime=3600 +runtest 'accepted' 'good Until' 'now - 3 days' 'now + 1 day' +runtest 'rejected' 'bad Until' 'now - 7 days' 'now - 4 days' +runtest 'rejected' 'bad Until (ignore good Max-Valid)' 'now - 7 days' 'now - 4 days' -o Acquire::Max-ValidTime=1209600 +runtest 'rejected' 'bad Max-Valid (bad Until)' 'now - 7 days' 'now - 4 days' -o Acquire::Max-ValidTime=86400 +runtest 'rejected' 'bad Max-Valid (good Until)' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=86400 +runtest 'accepted' 'good labeled Max-Valid' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=86400 -o Acquire::Max-ValidTime::Testcases=1209600 +runtest 'rejected' 'bad labeled Max-Valid' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=1209600 -o Acquire::Max-ValidTime::Testcases=86400 +runtest 'accepted' 'good Until (good Min-Valid, no Max-Valid)' 'now - 7 days' 'now + 1 days' -o Acquire::Min-ValidTime=1209600 +runtest 'accepted' 'good Min-Valid (bad Until, no Max-Valid)' 'now - 7 days' 'now - 4 days' -o Acquire::Min-ValidTime=1209600 +runtest 'accepted' 'good Min-Valid (bad Until, good Max-Valid) <' 'now - 7 days' 'now - 2 days' -o Acquire::Min-ValidTime=1209600 -o Acquire::Max-ValidTime=2419200 +runtest 'rejected' 'bad Max-Valid (bad Until, good Min-Valid) >' 'now - 7 days' 'now - 2 days' -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=2419200 +runtest 'rejected' 'bad Max-Valid (bad Until, bad Min-Valid) <' 'now - 7 days' 'now - 2 days' -o Acquire::Min-ValidTime=12096 -o Acquire::Max-ValidTime=241920 +runtest 'rejected' 'bad Max-Valid (bad Until, bad Min-Valid) >' 'now - 7 days' 'now - 2 days' -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=241920 + +sed -i -e 's#\(deb\(-src\)\?\) #\1 [check-valid-until=no] #' rootdir/etc/apt/sources.list.d/* +runtest 'accepted' 'bad Until but overridden by sources option' 'now - 7 days' 'now - 4 days' + +sed -i -e 's#\(deb\(-src\)\?\) \[check-valid-until=no\] #\1 [valid-until-max=86400] #' rootdir/etc/apt/sources.list.d/* +runtest 'rejected' 'bad Max-Valid (good Until) via sources option' 'now - 7 days' 'now + 4 days' + +sed -i -e 's#\(deb\(-src\)\?\) \[valid-until-max=86400\] #\1 [valid-until-min=1209600] #' rootdir/etc/apt/sources.list.d/* +runtest 'accepted' 'good Min-Valid (bad Until) via sources option' 'now - 7 days' 'now - 4 days' diff --git a/test/integration/test-releasefile-verification b/test/integration/test-releasefile-verification new file mode 100755 index 0000000..382d89e --- /dev/null +++ b/test/integration/test-releasefile-verification @@ -0,0 +1,505 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +export APT_DONT_SIGN='Release.gpg' +buildaptarchive +setupflataptarchive +changetowebserver + +prepare() { + local DATE="${2:-now}" + if [ "$DATE" = 'now' ]; then + if [ "$1" = "${PKGFILE}-new" ]; then + DATE='now - 1 day' + else + DATE='now - 7 day' + fi + fi + for release in $(find rootdir/var/lib/apt/lists 2> /dev/null); do + touch -d 'now - 1 year' "$release" + done + aptget clean + cp "$1" aptarchive/Packages + find aptarchive -name 'Release' -delete + compressfile 'aptarchive/Packages' "$DATE" + generatereleasefiles "$DATE" 'now + 1 month' +} + +installaptold() { + rm -rf rootdir/var/cache/apt/archives + testsuccessequal "Reading package lists... +Building dependency tree... +Suggested packages: + aptitude | synaptic | wajig dpkg-dev apt-doc bzip2 lzma python-apt +The following NEW packages will be installed: + apt +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +After this operation, 5370 kB of additional disk space will be used. +Get:1 http://localhost:${APTHTTPPORT} apt 0.7.25.3 +Download complete and in download only mode" aptget install apt -dy +} + +installaptnew() { + rm -rf rootdir/var/cache/apt/archives + testsuccessequal "Reading package lists... +Building dependency tree... +Suggested packages: + aptitude | synaptic | wajig dpkg-dev apt-doc bzip2 lzma python-apt +The following NEW packages will be installed: + apt +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +After this operation, 5808 kB of additional disk space will be used. +Get:1 http://localhost:${APTHTTPPORT} apt 0.8.0~pre1 +Download complete and in download only mode" aptget install apt -dy +} + +failaptold() { + testfailureequal 'Reading package lists... +Building dependency tree... +Suggested packages: + aptitude | synaptic | wajig dpkg-dev apt-doc bzip2 lzma python-apt +The following NEW packages will be installed: + apt +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +After this operation, 5370 kB of additional disk space will be used. +WARNING: The following packages cannot be authenticated! + apt +E: There were unauthenticated packages and -y was used without --allow-unauthenticated' aptget install apt -dy +} + +failaptnew() { + testfailureequal 'Reading package lists... +Building dependency tree... +Suggested packages: + aptitude | synaptic | wajig dpkg-dev apt-doc bzip2 lzma python-apt +The following NEW packages will be installed: + apt +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +After this operation, 5808 kB of additional disk space will be used. +WARNING: The following packages cannot be authenticated! + apt +E: There were unauthenticated packages and -y was used without --allow-unauthenticated' aptget install apt -dy +} + +# fake our downloadable file +touch aptarchive/apt.deb + +PKGFILE="${TESTDIR}/$(echo "$(basename "$0")" | sed 's#^test-#Packages-#')" + +updatewithwarnings() { + testwarning aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + testsuccess grep -E "$1" rootdir/tmp/testwarning.output +} + +runtest() { + msgmsg 'Cold archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + if [ "$(id -u)" != '0' ]; then + msgmsg 'Cold archive signed by' 'Joe Sixpack + unreadable key' + rm -rf rootdir/var/lib/apt/lists + echo 'foobar' > rootdir/etc/apt/trusted.gpg.d/unreadablekey.gpg + chmod 000 rootdir/etc/apt/trusted.gpg.d/unreadablekey.gpg + updatewithwarnings '^W: .* is not readable by user' + chmod 644 rootdir/etc/apt/trusted.gpg.d/unreadablekey.gpg + rm -f rootdir/etc/apt/trusted.gpg.d/unreadablekey.gpg + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + fi + + msgmsg 'Good warm archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}-new" + signreleasefiles 'Joe Sixpack' + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + msgmsg 'Cold archive signed by' 'Rex Expired' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + cp keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + signreleasefiles 'Rex Expired' + updatewithwarnings '^W: .* EXPKEYSIG' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + failaptold + rm -f rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + + msgmsg 'Cold archive expired signed by' 'Joe Sixpack' + if dpkg --compare-versions "$(aptkey adv --version | head -n 2 | tail -n 1 | cut -d' ' -f 3)" '>=' '2.1' >/dev/null 2>&1; then + touch rootdir/etc/apt/apt.conf.d/99gnupg2 + elif gpg2 --version >/dev/null 2>&1; then + echo 'Apt::Key::gpgcommand "gpg2";' > rootdir/etc/apt/apt.conf.d/99gnupg2 + if ! dpkg --compare-versions "$(aptkey adv --version | head -n 2 | tail -n 1 | cut -d' ' -f 3)" '>=' '2.1' >/dev/null 2>&1; then + rm rootdir/etc/apt/apt.conf.d/99gnupg2 + fi + fi + if [ -e rootdir/etc/apt/apt.conf.d/99gnupg2 ]; then + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' 'aptarchive' --faked-system-time "20070924T154812" --default-sig-expire 2016-04-01 + updatewithwarnings '^W: .* EXPSIG' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + failaptold + rm -f rootdir/etc/apt/apt.conf.d/99gnupg2 + else + msgskip 'Not a new enough gpg available providing --fake-system-time' + fi + + msgmsg 'Cold archive signed by' 'Joe Sixpack,Marvin Paranoid' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack,Marvin Paranoid' + successfulaptgetupdate 'NO_PUBKEY' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Cold archive signed by' 'Joe Sixpack,Rex Expired' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack,Rex Expired' + cp keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + successfulaptgetupdate 'EXPKEYSIG' + rm -f rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Cold archive signed by' 'Marvin Paranoid' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Marvin Paranoid' + updatewithwarnings '^W: .* NO_PUBKEY' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + failaptold + + msgmsg 'Bad warm archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}-new" + signreleasefiles 'Joe Sixpack' + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + msgmsg 'Cold archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Good warm archive signed by' 'Marvin Paranoid' + prepare "${PKGFILE}-new" + signreleasefiles 'Marvin Paranoid' + updatewithwarnings '^W: .* NO_PUBKEY' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Good warm archive signed by' 'Rex Expired' + prepare "${PKGFILE}-new" + cp keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + signreleasefiles 'Rex Expired' + updatewithwarnings '^W: .* EXPKEYSIG' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + rm rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + + msgmsg 'Good warm archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}-new" + signreleasefiles + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + msgmsg 'Cold archive signed by bad keyring' 'Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + local MARVIN="$(readlink -f keys/marvinparanoid.pub)" + sed -i "s#^\(deb\(-src\)\?\) #\1 [signed-by=$MARVIN] #" rootdir/etc/apt/sources.list.d/* + updatewithwarnings '^W: .* NO_PUBKEY' + + msgmsg 'Cold archive signed by good keyring' 'Marvin Paranoid' + prepare "${PKGFILE}" + signreleasefiles 'Marvin Paranoid' + rm -rf rootdir/var/lib/apt/lists + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Cold archive signed by good keyrings' 'Marvin Paranoid, Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + local SIXPACK="$(readlink -f keys/joesixpack.pub)" + sed -i "s# \[signed-by=[^]]\+\] # [signed-by=$MARVIN,$SIXPACK] #" rootdir/etc/apt/sources.list.d/* + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Cold archive signed by good keyrings' 'Joe Sixpack, Marvin Paranoid' + rm -rf rootdir/var/lib/apt/lists + local SIXPACK="$(readlink -f keys/joesixpack.pub)" + sed -i "s# \[signed-by=[^]]\+\] # [signed-by=$SIXPACK,$MARVIN] #" rootdir/etc/apt/sources.list.d/* + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + sed -i "s# \[signed-by=[^]]\+\] # #" rootdir/etc/apt/sources.list.d/* + + local MARVIN="$(aptkey --keyring $MARVIN finger --with-colons | grep '^fpr' | cut -d':' -f 10)" + msgmsg 'Cold archive signed by bad keyid' 'Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + sed -i "s#^\(deb\(-src\)\?\) #\1 [signed-by=$MARVIN] #" rootdir/etc/apt/sources.list.d/* + updatewithwarnings '^W: .* be verified because the public key is not available: .*' + + msgmsg 'Cold archive signed by good keyid' 'Marvin Paranoid' + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Marvin Paranoid' + cp keys/marvinparanoid.pub rootdir/etc/apt/trusted.gpg.d/marvinparanoid.gpg + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Cold archive signed by good keyid' 'Marvin Paranoid,Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Marvin Paranoid,Joe Sixpack' + successfulaptgetupdate 'NoPubKey: GOODSIG' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + local SIXPACK="$(aptkey --keyring keys/joesixpack.pub finger --with-colons | grep '^fpr' | cut -d':' -f 10)" + msgmsg 'Cold archive signed by good keyids' 'Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + sed -i "s#^\(deb\(-src\)\?\) \[signed-by=$MARVIN\] #\1 [signed-by=${SIXPACK},${MARVIN}] #" rootdir/etc/apt/sources.list.d/* + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Cold archive signed by good keyids' 'Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + sed -i "s#^\(deb\(-src\)\?\) \[signed-by=${SIXPACK},${MARVIN}\] #\1 [signed-by=${MARVIN},${SIXPACK}] #" rootdir/etc/apt/sources.list.d/* + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + rm -f rootdir/etc/apt/trusted.gpg.d/marvinparanoid.gpg + sed -i "s#^\(deb\(-src\)\?\) \[signed-by=${MARVIN},${SIXPACK}\] #\1 #" rootdir/etc/apt/sources.list.d/* + + rm -rf rootdir/var/lib/apt/lists-bak + cp -a rootdir/var/lib/apt/lists rootdir/var/lib/apt/lists-bak + prepare "${PKGFILE}-new" + signreleasefiles 'Joe Sixpack' + + msgmsg 'Warm archive with signed-by' 'Joe Sixpack' + sed -i "/^Valid-Until: / a\ +Signed-By: ${SIXPACK}" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + msgmsg 'Warm archive with signed-by' 'Marvin Paranoid' + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + sed -i "/^Valid-Until: / a\ +Signed-By: ${MARVIN}" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + updatewithwarnings 'W: .* public key is not available: GOODSIG' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + msgmsg 'Warm archive with outdated signed-by' 'Marvin Paranoid' + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + sed -i "/^Valid-Until: / a\ +Valid-Until: $(date -u -d "now - 2min" '+%a, %d %b %Y %H:%M:%S %Z') \\ +Signed-By: ${MARVIN}" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + msgmsg 'Warm archive with two signed-bys' 'Joe Sixpack' + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + sed -i "/^Valid-Until: / a\ +Signed-By: ${MARVIN} ${MARVIN}, \\ + ${SIXPACK}" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + cp -a keys/sebastiansubkey.pub rootdir/etc/apt/trusted.gpg.d/sebastiansubkey.gpg + local SEBASTIAN="$(aptkey --keyring keys/sebastiansubkey.pub finger --with-colons | grep -m 1 '^fpr' | cut -d':' -f 10)" + msgmsg 'Warm archive with subkey signing' 'Sebastian Subkey' + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + signreleasefiles 'Sebastian Subkey' + sed -i "/^Valid-Until: / a\ +Signed-By: ${SEBASTIAN}" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + + msgmsg 'Warm archive with wrong exact subkey signing' 'Sebastian Subkey' + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + sed -i "/^Valid-Until: / a\ +Signed-By: ${SEBASTIAN}!" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + updatewithwarnings 'W: .* public key is not available: GOODSIG' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + installaptold + + local SUBKEY="$(aptkey --keyring keys/sebastiansubkey.pub finger --with-colons | grep -m 2 '^fpr' | tail -n -1 | cut -d':' -f 10)" + msgmsg 'Warm archive with correct exact subkey signing' 'Sebastian Subkey' + rm -rf rootdir/var/lib/apt/lists + cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists + sed -i "/^Valid-Until: / a\ +Signed-By: ${SUBKEY}!" rootdir/var/lib/apt/lists/*Release + touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release + successfulaptgetupdate + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + installaptnew + rm -f rootdir/etc/apt/trusted.gpg.d/sebastiansubkey.gpg +} + +runtest2() { + msgmsg 'Cold archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + successfulaptgetupdate + + # New .deb but now an unsigned archive. For example MITM to circumvent + # package verification. + msgmsg 'Warm archive signed by' 'nobody' + prepare "${PKGFILE}-new" + find aptarchive/ \( -name InRelease -o -name Release.gpg \) -delete + updatewithwarnings 'W: .* no longer signed.' + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + failaptnew + + # Unsigned archive from the beginning must also be detected. + msgmsg 'Cold archive signed by' 'nobody' + rm -rf rootdir/var/lib/apt/lists + updatewithwarnings 'W: .* is not signed.' + testsuccessequal "$(cat "${PKGFILE}-new") +" aptcache show apt + failaptnew +} + +runtest3() { + echo "APT::Hashes::$APT_TESTS_DIGEST_ALGO::$1 \"yes\";" > rootdir/etc/apt/apt.conf.d/truststate + msgmsg "Running base test with $1 digest" + runtest2 + + for DELETEFILE in 'InRelease' 'Release.gpg'; do + export APT_DONT_SIGN="$DELETEFILE" + msgmsg "Running test with deletion of $DELETEFILE and $1 digest" + runtest + export APT_DONT_SIGN='Release.gpg' + done +} + +# disable some protection by default and ensure we still do the verification +# correctly +cat > rootdir/etc/apt/apt.conf.d/weaken-security <<EOF +Acquire::AllowInsecureRepositories "1"; +Acquire::AllowDowngradeToInsecureRepositories "1"; +EOF +# the hash marked as configurable in our gpgv method +export APT_TESTS_DIGEST_ALGO='SHA224' + +successfulaptgetupdate() { + testsuccess aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + if [ -n "$1" ]; then + cp rootdir/tmp/testsuccess.output aptupdate.output + testsuccess grep "$1" aptupdate.output + fi +} +runtest3 'Trusted' + +successfulaptgetupdate() { + testwarning aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + if [ -n "$1" ]; then + testsuccess grep "$1" rootdir/tmp/testwarning.output + fi + testsuccess grep 'uses weak digest algorithm' rootdir/tmp/testwarning.output +} +runtest3 'Weak' + +msgmsg "Running test with apt-untrusted digest" +echo "APT::Hashes::$APT_TESTS_DIGEST_ALGO::Untrusted \"yes\";" > rootdir/etc/apt/apt.conf.d/truststate +runfailure() { + for DELETEFILE in 'InRelease' 'Release.gpg'; do + export APT_DONT_SIGN="$DELETEFILE" + msgmsg 'Cold archive signed by' 'Joe Sixpack' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + testfailure aptget update --no-allow-insecure-repositories -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + testsuccess grep 'The following signatures were invalid' rootdir/tmp/testfailure.output + testnopackage 'apt' + testwarning aptget update --allow-insecure-repositories -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + failaptold + rm -rf rootdir/var/lib/apt/lists + sed -i 's#^deb\(-src\)\? #deb\1 [allow-insecure=yes] #' rootdir/etc/apt/sources.list.d/* + testwarning aptget update --no-allow-insecure-repositories -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + failaptold + sed -i 's#^deb\(-src\)\? \[allow-insecure=yes\] #deb\1 #' rootdir/etc/apt/sources.list.d/* + + msgmsg 'Cold archive signed by' 'Marvin Paranoid' + prepare "${PKGFILE}" + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Marvin Paranoid' + testfailure aptget update --no-allow-insecure-repositories -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::gpgv=1 + testnopackage 'apt' + updatewithwarnings '^W: .* NO_PUBKEY' + testsuccessequal "$(cat "${PKGFILE}") +" aptcache show apt + failaptold + export APT_DONT_SIGN='Release.gpg' + done +} +runfailure + +msgmsg "Running test with gpgv-untrusted digest" +export APT_TESTS_DIGEST_ALGO='MD5' +runfailure diff --git a/test/integration/test-releasefile-verification-noflat b/test/integration/test-releasefile-verification-noflat new file mode 100755 index 0000000..3953c64 --- /dev/null +++ b/test/integration/test-releasefile-verification-noflat @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +export APT_DONT_SIGN='Release.gpg' +insertpackage 'unstable' 'foo' 'i386' '1.0' +setupaptarchive "now" "now + 1 year" +changetowebserver + +SIXPACK="$(aptkey --keyring keys/joesixpack.pub finger | grep 'Key fingerprint' | cut -d'=' -f 2 | tr -d ' ')" + +testsuccess aptget update + +msgmsg 'Warm archive with signed-by' 'Joe Sixpack' +sed -i "/^Valid-Until: / a\ +Signed-By: ${SIXPACK}" rootdir/var/lib/apt/lists/*Release +touch -d 'now - 1 year' rootdir/var/lib/apt/lists/*Release +testsuccessequal "Get:1 http://localhost:${APTHTTPPORT} unstable InRelease [$(stat -c '%s' 'aptarchive/dists/unstable/InRelease') B] +Reading package lists..." aptget update +testsuccess aptcache show foo diff --git a/test/integration/test-resolve-by-keep-new-recommends b/test/integration/test-resolve-by-keep-new-recommends new file mode 100755 index 0000000..3591ed8 --- /dev/null +++ b/test/integration/test-resolve-by-keep-new-recommends @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertinstalledpackage 'foo' 'i386' '1.0' +insertpackage 'unstable' 'foo' 'i386' '2.0' 'Recommends: bar' + +setupaptarchive + +UPGRADE_KEEP="Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + foo +0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded." +testsuccessequal "$UPGRADE_KEEP" aptget upgrade -s + diff --git a/test/integration/test-security-no-remote-status b/test/integration/test-security-no-remote-status new file mode 100755 index 0000000..7db979e --- /dev/null +++ b/test/integration/test-security-no-remote-status @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Test that packages from remote sources cannot set the Status field. +# +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +TMPDIR=$(readlink -f .) + +insertpackage 'unstable' 'pretends-installed' 'all' '1' 'Status: install ok installed' +insertinstalledpackage 'really-installed' 'all' '1' +setupaptarchive + +testequal "pretends-installed: + Installed: (none) + Candidate: 1 + Version table: + 1 500 + 500 file:${TMPDIR}/aptarchive unstable/main all Packages" aptcache policy pretends-installed + +testequal "really-installed: + Installed: 1 + Candidate: 1 + Version table: + *** 1 100 + 100 ${TMPDIR}/rootdir/var/lib/dpkg/status" aptcache policy really-installed diff --git a/test/integration/test-signed-by-option b/test/integration/test-signed-by-option new file mode 100755 index 0000000..faa7dec --- /dev/null +++ b/test/integration/test-signed-by-option @@ -0,0 +1,33 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +msgtest 'Check that a repository with' 'signed-by and two components works' +echo 'deb [signed-by=CDE5618B8805FD6E202CE9C2D73C39E56580B386] https://people.debian.org/~jak/debian/ stable main contrib # Äffchen' > rootdir/etc/apt/sources.list +testsuccess --nomsg aptcache policy + +msgtest 'Check that a repository with' 'two fingerprints work' +echo 'deb [signed-by=CDE5618B8805FD6E202CE9C2D73C39E56580B386,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] https://people.debian.org/~jak/debian/ stable main contrib # Äffchen' > rootdir/etc/apt/sources.list +testsuccess --nomsg aptcache policy + +msgtest 'Check that a repository with' 'exact fingerprint works' +echo 'deb [signed-by=CDE5618B8805FD6E202CE9C2D73C39E56580B386!] https://people.debian.org/~jak/debian/ stable main contrib # Äffchen' > rootdir/etc/apt/sources.list +testsuccess --nomsg aptcache policy + +msgtest 'Check that a repository with' 'whitespaced fingerprints work' +echo 'deb [signed-by=CDE5618B8805FD6E202CE9C2D73C39E56580B386!,,,,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] https://people.debian.org/~jak/debian/ stable main contrib # Äffchen' > rootdir/etc/apt/sources.list +cat > rootdir/etc/apt/sources.list.d/people.sources <<EOF +Types: deb +URIs: mirror+file:/var/lib/apt/mirror.lst +Suites: stable testing +Components: main contrib +Architectures: amd64 i386 +Signed-By: CDE5618B8805FD6E202CE9C2D73C39E56580B386! AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + , , BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB +EOF +testsuccess --nomsg aptcache policy diff --git a/test/integration/test-sourceslist-arch-plusminus-options b/test/integration/test-sourceslist-arch-plusminus-options new file mode 100755 index 0000000..fdf33cc --- /dev/null +++ b/test/integration/test-sourceslist-arch-plusminus-options @@ -0,0 +1,94 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +testbinaries() { + msgtest 'Test acquired archs for' "$1" + shift + rm -f gotarchs.list + aptget update --print-uris | grep -o '/binary-[a-z0-9-]\+/Packages' | sort > gotarchs.list + while [ -n "$1" ]; do + echo "/binary-${1}/Packages" + shift + done | sort | checkdiff - gotarchs.list && msgpass || msgfail +} + +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'default & native' 'amd64' 'all' +configarchitecture 'amd64' 'i386' +testbinaries 'default & native + foreign' 'amd64' 'i386' 'all' +configarchitecture 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' +testbinaries 'default & native + many foreigns' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'all' + +echo 'deb [arch=amd64] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch=native' 'amd64' 'all' + +echo 'deb [arch=mips] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch=foreign' 'mips' 'all' + +echo 'deb [arch=kfreebsd-armel] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch=unknown' 'kfreebsd-armel' 'all' + +echo 'deb [arch=amd64,i386] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch=native,foreign' 'amd64' 'i386' 'all' + +echo 'deb [arch=mips,armhf] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch=foreign,foreign' 'mips' 'armhf' 'all' + +echo 'deb [arch=kfreebsd-armel,hurd-powerpc,mipsel,armel] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch=unknown,unknown,foreign,foreign' 'kfreebsd-armel' 'hurd-powerpc' 'mipsel' 'armel' 'all' + +echo 'deb [arch+=amd64] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch+=native' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'all' + +echo 'deb [arch+=mips] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch+=foreign' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'all' + +echo 'deb [arch+=mips,armhf,i386] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch+=foreign,foreign,foreign' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'all' + +echo 'deb [arch+=hurd-powerpc] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch+=unknown' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'hurd-powerpc' 'all' + +echo 'deb [arch+=mips,hurd-powerpc,i386] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch+=foreign,unknown,foreign' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'hurd-powerpc' 'all' + +echo 'deb [arch-=amd64] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch-=native' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'all' + +echo 'deb [arch-=mips] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch-=foreign' 'amd64' 'i386' 'armel' 'armhf' 'mipsel' 'all' + +echo 'deb [arch-=mips,armhf,i386] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch-=foreign,foreign,foreign' 'amd64' 'armel' 'mipsel' 'all' + +echo 'deb [arch-=hurd-powerpc] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch-=unknown' 'amd64' 'i386' 'armel' 'armhf' 'mips' 'mipsel' 'all' + +echo 'deb [arch-=mips,hurd-powerpc,i386] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'arch-=foreign,unknown,foreign' 'amd64' 'armel' 'armhf' 'mipsel' 'all' + +echo 'deb [arch=mips,i386 arch-=mips] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'subtract from a arch-set' 'i386' 'all' + +echo 'deb [arch=mips,i386 arch-=mips] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'useless subtract from a arch-set' 'i386' 'all' + +echo 'deb [arch=mips,i386 arch+=armhf] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'addition to a arch-set' 'i386' 'mips' 'armhf' 'all' + +echo 'deb [arch=mips,i386 arch+=mips] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'useless addition to a arch-set' 'i386' 'mips' 'all' + +echo 'deb [arch=i386 arch-=all] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'substract all from arch-set' 'i386' + +echo 'deb [arch=i386 arch+=all] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'useless addition of all' 'i386' 'all' + +echo 'deb [arch=all] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testbinaries 'explicit all' 'all' diff --git a/test/integration/test-sourceslist-lang-plusminus-options b/test/integration/test-sourceslist-lang-plusminus-options new file mode 100755 index 0000000..abdb647 --- /dev/null +++ b/test/integration/test-sourceslist-lang-plusminus-options @@ -0,0 +1,88 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +testlangs() { + msgtest 'Test acquired languages for' "$1" + local LANGS="$2" + shift 2 + rm -f gotlangs.list + aptget indextargets --no-release-info 'Identifier: Translations' "$@" --format '$(LANGUAGE)' | sort -u > gotlangs.list + if [ -z "$LANGS" ]; then + echo -n | tr ',' '\n' | sort | checkdiff - gotlangs.list && msgpass || msgfail + else + echo -n "$LANGS" | tr ',' '\n' | sort | checkdiff - gotlangs.list && msgpass || msgfail + fi +} +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'default' 'en' + +echo 'Acquire::Languages "environment,en";' > rootdir/etc/apt/apt.conf.d/langs.conf +testlangs 'default config' 'en' + +echo 'Acquire::Languages "en,en,en";' > rootdir/etc/apt/apt.conf.d/langs.conf +testlangs 'duplicated config' 'en' + +echo 'Acquire::Languages "none";' > rootdir/etc/apt/apt.conf.d/langs.conf +testlangs 'none config' '' + +echo 'Acquire::Languages "en,none,de,de_DE";' > rootdir/etc/apt/apt.conf.d/langs.conf +testlangs 'english + german config' 'en,de,de_DE' + +echo 'deb [lang=pt] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang=pt' 'pt' + +echo 'deb [lang=en] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang=en' 'en' + +echo 'deb [lang=de_DE] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang=de_DE' 'de_DE' + +echo 'deb [lang=none] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang=none' '' +testequal 'amd64 +all' aptget indextargets --no-release-info 'Identifier: Packages' --format '$(ARCHITECTURE)' + +echo 'deb [lang+=pt] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang+=pt' 'en,de,de_DE,pt' + +echo 'deb [lang+=en] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang+=en' 'en,de,de_DE' + +echo 'deb [lang+=de_DE] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang+=de_DE' 'en,de,de_DE' + +echo 'deb [lang-=pt] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang-=pt' 'en,de,de_DE' + +echo 'deb [lang-=en] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang-=en' 'de,de_DE' + +echo 'deb [lang-=de_DE] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testlangs 'lang-=de_DE' 'en,de' + +echo 'deb http://example.org/debian stable rocks +deb http://example.org/debian stable solid' > rootdir/etc/apt/sources.list +testlangs 'english + german config multicomponent' 'en,de,de_DE' + +echo 'deb http://example.org/debian stable rocks +deb [lang=pt] http://example.org/debian stable solid' > rootdir/etc/apt/sources.list +testlangs 'multicomponent one lang= combined' 'en,de,de_DE,pt' +testlangs 'multicomponent one lang= rocks' 'en,de,de_DE' 'Component: rocks' +testlangs 'multicomponent one lang= solid' 'pt' 'Component: solid' + +echo 'deb [lang=pt] http://example.org/debian stable rocks +deb [lang=de] http://example.org/debian stable solid' > rootdir/etc/apt/sources.list +testlangs 'multicomponent different lang= combined' 'de,pt' +testlangs 'multicomponent different lang= rocks' 'pt' 'Component: rocks' +testlangs 'multicomponent different lang= solid' 'de' 'Component: solid' + +echo 'deb [lang+=pt] http://example.org/debian stable rocks +deb [lang-=de] http://example.org/debian stable solid' > rootdir/etc/apt/sources.list +testlangs 'multicomponent different lang+-= combined' 'en,de,de_DE,pt' +testlangs 'multicomponent different lang+-= rocks' 'en,de,de_DE,pt' 'Component: rocks' +testlangs 'multicomponent different lang+-= solid' 'en,de_DE' 'Component: solid' diff --git a/test/integration/test-sourceslist-target-plusminus-options b/test/integration/test-sourceslist-target-plusminus-options new file mode 100755 index 0000000..5c79af2 --- /dev/null +++ b/test/integration/test-sourceslist-target-plusminus-options @@ -0,0 +1,128 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +testtargets() { + msgtest 'Test acquired targets for' "$1" + shift + while [ -n "$1" ]; do + echo "$1" + shift + done | sort -u > expectedtargets.lst + aptget indextargets --no-release-info --format='$(CREATED_BY)' | sort -u > gottargets.lst + testfileequal --nomsg ./expectedtargets.lst "$(cat ./gottargets.lst)" +} + +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'default' 'Packages' 'Translations' + +msgmsg 'Contents as a default target' +cat > rootdir/etc/apt/apt.conf.d/content-target.conf <<EOF +Acquire::IndexTargets::deb::Contents { + MetaKey "\$(COMPONENT)/Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents"; + Description "\$(RELEASE)/\$(COMPONENT) \$(ARCHITECTURE) Contents"; +}; +Acquire::IndexTargets::deb::Contents2 { + MetaKey "Contents-\$(ARCHITECTURE)"; + ShortDescription "Contents2"; + Description "\$(RELEASE) \$(ARCHITECTURE) Contents2"; + Fallback-Of "Contents"; + Identifier "Contents"; +}; +EOF + +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'default + Contents' 'Packages' 'Translations' 'Contents' 'Contents2' + +echo 'deb [target=Packages] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'force Packages target' 'Packages' + +echo 'deb [target=Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'force Contents target' 'Contents' + +echo 'deb [target=Translations,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'force two targets' 'Contents' 'Translations' + +echo 'deb [target+=Translations,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'add existing' 'Packages' 'Contents' 'Translations' 'Contents2' + +echo 'deb [target+=AppStream] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'add non-existing' 'Packages' 'Contents' 'Translations' 'Contents2' + +echo 'deb [target-=Translations,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'remove existing' 'Packages' 'Contents2' + +echo 'deb [target-=AppStream] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'remove non-existing' 'Packages' 'Contents' 'Translations' 'Contents2' + +echo 'deb [AppStream=yes] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'activate non-existing' 'Packages' 'Contents' 'Translations' 'Contents2' + +echo 'deb [AppStream=no] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'deactivate non-existing' 'Packages' 'Contents' 'Translations' 'Contents2' + +echo 'deb [Contents=yes] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'activate existing' 'Packages' 'Contents' 'Contents2' 'Translations' + +echo 'deb [Contents=no] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'deactivate existing' 'Packages' 'Translations' + +echo 'deb [target=Packages Contents=yes] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'explicit + activate' 'Packages' 'Contents' 'Contents2' + +echo 'deb [Contents=yes,target+=Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'duplications are okay' 'Packages' 'Translations' 'Contents' 'Contents2' + +msgmsg 'Contents NOT as a default target (but Contents2)' +echo 'Acquire::IndexTargets::deb::Contents::DefaultEnabled "no";' > rootdir/etc/apt/apt.conf.d/content-target-notdefault.conf + +echo 'deb http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'default + Contents' 'Packages' 'Translations' 'Contents2' + +echo 'deb [target=Packages] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'force Packages target' 'Packages' + +echo 'deb [target=Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'force Contents target' 'Contents' + +echo 'deb [target=Translations,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'force two targets' 'Contents' 'Translations' + +echo 'deb [target+=Translations,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'add existing' 'Packages' 'Contents' 'Translations' 'Contents2' + +echo 'deb [target+=AppStream] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'add non-existing' 'Packages' 'Translations' 'Contents2' + +echo 'deb [target-=Translations,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'remove existing' 'Packages' 'Contents2' + +echo 'deb [target-=AppStream] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'remove non-existing' 'Packages' 'Translations' 'Contents2' + +echo 'deb [AppStream=yes] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'activate non-existing' 'Packages' 'Translations' 'Contents2' + +echo 'deb [AppStream=no] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'deactivate non-existing' 'Packages' 'Translations' 'Contents2' + +echo 'deb [Contents=yes] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'activate existing' 'Packages' 'Contents' 'Contents2' 'Translations' + +echo 'deb [Contents=no] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'deactivate existing' 'Packages' 'Translations' + +echo 'deb [target=Packages Contents=yes] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'explicit + activate' 'Packages' 'Contents' 'Contents2' + +echo 'deb [Contents=yes,target+=Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'duplications are okay' 'Packages' 'Translations' 'Contents' 'Contents2' + +# we can't check if it really reorders here +echo 'deb [target+=Contents2,Contents] http://example.org/debian stable rocks' > rootdir/etc/apt/sources.list +testtargets 'reordered fallback order' 'Packages' 'Translations' 'Contents' 'Contents2' diff --git a/test/integration/test-sourceslist-trusted-options b/test/integration/test-sourceslist-trusted-options new file mode 100755 index 0000000..1eee3b0 --- /dev/null +++ b/test/integration/test-sourceslist-trusted-options @@ -0,0 +1,218 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +buildsimplenativepackage 'foo' 'amd64' '1' 'stable' +buildsimplenativepackage 'foo' 'amd64' '2' 'testing' + +setupaptarchive --no-update + +APTARCHIVE=$(readlink -f ./aptarchive) + +everythingsucceeds() { + testsuccessequal 'Listing... +foo/testing 2 amd64 +foo/stable 1 amd64 +' apt list foo -a + + cd downloaded + rm -f foo_1_amd64.deb foo_2_amd64.deb + testsuccess aptget download foo "$@" + testsuccess test -s foo_1_amd64.deb -o -s foo_2_amd64.deb + + rm -f foo_1.dsc foo_2.dsc + testsuccess aptget source foo --dsc-only "$@" + testsuccess test -s foo_1.dsc -o -s foo_2.dsc + cd - >/dev/null +} + +everythingfails() { + testsuccessequal 'Listing... +foo/testing 2 amd64 +foo/stable 1 amd64 +' apt list foo -a + + local WARNING='WARNING: The following packages cannot be authenticated! + foo +E: Some packages could not be authenticated' + + cd downloaded + rm -f foo_1_amd64.deb foo_2_amd64.deb + testfailure aptget download foo "$@" + testequal "$WARNING" tail -n 3 ../rootdir/tmp/testfailure.output + testfailure test -s foo_1_amd64.deb -o -s foo_2_amd64.deb + + rm -f foo_1.dsc foo_2.dsc + testfailure aptget source foo --dsc-only "$@" + testequal "$WARNING" tail -n 3 ../rootdir/tmp/testfailure.output + testfailure test -s foo_1.dsc -o -s foo_2.dsc + cd - >/dev/null +} + +cp -a rootdir/etc/apt/sources.list.d/ rootdir/etc/apt/sources.list.d.bak/ +echo 'Debug::Acquire::Transaction "true"; +Debug::pkgAcquire::Worker "true";' > rootdir/etc/apt/apt.conf.d/00debugging + +aptgetupdate() { + rm -rf rootdir/var/lib/apt/lists + # note that insecure with trusted=yes are allowed + # as the trusted=yes indicates that security is provided by + # something above the understanding of apt + ${1:-testsuccess} aptget update --no-allow-insecure-repositories +} + +insecureaptgetupdate() { + rm -rf rootdir/var/lib/apt/lists + testfailure aptget update --no-allow-insecure-repositories + rm -rf rootdir/var/lib/apt/lists + testwarning aptget update --allow-insecure-repositories +} + +msgmsg 'Test without trusted option and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +aptgetupdate +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +# we want the warnings on the actions, but for 'update' everything is fine +aptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +find aptarchive/dists/stable \( -name 'InRelease' -o -name 'Release.gpg' \) -delete + +msgmsg 'Test without trusted option and good and unsigned sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingsucceeds +everythingfails -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good and unsigned sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good and unsigned sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +signreleasefiles 'Marvin Paranoid' 'aptarchive/dists/stable' + +msgmsg 'Test without trusted option and good and unknown sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingsucceeds +everythingfails -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good and unknown sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate 'testwarning' +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good and unknown sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +signreleasefiles 'Rex Expired' 'aptarchive/dists/stable' +cp -a keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg + +msgmsg 'Test without trusted option and good and expired sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingsucceeds +everythingfails -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=yes option and good and expired sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate 'testwarning' +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and good and expired sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +# same as the one further above, but this time testing is unsigned +find aptarchive/ \( -name 'InRelease' -o -name 'Release.gpg' \) -delete +signreleasefiles 'Joe Sixpack' 'aptarchive/dists/stable' + +msgmsg 'Test without trusted option and unsigned and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +insecureaptgetupdate +everythingfails +everythingsucceeds -t stable +everythingfails -t testing + +msgmsg 'Test with trusted=yes option and unsigned and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/* +aptgetupdate +everythingsucceeds +everythingsucceeds -t stable +everythingsucceeds -t testing + +msgmsg 'Test with trusted=no option and unsigned and good sources' +cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/ +sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/* +insecureaptgetupdate +everythingfails +everythingfails -t stable +everythingfails -t testing + +msgmsg 'Test conflicting trusted options are refused' +testsource() { + echo "$@" > rootdir/etc/apt/sources.list.d/example.list + testfailuremsg 'E: Conflicting values set for option Trusted regarding source http://example.org/bad/ unstable +E: The list of sources could not be read.' aptget update --print-uris +} +for VAL in 'yes' 'no'; do + testsource "deb http://example.org/bad unstable main +deb [trusted=${VAL}] http://example.org/bad unstable non-free" + testsource "deb [trusted=${VAL}] http://example.org/bad unstable main +deb http://example.org/bad unstable non-free" +done +testsource 'deb [trusted=yes] http://example.org/bad unstable main +deb [trusted=no] http://example.org/bad unstable non-free' +testsource 'deb [trusted=no] http://example.org/bad unstable main +deb [trusted=yes] http://example.org/bad unstable non-free' diff --git a/test/integration/test-specific-architecture-dependencies b/test/integration/test-specific-architecture-dependencies new file mode 100755 index 0000000..447e407 --- /dev/null +++ b/test/integration/test-specific-architecture-dependencies @@ -0,0 +1,324 @@ +#!/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' 'depender-x32' 'i386,amd64' '1' 'Depends: libc6:i386' +insertpackage 'unstable' 'depender-x64' 'i386,amd64' '1' 'Depends: libc6:amd64' + +insertpackage 'unstable' 'breaker' 'all' '1' 'Breaks: libold (<< 2)' +insertpackage 'unstable' 'breaker-x32' 'i386,amd64' '1' 'Breaks: libold:i386 (<< 2)' +insertpackage 'unstable' 'breaker-x64' 'i386,amd64' '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-native-depender' 'amd64' '1' 'Depends: foo:amd64' +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 + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional 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 + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional 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 + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libc6:i386 +The following NEW packages will be installed: + depender-x32:i386 libc6:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6:i386 (1 unstable [i386]) +Inst depender-x32:i386 (1 unstable [i386]) +Conf libc6:i386 (1 unstable [i386]) +Conf depender-x32:i386 (1 unstable [i386])' aptget install depender-x32:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libc6:i386 +The following NEW packages will be installed: + depender-x32 libc6:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6:i386 (1 unstable [i386]) +Inst depender-x32 (1 unstable [amd64]) +Conf libc6:i386 (1 unstable [i386]) +Conf depender-x32 (1 unstable [amd64])' aptget install depender-x32:amd64 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libc6 +The following NEW packages will be installed: + depender-x64 libc6 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 (1 unstable [amd64]) +Inst depender-x64 (1 unstable [amd64]) +Conf libc6 (1 unstable [amd64]) +Conf depender-x64 (1 unstable [amd64])' aptget install depender-x64:amd64 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libc6 +The following NEW packages will be installed: + depender-x64:i386 libc6 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 (1 unstable [amd64]) +Inst depender-x64:i386 (1 unstable [i386]) +Conf libc6 (1 unstable [amd64]) +Conf depender-x64:i386 (1 unstable [i386])' aptget install depender-x64:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold:i386 libold +The following NEW packages will be installed: + breaker +0 upgraded, 1 newly installed, 2 to remove and 0 not upgraded. +Remv libold:i386 [1] +Remv libold [1] +Inst breaker (1 unstable [all]) +Conf breaker (1 unstable [all])' aptget install breaker -s + +testsuccessequal '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:amd64 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold:i386 +The following NEW packages will be installed: + breaker-x32:i386 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libold:i386 [1] +Inst breaker-x32:i386 (1 unstable [i386]) +Conf breaker-x32:i386 (1 unstable [i386])' aptget install breaker-x32:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold +The following NEW packages will be installed: + breaker-x64 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libold [1] +Inst breaker-x64 (1 unstable [amd64]) +Conf breaker-x64 (1 unstable [amd64])' aptget install breaker-x64:amd64 -s + +testsuccessequal '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:i386 -s + +testsuccessequal '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 + +testsuccessequal '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 + +testsuccessequal '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 + +testsuccessequal '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 + +testfailureequal '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 + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-native-depender +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo-native-depender (1 unstable [amd64]) +Conf foo-native-depender (1 unstable [amd64])' aptget install foo-native-depender -s + +testsuccessequal '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 + +testsuccessequal '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 + +testsuccessequal '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 + +testsuccessequal '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 + +testsuccessequal '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 + +msgmsg 'switch to single architecture' +configarchitecture 'amd64' + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libc6 +The following NEW packages will be installed: + depender-x64 libc6 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libc6 (1 unstable [amd64]) +Inst depender-x64 (1 unstable [amd64]) +Conf libc6 (1 unstable [amd64]) +Conf depender-x64 (1 unstable [amd64])' aptget install depender-x64 -s + +testfailureequal 'Reading package lists... +Building dependency tree... +E: Unable to locate package depender-x64:i386' aptget install depender-x64:i386 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + foo-native-depender +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst foo-native-depender (1 unstable [amd64]) +Conf foo-native-depender (1 unstable [amd64])' aptget install foo-native-depender -s + +testsuccessequal '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:amd64 -s + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + libold +The following NEW packages will be installed: + breaker-x64 +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv libold [1] +Inst breaker-x64 (1 unstable [amd64]) +Conf breaker-x64 (1 unstable [amd64])' aptget install breaker-x64:amd64 -s + +testfailureequal '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: + depender-x32 : Depends: libc6:i386 but it is not installable +E: Unable to correct problems, you have held broken packages.' aptget install depender-x32 -s diff --git a/test/integration/test-srcrecord b/test/integration/test-srcrecord new file mode 100755 index 0000000..34de2be --- /dev/null +++ b/test/integration/test-srcrecord @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +cat > aptarchive/Sources <<EOF +Package: space-before-comma +Binary: space-before-comma1 , space-before-comma2 +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all + +Package: broken-field +Binary:, broken-field2 +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all + +Package: broken-field-b +Binary: , broken-field-b2 +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +EOF + +setupaptarchive --no-update + +testsuccess aptget update +testsuccess aptcache showsrc space-before-comma1 +testsuccess aptcache showsrc broken-field2 +testsuccess aptcache showsrc broken-field-b2 diff --git a/test/integration/test-suggest-installed-multiarch-silbing b/test/integration/test-suggest-installed-multiarch-silbing new file mode 100755 index 0000000..4918217 --- /dev/null +++ b/test/integration/test-suggest-installed-multiarch-silbing @@ -0,0 +1,79 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' 'armel' + +insertinstalledpackage 'foo' 'i386' '1' +insertpackage 'unstable' 'foo' 'amd64,i386' '1' + +insertpackage 'unstable,installed' 'foo2' 'i386' '1' + +insertinstalledpackage 'foo3' 'amd64' '1' +insertpackage 'unstable' 'foo3' 'amd64,i386' '1' + +insertinstalledpackage 'samefoo' 'i386,amd64' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'samefoo' 'amd64,i386,armel' '1' 'Multi-Arch: same' + +insertinstalledpackage 'samefoo2' 'i386' '1' 'Multi-Arch: same' +insertpackage 'unstable' 'samefoo2' 'amd64,i386,armel' '1' 'Multi-Arch: same' + +insertinstalledpackage 'mozplugger' 'i386' '1' 'Depends: iceweasel | fireweasel' +insertinstalledpackage 'fireweasel' 'i386' '1' +insertpackage 'unstable' 'mozplugger' 'i386,amd64' '1' 'Depends: iceweasel | fireweasel' + +setupaptarchive + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'foo' is not installed, so not removed. Did you mean 'foo:i386'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove foo -s + +testsuccessequal "Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + foo2:i386 +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv foo2:i386 [1]" aptget remove foo2 -s + +testsuccessequal "Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + foo3 +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv foo3 [1]" aptget remove foo3 -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'foo3:i386' is not installed, so not removed. Did you mean 'foo3'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove foo3:i386 -s + +testequalor2 "Reading package lists... +Building dependency tree... +Package 'samefoo:armel' is not installed, so not removed. Did you mean 'samefoo'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." "Reading package lists... +Building dependency tree... +Package 'samefoo:armel' is not installed, so not removed. Did you mean 'samefoo:i386'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove samefoo:armel -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'samefoo2' is not installed, so not removed. Did you mean 'samefoo2:i386'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove samefoo2 -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'samefoo2:armel' is not installed, so not removed. Did you mean 'samefoo2:i386'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove samefoo2:armel -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'iceweasel' is not installed, so not removed +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove iceweasel -s + +testsuccessequal "Reading package lists... +Building dependency tree... +Package 'fireweasel' is not installed, so not removed. Did you mean 'fireweasel:i386'? +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget remove fireweasel:amd64 -s diff --git a/test/integration/test-ubuntu-bug-1078697-missing-source-hashes b/test/integration/test-ubuntu-bug-1078697-missing-source-hashes new file mode 100755 index 0000000..0b9103f --- /dev/null +++ b/test/integration/test-ubuntu-bug-1078697-missing-source-hashes @@ -0,0 +1,38 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +confighashes 'MD5' 'SHA1' 'SHA256' 'SHA512' + +msgtest 'Test apt-ftparchive source with missing hashes in .dsc' + +touch aptarchive/foo_1.0.tar.gz +cat > aptarchive/foo_1.0.dsc << EOF +Format: 3.0 (native) +Source: foo +Binary: foo +Architecture: all +Version: 1.0 +Package-List: + foo deb admin extra +Files: + d41d8cd98f00b204e9800998ecf8427e 0 foo_1.0.tar.gz +EOF + +# check for the SHA hashes +testsuccess aptftparchive sources aptarchive/ +cp rootdir/tmp/testsuccess.output aptarchive/Sources +testsuccess grep Checksums-Sha512 aptarchive/Sources + +for hash in sha512sum sha256sum sha1sum; do + for f in foo_1.0.tar.gz foo_1.0.dsc; do + SUM=$($hash aptarchive/$f | cut -d' ' -f1) + NEEDLE="$SUM $(stat -c%s aptarchive/$f) $f" + testsuccess test -n "$SUM" + msgtest "Test $hash hash matches for $f" + testsuccess --nomsg grep "$NEEDLE" aptarchive/Sources + done +done diff --git a/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum b/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum new file mode 100755 index 0000000..f0a8835 --- /dev/null +++ b/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum @@ -0,0 +1,444 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +cat > aptarchive/Sources <<EOF +Package: pkg-md5-ok +Binary: pkg-md5-ok +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-ok_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-ok_1.0.tar.gz + +Package: pkg-sha1-ok +Binary: pkg-sha1-ok +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha1-ok_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha1-ok_1.0.tar.gz + +Package: pkg-sha256-ok +Binary: pkg-sha256-ok +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 9604ba9427a280db542279d9ed78400b 3 pkg-sha256-ok_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-ok_1.0.tar.gz +Checksums-Sha1: + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-ok_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-ok_1.0.tar.gz +Checksums-Sha256: + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-sha256-ok_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-sha256-ok_1.0.tar.gz + +Package: pkg-size-bad +Binary: pkg-size-bad +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Checksums-Sha256: + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 2 pkg-size-bad_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 4 pkg-size-bad_1.0.tar.gz + +Package: pkg-sha256-bad +Binary: pkg-sha256-bad +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 9604ba9427a280db542279d9ed78400b 3 pkg-sha256-bad_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-bad_1.0.tar.gz +Checksums-Sha1: + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-bad_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-bad_1.0.tar.gz +Checksums-Sha256: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-sha256-bad_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-sha256-bad_1.0.tar.gz + +Package: pkg-md5-bad +Binary: pkg-md5-bad +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-md5-bad_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-md5-bad_1.0.tar.gz + +Package: pkg-no-md5 +Binary: pkg-no-md5 +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Checksums-Sha1: + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-no-md5_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-no-md5_1.0.tar.gz +Checksums-Sha256: + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-no-md5_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-no-md5_1.0.tar.gz + +Package: pkg-mixed-ok +Binary: pkg-mixed-ok +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Checksums-Sha1: + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-mixed-ok_1.0.tar.gz +Checksums-Sha256: + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-mixed-ok_1.0.dsc + +Package: pkg-mixed-sha1-bad +Binary: pkg-mixed-sha1-bad +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Checksums-Sha1: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-mixed-sha1-bad_1.0.dsc +Checksums-Sha256: + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-mixed-sha1-bad_1.0.tar.gz + +Package: pkg-mixed-sha2-bad +Binary: pkg-mixed-sha2-bad +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Checksums-Sha1: + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-mixed-sha2-bad_1.0.dsc +Checksums-Sha256: + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-mixed-sha2-bad_1.0.tar.gz + +Package: pkg-md5-disagree +Binary: pkg-md5-disagree +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-disagree_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-disagree_1.0.tar.gz + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-md5-disagree_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-md5-disagree_1.0.tar.gz + +Package: pkg-md5-agree +Binary: pkg-md5-agree +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-agree_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-agree_1.0.tar.gz + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-agree_1.0.tar.gz + 9604ba9427a280db542279d9ed78400b 3 pkg-md5-agree_1.0.dsc + +Package: pkg-sha256-disagree +Binary: pkg-sha256-disagree +Version: 1.0 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: all +Files: + 9604ba9427a280db542279d9ed78400b 3 pkg-sha256-disagree_1.0.dsc + db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-disagree_1.0.tar.gz +Checksums-Sha1: + 324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-disagree_1.0.dsc + 680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-disagree_1.0.tar.gz +Checksums-Sha256: + 943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-sha256-disagree_1.0.dsc + 90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-sha256-disagree_1.0.tar.gz + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-sha256-disagree_1.0.dsc + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-sha256-disagree_1.0.tar.gz +EOF + +# create fetchable files +for x in 'pkg-md5-ok' 'pkg-sha1-ok' 'pkg-sha256-ok' 'pkg-sha256-bad' 'pkg-no-md5' \ + 'pkg-mixed-ok' 'pkg-mixed-sha1-bad' 'pkg-mixed-sha2-bad' \ + 'pkg-md5-agree' 'pkg-md5-disagree' 'pkg-sha256-disagree' \ + 'pkg-md5-bad' 'pkg-size-bad'; do + echo -n 'dsc' > aptarchive/${x}_1.0.dsc + echo -n 'tar' > aptarchive/${x}_1.0.tar.gz +done + +setupaptarchive --no-update +changetowebserver +testsuccess aptget update + +cd downloaded + +testok() { + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz + testsuccessequal "Reading package lists... +Need to get 6 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) [3 B] +Get:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) [3 B] +Download complete and in download only mode" aptget source -d "$@" + msgtest 'Files were successfully downloaded for' "$1" + testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz +} + +testkeep() { + echo -n 'dsc' > ${1}_1.0.dsc + echo -n 'tar' > ${1}_1.0.tar.gz + testsuccessequal "Reading package lists... +Skipping already downloaded file '${1}_1.0.dsc' +Skipping already downloaded file '${1}_1.0.tar.gz' +Need to get 0 B of source archives. +Download complete and in download only mode" aptget source -d "$@" + msgtest 'Files already downloaded are kept for' "$1" + testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz +} + +testnohash() { + #FIXME: Maybe we should fail in this case instead of skipping + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz + testsuccessequal "Reading package lists... +Skipping download of file '${1}_1.0.dsc' as requested hashsum is not available for authentication +Skipping download of file '${1}_1.0.tar.gz' as requested hashsum is not available for authentication +Need to get 0 B of source archives. +Download complete and in download only mode" aptget source -d "$@" + msgtest 'Files are not downloaded for' "$1" + testfailure --nomsg test -e ${1}_1.0.dsc -o -e ${1}_1.0.tar.gz +} + +testmismatch() { + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz + local FAILURE + if [ "$1" = 'pkg-size-bad' ]; then + FAILURE="Reading package lists... +Need to get 6 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) [2 B] +Err:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) + File has unexpected size (3 != 2). Mirror sync in progress? + Hashes of expected file: + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - Filesize:2 [weak] +Get:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) [4 B] +Err:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) + File has unexpected size (3 != 4). Mirror sync in progress? + Hashes of expected file: + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - Filesize:4 [weak] +E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc File has unexpected size (3 != 2). Mirror sync in progress? + Hashes of expected file: + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - Filesize:2 [weak] +E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz File has unexpected size (3 != 4). Mirror sync in progress? + Hashes of expected file: + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - Filesize:4 [weak] +E: Failed to fetch some archives." + elif [ "$1" = 'pkg-md5-bad' ]; then + FAILURE="Reading package lists... +Need to get 6 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) [3 B] +Err:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) + Hash Sum mismatch + Hashes of expected file: + - MD5Sum:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [weak] + - Filesize:3 [weak] + Hashes of received file: + - SHA512:e52b7bb395ea3f46974f1f65b7c5975839aad32d4e2ec0f458f735d5aa24d2bf36d7816ed1e01dc3c493e11879e9a8f66dfca42821608cfe993996929a6be18a + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44 [weak] + - MD5Sum:9604ba9427a280db542279d9ed78400b [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc") +Get:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) [3 B] +Err:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) + Hash Sum mismatch + Hashes of expected file: + - MD5Sum:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb [weak] + - Filesize:3 [weak] + Hashes of received file: + - SHA512:5aa4cad81553320574eb72ee92bd45a1f0575528e257749dff298b2a33df9e7fc7f5c1c87fc1c8fde230f1234cca3a99bf8625a0ff7bb3238eb7e5473f9b43c0 + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a [weak] + - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6 [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz") +E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc Hash Sum mismatch + Hashes of expected file: + - MD5Sum:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [weak] + - Filesize:3 [weak] + Hashes of received file: + - SHA512:e52b7bb395ea3f46974f1f65b7c5975839aad32d4e2ec0f458f735d5aa24d2bf36d7816ed1e01dc3c493e11879e9a8f66dfca42821608cfe993996929a6be18a + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44 [weak] + - MD5Sum:9604ba9427a280db542279d9ed78400b [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc") +E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz Hash Sum mismatch + Hashes of expected file: + - MD5Sum:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb [weak] + - Filesize:3 [weak] + Hashes of received file: + - SHA512:5aa4cad81553320574eb72ee92bd45a1f0575528e257749dff298b2a33df9e7fc7f5c1c87fc1c8fde230f1234cca3a99bf8625a0ff7bb3238eb7e5473f9b43c0 + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a [weak] + - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6 [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz") +E: Failed to fetch some archives." + else + FAILURE="Reading package lists... +Need to get 6 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) [3 B] +Err:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) + Hash Sum mismatch + Hashes of expected file: + - SHA256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + - Filesize:3 [weak] + - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44 [weak] + - MD5Sum:9604ba9427a280db542279d9ed78400b [weak] + Hashes of received file: + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44 [weak] + - MD5Sum:9604ba9427a280db542279d9ed78400b [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc") +Get:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) [3 B] +Err:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) + Hash Sum mismatch + Hashes of expected file: + - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + - Filesize:3 [weak] + - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a [weak] + - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6 [weak] + Hashes of received file: + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a [weak] + - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6 [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz") +E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc Hash Sum mismatch + Hashes of expected file: + - SHA256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + - Filesize:3 [weak] + - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44 [weak] + - MD5Sum:9604ba9427a280db542279d9ed78400b [weak] + Hashes of received file: + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44 [weak] + - MD5Sum:9604ba9427a280db542279d9ed78400b [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc") +E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz Hash Sum mismatch + Hashes of expected file: + - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + - Filesize:3 [weak] + - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a [weak] + - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6 [weak] + Hashes of received file: + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a [weak] + - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6 [weak] + - Filesize:3 [weak] + Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz") +E: Failed to fetch some archives." + fi + testfailureequal "$FAILURE" aptget source -d "$@" + msgtest 'Files were not download as they have hashsum mismatches for' "$1" + testfailure --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz + + if [ "$2" != '--allow-unauthenticated' ]; then + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz + testsuccessequal "Reading package lists... +Skipping download of file '${1}_1.0.dsc' as requested hashsum is not available for authentication +Skipping download of file '${1}_1.0.tar.gz' as requested hashsum is not available for authentication +Need to get 0 B of source archives. +Download complete and in download only mode" aptget source -d "$@" -o Acquire::ForceHash=ROT26 + msgtest 'Files were not download as hash is unavailable for' "$1" + testfailure --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz + fi + + if [ "$1" != 'pkg-size-bad' ]; then + rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz + testsuccessequal "Reading package lists... +Need to get 6 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) [3 B] +Get:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) [3 B] +Download complete and in download only mode" aptget source --allow-unauthenticated -d "$@" -o Acquire::ForceHash=ROT26 + msgtest 'Files were downloaded unauthenticated as user allowed it' "$1" + testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz + fi +} + +testnohash pkg-md5-ok +testnohash pkg-sha1-ok +testok pkg-sha256-ok +testkeep pkg-sha256-ok + +# pkg-sha256-bad has a bad SHA sum, but good MD5 sum. If apt is +# checking the best available hash (as it should), this will trigger +# a hash mismatch. +testmismatch pkg-sha256-bad +testok pkg-sha256-bad -o Acquire::ForceHash=MD5Sum + +testnohash pkg-md5-bad +testmismatch pkg-md5-bad --allow-unauthenticated + +testmismatch pkg-size-bad + +# not having MD5 sum doesn't mean the file doesn't exist at all … +testok pkg-no-md5 +testok pkg-no-md5 -o Acquire::ForceHash=SHA256 +testsuccessequal "Reading package lists... +Skipping download of file 'pkg-no-md5_1.0.dsc' as requested hashsum is not available for authentication +Skipping download of file 'pkg-no-md5_1.0.tar.gz' as requested hashsum is not available for authentication +Need to get 0 B of source archives. +Download complete and in download only mode" aptget source -d pkg-no-md5 -o Acquire::ForceHash=MD5Sum +msgtest 'Files were not download as MD5 is not available for this package' 'pkg-no-md5' +testfailure --nomsg test -e pkg-no-md5_1.0.dsc -a -e pkg-no-md5_1.0.tar.gz + +# deal with cases in which we haven't for all files the same checksum type +# mostly pathologic as this shouldn't happen, but just to be sure +testsuccessequal "Reading package lists... +Skipping download of file 'pkg-mixed-ok_1.0.tar.gz' as requested hashsum is not available for authentication +Need to get 3 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} pkg-mixed-ok 1.0 (dsc) [3 B] +Download complete and in download only mode" aptget source -d pkg-mixed-ok + +testsuccessequal "Reading package lists... +Skipping download of file 'pkg-mixed-sha1-bad_1.0.dsc' as requested hashsum is not available for authentication +Need to get 3 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} pkg-mixed-sha1-bad 1.0 (tar) [3 B] +Download complete and in download only mode" aptget source -d pkg-mixed-sha1-bad +msgtest 'Only tar file is downloaded as the dsc has hashsum mismatch' 'pkg-mixed-sha1-bad' +testsuccess --nomsg test ! -e pkg-mixed-sha1-bad_1.0.dsc -a -e pkg-mixed-sha1-bad_1.0.tar.gz +testfailureequal "Reading package lists... +Skipping download of file 'pkg-mixed-sha2-bad_1.0.dsc' as requested hashsum is not available for authentication +Need to get 3 B of source archives. +Get:1 http://localhost:${APTHTTPPORT} pkg-mixed-sha2-bad 1.0 (tar) [3 B] +Err:1 http://localhost:${APTHTTPPORT} pkg-mixed-sha2-bad 1.0 (tar) + Hash Sum mismatch + Hashes of expected file: + - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + - Filesize:3 [weak] + Hashes of received file: + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - Filesize:3 [weak] + Last modification reported: $(lastmodification 'aptarchive/pkg-mixed-sha2-bad_1.0.tar.gz') +E: Failed to fetch http://localhost:${APTHTTPPORT}/pkg-mixed-sha2-bad_1.0.tar.gz Hash Sum mismatch + Hashes of expected file: + - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + - Filesize:3 [weak] + Hashes of received file: + - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb + - Filesize:3 [weak] + Last modification reported: $(lastmodification 'aptarchive/pkg-mixed-sha2-bad_1.0.tar.gz') +E: Failed to fetch some archives." aptget source -d pkg-mixed-sha2-bad + +# it gets even more pathologic: multiple entries for one file, some even disagreeing! +testnohash pkg-md5-agree +testfailureequal 'Reading package lists... +E: Error parsing checksum in Files of source package pkg-md5-disagree' aptget source -d pkg-md5-disagree +testfailureequal 'Reading package lists... +E: Error parsing checksum in Checksums-SHA256 of source package pkg-sha256-disagree' aptget source -d pkg-sha256-disagree diff --git a/test/integration/test-ubuntu-bug-1130419-prefer-installed-ma-same-siblings b/test/integration/test-ubuntu-bug-1130419-prefer-installed-ma-same-siblings new file mode 100755 index 0000000..4ac5e90 --- /dev/null +++ b/test/integration/test-ubuntu-bug-1130419-prefer-installed-ma-same-siblings @@ -0,0 +1,104 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'stable' 'libmesa' 'amd64,i386' '1' 'Multi-Arch: same' +insertpackage 'stable' 'libmesa-lts' 'amd64,i386' '1' 'Provides: libmesa +Conflicts: libmesa +Multi-Arch: same' +insertpackage 'stable' 'steam' 'i386' '1' 'Depends: libmesa' + +insertpackage 'unstable' 'libmesa' 'amd64,i386' '2' 'Multi-Arch: same' +insertpackage 'unstable' 'libmesa-lts' 'amd64,i386' '2' 'Provides: libmesa +Conflicts: libmesa +Multi-Arch: same' +insertpackage 'unstable' 'steam' 'i386' '2' 'Depends: libmesa' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libmesa:i386 +The following NEW packages will be installed: + libmesa:i386 steam:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libmesa:i386 (1 stable [i386]) +Inst steam:i386 (1 stable [i386]) +Conf libmesa:i386 (1 stable [i386]) +Conf steam:i386 (1 stable [i386])' aptget install steam -st stable +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libmesa:i386 +The following NEW packages will be installed: + libmesa:i386 steam:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libmesa:i386 (2 unstable [i386]) +Inst steam:i386 (2 unstable [i386]) +Conf libmesa:i386 (2 unstable [i386]) +Conf steam:i386 (2 unstable [i386])' aptget install steam -st unstable + +cp rootdir/var/lib/dpkg/status default-status.dpkg +insertinstalledpackage 'libmesa' 'amd64' '1' 'Multi-Arch: same' +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libmesa:i386 +The following NEW packages will be installed: + libmesa:i386 steam:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libmesa:i386 (1 stable [i386]) +Inst steam:i386 (1 stable [i386]) +Conf libmesa:i386 (1 stable [i386]) +Conf steam:i386 (1 stable [i386])' aptget install steam -st stable +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libmesa libmesa:i386 +The following NEW packages will be installed: + libmesa:i386 steam:i386 +The following packages will be upgraded: + libmesa +1 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libmesa [1] (2 unstable [amd64]) +Inst libmesa:i386 (2 unstable [i386]) +Inst steam:i386 (2 unstable [i386]) +Conf libmesa (2 unstable [amd64]) +Conf libmesa:i386 (2 unstable [i386]) +Conf steam:i386 (2 unstable [i386])' aptget install steam -st unstable + +cp default-status.dpkg rootdir/var/lib/dpkg/status +insertinstalledpackage 'libmesa-lts' 'amd64' '1' 'Provides: libmesa +Conflicts: libmesa +Multi-Arch: same' +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libmesa-lts:i386 +The following NEW packages will be installed: + libmesa-lts:i386 steam:i386 +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libmesa-lts:i386 (1 stable [i386]) +Inst steam:i386 (1 stable [i386]) +Conf libmesa-lts:i386 (1 stable [i386]) +Conf steam:i386 (1 stable [i386])' aptget install steam -st stable +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libmesa-lts libmesa-lts:i386 +The following NEW packages will be installed: + libmesa-lts:i386 steam:i386 +The following packages will be upgraded: + libmesa-lts +1 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst libmesa-lts [1] (2 unstable [amd64]) +Inst libmesa-lts:i386 (2 unstable [i386]) +Inst steam:i386 (2 unstable [i386]) +Conf libmesa-lts (2 unstable [amd64]) +Conf libmesa-lts:i386 (2 unstable [i386]) +Conf steam:i386 (2 unstable [i386])' aptget install steam -st unstable diff --git a/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard b/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard new file mode 100755 index 0000000..82e1d61 --- /dev/null +++ b/test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard @@ -0,0 +1,50 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +# Regression test for LP: #1304403 +# +# The issue here is that libkadm5srv-mit8 (priority standard) is replaced +# by a new libkadm5srv-mit9 and libkbd5-7 breaks on the old -mit8 package. +# The -mit8 package is no longer downloadable (and hence not upgradeable) + +# normal upradable pkg +# (libkdb5-7 that breaks on libkadm5srv-mit8 (<< 1.11+dfsg~) +insertinstalledpackage 'upgradable' 'all' '1.0' '' 'extra' +insertpackage 'unstable' 'upgradable' 'all' '2.0' 'Breaks: not-downloadable (<< 1.1)' 'optional' + +# no longer downloadable pkg (libkadm5srv-mit8, replaced by libkadm5srv-mit9) +# but priority standard pushes it higher +insertinstalledpackage 'not-downloadable' 'all' '1.0' '' 'standard' + +setupaptarchive + +# discourage keeping obsolete high-priority packages … +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be REMOVED: + not-downloadable +The following packages will be upgraded: + upgradable +1 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv not-downloadable [1.0] +Inst upgradable [1.0] (2.0 unstable [all]) +Conf upgradable (2.0 unstable [all])' aptget -s dist-upgrade + +# … but if it has dependencies we want to keep it as usual +for i in $(seq 1 10); do +insertinstalledpackage "depender$i" 'all' '1.0' 'Depends: not-downloadable' +done + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages have been kept back: + upgradable +0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.' aptget -s dist-upgrade diff --git a/test/integration/test-ubuntu-bug-1549819-empty-arch-list b/test/integration/test-ubuntu-bug-1549819-empty-arch-list new file mode 100755 index 0000000..5e1c6ce --- /dev/null +++ b/test/integration/test-ubuntu-bug-1549819-empty-arch-list @@ -0,0 +1,13 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "" +echo 'APT::Architecture "";' > rootdir/etc/apt/apt.conf +echo 'APT::Architectures:: "";' >> rootdir/etc/apt/apt.conf +setupaptarchive + +# test success +testsuccess aptcache -c rootdir/etc/apt/apt.conf gencaches -o debug::NoLocking=1 diff --git a/test/integration/test-ubuntu-bug-1651923-requote-https-uri b/test/integration/test-ubuntu-bug-1651923-requote-https-uri new file mode 100755 index 0000000..cf56a6a --- /dev/null +++ b/test/integration/test-ubuntu-bug-1651923-requote-https-uri @@ -0,0 +1,19 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" + +mkdir "aptarchive/target with space" +echo 'alright' > "aptarchive/target with space/working" +changetohttpswebserver +webserverconfig 'aptwebserver::redirect::replace::/targetwithoutspace/' '/target%20with%20space/' +webserverconfig 'aptwebserver::redirect::replace::/targetwithoutspace2/' '/target with space/' + +testsuccess downloadfile "http://localhost:${APTHTTPPORT}/targetwithoutspace/working" httpfile1 +testsuccess downloadfile "http://localhost:${APTHTTPPORT}/targetwithoutspace2/working" httpfile2 +testsuccess downloadfile "https://localhost:${APTHTTPSPORT}/targetwithoutspace/working" httpsfile1 +testsuccess downloadfile "https://localhost:${APTHTTPSPORT}/targetwithoutspace2/working" httpsfile2 diff --git a/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall b/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall new file mode 100755 index 0000000..5f2109d --- /dev/null +++ b/test/integration/test-ubuntu-bug-346386-apt-get-update-paywall @@ -0,0 +1,102 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'native' + +insertpackage 'unstable' 'unrelated' 'all' '1.0' 'stable' +insertsource 'unstable' 'unrelated' 'all' '1.0' 'stable' + +echo 'ni ni ni' > aptarchive/knights + +setupaptarchive +changetowebserver -o 'aptwebserver::overwrite::.*InRelease::filename=/knights' -o 'aptwebserver::overwrite::.*::filename=/knights' + +msgtest 'Acquire test file from the webserver to check' 'overwrite' +if downloadfile http://localhost:${APTHTTPPORT}/holygrail ./knights-talking >/dev/null; then + msgpass +else + msgfail +fi + +testfileequal knights-talking 'ni ni ni' + +ensure_n_canary_strings_in_dir() { + local DIR="$1" + local CANARY_STRING="$2" + local EXPECTED_N="$3" + + msgtest "Testing in $DIR for $EXPECTED_N canary" "$CANARY_STRING" + local N=$(grep "$CANARY_STRING" $DIR/* 2>/dev/null |wc -l ) + test "$N" = "$EXPECTED_N" && msgpass || msgfail "Expected $EXPECTED_N canaries, got $N" +} + +runtests() { + LISTS='rootdir/var/lib/apt/lists' + rm -rf "$LISTS" + testfailure aptget update + testsuccess grep "$1" rootdir/tmp/testfailure.output + + ensure_n_canary_strings_in_dir "$LISTS" 'ni ni ni' 0 + testequal 'auxfiles +lock +partial' ls "$LISTS" + + # and again with pre-existing files with "valid data" which should remain + for f in Release Release.gpg main_binary-amd64_Packages main_source_Sources; do + echo 'peng neee-wom' > "$LISTS/localhost:${APTHTTPPORT}_dists_stable_${f}" + chmod 644 "$LISTS/localhost:${APTHTTPPORT}_dists_stable_${f}" + done + + testfailure aptget update + testsuccess grep "$1" rootdir/tmp/testfailure.output + + ensure_n_canary_strings_in_dir "$LISTS" 'peng neee-wom' 4 + ensure_n_canary_strings_in_dir "$LISTS" 'ni ni ni' 0 + + # and now with a pre-existing InRelease file + echo 'peng neee-wom' > "$LISTS/localhost:${APTHTTPPORT}_dists_stable_InRelease" + chmod 644 "$LISTS/localhost:${APTHTTPPORT}_dists_stable_InRelease" + rm -f "$LISTS/localhost:${APTHTTPPORT}_dists_stable_Release" "$LISTS/localhost:${APTHTTPPORT}_dists_stable_Release.gpg" + msgtest 'excpected failure of' 'apt-get update' + testfailure aptget update + testsuccess grep "$1" rootdir/tmp/testfailure.output + + ensure_n_canary_strings_in_dir "$LISTS" 'peng neee-wom' 3 + ensure_n_canary_strings_in_dir "$LISTS" 'ni ni ni' 0 +} +runtests '^E:.*Clearsigned file .*NOSPLIT.*' +webserverconfig 'aptwebserver::overwrite::.*InRelease::filename' '/404' +runtests '^E:.*Signed file .*NODATA.*' + +webserverconfig 'aptwebserver::overwrite::.*::filename' '/404' +webserverconfig 'aptwebserver::httpcode::404' '511 Network Authentication Required' +rm -rf rootdir/var/lib/apt/lists +testfailureequal "Err:1 http://localhost:${APTHTTPPORT} unstable InRelease + 511 Network Authentication Required +Reading package lists... +E: Failed to fetch http://localhost:${APTHTTPPORT}/dists/unstable/InRelease 511 Network Authentication Required +E: The repository 'http://localhost:${APTHTTPPORT} unstable InRelease' is not signed. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update + +# on S3 all files get a 403. If we accept unsigned, lets be liberal in non-existence acceptance +webserverconfig 'aptwebserver::httpcode::404' '403 Forbidden' +rm -rf rootdir/var/lib/apt/lists +testfailureequal "Err:1 http://localhost:${APTHTTPPORT} unstable InRelease + 403 Forbidden +Reading package lists... +E: Failed to fetch http://localhost:${APTHTTPPORT}/dists/unstable/InRelease 403 Forbidden +E: The repository 'http://localhost:${APTHTTPPORT} unstable InRelease' is not signed. +N: Updating from such a repository can't be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details." apt update + +sed -i 's#^deb\(-src\)\? #deb\1 [allow-insecure=yes] #' rootdir/etc/apt/sources.list.d/* +testfailure apt update +testequal "Ign:1 http://localhost:${APTHTTPPORT} unstable InRelease + 403 Forbidden +Ign:2 http://localhost:${APTHTTPPORT} unstable Release + 403 Forbidden" head -n 4 rootdir/tmp/testfailure.output diff --git a/test/integration/test-ubuntu-bug-365611-long-package-names b/test/integration/test-ubuntu-bug-365611-long-package-names new file mode 100755 index 0000000..53e3ea8 --- /dev/null +++ b/test/integration/test-ubuntu-bug-365611-long-package-names @@ -0,0 +1,15 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' +setupaptarchive + +aptget install $(for i in $(seq 0 1000); do echo -n 'a'; done) 2> longpackagename.log > /dev/null || true +testfileequal 'longpackagename.log' "E: Unable to locate package $(for i in $(seq 0 1000); do echo -n 'a'; done)" + +# … and the opposite of long: +aptget install "" -s >longpackagename.log 2>&1 || true +testfileequal 'longpackagename.log' "$(aptget install -s)" diff --git a/test/integration/test-ubuntu-bug-614993 b/test/integration/test-ubuntu-bug-614993 new file mode 100755 index 0000000..e7357bc --- /dev/null +++ b/test/integration/test-ubuntu-bug-614993 @@ -0,0 +1,59 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "amd64" +setupaptarchive + +# test success +UPGRADE="Reading package lists... +Building dependency tree... +The following additional packages will be installed: + libdrm-intel1 libdrm-nouveau1 libmtdev1 libutouch-grail1 libx11-xcb1 + libxcb-aux0 libxcb-dri2-0 libxfont1 xserver-common xserver-xorg-core + xserver-xorg-input-evdev xserver-xorg-input-mouse + xserver-xorg-input-synaptics xserver-xorg-input-vmmouse + xserver-xorg-input-wacom xserver-xorg-video-all xserver-xorg-video-apm + xserver-xorg-video-ark xserver-xorg-video-ati xserver-xorg-video-chips + xserver-xorg-video-cirrus xserver-xorg-video-fbdev xserver-xorg-video-i128 + xserver-xorg-video-intel xserver-xorg-video-mach64 xserver-xorg-video-mga + xserver-xorg-video-neomagic xserver-xorg-video-nouveau xserver-xorg-video-nv + xserver-xorg-video-openchrome xserver-xorg-video-r128 + xserver-xorg-video-radeon xserver-xorg-video-rendition xserver-xorg-video-s3 + xserver-xorg-video-s3virge xserver-xorg-video-savage + xserver-xorg-video-siliconmotion xserver-xorg-video-sis + xserver-xorg-video-sisusb xserver-xorg-video-tdfx xserver-xorg-video-trident + xserver-xorg-video-tseng xserver-xorg-video-vesa xserver-xorg-video-vmware + xserver-xorg-video-voodoo +Suggested packages: + xfonts-scalable gpointing-device-settings touchfreeze firmware-linux +Recommended packages: + xauth intel-gpu-tools +The following packages will be REMOVED: + xserver-xorg-video-v4l +The following NEW packages will be installed: + libmtdev1 libutouch-grail1 libx11-xcb1 libxcb-aux0 libxcb-dri2-0 +The following packages will be upgraded: + libdrm-intel1 libdrm-nouveau1 libxfont1 xserver-common xserver-xorg + xserver-xorg-core xserver-xorg-input-evdev xserver-xorg-input-mouse + xserver-xorg-input-synaptics xserver-xorg-input-vmmouse + xserver-xorg-input-wacom xserver-xorg-video-all xserver-xorg-video-apm + xserver-xorg-video-ark xserver-xorg-video-ati xserver-xorg-video-chips + xserver-xorg-video-cirrus xserver-xorg-video-fbdev xserver-xorg-video-i128 + xserver-xorg-video-intel xserver-xorg-video-mach64 xserver-xorg-video-mga + xserver-xorg-video-neomagic xserver-xorg-video-nouveau xserver-xorg-video-nv + xserver-xorg-video-openchrome xserver-xorg-video-r128 + xserver-xorg-video-radeon xserver-xorg-video-rendition xserver-xorg-video-s3 + xserver-xorg-video-s3virge xserver-xorg-video-savage + xserver-xorg-video-siliconmotion xserver-xorg-video-sis + xserver-xorg-video-sisusb xserver-xorg-video-tdfx xserver-xorg-video-trident + xserver-xorg-video-tseng xserver-xorg-video-vesa xserver-xorg-video-vmware + xserver-xorg-video-voodoo +41 upgraded, 5 newly installed, 1 to remove and 3 not upgraded. +Need to get 0 B/5505 kB of archives. +After this operation, 2294 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation." +testfailureequal "$UPGRADE" aptget install xserver-xorg --trivial-only + diff --git a/test/integration/test-ubuntu-bug-761175-remove-purge b/test/integration/test-ubuntu-bug-761175-remove-purge new file mode 100755 index 0000000..6ae1a04 --- /dev/null +++ b/test/integration/test-ubuntu-bug-761175-remove-purge @@ -0,0 +1,88 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +buildcompizpkg() { + setupsimplenativepackage "compiz-core-$1" "$2" "$3" "$4" + BUILDDIR="incoming/compiz-core-$1-$3" + mkdir -p ${BUILDDIR}/debian/compiz-core/etc + echo 'foo=bar;' > ${BUILDDIR}/compiz.conf + echo 'compiz.conf /etc/compiz.conf' >> ${BUILDDIR}/debian/install + buildpackage "$BUILDDIR" "$4" 'main' "$2" + rm -rf "$BUILDDIR" +} +buildcompizpkg 'native' 'all' '1.0' 'stable' +buildcompizpkg 'all' 'native' '1.0' 'stable' +buildcompizpkg 'native' 'native' '2.0' 'unstable' +buildcompizpkg 'all' 'all' '2.0' 'unstable' + +setupaptarchive + +runtests() { + local PKG="$1" + local RELEASE="${2}" + shift 2 + testdpkgnotinstalled compiz-core-${PKG} + testsuccess aptget install compiz-core-${PKG} -t "${RELEASE}" "$@" + testdpkginstalled compiz-core-${PKG} + + testsuccess aptget remove compiz-core-${PKG} -y "$@" -o Debug::pkgDpkgPm=1 + testfailure grep -- '--force-remove-essential' rootdir/tmp/testsuccess.output + testsuccess aptget remove compiz-core-${PKG} -y "$@" + testdpkgnotinstalled compiz-core-${PKG} + testdpkgstatus 'rc' '1' "compiz-core-${PKG}" + + if [ -z "$1" ]; then + testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + compiz-core-${PKG}* +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Purg compiz-core-${PKG}" aptget purge compiz-core-${PKG} -s "$@" + else + # check that the rc-version isn't passed to the external resolver if its only in dpkg/status + export APT_EDSP_DUMP_FILENAME="${TMPWORKINGDIRECTORY}/dump-${PKG}.edsp" + testfailure aptget purge compiz-core-${PKG} -y "$@" -s --solver dump + testsuccessequal '2' grep -c "^Package: compiz-core-${PKG}\$" "$APT_EDSP_DUMP_FILENAME" + mv rootdir/etc/apt/sources.list.d/apt-test-stable-deb.list rootdir/etc/apt/sources.list.d/apt-test-stable-deb.disabled + testfailure aptget purge compiz-core-${PKG} -y "$@" -s --solver dump + testsuccessequal '1' grep -c "^Package: compiz-core-${PKG}\$" "$APT_EDSP_DUMP_FILENAME" + mv rootdir/etc/apt/sources.list.d/apt-test-stable-deb.disabled rootdir/etc/apt/sources.list.d/apt-test-stable-deb.list + + testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Execute external solver... +The following packages will be REMOVED: + compiz-core-${PKG}* +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Purg compiz-core-${PKG}" aptget purge compiz-core-${PKG} -s "$@" + fi + testsuccess aptget purge compiz-core-${PKG} -y "$@" -o Debug::pkgDpkgPm=1 + testfailure grep -- '--force-remove-essential' rootdir/tmp/testsuccess.output + testsuccess aptget purge compiz-core-${PKG} -y "$@" + echo -n '' > rootdir/var/lib/dpkg/available # dpkg -l < 1.16.2 reads the available file by default, where the package can be found + testequalor2 "dpkg-query: no packages found matching compiz-core-${PKG}" "No packages found matching compiz-core-${PKG}." dpkg -l compiz-core-${PKG} +} +runtestround() { + runtests 'native' 'unstable' "$@" + runtests 'all' 'unstable' "$@" + runtests 'native' 'stable' "$@" + runtests 'all' 'stable' "$@" +} +testround() { + msgmsg 'Test in multi arch environment' "$@" + configarchitecture 'amd64' 'i386' + runtestround "$@" + + msgmsg 'Test in single arch environment' "$@" + configarchitecture 'amd64' + runtestround "$@" +} +testround +testround --solver apt diff --git a/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only new file mode 100755 index 0000000..fe42ba8 --- /dev/null +++ b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only @@ -0,0 +1,36 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'apt' 'i386' '0.8.11' + +export APT_DONT_SIGN='Release.gpg' +setupaptarchive --no-update + +find aptarchive/ -name 'InRelease' -exec cp {} {}.old \; + +for RELEASE in $(find aptarchive/ -name 'InRelease'); do + (echo 'Origin: Marvin +Label: Marvin +Suite: experimental +Codename: experimental +MD5Sum: + 65fd410587b6978de2277f2912523f09 9360 Packages + d27b294ed172a1fa9dd5a53949914c5d 4076 Packages.bz2 + 2182897e0a2a0c09e760beaae117a015 2023 Packages.diff/Index + 1b895931853981ad8204d2439821b999 4144 Packages.gz'; echo; cat ${RELEASE}.old;) > ${RELEASE} +done + +testfailure aptget update +testsuccess grep '^E:.*Clearsigned file .*NOSPLIT.*' rootdir/tmp/testfailure.output + + +ROOTDIR="$(readlink -f .)" +testsuccessequal "Package files: + 100 ${ROOTDIR}/rootdir/var/lib/dpkg/status + release a=now +Pinned packages:" aptcache policy diff --git a/test/integration/test-ubuntu-bug-802901-multiarch-early-remove b/test/integration/test-ubuntu-bug-802901-multiarch-early-remove new file mode 100755 index 0000000..d9587d9 --- /dev/null +++ b/test/integration/test-ubuntu-bug-802901-multiarch-early-remove @@ -0,0 +1,24 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'libgl1-mesa-glx' 'amd64' '2.0' 'Multi-Arch: same +Provides: libgl1 +Conflicts: libgl1' +insertpackage 'unstable' 'libgl1-mesa-glx' 'i386,amd64' '2.0' 'Multi-Arch: same +Provides: libgl1 +Conflicts: libgl1' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libgl1-mesa-glx:i386 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libgl1-mesa-glx:i386 (2.0 unstable [i386]) +Conf libgl1-mesa-glx:i386 (2.0 unstable [i386])' aptget install libgl1-mesa-glx:i386 -s diff --git a/test/integration/test-ubuntu-bug-806274-install-suggests b/test/integration/test-ubuntu-bug-806274-install-suggests new file mode 100755 index 0000000..b73a6f7 --- /dev/null +++ b/test/integration/test-ubuntu-bug-806274-install-suggests @@ -0,0 +1,81 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'apt' 'i386' '0.8.15' 'Depends: foo +Recommends: bar +Suggests: baz' +insertpackage 'unstable' 'foo' 'i386' '1.0' +insertpackage 'unstable' 'bar' 'i386' '1.0' +insertpackage 'unstable' 'baz' 'i386' '1.0' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar foo +Suggested packages: + baz +The following NEW packages will be installed: + apt bar foo +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386]) +Inst bar (1.0 unstable [i386]) +Conf bar (1.0 unstable [i386])' aptget install apt -s --install-recommends --no-install-suggests + + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + bar baz foo +The following NEW packages will be installed: + apt bar baz foo +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386]) +Inst bar (1.0 unstable [i386]) +Inst baz (1.0 unstable [i386]) +Conf bar (1.0 unstable [i386]) +Conf baz (1.0 unstable [i386])' aptget install apt -s --install-recommends --install-suggests + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + foo +Suggested packages: + baz +Recommended packages: + bar +The following NEW packages will be installed: + apt foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386])' aptget install apt -s --no-install-recommends --no-install-suggests + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + baz foo +Recommended packages: + bar +The following NEW packages will be installed: + apt baz foo +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386]) +Inst baz (1.0 unstable [i386]) +Conf baz (1.0 unstable [i386])' aptget install apt -s --no-install-recommends --install-suggests diff --git a/test/integration/test-ubuntu-bug-835625-multiarch-lockstep-installed-first b/test/integration/test-ubuntu-bug-835625-multiarch-lockstep-installed-first new file mode 100755 index 0000000..5a3e276 --- /dev/null +++ b/test/integration/test-ubuntu-bug-835625-multiarch-lockstep-installed-first @@ -0,0 +1,45 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'libsame' 'i386' '1' +insertinstalledpackage 'apt' 'i386' '1' 'Depends: libsame (= 1)' + +insertpackage 'unstable' 'libsame' 'i386,amd64' '2' 'Multi-Arch: same' +insertpackage 'unstable' 'apt' 'i386' '2' 'Depends: libsame (= 2)' + +setupaptarchive + +testequalor2 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + apt:i386 libsame:i386 +The following NEW packages will be installed: + libsame +The following packages will be upgraded: + apt:i386 libsame:i386 +2 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame:i386 [1] (2 unstable [i386]) [apt:i386 ] +Inst libsame (2 unstable [amd64]) [apt:i386 ] +Conf libsame:i386 (2 unstable [i386]) [apt:i386 ] +Conf libsame (2 unstable [amd64]) [apt:i386 ] +Inst apt:i386 [1] (2 unstable [i386]) +Conf apt:i386 (2 unstable [i386])' 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + apt:i386 libsame:i386 +The following NEW packages will be installed: + libsame +The following packages will be upgraded: + apt:i386 libsame:i386 +2 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt:i386 [1] (2 unstable [i386]) [] +Inst libsame:i386 [1] (2 unstable [i386]) +Inst libsame (2 unstable [amd64]) +Conf libsame:i386 (2 unstable [i386]) +Conf libsame (2 unstable [amd64]) +Conf apt:i386 (2 unstable [i386])' aptget install libsame:amd64 -s diff --git a/test/integration/test-ubuntu-bug-859188-multiarch-reinstall b/test/integration/test-ubuntu-bug-859188-multiarch-reinstall new file mode 100755 index 0000000..5fdb98d --- /dev/null +++ b/test/integration/test-ubuntu-bug-859188-multiarch-reinstall @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' 'armel' + +buildsimplenativepackage 'libsame' 'amd64,i386,armel' '1.0' 'unstable' 'Multi-Arch: same' + +setupaptarchive + +testsuccess aptget install libsame libsame:i386 + +REINSTALL='Reading package lists... +Building dependency tree... +Reading state information... +0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded. +Inst libsame [1.0] (1.0 unstable [amd64]) +Inst libsame:i386 [1.0] (1.0 unstable [i386]) +Conf libsame (1.0 unstable [amd64]) +Conf libsame:i386 (1.0 unstable [i386])' + +testsuccessequal "$REINSTALL" aptget install --reinstall libsame -s +testsuccessequal "$REINSTALL" aptget install --reinstall libsame:amd64 -s +testsuccessequal "$REINSTALL" aptget install --reinstall libsame:i386 -s +testsuccessequal "$REINSTALL" aptget install --reinstall libsame:amd64 libsame:i386 -s diff --git a/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering b/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering new file mode 100755 index 0000000..bd5be9e --- /dev/null +++ b/test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering @@ -0,0 +1,22 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +insertinstalledpackage 'custom' 'amd64' '1.0' 'Pre-Depends: grub-pc | grub' +insertinstalledpackage 'grub' 'amd64' '1.0' +insertpackage 'unstable' 'custom' 'amd64' '2.0' 'Pre-Depends: grub-pc | grub' + +setupaptarchive + +testsuccessequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + custom +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst custom [1.0] (2.0 unstable [amd64]) +Conf custom (2.0 unstable [amd64])' aptget dist-upgrade -s diff --git a/test/integration/test-unpack-different-version-unpacked b/test/integration/test-unpack-different-version-unpacked new file mode 100755 index 0000000..bcb4836 --- /dev/null +++ b/test/integration/test-unpack-different-version-unpacked @@ -0,0 +1,121 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' 'i386' + +insertpackage 'unstable' 'libqtcore4' 'i386,amd64' '2' 'Multi-Arch: same' +setupaptarchive + +DPKGSTATUS='rootdir/var/lib/dpkg/status' +cp $DPKGSTATUS dpkg.status + +cleanstatus() { + cp dpkg.status $DPKGSTATUS + rm rootdir/var/cache/apt/*.bin +} + +#FIXME: the reported version is wrong, it should be 1, not 2 +insertinstalledpackage 'libqtcore4' 'i386,amd64' '1' 'Multi-Arch: same' '' 'install ok unpacked' +testsuccessequal 'Reading package lists... +Building dependency tree... +0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded. +2 not fully installed or removed. +Conf libqtcore4 (2 unstable [amd64]) +Conf libqtcore4:i386 (2 unstable [i386])' aptget install -s -f + +cleanstatus +insertinstalledpackage 'libqtcore4' 'amd64' '2' 'Multi-Arch: same' '' 'install ok unpacked' +insertinstalledpackage 'libqtcore4' 'i386' '1' 'Multi-Arch: same' '' 'install ok unpacked' +testsuccessequal 'Reading package lists... +Building dependency tree... +Correcting dependencies... Done +The following additional packages will be installed: + libqtcore4:i386 +The following packages will be upgraded: + libqtcore4:i386 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +2 not fully installed or removed. +Inst libqtcore4:i386 [1] (2 unstable [i386]) +Conf libqtcore4:i386 (2 unstable [i386]) +Conf libqtcore4 (2 unstable [amd64])' aptget install -s -f + +cleanstatus +insertinstalledpackage 'libqtcore4' 'i386' '2' 'Multi-Arch: same' '' 'install ok unpacked' +insertinstalledpackage 'libqtcore4' 'amd64' '1' 'Multi-Arch: same' '' 'install ok unpacked' +testsuccessequal 'Reading package lists... +Building dependency tree... +Correcting dependencies... Done +The following additional packages will be installed: + libqtcore4 +The following packages will be upgraded: + libqtcore4 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +2 not fully installed or removed. +Inst libqtcore4 [1] (2 unstable [amd64]) +Conf libqtcore4 (2 unstable [amd64]) +Conf libqtcore4:i386 (2 unstable [i386])' aptget install -s -f + +cleanstatus +insertinstalledpackage 'libqtcore4' 'amd64' '2' 'Multi-Arch: same' '' 'install ok unpacked' +insertinstalledpackage 'libqtcore4' 'i386' '1' 'Multi-Arch: same' +testsuccessequal 'Reading package lists... +Building dependency tree... +Correcting dependencies... Done +The following additional packages will be installed: + libqtcore4:i386 +The following packages will be upgraded: + libqtcore4:i386 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +1 not fully installed or removed. +Inst libqtcore4:i386 [1] (2 unstable [i386]) +Conf libqtcore4:i386 (2 unstable [i386]) +Conf libqtcore4 (2 unstable [amd64])' aptget install -s -f + +cleanstatus +insertinstalledpackage 'libqtcore4' 'i386' '2' 'Multi-Arch: same' '' 'install ok unpacked' +insertinstalledpackage 'libqtcore4' 'amd64' '1' 'Multi-Arch: same' +testsuccessequal 'Reading package lists... +Building dependency tree... +Correcting dependencies... Done +The following additional packages will be installed: + libqtcore4 +The following packages will be upgraded: + libqtcore4 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +1 not fully installed or removed. +Inst libqtcore4 [1] (2 unstable [amd64]) +Conf libqtcore4 (2 unstable [amd64]) +Conf libqtcore4:i386 (2 unstable [i386])' aptget install -s -f + +cleanstatus +insertinstalledpackage 'libqtcore4' 'amd64' '2' 'Multi-Arch: same' +insertinstalledpackage 'libqtcore4' 'i386' '1' 'Multi-Arch: same' '' 'install ok unpacked' +testsuccessequal 'Reading package lists... +Building dependency tree... +Correcting dependencies... Done +The following additional packages will be installed: + libqtcore4:i386 +The following packages will be upgraded: + libqtcore4:i386 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +1 not fully installed or removed. +Inst libqtcore4:i386 [1] (2 unstable [i386]) +Conf libqtcore4:i386 (2 unstable [i386])' aptget install -s -f + +cleanstatus +insertinstalledpackage 'libqtcore4' 'i386' '2' 'Multi-Arch: same' +insertinstalledpackage 'libqtcore4' 'amd64' '1' 'Multi-Arch: same' '' 'install ok unpacked' +testsuccessequal 'Reading package lists... +Building dependency tree... +Correcting dependencies... Done +The following additional packages will be installed: + libqtcore4 +The following packages will be upgraded: + libqtcore4 +1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +1 not fully installed or removed. +Inst libqtcore4 [1] (2 unstable [amd64]) +Conf libqtcore4 (2 unstable [amd64])' aptget install -s -f diff --git a/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages b/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages new file mode 100755 index 0000000..09953e9 --- /dev/null +++ b/test/integration/test-very-tight-loop-configure-with-unpacking-new-packages @@ -0,0 +1,63 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +# the difference between version 3 and 4 is the new package 'ure' which +# we have to unpack before we start configuring parts of the loop +insertinstalledpackage 'libreoffice' 'amd64' '3' 'Depends: libreoffice-core (= 3)' +insertinstalledpackage 'libreoffice-core' 'amd64' '3' 'Depends: libreoffice-common (>= 3)' +insertinstalledpackage 'libreoffice-common' 'all' '3' 'Depends: libreoffice-style +Breaks: libreoffice-core (>= 3+), libreoffice-core (<= 3~), libreoffice-style-galaxy (>= 3+), libreoffice-style-galaxy (<= 3~)' +insertinstalledpackage 'libreoffice-style-galaxy' 'amd64' '3' 'Depends: libreoffice-core +Provides: libreoffice-style' + +insertpackage 'sid' 'libreoffice' 'amd64' '4' 'Depends: libreoffice-core (= 4)' +insertpackage 'sid' 'libreoffice-core' 'amd64' '4' 'Depends: libreoffice-common (>= 4) +Breaks: libreoffice-common (<< 4), libreoffice-style-galaxy (<< 4)' +insertpackage 'sid' 'libreoffice-common' 'all' '4' 'Depends: libreoffice-style, ure +Breaks: libreoffice-core (>= 4+), libreoffice-core (<= 4~), libreoffice-style-galaxy (>= 4+), libreoffice-style-galaxy (<= 4~)' +insertpackage 'sid' 'libreoffice-style-galaxy' 'amd64' '4' 'Depends: libreoffice-core +Provides: libreoffice-style' +insertpackage 'sid' 'ure' 'amd64' '4' + +setupaptarchive + +testequalor2 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + ure +The following packages will be upgraded: + libreoffice libreoffice-common libreoffice-core libreoffice-style-galaxy +4 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libreoffice [3] (4 sid [amd64]) [] +Inst libreoffice-style-galaxy [3] (4 sid [amd64]) [libreoffice-common:amd64 on libreoffice-style-galaxy:amd64] [libreoffice-common:amd64 ] +Inst libreoffice-core [3] (4 sid [amd64]) [libreoffice-core:amd64 on libreoffice-common:amd64] [libreoffice-common:amd64 on libreoffice-core:amd64] [libreoffice-common:amd64 on libreoffice-style-galaxy:amd64] [libreoffice-common:amd64 ] +Inst libreoffice-common [3] (4 sid [all]) [] +Inst ure (4 sid [amd64]) +Conf libreoffice (4 sid [amd64]) +Conf libreoffice-style-galaxy (4 sid [amd64]) +Conf libreoffice-core (4 sid [amd64]) +Conf libreoffice-common (4 sid [all]) +Conf ure (4 sid [amd64])' 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following NEW packages will be installed: + ure +The following packages will be upgraded: + libreoffice libreoffice-common libreoffice-core libreoffice-style-galaxy +4 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libreoffice [3] (4 sid [amd64]) [] +Inst libreoffice-style-galaxy [3] (4 sid [amd64]) [libreoffice-common:amd64 on libreoffice-style-galaxy:amd64] [libreoffice-common:amd64 ] +Inst libreoffice-core [3] (4 sid [amd64]) [libreoffice-common:amd64 on libreoffice-core:amd64] [libreoffice-common:amd64 on libreoffice-style-galaxy:amd64] [libreoffice-core:amd64 on libreoffice-common:amd64] [libreoffice-common:amd64 ] +Inst libreoffice-common [3] (4 sid [all]) [] +Inst ure (4 sid [amd64]) +Conf libreoffice (4 sid [amd64]) +Conf libreoffice-style-galaxy (4 sid [amd64]) +Conf libreoffice-core (4 sid [amd64]) +Conf libreoffice-common (4 sid [all]) +Conf ure (4 sid [amd64])' aptget dist-upgrade -s diff --git a/test/integration/test-xorg-break-providers b/test/integration/test-xorg-break-providers new file mode 100755 index 0000000..59b564a --- /dev/null +++ b/test/integration/test-xorg-break-providers @@ -0,0 +1,45 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture "i386" +setupaptarchive + +# the new xserver-xorg-core breaks xserver-xorg-video-6 +# which both -intel (installed) and -vesa (not installed) +# provided in their old version. +# The test ensures that only -intel will be upgraded +# (together with -core of course) and -vesa not touched. + +testfailureequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + xserver-xorg-video-intel +The following packages will be upgraded: + xserver-xorg-core xserver-xorg-video-intel +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/2992 kB of archives. +After this operation, 24.6 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget install xserver-xorg-core --trivial-only + +testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + xserver-xorg-core xserver-xorg-video-intel +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/2992 kB of archives. +After this operation, 24.6 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget upgrade --trivial-only + +testfailureequal 'Reading package lists... +Building dependency tree... +Calculating upgrade... +The following packages will be upgraded: + xserver-xorg-core xserver-xorg-video-intel +2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/2992 kB of archives. +After this operation, 24.6 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only diff --git a/test/interactive-helper/CMakeLists.txt b/test/interactive-helper/CMakeLists.txt new file mode 100644 index 0000000..0de7d9c --- /dev/null +++ b/test/interactive-helper/CMakeLists.txt @@ -0,0 +1,17 @@ +add_executable(mthdcat mthdcat.cc) +target_link_libraries(mthdcat apt-pkg) +add_executable(testdeb testdeb.cc) +target_link_libraries(testdeb apt-pkg apt-inst) +add_executable(extract-control extract-control.cc) +target_link_libraries(extract-control apt-pkg apt-inst) +add_executable(aptwebserver aptwebserver.cc) +target_link_libraries(aptwebserver apt-pkg ${CMAKE_THREAD_LIBS_INIT}) +add_executable(aptdropprivs aptdropprivs.cc) +target_link_libraries(aptdropprivs apt-pkg) +add_executable(test_fileutl test_fileutl.cc) +target_link_libraries(test_fileutl apt-pkg) +add_executable(createdeb-cve-2020-27350 createdeb-cve-2020-27350.cc) + + +add_library(noprofile SHARED libnoprofile.c) +target_link_libraries(noprofile ${CMAKE_DL_LIBS}) diff --git a/test/interactive-helper/aptdropprivs.cc b/test/interactive-helper/aptdropprivs.cc new file mode 100644 index 0000000..1cc04f3 --- /dev/null +++ b/test/interactive-helper/aptdropprivs.cc @@ -0,0 +1,27 @@ +#include <config.h> + +#include <apt-pkg/cmndline.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> + +#include <unistd.h> + +int main(int const argc, const char * argv[]) +{ + CommandLine::Args Args[] = { + {'c',"config-file",0,CommandLine::ConfigFile}, + {'o',"option",0,CommandLine::ArbItem}, + {0, "user", "APT::Sandbox::User", CommandLine::HasArg}, + {0,0,0,0} + }; + + CommandLine CmdL(Args, _config); + if(CmdL.Parse(argc,argv) == false || DropPrivileges() == false) + { + _error->DumpErrors(std::cerr, GlobalError::DEBUG); + return 42; + } + + return execv(CmdL.FileList[0], const_cast<char**>(CmdL.FileList)); +} diff --git a/test/interactive-helper/aptwebserver.cc b/test/interactive-helper/aptwebserver.cc new file mode 100644 index 0000000..2243cce --- /dev/null +++ b/test/interactive-helper/aptwebserver.cc @@ -0,0 +1,1083 @@ +#include <config.h> + +#include <apt-pkg/cmndline.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/strutl.h> + +#include "teestream.h" + +#include <dirent.h> +#include <errno.h> +#include <netinet/in.h> +#include <regex.h> +#include <signal.h> +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <time.h> +#include <unistd.h> + +#include <algorithm> +#include <fstream> +#include <iostream> +#include <list> +#include <sstream> +#include <string> +#include <thread> +#include <unordered_map> +#include <vector> + +static std::string HTMLEncode(std::string encode) /*{{{*/ +{ + constexpr std::array<std::array<char const *,2>,6> htmlencode = {{ + {{ "&", "&" }}, + {{ "<", "<" }}, + {{ ">", ">" }}, + {{ "\"", """ }}, + {{ "'", "'" }}, + {{ "/", "/" }}, + }}; + for (auto &&h: htmlencode) + encode = SubstVar(encode, h[0], h[1]); + return encode; +} + /*}}}*/ +static std::string httpcodeToStr(int const httpcode) /*{{{*/ +{ + switch (httpcode) + { + // Informational 1xx + case 100: return _config->Find("aptwebserver::httpcode::100", "100 Continue"); + case 101: return _config->Find("aptwebserver::httpcode::101", "101 Switching Protocols"); + // Successful 2xx + case 200: return _config->Find("aptwebserver::httpcode::200", "200 OK"); + case 201: return _config->Find("aptwebserver::httpcode::201", "201 Created"); + case 202: return _config->Find("aptwebserver::httpcode::202", "202 Accepted"); + case 203: return _config->Find("aptwebserver::httpcode::203", "203 Non-Authoritative Information"); + case 204: return _config->Find("aptwebserver::httpcode::204", "204 No Content"); + case 205: return _config->Find("aptwebserver::httpcode::205", "205 Reset Content"); + case 206: return _config->Find("aptwebserver::httpcode::206", "206 Partial Content"); + // Redirections 3xx + case 300: return _config->Find("aptwebserver::httpcode::300", "300 Multiple Choices"); + case 301: return _config->Find("aptwebserver::httpcode::301", "301 Moved Permanently"); + case 302: return _config->Find("aptwebserver::httpcode::302", "302 Found"); + case 303: return _config->Find("aptwebserver::httpcode::303", "303 See Other"); + case 304: return _config->Find("aptwebserver::httpcode::304", "304 Not Modified"); + case 305: return _config->Find("aptwebserver::httpcode::305", "305 Use Proxy"); + case 307: return _config->Find("aptwebserver::httpcode::307", "307 Temporary Redirect"); + case 308: return _config->Find("aptwebserver::httpcode::308", "308 Permanent Redirect"); + // Client errors 4xx + case 400: return _config->Find("aptwebserver::httpcode::400", "400 Bad Request"); + case 401: return _config->Find("aptwebserver::httpcode::401", "401 Unauthorized"); + case 402: return _config->Find("aptwebserver::httpcode::402", "402 Payment Required"); + case 403: return _config->Find("aptwebserver::httpcode::403", "403 Forbidden"); + case 404: return _config->Find("aptwebserver::httpcode::404", "404 Not Found"); + case 405: return _config->Find("aptwebserver::httpcode::405", "405 Method Not Allowed"); + case 406: return _config->Find("aptwebserver::httpcode::406", "406 Not Acceptable"); + case 407: return _config->Find("aptwebserver::httpcode::407", "407 Proxy Authentication Required"); + case 408: return _config->Find("aptwebserver::httpcode::408", "408 Request Time-out"); + case 409: return _config->Find("aptwebserver::httpcode::409", "409 Conflict"); + case 410: return _config->Find("aptwebserver::httpcode::410", "410 Gone"); + case 411: return _config->Find("aptwebserver::httpcode::411", "411 Length Required"); + case 412: return _config->Find("aptwebserver::httpcode::412", "412 Precondition Failed"); + case 413: return _config->Find("aptwebserver::httpcode::413", "413 Request Entity Too Large"); + case 414: return _config->Find("aptwebserver::httpcode::414", "414 Request-URI Too Large"); + case 415: return _config->Find("aptwebserver::httpcode::415", "415 Unsupported Media Type"); + case 416: return _config->Find("aptwebserver::httpcode::416", "416 Requested range not satisfiable"); + case 417: return _config->Find("aptwebserver::httpcode::417", "417 Expectation Failed"); + case 418: return _config->Find("aptwebserver::httpcode::418", "418 I'm a teapot"); + // Server error 5xx + case 500: return _config->Find("aptwebserver::httpcode::500", "500 Internal Server Error"); + case 501: return _config->Find("aptwebserver::httpcode::501", "501 Not Implemented"); + case 502: return _config->Find("aptwebserver::httpcode::502", "502 Bad Gateway"); + case 503: return _config->Find("aptwebserver::httpcode::503", "503 Service Unavailable"); + case 504: return _config->Find("aptwebserver::httpcode::504", "504 Gateway Time-out"); + case 505: return _config->Find("aptwebserver::httpcode::505", "505 HTTP Version not supported"); + } + std::string codeconf, code; + strprintf(codeconf, "aptwebserver::httpcode::%i", httpcode); + strprintf(code, "%i Unknown HTTP code", httpcode); + return _config->Find(codeconf, code); +} + /*}}}*/ +static bool chunkedTransferEncoding(std::list<std::string> const &headers)/*{{{*/ +{ + if (std::find(headers.begin(), headers.end(), "Transfer-Encoding: chunked") != headers.end()) + return true; + if (_config->FindB("aptwebserver::chunked-transfer-encoding", false) == true) + return true; + return false; +} + /*}}}*/ +static bool contentTypeSet(std::list<std::string> const &headers) /*{{{*/ +{ + return std::any_of(headers.begin(), headers.end(), [](std::string const &h) { return APT::String::Startswith(h, "Content-Type:"); }); +} + /*}}}*/ +// contentTypeFromExtension /*{{{*/ +static std::string contentTypeFromExtension(std::string const &ext) +{ + auto t = _config->Find(std::string("aptwebserver::content-type::by-extension::").append(ext)); + if (APT::String::Startswith(t, "text/")) + return t.append("; charset=utf-8"); + return t; +} + /*}}}*/ +static void addFileHeaders(std::list<std::string> &headers, FileFd &data)/*{{{*/ +{ + if (chunkedTransferEncoding(headers) == false) + { + std::ostringstream contentlength; + contentlength << "Content-Length: " << data.FileSize(); + headers.push_back(contentlength.str()); + } + if (_config->FindB("aptwebserver::support::last-modified", true) == true) + { + std::string lastmodified("Last-Modified: "); + lastmodified.append(TimeRFC1123(data.ModificationTime(), false)); + headers.push_back(lastmodified); + } + if (_config->FindB("aptwebserver::content-type::guess", true) && + data.FileSize() != 0 && + contentTypeSet(headers) == false) + { + std::string const name = data.Name(); + std::string ext = flExtension(name); + if (name.empty() == false && ext.empty() == false && name != ext) + { + std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); + auto const type = contentTypeFromExtension(ext); + if (type.empty() == false) + headers.push_back(std::string("Content-Type: ").append(type)); + } + } +} + /*}}}*/ +static void addDataHeaders(std::list<std::string> &headers, std::string &data)/*{{{*/ +{ + if (chunkedTransferEncoding(headers) == false) + { + std::ostringstream contentlength; + contentlength << "Content-Length: " << data.size(); + headers.push_back(contentlength.str()); + } +} + /*}}}*/ +static bool sendHead(std::ostream &log, int const client, int const httpcode, std::list<std::string> &headers)/*{{{*/ +{ + std::string response("HTTP/1.1 "); + response.append(httpcodeToStr(httpcode)); + headers.push_front(response); + _config->Set("APTWebserver::Last-Status-Code", httpcode); + + std::stringstream buffer; + auto const empties = _config->FindVector("aptwebserver::empty-response-header"); + for (auto const &e: empties) + buffer << e << ":" << std::endl; + _config->Dump(buffer, "aptwebserver::response-header", "%t: %v%n", false); + std::vector<std::string> addheaders = VectorizeString(buffer.str(), '\n'); + for (std::vector<std::string>::const_iterator h = addheaders.begin(); h != addheaders.end(); ++h) + headers.push_back(*h); + + std::string date("Date: "); + date.append(TimeRFC1123(time(NULL), false)); + headers.push_back(date); + + if (chunkedTransferEncoding(headers) == true) + headers.push_back("Transfer-Encoding: chunked"); + + log << ">>> RESPONSE to " << client << " >>>" << std::endl; + bool Success = true; + for (std::list<std::string>::const_iterator h = headers.begin(); + Success == true && h != headers.end(); ++h) + { + Success &= FileFd::Write(client, h->c_str(), h->size()); + if (Success == true) + Success &= FileFd::Write(client, "\r\n", 2); + log << *h << std::endl; + } + if (Success == true) + Success &= FileFd::Write(client, "\r\n", 2); + log << "<<<<<<<<<<<<<<<<" << std::endl; + return Success; +} + /*}}}*/ +static bool sendFile(int const client, std::list<std::string> const &headers, FileFd &data)/*{{{*/ +{ + bool Success = true; + bool const chunked = chunkedTransferEncoding(headers); + char buffer[500]; + unsigned long long actual = 0; + while ((Success &= data.Read(buffer, sizeof(buffer), &actual)) == true) + { + if (actual == 0) + break; + + if (chunked == true) + { + std::string size; + strprintf(size, "%llX\r\n", actual); + Success &= FileFd::Write(client, size.c_str(), size.size()); + Success &= FileFd::Write(client, buffer, actual); + Success &= FileFd::Write(client, "\r\n", strlen("\r\n")); + } + else + Success &= FileFd::Write(client, buffer, actual); + } + if (chunked == true) + { + char const * const finish = "0\r\n\r\n"; + Success &= FileFd::Write(client, finish, strlen(finish)); + } + if (Success == false) + std::cerr << "SENDFILE:" << (chunked ? " CHUNKED" : "") << " READ/WRITE ERROR to " << client << std::endl; + return Success; +} + /*}}}*/ +static bool sendData(int const client, std::list<std::string> const &headers, std::string const &data)/*{{{*/ +{ + if (chunkedTransferEncoding(headers) == true) + { + unsigned long long const ullsize = data.length(); + std::string size; + strprintf(size, "%llX\r\n", ullsize); + char const * const finish = "\r\n0\r\n\r\n"; + if (FileFd::Write(client, size.c_str(), size.length()) == false || + FileFd::Write(client, data.c_str(), ullsize) == false || + FileFd::Write(client, finish, strlen(finish)) == false) + { + std::cerr << "SENDDATA: CHUNK WRITE ERROR to " << client << std::endl; + return false; + } + } + else if (FileFd::Write(client, data.c_str(), data.size()) == false) + { + std::cerr << "SENDDATA: WRITE ERROR to " << client << std::endl; + return false; + } + return true; +} + /*}}}*/ +static void sendError(std::ostream &log, int const client, int const httpcode, std::string const &request,/*{{{*/ + bool const content, std::string const &error, std::list<std::string> &headers) +{ + auto const quotedCode = HTMLEncode(httpcodeToStr(httpcode)); + std::string response("<!doctype html><html><head><title>"); + response.append(quotedCode).append("</title><meta charset=\"utf-8\" /></head>"); + response.append("<body><h1>").append(quotedCode).append("</h1>"); + if (httpcode != 200) + response.append("<p><em>Error</em>: "); + else + response.append("<p><em>Success</em>: "); + if (error.empty() == false) + response.append(HTMLEncode(error)); + else + response.append(quotedCode); + if (httpcode != 200) + response.append("</p>This error is a result of the request: <pre>"); + else + response.append("The successfully executed operation was requested by: <pre>"); + response.append(HTMLEncode(request)).append("</pre></body></html>"); + if (httpcode != 200) + { + if (_config->FindB("aptwebserver::closeOnError", false) == true) + headers.push_back("Connection: close"); + } + addDataHeaders(headers, response); + + if (contentTypeSet(headers) == false) + headers.push_back("Content-Type: text/html; charset=utf-8"); + + sendHead(log, client, httpcode, headers); + if (content == true) + sendData(client, headers, response); +} +static void sendSuccess(std::ostream &log, int const client, std::string const &request, + bool const content, std::string const &error, std::list<std::string> &headers) +{ + sendError(log, client, 200, request, content, error, headers); +} + /*}}}*/ +static void sendRedirect(std::ostream &log, int const client, int const httpcode,/*{{{*/ + std::string const &uri, std::string const &request, bool content) +{ + std::list<std::string> headers; + auto const quotedCode = HTMLEncode(httpcodeToStr(httpcode)); + std::string response("<!doctype html><html><head><title>"); + response.append(quotedCode).append("</title><meta charset=\"utf-8\" /></head>"); + response.append("<body><h1>").append(quotedCode).append("</h1"); + response.append("<p>You should be redirected to <em>").append(HTMLEncode(uri)).append("</em></p>"); + response.append("This page is a result of the request: <pre>"); + response.append(HTMLEncode(request)).append("</pre></body></html>"); + addDataHeaders(headers, response); + std::string location("Location: "); + if (strncmp(uri.c_str(), "http://", 7) != 0 && strncmp(uri.c_str(), "https://", 8) != 0) + { + std::string const host = LookupTag(request, "Host"); + unsigned int const httpsport = _config->FindI("aptwebserver::port::https", 4433); + std::string hosthttpsport; + strprintf(hosthttpsport, ":%u", httpsport); + if (host.find(hosthttpsport) != std::string::npos) + location.append("https://"); + else + location.append("http://"); + location.append(host).append("/"); + if (strncmp("/home/", uri.c_str(), strlen("/home/")) == 0 && uri.find("/public_html/") != std::string::npos) + { + std::string homeuri = SubstVar(uri, "/home/", "~"); + homeuri = SubstVar(homeuri, "/public_html/", "/"); + location.append(homeuri); + } + else + location.append(uri); + } + else + location.append(uri); + headers.push_back(location); + + if (contentTypeSet(headers) == false) + headers.push_back("Content-Type: text/html; charset=utf-8"); + + sendHead(log, client, httpcode, headers); + if (content == true) + sendData(client, headers, response); +} + /*}}}*/ +static int filter_hidden_files(const struct dirent *a) /*{{{*/ +{ + if (a->d_name[0] == '.') + return 0; +#ifdef _DIRENT_HAVE_D_TYPE + // if we have the d_type check that only files and dirs will be included + if (a->d_type != DT_UNKNOWN && + a->d_type != DT_REG && + a->d_type != DT_LNK && // this includes links to regular files + a->d_type != DT_DIR) + return 0; +#endif + return 1; +} +static int grouped_alpha_case_sort(const struct dirent **a, const struct dirent **b) { +#ifdef _DIRENT_HAVE_D_TYPE + if ((*a)->d_type == DT_DIR && (*b)->d_type == DT_DIR); + else if ((*a)->d_type == DT_DIR && (*b)->d_type == DT_REG) + return -1; + else if ((*b)->d_type == DT_DIR && (*a)->d_type == DT_REG) + return 1; + else +#endif + { + struct stat f_prop; //File's property + stat((*a)->d_name, &f_prop); + int const amode = f_prop.st_mode; + stat((*b)->d_name, &f_prop); + int const bmode = f_prop.st_mode; + if (S_ISDIR(amode) && S_ISDIR(bmode)); + else if (S_ISDIR(amode)) + return -1; + else if (S_ISDIR(bmode)) + return 1; + } + return strcasecmp((*a)->d_name, (*b)->d_name); +} + /*}}}*/ +static void sendDirectoryListing(std::ostream &log, int const client, std::string const &dir,/*{{{*/ + std::string const &request, bool content, std::list<std::string> &headers) +{ + struct dirent **namelist; + int const counter = scandir(dir.c_str(), &namelist, filter_hidden_files, grouped_alpha_case_sort); + if (counter == -1) + { + sendError(log, client, 500, request, content, "scandir failed", headers); + return; + } + + std::ostringstream listing; + std::string const quotedDir = HTMLEncode(dir); + listing << "<!doctype html><html><head><title>Index of " << quotedDir << "</title><meta charset=\"utf-8\" />" + << "<style type=\"text/css\"><!-- td {padding: 0.02em 0.5em 0.02em 0.5em;}" + << "tr:nth-child(even){background-color:#dfdfdf;}" + << "h1, td:nth-child(3){text-align:center;}" + << "table {margin-left:auto;margin-right:auto;} --></style>" + << "</head>" << std::endl + << "<body><h1>Index of " << quotedDir << "</h1>" << std::endl + << "<table><tr><th>#</th><th>Name</th><th>Size</th><th>Last-Modified</th></tr>" << std::endl; + if (dir != "./") + listing << "<tr><td>d</td><td><a href=\"..\">Parent Directory</a></td><td>-</td><td>-</td></tr>"; + for (int i = 0; i < counter; ++i) { + struct stat fs; + std::string filename(dir); + filename.append("/").append(namelist[i]->d_name); + stat(filename.c_str(), &fs); + std::string const quotedHref = QuoteString(namelist[i]->d_name, "\"\\/#?"); + std::string const quotedName = HTMLEncode(namelist[i]->d_name); + bool const isDir = S_ISDIR(fs.st_mode); + listing << "<tr><td>" << (isDir ? 'd' : 'f') << "</td>" + << "<td><a href=\"./" << quotedHref << (isDir ? "/" : "") <<"\">" << quotedName << "</a></td>" + << "<td>" << (isDir ? "-" : SizeToStr(fs.st_size).append("B")) << "</td>" + << "<td>" << TimeRFC1123(fs.st_mtime, true) << "</td></tr>\n"; + } + listing << "</table></body></html>" << std::endl; + + if (contentTypeSet(headers) == false) + headers.push_back("Content-Type: text/html; charset=utf-8"); + + std::string response(listing.str()); + addDataHeaders(headers, response); + sendHead(log, client, 200, headers); + if (content == true) + sendData(client, headers, response); +} + /*}}}*/ +static bool parseFirstLine(std::ostream &log, int const client, std::string const &request,/*{{{*/ + std::string &filename, std::string ¶ms, bool &sendContent, + bool &closeConnection, std::list<std::string> &headers) +{ + if (strncmp(request.c_str(), "HEAD ", 5) == 0) + sendContent = false; + if (strncmp(request.c_str(), "GET ", 4) != 0) + { + sendError(log, client, 501, request, true, "", headers); + return false; + } + + size_t const lineend = request.find('\n'); + size_t filestart = request.find(' '); + for (; request[filestart] == ' '; ++filestart); + size_t fileend = request.rfind(' ', lineend); + if (lineend == std::string::npos || filestart == std::string::npos || + fileend == std::string::npos || filestart == fileend) + { + sendError(log, client, 500, request, sendContent, "Filename can't be extracted", headers); + return false; + } + + size_t httpstart = fileend; + for (; request[httpstart] == ' '; ++httpstart); + if (strncmp(request.c_str() + httpstart, "HTTP/1.1\r", 9) == 0) + closeConnection = strcasecmp(LookupTag(request, "Connection", "Keep-Alive").c_str(), "Keep-Alive") != 0; + else if (strncmp(request.c_str() + httpstart, "HTTP/1.0\r", 9) == 0) + closeConnection = strcasecmp(LookupTag(request, "Connection", "Keep-Alive").c_str(), "close") == 0; + else + { + sendError(log, client, 500, request, sendContent, "Not an HTTP/1.{0,1} request", headers); + return false; + } + + filename = request.substr(filestart, fileend - filestart); + if (filename.find(' ') != std::string::npos) + { + sendError(log, client, 500, request, sendContent, "Filename contains an unencoded space", headers); + return false; + } + + std::string host = LookupTag(request, "Host", ""); + if (host.empty() == true) + { + // RFC 2616 §14.23 requires Host + sendError(log, client, 400, request, sendContent, "Host header is required", headers); + return false; + } + host = "http://" + host; + + // Proxies require absolute uris, so this is a simple proxy-fake option + std::string const absolute = _config->Find("aptwebserver::request::absolute", "uri,path"); + if (strncmp(host.c_str(), filename.c_str(), host.length()) == 0 && APT::String::Startswith(filename, "/_config/") == false) + { + if (absolute.find("uri") == std::string::npos) + { + sendError(log, client, 400, request, sendContent, "Request is absoluteURI, but configured to not accept that", headers); + return false; + } + + // strip the host from the request to make it an absolute path + filename.erase(0, host.length()); + + std::string const authConf = _config->Find("aptwebserver::proxy-authorization", ""); + std::string auth = LookupTag(request, "Proxy-Authorization", ""); + if (authConf.empty() != auth.empty()) + { + if (auth.empty()) + sendError(log, client, 407, request, sendContent, "Proxy requires authentication", headers); + else + sendError(log, client, 407, request, sendContent, "Client wants to authenticate to proxy, but proxy doesn't need it", headers); + return false; + } + if (authConf.empty() == false) + { + char const * const basic = "Basic "; + if (strncmp(auth.c_str(), basic, strlen(basic)) == 0) + { + auth.erase(0, strlen(basic)); + if (auth != authConf) + { + sendError(log, client, 407, request, sendContent, "Proxy-Authentication doesn't match", headers); + return false; + } + } + else + { + std::list<std::string> headers; + headers.push_back("Proxy-Authenticate: Basic"); + sendError(log, client, 407, request, sendContent, "Unsupported Proxy-Authentication Scheme", headers); + return false; + } + } + } + else if (absolute.find("path") == std::string::npos && APT::String::Startswith(filename, "/_config/") == false) + { + sendError(log, client, 400, request, sendContent, "Request is absolutePath, but configured to not accept that", headers); + return false; + } + + if (APT::String::Startswith(filename, "/_config/") == false) + { + std::string const authConf = _config->Find("aptwebserver::authorization", ""); + std::string auth = LookupTag(request, "Authorization", ""); + if (authConf.empty() != auth.empty()) + { + if (auth.empty()) + sendError(log, client, 401, request, sendContent, "Server requires authentication", headers); + else + sendError(log, client, 401, request, sendContent, "Client wants to authenticate to server, but server doesn't need it", headers); + return false; + } + if (authConf.empty() == false) + { + char const * const basic = "Basic "; + if (strncmp(auth.c_str(), basic, strlen(basic)) == 0) + { + auth.erase(0, strlen(basic)); + if (auth != authConf) + { + sendError(log, client, 401, request, sendContent, "Authentication doesn't match", headers); + return false; + } + } + else + { + headers.push_back("WWW-Authenticate: Basic"); + sendError(log, client, 401, request, sendContent, "Unsupported Authentication Scheme", headers); + return false; + } + } + } + + size_t paramspos = filename.find('?'); + if (paramspos != std::string::npos) + { + params = filename.substr(paramspos + 1); + filename.erase(paramspos); + } + + filename = DeQuoteString(filename); + + // this is not a secure server, but at least prevent the obvious … + if (filename.empty() == true || filename[0] != '/' || + strncmp(filename.c_str(), "//", 2) == 0 || + filename.find_first_of("\r\n\t\f\v") != std::string::npos || + filename.find("/../") != std::string::npos) + { + std::list<std::string> headers; + sendError(log, client, 400, request, sendContent, "Filename contains illegal character (sequence)", headers); + return false; + } + + // nuke the first character which is a / as we assured above + filename.erase(0, 1); + if (filename.empty() == true) + filename = "./"; + // support ~user/ uris to refer to /home/user/public_html/ as a kind-of special directory + else if (filename[0] == '~') + { + // /home/user is actually not entirely correct, but good enough for now + size_t dashpos = filename.find('/'); + if (dashpos != std::string::npos) + { + std::string home = filename.substr(1, filename.find('/') - 1); + std::string pubhtml = filename.substr(filename.find('/') + 1); + filename = "/home/" + home + "/public_html/" + pubhtml; + } + else + filename = "/home/" + filename.substr(1) + "/public_html/"; + } + + // if no filename is given, but a valid directory see if we can use an index or + // have to resort to a autogenerated directory listing later on + if (DirectoryExists(filename) == true) + { + std::string const directoryIndex = _config->Find("aptwebserver::directoryindex"); + if (directoryIndex.empty() == false && directoryIndex == flNotDir(directoryIndex) && + RealFileExists(filename + directoryIndex) == true) + filename += directoryIndex; + } + + return true; +} + /*}}}*/ +static bool handleOnTheFlyReconfiguration(std::ostream &log, int const client,/*{{{*/ + std::string const &request, std::vector<std::string> parts, std::list<std::string> &headers) +{ + size_t const pcount = parts.size(); + for (size_t i = 0; i < pcount; ++i) + parts[i] = DeQuoteString(parts[i]); + if (pcount == 4 && parts[1] == "set") + { + _config->Set(parts[2], parts[3]); + sendSuccess(log, client, request, true, "Option '" + parts[2] + "' was set to '" + parts[3] + "'!", headers); + return true; + } + else if (pcount == 4 && parts[1] == "find") + { + std::string response = _config->Find(parts[2], parts[3]); + addDataHeaders(headers, response); + if (contentTypeSet(headers) == false) + headers.push_back("Content-Type: text/plain; charset=utf-8"); + sendHead(log, client, 200, headers); + sendData(client, headers, response); + return true; + } + else if (pcount == 3 && parts[1] == "find") + { + if (_config->Exists(parts[2]) == true) + { + std::string response = _config->Find(parts[2]); + addDataHeaders(headers, response); + if (contentTypeSet(headers) == false) + headers.push_back("Content-Type: text/plain; charset=utf-8"); + sendHead(log, client, 200, headers); + sendData(client, headers, response); + return true; + } + sendError(log, client, 404, request, true, "Requested Configuration option doesn't exist", headers); + return false; + } + else if (pcount == 3 && parts[1] == "clear") + { + _config->Clear(parts[2]); + sendSuccess(log, client, request, true, "Option '" + parts[2] + "' was cleared.", headers); + return true; + } + + sendError(log, client, 400, request, true, "Unknown on-the-fly configuration request", headers); + return false; +} + /*}}}*/ +static void * handleClient(int const client, size_t const id) /*{{{*/ +{ + auto logfilepath = _config->FindFile("aptwebserver::logfiles"); + if (logfilepath.empty() == false) + strprintf(logfilepath, "%s.client-%lu.log", logfilepath.c_str(), id); + else + logfilepath = "/dev/null"; + std::ofstream logfile(logfilepath); + basic_teeostream<char> log(std::clog, logfile); + + log << "ACCEPT client " << client << std::endl; + bool closeConnection = false; + while (closeConnection == false) + { + std::vector<std::string> messages; + if (ReadMessages(client, messages) == false) + break; + + std::list<std::string> headers; + for (std::vector<std::string>::const_iterator m = messages.begin(); + m != messages.end() && closeConnection == false; ++m) { + // if we announced a closing in previous response, do the close now + if (std::find(headers.begin(), headers.end(), std::string("Connection: close")) != headers.end()) + { + closeConnection = true; + break; + } + headers.clear(); + + log << ">>> REQUEST from " << client << " >>>" << std::endl << *m + << std::endl << "<<<<<<<<<<<<<<<<" << std::endl; + std::string filename; + std::string params; + bool sendContent = true; + if (parseFirstLine(log, client, *m, filename, params, sendContent, closeConnection, headers) == false) + continue; + + // special webserver command request + if (filename.length() > 1 && filename[0] == '_') + { + std::vector<std::string> parts = VectorizeString(filename, '/'); + if (parts[0] == "_config") + { + handleOnTheFlyReconfiguration(log, client, *m, parts, headers); + continue; + } + } + + // string replacements in the requested filename + ::Configuration::Item const *Replaces = _config->Tree("aptwebserver::redirect::replace"); + if (Replaces != NULL) + { + std::string redirect = "/" + filename; + for (::Configuration::Item *I = Replaces->Child; I != NULL; I = I->Next) + redirect = SubstVar(redirect, I->Tag, I->Value); + if (redirect.empty() == false && redirect[0] == '/') + redirect.erase(0,1); + if (redirect != filename) + { + sendRedirect(log, client, _config->FindI("aptwebserver::redirect::httpcode", 301), redirect, *m, sendContent); + continue; + } + } + + ::Configuration::Item const *Overwrite = _config->Tree("aptwebserver::overwrite"); + if (Overwrite != NULL) + { + for (::Configuration::Item *I = Overwrite->Child; I != NULL; I = I->Next) + { + regex_t *pattern = new regex_t; + int const res = regcomp(pattern, I->Tag.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB); + if (res != 0) + { + char error[300]; + regerror(res, pattern, error, sizeof(error)); + sendError(log, client, 500, *m, sendContent, error, headers); + continue; + } + if (regexec(pattern, filename.c_str(), 0, 0, 0) == 0) + { + filename = _config->Find("aptwebserver::overwrite::" + I->Tag + "::filename", flNotDir(filename)); + if (filename.find("/") == std::string::npos) + { + auto directory = _config->Find("aptwebserver::overwrite::" + I->Tag + "::directory", flNotFile(filename)); + filename = flCombine(directory, filename); + } + if (filename.empty() == false && filename[0] == '/') + filename.erase(0,1); + if (filename.empty()) + filename = "./"; + regfree(pattern); + break; + } + regfree(pattern); + } + } + + // automatic retry can be tested with this + { + int failrequests = _config->FindI("aptwebserver::failrequest::" + filename, 0); + if (failrequests != 0) + { + --failrequests; + _config->Set(("aptwebserver::failrequest::" + filename).c_str(), failrequests); + sendError(log, client, _config->FindI("aptwebserver::failrequest", 400), *m, sendContent, "Server is configured to fail this file.", headers); + continue; + } + } + + // deal with the request + unsigned int const httpsport = _config->FindI("aptwebserver::port::https", 4433); + std::string hosthttpsport; + strprintf(hosthttpsport, ":%u", httpsport); + if (_config->FindB("aptwebserver::support::http", true) == false && + LookupTag(*m, "Host").find(hosthttpsport) == std::string::npos) + { + sendError(log, client, 400, *m, sendContent, "HTTP disabled, all requests must be HTTPS", headers); + continue; + } + else if (RealFileExists(filename) == true) + { + FileFd data(filename, FileFd::ReadOnly); + std::string condition = LookupTag(*m, "If-Modified-Since", ""); + if (_config->FindB("aptwebserver::support::modified-since", true) == true && condition.empty() == false) + { + time_t cache; + if (RFC1123StrToTime(condition.c_str(), cache) == true && + cache >= data.ModificationTime()) + { + sendHead(log, client, 304, headers); + continue; + } + } + + if (_config->FindB("aptwebserver::support::range", true) == true) + condition = LookupTag(*m, "Range", ""); + else + condition.clear(); + if (condition.empty() == false && strncmp(condition.c_str(), "bytes=", 6) == 0) + { + std::string ranges = ',' + _config->Find("aptwebserver::response-header::Accept-Ranges") + ','; + ranges.erase(std::remove(ranges.begin(), ranges.end(), ' '), ranges.end()); + if (ranges.find(",bytes,") == std::string::npos) + { + // we handle it as an error here because we are a test server - a real one should just ignore it + sendError(log, client, 400, *m, sendContent, "Client does range requests we don't support", headers); + continue; + } + + time_t cache; + std::string ifrange; + if (_config->FindB("aptwebserver::support::if-range", true) == true) + ifrange = LookupTag(*m, "If-Range", ""); + bool validrange = (ifrange.empty() == true || + (RFC1123StrToTime(ifrange.c_str(), cache) == true && + cache <= data.ModificationTime())); + + // FIXME: support multiple byte-ranges (APT clients do not do this) + if (condition.find(',') == std::string::npos) + { + size_t start = 6; + unsigned long long filestart = strtoull(condition.c_str() + start, NULL, 10); + // FIXME: no support for last-byte-pos being not the end of the file (APT clients do not do this) + size_t dash = condition.find('-') + 1; + unsigned long long fileend = strtoull(condition.c_str() + dash, NULL, 10); + unsigned long long filesize = data.FileSize(); + if ((fileend == 0 || (fileend == filesize && fileend >= filestart)) && + validrange == true) + { + if (filesize > filestart) + { + data.Skip(filestart); + // make sure to send content-range before conent-length + // as regression test for LP: #1445239 + std::ostringstream contentrange; + contentrange << "Content-Range: bytes " << filestart << "-" + << filesize - 1 << "/" << filesize; + headers.push_back(contentrange.str()); + std::ostringstream contentlength; + contentlength << "Content-Length: " << (filesize - filestart); + headers.push_back(contentlength.str()); + sendHead(log, client, 206, headers); + if (sendContent == true) + sendFile(client, headers, data); + continue; + } + else + { + if (_config->FindB("aptwebserver::support::content-range", true) == true) + { + std::ostringstream contentrange; + contentrange << "Content-Range: bytes */" << filesize; + headers.push_back(contentrange.str()); + } + sendError(log, client, 416, *m, sendContent, "", headers); + continue; + } + } + } + } + + addFileHeaders(headers, data); + sendHead(log, client, 200, headers); + if (sendContent == true) + sendFile(client, headers, data); + } + else if (DirectoryExists(filename) == true) + { + if (filename[filename.length()-1] == '/') + sendDirectoryListing(log, client, filename, *m, sendContent, headers); + else + sendRedirect(log, client, 301, filename.append("/"), *m, sendContent); + } + else + sendError(log, client, 404, *m, sendContent, "", headers); + } + + // if we announced a closing in the last response, do the close now + if (std::find(headers.begin(), headers.end(), std::string("Connection: close")) != headers.end()) + closeConnection = true; + + if (_error->PendingError() == true) + break; + _error->DumpErrors(std::cerr); + } + _error->DumpErrors(std::cerr); + close(client); + log << "CLOSE client " << client << std::endl; + return NULL; +} + /*}}}*/ +static void loadMimeTypesFile(std::string const &filename) /*{{{*/ +{ + if (FileExists(filename) == false) + return; + + std::string line; + FileFd mimetypes(filename, FileFd::ReadOnly); + while (mimetypes.ReadLine(line)) + { + if (line.empty() || line[0] == '#' || line.find_first_not_of(" \t\r") == std::string::npos) + continue; + std::transform(line.begin(), line.end(), line.begin(), [](char const c) { return c == ' ' ? '\t' : c; }); + auto l = VectorizeString(line, '\t'); + l.erase(std::remove_if(l.begin(), l.end(), [](std::string const &f) { return f.empty(); }), l.end()); + if (l.size() < 2) + continue; + for (size_t i = 1; i < l.size(); ++i) + if (l[i].empty() == false) + _config->CndSet(std::string("aptwebserver::content-type::by-extension::").append(l[i]).c_str(), l[0]); + } +} + /*}}}*/ + +int main(int const argc, const char * argv[]) +{ + CommandLine::Args Args[] = { + {'p', "port", "aptwebserver::port", CommandLine::HasArg}, + {0, "request-absolute", "aptwebserver::request::absolute", CommandLine::HasArg}, + {0, "authorization", "aptwebserver::authorization", CommandLine::HasArg}, + {0, "proxy-authorization", "aptwebserver::proxy-authorization", CommandLine::HasArg}, + {0, "logfiles", "aptwebserver::logfiles", CommandLine::HasArg}, + {'c',"config-file",0,CommandLine::ConfigFile}, + {'o',"option",0,CommandLine::ArbItem}, + {0,0,0,0} + }; + + CommandLine CmdL(Args, _config); + if(CmdL.Parse(argc,argv) == false) + { + _error->DumpErrors(); + exit(1); + } + + if (_config->FindB("aptwebserver::content-type::mime.types", true)) + { + if (_config->FindB("aptwebserver::content-type::mime.types::apt", true)) + loadMimeTypesFile("/etc/apt/mime.types"); + + if (_config->FindB("aptwebserver::content-type::mime.types::home", true)) + { + auto const home = getenv("HOME"); + if (home != nullptr) + loadMimeTypesFile(flCombine(home, ".mime.types")); + } + + if (_config->FindB("aptwebserver::content-type::mime.types::etc", true)) + loadMimeTypesFile("/etc/mime.types"); + } + + // create socket, bind and listen to it {{{ + // ignore SIGPIPE, this can happen on write() if the socket closes connection + signal(SIGPIPE, SIG_IGN); + // we don't care for our slaves, so ignore their death + signal(SIGCHLD, SIG_IGN); + + int sock = socket(AF_INET6, SOCK_STREAM, 0); + if(sock < 0) + { + _error->Errno("aptwerbserver", "Couldn't create socket"); + _error->DumpErrors(std::cerr); + return 1; + } + + int port = _config->FindI("aptwebserver::port", 8080); + + // ensure that we accept all connections: v4 or v6 + int const iponly = 0; + setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &iponly, sizeof(iponly)); + // to not linger on an address + int const enable = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)); + + struct sockaddr_in6 locAddr; + memset(&locAddr, 0, sizeof(locAddr)); + locAddr.sin6_family = AF_INET6; + locAddr.sin6_port = htons(port); + locAddr.sin6_addr = in6addr_any; + + if (bind(sock, (struct sockaddr*) &locAddr, sizeof(locAddr)) < 0) + { + _error->Errno("aptwerbserver", "Couldn't bind"); + _error->DumpErrors(std::cerr); + return 2; + } + + if (port == 0) + { + struct sockaddr_in6 addr; + socklen_t addrlen = sizeof(sockaddr_in6); + if (getsockname(sock, (struct sockaddr*) &addr, &addrlen) != 0) + _error->Errno("getsockname", "Could not get chosen port number"); + else + port = ntohs(addr.sin6_port); + } + std::string const portfilename = _config->Find("aptwebserver::portfile", ""); + if (portfilename.empty() == false) + { + FileFd portfile(portfilename, FileFd::WriteOnly | FileFd::Create | FileFd::Empty); + std::string portcontent; + strprintf(portcontent, "%d", port); + portfile.Write(portcontent.c_str(), portcontent.size()); + portfile.Sync(); + } + _config->Set("aptwebserver::port::http", port); + + FileFd pidfile; + if (_config->FindB("aptwebserver::fork", false) == true) + { + std::string const pidfilename = _config->Find("aptwebserver::pidfile", "aptwebserver.pid"); + int const pidfilefd = GetLock(pidfilename); + if (pidfilefd < 0 || pidfile.OpenDescriptor(pidfilefd, FileFd::WriteOnly) == false) + { + _error->Errno("aptwebserver", "Couldn't acquire lock on pidfile '%s'", pidfilename.c_str()); + _error->DumpErrors(std::cerr); + return 3; + } + + pid_t child = fork(); + if (child < 0) + { + _error->Errno("aptwebserver", "Forking failed"); + _error->DumpErrors(std::cerr); + return 4; + } + else if (child != 0) + { + // successfully forked: ready to serve! + std::string pidcontent; + strprintf(pidcontent, "%d", child); + pidfile.Write(pidcontent.c_str(), pidcontent.size()); + pidfile.Sync(); + if (_error->PendingError() == true) + { + _error->DumpErrors(std::cerr); + return 5; + } + std::cout << "Successfully forked as " << child << std::endl; + return 0; + } + } + + std::clog << "Serving ANY file on port: " << port << std::endl; + + int const slaves = _config->FindI("aptwebserver::slaves", SOMAXCONN); + std::cerr << "SLAVES: " << slaves << std::endl; + listen(sock, slaves); + /*}}}*/ + + _config->CndSet("aptwebserver::response-header::Server", "APT webserver"); + _config->CndSet("aptwebserver::response-header::Accept-Ranges", "bytes"); + _config->CndSet("aptwebserver::directoryindex", "index.html"); + APT::Configuration::getCompressors(); + + size_t id = 0; + while (true) + { + int client = accept(sock, NULL, NULL); + if (client == -1) + { + if (errno == EINTR) + continue; + _error->Errno("accept", "Couldn't accept client on socket %d", sock); + _error->DumpErrors(std::cerr); + return 6; + } + + std::thread t(handleClient, client, ++id); + t.detach(); + } + pidfile.Close(); + + return 0; +} diff --git a/test/interactive-helper/createdeb-cve-2020-27350.cc b/test/interactive-helper/createdeb-cve-2020-27350.cc new file mode 100644 index 0000000..8b96194 --- /dev/null +++ b/test/interactive-helper/createdeb-cve-2020-27350.cc @@ -0,0 +1,325 @@ +#include <errno.h> +#include <fcntl.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +struct Header +{ + char Name[16]; + char MTime[12]; + char UID[6]; + char GID[6]; + char Mode[8]; + char Size[10]; + char Magic[2]; +}; + +struct TarHeader +{ + char Name[100]; + char Mode[8]; + char UserID[8]; + char GroupID[8]; + char Size[12]; + char MTime[12]; + char Checksum[8]; + char LinkFlag; + char LinkName[100]; + char MagicNumber[8]; + char UserName[32]; + char GroupName[32]; + char Major[8]; + char Minor[8]; +}; + +// Call `write` and check the result. +static void write_chk(int fd, const void *buf, size_t count) +{ + const ssize_t wr = write(fd, buf, count); + if (wr < 0) + { + const int err = errno; + fprintf(stderr, "Write failed: %s\n", strerror(err)); + exit(EXIT_FAILURE); + } + if ((size_t)wr != count) + { + fprintf(stderr, "Incomplete write.\n"); + exit(EXIT_FAILURE); + } +} + +// Triggers a negative integer overflow at https://git.launchpad.net/ubuntu/+source/apt/tree/apt-pkg/contrib/arfile.cc?h=applied/ubuntu/focal-updates&id=4c264e60b524855b211751e1632ba48526f6b44d#n116: +// +// Memb->Size -= Len; +// +// Due to the integer overflow, the value of Memb->Size is 0xFFFFFFFFFFFFFFFF. +// This leads to an out-of-memory error at https://git.launchpad.net/ubuntu/+source/python-apt/tree/python/arfile.cc?h=applied/ubuntu/focal-updates&id=0f7cc93acdb51d943114f1cd79002288c4ca4d24#n602: +// +// char* value = new char[member->Size]; +// +// The out-of-memory error causes aptd to crash. +static void createdeb_crash(const int fd) +{ + // Magic number + static const char *magic = "!<arch>\n"; + write_chk(fd, magic, strlen(magic)); + + struct Header h; + memset(&h, 0, sizeof(h)); + + memcpy(h.Name, "control.tar ", sizeof(h.Name)); + write_chk(fd, &h, sizeof(h)); + + memset(&h, 0, sizeof(h)); + memcpy(h.Name, "data.tar ", sizeof(h.Name)); + write_chk(fd, &h, sizeof(h)); + + memset(&h, 0, sizeof(h)); + memcpy(h.Name, "#1/13 ", sizeof(h.Name)); + strcpy(h.Size, "12"); + write_chk(fd, &h, sizeof(h)); + write_chk(fd, "debian-binary", 13); +} + +// Triggers an infinite loop in `ARArchive::LoadHeaders()`. +// The bug is due to the use of `strtoul` at https://git.launchpad.net/ubuntu/+source/apt/tree/apt-pkg/contrib/strutl.cc?h=applied/ubuntu/focal-updates&id=4c264e60b524855b211751e1632ba48526f6b44d#n1169: +// +// Res = strtoul(S,&End,Base); +// +// The problem is that `strtoul` accepts negative numbers. We exploit that here by setting the size string to "-60". +static void createdeb_loop(const int fd) +{ + // Magic number + static const char *magic = "!<arch>\n"; + write_chk(fd, magic, strlen(magic)); + + struct Header h; + memset(&h, 0, sizeof(h)); + + memcpy(h.Name, "#1/20 ", sizeof(h.Name)); + strcpy(h.Size, "-60"); + write_chk(fd, &h, sizeof(h)); + + char buf[20]; + memset(buf, 0, sizeof(buf)); + write_chk(fd, buf, sizeof(buf)); +} + +// Leaks a file descriptor in `debfile_new()`: +// +// https://git.launchpad.net/python-apt/tree/python/arfile.cc?h=2.0.0#n588 +// +// If the .deb file is invalid then the function returns without deleting +// `self`, which means that the file descriptor isn't closed. +static void createdeb_leakfd(const int fd) +{ + // Magic number + static const char *magic = "!<arch>\n"; + write_chk(fd, magic, strlen(magic)); + + struct Header h; + memset(&h, 0, sizeof(h)); + + memset(&h, 0, sizeof(h)); + memcpy(h.Name, "data.tar ", sizeof(h.Name)); + write_chk(fd, &h, sizeof(h)); +} + +static void set_checksum(unsigned char block[512]) +{ + struct TarHeader *tar = (struct TarHeader *)&block[0]; + memset(tar->Checksum, ' ', sizeof(tar->Checksum)); + uint32_t sum = 0; + for (int i = 0; i < 512; i++) + { + sum += block[i]; + } + snprintf(tar->Checksum, sizeof(tar->Checksum), "%o", sum); +} +static void base256_encode(char *Str, unsigned long long Num, unsigned int Len) +{ + Str += Len; + while (Len-- > 0) { + *--Str = static_cast<char>(Num & 0xff); + Num >>= 8; + } + + *Str |= 0x80; // mark as base256 +} + +// Create a deb with a control.tar that contains a too large file or link name (GNU extension) +static void createdeb_bigtarfilelength(const int fd, int flag, unsigned long long size = 64llu * 1024 * 1024 + 1) +{ + // Magic number + static const char *magic = "!<arch>\n"; + write_chk(fd, magic, strlen(magic)); + + struct Header h; + memset(&h, ' ', sizeof(h)); + memcpy(h.Name, "debian-binary/ ", sizeof(h.Name)); + h.MTime[0] = '0'; + h.UID[0] = '0'; + h.GID[0] = '0'; + memcpy(h.Mode, "644", 3); + h.Size[0] = '0'; + memcpy(h.Magic, "`\n", 2); + + write_chk(fd, &h, sizeof(h)); + + memset(&h, ' ', sizeof(h)); + memcpy(h.Name, "data.tar/ ", sizeof(h.Name)); + h.MTime[0] = '0'; + h.UID[0] = '0'; + h.GID[0] = '0'; + memcpy(h.Mode, "644", 3); + h.Size[0] = '0'; + memcpy(h.Magic, "`\n", 2); + + write_chk(fd, &h, sizeof(h)); + + memset(&h, ' ', sizeof(h)); + memcpy(h.Name, "control.tar/ ", sizeof(h.Name)); + h.MTime[0] = '0'; + h.UID[0] = '0'; + h.GID[0] = '0'; + memcpy(h.Mode, "644", 3); + memcpy(h.Size, "512", 3); + memcpy(h.Magic, "`\n", 2); + + write_chk(fd, &h, sizeof(h)); + union + { + struct TarHeader t; + unsigned char buf[512]; + } t; + for (unsigned int i = 0; i < sizeof(t.buf); i++) + t.buf[i] = '7'; + memcpy(t.t.Name, "control\0 ", 16); + memcpy(t.t.UserName, "userName", 8); + memcpy(t.t.GroupName, "thisIsAGroupNamethisIsAGroupName", 32); + t.t.LinkFlag = flag; + base256_encode(t.t.Size, size, sizeof(t.t.Size)); + memset(t.t.Checksum, ' ', sizeof(t.t.Checksum)); + + unsigned long sum = 0; + for (unsigned int i = 0; i < sizeof(t.buf); i++) + sum += t.buf[i]; + + int written = sprintf(t.t.Checksum, "%lo", sum); + for (unsigned int i = written; i < sizeof(t.t.Checksum); i++) + t.t.Checksum[i] = ' '; + + write_chk(fd, t.buf, sizeof(t.buf)); +} + +static void createdeb_test(const int fd) +{ + // Magic number + static const char *magic = "!<arch>\n"; + write_chk(fd, magic, strlen(magic)); + + struct Header h; + + memset(&h, 0, sizeof(h)); + memcpy(h.Name, "data.tar ", sizeof(h.Name)); + write_chk(fd, &h, sizeof(h)); + + memset(&h, 0, sizeof(h)); + memcpy(h.Name, "debian-binary ", sizeof(h.Name)); + strcpy(h.Size, "4"); + write_chk(fd, &h, sizeof(h)); + static const char *debian_binary = "2.0\n"; + write_chk(fd, debian_binary, strlen(debian_binary)); + + static const char *control = + "Architecture: all\n" + "Package: kevsh\n\n"; + memset(&h, 0, sizeof(h)); + memcpy(h.Name, "control.tar ", sizeof(h.Name)); + snprintf(h.Size, sizeof(h.Size), "%ld", (size_t)512 + 512); + write_chk(fd, &h, sizeof(h)); + + unsigned char block[512]; + memset(block, 0, sizeof(block)); + struct TarHeader *tar = (struct TarHeader *)&block[0]; + strcpy(tar->Name, "control"); + strcpy(tar->Mode, "644"); + snprintf(tar->Size, sizeof(tar->Size), "%lo", strlen(control)); + set_checksum(block); + write_chk(fd, block, sizeof(block)); + + memset(block, 0, sizeof(block)); + strcpy((char *)block, control); + write_chk(fd, block, sizeof(block)); +} + +int main(int argc, char *argv[]) +{ + if (argc != 3) + { + const char *progname = argc > 0 ? argv[0] : "a.out"; + fprintf( + stderr, + "usage: %s <mode> <filename>\n" + "modes: loop, segv, leakfd\n", + progname); + return EXIT_FAILURE; + } + + const char *mode = argv[1]; + const char *filename = argv[2]; + + const int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 00644); + if (fd < 0) + { + const int err = errno; + fprintf(stderr, "Could not open %s: %s\n", filename, strerror(err)); + return EXIT_FAILURE; + } + + if (strcmp(mode, "crash") == 0) + { + createdeb_crash(fd); + } + else if (strcmp(mode, "loop") == 0) + { + createdeb_loop(fd); + } + else if (strcmp(mode, "leakfd") == 0) + { + createdeb_leakfd(fd); + } + else if (strcmp(mode, "long-name") == 0) + { + createdeb_bigtarfilelength(fd, 'L'); + } + else if (strcmp(mode, "long-link") == 0) + { + createdeb_bigtarfilelength(fd, 'K'); + } + else if (strcmp(mode, "long-control") == 0) + { + createdeb_bigtarfilelength(fd, '0'); + } + else if (strcmp(mode, "too-long-control") == 0) + { + createdeb_bigtarfilelength(fd, '0', 128llu * 1024 * 1024 * 1024 + 1); + } + else if (strcmp(mode, "test") == 0) + { + createdeb_test(fd); + } + else + { + fprintf(stderr, "Mode not recognized: %s\n", mode); + } + + close(fd); + return EXIT_SUCCESS; +} diff --git a/test/interactive-helper/extract-control.cc b/test/interactive-helper/extract-control.cc new file mode 100644 index 0000000..a19e038 --- /dev/null +++ b/test/interactive-helper/extract-control.cc @@ -0,0 +1,45 @@ +#include <config.h> + +#include <apt-pkg/debfile.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> + +#include <iostream> +#include <string> +#include <unistd.h> + +using namespace std; + +static bool ExtractMember(const char *File,const char *Member) +{ + FileFd Fd(File,FileFd::ReadOnly); + debDebFile Deb(Fd); + if(_error->PendingError() == true) + return false; + + debDebFile::MemControlExtract Extract(Member); + if (Extract.Read(Deb) == false) + return false; + + if (Extract.Control == 0) + return true; + + return write(STDOUT_FILENO,Extract.Control,Extract.Length) != -1; +} + +int main(int argc, const char *argv[]) +{ + if (argc < 2) + { + cerr << "Need two arguments, a .deb and the control member" << endl; + return 100; + } + + if (ExtractMember(argv[1],argv[2]) == false) + { + _error->DumpErrors(); + return 100; + } + + return 0; +} diff --git a/test/interactive-helper/libnoprofile.c b/test/interactive-helper/libnoprofile.c new file mode 100644 index 0000000..f11b898 --- /dev/null +++ b/test/interactive-helper/libnoprofile.c @@ -0,0 +1,44 @@ +#define _GNU_SOURCE +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <dlfcn.h> +#include <unistd.h> +#include <stdio.h> + +int vprintf(const char *format, va_list ap) { + if (strncmp(format, "profiling:", strlen("profiling:")) == 0) + return 0; + + static int (*func_fprintf)(const char *format, va_list ap) = NULL; + if (func_fprintf == NULL) + func_fprintf = (int (*)(const char *format, va_list ap))dlsym(RTLD_NEXT, "vprintf"); + + return func_fprintf(format, ap); +} +int printf(const char *format, ...) { + va_list ap; + va_start(ap, format); + int res = vprintf(format, ap); + va_end(ap); + return res; +} + +int vfprintf(FILE *stream, const char *format, va_list ap) { + if (strncmp(format, "profiling:", strlen("profiling:")) == 0) + return 0; + + static int (*func_vfprintf)(FILE * stream, const char *format, va_list ap) = NULL; + if (func_vfprintf == NULL) + func_vfprintf = (int (*)(FILE * stream, const char *format, va_list ap))dlsym(RTLD_NEXT, "vfprintf"); + + return func_vfprintf(stream, format, ap); +} + +int fprintf(FILE *stream, const char *format, ...) { + va_list ap; + va_start(ap, format); + int res = vfprintf(stream, format, ap); + va_end(ap); + return res; +} diff --git a/test/interactive-helper/mthdcat.cc b/test/interactive-helper/mthdcat.cc new file mode 100644 index 0000000..2961b20 --- /dev/null +++ b/test/interactive-helper/mthdcat.cc @@ -0,0 +1,22 @@ +/* Usage, mthdcat < cmds | methods/mthd + All this does is cat a file into the method without closing the FD when + the file ends */ + +#include <config.h> + +#include <unistd.h> + +int main() +{ + char Buffer[4096]; + + while (1) + { + int Res = read(STDIN_FILENO,Buffer,sizeof(Buffer)); + if (Res <= 0) + while (1) sleep(100); + if (write(STDOUT_FILENO,Buffer,Res) != Res) + break; + } + return 0; +} diff --git a/test/interactive-helper/networkless-install-fixes/README b/test/interactive-helper/networkless-install-fixes/README new file mode 100644 index 0000000..e7ee2b0 --- /dev/null +++ b/test/interactive-helper/networkless-install-fixes/README @@ -0,0 +1,5 @@ + +Those tests aim at making the networkless install timeout +quicker, see +https://wiki.ubuntu.com/NetworklessInstallationFixes +for details diff --git a/test/interactive-helper/networkless-install-fixes/sources.test.list b/test/interactive-helper/networkless-install-fixes/sources.test.list new file mode 100644 index 0000000..380e180 --- /dev/null +++ b/test/interactive-helper/networkless-install-fixes/sources.test.list @@ -0,0 +1,25 @@ + +# archive.ubuntu.com +deb http://archive.ubuntu.com/ubuntu/ hardy main restricted +deb-src http://archive.ubuntu.com/ubuntu/ hardy main restricted + +deb http://archive.ubuntu.com/ubuntu/ hardy-updates main restricted +deb-src http://archive.ubuntu.com/ubuntu/ hardy-updates main restricted + +deb http://archive.ubuntu.com/ubuntu/ hardy universe +deb-src http://archive.ubuntu.com/ubuntu/ hardy universe + +deb http://archive.ubuntu.com/ubuntu/ hardy-updates universe +deb-src http://archive.ubuntu.com/ubuntu/ hardy-updates universe + +# security.ubuntu.com +deb http://security.ubuntu.com/ubuntu/ hardy-security main restricted +deb-src http://security.ubuntu.com/ubuntu/ hardy-security main restricted + +deb http://security.ubuntu.com/ubuntu/ hardy-security universe +deb-src http://security.ubuntu.com/ubuntu/ hardy-security universe + + +# archive.canonical.com +deb http://archive.canonical.com/ubuntu/ hardy-partner universe +deb-src http://archive.canonical.com/ubuntu/ hardy-partner universe diff --git a/test/interactive-helper/networkless-install-fixes/test.sh b/test/interactive-helper/networkless-install-fixes/test.sh new file mode 100755 index 0000000..809d467 --- /dev/null +++ b/test/interactive-helper/networkless-install-fixes/test.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +OPTS="-o Dir::Etc::sourcelist=./sources.test.list -o Acquire::http::timeout=20" + +# setup +unset http_proxy +iptables --flush + +echo "No network at all" +ifdown eth0 +time apt-get update $OPTS 2>&1 |grep system +ifup eth0 +echo "" + +echo "no working DNS (port 53 DROP)" +iptables -A OUTPUT -p udp --dport 53 -j DROP +time apt-get update $OPTS 2>&1 |grep system +iptables --flush +echo "" + +echo "DNS but no access to archive.ubuntu.com (port 80 DROP)" +iptables -A OUTPUT -p tcp --dport 80 -j DROP +time apt-get update $OPTS 2>&1 |grep system +iptables --flush +echo "" diff --git a/test/interactive-helper/rpmver.cc b/test/interactive-helper/rpmver.cc new file mode 100644 index 0000000..b23ba28 --- /dev/null +++ b/test/interactive-helper/rpmver.cc @@ -0,0 +1,118 @@ +#include <config.h> + +#include <apt-pkg/debversion.h> +#include <ctype.h> +#include <rpm/misc.h> +#include <rpm/rpmio.h> +#include <stdio.h> +#include <stdlib.h> + +#define xisdigit(x) isdigit(x) +#define xisalpha(x) isalpha(x) +#define xisalnum(x) (isdigit(x) || isalpha(x)) + +using namespace std; + +int rpmvercmp(const char * a, const char * b) +{ + char * str1, * str2; + char * one, * two; + int isnum; + + /* easy comparison to see if versions are identical */ + if (!strcmp(a, b)) return 0; + + str1 = (char *)alloca(strlen(a) + 1); + str2 = (char *)alloca(strlen(b) + 1); + + strcpy(str1, a); + strcpy(str2, b); + + one = str1; + two = str2; + + /* loop through each version segment of str1 and str2 and compare them */ + while (*one && *two) { + while (*one && !xisalnum(*one)) one++; + while (*two && !xisalnum(*two)) two++; + + str1 = one; + str2 = two; + + /* grab first completely alpha or completely numeric segment */ + /* leave one and two pointing to the start of the alpha or numeric */ + /* segment and walk str1 and str2 to end of segment */ + if (xisdigit(*str1)) { + while (*str1 && xisdigit(*str1)) str1++; + while (*str2 && xisdigit(*str2)) str2++; + isnum = 1; + } else { + while (*str1 && xisalpha(*str1)) str1++; + while (*str2 && xisalpha(*str2)) str2++; + isnum = 0; + } + + /* save character at the end of the alpha or numeric segment */ + /* so that they can be restored after the comparison */ + char oldch1 = *str1; + *str1 = '\0'; + char oldch2 = *str2; + *str2 = '\0'; + + /* take care of the case where the two version segments are */ + /* different types: one numeric, the other alpha (i.e. empty) */ + if (one == str1) return -1; /* arbitrary */ + if (two == str2) return 1; + + if (isnum) { + /* this used to be done by converting the digit segments */ + /* to ints using atoi() - it's changed because long */ + /* digit segments can overflow an int - this should fix that. */ + + /* throw away any leading zeros - it's a number, right? */ + while (*one == '0') one++; + while (*two == '0') two++; + + /* whichever number has more digits wins */ + if (strlen(one) > strlen(two)) return 1; + if (strlen(two) > strlen(one)) return -1; + } + + /* strcmp will return which one is greater - even if the two */ + /* segments are alpha or if they are numeric. don't return */ + /* if they are equal because there might be more segments to */ + /* compare */ + int rc = strcmp(one, two); + if (rc) return rc; + + /* restore character that was replaced by null above */ + *str1 = oldch1; + one = str1; + *str2 = oldch2; + two = str2; + } + + /* this catches the case where all numeric and alpha segments have */ + /* compared identically but the segment sepparating characters were */ + /* different */ + if ((!*one) && (!*two)) return 0; + + /* whichever version still has characters left over wins */ + if (!*one) return -1; else return 1; +} + +int main(int argc,const char *argv[]) +{ + printf("%i\n",strcmp(argv[1],argv[2])); + + printf("'%s' <> '%s': ",argv[1],argv[2]); + printf("rpm: %i deb: %i\n",rpmvercmp(argv[1],argv[2]), + debVS.CmpFragment(argv[1],argv[1]+strlen(argv[1]), + argv[2],argv[2]+strlen(argv[2]))); + + printf("'%s' <> '%s': ",argv[2],argv[1]); + printf("rpm: %i deb: %i\n",rpmvercmp(argv[2],argv[1]), + debVS.CmpFragment(argv[2],argv[2]+strlen(argv[2]), + argv[1],argv[1]+strlen(argv[1]))); + return 0; +} diff --git a/test/interactive-helper/teestream.h b/test/interactive-helper/teestream.h new file mode 100644 index 0000000..058717a --- /dev/null +++ b/test/interactive-helper/teestream.h @@ -0,0 +1,62 @@ +#ifndef APT_HELPER_TEESTREAM_H +#define APT_HELPER_TEESTREAM_H + +/* 'basic' implementation of a streambuf which passes the output + to two 'real' streambufs emulating '| tee' on the shell + + The main use is streaming debug output to std::clog as well as + a logfile easily, so don't expect that to be a bulletproof + implementation. */ + +#include <apt-pkg/macros.h> +#include <iostream> + +template <typename CharT, typename Traits = std::char_traits<CharT> +> class basic_teebuf: public std::basic_streambuf<CharT, Traits> +{ +public: + basic_teebuf(std::basic_streambuf<CharT, Traits> * const sb1, + std::basic_streambuf<CharT, Traits> * const sb2) + : s1(sb1), s2(sb2) {} +protected: + virtual std::streamsize xsputn(const CharT* s, std::streamsize c) APT_OVERRIDE + { + return s2->sputn(s, s1->sputn(s, c)); + } + // overflow is the fallback of sputc which is non-virtual + typedef typename Traits::int_type int_type; + virtual int_type overflow(int_type ch = Traits::eof()) APT_OVERRIDE + { + auto const eof = Traits::eof(); + if (Traits::eq_int_type(ch, Traits::eof()) == true) + return eof; + + auto const r1 = s1->sputc(Traits::to_char_type(ch)); + auto const r2 = s2->sputc(Traits::to_char_type(ch)); + return Traits::eq_int_type(r1, eof) ? r1: r2; + } + virtual void imbue(const std::locale& loc) APT_OVERRIDE + { + s1->pubimbue(loc); + s2->pubimbue(loc); + } + virtual int sync() APT_OVERRIDE + { + auto const r1 = s1->pubsync(); + auto const r2 = s2->pubsync(); + return r1 == 0 ? r2 : r1; + } +private: + std::basic_streambuf<CharT, Traits> * const s1; + std::basic_streambuf<CharT, Traits> * const s2; +}; +template <typename CharT, typename Traits = std::char_traits<CharT> +> class basic_teeostream: public std::basic_ostream<CharT, Traits> +{ +public: + basic_teeostream(std::basic_ostream<CharT, Traits> &o1, std::basic_ostream<CharT, Traits> &o2) : + std::basic_ostream<CharT, Traits>(&tbuf), tbuf(o1.rdbuf(), o2.rdbuf()) {} +private: + basic_teebuf<CharT, Traits> tbuf; +}; +#endif diff --git a/test/interactive-helper/test_fileutl.cc b/test/interactive-helper/test_fileutl.cc new file mode 100644 index 0000000..6c29b74 --- /dev/null +++ b/test/interactive-helper/test_fileutl.cc @@ -0,0 +1,44 @@ +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/strutl.h> + +#include <fcntl.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> + +#include <iostream> +#include <string> + +static void callsystem(std::string const &call) +{ + auto ret = system(call.c_str()); + if (WIFEXITED(ret) == false || WEXITSTATUS(ret) != 0) + _error->Error("Calling %s failed!", call.c_str()); +} + +int main(int, char ** argv) +{ + auto const pid = getpid(); + std::string ls; + strprintf(ls, "ls -l /proc/%d/fd", pid); + callsystem(ls); + FileFd t; + t.Open(argv[1], FileFd::ReadOnly, FileFd::Extension); + callsystem(ls); + char buf[1024]; + unsigned long long act; + while (t.Read(buf, sizeof(buf), &act)) + if (act == 0) + break; + callsystem(ls); + t.Seek(5); + callsystem(ls); + t.Close(); + callsystem(ls); + auto const ret = _error->PendingError(); + _error->DumpErrors(); + return ret; +} diff --git a/test/interactive-helper/test_udevcdrom.cc b/test/interactive-helper/test_udevcdrom.cc new file mode 100644 index 0000000..2355186 --- /dev/null +++ b/test/interactive-helper/test_udevcdrom.cc @@ -0,0 +1,23 @@ +#include <config.h> + +#include <apt-pkg/cdrom.h> + +#include <iostream> +#include <string> +#include <vector> +#include <assert.h> +#include <stddef.h> + +int main() +{ + pkgUdevCdromDevices c; + assert(c.Dlopen()); + + std::vector<CdromDevice> l; + l = c.Scan(); + assert(l.empty() == false); + for (size_t i = 0; i < l.size(); ++i) + std::cerr << l[i].DeviceName << " " + << l[i].Mounted << " " + << l[i].MountPath << std::endl; +} diff --git a/test/interactive-helper/testdeb.cc b/test/interactive-helper/testdeb.cc new file mode 100644 index 0000000..0bb24a5 --- /dev/null +++ b/test/interactive-helper/testdeb.cc @@ -0,0 +1,51 @@ +#include <config.h> + +#include <apt-pkg/arfile.h> +#include <apt-pkg/debfile.h> +#include <apt-pkg/dirstream.h> +#include <apt-pkg/error.h> +#include <apt-pkg/extracttar.h> +#include <apt-pkg/fileutl.h> + +#include <iostream> +#include <string> + +class NullStream : public pkgDirStream +{ + public: + virtual bool DoItem(Item &/*Itm*/, int &/*Fd*/) APT_OVERRIDE {return true;}; +}; + +static bool Test(const char *File) +{ + FileFd Fd(File,FileFd::ReadOnly); + debDebFile Deb(Fd); + + if (_error->PendingError() == true) + return false; + + // Get the archive member and positition the file + const ARArchive::Member *Member = Deb.GotoMember("data.tar.gz"); + if (Member == 0) + return false; + + // Extract it. + ExtractTar Tar(Deb.GetFile(),Member->Size, "gzip"); + NullStream Dir; + if (Tar.Go(Dir) == false) + return false; + + return true; +} + +int main(int argc, const char *argv[]) +{ + if (argc != 2) { + std::cout << "One parameter expected - given " << argc << std::endl; + return 100; + } + + Test(argv[1]); + _error->DumpErrors(); + return 0; +} diff --git a/test/libapt/CMakeLists.txt b/test/libapt/CMakeLists.txt new file mode 100644 index 0000000..035ff07 --- /dev/null +++ b/test/libapt/CMakeLists.txt @@ -0,0 +1,44 @@ +set(PROJECT_TEST_LIBRARIES apt-private apt-inst) +find_path(GTEST_ROOT src/gtest.cc + /usr/src/googletest/googletest + /usr/src/gtest +) +find_package(GTest) +set(GTEST_DEPENDENCIES) + +if(NOT GTEST_FOUND AND EXISTS ${GTEST_ROOT}) + include(ExternalProject) + ExternalProject_Add(gtest PREFIX ./gtest + SOURCE_DIR ${GTEST_ROOT} + INSTALL_COMMAND true) + + link_directories(${CMAKE_CURRENT_BINARY_DIR}/gtest/src/gtest-build) + + set(GTEST_LIBRARIES "-lgtest") + set(GTEST_DEPENDENCIES "gtest") + set(GTEST_FOUND TRUE) + find_path(GTEST_INCLUDE_DIRS NAMES gtest/gtest.h PATHS ${GTEST_ROOT}/include) + + message(STATUS "Found GTest at ${GTEST_ROOT}, headers at ${GTEST_INCLUDE_DIRS}") +endif() + +if(GTEST_FOUND) + # gtest produces some warnings with the set of warnings we activate, + # so disable the offending warnings while compiling tests for now + add_optional_compile_options(Wno-undef) + add_optional_compile_options(Wno-ctor-dtor-privacy) + + # Definition of the C++ files used to build the test binary - note that this + # is expanded at CMake time, so you have to rerun cmake if you add or remove + # a file (you can just run cmake . in the build directory) + file(GLOB files gtest_runner.cc *-helpers.cc *_test.cc) + add_executable(lib${PROJECT_NAME}_test ${files}) + target_include_directories(lib${PROJECT_NAME}_test PRIVATE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(lib${PROJECT_NAME}_test ${GTEST_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${PROJECT_TEST_LIBRARIES}) + if (GTEST_DEPENDENCIES) + add_dependencies(lib${PROJECT_NAME}_test ${GTEST_DEPENDENCIES}) + endif() + add_test(NAME ${PROJECT_NAME}Tests + COMMAND lib${PROJECT_NAME}_test + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +endif() diff --git a/test/libapt/acqprogress_test.cc b/test/libapt/acqprogress_test.cc new file mode 100644 index 0000000..d4596c8 --- /dev/null +++ b/test/libapt/acqprogress_test.cc @@ -0,0 +1,178 @@ +#include <config.h> +#include <apt-pkg/acquire-item.h> +#include <apt-pkg/acquire.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/hashes.h> +#include <apt-private/acqprogress.h> +#include <gtest/gtest.h> +#include <sstream> +#include <string> + +class TestItem: public pkgAcquire::Item +{ +public: + explicit TestItem(pkgAcquire * const Acq) : pkgAcquire::Item(Acq) {} + + virtual std::string DescURI() const APT_OVERRIDE { return ""; } + virtual HashStringList GetExpectedHashes() const APT_OVERRIDE { return HashStringList(); } + +}; + +TEST(AcqProgress, IMSHit) +{ + std::ostringstream out; + unsigned int width = 80; + AcqTextStatus Stat(out, width, 0); + Stat.Start(); + + pkgAcquire Acq(&Stat); + pkgAcquire::ItemDesc hit; + hit.URI = "http://example.org/file"; + hit.Description = "Example File from example.org"; + hit.ShortDesc = "Example File"; + TestItem hitO(&Acq); + hit.Owner = &hitO; + + EXPECT_EQ("", out.str()); + Stat.IMSHit(hit); + EXPECT_EQ("Hit:1 Example File from example.org\n", out.str()); + Stat.IMSHit(hit); + EXPECT_EQ("Hit:1 Example File from example.org\n" + "Hit:1 Example File from example.org\n", out.str()); + Stat.Stop(); + EXPECT_EQ("Hit:1 Example File from example.org\n" + "Hit:1 Example File from example.org\n", out.str()); +} +TEST(AcqProgress, FetchNoFileSize) +{ + std::ostringstream out; + unsigned int width = 80; + AcqTextStatus Stat(out, width, 0); + Stat.Start(); + + pkgAcquire Acq(&Stat); + pkgAcquire::ItemDesc fetch; + fetch.URI = "http://example.org/file"; + fetch.Description = "Example File from example.org"; + fetch.ShortDesc = "Example File"; + TestItem fetchO(&Acq); + fetch.Owner = &fetchO; + + EXPECT_EQ("", out.str()); + Stat.Fetch(fetch); + EXPECT_EQ("Get:1 Example File from example.org\n", out.str()); + Stat.Fetch(fetch); + EXPECT_EQ("Get:1 Example File from example.org\n" + "Get:1 Example File from example.org\n", out.str()); + Stat.Stop(); + EXPECT_EQ("Get:1 Example File from example.org\n" + "Get:1 Example File from example.org\n", out.str()); +} +TEST(AcqProgress, FetchFileSize) +{ + std::ostringstream out; + unsigned int width = 80; + AcqTextStatus Stat(out, width, 0); + Stat.Start(); + + pkgAcquire Acq(&Stat); + pkgAcquire::ItemDesc fetch; + fetch.URI = "http://example.org/file"; + fetch.Description = "Example File from example.org"; + fetch.ShortDesc = "Example File"; + TestItem fetchO(&Acq); + fetchO.FileSize = 100; + fetch.Owner = &fetchO; + + EXPECT_EQ("", out.str()); + Stat.Fetch(fetch); + EXPECT_EQ("Get:1 Example File from example.org [100 B]\n", out.str()); + fetchO.FileSize = 42; + Stat.Fetch(fetch); + EXPECT_EQ("Get:1 Example File from example.org [100 B]\n" + "Get:1 Example File from example.org [42 B]\n", out.str()); + Stat.Stop(); + EXPECT_EQ("Get:1 Example File from example.org [100 B]\n" + "Get:1 Example File from example.org [42 B]\n", out.str()); +} +TEST(AcqProgress, Fail) +{ + std::ostringstream out; + unsigned int width = 80; + AcqTextStatus Stat(out, width, 0); + Stat.Start(); + + pkgAcquire Acq(&Stat); + pkgAcquire::ItemDesc fetch; + fetch.URI = "http://example.org/file"; + fetch.Description = "Example File from example.org"; + fetch.ShortDesc = "Example File"; + TestItem fetchO(&Acq); + fetchO.FileSize = 100; + fetchO.Status = pkgAcquire::Item::StatIdle; + fetch.Owner = &fetchO; + + EXPECT_EQ("", out.str()); + Stat.Fail(fetch); + EXPECT_EQ("Ign:1 Example File from example.org\n", out.str()); + fetchO.Status = pkgAcquire::Item::StatDone; + Stat.Fail(fetch); + EXPECT_EQ("Ign:1 Example File from example.org\n" + "Ign:1 Example File from example.org\n", out.str()); + fetchO.Status = pkgAcquire::Item::StatError; + fetchO.ErrorText = "An error test!"; + Stat.Fail(fetch); + EXPECT_EQ("Ign:1 Example File from example.org\n" + "Ign:1 Example File from example.org\n" + "Err:1 Example File from example.org\n" + " An error test!\n", out.str()); + _config->Set("Acquire::Progress::Ignore::ShowErrorText", true); + fetchO.Status = pkgAcquire::Item::StatDone; + Stat.Fail(fetch); + EXPECT_EQ("Ign:1 Example File from example.org\n" + "Ign:1 Example File from example.org\n" + "Err:1 Example File from example.org\n" + " An error test!\n" + "Ign:1 Example File from example.org\n" + " An error test!\n", out.str()); + _config->Set("Acquire::Progress::Ignore::ShowErrorText", true); + Stat.Stop(); + EXPECT_EQ("Ign:1 Example File from example.org\n" + "Ign:1 Example File from example.org\n" + "Err:1 Example File from example.org\n" + " An error test!\n" + "Ign:1 Example File from example.org\n" + " An error test!\n", out.str()); +} +TEST(AcqProgress, Pulse) +{ + std::ostringstream out; + unsigned int width = 80; + AcqTextStatus Stat(out, width, 0); + _config->Set("APT::Sandbox::User", ""); // ensure we aren't sandboxing + + pkgAcquire Acq(&Stat); + pkgAcquire::ItemDesc fetch; + fetch.URI = "http://example.org/file"; + fetch.Description = "Example File from example.org"; + fetch.ShortDesc = "Example File"; + TestItem fetchO(&Acq); + fetchO.FileSize = 100; + fetchO.Status = pkgAcquire::Item::StatFetching; + fetch.Owner = &fetchO; + + // make screen smaller and bigger again while running + EXPECT_TRUE(Stat.Pulse(&Acq)); + EXPECT_EQ("\r0% [Working]", out.str()); + width = 8; + EXPECT_TRUE(Stat.Pulse(&Acq)); + EXPECT_EQ("\r0% [Working]" + "\r " + "\r0% [Work", out.str()); + width = 80; + EXPECT_TRUE(Stat.Pulse(&Acq)); + EXPECT_EQ("\r0% [Working]" + "\r " + "\r0% [Work" + "\r0% [Working]", out.str()); +} diff --git a/test/libapt/apt-proxy-script b/test/libapt/apt-proxy-script new file mode 100755 index 0000000..41cfdc3 --- /dev/null +++ b/test/libapt/apt-proxy-script @@ -0,0 +1,9 @@ +#!/bin/sh + +if [ $1 = "http://www.debian.org:90/temp/test" ]; then + echo "http://example.com" +fi +if [ $1 = "http://www.debian.org:91/temp/test" ]; then + echo "This works" >&2 + echo "http://example.com/foo" +fi diff --git a/test/libapt/authconf_test.cc b/test/libapt/authconf_test.cc new file mode 100644 index 0000000..a7b2f2c --- /dev/null +++ b/test/libapt/authconf_test.cc @@ -0,0 +1,223 @@ +#include <config.h> + +#include <apt-pkg/fileutl.h> +#include <apt-pkg/netrc.h> +#include <apt-pkg/strutl.h> + +#include <string> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +TEST(NetRCTest, Parsing) +{ + FileFd fd; + URI U("http://file.not/open"); + EXPECT_FALSE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + EXPECT_EQ("file.not", U.Host); + EXPECT_EQ("/open", U.Path); + + createTemporaryFile("doublesignedfile", fd, nullptr, R"apt( +machine example.netter login bar password foo +machine example.net login foo password bar + +machine example.org:90 login apt password apt +machine example.org:8080 +login +example password foobar + +machine example.org +login anonymous +password pass + +machine example.com/foo login user1 unknown token password pass1 +machine example.com/bar password pass2 login user2 + unknown token +machine example.com/user login user +machine example.netter login unused password firstentry +machine example.last/debian login debian password rules)apt"); + U = URI("http://example.net/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo", U.User); + EXPECT_EQ("bar", U.Password); + EXPECT_EQ("example.net", U.Host); + EXPECT_EQ("/foo", U.Path); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://user:pass@example.net/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("user", U.User); + EXPECT_EQ("pass", U.Password); + EXPECT_EQ("example.net", U.Host); + EXPECT_EQ("/foo", U.Path); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.org:90/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("apt", U.User); + EXPECT_EQ("apt", U.Password); + EXPECT_EQ("example.org", U.Host); + EXPECT_EQ(90u, U.Port); + EXPECT_EQ("/foo", U.Path); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.org:8080/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("example", U.User); + EXPECT_EQ("foobar", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.net:42/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo", U.User); + EXPECT_EQ("bar", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.org/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("anonymous", U.User); + EXPECT_EQ("pass", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.com/apt"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.com/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("user1", U.User); + EXPECT_EQ("pass1", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.com/fooo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("user1", U.User); + EXPECT_EQ("pass1", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.com/fo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.com/bar"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("user2", U.User); + EXPECT_EQ("pass2", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.com/user"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("user", U.User); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("socks5h://example.last/debian"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("debian", U.User); + EXPECT_EQ("rules", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("socks5h://example.debian/"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("socks5h://user:pass@example.debian/"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("user", U.User); + EXPECT_EQ("pass", U.Password); +} +TEST(NetRCTest, BadFileNoMachine) +{ + FileFd fd; + createTemporaryFile("doublesignedfile", fd, nullptr, R"apt( +foo example.org login foo1 password bar +machin example.org login foo2 password bar +machine2 example.org login foo3 password bar +)apt"); + + URI U("http://example.org/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); +} +TEST(NetRCTest, BadFileEndsMachine) +{ + FileFd fd; + createTemporaryFile("doublesignedfile", fd, nullptr, R"apt( +machine example.org login foo1 password bar +machine)apt"); + + URI U("http://example.org/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo1", U.User); + EXPECT_EQ("bar", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.net/foo"); + EXPECT_FALSE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://foo:bar@example.net/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo", U.User); + EXPECT_EQ("bar", U.Password); +} +TEST(NetRCTest, BadFileEndsLogin) +{ + FileFd fd; + createTemporaryFile("doublesignedfile", fd, nullptr, R"apt( +machine example.org login foo1 password bar +machine example.net login)apt"); + + URI U("http://example.org/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo1", U.User); + EXPECT_EQ("bar", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.net/foo"); + EXPECT_FALSE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://foo:bar@example.net/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo", U.User); + EXPECT_EQ("bar", U.Password); +} +TEST(NetRCTest, BadFileEndsPassword) +{ + FileFd fd; + createTemporaryFile("doublesignedfile", fd, nullptr, R"apt( +machine example.org login foo1 password bar +machine example.net password)apt"); + + URI U("http://example.org/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo1", U.User); + EXPECT_EQ("bar", U.Password); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://example.net/foo"); + EXPECT_FALSE(MaybeAddAuth(fd, U)); + EXPECT_TRUE(U.User.empty()); + EXPECT_TRUE(U.Password.empty()); + + EXPECT_TRUE(fd.Seek(0)); + U = URI("http://foo:bar@example.net/foo"); + EXPECT_TRUE(MaybeAddAuth(fd, U)); + EXPECT_EQ("foo", U.User); + EXPECT_EQ("bar", U.Password); +} diff --git a/test/libapt/cachefilter_test.cc b/test/libapt/cachefilter_test.cc new file mode 100644 index 0000000..08812e0 --- /dev/null +++ b/test/libapt/cachefilter_test.cc @@ -0,0 +1,119 @@ +#include <config.h> + +#include <apt-pkg/cachefilter.h> +#include <apt-pkg/fileutl.h> + +#include <string> + +#include <gtest/gtest.h> + +TEST(CacheFilterTest, ArchitectureSpecification) +{ + { + SCOPED_TRACE("Pattern is *"); + // * should be treated like any + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("*"); + EXPECT_TRUE(ams("sparc")); + EXPECT_TRUE(ams("amd64")); + EXPECT_TRUE(ams("kfreebsd-amd64")); + } + { + SCOPED_TRACE("Pattern is any-i386"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("any-i386"); + EXPECT_TRUE(ams("i386")); + EXPECT_FALSE(ams("amd64")); + EXPECT_TRUE(ams("linux-i386")); + EXPECT_FALSE(ams("linux-amd64")); + EXPECT_TRUE(ams("kfreebsd-i386")); + EXPECT_TRUE(ams("musl-linux-i386")); + } + { + SCOPED_TRACE("Pattern is linux-any"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("linux-any"); + EXPECT_TRUE(ams("armhf")); + EXPECT_TRUE(ams("armel")); + EXPECT_TRUE(ams("linux-armhf")); + EXPECT_TRUE(ams("linux-armel")); + EXPECT_FALSE(ams("kfreebsd-armhf")); + EXPECT_TRUE(ams("musl-linux-armhf")); + } + if (FileExists(DPKG_DATADIR "/tupletable")) + { + SCOPED_TRACE("Pattern is gnu-any-any"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("gnu-any-any"); //really? + EXPECT_TRUE(ams("armhf")); + EXPECT_TRUE(ams("armel")); + EXPECT_TRUE(ams("linux-armhf")); + EXPECT_TRUE(ams("linux-armel")); + EXPECT_TRUE(ams("kfreebsd-armhf")); + EXPECT_FALSE(ams("musl-linux-armhf")); + } + if (FileExists(DPKG_DATADIR "/triplettable")) + { + SCOPED_TRACE("Pattern is gnueabi-any-any"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("gnueabi-any-any"); //really? + EXPECT_TRUE(ams("linux-armel")); + EXPECT_TRUE(ams("armel")); + EXPECT_FALSE(ams("armhf")); + EXPECT_FALSE(ams("linux-armhf")); + EXPECT_FALSE(ams("musleabihf-linux-armhf")); + } + if (FileExists(DPKG_DATADIR "/triplettable")) + { + SCOPED_TRACE("Pattern is gnueabihf-any-any"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("gnueabihf-any-any"); //really? + EXPECT_FALSE(ams("linux-armel")); + EXPECT_FALSE(ams("armel")); + EXPECT_TRUE(ams("armhf")); + EXPECT_TRUE(ams("linux-armhf")); + EXPECT_FALSE(ams("musleabihf-linux-armhf")); + } + + // Weird ones - armhf's tuple is actually eabihf-gnu-linux-arm + // armel's tuple is actually eabi-gnu-linux-arm + // x32's tuple is actually x32-gnu-linux-amd64 + { + SCOPED_TRACE("Architecture is armhf"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("armhf", false); + EXPECT_TRUE(ams("armhf")); + EXPECT_FALSE(ams("armel")); + EXPECT_TRUE(ams("linux-any")); + EXPECT_FALSE(ams("kfreebsd-any")); + EXPECT_TRUE(ams("any-arm")); + EXPECT_TRUE(ams("linux-armhf")); + EXPECT_FALSE(ams("kfreebsd-armhf")); + EXPECT_FALSE(ams("musl-linux-armhf")); + } + { + SCOPED_TRACE("Pattern is any-arm"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("any-arm"); + EXPECT_TRUE(ams("armhf")); + EXPECT_TRUE(ams("armel")); + EXPECT_TRUE(ams("linux-armhf")); + EXPECT_TRUE(ams("linux-armel")); + EXPECT_TRUE(ams("musl-linux-armhf")); + EXPECT_TRUE(ams("uclibc-linux-armel")); + + EXPECT_FALSE(ams("arm64")); + EXPECT_FALSE(ams("linux-arm64")); + EXPECT_FALSE(ams("kfreebsd-arm64")); + EXPECT_FALSE(ams("musl-linux-arm64")); + } + { + SCOPED_TRACE("Pattern is any-amd64"); + APT::CacheFilter::PackageArchitectureMatchesSpecification ams("any-amd64"); + EXPECT_TRUE(ams("amd64")); + EXPECT_TRUE(ams("x32")); + EXPECT_TRUE(ams("linux-amd64")); + EXPECT_TRUE(ams("linux-x32")); + EXPECT_TRUE(ams("kfreebsd-amd64")); + EXPECT_TRUE(ams("musl-linux-amd64")); + EXPECT_TRUE(ams("uclibc-linux-amd64")); + + EXPECT_FALSE(ams("i386")); + EXPECT_FALSE(ams("linux-i386")); + EXPECT_FALSE(ams("kfreebsd-i386")); + EXPECT_FALSE(ams("musl-linux-i386")); + EXPECT_FALSE(ams("uclibc-linux-i386")); + } +} diff --git a/test/libapt/cdrom_test.cc b/test/libapt/cdrom_test.cc new file mode 100644 index 0000000..b21492c --- /dev/null +++ b/test/libapt/cdrom_test.cc @@ -0,0 +1,114 @@ +#include <config.h> + +#include <apt-pkg/cdrom.h> +#include <apt-pkg/cdromutl.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/fileutl.h> + +#include <string> +#include <vector> +#include <string.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +class Cdrom : public pkgCdrom { +public: + std::vector<std::string> ReduceSourcelist(std::string CD,std::vector<std::string> List) { + pkgCdrom::ReduceSourcelist(CD, List); + return List; + } +}; + +TEST(CDROMTest,ReduceSourcelist) +{ + Cdrom cd; + std::vector<std::string> List; + std::string CD("/media/cdrom/"); + + std::vector<std::string> R = cd.ReduceSourcelist(CD, List); + EXPECT_TRUE(R.empty()); + + List.push_back(" wheezy main"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(1u, R.size()); + EXPECT_EQ(" wheezy main", R[0]); + + List.push_back(" wheezy main"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(1u, R.size()); + EXPECT_EQ(" wheezy main", R[0]); + + List.push_back(" wheezy contrib"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(1u, R.size()); + EXPECT_EQ(" wheezy contrib main", R[0]); + + List.push_back(" wheezy-update contrib"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(2u, R.size()); + EXPECT_EQ(" wheezy contrib main", R[0]); + EXPECT_EQ(" wheezy-update contrib", R[1]); + + List.push_back(" wheezy-update contrib"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(2u, R.size()); + EXPECT_EQ(" wheezy contrib main", R[0]); + EXPECT_EQ(" wheezy-update contrib", R[1]); + + List.push_back(" wheezy-update non-free"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(2u, R.size()); + EXPECT_EQ(" wheezy contrib main", R[0]); + EXPECT_EQ(" wheezy-update contrib non-free", R[1]); + + List.push_back(" wheezy-update main"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(2u, R.size()); + EXPECT_EQ(" wheezy contrib main", R[0]); + EXPECT_EQ(" wheezy-update contrib main non-free", R[1]); + + List.push_back(" wheezy non-free"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(2u, R.size()); + EXPECT_EQ(" wheezy contrib main non-free", R[0]); + EXPECT_EQ(" wheezy-update contrib main non-free", R[1]); + + List.push_back(" sid main"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(3u, R.size()); + EXPECT_EQ(" sid main", R[0]); + EXPECT_EQ(" wheezy contrib main non-free", R[1]); + EXPECT_EQ(" wheezy-update contrib main non-free", R[2]); + + List.push_back(" sid main-reduce"); + R = cd.ReduceSourcelist(CD, List); + ASSERT_EQ(3u, R.size()); + EXPECT_EQ(" sid main main-reduce", R[0]); + EXPECT_EQ(" wheezy contrib main non-free", R[1]); + EXPECT_EQ(" wheezy-update contrib main non-free", R[2]); +} +TEST(CDROMTest, FindMountPointForDevice) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("mountpoints", fd, &tempfile, + "rootfs / rootfs rw 0 0\n" + "sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0\n" + "sysfs0 /sys0 sysfs rw,nosuid,nodev,noexec,relatime 0 0\n" + "/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21 / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0\n" + "/dev/sda1 /boot/efi vfat rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro 0 0\n" + "tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0\n"); + _config->Set("Dir::state::Mountpoints", tempfile); + + EXPECT_EQ("/", FindMountPointForDevice("rootfs")); + EXPECT_EQ("/", FindMountPointForDevice("/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21")); + EXPECT_EQ("/sys", FindMountPointForDevice("sysfs")); + EXPECT_EQ("/sys0", FindMountPointForDevice("sysfs0")); + EXPECT_EQ("/boot/efi", FindMountPointForDevice("/dev/sda1")); + EXPECT_EQ("/tmp", FindMountPointForDevice("tmpfs")); + + if (tempfile.empty() == false) + unlink(tempfile.c_str()); +} diff --git a/test/libapt/cdromfindpackages_test.cc b/test/libapt/cdromfindpackages_test.cc new file mode 100644 index 0000000..cffa7aa --- /dev/null +++ b/test/libapt/cdromfindpackages_test.cc @@ -0,0 +1,125 @@ +#include <config.h> + +#include <apt-pkg/cdrom.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> + +#include <algorithm> +#include <iostream> +#include <string> +#include <vector> +#include <stddef.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +class Cdrom : public pkgCdrom { + public: + bool FindPackages(std::string const &CD, + std::vector<std::string> &List, + std::vector<std::string> &SList, + std::vector<std::string> &SigList, + std::vector<std::string> &TransList, + std::string &InfoDir) { + std::string const startdir = SafeGetCWD(); + EXPECT_FALSE(startdir.empty()); + EXPECT_TRUE(InfoDir.empty()); + bool const result = pkgCdrom::FindPackages(CD, List, SList, SigList, TransList, InfoDir, NULL, 0); + EXPECT_FALSE(InfoDir.empty()); + std::sort(List.begin(), List.end()); + std::sort(SList.begin(), SList.end()); + std::sort(SigList.begin(), SigList.end()); + std::sort(TransList.begin(), TransList.end()); + EXPECT_EQ(0, chdir(startdir.c_str())); + return result; + } + + using pkgCdrom::DropRepeats; +}; + +TEST(CDROMTest,FindPackages) +{ + std::string path; + createTemporaryDirectory("findpackage", path); + + createDirectory(path, ".disk"); + createDirectory(path, "pool"); + createDirectory(path, "dists/stable/main/binary-i386"); + createDirectory(path, "dists/stable/main/source"); + createDirectory(path, "dists/stable/contrib/binary-amd64"); + createDirectory(path, "dists/stable/non-free/binary-all"); + createDirectory(path, "dists/unstable/main/binary-i386"); + createDirectory(path, "dists/unstable/main/i18n"); + createDirectory(path, "dists/unstable/main/source"); + createDirectory(path, "dists/broken/non-free/source"); + createFile(path, "dists/broken/.aptignr"); + createFile(path, "dists/stable/main/binary-i386/Packages"); + createFile(path, "dists/stable/main/binary-i386/Packages.bz2"); + createFile(path, "dists/stable/main/source/Sources.xz"); + createFile(path, "dists/stable/contrib/binary-amd64/Packages"); + createFile(path, "dists/stable/contrib/binary-amd64/Packages.gz"); + createFile(path, "dists/stable/non-free/binary-all/Packages"); + createFile(path, "dists/unstable/main/binary-i386/Packages.xz"); + createFile(path, "dists/unstable/main/binary-i386/Packages.lzma"); + createFile(path, "dists/unstable/main/i18n/Translation-en"); + createFile(path, "dists/unstable/main/i18n/Translation-de.bz2"); + createFile(path, "dists/unstable/main/source/Sources.xz"); + createFile(path, "dists/broken/non-free/source/Sources.gz"); + createFile(path, "dists/stable/Release.gpg"); + createFile(path, "dists/stable/Release"); + createFile(path, "dists/unstable/InRelease"); + createFile(path, "dists/broken/Release.gpg"); + createLink(path, "dists/unstable", "dists/sid"); + + Cdrom cd; + std::vector<std::string> Packages, Sources, Signatur, Translation; + std::string InfoDir; + EXPECT_TRUE(cd.FindPackages(path, Packages, Sources, Signatur, Translation, InfoDir)); + EXPECT_EQ(5u, Packages.size()); + EXPECT_EQ(path + "/dists/sid/main/binary-i386/", Packages[0]); + EXPECT_EQ(path + "/dists/stable/contrib/binary-amd64/", Packages[1]); + EXPECT_EQ(path + "/dists/stable/main/binary-i386/", Packages[2]); + EXPECT_EQ(path + "/dists/stable/non-free/binary-all/", Packages[3]); + EXPECT_EQ(path + "/dists/unstable/main/binary-i386/", Packages[4]); + EXPECT_EQ(3u, Sources.size()); + EXPECT_EQ(path + "/dists/sid/main/source/", Sources[0]); + EXPECT_EQ(path + "/dists/stable/main/source/", Sources[1]); + EXPECT_EQ(path + "/dists/unstable/main/source/", Sources[2]); + EXPECT_EQ(3u, Signatur.size()); + EXPECT_EQ(path + "/dists/sid/", Signatur[0]); + EXPECT_EQ(path + "/dists/stable/", Signatur[1]); + EXPECT_EQ(path + "/dists/unstable/", Signatur[2]); + EXPECT_EQ(4u, Translation.size()); + EXPECT_EQ(path + "/dists/sid/main/i18n/Translation-de", Translation[0]); + EXPECT_EQ(path + "/dists/sid/main/i18n/Translation-en", Translation[1]); + EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-de", Translation[2]); + EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-en", Translation[3]); + EXPECT_EQ(path + "/.disk/", InfoDir); + + cd.DropRepeats(Packages, "Packages"); + cd.DropRepeats(Sources, "Sources"); + _error->PushToStack(); + cd.DropRepeats(Signatur, "InRelease"); + cd.DropRepeats(Signatur, "Release.gpg"); + _error->RevertToStack(); + _error->DumpErrors(); + cd.DropRepeats(Translation, ""); + + EXPECT_EQ(4u, Packages.size()); + EXPECT_EQ(path + "/dists/stable/contrib/binary-amd64/", Packages[0]); + EXPECT_EQ(path + "/dists/stable/main/binary-i386/", Packages[1]); + EXPECT_EQ(path + "/dists/stable/non-free/binary-all/", Packages[2]); + EXPECT_EQ(path + "/dists/unstable/main/binary-i386/", Packages[3]); + EXPECT_EQ(2u, Sources.size()); + EXPECT_EQ(path + "/dists/stable/main/source/", Sources[0]); + EXPECT_EQ(path + "/dists/unstable/main/source/", Sources[1]); + EXPECT_EQ(2u, Signatur.size()); + EXPECT_EQ(path + "/dists/stable/", Signatur[0]); + EXPECT_EQ(path + "/dists/unstable/", Signatur[1]); + EXPECT_EQ(2u, Translation.size()); + EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-de", Translation[0]); + EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-en", Translation[1]); + + removeDirectory(path); +} diff --git a/test/libapt/commandline_test.cc b/test/libapt/commandline_test.cc new file mode 100644 index 0000000..cde80b4 --- /dev/null +++ b/test/libapt/commandline_test.cc @@ -0,0 +1,238 @@ +#include <config.h> + +#include <apt-pkg/cmndline.h> +#include <apt-pkg/configuration.h> +#include <apt-private/private-cmndline.h> + +#include <gtest/gtest.h> + +class CLT: public CommandLine { + public: + std::string static AsString(const char * const * const argv, + unsigned int const argc) { + std::string const static conf = "Commandline::AsString"; + _config->Clear(conf); + SaveInConfig(argc, argv); + return _config->Find(conf); + } +}; + +TEST(CommandLineTest,SaveInConfig) +{ +#define APT_EXPECT_CMD(x, ...) { const char * const argv[] = { __VA_ARGS__ }; EXPECT_EQ(x, CLT::AsString(argv, sizeof(argv)/sizeof(argv[0]))); } + APT_EXPECT_CMD("apt-get install -sf", + "apt-get", "install", "-sf"); + APT_EXPECT_CMD("apt-cache -s apt -so Debug::test=Test", + "apt-cache", "-s", "apt", "-so", "Debug::test=Test"); + APT_EXPECT_CMD("apt-cache -s apt -so Debug::test='Das ist ein Test'", + "apt-cache", "-s", "apt", "-so", "Debug::test=Das ist ein Test"); + APT_EXPECT_CMD("apt-cache -s apt -so Debug::test='Das ist ein Test'", + "apt-cache", "-s", "apt", "-so", "Debug::test=\"Das ist ein Test\""); + APT_EXPECT_CMD("apt-cache -s apt -so Debug::test='Das ist ein Test' foo", + "apt-cache", "-s", "apt", "-so", "\"Debug::test=Das ist ein Test\"", "foo"); + APT_EXPECT_CMD("apt-cache -s apt -so Debug::test='Das ist ein Test' foo", + "apt-cache", "-s", "apt", "-so", "\'Debug::test=Das ist ein Test\'", "foo"); + APT_EXPECT_CMD("apt-cache -s apt -so Debug::test='That is crazy!' foo", + "apt-cache", "-s", "apt", "-so", "\'Debug::test=That \ris\n crazy!\'", "foo"); + APT_EXPECT_CMD("apt-cache -s apt --hallo test=1.0", + "apt-cache", "-s", "apt", "--hallo", "test=1.0"); +#undef APT_EXPECT_CMD +} +TEST(CommandLineTest,Parsing) +{ + CommandLine::Args Args[] = { + { 't', 0, "Test::Worked", 0 }, + { 'T', "testing", "Test::Worked", CommandLine::HasArg }, + { 'z', "zero", "Test::Zero", 0 }, + { 'o', "option", 0, CommandLine::ArbItem }, + {0,0,0,0} + }; + ::Configuration c; + CommandLine CmdL(Args, &c); + + char const * argv[] = { "test", "--zero", "-t" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.FindB("Test::Worked", false)); + EXPECT_TRUE(c.FindB("Test::Zero", false)); + + c.Clear("Test"); + EXPECT_FALSE(c.FindB("Test::Worked", false)); + EXPECT_FALSE(c.FindB("Test::Zero", false)); + + c.Set("Test::Zero", true); + EXPECT_TRUE(c.FindB("Test::Zero", false)); + + char const * argv2[] = { "test", "--no-zero", "-t" }; + CmdL.Parse(3 , argv2); + EXPECT_TRUE(c.FindB("Test::Worked", false)); + EXPECT_FALSE(c.FindB("Test::Zero", false)); + + c.Clear("Test"); + { + char const * argv[] = { "test", "-T", "yes" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.FindB("Test::Worked", false)); + EXPECT_EQ("yes", c.Find("Test::Worked", "no")); + EXPECT_EQ(0u, CmdL.FileSize()); + } + c.Clear("Test"); + { + char const * argv[] = { "test", "-T=yes" }; + CmdL.Parse(2 , argv); + EXPECT_TRUE(c.Exists("Test::Worked")); + EXPECT_EQ("yes", c.Find("Test::Worked", "no")); + EXPECT_EQ(0u, CmdL.FileSize()); + } + c.Clear("Test"); + { + char const * argv[] = { "test", "-T=", "yes" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.Exists("Test::Worked")); + EXPECT_EQ("no", c.Find("Test::Worked", "no")); + EXPECT_EQ(1u, CmdL.FileSize()); + } + + c.Clear("Test"); + { + char const * argv[] = { "test", "--testing", "yes" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.FindB("Test::Worked", false)); + EXPECT_EQ("yes", c.Find("Test::Worked", "no")); + EXPECT_EQ(0u, CmdL.FileSize()); + } + c.Clear("Test"); + { + char const * argv[] = { "test", "--testing=yes" }; + CmdL.Parse(2 , argv); + EXPECT_TRUE(c.Exists("Test::Worked")); + EXPECT_EQ("yes", c.Find("Test::Worked", "no")); + EXPECT_EQ(0u, CmdL.FileSize()); + } + c.Clear("Test"); + { + char const * argv[] = { "test", "--testing=", "yes" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.Exists("Test::Worked")); + EXPECT_EQ("no", c.Find("Test::Worked", "no")); + EXPECT_EQ(1u, CmdL.FileSize()); + } + + c.Clear("Test"); + { + char const * argv[] = { "test", "-o", "test::worked=yes" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.FindB("Test::Worked", false)); + EXPECT_EQ("yes", c.Find("Test::Worked", "no")); + } + c.Clear("Test"); + { + char const * argv[] = { "test", "-o", "test::worked=" }; + CmdL.Parse(3 , argv); + EXPECT_TRUE(c.Exists("Test::Worked")); + EXPECT_EQ("no", c.Find("Test::Worked", "no")); + } + c.Clear("Test"); + { + char const * argv[] = { "test", "-o", "test::worked=", "yes" }; + CmdL.Parse(4 , argv); + EXPECT_TRUE(c.Exists("Test::Worked")); + EXPECT_EQ("no", c.Find("Test::Worked", "no")); + } + c.Clear("Test"); +} + +TEST(CommandLineTest, BoolParsing) +{ + CommandLine::Args Args[] = { + { 't', 0, "Test::Worked", 0 }, + {0,0,0,0} + }; + ::Configuration c; + CommandLine CmdL(Args, &c); + + // the commandline parser used to use strtol() on the argument + // to check if the argument is a boolean expression - that + // stopped after the "0". this test ensures that we always check + // that the entire string was consumed by strtol + { + char const * argv[] = { "show", "-t", "0ad" }; + bool res = CmdL.Parse(sizeof(argv)/sizeof(char*), argv); + EXPECT_TRUE(res); + ASSERT_EQ(std::string(CmdL.FileList[0]), "0ad"); + } + + { + char const * argv[] = { "show", "-t", "0", "ad" }; + bool res = CmdL.Parse(sizeof(argv)/sizeof(char*), argv); + EXPECT_TRUE(res); + ASSERT_EQ(std::string(CmdL.FileList[0]), "ad"); + } + +} + +static bool DoVoid(CommandLine &) { return false; } + +TEST(CommandLineTest,GetCommand) +{ + CommandLine::Dispatch Cmds[] = { {"install",&DoVoid}, {"remove", &DoVoid}, {0,0} }; + { + char const * argv[] = { "apt-get", "-t", "unstable", "remove", "-d", "foo" }; + char const * com = CommandLine::GetCommand(Cmds, sizeof(argv)/sizeof(argv[0]), argv); + EXPECT_STREQ("remove", com); + std::vector<CommandLine::Args> Args = getCommandArgs(APT_CMD::APT_GET, com); + ::Configuration c; + CommandLine CmdL(Args.data(), &c); + ASSERT_TRUE(CmdL.Parse(sizeof(argv)/sizeof(argv[0]), argv)); + EXPECT_EQ(c.Find("APT::Default-Release"), "unstable"); + EXPECT_TRUE(c.FindB("APT::Get::Download-Only")); + ASSERT_EQ(2u, CmdL.FileSize()); + EXPECT_EQ(std::string(CmdL.FileList[0]), "remove"); + EXPECT_EQ(std::string(CmdL.FileList[1]), "foo"); + } + { + char const * argv[] = {"apt-get", "-t", "unstable", "remove", "--", "-d", "foo" }; + char const * com = CommandLine::GetCommand(Cmds, sizeof(argv)/sizeof(argv[0]), argv); + EXPECT_STREQ("remove", com); + std::vector<CommandLine::Args> Args = getCommandArgs(APT_CMD::APT_GET, com); + ::Configuration c; + CommandLine CmdL(Args.data(), &c); + ASSERT_TRUE(CmdL.Parse(sizeof(argv)/sizeof(argv[0]), argv)); + EXPECT_EQ(c.Find("APT::Default-Release"), "unstable"); + EXPECT_FALSE(c.FindB("APT::Get::Download-Only")); + ASSERT_EQ(3u, CmdL.FileSize()); + EXPECT_EQ(std::string(CmdL.FileList[0]), "remove"); + EXPECT_EQ(std::string(CmdL.FileList[1]), "-d"); + EXPECT_EQ(std::string(CmdL.FileList[2]), "foo"); + } + { + char const * argv[] = {"apt-get", "-t", "unstable", "--", "remove", "-d", "foo" }; + char const * com = CommandLine::GetCommand(Cmds, sizeof(argv)/sizeof(argv[0]), argv); + EXPECT_STREQ("remove", com); + std::vector<CommandLine::Args> Args = getCommandArgs(APT_CMD::APT_GET, com); + ::Configuration c; + CommandLine CmdL(Args.data(), &c); + ASSERT_TRUE(CmdL.Parse(sizeof(argv)/sizeof(argv[0]), argv)); + EXPECT_EQ(c.Find("APT::Default-Release"), "unstable"); + EXPECT_FALSE(c.FindB("APT::Get::Download-Only")); + ASSERT_EQ(3u, CmdL.FileSize()); + EXPECT_EQ(std::string(CmdL.FileList[0]), "remove"); + EXPECT_EQ(std::string(CmdL.FileList[1]), "-d"); + EXPECT_EQ(std::string(CmdL.FileList[2]), "foo"); + } + { + char const * argv[] = {"apt-get", "install", "-t", "unstable", "--", "remove", "-d", "foo" }; + char const * com = CommandLine::GetCommand(Cmds, sizeof(argv)/sizeof(argv[0]), argv); + EXPECT_STREQ("install", com); + std::vector<CommandLine::Args> Args = getCommandArgs(APT_CMD::APT_GET, com); + ::Configuration c; + CommandLine CmdL(Args.data(), &c); + ASSERT_TRUE(CmdL.Parse(sizeof(argv)/sizeof(argv[0]), argv)); + EXPECT_EQ(c.Find("APT::Default-Release"), "unstable"); + EXPECT_FALSE(c.FindB("APT::Get::Download-Only")); + ASSERT_EQ(4u, CmdL.FileSize()); + EXPECT_EQ(std::string(CmdL.FileList[0]), "install"); + EXPECT_EQ(std::string(CmdL.FileList[1]), "remove"); + EXPECT_EQ(std::string(CmdL.FileList[2]), "-d"); + EXPECT_EQ(std::string(CmdL.FileList[3]), "foo"); + } +} diff --git a/test/libapt/compareversion_test.cc b/test/libapt/compareversion_test.cc new file mode 100644 index 0000000..0129322 --- /dev/null +++ b/test/libapt/compareversion_test.cc @@ -0,0 +1,182 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +/* ###################################################################### + + Version Test - Simple program to run through a file and comare versions. + + Each version is compared and the result is checked against an expected + result in the file. The format of the file is + a b Res + Where Res is -1, 1, 0. dpkg -D=1 --compare-versions a "<" b can be + used to determine what Res should be. # at the start of the line + is a comment and blank lines are skipped + + The runner will also call dpkg --compare-versions to check if APT and + dpkg have (still) the same idea. + + ##################################################################### */ + /*}}}*/ +#include <config.h> + +#include <apt-pkg/debversion.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> + +#include <fstream> +#include <string> +#include <stdlib.h> +#include <sys/wait.h> +#include <unistd.h> + +#include <gtest/gtest.h> + +using namespace std; + +static bool callDPKG(const char * const val, const char * const ref, char const * const op) { + pid_t Process = ExecFork(); + if (Process == 0) + { + const char * args[] = { + "dpkg", + "--compare-versions", + val, + op, + ref, + nullptr + }; + execvp(args[0], (char**) args); + exit(1); + } + int Ret; + waitpid(Process, &Ret, 0); + EXPECT_TRUE(WIFEXITED(Ret)); + return WEXITSTATUS(Ret) == 0; +} + + +#define EXPECT_VERSION_PART(A, compare, B) \ +{ \ + int Res = debVS.CmpVersion(A, B); \ + Res = (Res < 0) ? -1 : ( (Res > 0) ? 1 : Res); \ + EXPECT_EQ(compare, Res) << "APT: A: »" << A << "« B: »" << B << "«"; \ + EXPECT_PRED3(callDPKG, A, B, ((compare == 1) ? ">>" : ( (compare == 0) ? "=" : "<<"))); \ +} +#define EXPECT_VERSION(A, compare, B) \ + EXPECT_VERSION_PART(A, compare, B); \ + EXPECT_VERSION_PART(B, compare * -1, A) + +// History-Remark: The versions used to be specified in a versions.lst file + +enum CompareVersionType { LESS = -1, GREATER = 1, EQUAL = 0 }; + +TEST(CompareVersionTest,Basic) +{ + EXPECT_VERSION("7.6p2-4", GREATER, "7.6-0"); + EXPECT_VERSION("1.0.3-3", GREATER, "1.0-1"); + EXPECT_VERSION("1.3", GREATER, "1.2.2-2"); + EXPECT_VERSION("1.3", GREATER, "1.2.2"); + + /* disabled as dpkg doesn't like them… (versions have to start with a number) + EXPECT_VERSION("-", LESS, "."); + EXPECT_VERSION("p", LESS, "-"); + EXPECT_VERSION("a", LESS, "-"); + EXPECT_VERSION("z", LESS, "-"); + EXPECT_VERSION("a", LESS, "."); + EXPECT_VERSION("z", LESS, "."); + // */ + + /* disabled as dpkg doesn't like them… (versions have to start with a number) + EXPECT_VERSION("III-alpha9.8", LESS, "III-alpha9.8-1.5"); + // */ + + // Test some properties of text strings + EXPECT_VERSION("0-pre", EQUAL, "0-pre"); + EXPECT_VERSION("0-pre", LESS, "0-pree"); + + EXPECT_VERSION("1.1.6r2-2", GREATER, "1.1.6r-1"); + EXPECT_VERSION("2.6b2-1", GREATER, "2.6b-2"); + + EXPECT_VERSION("98.1p5-1", LESS, "98.1-pre2-b6-2"); + EXPECT_VERSION("0.4a6-2", GREATER, "0.4-1"); + + EXPECT_VERSION("1:3.0.5-2", LESS, "1:3.0.5.1"); +} +TEST(CompareVersionTest,Epochs) +{ + EXPECT_VERSION("1:0.4", GREATER, "10.3"); + EXPECT_VERSION("1:1.25-4", LESS, "1:1.25-8"); + EXPECT_VERSION("0:1.18.36", EQUAL, "1.18.36"); + + EXPECT_VERSION("1.18.36", GREATER, "1.18.35"); + EXPECT_VERSION("0:1.18.36", GREATER, "1.18.35"); +} +TEST(CompareVersionTest,Strangeness) +{ + // Funky, but allowed, characters in upstream version + EXPECT_VERSION("9:1.18.36:5.4-20", LESS, "10:0.5.1-22"); + EXPECT_VERSION("9:1.18.36:5.4-20", LESS, "9:1.18.36:5.5-1"); + EXPECT_VERSION("9:1.18.36:5.4-20", LESS, " 9:1.18.37:4.3-22"); + EXPECT_VERSION("1.18.36-0.17.35-18", GREATER, "1.18.36-19"); + + // Junk + EXPECT_VERSION("1:1.2.13-3", LESS, "1:1.2.13-3.1"); + EXPECT_VERSION("2.0.7pre1-4", LESS, "2.0.7r-1"); + + // if a version includes a dash, it should be the debrev dash - policy says so… + EXPECT_VERSION("0:0-0-0", GREATER, "0-0"); + + // do we like strange versions? Yes we like strange versions… + EXPECT_VERSION("0", EQUAL, "0"); + EXPECT_VERSION("0", EQUAL, "00"); +} +TEST(CompareVersionTest,DebianBug) +{ + // #205960 + EXPECT_VERSION("3.0~rc1-1", LESS, "3.0-1"); + // #573592 - debian policy 5.6.12 + EXPECT_VERSION("1.0", EQUAL, "1.0-0"); + EXPECT_VERSION("0.2", LESS, "1.0-0"); + EXPECT_VERSION("1.0", LESS, "1.0-0+b1"); + EXPECT_VERSION("1.0", GREATER, "1.0-0~"); +} +TEST(CompareVersionTest,CuptTests) +{ + // "steal" the testcases from (old perl) cupt + EXPECT_VERSION("1.2.3", EQUAL, "1.2.3"); // identical + EXPECT_VERSION("4.4.3-2", EQUAL, "4.4.3-2"); // identical + EXPECT_VERSION("1:2ab:5", EQUAL, "1:2ab:5"); // this is correct... + EXPECT_VERSION("7:1-a:b-5", EQUAL, "7:1-a:b-5"); // and this + EXPECT_VERSION("57:1.2.3abYZ+~-4-5", EQUAL, "57:1.2.3abYZ+~-4-5"); // and those too + EXPECT_VERSION("1.2.3", EQUAL, "0:1.2.3"); // zero epoch + EXPECT_VERSION("1.2.3", EQUAL, "1.2.3-0"); // zero revision + EXPECT_VERSION("009", EQUAL, "9"); // zeroes… + EXPECT_VERSION("009ab5", EQUAL, "9ab5"); // there as well + EXPECT_VERSION("1.2.3", LESS, "1.2.3-1"); // added non-zero revision + EXPECT_VERSION("1.2.3", LESS, "1.2.4"); // just bigger + EXPECT_VERSION("1.2.4", GREATER, "1.2.3"); // order doesn't matter + EXPECT_VERSION("1.2.24", GREATER, "1.2.3"); // bigger, eh? + EXPECT_VERSION("0.10.0", GREATER, "0.8.7"); // bigger, eh? + EXPECT_VERSION("3.2", GREATER, "2.3"); // major number rocks + EXPECT_VERSION("1.3.2a", GREATER, "1.3.2"); // letters rock + EXPECT_VERSION("0.5.0~git", LESS, "0.5.0~git2"); // numbers rock + EXPECT_VERSION("2a", LESS, "21"); // but not in all places + EXPECT_VERSION("1.3.2a", LESS, "1.3.2b"); // but there is another letter + EXPECT_VERSION("1:1.2.3", GREATER, "1.2.4"); // epoch rocks + EXPECT_VERSION("1:1.2.3", LESS, "1:1.2.4"); // bigger anyway + EXPECT_VERSION("1.2a+~bCd3", LESS, "1.2a++"); // tilde doesn't rock + EXPECT_VERSION("1.2a+~bCd3", GREATER, "1.2a+~"); // but first is longer! + EXPECT_VERSION("5:2", GREATER, "304-2"); // epoch rocks + EXPECT_VERSION("5:2", LESS, "304:2"); // so big epoch? + EXPECT_VERSION("25:2", GREATER, "3:2"); // 25 > 3, obviously + EXPECT_VERSION("1:2:123", LESS, "1:12:3"); // 12 > 2 + EXPECT_VERSION("1.2-5", LESS, "1.2-3-5"); // 1.2 < 1.2-3 + EXPECT_VERSION("5.10.0", GREATER, "5.005"); // preceding zeroes don't matters + EXPECT_VERSION("3a9.8", LESS, "3.10.2"); // letters are before all letter symbols + EXPECT_VERSION("3a9.8", GREATER, "3~10"); // but after the tilde + EXPECT_VERSION("1.4+OOo3.0.0~", LESS, "1.4+OOo3.0.0-4"); // another tilde check + EXPECT_VERSION("2.4.7-1", LESS, "2.4.7-z"); // revision comparing + EXPECT_VERSION("1.002-1+b2", GREATER, "1.00"); // whatever... + /* disabled as dpkg doesn't like them… (versions with illegal char) + EXPECT_VERSION("2.2.4-47978_Debian_lenny", EQUAL, "2.2.4-47978_Debian_lenny"); // and underscore... + // */ +} diff --git a/test/libapt/configuration_test.cc b/test/libapt/configuration_test.cc new file mode 100644 index 0000000..8d6c404 --- /dev/null +++ b/test/libapt/configuration_test.cc @@ -0,0 +1,234 @@ +#include <config.h> + +#include <apt-pkg/configuration.h> +#include <apt-pkg/fileutl.h> + +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +TEST(ConfigurationTest,Lists) +{ + Configuration Cnf; + + Cnf.Set("APT::Keep-Fds::",28); + Cnf.Set("APT::Keep-Fds::",17); + Cnf.Set("APT::Keep-Fds::2",47); + Cnf.Set("APT::Keep-Fds::","broken"); + std::vector<std::string> fds = Cnf.FindVector("APT::Keep-Fds"); + ASSERT_EQ(4u, fds.size()); + EXPECT_EQ("28", fds[0]); + EXPECT_EQ("17", fds[1]); + EXPECT_EQ("47", fds[2]); + EXPECT_EQ("broken", fds[3]); + + EXPECT_TRUE(Cnf.Exists("APT::Keep-Fds::2")); + EXPECT_EQ("47", Cnf.Find("APT::Keep-Fds::2")); + EXPECT_EQ(47, Cnf.FindI("APT::Keep-Fds::2")); + EXPECT_FALSE(Cnf.Exists("APT::Keep-Fds::3")); + EXPECT_EQ("", Cnf.Find("APT::Keep-Fds::3")); + EXPECT_EQ(56, Cnf.FindI("APT::Keep-Fds::3", 56)); + EXPECT_EQ("not-set", Cnf.Find("APT::Keep-Fds::3", "not-set")); + + Cnf.Clear("APT::Keep-Fds::2"); + EXPECT_TRUE(Cnf.Exists("APT::Keep-Fds::2")); + fds = Cnf.FindVector("APT::Keep-Fds"); + ASSERT_EQ(4u, fds.size()); + EXPECT_EQ("28", fds[0]); + EXPECT_EQ("17", fds[1]); + EXPECT_EQ("", fds[2]); + EXPECT_EQ("broken", fds[3]); + + Cnf.Clear("APT::Keep-Fds",28); + fds = Cnf.FindVector("APT::Keep-Fds"); + ASSERT_EQ(3u, fds.size()); + EXPECT_EQ("17", fds[0]); + EXPECT_EQ("", fds[1]); + EXPECT_EQ("broken", fds[2]); + + Cnf.Clear("APT::Keep-Fds",""); + EXPECT_FALSE(Cnf.Exists("APT::Keep-Fds::2")); + + Cnf.Clear("APT::Keep-Fds",17); + Cnf.Clear("APT::Keep-Fds","broken"); + fds = Cnf.FindVector("APT::Keep-Fds"); + EXPECT_TRUE(fds.empty()); + + Cnf.Set("APT::Keep-Fds::",21); + Cnf.Set("APT::Keep-Fds::",42); + fds = Cnf.FindVector("APT::Keep-Fds"); + ASSERT_EQ(2u, fds.size()); + EXPECT_EQ("21", fds[0]); + EXPECT_EQ("42", fds[1]); + + Cnf.Clear("APT::Keep-Fds"); + fds = Cnf.FindVector("APT::Keep-Fds"); + EXPECT_TRUE(fds.empty()); +} +TEST(ConfigurationTest,Integers) +{ + Configuration Cnf; + + Cnf.CndSet("APT::Version", 42); + Cnf.CndSet("APT::Version", "66"); + EXPECT_EQ("42", Cnf.Find("APT::Version")); + EXPECT_EQ(42, Cnf.FindI("APT::Version")); + EXPECT_EQ("42", Cnf.Find("APT::Version", "33")); + EXPECT_EQ(42, Cnf.FindI("APT::Version", 33)); + EXPECT_EQ("33", Cnf.Find("APT2::Version", "33")); + EXPECT_EQ(33, Cnf.FindI("APT2::Version", 33)); +} +TEST(ConfigurationTest,DirsAndFiles) +{ + Configuration Cnf; + + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + EXPECT_EQ("", Cnf.FindFile("Dir::Aptitude::State")); + Cnf.Set("Dir", "/srv/sid"); + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + Cnf.Set("Dir::State", "var/lib/apt"); + Cnf.Set("Dir::Aptitude::State", "var/lib/aptitude"); + EXPECT_EQ("/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State")); + + Cnf.Set("RootDir", "/"); + EXPECT_EQ("/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State")); + Cnf.Set("RootDir", "//./////.////"); + EXPECT_EQ("/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State")); + Cnf.Set("RootDir", "/rootdir"); + EXPECT_EQ("/rootdir/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/rootdir/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State")); + Cnf.Set("RootDir", "/rootdir/"); + EXPECT_EQ("/rootdir/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/rootdir/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State")); + + Cnf.Set("Dir::State", "/dev/null"); + Cnf.Set("Dir::State::lists", "lists/"); + EXPECT_EQ("/rootdir/dev/null", Cnf.FindDir("Dir::State")); + EXPECT_EQ("/rootdir/dev/null", Cnf.FindDir("Dir::State::lists")); +} +TEST(ConfigurationTest,DevNullInPaths) +{ + Configuration Cnf; + EXPECT_EQ("", Cnf.FindFile("Dir")); + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + EXPECT_EQ("", Cnf.FindFile("Dir::State::status")); + Cnf.Set("Dir::State", "/dev/null"); + EXPECT_EQ("/dev/null", Cnf.FindFile("Dir::State")); + Cnf.Set("Dir", "/"); + Cnf.Set("Dir::State::status", "status"); + EXPECT_EQ("/dev/null", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/dev/null", Cnf.FindFile("Dir::State::status")); + Cnf.Set("Dir::State", ""); + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/status", Cnf.FindFile("Dir::State::status")); + Cnf.Set("Dir", "/dev/null"); + EXPECT_EQ("/dev/null", Cnf.FindFile("Dir")); + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/dev/null", Cnf.FindFile("Dir::State::status")); + Cnf.Set("Dir", "/rootdir"); + EXPECT_EQ("/rootdir", Cnf.FindFile("Dir")); + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/rootdir/status", Cnf.FindFile("Dir::State::status")); + Cnf.Set("Dir::State::status", "/foo/status"); + EXPECT_EQ("/rootdir", Cnf.FindFile("Dir")); + EXPECT_EQ("", Cnf.FindFile("Dir::State")); + EXPECT_EQ("/foo/status", Cnf.FindFile("Dir::State::status")); +} +TEST(ConfigurationTest,Vector) +{ + Configuration Cnf; + + std::vector<std::string> vec = Cnf.FindVector("Test::Vector", ""); + EXPECT_EQ(0u, vec.size()); + vec = Cnf.FindVector("Test::Vector", "foo"); + ASSERT_EQ(1u, vec.size()); + EXPECT_EQ("foo", vec[0]); + vec = Cnf.FindVector("Test::Vector", "foo,bar"); + EXPECT_EQ(2u, vec.size()); + EXPECT_EQ("foo", vec[0]); + EXPECT_EQ("bar", vec[1]); + Cnf.Set("Test::Vector::", "baz"); + Cnf.Set("Test::Vector::", "bob"); + Cnf.Set("Test::Vector::", "dob"); + vec = Cnf.FindVector("Test::Vector"); + ASSERT_EQ(3u, vec.size()); + EXPECT_EQ("baz", vec[0]); + EXPECT_EQ("bob", vec[1]); + EXPECT_EQ("dob", vec[2]); + vec = Cnf.FindVector("Test::Vector", "foo,bar"); + ASSERT_EQ(3u, vec.size()); + EXPECT_EQ("baz", vec[0]); + EXPECT_EQ("bob", vec[1]); + EXPECT_EQ("dob", vec[2]); + Cnf.Set("Test::Vector", "abel,bravo"); + vec = Cnf.FindVector("Test::Vector", "foo,bar"); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("abel", vec[0]); + EXPECT_EQ("bravo", vec[1]); +} +TEST(ConfigurationTest,Merge) +{ + Configuration Cnf; + Cnf.Set("Binary::apt::option::foo", "bar"); + Cnf.Set("Binary::apt::option::empty", ""); + Cnf.Set("option::foo", "foo"); + + Cnf.MoveSubTree("Binary::apt", "Binary::apt2"); + EXPECT_FALSE(Cnf.Exists("Binary::apt::option")); + EXPECT_TRUE(Cnf.Exists("option")); + EXPECT_EQ("foo", Cnf.Find("option::foo")); + EXPECT_EQ("bar", Cnf.Find("Binary::apt2::option::foo")); + + EXPECT_FALSE(Cnf.Exists("option::empty")); + EXPECT_TRUE(Cnf.Exists("Binary::apt2::option::empty")); + Cnf.Set("option::empty", "not"); + + Cnf.MoveSubTree("Binary::apt2", NULL); + EXPECT_FALSE(Cnf.Exists("Binary::apt2::option")); + EXPECT_TRUE(Cnf.Exists("option")); + EXPECT_EQ("bar", Cnf.Find("option::foo")); + EXPECT_EQ("", Cnf.Find("option::empty")); +} +TEST(ConfigurationTest, Parsing) +{ + Configuration Cnf; + std::string tempfile; + FileFd fd; + createTemporaryFile("doublesignedfile", fd, &tempfile, R"apt( +SimpleOption "true"; +/* SimpleOption "false"; */ +Answer::Simple "42"; +# This is a comment +List::Option { "In"; "One"; "Line"; }; +// this a comment as well +List::Option2 { "Multi"; +"Line"; # inline comment + "Options"; +}; Trailing "true"; +/* Commented::Out "true"; */ +)apt"); + EXPECT_TRUE(ReadConfigFile(Cnf, tempfile)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(Cnf.FindB("SimpleOption")); + EXPECT_EQ(42, Cnf.FindI("Answer::Simple")); + EXPECT_TRUE(Cnf.Exists("List::Option")); + auto const singleline = Cnf.FindVector("List::Option"); + EXPECT_EQ(3u, singleline.size()); + EXPECT_EQ("In", singleline[0]); + EXPECT_EQ("One", singleline[1]); + EXPECT_EQ("Line", singleline[2]); + auto const multiline = Cnf.FindVector("List::Option2"); + EXPECT_EQ(3u, multiline.size()); + EXPECT_EQ("Multi", multiline[0]); + EXPECT_EQ("Line", multiline[1]); + EXPECT_EQ("Options", multiline[2]); + EXPECT_TRUE(Cnf.FindB("Trailing")); + EXPECT_FALSE(Cnf.Exists("Commented::Out")); +} diff --git a/test/libapt/extracttar_test.cc b/test/libapt/extracttar_test.cc new file mode 100644 index 0000000..3093414 --- /dev/null +++ b/test/libapt/extracttar_test.cc @@ -0,0 +1,41 @@ +#include <apt-pkg/error.h> +#include <apt-pkg/extracttar.h> +#include <iostream> +#include <stdlib.h> + +#include "assert.h" +#include <gtest/gtest.h> + +class Stream : public pkgDirStream +{ + public: + int count; + Stream () { count = 0; } + virtual bool DoItem(Item &Itm,int &Fd) { (void)Itm; (void)Fd; count++; return true; } + virtual bool Fail(Item &Itm,int Fd) { (void)Itm; (void)Fd; return true; } + virtual bool FinishedFile(Item &Itm,int Fd) { (void)Itm; (void)Fd; return true; } + virtual bool Process(Item &Itm,const unsigned char * Data, unsigned long Size,unsigned long Pos) { (void)Itm; (void) Data; (void) Size; (void) Pos; return true; } + virtual ~Stream() {} +}; + +TEST(ExtractTar, ExtractTar) +{ + EXPECT_EQ(system("tar c /etc/passwd 2>/dev/null | gzip > tar.tgz"), 0); + + FileFd fd("tar.tgz", FileFd::ReadOnly); + unlink("tar.tgz"); + ExtractTar tar(fd, -1, "gzip"); + + // Run multiple times, because we want to check not only that extraction + // works, but also that it works multiple times (important for python-apt) + for (int i = 0; i < 5; i++) { + Stream stream; + fd.Seek(0); + tar.Go(stream); + if (_error->PendingError()) { + _error->DumpErrors(); + EXPECT_FALSE(true); + } + EXPECT_EQ(stream.count, 1); + } +} diff --git a/test/libapt/file-helpers.cc b/test/libapt/file-helpers.cc new file mode 100644 index 0000000..aa16a2e --- /dev/null +++ b/test/libapt/file-helpers.cc @@ -0,0 +1,83 @@ +#include <apt-pkg/fileutl.h> + +#include <string> + +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +void helperCreateTemporaryDirectory(std::string const &id, std::string &dir) +{ + std::string const strtempdir = GetTempDir().append("/apt-tests-").append(id).append(".XXXXXX"); + char * tempdir = strdup(strtempdir.c_str()); + ASSERT_STREQ(tempdir, mkdtemp(tempdir)); + dir = tempdir; + free(tempdir); +} +void helperRemoveDirectory(std::string const &dir) +{ + // basic sanity check to avoid removing random directories based on earlier failures + if (dir.find("/apt-tests-") == std::string::npos || dir.find_first_of("*?") != std::string::npos) + FAIL() << "Directory '" << dir << "' seems invalid. It is therefore not removed!"; + else + ASSERT_EQ(0, system(std::string("rm -rf ").append(dir).c_str())); +} +void helperCreateFile(std::string const &dir, std::string const &name) +{ + std::string file = dir; + file.append("/"); + file.append(name); + int const fd = creat(file.c_str(), 0600); + ASSERT_NE(-1, fd); + close(fd); +} +void helperCreateDirectory(std::string const &dir, std::string const &name) +{ + std::string file = dir; + file.append("/"); + file.append(name); + ASSERT_TRUE(CreateDirectory(dir, file)); +} +void helperCreateLink(std::string const &dir, std::string const &targetname, std::string const &linkname) +{ + std::string target = dir; + target.append("/"); + target.append(targetname); + std::string link = dir; + link.append("/"); + link.append(linkname); + ASSERT_EQ(0, symlink(target.c_str(), link.c_str())); +} +void helperCreateTemporaryFile(std::string const &id, FileFd &fd, std::string * const filename, char const * const content) +{ + std::string name("apt-test-"); + name.append(id); + size_t const giventmp = name.find(".XXXXXX."); + if (giventmp == std::string::npos) + name.append(".XXXXXX"); + char * tempfile = strdup(name.c_str()); + ASSERT_STRNE(NULL, tempfile); + int tempfile_fd; + if (giventmp == std::string::npos) + tempfile_fd = mkstemp(tempfile); + else + tempfile_fd = mkstemps(tempfile, name.length() - (giventmp + 7)); + ASSERT_NE(-1, tempfile_fd); + if (filename != NULL) + *filename = tempfile; + else + unlink(tempfile); + free(tempfile); + + EXPECT_TRUE(fd.OpenDescriptor(tempfile_fd, FileFd::ReadWrite, true)); + if (content != NULL) + { + ASSERT_TRUE(fd.Write(content, strlen(content))); + fd.Seek(0); + } +} diff --git a/test/libapt/file-helpers.h b/test/libapt/file-helpers.h new file mode 100644 index 0000000..f639c1c --- /dev/null +++ b/test/libapt/file-helpers.h @@ -0,0 +1,29 @@ +#ifndef APT_TESTS_FILE_HELPERS +#define APT_TESTS_FILE_HELPERS + +#include <string> + +#include <gtest/gtest.h> + +class FileFd; + +#define createTemporaryDirectory(id, dir) \ + ASSERT_NO_FATAL_FAILURE(helperCreateTemporaryDirectory(id, dir)) +void helperCreateTemporaryDirectory(std::string const &id, std::string &dir); +#define removeDirectory(dir) \ + ASSERT_NO_FATAL_FAILURE(helperRemoveDirectory(dir)) +void helperRemoveDirectory(std::string const &dir); +#define createFile(dir, name) \ + ASSERT_NO_FATAL_FAILURE(helperCreateFile(dir, name)) +void helperCreateFile(std::string const &dir, std::string const &name); +#define createDirectory(dir, name) \ + ASSERT_NO_FATAL_FAILURE(helperCreateDirectory(dir, name)) +void helperCreateDirectory(std::string const &dir, std::string const &name); +#define createLink(dir, targetname, linkname) \ + ASSERT_NO_FATAL_FAILURE(helperCreateLink(dir, targetname, linkname)) +void helperCreateLink(std::string const &dir, std::string const &targetname, std::string const &linkname); +#define createTemporaryFile(id, fd, filename, content) \ + ASSERT_NO_FATAL_FAILURE(helperCreateTemporaryFile(id, fd, filename, content)) +void helperCreateTemporaryFile(std::string const &id, FileFd &fd, std::string * const filename, char const * const content); + +#endif diff --git a/test/libapt/fileutl_test.cc b/test/libapt/fileutl_test.cc new file mode 100644 index 0000000..788ab76 --- /dev/null +++ b/test/libapt/fileutl_test.cc @@ -0,0 +1,408 @@ +#include <config.h> + +#include <apt-pkg/aptconfiguration.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/strutl.h> + +#include <algorithm> +#include <string> +#include <vector> +#include <stdlib.h> +#include <string.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +static void TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission, + unsigned int const filemode, APT::Configuration::Compressor const &compressor) +{ + std::string trace; + strprintf(trace, "TestFileFd: Compressor: %s umask: %#o permission: %#o mode: %d", compressor.Name.c_str(), a_umask, ExpectedFilePermission, filemode); + SCOPED_TRACE(trace); + + static const char* fname = "apt-filefd-test.txt"; + if (FileExists(fname) == true) + { + EXPECT_EQ(0, unlink(fname)); + } + + FileFd f; + umask(a_umask); + EXPECT_TRUE(f.Open(fname, filemode, compressor)); + EXPECT_TRUE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); + EXPECT_EQ(umask(a_umask), a_umask); + + std::string test = "This is a test!\n"; + EXPECT_TRUE(f.Write(test.c_str(), test.size())); + EXPECT_TRUE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); + + f.Close(); + EXPECT_FALSE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); + + EXPECT_TRUE(f.Open(fname, FileFd::ReadOnly, compressor)); + EXPECT_TRUE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_NE(0u, f.FileSize()); + EXPECT_FALSE(f.Failed()); + EXPECT_NE(0, f.ModificationTime()); + EXPECT_FALSE(f.Failed()); + + // ensure the memory is as predictably messed up +#define APT_INIT_READBACK \ + char readback[20]; \ + memset(readback, 'D', sizeof(readback)*sizeof(readback[0])); \ + readback[19] = '\0'; +#define EXPECT_N_STR(expect, actual) \ + EXPECT_EQ(0, strncmp(expect, actual, strlen(expect))); + { + APT_INIT_READBACK + char const * const expect = "DDDDDDDDDDDDDDDDDDD"; + EXPECT_STREQ(expect,readback); + EXPECT_N_STR(expect, readback); + } + { + APT_INIT_READBACK + char const * const expect = "This"; + EXPECT_TRUE(f.Read(readback, strlen(expect))); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_N_STR(expect, readback); + EXPECT_EQ(strlen(expect), f.Tell()); + } + { + APT_INIT_READBACK + char const * const expect = "test!\n"; + EXPECT_TRUE(f.Skip((test.size() - f.Tell()) - strlen(expect))); + EXPECT_TRUE(f.Read(readback, strlen(expect))); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_N_STR(expect, readback); + EXPECT_EQ(test.size(), f.Tell()); + } + // Non-zero backwards seek + { + APT_INIT_READBACK + char const * const expect = "is"; + EXPECT_EQ(test.size(), f.Tell()); + EXPECT_TRUE(f.Seek(5)); + EXPECT_TRUE(f.Read(readback, strlen(expect))); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_N_STR(expect, readback); + EXPECT_EQ(7u, f.Tell()); + } + { + APT_INIT_READBACK + EXPECT_TRUE(f.Seek(0)); + EXPECT_FALSE(f.Eof()); + EXPECT_TRUE(f.Read(readback, 20, true)); + EXPECT_FALSE(f.Failed()); + EXPECT_TRUE(f.Eof()); + EXPECT_N_STR(test.c_str(), readback); + EXPECT_EQ(f.Size(), f.Tell()); + } + { + APT_INIT_READBACK + EXPECT_TRUE(f.Seek(0)); + EXPECT_FALSE(f.Eof()); + EXPECT_TRUE(f.Read(readback, test.size(), true)); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_N_STR(test.c_str(), readback); + EXPECT_EQ(f.Size(), f.Tell()); + } + { + APT_INIT_READBACK + EXPECT_TRUE(f.Seek(0)); + EXPECT_FALSE(f.Eof()); + unsigned long long actual; + EXPECT_TRUE(f.Read(readback, 20, &actual)); + EXPECT_FALSE(f.Failed()); + EXPECT_TRUE(f.Eof()); + EXPECT_EQ(test.size(), actual); + EXPECT_N_STR(test.c_str(), readback); + EXPECT_EQ(f.Size(), f.Tell()); + } + { + APT_INIT_READBACK + EXPECT_TRUE(f.Seek(0)); + EXPECT_FALSE(f.Eof()); + f.ReadLine(readback, 20); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_EQ(test, readback); + EXPECT_EQ(f.Size(), f.Tell()); + } + { + APT_INIT_READBACK + EXPECT_TRUE(f.Seek(0)); + EXPECT_FALSE(f.Eof()); + char const * const expect = "This"; + f.ReadLine(readback, strlen(expect) + 1); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_N_STR(expect, readback); + EXPECT_EQ(strlen(expect), f.Tell()); + } +#undef APT_INIT_READBACK + { + test.erase(test.length() - 1); + EXPECT_TRUE(f.Seek(0)); + EXPECT_FALSE(f.Eof()); + std::string line; + EXPECT_TRUE(f.ReadLine(line)); + EXPECT_FALSE(f.Failed()); + EXPECT_FALSE(f.Eof()); + EXPECT_EQ(line.length(), test.length()); + EXPECT_EQ(line.length() + 1, f.Tell()); + EXPECT_EQ(f.Size(), f.Tell()); + EXPECT_EQ(line, test); + } + + f.Close(); + EXPECT_FALSE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); + + // regression test for permission bug LP: #1304657 + struct stat buf; + EXPECT_EQ(0, stat(fname, &buf)); + EXPECT_EQ(0, unlink(fname)); + EXPECT_EQ(ExpectedFilePermission, buf.st_mode & 0777); +} + +static void TestFileFd(unsigned int const filemode) +{ + auto const compressors = APT::Configuration::getCompressors(); + EXPECT_EQ(8u, compressors.size()); + bool atLeastOneWasTested = false; + for (auto const &c: compressors) + { + if ((filemode & FileFd::ReadWrite) == FileFd::ReadWrite && + (c.Name.empty() != true && c.Binary.empty() != true)) + continue; + atLeastOneWasTested = true; + TestFileFd(0002, 0664, filemode, c); + TestFileFd(0022, 0644, filemode, c); + TestFileFd(0077, 0600, filemode, c); + TestFileFd(0026, 0640, filemode, c); + } + EXPECT_TRUE(atLeastOneWasTested); +} + +TEST(FileUtlTest, FileFD) +{ + // testing the (un)compress via pipe, as the 'real' compressors are usually built in via libraries + _config->Set("APT::Compressor::rev::Name", "rev"); + _config->Set("APT::Compressor::rev::Extension", ".reversed"); + _config->Set("APT::Compressor::rev::Binary", "rev"); + _config->Set("APT::Compressor::rev::Cost", 10); + auto const compressors = APT::Configuration::getCompressors(false); + EXPECT_EQ(8u, compressors.size()); + EXPECT_TRUE(std::any_of(compressors.begin(), compressors.end(), [](APT::Configuration::Compressor const &c) { return c.Name == "rev"; })); + + std::string const startdir = SafeGetCWD(); + EXPECT_FALSE(startdir.empty()); + std::string tempdir; + createTemporaryDirectory("filefd", tempdir); + EXPECT_EQ(0, chdir(tempdir.c_str())); + + TestFileFd(FileFd::WriteOnly | FileFd::Create); + TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Empty); + TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive); + TestFileFd(FileFd::WriteOnly | FileFd::Atomic); + TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Atomic); + // short-hands for ReadWrite with these modes + TestFileFd(FileFd::WriteEmpty); + TestFileFd(FileFd::WriteAny); + TestFileFd(FileFd::WriteTemp); + TestFileFd(FileFd::WriteAtomic); + + EXPECT_EQ(0, chdir(startdir.c_str())); + removeDirectory(tempdir); +} +TEST(FileUtlTest, Glob) +{ + std::vector<std::string> files; + // normal match + files = Glob("*MakeLists.txt"); + EXPECT_EQ(1u, files.size()); + + // not there + files = Glob("xxxyyyzzz"); + EXPECT_TRUE(files.empty()); + EXPECT_FALSE(_error->PendingError()); + + // many matches (number is a bit random) + files = Glob("*.cc"); + EXPECT_LT(10u, files.size()); +} +TEST(FileUtlTest, GetTempDir) +{ + char const * const envtmp = getenv("TMPDIR"); + std::string old_tmpdir; + if (envtmp != NULL) + old_tmpdir = envtmp; + + unsetenv("TMPDIR"); + EXPECT_EQ("/tmp", GetTempDir()); + + setenv("TMPDIR", "", 1); + EXPECT_EQ("/tmp", GetTempDir()); + + setenv("TMPDIR", "/not-there-no-really-not", 1); + EXPECT_EQ("/tmp", GetTempDir()); + + // root can access everything, so /usr will be accepted + if (geteuid() != 0) + { + // here but not accessible for non-roots + setenv("TMPDIR", "/usr", 1); + EXPECT_EQ("/tmp", GetTempDir()); + } + + // files are no good for tmpdirs, too + setenv("TMPDIR", "/dev/null", 1); + EXPECT_EQ("/tmp", GetTempDir()); + + setenv("TMPDIR", "/var/tmp", 1); + EXPECT_EQ("/var/tmp", GetTempDir()); + + unsetenv("TMPDIR"); + if (old_tmpdir.empty() == false) + setenv("TMPDIR", old_tmpdir.c_str(), 1); +} +TEST(FileUtlTest, Popen) +{ + FileFd Fd; + pid_t Child; + char buf[1024]; + std::string s; + unsigned long long n = 0; + std::vector<std::string> OpenFds; + + // count Fds to ensure we don't have a resource leak + if(FileExists("/proc/self/fd")) + OpenFds = Glob("/proc/self/fd/*"); + + // output something + const char* Args[10] = {"/bin/echo", "meepmeep", NULL}; + EXPECT_TRUE(Popen(Args, Fd, Child, FileFd::ReadOnly)); + EXPECT_TRUE(Fd.Read(buf, sizeof(buf)-1, &n)); + buf[n] = 0; + EXPECT_NE(n, 0u); + EXPECT_STREQ(buf, "meepmeep\n"); + + // wait for the child to exit and cleanup + EXPECT_TRUE(ExecWait(Child, "PopenRead")); + EXPECT_TRUE(Fd.Close()); + + // ensure that after a close all is good again + if(FileExists("/proc/self/fd")) + { + EXPECT_EQ(Glob("/proc/self/fd/*").size(), OpenFds.size()); + } + + // ReadWrite is not supported + _error->PushToStack(); + EXPECT_FALSE(Popen(Args, Fd, Child, FileFd::ReadWrite)); + EXPECT_FALSE(Fd.IsOpen()); + EXPECT_FALSE(Fd.Failed()); + EXPECT_TRUE(_error->PendingError()); + _error->RevertToStack(); + + // write something + Args[0] = "/bin/bash"; + Args[1] = "-c"; + Args[2] = "read"; + Args[3] = NULL; + EXPECT_TRUE(Popen(Args, Fd, Child, FileFd::WriteOnly)); + s = "\n"; + EXPECT_TRUE(Fd.Write(s.c_str(), s.length())); + EXPECT_TRUE(Fd.Close()); + EXPECT_FALSE(Fd.IsOpen()); + EXPECT_FALSE(Fd.Failed()); + EXPECT_TRUE(ExecWait(Child, "PopenWrite")); +} +TEST(FileUtlTest, flAbsPath) +{ + std::string cwd = SafeGetCWD(); + int res = chdir("/etc/"); + EXPECT_EQ(res, 0); + std::string p = flAbsPath("passwd"); + EXPECT_EQ(p, "/etc/passwd"); + + res = chdir(cwd.c_str()); + EXPECT_EQ(res, 0); +} + +static void TestDevNullFileFd(unsigned int const filemode) +{ + SCOPED_TRACE(filemode); + FileFd f("/dev/null", filemode); + EXPECT_FALSE(f.Failed()); + EXPECT_TRUE(f.IsOpen()); + EXPECT_TRUE(f.IsOpen()); + + std::string test = "This is a test!\n"; + EXPECT_TRUE(f.Write(test.c_str(), test.size())); + EXPECT_TRUE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); + + f.Close(); + EXPECT_FALSE(f.IsOpen()); + EXPECT_FALSE(f.Failed()); +} +TEST(FileUtlTest, WorkingWithDevNull) +{ + TestDevNullFileFd(FileFd::WriteOnly | FileFd::Create); + TestDevNullFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Empty); + TestDevNullFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive); + TestDevNullFileFd(FileFd::WriteOnly | FileFd::Atomic); + TestDevNullFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Atomic); + // short-hands for ReadWrite with these modes + TestDevNullFileFd(FileFd::WriteEmpty); + TestDevNullFileFd(FileFd::WriteAny); + TestDevNullFileFd(FileFd::WriteTemp); + TestDevNullFileFd(FileFd::WriteAtomic); +} +constexpr char const * const TESTSTRING = "This is a test"; +static void TestFailingAtomicKeepsFile(char const * const label, std::string const &filename) +{ + SCOPED_TRACE(label); + EXPECT_TRUE(FileExists(filename)); + FileFd fd; + EXPECT_TRUE(fd.Open(filename, FileFd::ReadOnly)); + char buffer[50]; + EXPECT_NE(nullptr, fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(TESTSTRING, buffer); +} +TEST(FileUtlTest, FailingAtomic) +{ + FileFd fd; + std::string filename; + createTemporaryFile("failingatomic", fd, &filename, TESTSTRING); + TestFailingAtomicKeepsFile("init", filename); + + FileFd f; + EXPECT_TRUE(f.Open(filename, FileFd::ReadWrite | FileFd::Atomic)); + f.EraseOnFailure(); + EXPECT_FALSE(f.Failed()); + EXPECT_TRUE(f.IsOpen()); + TestFailingAtomicKeepsFile("before-fail", filename); + EXPECT_TRUE(f.Write("Bad file write", 10)); + f.OpFail(); + EXPECT_TRUE(f.Failed()); + TestFailingAtomicKeepsFile("after-fail", filename); + EXPECT_TRUE(f.Close()); + TestFailingAtomicKeepsFile("closed", filename); + + if (filename.empty() == false) + unlink(filename.c_str()); +} diff --git a/test/libapt/getarchitectures_test.cc b/test/libapt/getarchitectures_test.cc new file mode 100644 index 0000000..57e9a5f --- /dev/null +++ b/test/libapt/getarchitectures_test.cc @@ -0,0 +1,77 @@ +#include <config.h> + +#include <apt-pkg/aptconfiguration.h> +#include <apt-pkg/configuration.h> + +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +TEST(ArchitecturesTest,SimpleLists) +{ + _config->Clear(); + std::vector<std::string> vec; + + _config->Set("APT::Architectures::1", "i386"); + _config->Set("APT::Architectures::2", "amd64"); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("i386", vec[0]); + EXPECT_EQ("amd64", vec[1]); + + _config->Set("APT::Architecture", "i386"); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("i386", vec[0]); + EXPECT_EQ("amd64", vec[1]); + + _config->Set("APT::Architectures::2", ""); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(1u, vec.size()); + EXPECT_EQ("i386", vec[0]); + + _config->Set("APT::Architecture", "armel"); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("armel", vec[0]); + EXPECT_EQ("i386", vec[1]); + + _config->Set("APT::Architectures::2", "armel"); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("i386", vec[0]); + EXPECT_EQ("armel", vec[1]); + + _config->Set("APT::Architectures", "armel,armhf"); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("armel", vec[0]); + EXPECT_EQ("armhf", vec[1]); + _config->Clear(); +} +TEST(ArchitecturesTest,Duplicates) +{ + _config->Clear(); + + _config->Set("APT::Architecture", "armel"); + _config->Set("APT::Architectures::", "i386"); + _config->Set("APT::Architectures::", "amd64"); + _config->Set("APT::Architectures::", "i386"); + _config->Set("APT::Architectures::", "armel"); + _config->Set("APT::Architectures::", "i386"); + _config->Set("APT::Architectures::", "amd64"); + _config->Set("APT::Architectures::", "armel"); + _config->Set("APT::Architectures::", "armel"); + _config->Set("APT::Architectures::", "amd64"); + _config->Set("APT::Architectures::", "amd64"); + std::vector<std::string> vec = _config->FindVector("APT::Architectures"); + ASSERT_EQ(10u, vec.size()); + vec = APT::Configuration::getArchitectures(false); + ASSERT_EQ(3u, vec.size()); + EXPECT_EQ("i386", vec[0]); + EXPECT_EQ("amd64", vec[1]); + EXPECT_EQ("armel", vec[2]); + + _config->Clear(); +} diff --git a/test/libapt/getlanguages_test.cc b/test/libapt/getlanguages_test.cc new file mode 100644 index 0000000..7146c5a --- /dev/null +++ b/test/libapt/getlanguages_test.cc @@ -0,0 +1,241 @@ +#include <config.h> + +#include <apt-pkg/aptconfiguration.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> + +#include <algorithm> +#include <iostream> +#include <string> +#include <vector> + +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +TEST(LanguagesTest,Environment) +{ + _config->Clear(); + + char const* env[2]; + env[0] = "de_DE.UTF-8"; + env[1] = ""; + + std::vector<std::string> vec = APT::Configuration::getLanguages(false, false, env); + ASSERT_EQ(3u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en", vec[2]); + + // Special: Check if the cache is actually in use + env[0] = "en_GB.UTF-8"; + vec = APT::Configuration::getLanguages(false, true, env); + ASSERT_EQ(3u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en", vec[2]); + + env[0] = "en_GB.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("en_GB", vec[0]); + EXPECT_EQ("en", vec[1]); + + // esperanto + env[0] = "eo.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + ASSERT_EQ(2u, vec.size()); + EXPECT_EQ("eo", vec[0]); + EXPECT_EQ("en", vec[1]); + + env[0] = "tr_DE@euro"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(3u, vec.size()); + EXPECT_EQ("tr_DE", vec[0]); + EXPECT_EQ("tr", vec[1]); + EXPECT_EQ("en", vec[2]); + + env[0] = "de_NO"; + env[1] = "de_NO:en_GB:nb_NO:nb:no_NO:no:nn_NO:nn:da:sv:en"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(6u, vec.size()); + EXPECT_EQ("de_NO", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en_GB", vec[2]); + EXPECT_EQ("nb_NO", vec[3]); + EXPECT_EQ("nb", vec[4]); + EXPECT_EQ("en", vec[5]); + + env[0] = "pt_PR.UTF-8"; + env[1] = ""; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(3u, vec.size()); + EXPECT_EQ("pt_PR", vec[0]); + EXPECT_EQ("pt", vec[1]); + EXPECT_EQ("en", vec[2]); + + env[0] = "ast_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); // bogus, but syntactical correct + EXPECT_EQ(3u, vec.size()); + EXPECT_EQ("ast_DE", vec[0]); + EXPECT_EQ("ast", vec[1]); + EXPECT_EQ("en", vec[2]); + + env[0] = "C"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("en", vec[0]); + + _config->Set("Acquire::Languages", "none"); + env[0] = "C"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_TRUE(vec.empty()); + + _config->Set("Acquire::Languages", "environment"); + env[0] = "C"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("en", vec[0]); + + _config->Set("Acquire::Languages", "de"); + env[0] = "C"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("de", vec[0]); + + _config->Set("Acquire::Languages", "fr"); + env[0] = "ast_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("fr", vec[0]); + + _config->Set("Acquire::Languages", "environment,en"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(3u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en", vec[2]); + _config->Set("Acquire::Languages", ""); + + _config->Set("Acquire::Languages::1", "environment"); + _config->Set("Acquire::Languages::2", "en"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(3u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en", vec[2]); + + _config->Set("Acquire::Languages::3", "de"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(3u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en", vec[2]); + + _config->Clear(); +} + +TEST(LanguagesTest,TranslationFiles) +{ + _config->Clear(); + _config->Set("Acquire::Languages::1", "environment"); + _config->Set("Acquire::Languages::2", "en"); + _config->Set("Acquire::Languages::3", "de"); + + char const* env[2]; + env[0] = "de_DE.UTF-8"; + env[1] = ""; + + std::string tempdir; + createTemporaryDirectory("languages", tempdir); + +#define createTranslation(lang) \ + createFile(tempdir, std::string("/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-").append(lang)); + + createTranslation("tr"); + createTranslation("pt"); + createTranslation("se~"); + createTranslation("st.bak"); + createTranslation("ast_DE"); + createTranslation("tlh%5fDE"); + + _config->Set("Dir::State::lists", tempdir); + std::vector<std::string> vec = APT::Configuration::getLanguages(true, false, env); + EXPECT_EQ(8u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + EXPECT_EQ("de", vec[1]); + EXPECT_EQ("en", vec[2]); + EXPECT_EQ("none", vec[3]); + EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "pt")); + EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "tr")); + EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "ast_DE")); + EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "tlh_DE")); + EXPECT_NE(vec[4], vec[5]); + EXPECT_NE(vec[4], vec[6]); + EXPECT_NE(vec[4], vec[7]); + EXPECT_NE(vec[5], vec[6]); + EXPECT_NE(vec[5], vec[7]); + EXPECT_NE(vec[6], vec[7]); + + _config->Set("Acquire::Languages", "none"); + vec = APT::Configuration::getLanguages(true, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("none", vec[0]); + _config->Set("Acquire::Languages", ""); + + _config->Set("Dir::State::lists", "/non-existing-dir"); + _config->Set("Acquire::Languages::1", "none"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_TRUE(vec.empty()); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(true, false, env); + EXPECT_EQ(2u, vec.size()); + EXPECT_EQ("en", vec[0]); + EXPECT_EQ("de", vec[1]); + + _config->Set("Acquire::Languages::1", "fr"); + _config->Set("Acquire::Languages", "de_DE"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(false, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("de_DE", vec[0]); + + _config->Set("Acquire::Languages", "none"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(true, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("none", vec[0]); + + _error->PushToStack(); + _config->Set("Acquire::Languages", ""); + //FIXME: Remove support for this deprecated setting + _config->Set("APT::Acquire::Translation", "ast_DE"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(true, false, env); + EXPECT_EQ(2u, vec.size()); + EXPECT_EQ("ast_DE", vec[0]); + EXPECT_EQ("en", vec[1]); + _config->Set("APT::Acquire::Translation", "none"); + env[0] = "de_DE.UTF-8"; + vec = APT::Configuration::getLanguages(true, false, env); + EXPECT_EQ(1u, vec.size()); + EXPECT_EQ("en", vec[0]); + + // discard the deprecation warning for APT::Acquire::Translation + if (_error->PendingError()) + _error->MergeWithStack(); + else + _error->RevertToStack(); + + EXPECT_EQ(0, system(std::string("rm -rf ").append(tempdir).c_str())); + _config->Clear(); +} diff --git a/test/libapt/getlistoffilesindir_test.cc b/test/libapt/getlistoffilesindir_test.cc new file mode 100644 index 0000000..f002355 --- /dev/null +++ b/test/libapt/getlistoffilesindir_test.cc @@ -0,0 +1,114 @@ +#include <config.h> + +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> + +#include <iostream> +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +#define P(x) tempdir + "/" + x + +TEST(FileUtlTest,GetListOfFilesInDir) +{ + std::string tempdir; + createTemporaryDirectory("getlistoffiles", tempdir); + + createFile(tempdir, "anormalfile"); + createFile(tempdir, "01yet-anothernormalfile"); + createFile(tempdir, "anormalapt.conf"); + createFile(tempdir, "01yet-anotherapt.conf"); + createFile(tempdir, "anormalapt.list"); + createFile(tempdir, "01yet-anotherapt.list"); + createFile(tempdir, "wrongextension.wron"); + createFile(tempdir, "wrong-extension.wron"); + createFile(tempdir, "strangefile."); + createFile(tempdir, "s.t.r.a.n.g.e.f.i.l.e"); + createFile(tempdir, ".hiddenfile"); + createFile(tempdir, ".hiddenfile.conf"); + createFile(tempdir, ".hiddenfile.list"); + createFile(tempdir, "multi..dot"); + createFile(tempdir, "multi.dot.conf"); + createFile(tempdir, "multi.dot.list"); + createFile(tempdir, "disabledfile.disabled"); + createFile(tempdir, "disabledfile.conf.disabled"); + createFile(tempdir, "disabledfile.list.disabled"); + createFile(tempdir, "invälid.conf"); + createFile(tempdir, "invalíd"); + createFile(tempdir, "01invalíd"); + createDirectory(tempdir, "invaliddir"); + createDirectory(tempdir, "directory.conf"); + createDirectory(tempdir, "directory.list"); + createDirectory(tempdir, "directory.wron"); + createDirectory(tempdir, "directory.list.disabled"); + createLink(tempdir, "anormalfile", "linkedfile.list"); + createLink(tempdir, "invaliddir", "linkeddir.list"); + createLink(tempdir, "non-existing-file", "brokenlink.list"); + + // Files with no extension + _error->PushToStack(); + std::vector<std::string> files = GetListOfFilesInDir(tempdir, "", true); + ASSERT_EQ(2u, files.size()); + EXPECT_EQ(P("01yet-anothernormalfile"), files[0]); + EXPECT_EQ(P("anormalfile"), files[1]); + + // Files with no extension - should be the same as above + files = GetListOfFilesInDir(tempdir, "", true, true); + ASSERT_EQ(2u, files.size()); + EXPECT_EQ(P("01yet-anothernormalfile"), files[0]); + EXPECT_EQ(P("anormalfile"), files[1]); + + // Files with impossible extension + files = GetListOfFilesInDir(tempdir, "impossible", true); + EXPECT_TRUE(files.empty()); + + // Files with impossible or no extension + files = GetListOfFilesInDir(tempdir, "impossible", true, true); + ASSERT_EQ(2u, files.size()); + EXPECT_EQ(P("01yet-anothernormalfile"), files[0]); + EXPECT_EQ(P("anormalfile"), files[1]); + + // Files with list extension - nothing more + files = GetListOfFilesInDir(tempdir, "list", true); + ASSERT_EQ(4u, files.size()); + EXPECT_EQ(P("01yet-anotherapt.list"), files[0]); + EXPECT_EQ(P("anormalapt.list"), files[1]); + EXPECT_EQ(P("linkedfile.list"), files[2]); + EXPECT_EQ(P("multi.dot.list"), files[3]); + + // Files with conf or no extension + files = GetListOfFilesInDir(tempdir, "conf", true, true); + ASSERT_EQ(5u, files.size()); + EXPECT_EQ(P("01yet-anotherapt.conf"), files[0]); + EXPECT_EQ(P("01yet-anothernormalfile"), files[1]); + EXPECT_EQ(P("anormalapt.conf"), files[2]); + EXPECT_EQ(P("anormalfile"), files[3]); + EXPECT_EQ(P("multi.dot.conf"), files[4]); + + // Files with disabled extension - nothing more + files = GetListOfFilesInDir(tempdir, "disabled", true); + ASSERT_EQ(3u, files.size()); + EXPECT_EQ(P("disabledfile.conf.disabled"), files[0]); + EXPECT_EQ(P("disabledfile.disabled"), files[1]); + EXPECT_EQ(P("disabledfile.list.disabled"), files[2]); + + // Files with disabled or no extension + files = GetListOfFilesInDir(tempdir, "disabled", true, true); + ASSERT_EQ(5u, files.size()); + EXPECT_EQ(P("01yet-anothernormalfile"), files[0]); + EXPECT_EQ(P("anormalfile"), files[1]); + EXPECT_EQ(P("disabledfile.conf.disabled"), files[2]); + EXPECT_EQ(P("disabledfile.disabled"), files[3]); + EXPECT_EQ(P("disabledfile.list.disabled"), files[4]); + + // discard the unknown file extension messages + if (_error->PendingError()) + _error->MergeWithStack(); + else + _error->RevertToStack(); + removeDirectory(tempdir); +} diff --git a/test/libapt/globalerror_test.cc b/test/libapt/globalerror_test.cc new file mode 100644 index 0000000..ff14d46 --- /dev/null +++ b/test/libapt/globalerror_test.cc @@ -0,0 +1,169 @@ +#include <config.h> + +#include <apt-pkg/error.h> + +#include <string> +#include <errno.h> +#include <stddef.h> +#include <string.h> + +#include <gtest/gtest.h> + +TEST(GlobalErrorTest,BasicDiscard) +{ + GlobalError e; + EXPECT_TRUE(e.empty()); + EXPECT_FALSE(e.PendingError()); + EXPECT_FALSE(e.Notice("%s Notice", "A")); + EXPECT_TRUE(e.empty()); + EXPECT_FALSE(e.empty(GlobalError::DEBUG)); + EXPECT_FALSE(e.PendingError()); + EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2)); + EXPECT_TRUE(e.PendingError()); + + std::string text; + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_TRUE(e.PendingError()); + EXPECT_EQ("A Notice", text); + EXPECT_TRUE(e.PopMessage(text)); + EXPECT_EQ("Something horrible happened 2 times", text); + EXPECT_TRUE(e.empty(GlobalError::DEBUG)); + EXPECT_FALSE(e.PendingError()); + EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2)); + EXPECT_TRUE(e.PendingError()); + EXPECT_FALSE(e.empty(GlobalError::FATAL)); + e.Discard(); + + EXPECT_TRUE(e.empty()); + EXPECT_FALSE(e.PendingError()); +} +TEST(GlobalErrorTest,StackPushing) +{ + GlobalError e; + EXPECT_FALSE(e.Notice("%s Notice", "A")); + EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2)); + EXPECT_TRUE(e.PendingError()); + EXPECT_FALSE(e.empty(GlobalError::NOTICE)); + e.PushToStack(); + EXPECT_TRUE(e.empty(GlobalError::NOTICE)); + EXPECT_FALSE(e.PendingError()); + EXPECT_FALSE(e.Warning("%s Warning", "A")); + EXPECT_TRUE(e.empty(GlobalError::ERROR)); + EXPECT_FALSE(e.PendingError()); + e.RevertToStack(); + EXPECT_FALSE(e.empty(GlobalError::ERROR)); + EXPECT_TRUE(e.PendingError()); + + std::string text; + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_TRUE(e.PendingError()); + EXPECT_EQ("A Notice", text); + EXPECT_TRUE(e.PopMessage(text)); + EXPECT_EQ("Something horrible happened 2 times", text); + EXPECT_FALSE(e.PendingError()); + EXPECT_TRUE(e.empty()); + + EXPECT_FALSE(e.Notice("%s Notice", "A")); + EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2)); + EXPECT_TRUE(e.PendingError()); + EXPECT_FALSE(e.empty(GlobalError::NOTICE)); + e.PushToStack(); + EXPECT_TRUE(e.empty(GlobalError::NOTICE)); + EXPECT_FALSE(e.PendingError()); + EXPECT_FALSE(e.Warning("%s Warning", "A")); + EXPECT_TRUE(e.empty(GlobalError::ERROR)); + EXPECT_FALSE(e.PendingError()); + e.MergeWithStack(); + EXPECT_FALSE(e.empty(GlobalError::ERROR)); + EXPECT_TRUE(e.PendingError()); + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_TRUE(e.PendingError()); + EXPECT_EQ("A Notice", text); + EXPECT_TRUE(e.PopMessage(text)); + EXPECT_EQ("Something horrible happened 2 times", text); + EXPECT_FALSE(e.PendingError()); + EXPECT_FALSE(e.empty()); + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_EQ("A Warning", text); + EXPECT_TRUE(e.empty()); +} +TEST(GlobalErrorTest,Errno) +{ + GlobalError e; + std::string const textOfErrnoZero(strerror(0)); + errno = 0; + EXPECT_FALSE(e.Errno("errno", "%s horrible %s %d times", "Something", "happened", 2)); + EXPECT_FALSE(e.empty()); + EXPECT_TRUE(e.PendingError()); + std::string text; + EXPECT_TRUE(e.PopMessage(text)); + EXPECT_FALSE(e.PendingError()); + EXPECT_EQ(std::string("Something horrible happened 2 times - errno (0: ").append(textOfErrnoZero).append(")"), text); + EXPECT_TRUE(e.empty()); +} +TEST(GlobalErrorTest,LongMessage) +{ + GlobalError e; + std::string const textOfErrnoZero(strerror(0)); + errno = 0; + std::string text, longText; + for (size_t i = 0; i < 500; ++i) + longText.append("a"); + EXPECT_FALSE(e.Error("%s horrible %s %d times", longText.c_str(), "happened", 2)); + EXPECT_TRUE(e.PopMessage(text)); + EXPECT_EQ(longText + " horrible happened 2 times", text); + + EXPECT_FALSE(e.Errno("errno", "%s horrible %s %d times", longText.c_str(), "happened", 2)); + EXPECT_TRUE(e.PopMessage(text)); + EXPECT_EQ(longText + " horrible happened 2 times - errno (0: " + textOfErrnoZero + ")", text); + + EXPECT_FALSE(e.Error("%s horrible %s %d times", longText.c_str(), "happened", 2)); + std::ostringstream out; + e.DumpErrors(out); + EXPECT_EQ(std::string("E: ").append(longText).append(" horrible happened 2 times\n"), out.str()); + + EXPECT_FALSE(e.Errno("errno", "%s horrible %s %d times", longText.c_str(), "happened", 2)); + std::ostringstream out2; + e.DumpErrors(out2); + EXPECT_EQ(std::string("E: ").append(longText).append(" horrible happened 2 times - errno (0: ").append(textOfErrnoZero).append(")\n"), out2.str()); +} +TEST(GlobalErrorTest,UTF8Message) +{ + GlobalError e; + std::string text; + + EXPECT_FALSE(e.Warning("Репозиторий не обновлён и будут %d %s", 4, "test")); + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_EQ("Репозиторий не обновлён и будут 4 test", text); + + EXPECT_FALSE(e.Warning("Репозиторий не обновлён и будут %d %s", 4, "test")); + std::ostringstream out; + e.DumpErrors(out); + EXPECT_EQ("W: Репозиторий не обновлён и будут 4 test\n", out.str()); + + std::string longText; + for (size_t i = 0; i < 50; ++i) + longText.append("РезийбёбAZ"); + EXPECT_FALSE(e.Warning("%s", longText.c_str())); + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_EQ(longText, text); +} +TEST(GlobalErrorTest,MultiLineMessage) +{ + GlobalError e; + std::string text; + + EXPECT_FALSE(e.Warning("Sometimes one line isn't enough.\nYou do know what I mean, right?\r\n%s?\rGood because I don't.", "Right")); + EXPECT_FALSE(e.PopMessage(text)); + EXPECT_EQ("Sometimes one line isn't enough.\nYou do know what I mean, right?\r\nRight?\rGood because I don't.", text); + + EXPECT_FALSE(e.Warning("Sometimes one line isn't enough.\nYou do know what I mean, right?\r\n%s?\rGood because I don't.", "Right")); + std::ostringstream out; + e.DumpErrors(out); + EXPECT_EQ("W: Sometimes one line isn't enough.\n You do know what I mean, right?\n Right?\n Good because I don't.\n", out.str()); + + EXPECT_FALSE(e.Warning("Sometimes one line isn't enough.\nYou do know what I mean, right?\r\n%s?\rGood because I don't.\n", "Right")); + std::ostringstream out2; + e.DumpErrors(out2); + EXPECT_EQ("W: Sometimes one line isn't enough.\n You do know what I mean, right?\n Right?\n Good because I don't.\n", out2.str()); +} diff --git a/test/libapt/gtest_runner.cc b/test/libapt/gtest_runner.cc new file mode 100644 index 0000000..5620aa0 --- /dev/null +++ b/test/libapt/gtest_runner.cc @@ -0,0 +1,26 @@ +#include <gtest/gtest.h> + +#include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> +#include <apt-pkg/init.h> +#include <apt-pkg/pkgsystem.h> + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + if (pkgInitSystem(*_config, _system) == false) + return 42; + int const result = RUN_ALL_TESTS(); + if (_error->empty() == false) + { + std::cerr << "The test generated the following global messages:" << std::endl; + _error->DumpErrors(std::cerr); + // messages on the stack can't be right, error out + // even if we have no idea where this message came from + if (result == 0) + { + std::cerr << "All tests successful, but messages were generated, so still a failure!" << std::endl; + return 29; + } + } + return result; +} diff --git a/test/libapt/hashsums_test.cc b/test/libapt/hashsums_test.cc new file mode 100644 index 0000000..eede213 --- /dev/null +++ b/test/libapt/hashsums_test.cc @@ -0,0 +1,392 @@ +#include <config.h> + +#include <apt-pkg/configuration.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/hashes.h> +#include <apt-pkg/md5.h> +#include <apt-pkg/sha1.h> +#include <apt-pkg/sha2.h> +#include <apt-pkg/strutl.h> + +#include <iostream> +#include <string> +#include <stdlib.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +template <class T> void Test(const char *In,const char *Out) +{ + T Sum; + Sum.Add(In); + equals(Sum.Result().Value(), Out); +} + + + +TEST(HashSumsTest,SummationStrings) +{ +#define EXPECT_SUM(Summation, In, Out) \ + { \ + Summation Sum; \ + Sum.Add(In); \ + EXPECT_EQ(Sum.Result().Value(), Out) << #Summation << " for '" << In << "'"; \ + } + + // From FIPS PUB 180-1 + EXPECT_SUM(SHA1Summation, "","da39a3ee5e6b4b0d3255bfef95601890afd80709"); + EXPECT_SUM(SHA1Summation, "abc","a9993e364706816aba3e25717850c26c9cd0d89d"); + EXPECT_SUM(SHA1Summation, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "84983e441c3bd26ebaae4aa1f95129e5e54670f1"); + + // MD5 tests from RFC 1321 + EXPECT_SUM(MD5Summation, "","d41d8cd98f00b204e9800998ecf8427e"); + EXPECT_SUM(MD5Summation, "a","0cc175b9c0f1b6a831c399e269772661"); + EXPECT_SUM(MD5Summation, "abc","900150983cd24fb0d6963f7d28e17f72"); + EXPECT_SUM(MD5Summation, "message digest","f96b697d7cb7938d525a2f31aaf161d0"); + EXPECT_SUM(MD5Summation, "abcdefghijklmnopqrstuvwxyz","c3fcd3d76192e4007dfb496cca67e13b"); + EXPECT_SUM(MD5Summation, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "d174ab98d277d9f5a5611c2c9f419d9f"); + EXPECT_SUM(MD5Summation, "12345678901234567890123456789012345678901234567890123456789012345678901234567890", + "57edf4a22be3c955ac49da2e2107b67a"); + + // SHA-256, From FIPS 180-2 + EXPECT_SUM(SHA256Summation, "", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); + EXPECT_SUM(SHA256Summation, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"); + + // SHA-512 + EXPECT_SUM(SHA512Summation, "", + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce" + "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"); + EXPECT_SUM(SHA512Summation, "abc", + "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"); + + + EXPECT_SUM(MD5Summation, "The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6"); + EXPECT_SUM(MD5Summation, "The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0"); + EXPECT_SUM(SHA1Summation, "The quick brown fox jumps over the lazy dog", "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"); + EXPECT_SUM(SHA1Summation, "The quick brown fox jumps over the lazy cog", "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3"); + EXPECT_SUM(SHA256Summation, "The quick brown fox jumps over the lazy dog", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"); + EXPECT_SUM(SHA256Summation, "The quick brown fox jumps over the lazy dog.", "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c"); + EXPECT_SUM(SHA512Summation, "The quick brown fox jumps over the lazy dog", "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb64" + "2e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6"); + EXPECT_SUM(SHA512Summation, "The quick brown fox jumps over the lazy dog.", "91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bb" + "c6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed"); + +#undef EXPECT_SUM +} +TEST(HashSumsTest, Mill) +{ + SHA1Summation Sum1; + + const unsigned char As[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + size_t const AsCount = sizeof(As)/sizeof(As[0]) - 1; + size_t Count = 1000000; + while (Count != 0) + { + if (Count >= AsCount) + { + Sum1.Add(As, AsCount); + Count -= AsCount; + } + else + { + Sum1.Add(As,Count); + Count = 0; + } + } + + EXPECT_EQ("34aa973cd4c4daa4f61eeb2bdbad27316534016f", Sum1.Result().Value()); +} + +static void getSummationString(char const * const type, std::string &sum) +{ + /* to compare our result with an independent source we call the specific binaries + and read their result back. We do this with a little trick by claiming that the + summation is a compressor – and open the 'compressed' file later on directly to + read out the summation sum calculated by it */ + APT::Configuration::Compressor compress(type, ".ext", type, NULL, NULL, 99); + std::string name("apt-test-"); + name.append("hashsums").append(".XXXXXX"); + char * tempfile = strdup(name.c_str()); + int tempfile_fd = mkstemp(tempfile); + close(tempfile_fd); + ASSERT_NE(-1, tempfile_fd); + + FileFd fd; + ASSERT_TRUE(fd.Open(tempfile, FileFd::WriteOnly | FileFd::Empty, compress)); + ASSERT_TRUE(fd.IsOpen()); + FileFd input("/etc/os-release", FileFd::ReadOnly); + ASSERT_TRUE(input.IsOpen()); + ASSERT_NE(0u, input.FileSize()); + ASSERT_TRUE(CopyFile(input, fd)); + ASSERT_TRUE(input.IsOpen()); + ASSERT_TRUE(fd.IsOpen()); + ASSERT_FALSE(fd.Failed()); + input.Close(); + fd.Close(); + ASSERT_TRUE(fd.Open(tempfile, FileFd::ReadOnly, FileFd::None)); + ASSERT_TRUE(fd.IsOpen()); + ASSERT_NE(0u, fd.FileSize()); + ASSERT_FALSE(fd.Failed()); + unlink(tempfile); + free(tempfile); + char readback[2000]; + unsigned long long actual; + ASSERT_TRUE(fd.Read(readback, sizeof(readback)/sizeof(readback[0]), &actual)); + actual -= 4; + readback[actual] = '\0'; + sum = readback; +} +TEST(HashSumsTest, FileBased) +{ + std::string summation; + + getSummationString("md5sum", summation); + MD5SumValue md5(summation); + EXPECT_EQ(md5.Value(), summation); + + getSummationString("sha1sum", summation); + SHA1SumValue sha1(summation); + EXPECT_EQ(sha1.Value(), summation); + + getSummationString("sha256sum", summation); + SHA256SumValue sha256(summation); + EXPECT_EQ(sha256.Value(), summation); + + getSummationString("sha512sum", summation); + SHA512SumValue sha512(summation); + EXPECT_EQ(sha512.Value(), summation); + + FileFd fd("/etc/os-release", FileFd::ReadOnly); + EXPECT_TRUE(fd.IsOpen()); + std::string FileSize; + strprintf(FileSize, "%llu", fd.FileSize()); + + { + Hashes hashes; + hashes.AddFD(fd.Fd()); + HashStringList list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(5u, list.size()); + EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue()); + EXPECT_EQ(sha1.Value(), list.find("SHA1")->HashValue()); + EXPECT_EQ(sha256.Value(), list.find("SHA256")->HashValue()); + EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue()); + EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue()); + } + unsigned long long sz = fd.FileSize(); + fd.Seek(0); + { + Hashes hashes; + hashes.AddFD(fd.Fd(), sz); + HashStringList list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(5u, list.size()); + EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue()); + EXPECT_EQ(sha1.Value(), list.find("SHA1")->HashValue()); + EXPECT_EQ(sha256.Value(), list.find("SHA256")->HashValue()); + EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue()); + EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue()); + } + fd.Seek(0); + { + Hashes hashes(Hashes::MD5SUM | Hashes::SHA512SUM); + hashes.AddFD(fd); + HashStringList list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(3u, list.size()); + EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue()); + EXPECT_EQ(NULL, list.find("SHA1")); + EXPECT_EQ(NULL, list.find("SHA256")); + EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue()); + EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue()); + fd.Seek(0); + Hashes hashes2(list); + hashes2.AddFD(fd); + list = hashes2.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(3u, list.size()); + EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue()); + EXPECT_EQ(NULL, list.find("SHA1")); + EXPECT_EQ(NULL, list.find("SHA256")); + EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue()); + EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue()); + } + fd.Seek(0); + { + MD5Summation MD5; + MD5.AddFD(fd.Fd()); + EXPECT_EQ(md5.Value(), MD5.Result().Value()); + } + fd.Seek(0); + { + SHA1Summation SHA1; + SHA1.AddFD(fd.Fd()); + EXPECT_EQ(sha1.Value(), SHA1.Result().Value()); + } + fd.Seek(0); + { + SHA256Summation SHA2; + SHA2.AddFD(fd.Fd()); + EXPECT_EQ(sha256.Value(), SHA2.Result().Value()); + } + fd.Seek(0); + { + SHA512Summation SHA2; + SHA2.AddFD(fd.Fd()); + EXPECT_EQ(sha512.Value(), SHA2.Result().Value()); + } + fd.Close(); + + HashString sha2file("SHA512", sha512.Value()); + EXPECT_TRUE(sha2file.VerifyFile("/etc/os-release")); + HashString sha2wrong("SHA512", "00000000000"); + EXPECT_FALSE(sha2wrong.VerifyFile("/etc/os-release")); + EXPECT_EQ(sha2file, sha2file); + EXPECT_TRUE(sha2file == sha2file); + EXPECT_NE(sha2file, sha2wrong); + EXPECT_TRUE(sha2file != sha2wrong); + + HashString sha2big("SHA256", sha256.Value()); + EXPECT_TRUE(sha2big.VerifyFile("/etc/os-release")); + HashString sha2small("sha256:" + sha256.Value()); + EXPECT_TRUE(sha2small.VerifyFile("/etc/os-release")); + EXPECT_EQ(sha2big, sha2small); + EXPECT_TRUE(sha2big == sha2small); + EXPECT_FALSE(sha2big != sha2small); + + HashStringList hashes; + EXPECT_TRUE(hashes.empty()); + EXPECT_TRUE(hashes.push_back(sha2file)); + EXPECT_FALSE(hashes.empty()); + EXPECT_EQ(1u, hashes.size()); + + HashStringList wrong; + EXPECT_TRUE(wrong.push_back(sha2wrong)); + EXPECT_NE(wrong, hashes); + EXPECT_FALSE(wrong == hashes); + EXPECT_TRUE(wrong != hashes); + + HashStringList similar; + EXPECT_TRUE(similar.push_back(sha2big)); + EXPECT_NE(similar, hashes); + EXPECT_FALSE(similar == hashes); + EXPECT_TRUE(similar != hashes); + + EXPECT_TRUE(hashes.push_back(sha2big)); + EXPECT_EQ(2u, hashes.size()); + EXPECT_TRUE(hashes.push_back(sha2small)); + EXPECT_EQ(2u, hashes.size()); + EXPECT_FALSE(hashes.push_back(sha2wrong)); + EXPECT_EQ(2u, hashes.size()); + EXPECT_TRUE(hashes.VerifyFile("/etc/os-release")); + + EXPECT_EQ(similar, hashes); + EXPECT_TRUE(similar == hashes); + EXPECT_FALSE(similar != hashes); + similar.clear(); + EXPECT_TRUE(similar.empty()); + EXPECT_EQ(0u, similar.size()); + EXPECT_NE(similar, hashes); + EXPECT_FALSE(similar == hashes); + EXPECT_TRUE(similar != hashes); +} +TEST(HashSumsTest, HashStringList) +{ + _config->Clear("Acquire::ForceHash"); + + HashStringList list; + EXPECT_TRUE(list.empty()); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(0u, list.size()); + EXPECT_EQ(NULL, list.find(NULL)); + EXPECT_EQ(NULL, list.find("")); + EXPECT_EQ(NULL, list.find("MD5Sum")); + EXPECT_EQ(NULL, list.find("ROT26")); + EXPECT_EQ(NULL, list.find("SHA1")); + EXPECT_EQ(0u, list.FileSize()); + + // empty lists aren't equal + HashStringList list2; + EXPECT_FALSE(list == list2); + EXPECT_TRUE(list != list2); + + // some hashes don't really contribute to usability + list.push_back(HashString("Checksum-FileSize", "29")); + EXPECT_FALSE(list.empty()); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(1u, list.size()); + EXPECT_EQ(29u, list.FileSize()); + list.push_back(HashString("MD5Sum", "d41d8cd98f00b204e9800998ecf8427e")); + EXPECT_FALSE(list.empty()); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(2u, list.size()); + EXPECT_EQ(29u, list.FileSize()); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + list.push_back(HashString("SHA1", "cacecbd74968bc90ea3342767e6b94f46ddbcafc")); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(3u, list.size()); + EXPECT_EQ(29u, list.FileSize()); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("SHA1")); + list.push_back(HashString("SHA256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")); + EXPECT_TRUE(list.usable()); + EXPECT_EQ(4u, list.size()); + EXPECT_EQ(29u, list.FileSize()); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("SHA1")); + EXPECT_TRUE(NULL != list.find("SHA256")); + + Hashes hashes; + hashes.Add("The quick brown fox jumps over the lazy dog"); + list = hashes.GetHashStringList(); + EXPECT_FALSE(list.empty()); + EXPECT_TRUE(list.usable()); + EXPECT_EQ(5u, list.size()); + EXPECT_TRUE(NULL != list.find(NULL)); + EXPECT_TRUE(NULL != list.find("")); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("Checksum-FileSize")); + EXPECT_TRUE(NULL == list.find("ROT26")); + + _config->Set("Acquire::ForceHash", "MD5Sum"); + EXPECT_FALSE(list.empty()); + EXPECT_TRUE(list.usable()); + EXPECT_EQ(5u, list.size()); + EXPECT_TRUE(NULL != list.find(NULL)); + EXPECT_TRUE(NULL != list.find("")); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("Checksum-FileSize")); + EXPECT_TRUE(NULL == list.find("ROT26")); + + _config->Set("Acquire::ForceHash", "ROT26"); + EXPECT_FALSE(list.empty()); + EXPECT_FALSE(list.usable()); + EXPECT_EQ(5u, list.size()); + EXPECT_TRUE(NULL == list.find(NULL)); + EXPECT_TRUE(NULL == list.find("")); + EXPECT_TRUE(NULL != list.find("MD5Sum")); + EXPECT_TRUE(NULL != list.find("Checksum-FileSize")); + EXPECT_TRUE(NULL == list.find("ROT26")); + + _config->Clear("Acquire::ForceHash"); + + list2.push_back(*list.find("MD5Sum")); + EXPECT_TRUE(list == list2); + EXPECT_FALSE(list != list2); + + // introduce a mismatch to the list + list2.push_back(HashString("SHA1", "cacecbd74968bc90ea3342767e6b94f46ddbcafc")); + EXPECT_FALSE(list == list2); + EXPECT_TRUE(list != list2); + + _config->Set("Acquire::ForceHash", "MD5Sum"); + EXPECT_TRUE(list == list2); + EXPECT_FALSE(list != list2); + + _config->Clear("Acquire::ForceHash"); +} diff --git a/test/libapt/indexcopytosourcelist_test.cc b/test/libapt/indexcopytosourcelist_test.cc new file mode 100644 index 0000000..b0bfeb4 --- /dev/null +++ b/test/libapt/indexcopytosourcelist_test.cc @@ -0,0 +1,109 @@ +#include <config.h> + +#include <apt-pkg/aptconfiguration.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/indexcopy.h> + +#include <string> +#include <stdio.h> + +#include <gtest/gtest.h> + +class NoCopy : private IndexCopy { + public: + std::string ConvertToSourceList(std::string const &CD,std::string &&Path) { + IndexCopy::ConvertToSourceList(CD, Path); + return Path; + } + bool GetFile(std::string &/*Filename*/, unsigned long long &/*Size*/) APT_OVERRIDE { return false; } + bool RewriteEntry(FileFd & /*Target*/, std::string const &/*File*/) APT_OVERRIDE { return false; } + const char *GetFileName() APT_OVERRIDE { return NULL; } + const char *Type() APT_OVERRIDE { return NULL; } + +}; + +TEST(IndexCopyTest, ConvertToSourceList) +{ + NoCopy ic; + std::string const CD("/media/cdrom/"); + + char const * Releases[] = { "unstable", "wheezy-updates", NULL }; + char const * Components[] = { "main", "non-free", NULL }; + + for (char const ** Release = Releases; *Release != NULL; ++Release) + { + SCOPED_TRACE(std::string("Release ") + *Release); + for (char const ** Component = Components; *Component != NULL; ++Component) + { + SCOPED_TRACE(std::string("Component ") + *Component); + std::string const Path = std::string("dists/") + *Release + "/" + *Component + "/"; + std::string const Binary = Path + "binary-"; + std::string const A = Binary + "armel/"; + std::string const B = Binary + "mips/"; + std::string const C = Binary + "kfreebsd-mips/"; + std::string const S = Path + "source/"; + std::string const List = std::string(*Release) + " " + *Component; + + { + SCOPED_TRACE("no archs configured"); + _config->Clear("APT"); + _config->Set("APT::Architecture", "all"); + _config->Set("APT::Architectures::", "all"); + APT::Configuration::getArchitectures(false); + EXPECT_EQ(A, ic.ConvertToSourceList("/media/cdrom/", CD + A)); + EXPECT_EQ(B, ic.ConvertToSourceList("/media/cdrom/", CD + B)); + EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S)); + } + + { + SCOPED_TRACE("mips configured"); + _config->Clear("APT"); + _config->Set("APT::Architecture", "mips"); + _config->Set("APT::Architectures::", "mips"); + APT::Configuration::getArchitectures(false); + EXPECT_EQ(A, ic.ConvertToSourceList("/media/cdrom/", CD + A)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + B)); + EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S)); + } + + { + SCOPED_TRACE("kfreebsd-mips configured"); + _config->Clear("APT"); + _config->Set("APT::Architecture", "kfreebsd-mips"); + _config->Set("APT::Architectures::", "kfreebsd-mips"); + APT::Configuration::getArchitectures(false); + EXPECT_EQ(A, ic.ConvertToSourceList("/media/cdrom/", CD + A)); + EXPECT_EQ(B, ic.ConvertToSourceList("/media/cdrom/", CD + B)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + C)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S)); + } + + { + SCOPED_TRACE("armel configured"); + _config->Clear("APT"); + _config->Set("APT::Architecture", "armel"); + _config->Set("APT::Architectures::", "armel"); + APT::Configuration::getArchitectures(false); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + A)); + EXPECT_EQ(B, ic.ConvertToSourceList("/media/cdrom/", CD + B)); + EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S)); + } + + { + SCOPED_TRACE("armel+mips configured"); + _config->Clear("APT"); + _config->Set("APT::Architecture", "armel"); + _config->Set("APT::Architectures::", "armel"); + _config->Set("APT::Architectures::", "mips"); + APT::Configuration::getArchitectures(false); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + A)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + B)); + EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C)); + EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S)); + } + } + } +} diff --git a/test/libapt/install_progress_test.cc b/test/libapt/install_progress_test.cc new file mode 100644 index 0000000..68101af --- /dev/null +++ b/test/libapt/install_progress_test.cc @@ -0,0 +1,25 @@ +#include <config.h> + +#include <apt-pkg/install-progress.h> + +#include <string> + +#include <gtest/gtest.h> + +TEST(InstallProgressTest, FancyGetTextProgressStr) +{ + APT::Progress::PackageManagerFancy p; + + EXPECT_EQ(60u, p.GetTextProgressStr(0.5, 60).size()); + EXPECT_EQ("[#.]", p.GetTextProgressStr(0.5, 4)); + EXPECT_EQ("[..........]", p.GetTextProgressStr(0.0, 12)); + EXPECT_EQ("[#.........]", p.GetTextProgressStr(0.1, 12)); + EXPECT_EQ("[####......]", p.GetTextProgressStr(0.4999, 12)); + EXPECT_EQ("[#####.....]", p.GetTextProgressStr(0.5001, 12)); + EXPECT_EQ("[#########.]", p.GetTextProgressStr(0.9001, 12)); + EXPECT_EQ("[##########]", p.GetTextProgressStr(1.0, 12)); + + // deal with incorrect inputs gracefully (or should we die instead?) + EXPECT_EQ("[..........]", p.GetTextProgressStr(-1.0, 12)); + EXPECT_EQ("[##########]", p.GetTextProgressStr(2.0, 12)); +} diff --git a/test/libapt/openmaybeclearsignedfile_test.cc b/test/libapt/openmaybeclearsignedfile_test.cc new file mode 100644 index 0000000..0a4d443 --- /dev/null +++ b/test/libapt/openmaybeclearsignedfile_test.cc @@ -0,0 +1,485 @@ +#include <config.h> + +#include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/gpgv.h> + +#include <string> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +/* The test files are created with the 'Joe Sixpack' and 'Marvin Paranoid' + test key included in the integration testing framework */ + +TEST(OpenMaybeClearSignedFileTest,SimpleSignedFile) +{ + std::string tempfile; + FileFd fd; + // Using c++11 raw-strings would be nifty, but travis doesn't support it… + createTemporaryFile("simplesignedfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "Test"); + EXPECT_TRUE(fd.Eof()); +} + +TEST(OpenMaybeClearSignedFileTest,WhitespaceSignedFile) +{ + std::string tempfile; + FileFd fd; + // no raw-string here to protect the whitespace from cleanup + createTemporaryFile("simplesignedfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE----- \t \n" +"Hash: SHA512 \n" +" \n" +"Test \n" +"-----BEGIN PGP SIGNATURE----- \n" +" \n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt \n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l \n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg \n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k \n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx \n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns \n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq \n" +"=TB1F \n" +"-----END PGP SIGNATURE-----"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "Test"); + EXPECT_TRUE(fd.Eof()); +} + +TEST(OpenMaybeClearSignedFileTest,SignedFileWithContentHeaders) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("headerssignedfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Version: 0.8.15~exp1\n" +"Hash: SHA512\n" +"Comment: I love you!\n" +"X-Expires: never\n" +"Multilines: no\n" +" yes\n" +" maybe\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "Test"); + EXPECT_TRUE(fd.Eof()); +} + +TEST(OpenMaybeClearSignedFileTest,SignedFileWithTwoSignatures) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("doublesignedfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFHBAEBCgAxFiEE3mauypFRr6GHfsMd6FJdR1KBROIFAlhT/yYTHG1hcnZpbkBl\n" +"eGFtcGxlLm9yZwAKCRDoUl1HUoFE4qq3B/459MSk3xCW30wc5+ul5ZxTSg6eLYPJ\n" +"tfVNYi90/ZxRrYQAN+EWozEIZcxoMYp8Ans3++irkjPbHs4NsesmFKt2W5meFl4V\n" +"oUzYrOh5y5GlDeF7ok5g9atQe8BojjBics+g1IBYcnaMU+ywONmlixa03IPGfxV5\n" +"oTx02Xvlns20i6HRc0WFtft5q1hXo4EIlVc9O0u902SVEEkeuHF3+bCcXrNLPBJA\n" +"+8dxmH5+i89f/kVqURrdHdEuA1tsTNyb2C+lvRONh21H8QRRTU/iUQSzV6vZvof5\n" +"ASc9hsAZRG0xHuRU0F94V/XrkWw8QYAobJ/yxvs4L0EuA4optbSqawDB\n" +"=CP8j\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "Test"); + EXPECT_TRUE(fd.Eof()); +} + +TEST(OpenMaybeClearSignedFileTest,TwoSimpleSignedFile) +{ + std::string tempfile; + FileFd fd; + // read only the first message + createTemporaryFile("twosimplesignedfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n" +"-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----"); + EXPECT_TRUE(_error->empty()); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(_error->empty()); + EXPECT_FALSE(fd.IsOpen()); + + // technically they are signed, but we just want one message + EXPECT_TRUE(_error->PendingError()); + std::string msg; + EXPECT_TRUE(_error->PopMessage(msg)); + EXPECT_EQ("Clearsigned file '" + tempfile + "' contains unsigned lines.", msg); +} + +TEST(OpenMaybeClearSignedFileTest,UnsignedFile) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("unsignedfile", fd, &tempfile, "Test"); + EXPECT_FALSE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "Test"); + EXPECT_TRUE(fd.Eof()); +} + +TEST(OpenMaybeClearSignedFileTest,GarbageTop) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("garbagetop", fd, &tempfile, "Garbage\n" +"-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_FALSE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(_error->empty()); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(fd.IsOpen()); + ASSERT_FALSE(_error->empty()); + ASSERT_TRUE(_error->PendingError()); + + std::string msg; + EXPECT_TRUE(_error->PopMessage(msg)); + EXPECT_EQ("Clearsigned file '" + tempfile + "' does not start with a signed message block.", msg); +} + +TEST(OpenMaybeClearSignedFileTest,GarbageHeader) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("garbageheader", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE----- Garbage\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_FALSE(StartsWithGPGClearTextSignature(tempfile)); + // beware: the file will be successfully opened as unsigned file + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "-----BEGIN PGP SIGNED MESSAGE----- Garbage\n"); + EXPECT_FALSE(fd.Eof()); +} + +TEST(OpenMaybeClearSignedFileTest,GarbageBottom) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("garbagebottom", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n" +"Garbage"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(_error->empty()); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(fd.IsOpen()); + ASSERT_FALSE(_error->empty()); + ASSERT_TRUE(_error->PendingError()); + + std::string msg; + EXPECT_TRUE(_error->PopMessage(msg)); + EXPECT_EQ("Clearsigned file '" + tempfile + "' contains unsigned lines.", msg); +} + +TEST(OpenMaybeClearSignedFileTest,BogusNoSig) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("bogusnosig", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(_error->empty()); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(_error->empty()); + EXPECT_FALSE(fd.IsOpen()); + + std::string msg; + _error->PopMessage(msg); + EXPECT_EQ("Splitting of clearsigned file " + tempfile + " failed as it doesn't contain all expected parts", msg); +} + +TEST(OpenMaybeClearSignedFileTest,BogusSigStart) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("bogusnosig", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(_error->empty()); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(_error->empty()); + EXPECT_FALSE(fd.IsOpen()); + + std::string msg; + _error->PopMessage(msg); + EXPECT_EQ("Signature in file " + tempfile + " wasn't closed", msg); +} + +TEST(OpenMaybeClearSignedFileTest,DashedSignedFile) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("dashedsignedfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"- Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_TRUE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_TRUE(fd.IsOpen()); + char buffer[100]; + EXPECT_TRUE(fd.ReadLine(buffer, sizeof(buffer))); + EXPECT_STREQ(buffer, "Test"); + EXPECT_TRUE(fd.Eof()); +} +TEST(OpenMaybeClearSignedFileTest,StrangeDashArmorFile) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("strangedashfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"-Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(_error->empty()); + EXPECT_FALSE(fd.IsOpen()); + + std::string msg; + EXPECT_TRUE(_error->PendingError()); + EXPECT_TRUE(_error->PopMessage(msg)); + EXPECT_EQ("Clearsigned file '" + tempfile + "' contains unexpected line starting with a dash (armor)", msg); +} +TEST(OpenMaybeClearSignedFileTest,StrangeDashMsgFile) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("strangedashfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"-Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"X/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(_error->empty()); + EXPECT_FALSE(fd.IsOpen()); + + std::string msg; + EXPECT_TRUE(_error->PendingError()); + EXPECT_TRUE(_error->PopMessage(msg)); + EXPECT_EQ("Clearsigned file '" + tempfile + "' contains unexpected line starting with a dash (msg)", msg); +} +TEST(OpenMaybeClearSignedFileTest,StrangeDashSigFile) +{ + std::string tempfile; + FileFd fd; + createTemporaryFile("strangedashfile", fd, &tempfile, "-----BEGIN PGP SIGNED MESSAGE-----\n" +"Hash: SHA512\n" +"\n" +"Test\n" +"-----BEGIN PGP SIGNATURE-----\n" +"\n" +"iQFEBAEBCgAuFiEENKjp0Y2zIPNn6OqgWpDRQdusja4FAlhT7+kQHGpvZUBleGFt\n" +"cGxlLm9yZwAKCRBakNFB26yNrjvEB/9/e3jA1l0fvPafx9LEXcH8CLpUFQK7ra9l\n" +"3M4YAH4JKQlTG1be7ixruBRlCTh3YiSs66fKMeJeUYoxA2HPhvbGFEjQFAxunEYg\n" +"-/LBKv1mQWa+Q34P5GBjK8kQdLCN+yJAiUErmWNQG3GPninrxsC9tY5jcWvHeP1k\n" +"V7N3MLnNqzXaCJM24mnKidC5IDadUdQ8qC8c3rjUexQ8vBz0eucH56jbqV5oOcvx\n" +"pjlW965dCPIf3OI8q6J7bIOjyY+u/PTcVlqPq3TUz/ti6RkVbKpLH0D4ll3lUTns\n" +"JQt/+gJCPxHUJphy8sccBKhW29CLELJIIafvU30E1nWn9szh2Xjq\n" +"=TB1F\n" +"-----END PGP SIGNATURE-----\n"); + EXPECT_TRUE(StartsWithGPGClearTextSignature(tempfile)); + EXPECT_FALSE(OpenMaybeClearSignedFile(tempfile, fd)); + if (tempfile.empty() == false) + unlink(tempfile.c_str()); + EXPECT_FALSE(_error->empty()); + EXPECT_FALSE(fd.IsOpen()); + + std::string msg; + EXPECT_TRUE(_error->PendingError()); + EXPECT_TRUE(_error->PopMessage(msg)); + EXPECT_EQ("Clearsigned file '" + tempfile + "' contains unexpected line starting with a dash (sig)", msg); +} diff --git a/test/libapt/parsedepends_test.cc b/test/libapt/parsedepends_test.cc new file mode 100644 index 0000000..ed849f7 --- /dev/null +++ b/test/libapt/parsedepends_test.cc @@ -0,0 +1,280 @@ +#include <config.h> + +#include <apt-pkg/configuration.h> +#include <apt-pkg/deblistparser.h> +#include <apt-pkg/pkgcache.h> + +#include <string> +#include <string.h> + +#include <gtest/gtest.h> + +static void parseDependency(bool const StripMultiArch, bool const ParseArchFlags, bool const ParseRestrictionsList, std::string Arch) +{ + std::string Package; + std::string Version; + unsigned int Op = 5; + unsigned int Null = 0; + // The tests are made for amd64. Specify a different arch here to check if + // they still work. + _config->Set("APT::Architecture",Arch); + _config->Set("APT::Build-Profiles","stage1"); + + const char* Depends = + "debhelper:any (>= 5.0), " + "libdb-dev:any, " + "gettext:native (<= 0.12), " + "libcurl4-gnutls-dev:native | libcurl3-gnutls-dev (>> 7.15.5), " + "docbook-xml, " + "apt (>= 0.7.25), " + "not-for-me [ !amd64 ], " + "only-for-me [ amd64 ], " + "any-for-me [ any ], " + "not-for-darwin [ !darwin-any ], " + "cpu-for-me [ any-amd64 ], " + "os-for-me [ linux-any ], " + "libc-for-me [ gnu-linux-any ], " + "libc-not-for-me [ musl-linux-any ], " + "cpu-not-for-me [ any-armel ], " + "os-not-for-me [ kfreebsd-any ], " + "not-in-stage1 <!stage1>, " + "not-stage1-and-not-nodoc <!nodoc !stage1>, " + "not-stage1-or-not-nodoc <!nodoc> <!stage1>, " + "unknown-profile <unknown stage1>, " + "overlord-dev:any (= 7.15.3~) | overlord-dev:native (>> 7.15.5), " + ; + + // Stripping MultiArch is currently the default setting to not confuse + // non-MultiArch capable users of the library with "strange" extensions. + const char* Start = Depends; + const char* End = Depends + strlen(Depends); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + if (StripMultiArch == true) + EXPECT_EQ("debhelper", Package); + else + EXPECT_EQ("debhelper:any", Package); + EXPECT_EQ("5.0", Version); + EXPECT_EQ(Null | pkgCache::Dep::GreaterEq, Op); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + if (StripMultiArch == true) + EXPECT_EQ("libdb-dev", Package); + else + EXPECT_EQ("libdb-dev:any", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + if (StripMultiArch == true) + EXPECT_EQ("gettext", Package); + else + EXPECT_EQ("gettext:native", Package); + EXPECT_EQ("0.12", Version); + EXPECT_EQ(Null | pkgCache::Dep::LessEq, Op); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + if (StripMultiArch == true) + EXPECT_EQ("libcurl4-gnutls-dev", Package); + else + EXPECT_EQ("libcurl4-gnutls-dev:native", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::Or, Op); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("libcurl3-gnutls-dev", Package); + EXPECT_EQ("7.15.5", Version); + EXPECT_EQ(Null | pkgCache::Dep::Greater, Op); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("docbook-xml", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("apt", Package); + EXPECT_EQ("0.7.25", Version); + EXPECT_EQ(Null | pkgCache::Dep::GreaterEq, Op); + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // not-for-me + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("only-for-me", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("any-for-me", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("not-for-darwin", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("cpu-for-me", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("os-for-me", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("libc-for-me", Package); + EXPECT_EQ("", Version); + EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // libc-not-for-me + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // cpu-not-for-me + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseArchFlags == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // os-not-for-me + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseRestrictionsList == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // not-in-stage1 + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseRestrictionsList == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // not-stage1-and-not-nodoc + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseRestrictionsList == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("not-stage1-or-not-nodoc", Package); + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + if (ParseRestrictionsList == true) { + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + EXPECT_EQ("", Package); // unknown-profile + } else { + EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64")); + Start = strstr(Start, ","); + Start++; + } + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + if (StripMultiArch == true) + EXPECT_EQ("overlord-dev", Package); + else + EXPECT_EQ("overlord-dev:any", Package); + EXPECT_EQ("7.15.3~", Version); + EXPECT_EQ(Null | pkgCache::Dep::Equals | pkgCache::Dep::Or, Op); + + debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList, "amd64"); + if (StripMultiArch == true) + EXPECT_EQ("overlord-dev", Package); + else + EXPECT_EQ("overlord-dev:native", Package); + EXPECT_EQ("7.15.5", Version); + EXPECT_EQ(Null | pkgCache::Dep::Greater, Op); +} + +// FIXME: This testcase is too big/complex +TEST(ParseDependsTest, Everything) +{ + bool StripMultiArch = true; + bool ParseArchFlags = false; + bool ParseRestrictionsList = false; + unsigned short runner = 0; + +test: + { + SCOPED_TRACE(std::string("StripMultiArch: ") + (StripMultiArch ? "true" : "false")); + SCOPED_TRACE(std::string("ParseArchFlags: ") + (ParseArchFlags ? "true" : "false")); + SCOPED_TRACE(std::string("ParseRestrictionsList: ") + (ParseRestrictionsList ? "true" : "false")); + parseDependency(StripMultiArch, ParseArchFlags, ParseRestrictionsList, "kfreebsd-i386"); + parseDependency(StripMultiArch, ParseArchFlags, ParseRestrictionsList, "amd64"); + } + if (StripMultiArch == false) { + if (ParseArchFlags == false) + ParseRestrictionsList = !ParseRestrictionsList; + ParseArchFlags = !ParseArchFlags; + } + StripMultiArch = !StripMultiArch; + + runner++; + if (runner < 8) + goto test; // this is the prove: tests are really evil ;) +} diff --git a/test/libapt/priority_test.cc b/test/libapt/priority_test.cc new file mode 100644 index 0000000..af7932a --- /dev/null +++ b/test/libapt/priority_test.cc @@ -0,0 +1,16 @@ +#include <config.h> +#include <apt-pkg/pkgcache.h> +#include <gtest/gtest.h> +#include <string> + +using std::string; + +// Tests for Bug#807523 +TEST(PriorityTest, PriorityPrinting) +{ + EXPECT_EQ("required", string(pkgCache::Priority(pkgCache::State::Required))); + EXPECT_EQ("important", string(pkgCache::Priority(pkgCache::State::Important))); + EXPECT_EQ("standard", string(pkgCache::Priority(pkgCache::State::Standard))); + EXPECT_EQ("optional", string(pkgCache::Priority(pkgCache::State::Optional))); + EXPECT_EQ("extra", string(pkgCache::Priority(pkgCache::State::Extra))); +} diff --git a/test/libapt/sourcelist_test.cc b/test/libapt/sourcelist_test.cc new file mode 100644 index 0000000..9441f56 --- /dev/null +++ b/test/libapt/sourcelist_test.cc @@ -0,0 +1,39 @@ +#include <config.h> + +#include <apt-pkg/fileutl.h> +#include <apt-pkg/sourcelist.h> + +#include <string> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +TEST(SourceListTest,ParseFileDeb822) +{ + FileFd fd; + std::string tempfile; + createTemporaryFile("parsefiledeb822.XXXXXX.sources", fd, &tempfile, + "Types: deb\n" + "URIs: http://ftp.debian.org/debian\n" + "Suites: stable\n" + "Components: main\n" + "Description: short\n" + " long description that can be very long\n" + "\n" + "Types: deb\n" + "URIs: http://ftp.debian.org/debian\n" + "Suites: unstable\n" + "Components: main non-free\n"); + fd.Close(); + + pkgSourceList sources; + EXPECT_EQ(true, sources.Read(tempfile)); + EXPECT_EQ(2u, sources.size()); + + if (tempfile.empty() == false) + unlink(tempfile.c_str()); +} diff --git a/test/libapt/srvrecs_test.cc b/test/libapt/srvrecs_test.cc new file mode 100644 index 0000000..f042579 --- /dev/null +++ b/test/libapt/srvrecs_test.cc @@ -0,0 +1,85 @@ +#include <config.h> + +#include <apt-pkg/srvrec.h> +#include <apt-pkg/strutl.h> + +#include <algorithm> +#include <iostream> +#include <string> + +#include <gtest/gtest.h> + +TEST(SrvRecTest, PopFromSrvRecs) +{ + std::vector<SrvRec> Meep; + Meep.emplace_back("foo", 20, 0, 80); + Meep.emplace_back("bar", 20, 0, 80); + Meep.emplace_back("baz", 30, 0, 80); + + EXPECT_EQ(Meep.size(), 3u); + SrvRec const result = PopFromSrvRecs(Meep); + // ensure that pop removed one element + EXPECT_EQ(Meep.size(), 2u); + EXPECT_NE(result.target, "baz"); + + SrvRec const result2 = PopFromSrvRecs(Meep); + EXPECT_NE(result.target, result2.target); + EXPECT_NE(result2.target, "baz"); + EXPECT_EQ(Meep.size(), 1u); + + SrvRec const result3 = PopFromSrvRecs(Meep); + EXPECT_EQ(result3.target, "baz"); + EXPECT_TRUE(Meep.empty()); +} + +TEST(SrvRecTest,Randomness) +{ + constexpr unsigned int testLength = 100; + std::vector<SrvRec> base1; + std::vector<SrvRec> base2; + std::vector<SrvRec> base3; + for (unsigned int i = 0; i < testLength; ++i) + { + std::string name; + strprintf(name, "foo%d", i); + base1.emplace_back(name, 20, 0, 80); + base2.emplace_back(name, 20, 0, 80); + base3.emplace_back(name, 30, 0, 80); + } + EXPECT_EQ(testLength, base1.size()); + EXPECT_EQ(testLength, base2.size()); + EXPECT_EQ(testLength, base3.size()); + std::move(base3.begin(), base3.end(), std::back_inserter(base2)); + EXPECT_EQ(testLength*2, base2.size()); + + std::vector<SrvRec> first_pull; + auto const startingClock = clock(); + for (unsigned int i = 0; i < testLength; ++i) + first_pull.push_back(PopFromSrvRecs(base1)); + EXPECT_TRUE(base1.empty()); + EXPECT_FALSE(first_pull.empty()); + EXPECT_EQ(testLength, first_pull.size()); + + // busy-wait for a cpu-clock change as we use it as "random" value + if (startingClock != -1) + for (int i = 0; i < 100000; ++i) + if (startingClock != clock()) + break; + + std::vector<SrvRec> second_pull; + for (unsigned int i = 0; i < testLength; ++i) + second_pull.push_back(PopFromSrvRecs(base2)); + EXPECT_FALSE(base2.empty()); + EXPECT_FALSE(second_pull.empty()); + EXPECT_EQ(testLength, second_pull.size()); + + EXPECT_EQ(first_pull.size(), second_pull.size()); + EXPECT_TRUE(std::all_of(first_pull.begin(), first_pull.end(), [](SrvRec const &R) { return R.priority == 20; })); + EXPECT_TRUE(std::all_of(second_pull.begin(), second_pull.end(), [](SrvRec const &R) { return R.priority == 20; })); + if (startingClock != -1 && startingClock != clock()) + { + EXPECT_FALSE(std::equal(first_pull.begin(), first_pull.end(), second_pull.begin())); + } + + EXPECT_TRUE(std::all_of(base2.begin(), base2.end(), [](SrvRec const &R) { return R.priority == 30; })); +} diff --git a/test/libapt/stringview_test.cc b/test/libapt/stringview_test.cc new file mode 100644 index 0000000..95fbe89 --- /dev/null +++ b/test/libapt/stringview_test.cc @@ -0,0 +1,90 @@ +#if !(defined APT_PKG_EXPOSE_STRING_VIEW) + #define APT_PKG_EXPOSE_STRING_VIEW +#endif + +#include <config.h> +#include <apt-pkg/string_view.h> +#include <string> + +#include <type_traits> + +#include <gtest/gtest.h> + +TEST(StringViewTest,EmptyString) +{ + constexpr APT::StringView defString; + static_assert( 0 == defString.length(), "def right size"); + + APT::StringView strString{std::string{}}; + EXPECT_EQ(0u, strString.length()); + + constexpr char const * const charp = ""; + constexpr APT::StringView charpString{charp, 0}; + static_assert( 0 == charpString.length(), "charp right size"); + + APT::StringView charp2String{charp}; + EXPECT_EQ(0u, strString.length()); + + const APT::StringView charaString{""}; + EXPECT_EQ(0u, charaString.length()); + + EXPECT_TRUE(APT::StringView("") == ""); + EXPECT_FALSE(APT::StringView("") != ""); +} + +TEST(StringViewTest,FooString) +{ + constexpr APT::StringView defString("fooGARBAGE", 3); + static_assert( 3 == defString.length(), "def right size"); + EXPECT_EQ(0, defString.to_string().compare(0, defString.length(), defString.data(), 3)); + + APT::StringView strString{std::string{"foo"}}; + EXPECT_EQ(3u, strString.length()); + EXPECT_EQ(0, strString.to_string().compare(0, strString.length(), strString.data(), 3)); + + constexpr char const * const charp = "fooGARBAGE"; + constexpr APT::StringView charpString{charp, 3}; + EXPECT_EQ(3u, charpString.length()); + EXPECT_EQ(0, charpString.to_string().compare(0, charpString.length(), charpString.data(), 3)); + + char * charp2 = strdup("foo"); + APT::StringView charp2String{charp2}; + EXPECT_EQ(3u, charp2String.length()); + EXPECT_EQ(0, charp2String.to_string().compare(0, charp2String.length(), charp2String.data(), 3)); + free(charp2); + + const APT::StringView charaString{"foo"}; + EXPECT_EQ(3u, charaString.length()); + EXPECT_EQ(0, charaString.to_string().compare(0, charaString.length(), charaString.data(), 3)); + + EXPECT_TRUE(APT::StringView("foo") == "foo"); + EXPECT_FALSE(APT::StringView("foo") != "foo"); +} + +TEST(StringViewTest,SubStr) +{ + const APT::StringView defString("Hello World!"); + EXPECT_EQ(defString.to_string().substr(6), defString.substr(6).to_string()); + EXPECT_EQ(defString.to_string().substr(0,5), defString.substr(0,5).to_string()); + EXPECT_EQ(defString.to_string().substr(6,5), defString.substr(6,5).to_string()); +} + +TEST(StringViewTest,Find) +{ + const APT::StringView defString("Hello World!"); + EXPECT_EQ(defString.to_string().find('l'), defString.find('l')); + EXPECT_EQ(defString.to_string().find('X'), defString.find('X')); + EXPECT_EQ(defString.to_string().find('e',3), defString.find('e',3)); + EXPECT_EQ(defString.to_string().find('l',6), defString.find('l',6)); + EXPECT_EQ(defString.to_string().find('l',11), defString.find('l',11)); +} + +TEST(StringViewTest,RFind) +{ + const APT::StringView defString("Hello World!"); + EXPECT_EQ(defString.to_string().rfind('l'), defString.rfind('l')); + EXPECT_EQ(defString.to_string().rfind('X'), defString.rfind('X')); + EXPECT_EQ(defString.to_string().rfind('e',3), defString.rfind('e',3)); + EXPECT_EQ(defString.to_string().rfind('l',6), defString.rfind('l',6)); + EXPECT_EQ(defString.to_string().rfind('l',11), defString.rfind('l',11)); +} diff --git a/test/libapt/strutil_test.cc b/test/libapt/strutil_test.cc new file mode 100644 index 0000000..5cb6cb9 --- /dev/null +++ b/test/libapt/strutil_test.cc @@ -0,0 +1,363 @@ +#include <config.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/strutl.h> +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +TEST(StrUtilTest,DeEscapeString) +{ + // nothing special + EXPECT_EQ("", DeEscapeString("")); + EXPECT_EQ("foobar", DeEscapeString("foobar")); + // hex and octal + EXPECT_EQ("foo bar\nbaz", DeEscapeString("foo\\040bar\\x0abaz")); + EXPECT_EQ("foo ", DeEscapeString("foo\\040")); + EXPECT_EQ("\nbaz", DeEscapeString("\\x0abaz")); + EXPECT_EQ("/media/Ubuntu 11.04 amd64", DeEscapeString("/media/Ubuntu\\04011.04\\040amd64")); + // double slashes + EXPECT_EQ("foo\\ x", DeEscapeString("foo\\\\ x")); + EXPECT_EQ("\\foo\\", DeEscapeString("\\\\foo\\\\")); +} +TEST(StrUtilTest,StringStrip) +{ + EXPECT_EQ("", APT::String::Strip("")); + EXPECT_EQ("foobar", APT::String::Strip("foobar")); + EXPECT_EQ("foo bar", APT::String::Strip("foo bar")); + + EXPECT_EQ("", APT::String::Strip(" ")); + EXPECT_EQ("", APT::String::Strip(" \r\n \t ")); + + EXPECT_EQ("foo bar", APT::String::Strip("foo bar ")); + EXPECT_EQ("foo bar", APT::String::Strip("foo bar \r\n \t ")); + EXPECT_EQ("foo bar", APT::String::Strip("\r\n \t foo bar")); + EXPECT_EQ("bar foo", APT::String::Strip("\r\n \t bar foo \r\n \t ")); + EXPECT_EQ("bar \t\r\n foo", APT::String::Strip("\r\n \t bar \t\r\n foo \r\n \t ")); +} +TEST(StrUtilTest,StringSplitBasic) +{ + std::vector<std::string> result = StringSplit("", ""); + EXPECT_TRUE(result.empty()); + + result = StringSplit("abc", ""); + EXPECT_TRUE(result.empty()); + + result = StringSplit("", "abc"); + EXPECT_EQ(result.size(), 1u); + + result = StringSplit("abc", "b"); + ASSERT_EQ(result.size(), 2u); + EXPECT_EQ(result[0], "a"); + EXPECT_EQ(result[1], "c"); + + result = StringSplit("abc", "abc"); + ASSERT_EQ(result.size(), 2u); + EXPECT_EQ(result[0], ""); + EXPECT_EQ(result[1], ""); +} +TEST(StrUtilTest,StringSplitDpkgStatus) +{ + std::string const input = "status: libnet1:amd64: unpacked"; + std::vector<std::string> result = StringSplit(input, "xxx"); + ASSERT_EQ(result.size(), 1u); + EXPECT_EQ(result[0], input); + + result = StringSplit(input, ""); + EXPECT_TRUE(result.empty()); + + result = StringSplit(input, ": "); + ASSERT_EQ(result.size(), 3u); + EXPECT_EQ(result[0], "status"); + EXPECT_EQ(result[1], "libnet1:amd64"); + EXPECT_EQ(result[2], "unpacked"); + + result = StringSplit("x:y:z", ":", 2); + ASSERT_EQ(result.size(), 2u); + EXPECT_EQ(result[0], "x"); + EXPECT_EQ(result[1], "y:z"); +} +TEST(StrUtilTest,EndsWith) +{ + using APT::String::Endswith; + EXPECT_TRUE(Endswith("abcd", "d")); + EXPECT_TRUE(Endswith("abcd", "cd")); + EXPECT_TRUE(Endswith("abcd", "abcd")); + EXPECT_FALSE(Endswith("abcd", "x")); + EXPECT_FALSE(Endswith("abcd", "abcndefg")); +} +TEST(StrUtilTest,StartsWith) +{ + using APT::String::Startswith; + EXPECT_TRUE(Startswith("abcd", "a")); + EXPECT_TRUE(Startswith("abcd", "ab")); + EXPECT_TRUE(Startswith("abcd", "abcd")); + EXPECT_FALSE(Startswith("abcd", "x")); + EXPECT_FALSE(Startswith("abcd", "abcndefg")); +} +TEST(StrUtilTest,TimeToStr) +{ + EXPECT_EQ("0s", TimeToStr(0)); + EXPECT_EQ("42s", TimeToStr(42)); + EXPECT_EQ("9min 21s", TimeToStr((9*60) + 21)); + EXPECT_EQ("20min 42s", TimeToStr((20*60) + 42)); + EXPECT_EQ("10h 42min 21s", TimeToStr((10*3600) + (42*60) + 21)); + EXPECT_EQ("10h 42min 21s", TimeToStr((10*3600) + (42*60) + 21)); + EXPECT_EQ("1988d 3h 29min 7s", TimeToStr((1988*86400) + (3*3600) + (29*60) + 7)); + + EXPECT_EQ("59s", TimeToStr(59)); + EXPECT_EQ("60s", TimeToStr(60)); + EXPECT_EQ("1min 1s", TimeToStr(61)); + EXPECT_EQ("59min 59s", TimeToStr(3599)); + EXPECT_EQ("60min 0s", TimeToStr(3600)); + EXPECT_EQ("1h 0min 1s", TimeToStr(3601)); + EXPECT_EQ("1h 1min 0s", TimeToStr(3660)); + EXPECT_EQ("23h 59min 59s", TimeToStr(86399)); + EXPECT_EQ("24h 0min 0s", TimeToStr(86400)); + EXPECT_EQ("1d 0h 0min 1s", TimeToStr(86401)); + EXPECT_EQ("1d 0h 1min 0s", TimeToStr(86460)); +} +TEST(StrUtilTest,SubstVar) +{ + EXPECT_EQ("", SubstVar("", "fails", "passes")); + EXPECT_EQ("test ", SubstVar("test fails", "fails", "")); + EXPECT_EQ("test passes", SubstVar("test passes", "", "fails")); + + EXPECT_EQ("test passes", SubstVar("test passes", "fails", "passes")); + EXPECT_EQ("test passes", SubstVar("test fails", "fails", "passes")); + + EXPECT_EQ("starts with", SubstVar("beginnt with", "beginnt", "starts")); + EXPECT_EQ("beginnt with", SubstVar("starts with", "starts", "beginnt")); + EXPECT_EQ("is in middle", SubstVar("is in der middle", "in der", "in")); + EXPECT_EQ("is in der middle", SubstVar("is in middle", "in", "in der")); + EXPECT_EQ("does end", SubstVar("does enden", "enden", "end")); + EXPECT_EQ("does enden", SubstVar("does end", "end", "enden")); + + EXPECT_EQ("abc", SubstVar("abc", "d", "a")); + EXPECT_EQ("abc", SubstVar("abd", "d", "c")); + EXPECT_EQ("abc", SubstVar("adc", "d", "b")); + EXPECT_EQ("abc", SubstVar("dbc", "d", "a")); + + EXPECT_EQ("b", SubstVar("b", "aa", "a")); + EXPECT_EQ("bb", SubstVar("bb", "aa", "a")); + EXPECT_EQ("bbb", SubstVar("bbb", "aa", "a")); + + EXPECT_EQ("aa", SubstVar("aaaa", "aa", "a")); + EXPECT_EQ("aaaa", SubstVar("aa", "a", "aa")); + EXPECT_EQ("aaaa", SubstVar("aaaa", "a", "a")); + EXPECT_EQ("a a a a ", SubstVar("aaaa", "a", "a ")); + + EXPECT_EQ(" bb bb bb bb ", SubstVar(" a a a a ", "a", "bb")); + EXPECT_EQ(" bb bb bb bb ", SubstVar(" aaa aaa aaa aaa ", "aaa", "bb")); + EXPECT_EQ(" bb a bb a bb a bb ", SubstVar(" aaa a aaa a aaa a aaa ", "aaa", "bb")); + +} +TEST(StrUtilTest,Base64Encode) +{ + EXPECT_EQ("QWxhZGRpbjpvcGVuIHNlc2FtZQ==", Base64Encode("Aladdin:open sesame")); + EXPECT_EQ("cGxlYXN1cmUu", Base64Encode("pleasure.")); + EXPECT_EQ("bGVhc3VyZS4=", Base64Encode("leasure.")); + EXPECT_EQ("ZWFzdXJlLg==", Base64Encode("easure.")); + EXPECT_EQ("YXN1cmUu", Base64Encode("asure.")); + EXPECT_EQ("c3VyZS4=", Base64Encode("sure.")); + EXPECT_EQ("dXJlLg==", Base64Encode("ure.")); + EXPECT_EQ("cmUu", Base64Encode("re.")); + EXPECT_EQ("ZS4=", Base64Encode("e.")); + EXPECT_EQ("Lg==", Base64Encode(".")); + EXPECT_EQ("", Base64Encode("")); +} +static void ReadMessagesTestWithNewLine(char const * const nl, char const * const ab) +{ + SCOPED_TRACE(SubstVar(SubstVar(nl, "\n", "n"), "\r", "r") + " # " + ab); + FileFd fd; + std::string pkgA = "Package: pkgA\n" + "Version: 1\n" + "Size: 100\n" + "Description: aaa\n" + " aaa"; + std::string pkgB = "Package: pkgB\n" + "Version: 1\n" + "Flag: no\n" + "Description: bbb"; + std::string pkgC = "Package: pkgC\n" + "Version: 2\n" + "Flag: yes\n" + "Description:\n" + " ccc"; + + createTemporaryFile("readmessage", fd, NULL, (pkgA + nl + pkgB + nl + pkgC + nl).c_str()); + std::vector<std::string> list; + EXPECT_TRUE(ReadMessages(fd.Fd(), list)); + EXPECT_EQ(3u, list.size()); + EXPECT_EQ(pkgA, list[0]); + EXPECT_EQ(pkgB, list[1]); + EXPECT_EQ(pkgC, list[2]); + + size_t const msgsize = 63990; + createTemporaryFile("readmessage", fd, NULL, NULL); + for (size_t j = 0; j < msgsize; ++j) + fd.Write(ab, strlen(ab)); + for (size_t i = 0; i < 21; ++i) + { + std::string msg; + strprintf(msg, "msgsize=%zu i=%zu", msgsize, i); + SCOPED_TRACE(msg); + fd.Seek((msgsize + (i - 1)) * strlen(ab)); + fd.Write(ab, strlen(ab)); + fd.Write(nl, strlen(nl)); + fd.Seek(0); + list.clear(); + EXPECT_TRUE(ReadMessages(fd.Fd(), list)); + EXPECT_EQ(1u, list.size()); + EXPECT_EQ((msgsize + i) * strlen(ab), list[0].length()); + EXPECT_EQ(std::string::npos, list[0].find_first_not_of(ab)); + } + + list.clear(); + fd.Write(pkgA.c_str(), pkgA.length()); + fd.Write(nl, strlen(nl)); + fd.Seek(0); + EXPECT_TRUE(ReadMessages(fd.Fd(), list)); + EXPECT_EQ(2u, list.size()); + EXPECT_EQ((msgsize + 20) * strlen(ab), list[0].length()); + EXPECT_EQ(std::string::npos, list[0].find_first_not_of(ab)); + EXPECT_EQ(pkgA, list[1]); + + + fd.Close(); +} +TEST(StrUtilTest,ReadMessages) +{ + ReadMessagesTestWithNewLine("\n\n", "a"); + ReadMessagesTestWithNewLine("\r\n\r\n", "a"); + ReadMessagesTestWithNewLine("\n\n", "ab"); + ReadMessagesTestWithNewLine("\r\n\r\n", "ab"); +} +TEST(StrUtilTest,QuoteString) +{ + EXPECT_EQ("", QuoteString("", "")); + EXPECT_EQ("K%c3%b6ln", QuoteString("Köln", "")); + EXPECT_EQ("Köln", DeQuoteString(QuoteString("Köln", ""))); + EXPECT_EQ("Köln", DeQuoteString(DeQuoteString(QuoteString(QuoteString("Köln", ""), "")))); + EXPECT_EQ("~-_$#|u%c3%a4%c3%b6%c5%a6%e2%84%a2%e2%85%9e%c2%b1%c3%86%e1%ba%9e%c2%aa%c3%9f", QuoteString("~-_$#|uäöŦ™⅞±Æẞªß", "")); + EXPECT_EQ("~-_$#|uäöŦ™⅞±Æẞªß", DeQuoteString(QuoteString("~-_$#|uäöŦ™⅞±Æẞªß", ""))); + EXPECT_EQ("%45ltvill%65%2d%45rbach", QuoteString("Eltville-Erbach", "E-Ae")); + EXPECT_EQ("Eltville-Erbach", DeQuoteString(QuoteString("Eltville-Erbach", ""))); +} + +TEST(StrUtilTest,RFC1123StrToTime) +{ + { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 06 Nov 1994 08:49:37 GMT", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 6 Nov 1994 08:49:37 UTC", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 6 Nov 1994 08:49:37 UTC", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 06 Nov 1994 8:49:37 UTC", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 06 Nov 1994 08:49:37 UTC", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 06 Nov 1994 08:49:37 -0000", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun, 06 Nov 1994 08:49:37 +0000", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sunday, 06-Nov-94 08:49:37 GMT", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sunday, 6-Nov-94 08:49:37 GMT", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sunday, 06-Nov-94 8:49:37 GMT", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun Nov 6 08:49:37 1994", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun Nov 06 08:49:37 1994", t)); + EXPECT_EQ(784111777, t); + } { + time_t t; + EXPECT_TRUE(RFC1123StrToTime("Sun Nov 6 8:49:37 1994", t)); + EXPECT_EQ(784111777, t); + } + time_t t; + EXPECT_FALSE(RFC1123StrToTime("So, 06 Nov 1994 08:49:37 UTC", t)); + EXPECT_FALSE(RFC1123StrToTime(", 06 Nov 1994 08:49:37 UTC", t)); + EXPECT_FALSE(RFC1123StrToTime("Son, 06 Nov 1994 08:49:37 UTC", t)); + EXPECT_FALSE(RFC1123StrToTime("Sun: 06 Nov 1994 08:49:37 UTC", t)); + EXPECT_FALSE(RFC1123StrToTime("Sun, 06 Nov 1994 08:49:37", t)); + EXPECT_FALSE(RFC1123StrToTime("Sun, 06 Nov 1994 08:49:37 GMT+1", t)); + EXPECT_FALSE(RFC1123StrToTime("Sun, 06 Nov 1994 GMT", t)); + EXPECT_FALSE(RFC1123StrToTime("Sunday, 06 Nov 1994 GMT", t)); + EXPECT_FALSE(RFC1123StrToTime("Sonntag, 06 Nov 1994 08:49:37 GMT", t)); + EXPECT_FALSE(RFC1123StrToTime("domingo Nov 6 08:49:37 1994", t)); + EXPECT_FALSE(RFC1123StrToTime("Sunday: 06-Nov-94 08:49:37 GMT", t)); + EXPECT_FALSE(RFC1123StrToTime("Sunday, 06-Nov-94 08:49:37 GMT+1", t)); + EXPECT_FALSE(RFC1123StrToTime("Sunday, 06-Nov-94 08:49:37 EDT", t)); + EXPECT_FALSE(RFC1123StrToTime("Sunday, 06-Nov-94 08:49:37 -0100", t)); + EXPECT_FALSE(RFC1123StrToTime("Sunday, 06-Nov-94 08:49:37 -0.1", t)); +} +TEST(StrUtilTest, LookupTag) +{ + EXPECT_EQ("", LookupTag("", "Field", "")); + EXPECT_EQ("", LookupTag("", "Field", nullptr)); + EXPECT_EQ("default", LookupTag("", "Field", "default")); + EXPECT_EQ("default", LookupTag("Field1: yes", "Field", "default")); + EXPECT_EQ("default", LookupTag("Fiel: yes", "Field", "default")); + EXPECT_EQ("default", LookupTag("Fiel d: yes", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field: foo", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field: foo\n", "Field", "default")); + EXPECT_EQ("foo", LookupTag("\nField: foo\n", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field:foo", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field:foo\n", "Field", "default")); + EXPECT_EQ("foo", LookupTag("\nField:foo\n", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field:\tfoo\n", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field: foo \t", "Field", "default")); + EXPECT_EQ("foo", LookupTag("Field: foo \t\n", "Field", "default")); + EXPECT_EQ("Field : yes", LookupTag("Field: Field : yes \t\n", "Field", "default")); + EXPECT_EQ("Field : yes", LookupTag("Field:\n Field : yes \t\n", "Field", "default")); + EXPECT_EQ("Field : yes", LookupTag("Foo: bar\nField: Field : yes \t\n", "Field", "default")); + EXPECT_EQ("line1\nline2", LookupTag("Multi: line1\n line2", "Multi", "default")); + EXPECT_EQ("line1\nline2", LookupTag("Multi: line1\n line2\n", "Multi", "default")); + EXPECT_EQ("line1\nline2", LookupTag("Multi:\n line1\n line2\n", "Multi", "default")); + EXPECT_EQ("line1\n\nline2", LookupTag("Multi:\n line1\n .\n line2\n", "Multi", "default")); + EXPECT_EQ("line1\na\nline2", LookupTag("Multi:\n line1\n a\n line2\n", "Multi", "default")); + EXPECT_EQ("line1\nfoo\nline2", LookupTag("Multi:\n line1\n foo\n line2\n", "Multi", "default")); + EXPECT_EQ("line1\n line2", LookupTag("Multi: line1\n line2", "Multi", "default")); + EXPECT_EQ(" line1\n \t line2", LookupTag("Multi:\t \n line1\n \t line2\n", "Multi", "default")); + EXPECT_EQ(" line1\n\n\n \t line2", LookupTag("Multi:\t \n line1\n .\n . \n \t line2\n", "Multi", "default")); + + std::string const msg = + "Field1: Value1\nField2:Value2\nField3:\t Value3\n" + "Multi-Field1: Line1\n Line2\nMulti-Field2:\n Line1\n Line2\n" + "Field4: Value4\nField5:Value5"; + EXPECT_EQ("Value1", LookupTag(msg, "Field1", "")); + EXPECT_EQ("Value2", LookupTag(msg, "Field2", "")); + EXPECT_EQ("Value3", LookupTag(msg, "Field3", "")); + EXPECT_EQ("Line1\nLine2", LookupTag(msg, "Multi-Field1", "")); + EXPECT_EQ("Line1\nLine2", LookupTag(msg, "Multi-Field2", "")); + EXPECT_EQ("Value4", LookupTag(msg, "Field4", "")); + EXPECT_EQ("Value5", LookupTag(msg, "Field5", "")); +} diff --git a/test/libapt/tagfile_test.cc b/test/libapt/tagfile_test.cc new file mode 100644 index 0000000..8823ff7 --- /dev/null +++ b/test/libapt/tagfile_test.cc @@ -0,0 +1,287 @@ +#include <config.h> + +#include <apt-pkg/fileutl.h> +#include <apt-pkg/tagfile.h> + +#include <sstream> +#include <string> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +TEST(TagFileTest,SingleField) +{ + FileFd fd; + createTemporaryFile("singlefield", fd, NULL, "FieldA-12345678: the value of the field"); + + pkgTagFile tfile(&fd); + pkgTagSection section; + ASSERT_TRUE(tfile.Step(section)); + + // It has one field + EXPECT_EQ(1u, section.Count()); + // ... and it is called FieldA-12345678 + EXPECT_TRUE(section.Exists("FieldA-12345678")); + // its value is correct + EXPECT_EQ("the value of the field", section.FindS("FieldA-12345678")); + // A non-existent field has an empty string as value + EXPECT_EQ("", section.FindS("FieldB-12345678")); + // ... and Exists does not lie about missing fields... + EXPECT_FALSE(section.Exists("FieldB-12345678")); + // There is only one section in this tag file + EXPECT_FALSE(tfile.Step(section)); + + // Now we scan an empty section to test reset + ASSERT_TRUE(section.Scan("\n\n", 2, true)); + EXPECT_EQ(0u, section.Count()); + EXPECT_FALSE(section.Exists("FieldA-12345678")); + EXPECT_FALSE(section.Exists("FieldB-12345678")); + + createTemporaryFile("emptyfile", fd, NULL, NULL); + ASSERT_FALSE(tfile.Step(section)); + EXPECT_EQ(0u, section.Count()); +} + +TEST(TagFileTest,MultipleSections) +{ + FileFd fd; + createTemporaryFile("bigsection", fd, NULL, "Package: pkgA\n" + "Version: 1\n" + "Size: 100\n" + "Description: aaa\n" + " aaa\n" + "\n" + "Package: pkgB\n" + "Version: 1\n" + "Flag: no\n" + "Description: bbb\n" + "\n" + "Package: pkgC\n" + "Version: 2\n" + "Flag: yes\n" + "Description:\n" + " ccc\n" + ); + + pkgTagFile tfile(&fd); + pkgTagSection section; + EXPECT_FALSE(section.Exists("Version")); + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_EQ(4u, section.Count()); + EXPECT_TRUE(section.Exists("Version")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("Size")); + EXPECT_FALSE(section.Exists("Flag")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("pkgA", section.FindS("Package")); + EXPECT_EQ("1", section.FindS("Version")); + EXPECT_EQ(1u, section.FindULL("Version")); + EXPECT_EQ(100u, section.FindULL("Size")); + unsigned long Flags = 1; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(1u, Flags); + Flags = 0; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(0u, Flags); + EXPECT_EQ("aaa\n aaa", section.FindS("Description")); + + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_EQ(4u, section.Count()); + EXPECT_TRUE(section.Exists("Version")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("Size")); + EXPECT_TRUE(section.Exists("Flag")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("pkgB", section.FindS("Package")); + EXPECT_EQ("1", section.FindS("Version")); + EXPECT_EQ(1u, section.FindULL("Version")); + EXPECT_EQ(0u, section.FindULL("Size")); + Flags = 1; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(0u, Flags); + Flags = 0; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(0u, Flags); + EXPECT_EQ("bbb", section.FindS("Description")); + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_EQ(4u, section.Count()); + EXPECT_TRUE(section.Exists("Version")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("Size")); + EXPECT_TRUE(section.Exists("Flag")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("pkgC", section.FindS("Package")); + EXPECT_EQ("2", section.FindS("Version")); + EXPECT_EQ(2u, section.FindULL("Version")); + Flags = 0; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(1u, Flags); + Flags = 1; + EXPECT_TRUE(section.FindFlag("Flag", Flags, 1)); + EXPECT_EQ(1u, Flags); + EXPECT_EQ("ccc", section.FindS("Description")); + + // There is no section left in this tag file + EXPECT_FALSE(tfile.Step(section)); +} + +TEST(TagFileTest,BigSection) +{ + size_t const count = 500; + std::stringstream content; + for (size_t i = 0; i < count; ++i) + content << "Field-" << i << ": " << (2000 + i) << std::endl; + + FileFd fd; + createTemporaryFile("bigsection", fd, NULL, content.str().c_str()); + + pkgTagFile tfile(&fd); + pkgTagSection section; + EXPECT_TRUE(tfile.Step(section)); + + EXPECT_EQ(count, section.Count()); + for (size_t i = 0; i < count; ++i) + { + std::stringstream name; + name << "Field-" << i; + EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist"; + EXPECT_EQ((i + 2000), section.FindULL(name.str().c_str())); + } + + // There is only one section in this tag file + EXPECT_FALSE(tfile.Step(section)); +} + +TEST(TagFileTest, PickedUpFromPreviousCall) +{ + size_t const count = 500; + std::stringstream contentstream; + for (size_t i = 0; i < count; ++i) + contentstream << "Field-" << i << ": " << (2000 + i) << std::endl; + contentstream << std::endl << std::endl; + std::string content = contentstream.str(); + + pkgTagSection section; + EXPECT_FALSE(section.Scan(content.c_str(), content.size()/2)); + EXPECT_NE(0u, section.Count()); + EXPECT_NE(count, section.Count()); + EXPECT_TRUE(section.Scan(content.c_str(), content.size(), false)); + EXPECT_EQ(count, section.Count()); + + for (size_t i = 0; i < count; ++i) + { + std::stringstream name; + name << "Field-" << i; + EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist"; + EXPECT_EQ((i + 2000), section.FindULL(name.str().c_str())); + } +} + +TEST(TagFileTest, SpacesEverywhere) +{ + std::string content = + "Package: pkgA\n" + "Package: pkgB\n" + "NoSpaces:yes\n" + "NoValue:\n" + "TagSpaces\t :yes\n" + "ValueSpaces: \tyes\n" + "BothSpaces \t:\t yes\n" + "TrailingSpaces: yes\t \n" + "Naming Space: yes\n" + "Naming Spaces: yes\n" + "Package : pkgC \n" + "Multi-Colon::yes:\n" + "\n\n"; + + pkgTagSection section; + EXPECT_TRUE(section.Scan(content.c_str(), content.size())); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("NoSpaces")); + EXPECT_TRUE(section.Exists("NoValue")); + EXPECT_TRUE(section.Exists("TagSpaces")); + EXPECT_TRUE(section.Exists("ValueSpaces")); + EXPECT_TRUE(section.Exists("BothSpaces")); + EXPECT_TRUE(section.Exists("TrailingSpaces")); + EXPECT_TRUE(section.Exists("Naming Space")); + EXPECT_TRUE(section.Exists("Naming Spaces")); + EXPECT_TRUE(section.Exists("Multi-Colon")); + EXPECT_EQ("pkgC", section.FindS("Package")); + EXPECT_EQ("yes", section.FindS("NoSpaces")); + EXPECT_EQ("", section.FindS("NoValue")); + EXPECT_EQ("yes", section.FindS("TagSpaces")); + EXPECT_EQ("yes", section.FindS("ValueSpaces")); + EXPECT_EQ("yes", section.FindS("BothSpaces")); + EXPECT_EQ("yes", section.FindS("TrailingSpaces")); + EXPECT_EQ("yes", section.FindS("Naming Space")); + EXPECT_EQ("yes", section.FindS("Naming Spaces")); + EXPECT_EQ(":yes:", section.FindS("Multi-Colon")); + // overridden values are still present, but not really accessible + EXPECT_EQ(12u, section.Count()); +} + +TEST(TagFileTest, Comments) +{ + FileFd fd; + createTemporaryFile("commentfile", fd, NULL, "# Leading comments should be ignored.\n" +"\n" +"# A wild second comment appears!\n" +"\n" +"Source: foo\n" +"#Package: foo\n" +"Section: bar\n" +"#Section: overridden\n" +"Priority: optional\n" +"Build-Depends: debhelper,\n" +"# apt-utils, (temporarily disabled)\n" +" apt\n" +"\n" +"# Comments in the middle shouldn't result in extra blank paragraphs either.\n" +"\n" +"# Ditto.\n" +"\n" +"# A comment at the top of a paragraph should be ignored.\n" +"Package: foo\n" +"Architecture: any\n" +"Description: An awesome package\n" +" # This should still appear in the result.\n" +"# this one shouldn't\n" +" Blah, blah, blah. # but this again.\n" +"# A comment at the end of a paragraph should be ignored.\n" +"\n" +"# Trailing comments shouldn't cause extra blank paragraphs." + ); + + pkgTagFile tfile(&fd, pkgTagFile::SUPPORT_COMMENTS, 1); + pkgTagSection section; + EXPECT_TRUE(tfile.Step(section)); + EXPECT_FALSE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("Source")); + EXPECT_EQ("foo", section.FindS("Source")); + EXPECT_TRUE(section.Exists("Section")); + EXPECT_EQ("bar", section.FindS("Section")); + EXPECT_TRUE(section.Exists("Priority")); + EXPECT_EQ("optional", section.FindS("Priority")); + EXPECT_TRUE(section.Exists("Build-Depends")); + EXPECT_EQ("debhelper,\n apt", section.FindS("Build-Depends")); + + EXPECT_TRUE(tfile.Step(section)); + EXPECT_FALSE(section.Exists("Source")); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_EQ("foo", section.FindS("Package")); + EXPECT_FALSE(section.Exists("Section")); + EXPECT_TRUE(section.Exists("Architecture")); + EXPECT_EQ("any", section.FindS("Architecture")); + EXPECT_FALSE(section.Exists("Build-Depends")); + EXPECT_TRUE(section.Exists("Description")); + EXPECT_EQ("An awesome package\n # This should still appear in the result.\n Blah, blah, blah. # but this again.", section.FindS("Description")); + + EXPECT_FALSE(tfile.Step(section)); +} diff --git a/test/libapt/tagsection_test.cc b/test/libapt/tagsection_test.cc new file mode 100644 index 0000000..3f170b2 --- /dev/null +++ b/test/libapt/tagsection_test.cc @@ -0,0 +1,270 @@ +#include <config.h> + +#include <apt-pkg/fileutl.h> +#include <apt-pkg/tagfile.h> + +#include <sstream> +#include <string> + +#include <gtest/gtest.h> + +#include "file-helpers.h" + +std::string packageValue = "aaaa"; +std::string typoValue = "aa\n" + " .\n" + " cc"; +std::string typoRawValue = "\n " + typoValue; +std::string overrideValue = "1"; +/* + std::cerr << "FILECONTENT: »"; + char buffer[3000]; + while (fd.ReadLine(buffer, sizeof(buffer))) + std::cerr << buffer; + std::cerr << "«" << std::endl;; +*/ + +static void setupTestcaseStart(FileFd &fd, pkgTagSection §ion, std::string &content) +{ + createTemporaryFile("writesection", fd, NULL, NULL); + content = "Package: " + packageValue + "\n" + "TypoA:\n " + typoValue + "\n" + "Override: " + overrideValue + "\n" + "Override-Backup: " + overrideValue + "\n" + "\n"; + EXPECT_TRUE(section.Scan(content.c_str(), content.length(), true)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoA")); + EXPECT_EQ(typoRawValue, section.FindRawS("TypoA")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteUnmodified) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + EXPECT_TRUE(section.Write(fd)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoA")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteUnmodifiedOrder) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + char const * const order[] = { "Package", "TypoA", "Override", NULL }; + EXPECT_TRUE(section.Write(fd, order)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoA")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteUnmodifiedOrderReversed) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + char const * const order[] = { "Override", "TypoA", "Package", NULL }; + EXPECT_TRUE(section.Write(fd, order)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoA")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteUnmodifiedOrderNotAll) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + char const * const order[] = { "Override", NULL }; + EXPECT_TRUE(section.Write(fd, order)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoA")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteNoOrderRename) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + std::vector<pkgTagSection::Tag> rewrite; + rewrite.push_back(pkgTagSection::Tag::Rename("TypoA", "TypoB")); + EXPECT_TRUE(section.Write(fd, NULL, rewrite)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("TypoB")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoB")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteNoOrderRemove) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + std::vector<pkgTagSection::Tag> rewrite; + rewrite.push_back(pkgTagSection::Tag::Remove("TypoA")); + rewrite.push_back(pkgTagSection::Tag::Rewrite("Override", "")); + EXPECT_TRUE(section.Write(fd, NULL, rewrite)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("TypoA")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_FALSE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(2u, section.Count()); +} +TEST(TagSectionTest,WriteNoOrderRewrite) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + std::vector<pkgTagSection::Tag> rewrite; + rewrite.push_back(pkgTagSection::Tag::Rewrite("Override", "42")); + EXPECT_TRUE(section.Write(fd, NULL, rewrite)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(42, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteOrderRename) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + std::vector<pkgTagSection::Tag> rewrite; + rewrite.push_back(pkgTagSection::Tag::Rename("TypoA", "TypoB")); + char const * const order[] = { "Package", "TypoA", "Override", NULL }; + EXPECT_TRUE(section.Write(fd, order, rewrite)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("TypoA")); + EXPECT_TRUE(section.Exists("TypoB")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(typoValue, section.FindS("TypoB")); + EXPECT_EQ(1, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} +TEST(TagSectionTest,WriteOrderRemove) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + std::vector<pkgTagSection::Tag> rewrite; + rewrite.push_back(pkgTagSection::Tag::Remove("TypoA")); + rewrite.push_back(pkgTagSection::Tag::Rewrite("Override", "")); + char const * const order[] = { "Package", "TypoA", "Override", NULL }; + EXPECT_TRUE(section.Write(fd, order, rewrite)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_FALSE(section.Exists("TypoA")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_FALSE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(2u, section.Count()); +} +TEST(TagSectionTest,WriteOrderRewrite) +{ + FileFd fd; + pkgTagSection section; + std::string content; + setupTestcaseStart(fd, section, content); + std::vector<pkgTagSection::Tag> rewrite; + rewrite.push_back(pkgTagSection::Tag::Rewrite("Override", "42")); + char const * const order[] = { "Package", "TypoA", "Override", NULL }; + EXPECT_TRUE(section.Write(fd, order, rewrite)); + EXPECT_TRUE(fd.Seek(0)); + pkgTagFile tfile(&fd); + ASSERT_TRUE(tfile.Step(section)); + EXPECT_TRUE(section.Exists("Package")); + EXPECT_TRUE(section.Exists("TypoA")); + EXPECT_FALSE(section.Exists("TypoB")); + EXPECT_TRUE(section.Exists("Override")); + EXPECT_TRUE(section.Exists("Override-Backup")); + EXPECT_EQ(packageValue, section.FindS("Package")); + EXPECT_EQ(42, section.FindI("Override")); + EXPECT_EQ(1, section.FindI("Override-Backup")); + EXPECT_EQ(4u, section.Count()); +} diff --git a/test/libapt/teestream_test.cc b/test/libapt/teestream_test.cc new file mode 100644 index 0000000..a897e08 --- /dev/null +++ b/test/libapt/teestream_test.cc @@ -0,0 +1,39 @@ +#include <config.h> + +#include "../interactive-helper/teestream.h" +#include <fstream> +#include <sstream> +#include <string> + +#include <gtest/gtest.h> + +TEST(TeeStreamTest,TwoStringSinks) +{ + std::ostringstream one, two; + basic_teeostream<char> tee(one, two); + tee << "This is the " << 1 << '.' << " Test, we expect: " << std::boolalpha << true << "\n"; + std::string okay("This is the 1. Test, we expect: true\n"); + EXPECT_EQ(okay, one.str()); + EXPECT_EQ(okay, two.str()); + EXPECT_EQ(one.str(), two.str()); +} + +TEST(TeeStreamTest,DevNullSink1) +{ + std::ostringstream one; + std::fstream two("/dev/null"); + basic_teeostream<char> tee(one, two); + tee << "This is the " << 2 << '.' << " Test, we expect: " << std::boolalpha << false << "\n"; + std::string okay("This is the 2. Test, we expect: false\n"); + EXPECT_EQ(okay, one.str()); +} + +TEST(TeeStreamTest,DevNullSink2) +{ + std::ostringstream one; + std::fstream two("/dev/null"); + basic_teeostream<char> tee(two, one); + tee << "This is the " << 3 << '.' << " Test, we expect: " << std::boolalpha << false << "\n"; + std::string okay("This is the 3. Test, we expect: false\n"); + EXPECT_EQ(okay, one.str()); +} diff --git a/test/libapt/uri_test.cc b/test/libapt/uri_test.cc new file mode 100644 index 0000000..519de49 --- /dev/null +++ b/test/libapt/uri_test.cc @@ -0,0 +1,216 @@ +#include <config.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/proxy.h> +#include <apt-pkg/strutl.h> +#include <gtest/gtest.h> +#include <string> + +TEST(URITest, BasicHTTP) +{ + URI U("http://www.debian.org:90/temp/test"); + EXPECT_EQ("http", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(90u, U.Port); + EXPECT_EQ("www.debian.org", U.Host); + EXPECT_EQ("/temp/test", U.Path); + EXPECT_EQ("http://www.debian.org:90/temp/test", (std::string)U); + EXPECT_EQ("http://www.debian.org:90", URI::SiteOnly(U)); + EXPECT_EQ("http://www.debian.org:90/temp/test", URI::ArchiveOnly(U)); + EXPECT_EQ("http://www.debian.org:90/temp/test", URI::NoUserPassword(U)); + // Login data + U = URI("http://jgg:foo@ualberta.ca/blah"); + EXPECT_EQ("http", U.Access); + EXPECT_EQ("jgg", U.User); + EXPECT_EQ("foo", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("ualberta.ca", U.Host); + EXPECT_EQ("/blah", U.Path); + EXPECT_EQ("http://jgg:foo@ualberta.ca/blah", (std::string)U); + EXPECT_EQ("http://ualberta.ca", URI::SiteOnly(U)); + EXPECT_EQ("http://ualberta.ca/blah", URI::ArchiveOnly(U)); + EXPECT_EQ("http://ualberta.ca/blah", URI::NoUserPassword(U)); + // just a user + U = URI("https://apt@example.org/blah"); + EXPECT_EQ("https", U.Access); + EXPECT_EQ("apt", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("example.org", U.Host); + EXPECT_EQ("/blah", U.Path); + EXPECT_EQ("https://apt@example.org/blah", (std::string)U); + EXPECT_EQ("https://example.org", URI::SiteOnly(U)); + EXPECT_EQ("https://example.org/blah", URI::ArchiveOnly(U)); + EXPECT_EQ("https://example.org/blah", URI::NoUserPassword(U)); +} +TEST(URITest, SingeSlashFile) +{ + URI U("file:/usr/bin/foo"); + EXPECT_EQ("file", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("", U.Host); + EXPECT_EQ("/usr/bin/foo", U.Path); + EXPECT_EQ("file:/usr/bin/foo", (std::string)U); + EXPECT_EQ("file:", URI::SiteOnly(U)); + EXPECT_EQ("file:/usr/bin/foo", URI::ArchiveOnly(U)); + EXPECT_EQ("file:/usr/bin/foo", URI::NoUserPassword(U)); +} +TEST(URITest, BasicCDROM) +{ + URI U("cdrom:Moo Cow Rom:/debian"); + EXPECT_EQ("cdrom", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("Moo Cow Rom", U.Host); + EXPECT_EQ("/debian", U.Path); + EXPECT_EQ("cdrom://Moo Cow Rom/debian", (std::string)U); + EXPECT_EQ("cdrom://Moo Cow Rom", URI::SiteOnly(U)); + EXPECT_EQ("cdrom://Moo Cow Rom/debian", URI::ArchiveOnly(U)); + EXPECT_EQ("cdrom://Moo Cow Rom/debian", URI::NoUserPassword(U)); +} +TEST(URITest, RelativeGzip) +{ + URI U("gzip:./bar/cow"); + EXPECT_EQ("gzip", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ(".", U.Host); + EXPECT_EQ("/bar/cow", U.Path); + EXPECT_EQ("gzip://./bar/cow", (std::string)U); + EXPECT_EQ("gzip://.", URI::SiteOnly(U)); + EXPECT_EQ("gzip://./bar/cow", URI::ArchiveOnly(U)); + EXPECT_EQ("gzip://./bar/cow", URI::NoUserPassword(U)); +} +TEST(URITest, NoSlashFTP) +{ + URI U("ftp:ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb"); + EXPECT_EQ("ftp", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("ftp.fr.debian.org", U.Host); + EXPECT_EQ("/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", U.Path); + EXPECT_EQ("ftp://ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", (std::string)U); + EXPECT_EQ("ftp://ftp.fr.debian.org", URI::SiteOnly(U)); + EXPECT_EQ("ftp://ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", URI::ArchiveOnly(U)); + EXPECT_EQ("ftp://ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", URI::NoUserPassword(U)); +} +TEST(URITest, RFC2732) +{ + URI U("http://[1080::8:800:200C:417A]/foo"); + EXPECT_EQ("http", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("1080::8:800:200C:417A", U.Host); + EXPECT_EQ("/foo", U.Path); + EXPECT_EQ("http://[1080::8:800:200C:417A]/foo", (std::string)U); + EXPECT_EQ("http://[1080::8:800:200C:417A]", URI::SiteOnly(U)); + EXPECT_EQ("http://[1080::8:800:200C:417A]/foo", URI::ArchiveOnly(U)); + EXPECT_EQ("http://[1080::8:800:200C:417A]/foo", URI::NoUserPassword(U)); + // with port + U = URI("http://[::FFFF:129.144.52.38]:80/index.html"); + EXPECT_EQ("http", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(80u, U.Port); + EXPECT_EQ("::FFFF:129.144.52.38", U.Host); + EXPECT_EQ("/index.html", U.Path); + EXPECT_EQ("http://[::FFFF:129.144.52.38]:80/index.html", (std::string)U); + EXPECT_EQ("http://[::FFFF:129.144.52.38]:80", URI::SiteOnly(U)); + EXPECT_EQ("http://[::FFFF:129.144.52.38]:80/index.html", URI::ArchiveOnly(U)); + EXPECT_EQ("http://[::FFFF:129.144.52.38]:80/index.html", URI::NoUserPassword(U)); + // extra colon + U = URI("http://[::FFFF:129.144.52.38:]:80/index.html"); + EXPECT_EQ("http", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(80u, U.Port); + EXPECT_EQ("::FFFF:129.144.52.38:", U.Host); + EXPECT_EQ("/index.html", U.Path); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]:80/index.html", (std::string)U); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]:80", URI::SiteOnly(U)); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]:80/index.html", URI::ArchiveOnly(U)); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]:80/index.html", URI::NoUserPassword(U)); + // extra colon port + U = URI("http://[::FFFF:129.144.52.38:]/index.html"); + EXPECT_EQ("http", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("::FFFF:129.144.52.38:", U.Host); + EXPECT_EQ("/index.html", U.Path); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]/index.html", (std::string)U); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]", URI::SiteOnly(U)); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]/index.html", URI::ArchiveOnly(U)); + EXPECT_EQ("http://[::FFFF:129.144.52.38:]/index.html", URI::NoUserPassword(U)); + // My Evil Corruption of RFC 2732 to handle CDROM names! + // Fun for the whole family! */ + U = URI("cdrom:[The Debian 1.2 disk, 1/2 R1:6]/debian/"); + EXPECT_EQ("cdrom", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("The Debian 1.2 disk, 1/2 R1:6", U.Host); + EXPECT_EQ("/debian/", U.Path); + EXPECT_EQ("cdrom://[The Debian 1.2 disk, 1/2 R1:6]/debian/", (std::string)U); + EXPECT_EQ("cdrom://[The Debian 1.2 disk, 1/2 R1:6]", URI::SiteOnly(U)); + EXPECT_EQ("cdrom://[The Debian 1.2 disk, 1/2 R1:6]/debian", URI::ArchiveOnly(U)); + EXPECT_EQ("cdrom://[The Debian 1.2 disk, 1/2 R1:6]/debian/", URI::NoUserPassword(U)); + // no brackets + U = URI("cdrom:Foo Bar Cow/debian/"); + EXPECT_EQ("cdrom", U.Access); + EXPECT_EQ("", U.User); + EXPECT_EQ("", U.Password); + EXPECT_EQ(0u, U.Port); + EXPECT_EQ("Foo Bar Cow", U.Host); + EXPECT_EQ("/debian/", U.Path); + EXPECT_EQ("cdrom://Foo Bar Cow/debian/", (std::string)U); + EXPECT_EQ("cdrom://Foo Bar Cow", URI::SiteOnly(U)); + EXPECT_EQ("cdrom://Foo Bar Cow/debian", URI::ArchiveOnly(U)); + EXPECT_EQ("cdrom://Foo Bar Cow/debian/", URI::NoUserPassword(U)); + // percent encoded password + U = URI("ftp://foo:b%40r@example.org"); + EXPECT_EQ("foo", U.User); + EXPECT_EQ("b@r", U.Password); + EXPECT_EQ("ftp://foo:b%40r@example.org/", (std::string) U); + EXPECT_EQ("ftp://example.org", URI::SiteOnly(U)); + EXPECT_EQ("ftp://example.org", URI::ArchiveOnly(U)); + EXPECT_EQ("ftp://example.org/", URI::NoUserPassword(U)); + // percent encoded user + U = URI("ftp://f%40o:bar@example.org"); + EXPECT_EQ("f@o", U.User); + EXPECT_EQ("bar", U.Password); + EXPECT_EQ("ftp://f%40o:bar@example.org/", (std::string) U); + EXPECT_EQ("ftp://example.org", URI::SiteOnly(U)); + EXPECT_EQ("ftp://example.org", URI::ArchiveOnly(U)); + EXPECT_EQ("ftp://example.org/", URI::NoUserPassword(U)); +} +TEST(URITest, AutoProxyTest) +{ + URI u0("http://www.debian.org:90/temp/test"); + URI u1("http://www.debian.org:91/temp/test"); + + _config->Set("Acquire::http::Proxy-Auto-Detect", "./apt-proxy-script"); + + // Scenario 0: Autodetecting a simple proxy + AutoDetectProxy(u0); + EXPECT_EQ(_config->Find("Acquire::http::proxy::www.debian.org", ""), "http://example.com"); + + // Scenario 1: Proxy stays the same if it is already set + AutoDetectProxy(u1); + EXPECT_EQ(_config->Find("Acquire::http::proxy::www.debian.org", ""), "http://example.com"); + + // Scenario 2: Reading with stderr output works fine + _config->Clear("Acquire::http::proxy::www.debian.org"); + AutoDetectProxy(u1); + EXPECT_EQ(_config->Find("Acquire::http::proxy::www.debian.org", ""), "http://example.com/foo"); + + // Scenario 1 again: Proxy stays the same if it is already set + AutoDetectProxy(u0); + EXPECT_EQ(_config->Find("Acquire::http::proxy::www.debian.org", ""), "http://example.com/foo"); +} diff --git a/test/thread-safety/not-thread-safe.sh b/test/thread-safety/not-thread-safe.sh new file mode 100755 index 0000000..f86ef39 --- /dev/null +++ b/test/thread-safety/not-thread-safe.sh @@ -0,0 +1,7 @@ +git grep -p --color -n -E "$(grep -v ^# test/thread-safety/thread-check.txt | sed 's/(.*/\\\\ *\\\\(/' | xargs | tr ' ' '|')" \ + apt-inst/ apt-pkg/ | ansi2html | ssh alioth.debian.org 'cat > /home/groups/apt/htdocs/not-thread-safe/index.html' +git grep -p --color -n -E "$(grep ^# test/thread-safety/thread-check.txt | cut -f2 -d# | sed 's/(.*/\\\\ *\\\\(/' | xargs | tr ' ' '|')" \ + apt-inst/ apt-pkg/ | ansi2html | ssh alioth.debian.org 'cat > /home/groups/apt/htdocs/not-thread-safe/portable.html' + +git grep -p --color -n -E "$(grep -v ^# test/thread-safety/thread-check-internal.txt | sed 's/(.*/\\\\ *\\\\(/' | xargs | tr ' ' '|')" \ + apt-inst/ apt-pkg/ | ansi2html | ssh alioth.debian.org 'cat > /home/groups/apt/htdocs/not-thread-safe/internal.html' diff --git a/test/thread-safety/thread-check-internal.txt b/test/thread-safety/thread-check-internal.txt new file mode 100644 index 0000000..c55985f --- /dev/null +++ b/test/thread-safety/thread-check-internal.txt @@ -0,0 +1,3 @@ +CndSet() +Set() +Clear() diff --git a/test/thread-safety/thread-check.txt b/test/thread-safety/thread-check.txt new file mode 100644 index 0000000..ed00965 --- /dev/null +++ b/test/thread-safety/thread-check.txt @@ -0,0 +1,91 @@ +asctime() +basename() +catgets() +crypt() +ctermid() if passed a non-NULL argument +ctime() +dbm_clearerr() +dbm_close() +dbm_delete() +dbm_error() +dbm_fetch() +dbm_firstkey() +dbm_nextkey() +dbm_open() +dbm_store() +dirname() +dlerror() +drand48() +ecvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] +encrypt() +endgrent() +endpwent() +endutxent() +fcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] +ftw() +gcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] +getc_unlocked() +getchar_unlocked() +getdate() +#getenv() +getgrent() +getgrgid() +getgrnam() +gethostbyaddr() [POSIX.1-2001 only (function removed in POSIX.1-2008)] +gethostbyname() [POSIX.1-2001 only (function removed in POSIX.1-2008)] +gethostent() +getlogin() +getnetbyaddr() +getnetbyname() +getnetent() +getopt() +getprotobyname() +getprotobynumber() +getprotoent() +getpwent() +getpwnam() +getpwuid() +getservbyname() +getservbyport() +getservent() +getutxent() +getutxid() +getutxline() +gmtime() +hcreate() +hdestroy() +hsearch() +inet_ntoa() +l64a() +lgamma() +lgammaf() +lgammal() +localeconv() +localtime() +lrand48() +mrand48() +nftw() +#nl_langinfo() +ptsname() +putc_unlocked() +putchar_unlocked() +putenv() +pututxline() +rand() +#readdir() +setenv() +setgrent() +setkey() +setpwent() +setutxent() +#strerror() +strsignal() [Added in POSIX.1-2008] +strtok() +#system() [Added in POSIX.1-2008] +tmpnam() if passed a non-NULL argument +ttyname() +unsetenv() +wcrtomb() if its final argument is NULL +wcsrtombs() if its final argument is NULL +wcstombs() +wctomb() |