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

"backport" the APT::Configuration class to apt-sid
We can use it to simplify the internal code to operate with
Acquire::CompressionTypes group. This also made it possible
to set this setting with the -o flag.

David Kalnischkies лет назад: 17
Родитель
Сommit
e878aedb8b
7 измененных файлов с 163 добавлено и 74 удалено
  1. 24 38
      apt-pkg/acquire-item.cc
  2. 78 0
      apt-pkg/aptconfiguration.cc
  3. 46 0
      apt-pkg/aptconfiguration.h
  4. 0 22
      apt-pkg/init.cc
  5. 3 2
      apt-pkg/makefile
  6. 1 1
      doc/apt.conf.5.xml
  7. 11 11
      po/apt-all.pot

+ 24 - 38
apt-pkg/acquire-item.cc

@@ -15,6 +15,7 @@
 // Include Files							/*{{{*/
 // Include Files							/*{{{*/
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/vendorlist.h>
 #include <apt-pkg/vendorlist.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
@@ -551,21 +552,11 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
    if(comprExt.empty()) 
    if(comprExt.empty()) 
    {
    {
       // autoselect the compression method
       // autoselect the compression method
-      Configuration::Item const *Opts = _config->Tree("Acquire::CompressionTypes");
-      if (Opts != 0)
-	 Opts = Opts->Child;
-
-      const char dirBin[] = "Dir::Bin::";
-      for (; Opts != 0; Opts = Opts->Next)
-      {
-	 if (Opts->Tag.empty() == true || Opts->Value.empty() == true)
-	    continue;
-	 const string bin = _config->FindFile(string(dirBin).append(Opts->Value).c_str(),"");
-	 if (bin != "" && !FileExists(bin))
-	    continue;
-	 comprExt = '.' + Opts->Tag;
-	 break;
-      }
+      std::vector<std::string> types = APT::Configuration::getCompressionTypes();
+      if (types.empty() == true)
+	 comprExt = "plain";
+      else
+	 comprExt = "." + types[0];
    }
    }
    CompressionExtension = ((comprExt == "plain" || comprExt == ".") ? "" : comprExt);
    CompressionExtension = ((comprExt == "plain" || comprExt == ".") ? "" : comprExt);
 
 
@@ -595,36 +586,31 @@ string pkgAcqIndex::Custom600Headers()
 									/*}}}*/
 									/*}}}*/
 void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)	/*{{{*/
 void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)	/*{{{*/
 {
 {
-   Configuration::Item const *Opts = _config->Tree("Acquire::CompressionTypes");
-   if (Opts != 0)
-      Opts = Opts->Child;
+   std::vector<std::string> types = APT::Configuration::getCompressionTypes();
 
 
-   const char dirBin[] = "Dir::Bin::";
-   for (; Opts != 0; Opts = Opts->Next)
+   for (std::vector<std::string>::const_iterator t = types.begin();
+	t != types.end(); t++)
    {
    {
-      if (Opts->Tag.empty() == true || Opts->Value.empty() == true)
+      // jump over all already tried compression types
+      const unsigned int nameLen = Desc.URI.size() - (*t).size();
+      if(Desc.URI.substr(nameLen) != *t)
 	 continue;
 	 continue;
 
 
-      // jump over all already checked compression types
-      const unsigned int nameLen = Desc.URI.size() - Opts->Tag.size();
-      if(Desc.URI.substr(nameLen) != Opts->Tag || Opts->Next == 0)
-	 continue;
-
-      // check if we need an external binary for this compression type
-      const string bin = _config->FindFile(string(dirBin).append(Opts->Next->Value).c_str(),"");
-      if (bin != "" && !FileExists(bin))
-	 continue;
+      // we want to try it with the next extension
+      t++;
 
 
-      // retry with the next extension
-      Desc.URI = Desc.URI.substr(0, nameLen) + Opts->Next->Tag;
+      if (t != types.end())
+      {
+	 Desc.URI = Desc.URI.substr(0, nameLen) + *t;
 
 
-      new pkgAcqIndex(Owner, RealURI, Desc.Description, Desc.ShortDesc,
-			ExpectedHash, string(".").append(Opts->Next->Tag));
+	 new pkgAcqIndex(Owner, RealURI, Desc.Description, Desc.ShortDesc,
+			 ExpectedHash, string(".").append(*t));
 
 
-      Status = StatDone;
-      Complete = false;
-      Dequeue();
-      return;
+	 Status = StatDone;
+	 Complete = false;
+	 Dequeue();
+	 return;
+      }
    }
    }
 
 
    // on decompression failure, remove bad versions in partial/
    // on decompression failure, remove bad versions in partial/

+ 78 - 0
apt-pkg/aptconfiguration.cc

@@ -0,0 +1,78 @@
+// -*- mode: cpp; mode: fold -*-
+// Description								/*{{{*/
+/* ######################################################################
+
+   Provide access methods to various configuration settings,
+   setup defaults and returns validate settings.
+
+   ##################################################################### */
+									/*}}}*/
+// Include Files							/*{{{*/
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/aptconfiguration.h>
+#include <apt-pkg/configuration.h>
+
+#include <vector>
+#include <string>
+									/*}}}*/
+namespace APT {
+// getCompressionTypes - Return Vector of usbale compressiontypes	/*{{{*/
+// ---------------------------------------------------------------------
+/* return a vector of compression types in the prefered order. */
+std::vector<std::string>
+const Configuration::getCompressionTypes(bool const &Cached) {
+	static std::vector<std::string> types;
+	if (types.empty() == false) {
+		if (Cached == true)
+			return types;
+		else
+			types.clear();
+	}
+
+	// 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;
+
+	// 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;
+	}
+
+	// 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
+	::Configuration::Item const *Types = _config->Tree("Acquire::CompressionTypes");
+	if (Types != 0)
+		Types = Types->Child;
+
+	for (; Types != 0; Types = Types->Next) {
+		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)
+				continue;
+		}
+		types.push_back(Types->Tag);
+	}
+
+	return types;
+}
+									/*}}}*/
+}

+ 46 - 0
apt-pkg/aptconfiguration.h

@@ -0,0 +1,46 @@
+// -*- mode: cpp; mode: fold -*-
+// Description								/*{{{*/
+/** \class APT::Configuration
+ *  \brief Provide access methods to various configuration settings
+ *
+ *  This class and their methods providing a layer around the usual access
+ *  methods with _config to ensure that settings are correct and to be able
+ *  to set defaults without the need to recheck it in every method again.
+ */
+									/*}}}*/
+#ifndef APT_CONFIGURATION_H
+#define APT_CONFIGURATION_H
+// Include Files							/*{{{*/
+#include <string>
+#include <vector>
+									/*}}}*/
+namespace APT {
+class Configuration {							/*{{{*/
+public:									/*{{{*/
+	/** \brief Returns a vector of usable Compression Types
+	 *
+	 *  Files can be compressed in various ways to decrease the size of the
+	 *  download. Therefore the Acquiremethods support a few compression types
+	 *  and some archives provide also a few different types. This option
+	 *  group exists to give the user the choice to prefer one type over the
+	 *  other (some compression types are very resource intensive - great if you
+	 *  have a limited download, bad if you have a really lowpowered hardware.)
+	 *
+	 *  This method ensures that the defaults are set and checks at runtime
+	 *  if the type can be used. E.g. the current default is to prefer bzip2
+	 *  over lzma and gz - if the bzip2 binary is not available it has not much
+	 *  sense in downloading the bz2 file, therefore we will not return bz2 as
+	 *  a usable compression type. The availability is checked with the settings
+	 *  in the Dir::Bin group.
+	 *
+	 *  \param Cached saves the result so we need to calculated it only once
+	 *                this parameter should ony be used for testing purposes.
+	 *
+	 *  \return a vector of (all) Language Codes in the prefered usage order
+	 */
+	std::vector<std::string> static const getCompressionTypes(bool const &Cached = true);
+									/*}}}*/
+};
+									/*}}}*/
+}
+#endif

+ 0 - 22
apt-pkg/init.cc

@@ -104,28 +104,6 @@ bool pkgInitConfig(Configuration &Cnf)
    if (Res == false)
    if (Res == false)
       return false;
       return false;
 
 
-   // we load all config files, now check the configs and setup post-defaults:
-   // * check for CompressionTypes setup
-   {
-      Configuration::Item const *Opts = _config->Tree("Acquire::CompressionTypes");
-      if (Opts != 0)
-	 Opts = Opts->Child;
-      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;
-      }
-      if (!foundBzip2) Cnf.Set("Acquire::CompressionTypes::bz2","bzip2");
-      if (!foundLzma) Cnf.Set("Acquire::CompressionTypes::lzma","lzma");
-      if (!foundGzip) Cnf.Set("Acquire::CompressionTypes::gz","gzip");
-      Cnf.CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
-      Cnf.CndSet("Dir::Bin::bzip2", "/bin/bzip2");
-   }
-
-
-
    if (Cnf.FindB("Debug::pkgInitConfig",false) == true)
    if (Cnf.FindB("Debug::pkgInitConfig",false) == true)
       Cnf.Dump();
       Cnf.Dump();
    
    

+ 3 - 2
apt-pkg/makefile

@@ -34,14 +34,15 @@ SOURCE+= pkgcache.cc version.cc depcache.cc \
 	 acquire-worker.cc acquire-method.cc init.cc clean.cc \
 	 acquire-worker.cc acquire-method.cc init.cc clean.cc \
 	 srcrecords.cc cachefile.cc versionmatch.cc policy.cc \
 	 srcrecords.cc cachefile.cc versionmatch.cc policy.cc \
 	 pkgsystem.cc indexfile.cc pkgcachegen.cc acquire-item.cc \
 	 pkgsystem.cc indexfile.cc pkgcachegen.cc acquire-item.cc \
-	 indexrecords.cc vendor.cc vendorlist.cc cdrom.cc indexcopy.cc
+	 indexrecords.cc vendor.cc vendorlist.cc cdrom.cc indexcopy.cc \
+	 aptconfiguration.cc
 HEADERS+= algorithms.h depcache.h pkgcachegen.h cacheiterators.h \
 HEADERS+= algorithms.h depcache.h pkgcachegen.h cacheiterators.h \
 	  orderlist.h sourcelist.h packagemanager.h tagfile.h \
 	  orderlist.h sourcelist.h packagemanager.h tagfile.h \
 	  init.h pkgcache.h version.h progress.h pkgrecords.h \
 	  init.h pkgcache.h version.h progress.h pkgrecords.h \
 	  acquire.h acquire-worker.h acquire-item.h acquire-method.h \
 	  acquire.h acquire-worker.h acquire-item.h acquire-method.h \
 	  clean.h srcrecords.h cachefile.h versionmatch.h policy.h \
 	  clean.h srcrecords.h cachefile.h versionmatch.h policy.h \
 	  pkgsystem.h indexfile.h metaindex.h indexrecords.h vendor.h \
 	  pkgsystem.h indexfile.h metaindex.h indexrecords.h vendor.h \
-          vendorlist.h cdrom.h indexcopy.h
+          vendorlist.h cdrom.h indexcopy.h aptconfiguration.h
 
 
 # Source code for the debian specific components
 # Source code for the debian specific components
 # In theory the deb headers do not need to be exported..
 # In theory the deb headers do not need to be exported..

+ 1 - 1
doc/apt.conf.5.xml

@@ -309,7 +309,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
      This list defines in which order the acquire methods will try to download these files.
      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
      Per default <command>bzip2</command> compressed files will be prefered over
      <command>lzma</command>, <command>gzip</command> and uncompressed files. The syntax for
      <command>lzma</command>, <command>gzip</command> and uncompressed files. The syntax for
-     the configuration fileentry (this option can't be set at runtime with the -o option) is
+     the configuration fileentry 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>
      e.g. <synopsis>Acquire::CompressionTypes::bz2 "bzip2";</synopsis>
      Note that at runtime the <literal>Dir::Bin::<replaceable>Methodname</replaceable></literal> will
      Note that at runtime the <literal>Dir::Bin::<replaceable>Methodname</replaceable></literal> will

+ 11 - 11
po/apt-all.pot

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-08-12 14:46+0200\n"
+"POT-Creation-Date: 2009-08-21 11:35+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2364,12 +2364,12 @@ msgstr ""
 msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter."
 msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/init.cc:154
+#: apt-pkg/init.cc:132
 #, c-format
 #, c-format
 msgid "Packaging system '%s' is not supported"
 msgid "Packaging system '%s' is not supported"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/init.cc:170
+#: apt-pkg/init.cc:148
 msgid "Unable to determine a suitable packaging system type"
 msgid "Unable to determine a suitable packaging system type"
 msgstr ""
 msgstr ""
 
 
@@ -2497,44 +2497,44 @@ msgstr ""
 msgid "IO Error saving source cache"
 msgid "IO Error saving source cache"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:127
+#: apt-pkg/acquire-item.cc:128
 #, c-format
 #, c-format
 msgid "rename failed, %s (%s -> %s)."
 msgid "rename failed, %s (%s -> %s)."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:394
+#: apt-pkg/acquire-item.cc:395
 msgid "MD5Sum mismatch"
 msgid "MD5Sum mismatch"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:663 apt-pkg/acquire-item.cc:1425
+#: apt-pkg/acquire-item.cc:649 apt-pkg/acquire-item.cc:1411
 msgid "Hash Sum mismatch"
 msgid "Hash Sum mismatch"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:1120
+#: apt-pkg/acquire-item.cc:1106
 msgid "There is no public key available for the following key IDs:\n"
 msgid "There is no public key available for the following key IDs:\n"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:1230
+#: apt-pkg/acquire-item.cc:1216
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "I wasn't able to locate a file for the %s package. This might mean you need "
 "I wasn't able to locate a file for the %s package. This might mean you need "
 "to manually fix this package. (due to missing arch)"
 "to manually fix this package. (due to missing arch)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:1289
+#: apt-pkg/acquire-item.cc:1275
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "I wasn't able to locate file for the %s package. This might mean you need to "
 "I wasn't able to locate file for the %s package. This might mean you need to "
 "manually fix this package."
 "manually fix this package."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:1330
+#: apt-pkg/acquire-item.cc:1316
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "The package index files are corrupted. No Filename: field for package %s."
 "The package index files are corrupted. No Filename: field for package %s."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/acquire-item.cc:1417
+#: apt-pkg/acquire-item.cc:1403
 msgid "Size mismatch"
 msgid "Size mismatch"
 msgstr ""
 msgstr ""