Parcourir la source

* code cleanups (thanks matt!), moved UsePackage before the description list build in pkgcachegen to catch MMap errors early

Michael Vogt il y a 21 ans
Parent
commit
770c32ec85

+ 2 - 2
apt-pkg/acquire-item.h

@@ -9,7 +9,7 @@
    the Owner Acquire class. Derived classes will then call QueueURI to 
    the Owner Acquire class. Derived classes will then call QueueURI to 
    register all the URI's they wish to fetch at the initial moment.   
    register all the URI's they wish to fetch at the initial moment.   
    
    
-   Tree item classes are provided to provide functionality for
+   Three item classes are provided to provide functionality for
    downloading of Index, Translation and Packages files.
    downloading of Index, Translation and Packages files.
    
    
    A Archive class is provided for downloading .deb files. It does Md5
    A Archive class is provided for downloading .deb files. It does Md5
@@ -106,7 +106,7 @@ class pkgAcqIndex : public pkgAcquire::Item
 	       string ShortDesct, string ExpectedMD5, string compressExt="");
 	       string ShortDesct, string ExpectedMD5, string compressExt="");
 };
 };
 
 
-// Item class for index files
+// Item class for translated package index files
 class pkgAcqIndexTrans : public pkgAcqIndex
 class pkgAcqIndexTrans : public pkgAcqIndex
 {
 {
    public:
    public:

+ 1 - 1
apt-pkg/cacheiterators.h

@@ -99,7 +99,7 @@ class pkgCache::VerIterator
 {
 {
    Version *Ver;
    Version *Ver;
    pkgCache *Owner;
    pkgCache *Owner;
-   
+
    void _dummy();
    void _dummy();
    
    
    public:
    public:

+ 3 - 3
apt-pkg/deb/debindexfile.cc

@@ -358,7 +358,7 @@ string debTranslationsIndex::IndexURI(const char *Type) const
 /* */
 /* */
 bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const
 bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const
 {
 {
-   if (UseTranslation()) {
+   if (TranslationsAvailable()) {
      string TranslationFile = "Translation-" + LanguageCode();
      string TranslationFile = "Translation-" + LanguageCode();
      new pkgAcqIndexTrans(Owner, IndexURI(LanguageCode().c_str()),
      new pkgAcqIndexTrans(Owner, IndexURI(LanguageCode().c_str()),
 			  Info(TranslationFile.c_str()),
 			  Info(TranslationFile.c_str()),
@@ -403,7 +403,7 @@ string debTranslationsIndex::Info(const char *Type) const
 									/*}}}*/
 									/*}}}*/
 bool debTranslationsIndex::HasPackages() const
 bool debTranslationsIndex::HasPackages() const
 {
 {
-   if(!UseTranslation())
+   if(!TranslationsAvailable())
       return false;
       return false;
    
    
    return FileExists(IndexFile(LanguageCode().c_str()));
    return FileExists(IndexFile(LanguageCode().c_str()));
@@ -435,7 +435,7 @@ bool debTranslationsIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
 {
 {
    // Check the translation file, if in use
    // Check the translation file, if in use
    string TranslationFile = IndexFile(LanguageCode().c_str());
    string TranslationFile = IndexFile(LanguageCode().c_str());
-   if (UseTranslation() && FileExists(TranslationFile))
+   if (TranslationsAvailable() && FileExists(TranslationFile))
    {
    {
      FileFd Trans(TranslationFile,FileFd::ReadOnly);
      FileFd Trans(TranslationFile,FileFd::ReadOnly);
      debListParser TransParser(&Trans);
      debListParser TransParser(&Trans);

+ 6 - 4
apt-pkg/deb/deblistparser.cc

@@ -143,14 +143,16 @@ string debListParser::DescriptionLanguage()
                                                                         /*}}}*/
                                                                         /*}}}*/
 // ListParser::Description - Return the description_md5 MD5SumValue	/*{{{*/
 // ListParser::Description - Return the description_md5 MD5SumValue	/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
-/* This is to return the md5 string to allow the check if is the right
-   description. If thisreturns a blank string then calculate the md5
-   value. */
+/* This is to return the md5 string to allow the check if it is the right
+   description. If no Description-md5 is found in the section it will be
+   calculated.
+ */
 MD5SumValue debListParser::Description_md5()
 MD5SumValue debListParser::Description_md5()
 {
 {
    string value = Section.FindS("Description-md5");
    string value = Section.FindS("Description-md5");
 
 
-   if (value.empty()) {
+   if (value.empty()) 
+   {
       MD5Summation md5;
       MD5Summation md5;
       md5.Add((Description() + "\n").c_str());
       md5.Add((Description() + "\n").c_str());
       return md5.Result();
       return md5.Result();

+ 3 - 1
apt-pkg/deb/debmetaindex.cc

@@ -189,8 +189,10 @@ vector <pkgIndexFile *> *debReleaseIndex::GetIndexFiles()
       if ((*I)->IsSrc)
       if ((*I)->IsSrc)
          Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted()));
          Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted()));
       else 
       else 
+      {
          Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted()));
          Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted()));
-      Indexes->push_back(new debTranslationsIndex(URI,Dist,(*I)->Section));
+	 Indexes->push_back(new debTranslationsIndex(URI, Dist, (*I)->Section));
+      }
    }
    }
 
 
    return Indexes;
    return Indexes;

+ 11 - 5
apt-pkg/indexfile.cc

@@ -70,10 +70,10 @@ string pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const &Record,
    return string();
    return string();
 }
 }
 									/*}}}*/
 									/*}}}*/
-// IndexFile::UseTranslation - Check if will use Translation	        /*{{{*/
+// IndexFile::TranslationsAvailable - Check if will use Translation    /*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
-bool pkgIndexFile::UseTranslation()
+bool pkgIndexFile::TranslationsAvailable()
 {
 {
   const string Translation = _config->Find("APT::Acquire::Translation");
   const string Translation = _config->Find("APT::Acquire::Translation");
   
   
@@ -89,7 +89,6 @@ bool pkgIndexFile::UseTranslation()
 /* common cases: de_DE, de_DE@euro, de_DE.UTF-8, de_DE.UTF-8@euro,
 /* common cases: de_DE, de_DE@euro, de_DE.UTF-8, de_DE.UTF-8@euro,
                  de_DE.ISO8859-1, tig_ER
                  de_DE.ISO8859-1, tig_ER
                  more in /etc/gdm/locale.conf 
                  more in /etc/gdm/locale.conf 
-		 approach: just get the first letter before the underscore?!?
 */
 */
 
 
 bool pkgIndexFile::CheckLanguageCode(const char *Lang)
 bool pkgIndexFile::CheckLanguageCode(const char *Lang)
@@ -105,13 +104,20 @@ bool pkgIndexFile::CheckLanguageCode(const char *Lang)
 									/*}}}*/
 									/*}}}*/
 // IndexFile::LanguageCode - Return the Language Code            	/*{{{*/
 // IndexFile::LanguageCode - Return the Language Code            	/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
-/* */
+/* return the language code */
 string pkgIndexFile::LanguageCode()
 string pkgIndexFile::LanguageCode()
 {
 {
   const string Translation = _config->Find("APT::Acquire::Translation");
   const string Translation = _config->Find("APT::Acquire::Translation");
 
 
-  if (Translation.compare("environment") == 0) {
+  if (Translation.compare("environment") == 0) 
+  {
      string lang = std::setlocale(LC_MESSAGES,NULL);
      string lang = std::setlocale(LC_MESSAGES,NULL);
+
+     // FIXME: this needs to be added
+     // we have a mapping of the language codes that contains all the language
+     // codes that need the country code as well 
+     // (like pt_BR, pt_PT, sv_SE, zh_*, en_*)
+
      if(lang.size() > 2)
      if(lang.size() > 2)
 	return lang.substr(0,2);
 	return lang.substr(0,2);
      else
      else

+ 1 - 1
apt-pkg/indexfile.h

@@ -81,7 +81,7 @@ class pkgIndexFile
    virtual bool MergeFileProvides(pkgCacheGenerator &/*Gen*/,OpProgress &/*Prog*/) const {return true;};
    virtual bool MergeFileProvides(pkgCacheGenerator &/*Gen*/,OpProgress &/*Prog*/) const {return true;};
    virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
    virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
 
 
-   static bool UseTranslation();
+   static bool TranslationsAvailable();
    static bool CheckLanguageCode(const char *Lang);
    static bool CheckLanguageCode(const char *Lang);
    static string LanguageCode();
    static string LanguageCode();
 
 

+ 3 - 3
apt-pkg/init.cc

@@ -33,9 +33,6 @@ const char *pkgOS = COMMON_OS;
    is prepended, this allows a fair degree of flexability. */
    is prepended, this allows a fair degree of flexability. */
 bool pkgInitConfig(Configuration &Cnf)
 bool pkgInitConfig(Configuration &Cnf)
 {
 {
-   // Translation
-   Cnf.Set("APT::Acquire::Translation", "environment");
-
    // General APT things
    // General APT things
    if (strcmp(COMMON_OS,"linux") == 0 ||
    if (strcmp(COMMON_OS,"linux") == 0 ||
        strcmp(COMMON_OS,"unknown") == 0)
        strcmp(COMMON_OS,"unknown") == 0)
@@ -104,6 +101,9 @@ bool pkgInitConfig(Configuration &Cnf)
       bindtextdomain(textdomain(0),Cnf.FindDir("Dir::Locale").c_str());
       bindtextdomain(textdomain(0),Cnf.FindDir("Dir::Locale").c_str());
    }
    }
 #endif
 #endif
+
+   // Translation
+   Cnf.Set("APT::Acquire::Translation", "environment");
    
    
    return true;
    return true;
 }
 }

+ 1 - 1
apt-pkg/pkgcache.cc

@@ -244,11 +244,11 @@ const char *pkgCache::Priority(unsigned char Prio)
    return 0;
    return 0;
 }
 }
 									/*}}}*/
 									/*}}}*/
-
 // Bases for iterator classes						/*{{{*/
 // Bases for iterator classes						/*{{{*/
 void pkgCache::VerIterator::_dummy() {}
 void pkgCache::VerIterator::_dummy() {}
 void pkgCache::DepIterator::_dummy() {}
 void pkgCache::DepIterator::_dummy() {}
 void pkgCache::PrvIterator::_dummy() {}
 void pkgCache::PrvIterator::_dummy() {}
+void pkgCache::DescIterator::_dummy() {}
 									/*}}}*/
 									/*}}}*/
 // PkgIterator::operator ++ - Postfix incr				/*{{{*/
 // PkgIterator::operator ++ - Postfix incr				/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------

+ 19 - 10
apt-pkg/pkgcachegen.cc

@@ -125,31 +125,39 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
       string Version = List.Version();
       string Version = List.Version();
       if (Version.empty() == true)
       if (Version.empty() == true)
       {
       {
+	 // we first process the package, then the descriptions
+	 // (this has the bonus that we get MMap error when we run out
+	 //  of MMap space)
+	 if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false)
+	    return _error->Error(_("Error occurred while processing %s (UsePackage1)"),
+				 PackageName.c_str());
+
  	 // Find the right version to write the description
  	 // Find the right version to write the description
  	 MD5SumValue CurMd5 = List.Description_md5();
  	 MD5SumValue CurMd5 = List.Description_md5();
  	 pkgCache::VerIterator Ver = Pkg.VersionList();
  	 pkgCache::VerIterator Ver = Pkg.VersionList();
  	 map_ptrloc *LastVer = &Pkg->VersionList;
  	 map_ptrloc *LastVer = &Pkg->VersionList;
- 	 
+
   	 for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++) 
   	 for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++) 
  	 {
  	 {
  	    pkgCache::DescIterator Desc = Ver.DescriptionList();
  	    pkgCache::DescIterator Desc = Ver.DescriptionList();
  	    map_ptrloc *LastDesc = &Ver->DescriptionList;
  	    map_ptrloc *LastDesc = &Ver->DescriptionList;
-       
+
  	    for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++)
  	    for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++)
- 	       if (MD5SumValue(Desc.md5()) == CurMd5) {
+	    {
+
+ 	       if (MD5SumValue(Desc.md5()) == CurMd5) 
+               {
  		  // Add new description
  		  // Add new description
  		  *LastDesc = NewDescription(Desc, List.DescriptionLanguage(), CurMd5, *LastDesc);
  		  *LastDesc = NewDescription(Desc, List.DescriptionLanguage(), CurMd5, *LastDesc);
  		  Desc->ParentPkg = Pkg.Index();
  		  Desc->ParentPkg = Pkg.Index();
- 
+		  
  		  if (NewFileDesc(Desc,List) == false)
  		  if (NewFileDesc(Desc,List) == false)
  		     return _error->Error(_("Error occured while processing %s (NewFileDesc1)"),PackageName.c_str());
  		     return _error->Error(_("Error occured while processing %s (NewFileDesc1)"),PackageName.c_str());
  		  break;
  		  break;
  	       }
  	       }
+	    }
  	 }
  	 }
- 
-	 if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false)
-	    return _error->Error(_("Error occurred while processing %s (UsePackage1)"),
-				 PackageName.c_str());
+
 	 continue;
 	 continue;
       }
       }
 
 
@@ -403,14 +411,15 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
    unsigned long DescFile = Map.Allocate(sizeof(pkgCache::DescFile));
    unsigned long DescFile = Map.Allocate(sizeof(pkgCache::DescFile));
    if (DescFile == 0)
    if (DescFile == 0)
       return 0;
       return 0;
-   
+
    pkgCache::DescFileIterator DF(Cache,Cache.DescFileP + DescFile);
    pkgCache::DescFileIterator DF(Cache,Cache.DescFileP + DescFile);
    DF->File = CurrentFile - Cache.PkgFileP;
    DF->File = CurrentFile - Cache.PkgFileP;
-   
+
    // Link it to the end of the list
    // Link it to the end of the list
    map_ptrloc *Last = &Desc->FileList;
    map_ptrloc *Last = &Desc->FileList;
    for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; D++)
    for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; D++)
       Last = &D->NextFile;
       Last = &D->NextFile;
+
    DF->NextFile = *Last;
    DF->NextFile = *Last;
    *Last = DF.Index();
    *Last = DF.Index();