summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2011-07-15 09:45:33 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2011-07-15 09:45:33 +0200
commit1d08f27046533e36849a63c084f51809be484d8c (patch)
tree4efff5cb3ab69fc877569a715a00e4c96d027b58
parent118192bfd764d03af4cfcfc10eb9c38e7cc98721 (diff)
parentdb4351bee8204c5eb352bb5667d3fbd416685715 (diff)
downloadapt-1d08f27046533e36849a63c084f51809be484d8c.tar.gz
merged from lp:~donkult/apt/sid
-rw-r--r--apt-pkg/contrib/configuration.cc15
-rw-r--r--apt-pkg/contrib/configuration.h3
-rw-r--r--apt-pkg/depcache.cc2
-rw-r--r--apt-pkg/init.cc76
-rw-r--r--apt-pkg/pkgcachegen.cc22
-rw-r--r--cmdline/apt-get.cc6
-rw-r--r--debian/apt.symbols1
-rw-r--r--debian/changelog18
-rwxr-xr-xdebian/rules3
-rw-r--r--doc/apt.conf.5.xml10
-rw-r--r--doc/examples/configure-index1
-rw-r--r--doc/sources.list.5.xml18
-rw-r--r--test/integration/framework6
-rwxr-xr-xtest/integration/test-ubuntu-bug-784473-InRelease-one-message-only31
-rwxr-xr-xtest/integration/test-ubuntu-bug-806274-install-suggests81
15 files changed, 241 insertions, 52 deletions
diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc
index cc7093fe2..0664e3704 100644
--- a/apt-pkg/contrib/configuration.cc
+++ b/apt-pkg/contrib/configuration.cc
@@ -318,6 +318,19 @@ void Configuration::CndSet(const char *Name,const string &Value)
Itm->Value = Value;
}
/*}}}*/
+// Configuration::Set - Set an integer value /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void Configuration::CndSet(const char *Name,int const Value)
+{
+ Item *Itm = Lookup(Name,true);
+ if (Itm == 0 || Itm->Value.empty() == false)
+ return;
+ char S[300];
+ snprintf(S,sizeof(S),"%i",Value);
+ Itm->Value = S;
+}
+ /*}}}*/
// Configuration::Set - Set a value /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -332,7 +345,7 @@ void Configuration::Set(const char *Name,const string &Value)
// Configuration::Set - Set an integer value /*{{{*/
// ---------------------------------------------------------------------
/* */
-void Configuration::Set(const char *Name,int const &Value)
+void Configuration::Set(const char *Name,int const Value)
{
Item *Itm = Lookup(Name,true);
if (Itm == 0)
diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h
index 71e5a0e47..3568ce815 100644
--- a/apt-pkg/contrib/configuration.h
+++ b/apt-pkg/contrib/configuration.h
@@ -82,8 +82,9 @@ class Configuration
inline void Set(const string &Name,const string &Value) {Set(Name.c_str(),Value);};
void CndSet(const char *Name,const string &Value);
+ void CndSet(const char *Name,const int Value);
void Set(const char *Name,const string &Value);
- void Set(const char *Name,const int &Value);
+ void Set(const char *Name,const int Value);
inline bool Exists(const string &Name) const {return Exists(Name.c_str());};
bool Exists(const char *Name) const;
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index e9fa097aa..eb3f4e598 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -1593,7 +1593,7 @@ bool pkgDepCache::MarkFollowsRecommends()
bool pkgDepCache::MarkFollowsSuggests()
{
- return _config->FindB("APT::AutoRemove::SuggestsImportant", false);
+ return _config->FindB("APT::AutoRemove::SuggestsImportant", true);
}
// pkgDepCache::MarkRequired - the main mark algorithm /*{{{*/
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index 31b2d9ccd..38a0814e5 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -33,60 +33,64 @@ const char *pkgLibVersion = Stringfy(APT_PKG_MAJOR) "."
bool pkgInitConfig(Configuration &Cnf)
{
// General APT things
- Cnf.Set("APT::Architecture", COMMON_ARCH);
- Cnf.Set("APT::Build-Essential::", "build-essential");
- Cnf.Set("APT::Install-Recommends", true);
- Cnf.Set("APT::Install-Suggests", false);
- Cnf.Set("Dir","/");
+ Cnf.CndSet("APT::Architecture", COMMON_ARCH);
+ if (Cnf.Exists("APT::Build-Essential") == false)
+ Cnf.Set("APT::Build-Essential::", "build-essential");
+ Cnf.CndSet("APT::Install-Recommends", true);
+ Cnf.CndSet("APT::Install-Suggests", false);
+ Cnf.CndSet("Dir","/");
// State
- Cnf.Set("Dir::State","var/lib/apt/");
+ Cnf.CndSet("Dir::State","var/lib/apt/");
/* Just in case something goes horribly wrong, we can fall back to the
old /var/state paths.. */
struct stat St;
if (stat("/var/lib/apt/.",&St) != 0 &&
stat("/var/state/apt/.",&St) == 0)
- Cnf.Set("Dir::State","var/state/apt/");
+ Cnf.CndSet("Dir::State","var/state/apt/");
- Cnf.Set("Dir::State::lists","lists/");
- Cnf.Set("Dir::State::cdroms","cdroms.list");
- Cnf.Set("Dir::State::mirrors","mirrors/");
+ Cnf.CndSet("Dir::State::lists","lists/");
+ Cnf.CndSet("Dir::State::cdroms","cdroms.list");
+ Cnf.CndSet("Dir::State::mirrors","mirrors/");
// Cache
- Cnf.Set("Dir::Cache","var/cache/apt/");
- Cnf.Set("Dir::Cache::archives","archives/");
- Cnf.Set("Dir::Cache::srcpkgcache","srcpkgcache.bin");
- Cnf.Set("Dir::Cache::pkgcache","pkgcache.bin");
+ Cnf.CndSet("Dir::Cache","var/cache/apt/");
+ Cnf.CndSet("Dir::Cache::archives","archives/");
+ Cnf.CndSet("Dir::Cache::srcpkgcache","srcpkgcache.bin");
+ Cnf.CndSet("Dir::Cache::pkgcache","pkgcache.bin");
// Configuration
- Cnf.Set("Dir::Etc","etc/apt/");
- Cnf.Set("Dir::Etc::sourcelist","sources.list");
- Cnf.Set("Dir::Etc::sourceparts","sources.list.d");
- Cnf.Set("Dir::Etc::vendorlist","vendors.list");
- Cnf.Set("Dir::Etc::vendorparts","vendors.list.d");
- Cnf.Set("Dir::Etc::main","apt.conf");
- Cnf.Set("Dir::Etc::netrc", "auth.conf");
- Cnf.Set("Dir::Etc::parts","apt.conf.d");
- Cnf.Set("Dir::Etc::preferences","preferences");
- Cnf.Set("Dir::Etc::preferencesparts","preferences.d");
- Cnf.Set("Dir::Etc::trusted", "trusted.gpg");
- Cnf.Set("Dir::Etc::trustedparts","trusted.gpg.d");
- Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
- Cnf.Set("Dir::Media::MountPath","/media/apt");
+ Cnf.CndSet("Dir::Etc","etc/apt/");
+ Cnf.CndSet("Dir::Etc::sourcelist","sources.list");
+ Cnf.CndSet("Dir::Etc::sourceparts","sources.list.d");
+ Cnf.CndSet("Dir::Etc::vendorlist","vendors.list");
+ Cnf.CndSet("Dir::Etc::vendorparts","vendors.list.d");
+ Cnf.CndSet("Dir::Etc::main","apt.conf");
+ Cnf.CndSet("Dir::Etc::netrc", "auth.conf");
+ Cnf.CndSet("Dir::Etc::parts","apt.conf.d");
+ Cnf.CndSet("Dir::Etc::preferences","preferences");
+ Cnf.CndSet("Dir::Etc::preferencesparts","preferences.d");
+ Cnf.CndSet("Dir::Etc::trusted", "trusted.gpg");
+ Cnf.CndSet("Dir::Etc::trustedparts","trusted.gpg.d");
+ Cnf.CndSet("Dir::Bin::methods","/usr/lib/apt/methods");
+ Cnf.CndSet("Dir::Media::MountPath","/media/apt");
// State
- Cnf.Set("Dir::Log","var/log/apt");
- Cnf.Set("Dir::Log::Terminal","term.log");
- Cnf.Set("Dir::Log::History","history.log");
+ Cnf.CndSet("Dir::Log","var/log/apt");
+ Cnf.CndSet("Dir::Log::Terminal","term.log");
+ Cnf.CndSet("Dir::Log::History","history.log");
- Cnf.Set("Dir::Ignore-Files-Silently::", "~$");
- Cnf.Set("Dir::Ignore-Files-Silently::", "\\.disabled$");
- Cnf.Set("Dir::Ignore-Files-Silently::", "\\.bak$");
- Cnf.Set("Dir::Ignore-Files-Silently::", "\\.dpkg-[a-z]+$");
+ if (Cnf.Exists("Dir::Ignore-Files-Silently") == false)
+ {
+ Cnf.Set("Dir::Ignore-Files-Silently::", "~$");
+ Cnf.Set("Dir::Ignore-Files-Silently::", "\\.disabled$");
+ Cnf.Set("Dir::Ignore-Files-Silently::", "\\.bak$");
+ Cnf.Set("Dir::Ignore-Files-Silently::", "\\.dpkg-[a-z]+$");
+ }
// Default cdrom mount point
- Cnf.Set("Acquire::cdrom::mount", "/media/cdrom/");
+ Cnf.CndSet("Acquire::cdrom::mount", "/media/cdrom/");
bool Res = true;
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 9820fde81..8f9737e26 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -1169,16 +1169,32 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
SPtr<DynamicMMap> Map;
if (Writeable == true && CacheFile.empty() == false)
{
+ _error->PushToStack();
unlink(CacheFile.c_str());
CacheF = new FileFd(CacheFile,FileFd::WriteAtomic);
fchmod(CacheF->Fd(),0644);
Map = CreateDynamicMMap(CacheF, MMap::Public);
if (_error->PendingError() == true)
- return false;
- if (Debug == true)
+ {
+ delete CacheF.UnGuard();
+ delete Map.UnGuard();
+ if (Debug == true)
+ std::clog << "Open filebased MMap FAILED" << std::endl;
+ Writeable = false;
+ if (AllowMem == false)
+ {
+ _error->MergeWithStack();
+ return false;
+ }
+ _error->RevertToStack();
+ }
+ else if (Debug == true)
+ {
+ _error->MergeWithStack();
std::clog << "Open filebased MMap" << std::endl;
+ }
}
- else
+ if (Writeable == false || CacheFile.empty() == true)
{
// Just build it in memory..
Map = CreateDynamicMMap(NULL);
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 845c92026..3292ae745 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1697,7 +1697,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
// we could have removed a new dependency of a garbage package,
// so check if a reverse depends is broken and if so install it again.
- if (tooMuch.empty() == false && Cache->BrokenCount() != 0)
+ if (tooMuch.empty() == false && (Cache->BrokenCount() != 0 || Cache->PolicyBrokenCount() != 0))
{
bool Changed;
do {
@@ -1708,8 +1708,8 @@ bool DoAutomaticRemove(CacheFile &Cache)
for (pkgCache::DepIterator R = P.RevDependsList();
R.end() == false; ++R)
{
- if (R->Type != pkgCache::Dep::Depends &&
- R->Type != pkgCache::Dep::PreDepends)
+ if (R.IsNegative() == true ||
+ Cache->IsImportantDep(R) == false)
continue;
pkgCache::PkgIterator N = R.ParentPkg();
if (N.end() == true || (N->CurrentVer == 0 && (*Cache)[N].Install() == false))
diff --git a/debian/apt.symbols b/debian/apt.symbols
index 04e13edd7..932fb1411 100644
--- a/debian/apt.symbols
+++ b/debian/apt.symbols
@@ -1256,7 +1256,6 @@ libapt-pkg.so.4.10 libapt-pkg4.10
(arch=hppa mips mipsel sparc|c++|optional=private)"GlobalError::Insert(GlobalError::MsgType, char const*, void*&, unsigned int&)@Base" 0.8.11.4 1
(arch=ia64 sparc64|c++|optional=private)"GlobalError::Insert(GlobalError::MsgType, char const*, void*&, unsigned long&)@Base" 0.8.11.4 1
(arch=sh4|c++|optional=private)"GlobalError::Insert(GlobalError::MsgType, char const*, __builtin_va_list&, unsigned int&)@Base" 0.8.11.4 1
-
(arch=i386 hurd-i386 kfreebsd-i386|c++|optional=private)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, char*&, int, unsigned int&)@Base" 0.8.11.4 1
(arch=armel armhf|c++|optional=private)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, std::__va_list&, int, unsigned int&)@Base" 0.8.11.4 1
(arch=alpha|c++|optional=private)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag&, int, unsigned long&)@Base" 0.8.11.4 1
diff --git a/debian/changelog b/debian/changelog
index 9a069215c..2e22e64d8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,12 +1,28 @@
apt (0.8.15.3) UNRELEASED; urgency=low
+ [ Michael Vogt ]
* apt-pkg/acquire-item.cc:
- improve error message for a expired Release file
* apt-pkg/algorithms.cc:
- Hold back packages that would enter "policy-broken" state on upgrade
when doing a "apt-get upgrade"
- -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 14 Jul 2011 11:22:54 +0200
+ [ David Kalnischkies ]
+ * apt-pkg/pkgcachegen.cc:
+ - fallback to memory if file is not writeable even if access()
+ told us the opposite before (e.g. in fakeroot 1.16) (Closes: #630591)
+ * doc/sources.list.5.xml:
+ - document available [options] for sources.list entries (Closes: 632441)
+ * doc/apt.conf.5.xml:
+ - document APT::Architectures list (Closes: #612102)
+ * cmdline/apt-get.cc:
+ - restore all important dependencies for garbage packages (LP: #806274)
+ * apt-pkg/init.cc:
+ - use CndSet in pkgInitConfig (Closes: #629617)
+ * apt-pkg/depcache.cc:
+ - change default of APT::AutoRemove::SuggestsImportant to true
+
+ -- David Kalnischkies <kalnischkies@gmail.com> Fri, 15 Jul 2011 09:29:37 +0200
apt (0.8.15.2) unstable; urgency=high
diff --git a/debian/rules b/debian/rules
index 0544b2b8e..640900678 100755
--- a/debian/rules
+++ b/debian/rules
@@ -120,9 +120,6 @@ libapt-pkg-doc: build-doc
#
# libapt-pkg-doc install
#
- # remove doxygen's embedded jquery as we don't use it anyway (#622147)
- rm -f $(BLD)/doc/doxygen/html/jquery.js
-
dh_installdocs -p$@ $(BLD)/docs/design* \
$(BLD)/docs/dpkg-tech* \
$(BLD)/docs/files* \
diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml
index 02de89f3b..2634c47a9 100644
--- a/doc/apt.conf.5.xml
+++ b/doc/apt.conf.5.xml
@@ -153,7 +153,15 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
parsing package lists. The internal default is the architecture apt was
compiled for.</para></listitem>
</varlistentry>
-
+
+ <varlistentry><term>Architectures</term>
+ <listitem><para>All Architectures the system supports. Processors implementing the <literal>amd64</literal>
+ are e.g. also able to execute binaries compiled for <literal>i386</literal>; This list is use when fetching files and
+ parsing package lists. The internal default is always the native architecture (<literal>APT::Architecture</literal>)
+ and all foreign architectures it can retrieve by calling <command>dpkg --print-foreign-architectures</command>.
+ </para></listitem>
+ </varlistentry>
+
<varlistentry><term>Default-Release</term>
<listitem><para>Default release to install packages from if more than one
version available. Contains release name, codename or release version. Examples: 'stable', 'testing',
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 6884e06e3..27232d40b 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -23,6 +23,7 @@ quiet::NoUpdate "true"; // never update progress information - included in -q=1
APT
{
Architecture "i386";
+ Architectures { "amd64"; "armel"; };
Build-Essential "build-essential";
NeverAutoRemove { "linux-image.*"; }; // packages that should never
diff --git a/doc/sources.list.5.xml b/doc/sources.list.5.xml
index 837f07683..fab125b4e 100644
--- a/doc/sources.list.5.xml
+++ b/doc/sources.list.5.xml
@@ -78,7 +78,7 @@
<para>The format for a <filename>sources.list</filename> entry using the
<literal>deb</literal> and <literal>deb-src</literal> types is:</para>
- <literallayout>deb uri distribution [component1] [component2] [...]</literallayout>
+ <literallayout>deb [ options ] uri distribution [component1] [component2] [...]</literallayout>
<para>The URI for the <literal>deb</literal> type must specify the base of the
Debian distribution, from which APT will find the information it needs.
@@ -109,6 +109,17 @@
simultaneous anonymous users. APT also parallelizes connections to
different hosts to more effectively deal with sites with low bandwidth.</para>
+ <para><literal>options</literal> is always optional and needs to be surounded by
+ square brackets. It can consist of multiple settings in the form
+ <literal><replaceable>setting</replaceable>=<replaceable>value</replaceable></literal>.
+ Multiple settings are separated by spaces. The following settings are supported by APT,
+ note through that unsupported settings will be ignored silently:
+ <itemizedlist><listitem><para><literal>arch=<replaceable>arch1</replaceable>,<replaceable>arch2</replaceable>,…</literal>
+ can be used to specify for which architectures packages information should
+ be downloaded. If this option is not set all architectures defined by the
+ <literal>APT::Architectures</literal> option will be downloaded.</para>
+ </listitem></itemizedlist></para>
+
<para>It is important to list sources in order of preference, with the most
preferred source listed first. Typically this will result in sorting
by speed from fastest to slowest (CD-ROM followed by hosts on a local
@@ -206,6 +217,11 @@ deb http://security.debian.org/ &stable-codename;/updates main contrib non-free
<para>Source line for the above</para>
<literallayout>deb-src file:/home/jason/debian unstable main contrib non-free</literallayout>
+ <para>The first line gets package information for the architectures in <literal>APT::Architectures</literal>
+ while the second always retrieves <literal>amd64</literal> and <literal>armel</literal>.</para>
+ <literallayout>deb http://ftp.debian.org/debian &stable-codename; main
+deb [ arch=amd64,armel ] http://ftp.debian.org/debian &stable-codename; main</literallayout>
+
<para>Uses HTTP to access the archive at archive.debian.org, and uses only
the hamm/main area.</para>
<literallayout>deb http://archive.debian.org/debian-archive hamm main</literallayout>
diff --git a/test/integration/framework b/test/integration/framework
index cc5af798c..96cdb5f5e 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -708,3 +708,9 @@ testmarkedauto() {
fi
aptmark showauto 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
}
+
+pause() {
+ echo "STOPPED execution. Press enter to continue"
+ local IGNORE
+ read IGNORE
+}
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 000000000..d97011914
--- /dev/null
+++ b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only
@@ -0,0 +1,31 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+insertpackage 'unstable' 'apt' 'i386' '0.8.11'
+
+setupaptarchive
+
+rm -rf rootdir/var/lib/apt/lists
+
+find aptarchive/ -name 'Release.gpg' -delete
+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
+aptget update -qq > /dev/null 2> starts-with-unsigned.msg
+sed -i 's#File .*InRelease#File InRelease#' starts-with-unsigned.msg
+testfileequal starts-with-unsigned.msg "W: GPG error: file: unstable InRelease: File InRelease doesn't start with a clearsigned message"
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 000000000..fb72f0999
--- /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
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following extra 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
+
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following extra 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
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following extra 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
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following extra 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