]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/debmetaindex.cc
merge from lp:~mvo/apt/mvo
[apt.git] / apt-pkg / deb / debmetaindex.cc
index 947a7f04beef4b81f9620a790f37fd8a22d45ae6..a91cc34e9b826b31aa99f733897342f90550aef7 100644 (file)
@@ -23,7 +23,7 @@ string debReleaseIndex::Info(const char *Type, string const &Section, string con
    else
    {
       Info += Dist + '/' + Section;
    else
    {
       Info += Dist + '/' + Section;
-      if (Arch.empty() == true)
+      if (Arch.empty() != true)
         Info += " " + Arch;
    }
    Info += " ";
         Info += " " + Arch;
    }
    Info += " ";
@@ -119,6 +119,29 @@ string debReleaseIndex::SourceIndexURI(const char *Type, const string &Section)
       return URI + "dists/" + Dist + "/" + SourceIndexURISuffix(Type, 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;
 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;
 
        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")
        for (map<string, vector<debSectionEntry const*> >::const_iterator a = ArchEntries.begin();
             a != ArchEntries.end(); ++a) {
                if (a->first == "source")
@@ -167,6 +191,40 @@ 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);
                        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);
+               }
+       }
+
+       std::vector<std::string> const lang = APT::Configuration::getLanguages(true);
+       if (lang.empty() == true)
+               return IndexTargets;
+
+       // 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] == '/') {
+               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);
                }
        }
 
                }
        }
 
@@ -182,58 +240,34 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const
         new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description,
                         (*Target)->ShortDesc, HashString());
       }
         new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description,
                         (*Target)->ShortDesc, HashString());
       }
-      // this is normally created in pkgAcqMetaSig, but if we run
-      // in --print-uris mode, we add it here
-      new pkgAcqMetaIndex(Owner, MetaIndexURI("Release"),
-                    MetaIndexInfo("Release"), "Release",
-                    MetaIndexURI("Release.gpg"), 
-                    ComputeIndexTargets(),
-                    new indexRecords (Dist));
-
    }
 
    }
 
-   new pkgAcqMetaSig(Owner, MetaIndexURI("Release.gpg"),
-                    MetaIndexInfo("Release.gpg"), "Release.gpg",
-                    MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
-                    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);
-               }
+       new pkgAcqMetaClearSig(Owner, MetaIndexURI("InRelease"),
+               MetaIndexInfo("InRelease"), "InRelease",
+               MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
+               MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
+               ComputeIndexTargets(),
+               new indexRecords (Dist));
 
        return true;
 }
 
 bool debReleaseIndex::IsTrusted() const
 {
 
        return true;
 }
 
 bool debReleaseIndex::IsTrusted() const
 {
-   string VerifiedSigFile = _config->FindDir("Dir::State::lists") +
-      URItoFileName(MetaIndexURI("Release")) + ".gpg";
-   
    if(_config->FindB("APT::Authentication::TrustCDROM", false))
       if(URI.substr(0,strlen("cdrom:")) == "cdrom:")
         return true;
    if(_config->FindB("APT::Authentication::TrustCDROM", false))
       if(URI.substr(0,strlen("cdrom:")) == "cdrom:")
         return true;
-   
+
+   string VerifiedSigFile = _config->FindDir("Dir::State::lists") +
+      URItoFileName(MetaIndexURI("Release")) + ".gpg";
+
    if (FileExists(VerifiedSigFile))
       return true;
    if (FileExists(VerifiedSigFile))
       return true;
-   return false;
+
+   VerifiedSigFile = _config->FindDir("Dir::State::lists") +
+      URItoFileName(MetaIndexURI("InRelease"));
+
+   return FileExists(VerifiedSigFile);
 }
 
 vector <pkgIndexFile *> *debReleaseIndex::GetIndexFiles() {
 }
 
 vector <pkgIndexFile *> *debReleaseIndex::GetIndexFiles() {
@@ -313,7 +347,7 @@ class debSLTypeDebian : public pkgSourceList::Type
    {
       map<string, string>::const_iterator const arch = Options.find("arch");
       vector<string> const Archs =
    {
       map<string, string>::const_iterator const arch = Options.find("arch");
       vector<string> const Archs =
-               (arch != Options.end()) ? ExplodeString(arch->second, ',') :
+               (arch != Options.end()) ? VectorizeString(arch->second, ',') :
                                APT::Configuration::getArchitectures();
 
       for (vector<metaIndex *>::const_iterator I = List.begin();
                                APT::Configuration::getArchitectures();
 
       for (vector<metaIndex *>::const_iterator I = List.begin();
@@ -332,7 +366,12 @@ class debSLTypeDebian : public pkgSourceList::Type
            if (IsSrc == true)
               Deb->PushSectionEntry("source", new debReleaseIndex::debSectionEntry(Section, IsSrc));
            else
            if (IsSrc == true)
               Deb->PushSectionEntry("source", new debReleaseIndex::debSectionEntry(Section, IsSrc));
            else
-              Deb->PushSectionEntry(Archs, new debReleaseIndex::debSectionEntry(Section, IsSrc));
+           {
+              if (Dist[Dist.size() - 1] == '/')
+                 Deb->PushSectionEntry("any", new debReleaseIndex::debSectionEntry(Section, IsSrc));
+              else
+                 Deb->PushSectionEntry(Archs, new debReleaseIndex::debSectionEntry(Section, IsSrc));
+           }
            return true;
         }
       }
            return true;
         }
       }
@@ -342,7 +381,12 @@ class debSLTypeDebian : public pkgSourceList::Type
       if (IsSrc == true)
         Deb->PushSectionEntry ("source", new debReleaseIndex::debSectionEntry(Section, IsSrc));
       else
       if (IsSrc == true)
         Deb->PushSectionEntry ("source", new debReleaseIndex::debSectionEntry(Section, IsSrc));
       else
-        Deb->PushSectionEntry (Archs, new debReleaseIndex::debSectionEntry(Section, IsSrc));
+      {
+        if (Dist[Dist.size() - 1] == '/')
+           Deb->PushSectionEntry ("any", new debReleaseIndex::debSectionEntry(Section, IsSrc));
+        else
+           Deb->PushSectionEntry (Archs, new debReleaseIndex::debSectionEntry(Section, IsSrc));
+      }
       List.push_back(Deb);
       return true;
    }
       List.push_back(Deb);
       return true;
    }