]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/debmetaindex.cc
- download and use i18n/Index to choose which Translations to download
[apt.git] / apt-pkg / deb / debmetaindex.cc
index e2c680b14614dae24cd0404e825af13351ebab7b..a6edab6b9f5174635660f31d7f10eaa817aa8d63 100644 (file)
@@ -119,6 +119,29 @@ string debReleaseIndex::SourceIndexURI(const char *Type, const string &Section)
       return URI + "dists/" + Dist + "/" + SourceIndexURISuffix(Type, Section);
 }
 
+string debReleaseIndex::TranslationIndexURISuffix(const char *Type, const string &Section) const
+{
+   string Res ="";
+   if (Dist[Dist.size() - 1] != '/')
+      Res += Section + "/i18n/";
+   return Res + Type;
+}
+
+string debReleaseIndex::TranslationIndexURI(const char *Type, const string &Section) const
+{
+   string Res;
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+         Res = URI + Dist;
+      else 
+         Res = URI;
+      return Res + Type;
+   }
+   else
+      return URI + "dists/" + Dist + "/" + TranslationIndexURISuffix(Type, Section);
+}
+
 debReleaseIndex::debReleaseIndex(string const &URI, string const &Dist) {
        this->URI = URI;
        this->Dist = Dist;
@@ -155,6 +178,7 @@ vector <struct IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const {
        if (IndexTargets->empty() == false && ArchEntries.size() == 1)
                return IndexTargets;
 
+       std::set<std::string> sections;
        for (map<string, vector<debSectionEntry const*> >::const_iterator a = ArchEntries.begin();
             a != ArchEntries.end(); ++a) {
                if (a->first == "source")
@@ -167,6 +191,37 @@ vector <struct IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const {
                        Target->URI = IndexURI(Target->ShortDesc.c_str(), (*I)->Section, a->first);
                        Target->Description = Info (Target->ShortDesc.c_str(), (*I)->Section, a->first);
                        IndexTargets->push_back (Target);
+                       sections.insert((*I)->Section);
+               }
+       }
+
+       // get the Translations:
+       // - if its a dists-style repository get the i18n/Index first
+       // - if its flat try to acquire files by guessing
+       if (Dist[Dist.size() - 1] == '/') {
+               std::vector<std::string> const lang = APT::Configuration::getLanguages(true);
+               for (std::set<std::string>::const_iterator s = sections.begin();
+                    s != sections.end(); ++s) {
+                       for (std::vector<std::string>::const_iterator l = lang.begin();
+                            l != lang.end(); l++) {
+                               if (*l == "none") continue;
+                               IndexTarget * Target = new OptionalIndexTarget();
+                               Target->ShortDesc = "Translation-" + *l;
+                               Target->MetaKey = TranslationIndexURISuffix(l->c_str(), *s);
+                               Target->URI = TranslationIndexURI(l->c_str(), *s);
+                               Target->Description = Info (Target->ShortDesc.c_str(), *s);
+                               IndexTargets->push_back(Target);
+                       }
+               }
+       } else {
+               for (std::set<std::string>::const_iterator s = sections.begin();
+                    s != sections.end(); ++s) {
+                       IndexTarget * Target = new OptionalIndexTarget();
+                       Target->ShortDesc = "TranslationIndex";
+                       Target->MetaKey = TranslationIndexURISuffix("Index", *s);
+                       Target->URI = TranslationIndexURI("Index", *s);
+                       Target->Description = Info (Target->ShortDesc.c_str(), *s);
+                       IndexTargets->push_back (Target);
                }
        }
 
@@ -191,28 +246,6 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const
                ComputeIndexTargets(),
                new indexRecords (Dist));
 
-
-       // Queue the translations
-       std::vector<std::string> const lang = APT::Configuration::getLanguages(true);
-       map<string, set<string> > sections;
-       for (map<string, vector<debSectionEntry const*> >::const_iterator a = ArchEntries.begin();
-            a != ArchEntries.end(); ++a) {
-               if (a->first == "source")
-                       continue;
-               for (vector<debSectionEntry const*>::const_iterator I = a->second.begin();
-                    I != a->second.end(); I++)
-                       sections[(*I)->Section].insert(lang.begin(), lang.end());
-       }
-
-       for (map<string, set<string> >::const_iterator s = sections.begin();
-            s != sections.end(); ++s)
-               for (set<string>::const_iterator l = s->second.begin();
-                    l != s->second.end(); l++) {
-                       if (*l == "none") continue;
-                       debTranslationsIndex i = debTranslationsIndex(URI,Dist,s->first,(*l).c_str());
-                       i.GetIndexes(Owner);
-               }
-
        return true;
 }