Browse Source

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

debian/1.8.y
Michael Vogt 17 years ago
parent
commit
770c32ec85
  1. 4
      apt-pkg/acquire-item.h
  2. 2
      apt-pkg/cacheiterators.h
  3. 6
      apt-pkg/deb/debindexfile.cc
  4. 10
      apt-pkg/deb/deblistparser.cc
  5. 4
      apt-pkg/deb/debmetaindex.cc
  6. 16
      apt-pkg/indexfile.cc
  7. 2
      apt-pkg/indexfile.h
  8. 6
      apt-pkg/init.cc
  9. 2
      apt-pkg/pkgcache.cc
  10. 29
      apt-pkg/pkgcachegen.cc

4
apt-pkg/acquire-item.h

@ -9,7 +9,7 @@
the Owner Acquire class. Derived classes will then call QueueURI to
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.
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="");
};
// Item class for index files
// Item class for translated package index files
class pkgAcqIndexTrans : public pkgAcqIndex
{
public:

2
apt-pkg/cacheiterators.h

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

6
apt-pkg/deb/debindexfile.cc

@ -358,7 +358,7 @@ string debTranslationsIndex::IndexURI(const char *Type) const
/* */
bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const
{
if (UseTranslation()) {
if (TranslationsAvailable()) {
string TranslationFile = "Translation-" + LanguageCode();
new pkgAcqIndexTrans(Owner, IndexURI(LanguageCode().c_str()),
Info(TranslationFile.c_str()),
@ -403,7 +403,7 @@ string debTranslationsIndex::Info(const char *Type) const
/*}}}*/
bool debTranslationsIndex::HasPackages() const
{
if(!UseTranslation())
if(!TranslationsAvailable())
return false;
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
string TranslationFile = IndexFile(LanguageCode().c_str());
if (UseTranslation() && FileExists(TranslationFile))
if (TranslationsAvailable() && FileExists(TranslationFile))
{
FileFd Trans(TranslationFile,FileFd::ReadOnly);
debListParser TransParser(&Trans);

10
apt-pkg/deb/deblistparser.cc

@ -143,14 +143,16 @@ string debListParser::DescriptionLanguage()
/*}}}*/
// 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()
{
string value = Section.FindS("Description-md5");
if (value.empty()) {
if (value.empty())
{
MD5Summation md5;
md5.Add((Description() + "\n").c_str());
return md5.Result();

4
apt-pkg/deb/debmetaindex.cc

@ -189,8 +189,10 @@ vector <pkgIndexFile *> *debReleaseIndex::GetIndexFiles()
if ((*I)->IsSrc)
Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted()));
else
{
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;

16
apt-pkg/indexfile.cc

@ -70,10 +70,10 @@ string pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const &Record,
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");
@ -89,7 +89,6 @@ bool pkgIndexFile::UseTranslation()
/* common cases: de_DE, de_DE@euro, de_DE.UTF-8, de_DE.UTF-8@euro,
de_DE.ISO8859-1, tig_ER
more in /etc/gdm/locale.conf
approach: just get the first letter before the underscore?!?
*/
bool pkgIndexFile::CheckLanguageCode(const char *Lang)
@ -105,13 +104,20 @@ bool pkgIndexFile::CheckLanguageCode(const char *Lang)
/*}}}*/
// IndexFile::LanguageCode - Return the Language Code /*{{{*/
// ---------------------------------------------------------------------
/* */
/* return the language code */
string pkgIndexFile::LanguageCode()
{
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);
// 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)
return lang.substr(0,2);
else

2
apt-pkg/indexfile.h

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

6
apt-pkg/init.cc

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

2
apt-pkg/pkgcache.cc

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

29
apt-pkg/pkgcachegen.cc

@ -125,31 +125,39 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
string Version = List.Version();
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
MD5SumValue CurMd5 = List.Description_md5();
pkgCache::VerIterator Ver = Pkg.VersionList();
map_ptrloc *LastVer = &Pkg->VersionList;
for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++)
{
pkgCache::DescIterator Desc = Ver.DescriptionList();
map_ptrloc *LastDesc = &Ver->DescriptionList;
for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++)
if (MD5SumValue(Desc.md5()) == CurMd5) {
{
if (MD5SumValue(Desc.md5()) == CurMd5)
{
// Add new description
*LastDesc = NewDescription(Desc, List.DescriptionLanguage(), CurMd5, *LastDesc);
Desc->ParentPkg = Pkg.Index();
if (NewFileDesc(Desc,List) == false)
return _error->Error(_("Error occured while processing %s (NewFileDesc1)"),PackageName.c_str());
break;
}
}
}
if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false)
return _error->Error(_("Error occurred while processing %s (UsePackage1)"),
PackageName.c_str());
continue;
}
@ -403,14 +411,15 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
unsigned long DescFile = Map.Allocate(sizeof(pkgCache::DescFile));
if (DescFile == 0)
return 0;
pkgCache::DescFileIterator DF(Cache,Cache.DescFileP + DescFile);
DF->File = CurrentFile - Cache.PkgFileP;
// Link it to the end of the list
map_ptrloc *Last = &Desc->FileList;
for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; D++)
Last = &D->NextFile;
DF->NextFile = *Last;
*Last = DF.Index();

Loading…
Cancel
Save