- combine depends and provides handling into one PRCO() method in rpmhandler,
[apt.git] / apt-pkg / rpm / rpmrecords.cc
index ef13648..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);
 }
                                                                        /*}}}*/
 
@@ -249,7 +269,7 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
    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;
@@ -275,7 +295,7 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
       BufCatDep(*I);
    }
       
-   Handler->Depends(pkgCache::Dep::Conflicts, Conflicts);
+   Handler->PRCO(pkgCache::Dep::Conflicts, Conflicts);
    start = true;
    for (I = Conflicts.begin(); I != Conflicts.end(); I++) {
       if (start) {
@@ -287,7 +307,7 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
       BufCatDep(*I);
    }
 
-   Handler->Provides(Provides);
+   Handler->PRCO(pkgCache::Dep::Provides, Provides);
    start = true;
    for (I = Provides.begin(); I != Provides.end(); I++) {
       if (start) {
@@ -299,7 +319,7 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
       BufCatDep(*I);
    }
 
-   Handler->Depends(pkgCache::Dep::Obsoletes, Obsoletes);
+   Handler->PRCO(pkgCache::Dep::Obsoletes, Obsoletes);
    start = true;
    for (I = Obsoletes.begin(); I != Obsoletes.end(); I++) {
       if (start) {