- combine depends and provides handling into one PRCO() method in rpmhandler,
[apt.git] / apt-pkg / rpm / rpmrecords.cc
index 774a293..1c7cbd6 100644 (file)
@@ -1,4 +1,4 @@
-// -*- mode: cpp; mode: fold -*-
+// -*- mode: c++; mode: fold -*-
 // Description                                                         /*{{{*/
 /* ######################################################################
    
@@ -43,8 +43,10 @@ rpmRecordParser::rpmRecordParser(string File, pkgCache &Cache)
         Handler = new RPMDirHandler(File);
       else if (flExtension(File) == "rpm")
         Handler = new RPMSingleFileHandler(File);
+#ifdef WITH_REPOMD
       else if (flExtension(File) == "xml")
         Handler = new RPMRepomdHandler(File);
+#endif
       else
         Handler = new RPMFileHandler(File);
    }
@@ -133,7 +135,25 @@ string rpmRecordParser::SourcePkg()
 {
    // This must be the *package* name, not the *file* name. We have no
    // current way to extract it safely from the file name.
-   return "";
+
+// A wild guess, hopefully covering most cases:
+// Check for string "-$(version)-$(release)." in string srpm
+   string srpm = Handler->SourceRpm();
+   string versarch = "-" + Handler->Version() + "-" + Handler->Release() + ".";
+   string::size_type idx1 = srpm.find(versarch);
+
+// not found
+   if ( idx1 == string::npos )
+     return "";
+
+// check if the first dot in "srpm" is the dot at the end of versarch
+   string::size_type idx2 = srpm.find('.');
+
+   if ( idx2 < idx1 )
+// no, the packager is playing dirty tricks with srpm names
+     return "";
+
+   return srpm.substr(0,idx1);
 }
                                                                        /*}}}*/
 
@@ -226,11 +246,6 @@ void rpmRecordParser::BufCatDescr(const char *descr)
 void rpmRecordParser::GetRec(const char *&Start,const char *&Stop) 
 {
    // FIXME: This method is leaking memory from headerGetEntry().
-   int type, type2, type3, count;
-   char *str;
-   char **strv;
-   char **strv2;
-   int_32 *numv;
    char buf[32];
 
    BufUsed = 0;
@@ -239,7 +254,7 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
 
    BufCatTag("\nSection: ", Handler->Group().c_str());
 
-   snprintf(buf, sizeof(buf), "%d", Handler->InstalledSize());
+   snprintf(buf, sizeof(buf), "%lu", Handler->InstalledSize());
    BufCatTag("\nInstalled Size: ", buf);
 
    BufCatTag("\nPackager: ", Handler->Packager().c_str());
@@ -247,24 +262,14 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
    
    BufCat("\nVersion: ");
    
-   string e, v, r, verstr;
-   e = Handler->Epoch();
-   v = Handler->Version();
-   r = Handler->Release();
-   
-   if (e.empty() == false)
-      verstr = e + ":" + v + "-" + r;
-   else
-      verstr = v + "-" + r;
-      
-   BufCat(verstr.c_str());
+   BufCat(Handler->EVR().c_str());
 
 
    vector<Dependency*> Deps, Provides, Obsoletes, Conflicts;
    vector<Dependency*>::iterator I;
    bool start = true;
 
-   Handler->Depends(pkgCache::Dep::Depends, Deps);
+   Handler->PRCO(pkgCache::Dep::Depends, Deps);
    for (I = Deps.begin(); I != Deps.end(); I++) {
       if ((*I)->Type != pkgCache::Dep::PreDepends)
         continue;
@@ -290,42 +295,45 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
       BufCatDep(*I);
    }
       
-   Handler->Depends(pkgCache::Dep::Conflicts, Conflicts);
-   I = Conflicts.begin();
-   if (I != Conflicts.end()) {
-      BufCat("\nConflicts: ");
-      BufCatDep(*I);
-   }
-   for (; I != Conflicts.end(); I++) {
-      BufCat(", ");
+   Handler->PRCO(pkgCache::Dep::Conflicts, Conflicts);
+   start = true;
+   for (I = Conflicts.begin(); I != Conflicts.end(); I++) {
+      if (start) {
+        BufCat("\nConflicts: ");
+        start = false;
+      } else {
+        BufCat(", ");
+      }
       BufCatDep(*I);
    }
 
-   Handler->Provides(Provides);
-   I = Provides.begin();
-   if (I != Provides.end()) {
-      BufCat("\nProvides: ");
-      BufCatDep(*I);
-   }
-   for (; I != Provides.end(); I++) {
-      BufCat(", ");
+   Handler->PRCO(pkgCache::Dep::Provides, Provides);
+   start = true;
+   for (I = Provides.begin(); I != Provides.end(); I++) {
+      if (start) {
+        BufCat("\nProvides: ");
+        start = false;
+      } else {
+        BufCat(", ");
+      }
       BufCatDep(*I);
    }
 
-   Handler->Depends(pkgCache::Dep::Obsoletes, Obsoletes);
-   I = Obsoletes.begin();
-   if (I != Obsoletes.end()) {
-      BufCat("\nObsoletes: ");
-      BufCatDep(*I);
-   }
-   for (; I != Obsoletes.end(); I++) {
-      BufCat(", ");
+   Handler->PRCO(pkgCache::Dep::Obsoletes, Obsoletes);
+   start = true;
+   for (I = Obsoletes.begin(); I != Obsoletes.end(); I++) {
+      if (start) {
+        BufCat("\nObsoletes: ");
+        start = false;
+      } else {
+        BufCat(", ");
+      }
       BufCatDep(*I);
    }
 
    BufCatTag("\nArchitecture: ", Handler->Arch().c_str());
    
-   snprintf(buf, sizeof(buf), "%d", Handler->FileSize());
+   snprintf(buf, sizeof(buf), "%lu", Handler->FileSize());
    BufCatTag("\nSize: ", buf);
 
    BufCatTag("\nMD5Sum: ", Handler->MD5Sum().c_str());