- xmlTextReaderRead() can fail with non-zero values as well
[apt.git] / apt-pkg / rpm / rpmindexfile.cc
index edc026d..9aaa72e 100644 (file)
@@ -17,6 +17,8 @@
 
 #ifdef HAVE_RPM
 
+#include <cassert>
+
 #include <apt-pkg/rpmindexfile.h>
 #include <apt-pkg/rpmsrcrecords.h>
 #include <apt-pkg/rpmlistparser.h>
@@ -538,11 +540,7 @@ string rpmRepomdIndex::ArchiveURI(string File) const
 {
    string Res;
 
-   //cout << Dist << File << endl;
-
    Res += URI + '/' + Dist + '/' + File;
-   //cout << "repomd archiveuri " << " " << Res << endl;
-
    return Res;
 }
 
@@ -585,17 +583,19 @@ pkgCache::PkgFileIterator rpmRepomdIndex::FindInCache(pkgCache &Cache) const
 }
 string rpmRepomdIndex::ReleaseURI(string Type) const
 {
-   string Res;
-   Res = URI + Dist + "/repodata/" + "repomd.xml";
-
-   //cout << "XXXXX repomd releaseuri " << Res << endl;
-   
+   string Res = URI + Dist;
+   assert( Res.size() > 0 );
+   if ( Res[Res.size() - 1] != '/' )
+     Res += '/';
+   Res += "repodata/";
+   Res += "repomd.xml";
    return Res;
 }
 
 string rpmRepomdIndex::ReleaseInfo(string Type) const
 {
    string Info = ::URI::SiteOnly(URI) + ' ';
+   assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] == '/')
    {
       if (Dist != "/")
@@ -605,13 +605,13 @@ string rpmRepomdIndex::ReleaseInfo(string Type) const
       Info += Dist;   
    Info += " ";
    Info += Type;
-   //cout << "repomd releaseinfo " << Info << endl;
    return Info;
 };
 
 string rpmRepomdIndex::Info(string Type) const 
 {
    string Info = ::URI::SiteOnly(URI) + ' ';
+   assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] == '/')
    {
       if (Dist != "/")
@@ -621,13 +621,13 @@ string rpmRepomdIndex::Info(string Type) const
       Info += Dist + '/' ;   
    Info += " ";
    Info += Type;
-   //cout << "repomd info " << Info << endl;
    return Info;
 }
 
 string rpmRepomdIndex::IndexURI(string Type) const
 {
    string Res = URI + Dist;
+   assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] != '/') {
         Res += "/";
    }
@@ -692,18 +692,31 @@ string rpmRepomdIndex::ReleasePath() const
    return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("release.xml"));
 }
 
+// This gets called several times per each index during cache generation,
+// only for progress percentage reporting. A rough estimate would do just
+// fine but using xmlReader appears to be cheap enough. OTOH creating a new 
+// handler like is done for rpmPkgDirIndex is hideously expensive.
 unsigned long rpmRepomdIndex::Size() const
 {
-   // ugh.. all this just to get the package count ;(
-   RPMHandler *Handler = CreateHandler();
-   unsigned long Res = Handler->Size();
-   delete Handler;
+   xmlTextReaderPtr Index;
+   unsigned long Res;
+   Index = xmlReaderForFile(IndexPath().c_str(), NULL,
+                         XML_PARSE_NONET|XML_PARSE_NOBLANKS);
+   if (Index == NULL) return 0;
+
+   if (xmlTextReaderRead(Index) == 1) {
+      xmlChar *pkgs = xmlTextReaderGetAttribute(Index, (xmlChar*)"packages");
+      Res = atoi((char*)pkgs);
+      xmlFree(pkgs);
+   } else {
+      Res = 0;
+   }
+   xmlFreeTextReader(Index);
    return Res;
 }
 
 bool rpmRepomdIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
 {
-   //cout << "repomd MERGE" << endl;
    string PackageFile = IndexPath();
    RPMHandler *Handler = CreateHandler();
 
@@ -717,7 +730,6 @@ bool rpmRepomdIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
 
    // Store the IMS information
    pkgCache::PkgFileIterator File = Gen.GetCurFile();
-   //cout << "merge pkgfile " << PackageFile << endl;
    struct stat St;
    if (stat(PackageFile.c_str(),&St) != 0) 
    {