- combine depends and provides handling into one PRCO() method in rpmhandler,
[apt.git] / apt-pkg / rpm / rpmrecords.cc
index 49df2e1..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, false);
+        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);
 }
                                                                        /*}}}*/
 
@@ -242,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;
@@ -285,36 +295,39 @@ 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);
    }