- read file locations from repomd.xml instead of hardcoding them
authorPanu Matilainen <pmatilai@turre.koti.laiskiainen.org>
Tue, 14 Nov 2006 20:05:16 +0000 (22:05 +0200)
committerPanu Matilainen <pmatilai@turre.koti.laiskiainen.org>
Tue, 14 Nov 2006 20:05:16 +0000 (22:05 +0200)
- basic support for retrieving other.xml and updatesinfo.xml files

apt-pkg/repository.h
apt-pkg/rpm/repomd.cc
apt-pkg/rpm/repomd.h
apt-pkg/rpm/rpmindexfile.cc
apt-pkg/rpm/rpmindexfile.h

index 35f4f49..b59a96e 100644 (file)
@@ -46,6 +46,8 @@ class pkgRepository
 
    virtual bool IsAuthenticated() const { return !FingerPrint.empty(); };
    virtual bool FindChecksums(string URI,off_t &Size, string &MD5);
+   // Only used in repomd atm
+   virtual bool FindURI(string DataType, string &URI) {return false;};
    // LORG:2006-02-23 
    virtual string GetComprMethod() {return ComprMethod;};
    virtual string GetCheckMethod() {return CheckMethod;};
index 4a41273..74fbdc1 100644 (file)
@@ -45,7 +45,7 @@ bool repomdRepository::ParseRelease(string File)
    RepoMD = xmlReadFile(File.c_str(), NULL, XML_PARSE_NONET);
    if ((Root = xmlDocGetRootElement(RepoMD)) == NULL) {
       xmlFreeDoc(RepoMD);
-      return _error->Error(_("could not open Release file '%s'"),File.c_str());
+      return _error->Error(_("Could not open metadata file '%s'"),File.c_str());
    }
 
    for (xmlNode *Node = Root->children; Node; Node = Node->next) {
@@ -55,10 +55,14 @@ bool repomdRepository::ParseRelease(string File)
 
       string Hash = "";
       string Path = "";
-      string Type = "";
-      string Timestamp = "";
+      string ChecksumType = "";
+      string DataType = "";
+      string TimeStamp = "";
       xmlNode *n = NULL;
 
+      xmlChar *type = xmlGetProp(Node, (xmlChar*)"type");
+      DataType = (char*)type;
+
       n = FindNode(Node, "location");
       if (n) {
         xmlChar *href = xmlGetProp(n, (xmlChar*)"href");
@@ -77,14 +81,16 @@ bool repomdRepository::ParseRelease(string File)
         xmlChar *hash = xmlNodeGetContent(n);
         xmlChar *type = xmlGetProp(n, (xmlChar*)"type");
         Hash = (char*)hash;
-        Type = (char*)type;
+        ChecksumType = (char*)type;
         xmlFree(hash);
         xmlFree(type);
       }
 
       IndexChecksums[Path].MD5 = Hash;
       IndexChecksums[Path].Size = 0;
-      if (Type == "sha") {
+      RepoFiles[DataType].Path = Path;
+      RepoFiles[DataType].TimeStamp = TimeStamp;
+      if (ChecksumType == "sha") {
         CheckMethod = "SHA1-Hash";
       } else {
         CheckMethod = "MDA5-Hash";
@@ -97,6 +103,17 @@ bool repomdRepository::ParseRelease(string File)
    return true;
 }
 
+bool repomdRepository::FindURI(string DataType, string &URI)
+{
+   bool found = false;
+   if (RepoFiles.find(DataType) != RepoFiles.end()) {
+        URI = RepoFiles[DataType].Path;
+        found = true;
+   }
+   return found;
+}
+
+
 #endif /* APT_WITH_REPOMD */
 
 // vim:sts=3:sw=3
index ca1bbec..cca1642 100644 (file)
@@ -23,11 +23,20 @@ class repomdRepository : public pkgRepository
 
    xmlDocPtr RepoMD;
    xmlNode *Root;
+   
+   struct RepoFile {
+      string Path;
+      string Type;
+      string TimeStamp;
+   };
+
+   map<string,RepoFile> RepoFiles;
 
    public:   
 
    virtual bool IsAuthenticated() const { return false; };
    virtual bool ParseRelease(string File);
+   bool FindURI(string DataType, string &URI);
    
    repomdRepository(string URI,string Dist, const pkgSourceList::Vendor *Vendor,
                 string RootURI)
index 23707c0..939332a 100644 (file)
@@ -368,7 +368,7 @@ bool rpmPkgListIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
    string PackageFile = IndexPath();
    RPMHandler *Handler = CreateHandler();
 
-   Prog.SubProgress(0,Info(MainType()));
+   Prog.SubProgress(0,Info("primary"));
    ::URI Tmp(URI);
    if (Gen.SelectFile(PackageFile,Tmp.Host,*this) == false)
    {
@@ -632,12 +632,13 @@ string rpmRepomdIndex::IndexURI(string Type) const
    if (Dist[Dist.size() - 1] != '/') {
         Res += "/";
    }
-   // When called with the main type it's primary.xml we want, at other
-   // times it could be eg filelists.xml
-   if (Type == "repomd" || Type == "repomd-src")
-      Res += "repodata/primary.xml";
-   else
-      Res += "repodata/" + Type;
+   string TypeURI;
+   if (Repository->FindURI(Type, TypeURI)) {
+      Res += TypeURI;
+   } else {
+      Res = "";
+   }
+   assert(Res.size() > 0);
    return Res;
 }
                                                                        /*}}}*/
@@ -646,8 +647,6 @@ bool rpmRepomdIndex::GetReleases(pkgAcquire *Owner) const
    if (!Repository->Acquire)
       return true;
    Repository->Acquire = false;
-   // ignore for now - we need to parse the file for checksum and 
-   // optimally for location of other xml files as well
    new pkgAcqIndexRel(Owner,Repository,ReleaseURI("repomd.xml"),
                       ReleaseInfo("repomd.xml"), "repomd.xml", true);
    return true;
@@ -655,14 +654,20 @@ bool rpmRepomdIndex::GetReleases(pkgAcquire *Owner) const
 
 bool rpmRepomdIndex::GetIndexes(pkgAcquire *Owner) const
 {
-   new pkgAcqIndex(Owner,Repository,IndexURI("primary.xml"),
+
+   new pkgAcqIndex(Owner,Repository,IndexURI("primary"),
                   Info("primary.xml"), "primary.xml");
-   new pkgAcqIndex(Owner,Repository,IndexURI("filelists.xml"),
+   new pkgAcqIndex(Owner,Repository,IndexURI("filelists"),
                   Info("filelists.xml"), "filelists.xml");
-#if 0
-   new pkgAcqIndex(Owner,Repository,IndexURI("other.xml"),
-                  Info("other.xml"), "other.xml");
-#endif
+   if (_config->FindB("Acquire::ChangeLogs", false)) {
+      new pkgAcqIndex(Owner,Repository,IndexURI("other"),
+                    Info("other.xml"), "other.xml");
+   }
+   string dummy;
+   if (Repository->FindURI("updateinfo", dummy)) {
+      new pkgAcqIndex(Owner,Repository,IndexURI("updateinfo"),
+                    Info("updateinfo.xml"), "updateinfo.xml");
+   }
    return true;
 }
 
@@ -690,7 +695,7 @@ bool rpmRepomdIndex::Exists() const
 
 string rpmRepomdIndex::ReleasePath() const
 {
-   return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("release.xml"));
+   return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("repomd.xml"));
 }
 
 // This gets called several times per each index during cache generation,
@@ -719,9 +724,10 @@ unsigned long rpmRepomdIndex::Size() const
 bool rpmRepomdIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
 {
    string PackageFile = IndexPath();
+   cout << "packagefile " << PackageFile << endl;
    RPMHandler *Handler = CreateHandler();
 
-   Prog.SubProgress(0,Info(MainType()));
+   Prog.SubProgress(0,Info("primary"));
    ::URI Tmp(URI);
    if (Gen.SelectFile(PackageFile,Tmp.Host,*this) == false)
    {
@@ -784,6 +790,16 @@ bool rpmRepomdIndex::MergeFileProvides(pkgCacheGenerator &Gen,
    return true;
 }
 
+rpmRepomdIndex::rpmRepomdIndex(string URI,string Dist,string Section, 
+                              pkgRepository *Repository):
+                              URI(URI), Dist(Dist), Section(Section),
+                              Repository(Repository)   
+{
+   if (FileExists(ReleasePath())) {
+      Repository->ParseRelease(ReleasePath());
+   }
+}
+
 pkgSrcRecords::Parser *rpmRepomdIndex::CreateSrcParser() const
 {
    return new rpmSrcRecordParser(IndexPath(), this);
index 4c07a7f..2879720 100644 (file)
@@ -297,14 +297,14 @@ class rpmRepomdIndex : public rpmIndexFile
    string IndexURI(string Type) const;
 
    virtual string MainType() const = 0;
-   virtual string IndexPath() const {return IndexFile(MainType());};
+   virtual string IndexPath() const {return IndexFile("primary");};
    virtual string ReleasePath() const;
 
    public:
 
    // Creates a RPMHandler suitable for usage with this object
    virtual RPMHandler *CreateHandler() const
-          { return new RPMRepomdHandler(IndexPath()); };
+          { return new RPMRepomdHandler(IndexFile("primary")); };
 
    virtual bool GetReleases(pkgAcquire *Owner) const;
 
@@ -330,10 +330,7 @@ class rpmRepomdIndex : public rpmIndexFile
    virtual pkgSrcRecords::Parser *CreateSrcParser() const;
 
    rpmRepomdIndex(string URI,string Dist,string Section,
-               pkgRepository *Repository) :
-                       URI(URI), Dist(Dist), Section(Section),
-               Repository(Repository)
-       {};
+               pkgRepository *Repository);
 
 };