Просмотр исходного кода

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 лет назад: 17
Родитель
Сommit
8bd02d8bd6
4 измененных файлов с 69 добавлено и 31 удалено
  1. 34 22
      apt-pkg/aptconfiguration.cc
  2. 3 0
      debian/changelog
  3. 23 9
      doc/apt.conf.5.xml
  4. 9 0
      doc/examples/configure-index

+ 34 - 22
apt-pkg/aptconfiguration.cc

@@ -14,6 +14,7 @@
 
 
 #include <vector>
 #include <vector>
 #include <string>
 #include <string>
+#include <algorithm>
 									/*}}}*/
 									/*}}}*/
 namespace APT {
 namespace APT {
 // getCompressionTypes - Return Vector of usbale compressiontypes	/*{{{*/
 // getCompressionTypes - Return Vector of usbale compressiontypes	/*{{{*/
@@ -29,41 +30,52 @@ const Configuration::getCompressionTypes(bool const &Cached) {
 			types.clear();
 			types.clear();
 	}
 	}
 
 
+	// setup the defaults for the compressiontypes => method mapping
+	_config->CndSet("Acquire::CompressionTypes::bz2","bzip2");
+	_config->CndSet("Acquire::CompressionTypes::lzma","lzma");
+	_config->CndSet("Acquire::CompressionTypes::gz","gzip");
+
 	// Set default application paths to check for optional compression types
 	// Set default application paths to check for optional compression types
 	_config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
 	_config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
 	_config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
 	_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)
+		types.push_back(overrideOrder);
 
 
-	// 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)
+			continue;
+		// ignore types we have no method ready to use
+		if (_config->Exists(string("Acquire::CompressionTypes::").append(*o)) == false)
+			continue;
+		// 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)
+				continue;
+		}
+		types.push_back(*o);
 	}
 	}
 
 
-	// setup the defaults now
-	if (!foundBzip2)
-		_config->Set("Acquire::CompressionTypes::bz2","bzip2");
-	if (!foundLzma)
-		_config->Set("Acquire::CompressionTypes::lzma","lzma");
-	if (!foundGzip)
-		_config->Set("Acquire::CompressionTypes::gz","gzip");
-
-	// 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");
 	::Configuration::Item const *Types = _config->Tree("Acquire::CompressionTypes");
 	if (Types != 0)
 	if (Types != 0)
 		Types = Types->Child;
 		Types = Types->Child;
 
 
 	for (; Types != 0; Types = Types->Next) {
 	for (; Types != 0; Types = Types->Next) {
+		if (Types->Tag == "Order" || Types->Tag.empty() == true)
+			continue;
+		// ignore types we already have in the vector
+		if (std::find(types.begin(),types.end(),Types->Tag) != types.end())
+			continue;
+		// ignore types we have no app ready to use
 		string const appsetting = string("Dir::Bin::").append(Types->Value);
 		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) {
 		if (appsetting.empty() == false && _config->Exists(appsetting) == true) {
 			std::string const app = _config->FindFile(appsetting.c_str(), "");
 			std::string const app = _config->FindFile(appsetting.c_str(), "");
 			if (app.empty() == false && FileExists(app) == false)
 			if (app.empty() == false && FileExists(app) == false)

+ 3 - 0
debian/changelog

@@ -24,6 +24,9 @@ apt (0.7.24) UNRELEASED; urgency=low
     - replace unknown multibytes with ? in UTF8ToCharset (Closes: #545208)
     - replace unknown multibytes with ? in UTF8ToCharset (Closes: #545208)
   * doc/apt-get.8.xml:
   * doc/apt-get.8.xml:
     - fix two little typos in the --simulate description.
     - fix two little typos in the --simulate description.
+  * apt-pkg/aptconfiguration.cc, 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 <kalnischkies@gmail.com>  Fri, 28 Aug 2009 09:40:08 +0200
  -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 28 Aug 2009 09:40:08 +0200
 
 

+ 23 - 9
doc/apt.conf.5.xml

@@ -90,7 +90,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
    <literal>#include</literal> will include the given file, unless the filename
    <literal>#include</literal> will include the given file, unless the filename
    ends in a slash, then the whole directory is included.  
    ends in a slash, then the whole directory is included.  
    <literal>#clear</literal> is used to erase a part of the configuration tree. The
    <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 
    <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
    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";};
      <varlistentry><term>CompressionTypes</term>
      <varlistentry><term>CompressionTypes</term>
      <listitem><para>List of compression types which are understood by the acquire methods.
      <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.
      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>
      <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
      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>
-     </para></listitem>
+     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>
      </varlistentry>
      </varlistentry>
    </variablelist>
    </variablelist>
   </para>
   </para>

+ 9 - 0
doc/examples/configure-index

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