瀏覽代碼

use getCompressors() instead of getCompressorTypes() and use it everywhere
to replace hardcoding of compressiontypes and compressors

David Kalnischkies 14 年之前
父節點
當前提交
78c9276d29
共有 2 個文件被更改,包括 137 次插入134 次删除
  1. 65 60
      apt-pkg/cdrom.cc
  2. 72 74
      apt-pkg/indexcopy.cc

+ 65 - 60
apt-pkg/cdrom.cc

@@ -82,66 +82,68 @@ bool pkgCdrom::FindPackages(string CD,
    /* Aha! We found some package files. We assume that everything under 
    /* Aha! We found some package files. We assume that everything under 
       this dir is controlled by those package files so we don't look down
       this dir is controlled by those package files so we don't look down
       anymore */
       anymore */
-    std::vector<std::string> types = APT::Configuration::getCompressionTypes();
-    types.push_back("");
-    for (std::vector<std::string>::const_iterator t = types.begin();
-         t != types.end(); ++t)
-    {
-       std::string filename = std::string("Packages");
-       if ((*t).size() > 0)
-          filename.append("."+*t);
-       if (stat(filename.c_str(), &Buf) == 0)
-       {
-          List.push_back(CD);
-      
-          // Continue down if thorough is given
-          if (_config->FindB("APT::CDROM::Thorough",false) == false)
-             return true;
-          break;
-       }
-    }
-    for (std::vector<std::string>::const_iterator t = types.begin();
-         t != types.end(); ++t)
-    {
-       std::string filename = std::string("Sources");
-       if ((*t).size() > 0)
-          filename.append("."+*t);
-       {
-          SList.push_back(CD);
-      
-          // Continue down if thorough is given
-          if (_config->FindB("APT::CDROM::Thorough",false) == false)
-             return true;
-          break;
-       }
-    }
+   std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
+   for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	c != compressor.end(); ++c)
+   {
+      if (stat(std::string("Packages").append(c->Extension).c_str(), &Buf) != 0)
+	 continue;
+
+      if (_config->FindB("Debug::aptcdrom",false) == true)
+	 std::clog << "Found Packages in " << CD << std::endl;
+      List.push_back(CD);
+
+      // Continue down if thorough is given
+      if (_config->FindB("APT::CDROM::Thorough",false) == false)
+	 return true;
+      break;
+   }
+   for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	c != compressor.end(); ++c)
+   {
+      if (stat(std::string("Sources").append(c->Extension).c_str(), &Buf) != 0)
+	 continue;
+
+      if (_config->FindB("Debug::aptcdrom",false) == true)
+	 std::clog << "Found Sources in " << CD << std::endl;
+      SList.push_back(CD);
+
+      // Continue down if thorough is given
+      if (_config->FindB("APT::CDROM::Thorough",false) == false)
+	 return true;
+      break;
+   }
 
 
    // see if we find translation indices
    // see if we find translation indices
-   if (stat("i18n",&Buf) == 0)
+   if (DirectoryExists("i18n") == true)
    {
    {
       D = opendir("i18n");
       D = opendir("i18n");
       for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D))
       for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D))
       {
       {
-	 if(strstr(Dir->d_name,"Translation") != NULL) 
+	 if(strncmp(Dir->d_name, "Translation-", strlen("Translation-")) != 0)
+	    continue;
+	 string file = Dir->d_name;
+	 for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	      c != compressor.end(); ++c)
 	 {
 	 {
-	    if (_config->FindB("Debug::aptcdrom",false) == true)
-	       std::clog << "found translations: " << Dir->d_name << "\n";
-	    string file = Dir->d_name;
-            for (std::vector<std::string>::const_iterator t = types.begin();
-                 t != types.end(); ++t)
-            {
-               std::string needle = "." + *t;
-               if(file.substr(file.size()-needle.size()) == needle)
-                  file = file.substr(0, file.size()-needle.size());
-               TransList.push_back(CD+"i18n/"+ file);
-               break;
-            }
+	    string fileext = flExtension(file);
+	    if (file == fileext)
+	       fileext.clear();
+	    else if (fileext.empty() == false)
+	       fileext = "." + fileext;
+
+	    if (c->Extension == fileext)
+	    {
+	       if (_config->FindB("Debug::aptcdrom",false) == true)
+		  std::clog << "Found translation " << Dir->d_name << " in " << CD << "i18n/" << std::endl;
+	       TransList.push_back(CD + "i18n/" + file);
+	       break;
+	    }
 	 }
 	 }
       }
       }
       closedir(D);
       closedir(D);
    }
    }
 
 
-   
    D = opendir(".");
    D = opendir(".");
    if (D == 0)
    if (D == 0)
       return _error->Errno("opendir","Unable to read %s",CD.c_str());
       return _error->Errno("opendir","Unable to read %s",CD.c_str());
@@ -278,24 +280,27 @@ bool pkgCdrom::DropRepeats(vector<string> &List,const char *Name)
 {
 {
    // Get a list of all the inodes
    // Get a list of all the inodes
    ino_t *Inodes = new ino_t[List.size()];
    ino_t *Inodes = new ino_t[List.size()];
-   for (unsigned int I = 0; I != List.size(); I++)
+   for (unsigned int I = 0; I != List.size(); ++I)
    {
    {
       struct stat Buf;
       struct stat Buf;
-      std::vector<std::string> types = APT::Configuration::getCompressionTypes();
-      types.push_back("");
-      for (std::vector<std::string>::const_iterator t = types.begin();
-           t != types.end(); ++t)
+      bool found = false;
+
+      std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
+      for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	   c != compressor.end(); ++c)
       {
       {
-         std::string filename = List[I] + Name;
-         if ((*t).size() > 0)
-            filename.append("." + *t);
+	 std::string filename = std::string(List[I]).append(Name).append(c->Extension);
          if (stat(filename.c_str(), &Buf) != 0)
          if (stat(filename.c_str(), &Buf) != 0)
-            _error->Errno("stat","Failed to stat %s%s",List[I].c_str(),
-                          Name);
-         Inodes[I] = Buf.st_ino;
+	    continue;
+	 Inodes[I] = Buf.st_ino;
+	 found = true;
+	 break;
       }
       }
+
+      if (found == false)
+         _error->Errno("stat","Failed to stat %s%s",List[I].c_str(), Name);
    }
    }
-   
+
    if (_error->PendingError() == true) {
    if (_error->PendingError() == true) {
       delete[] Inodes;
       delete[] Inodes;
       return false;
       return false;

+ 72 - 74
apt-pkg/indexcopy.cc

@@ -16,6 +16,7 @@
 #include <apt-pkg/progress.h>
 #include <apt-pkg/progress.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/indexrecords.h>
 #include <apt-pkg/indexrecords.h>
@@ -37,80 +38,62 @@
 
 
 using namespace std;
 using namespace std;
 
 
-// DecompressFile - wrapper for decompressing gzip/bzip2/xz compressed files	/*{{{*/
+// DecompressFile - wrapper for decompressing compressed files		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
 bool DecompressFile(string Filename, int *fd, off_t *FileSize)
 bool DecompressFile(string Filename, int *fd, off_t *FileSize)
 {
 {
-    string CompressProg;
-    string CompressProgFind;
-    FileFd From;
     struct stat Buf;
     struct stat Buf;
-    *fd = -1;        
+    *fd = -1;
 
 
-    if (stat((Filename + ".gz").c_str(), &Buf) == 0)
+    std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
+    std::vector<APT::Configuration::Compressor>::const_iterator UnCompress;
+    std::string file = std::string(Filename).append(UnCompress->Extension);
+    for (UnCompress = compressor.begin(); UnCompress != compressor.end(); ++UnCompress)
     {
     {
-        CompressProg = "gzip";
-        CompressProgFind = "Dir::bin::gzip";
-        From.Open(Filename + ".gz",FileFd::ReadOnly);
+	if (stat(file.c_str(), &Buf) == 0)
+	    break;
     }
     }
-    else if (stat((Filename + ".bz2").c_str(), &Buf) == 0)
-    {
-        CompressProg = "bzip2";
-        CompressProgFind = "Dir::bin::bzip2";
-        From.Open(Filename + ".bz2",FileFd::ReadOnly);
-    }
-    else if (stat((Filename + ".xz").c_str(), &Buf) == 0)
-    {
-        CompressProg = "xz";
-        CompressProgFind = "Dir::bin::xz";
-        From.Open(Filename + ".xz",FileFd::ReadOnly);
-    }
-    else
-    {
+
+    if (UnCompress == compressor.end())
         return _error->Errno("decompressor", "Unable to parse file");
         return _error->Errno("decompressor", "Unable to parse file");
-    }
 
 
-    if (_error->PendingError() == true)
-        return -1;
-	 
     *FileSize = Buf.st_size;
     *FileSize = Buf.st_size;
-            
-    // Get a temp file
-    FILE *tmp = tmpfile();
-    if (tmp == 0)
-        return _error->Errno("tmpfile","Unable to create a tmp file");
-    *fd = dup(fileno(tmp));
-    fclose(tmp);
-	 
-    // Fork decompressor
-    pid_t Process = fork();
-    if (Process < 0)
-        return _error->Errno("fork","Couldn't fork to run decompressor");
-	 
-    // The child
-    if (Process == 0)
-    {	    
-        dup2(From.Fd(),STDIN_FILENO);
-        dup2(*fd,STDOUT_FILENO);
-        SetCloseExec(STDIN_FILENO,false);
-        SetCloseExec(STDOUT_FILENO,false);
-	    
-        const char *Args[3];
-        string Tmp =  _config->Find(CompressProgFind, CompressProg);
-        Args[0] = Tmp.c_str();
-        Args[1] = "-d";
-        Args[2] = 0;
-        if(execvp(Args[0],(char **)Args))
-            return(_error->Errno("decompressor","decompress failed"));
-        /* Should never get here */
-        exit(100);
+
+    // Create a data pipe
+    int Pipe[2] = {-1,-1};
+    if (pipe(Pipe) != 0)
+        return _error->Errno("pipe",_("Failed to create subprocess IPC"));
+    for (int J = 0; J != 2; J++)
+        SetCloseExec(Pipe[J],true);
+
+    *fd = Pipe[1];
+
+    // The child..
+    pid_t Pid = ExecFork();
+    if (Pid == 0)
+    {
+	dup2(Pipe[1],STDOUT_FILENO);
+	SetCloseExec(STDOUT_FILENO, false);
+
+	std::vector<char const*> Args;
+	Args.push_back(UnCompress->Binary.c_str());
+	for (std::vector<std::string>::const_iterator a = UnCompress->UncompressArgs.begin();
+	     a != UnCompress->UncompressArgs.end(); ++a)
+	    Args.push_back(a->c_str());
+	Args.push_back("--stdout");
+	Args.push_back(file.c_str());
+	Args.push_back(NULL);
+
+	execvp(Args[0],(char **)&Args[0]);
+	cerr << _("Failed to exec compressor ") << Args[0] << endl;
+	_exit(100);
     }
     }
 
 
     // Wait for decompress to finish
     // Wait for decompress to finish
-    if (ExecWait(Process,CompressProg.c_str(),false) == false)
+    if (ExecWait(Pid, UnCompress->Binary.c_str(), false) == false)
         return false;
         return false;
-    
+
     return true;
     return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -132,17 +115,25 @@ bool IndexCopy::CopyPackages(string CDROM,string Name,vector<string> &List,
    
    
    // Prepare the progress indicator
    // Prepare the progress indicator
    off_t TotalSize = 0;
    off_t TotalSize = 0;
+   std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
    for (vector<string>::iterator I = List.begin(); I != List.end(); ++I)
    for (vector<string>::iterator I = List.begin(); I != List.end(); ++I)
    {
    {
       struct stat Buf;
       struct stat Buf;
-      if (stat(string(*I + GetFileName()).c_str(),&Buf) != 0 &&
-            stat(string(*I + GetFileName() + ".gz").c_str(),&Buf) != 0 &&
-            stat(string(*I + GetFileName() + ".xz").c_str(),&Buf) != 0 &&
-            stat(string(*I + GetFileName() + ".bz2").c_str(),&Buf) != 0)
-	 return _error->Errno("stat","Stat failed for %s",
-			      string(*I + GetFileName()).c_str());
+      bool found = false;
+      std::string file = std::string(*I).append(GetFileName());
+      for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	   c != compressor.end(); ++c)
+      {
+	 if (stat(std::string(file + c->Extension).c_str(), &Buf) != 0)
+	    continue;
+	 found = true;
+	 break;
+      }
+
+      if (found == false)
+	 return _error->Errno("stat", "Stat failed for %s", file.c_str());
       TotalSize += Buf.st_size;
       TotalSize += Buf.st_size;
-   }	
+   }
 
 
    off_t CurrentSize = 0;
    off_t CurrentSize = 0;
    unsigned int NotFound = 0;
    unsigned int NotFound = 0;
@@ -834,18 +825,25 @@ bool TranslationsCopy::CopyTranslations(string CDROM,string Name,	/*{{{*/
    
    
    // Prepare the progress indicator
    // Prepare the progress indicator
    off_t TotalSize = 0;
    off_t TotalSize = 0;
+   std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
    for (vector<string>::iterator I = List.begin(); I != List.end(); ++I)
    for (vector<string>::iterator I = List.begin(); I != List.end(); ++I)
    {
    {
       struct stat Buf;
       struct stat Buf;
-      
-      if (stat(string(*I).c_str(),&Buf) != 0 &&
-          stat(string(*I + ".gz").c_str(),&Buf) != 0 &&
-          stat(string(*I + ".bz2").c_str(),&Buf) != 0 &&
-          stat(string(*I + ".xz").c_str(),&Buf) != 0)
-	 return _error->Errno("stat","Stat failed for %s",
-			      string(*I).c_str());
+      bool found = false;
+      std::string file = *I;
+      for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	   c != compressor.end(); ++c)
+      {
+	 if (stat(std::string(file + c->Extension).c_str(), &Buf) != 0)
+	    continue;
+	 found = true;
+	 break;
+      }
+
+      if (found == false)
+	 return _error->Errno("stat", "Stat failed for %s", file.c_str());
       TotalSize += Buf.st_size;
       TotalSize += Buf.st_size;
-   }	
+   }
 
 
    off_t CurrentSize = 0;
    off_t CurrentSize = 0;
    unsigned int NotFound = 0;
    unsigned int NotFound = 0;