Browse Source

Rework the CompressionTypes system by adding an Order subgroup to

simplify customisation of the order and improve the documentation
about this setting group.
David Kalnischkies 13 years ago
  1. 56
  2. 3
  3. 32
  4. 9


@ -14,6 +14,7 @@
#include <vector>
#include <string>
#include <algorithm>
namespace APT {
// getCompressionTypes - Return Vector of usbale compressiontypes /*{{{*/
@ -29,41 +30,52 @@ const Configuration::getCompressionTypes(bool const &Cached) {
// setup the defaults for the compressiontypes => method mapping
// Set default application paths to check for optional compression types
_config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
_config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
::Configuration::Item const *Opts = _config->Tree("Acquire::CompressionTypes");
if (Opts != 0)
Opts = Opts->Child;
// accept non-list order as override setting for config settings on commandline
std::string const overrideOrder = _config->Find("Acquire::CompressionTypes::Order","");
if (overrideOrder.empty() == false)
// at first, move over the options to setup at least the default options
bool foundLzma=false, foundBzip2=false, foundGzip=false;
for (; Opts != 0; Opts = Opts->Next) {
if (Opts->Value == "lzma")
foundLzma = true;
else if (Opts->Value == "bz2")
foundBzip2 = true;
else if (Opts->Value == "gz")
foundGzip = true;
// load the order setting into our vector
std::vector<std::string> const order = _config->FindVector("Acquire::CompressionTypes::Order");
for (std::vector<std::string>::const_iterator o = order.begin();
o != order.end(); o++) {
if ((*o).empty() == true)
// ignore types we have no method ready to use
if (_config->Exists(string("Acquire::CompressionTypes::").append(*o)) == false)
// ignore types we have no app ready to use
string const appsetting = string("Dir::Bin::").append(*o);
if (_config->Exists(appsetting) == true) {
std::string const app = _config->FindFile(appsetting.c_str(), "");
if (app.empty() == false && FileExists(app) == false)
// setup the defaults now
if (!foundBzip2)
if (!foundLzma)
if (!foundGzip)
// move again over the option tree to finially calculate our result
// move again over the option tree to add all missing compression types
::Configuration::Item const *Types = _config->Tree("Acquire::CompressionTypes");
if (Types != 0)
Types = Types->Child;
for (; Types != 0; Types = Types->Next) {
if (Types->Tag == "Order" || Types->Tag.empty() == true)
// ignore types we already have in the vector
if (std::find(types.begin(),types.end(),Types->Tag) != types.end())
// ignore types we have no app ready to use
string const appsetting = string("Dir::Bin::").append(Types->Value);
// ignore compression types we have no app ready to use
if (appsetting.empty() == false && _config->Exists(appsetting) == true) {
std::string const app = _config->FindFile(appsetting.c_str(), "");
if (app.empty() == false && FileExists(app) == false)


@ -24,6 +24,9 @@ apt (0.7.24) UNRELEASED; urgency=low
- replace unknown multibytes with ? in UTF8ToCharset (Closes: #545208)
* doc/apt-get.8.xml:
- fix two little typos in the --simulate description.
* apt-pkg/, doc/apt.conf.5.xml:
- add an order subgroup to the compression types to simplify reordering
a bit and improve the documentation for this option group.
-- David Kalnischkies <> Fri, 28 Aug 2009 09:40:08 +0200


@ -90,7 +90,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
<literal>#include</literal> will include the given file, unless the filename
ends in a slash, then the whole directory is included.
<literal>#clear</literal> is used to erase a part of the configuration tree. The
specified element and all its descendents are erased.</para>
specified element and all its descendants are erased.</para>
<para>All of the APT tools take a -o option which allows an arbitrary configuration
directive to be specified on the command line. The syntax is a full option
@ -312,16 +312,30 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
<listitem><para>List of compression types which are understood by the acquire methods.
Files like <filename>Packages</filename> can be available in various compression formats.
This list defines in which order the acquire methods will try to download these files.
Per default <command>bzip2</command> compressed files will be prefered over
<command>lzma</command>, <command>gzip</command> and uncompressed files. The syntax for
the configuration fileentry is
Per default the acquire methods can decompress <command>bzip2</command>, <command>lzma</command>
and <command>gzip</command> compressed files, with this setting more formats can be added
on the fly or the used method can be changed. The syntax for this is:
<synopsis>Acquire::CompressionTypes::<replaceable>FileExtension</replaceable> "<replaceable>Methodname</replaceable>";</synopsis>
e.g. <synopsis>Acquire::CompressionTypes::bz2 "bzip2";</synopsis>
Note that at runtime the <literal>Dir::Bin::<replaceable>Methodname</replaceable></literal> will
</para><para>Also the <literal>Order</literal> subgroup can be used to define in which order
the acquire system will try to download the compressed files. The acquire system will try the first
and proceed with the next compression type in this list on error, so to prefer one over the other type
simple add the preferred type at first - not already added default types will be added at run time
to the end of the list, so e.g. <synopsis>Acquire::CompressionTypes::Order:: "gz";</synopsis> can
be used to prefer <command>gzip</command> compressed files over <command>bzip2</command> and <command>lzma</command>.
If <command>lzma</command> should be preferred over <command>gzip</command> and <command>bzip2</command> the
configure setting should look like this <synopsis>Acquire::CompressionTypes::Order { "lzma"; "gz"; };</synopsis>
It is not needed to add <literal>bz2</literal> explicit to the list as it will be added automatic.</para>
<para>Note that at run time the <literal>Dir::Bin::<replaceable>Methodname</replaceable></literal> will
be checked: If this setting exists the method will only be used if this file exists, e.g. for
the bzip2 method above (the inbuilt) setting is <literallayout>Dir::Bin::bzip2 "/bin/bzip2";</literallayout>
the bzip2 method (the inbuilt) setting is <literallayout>Dir::Bin::bzip2 "/bin/bzip2";</literallayout>
Note also that list entries specified on the commandline will be added at the end of the list
specified in the configuration files, but before the default entries. To prefer a type in this case
over the ones specified in in the configuration files you can set the option direct - not in list style.
This will not override the defined list, it will only prefix the list with this type.</para>
<para>While it is possible to add an empty compression type to the order list, but APT in its current
version doesn't understand it correctly and will display many warnings about not downloaded files -
these warnings are most of the time false negatives. Future versions will maybe include a way to
really prefer uncompressed files to support the usage of local mirrors.</para></listitem>


@ -246,6 +246,15 @@ Acquire
Options {"--ignore-time-conflict";} // not very useful on a normal system
bz2 "bzip2";
lzma "lzma";
gz "gzip";
Order { "gz"; "lzma"; "bz2"; };
// Directory layout