- try to deduct srpm package name from srpm filename (Ralf Corsepius)
authorpmatilai <pmatilai>
Mon, 24 Apr 2006 14:10:47 +0000 (14:10 +0000)
committerpmatilai <pmatilai>
Mon, 24 Apr 2006 14:10:47 +0000 (14:10 +0000)
apt-pkg/rpm/rpmhandler.cc
apt-pkg/rpm/rpmhandler.h
apt-pkg/rpm/rpmrecords.cc

index 6224590..f2337dc 100644 (file)
@@ -1107,6 +1107,12 @@ unsigned long RPMRepomdHandler::InstalledSize()
    return size;
 }
 
+string RPMRepomdHandler::SourceRpm()
+{
+   xmlNode *n = FindNode("format");
+   return FindTag(n, "sourcerpm");
+}
+
 bool RPMRepomdHandler::HasFile(const char *File)
 {
    if (*File == '\0')
index 5173eca..fe75222 100644 (file)
@@ -93,6 +93,7 @@ class RPMHandler
    virtual string Summary() {return GetSTag(RPMTAG_SUMMARY);};
    virtual string Description() {return GetSTag(RPMTAG_DESCRIPTION);};
    virtual unsigned long InstalledSize() {return GetITag(RPMTAG_SIZE);};
+   virtual string SourceRpm() {return GetSTag(RPMTAG_SOURCERPM);};
 
    bool InternalDep(const char *name, const char *ver, int_32 flag);
    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
@@ -263,6 +264,7 @@ class RPMRepomdHandler : public RPMHandler
    virtual string Vendor();
    virtual string Summary() {return FindTag(NodeP, "summary");};
    virtual string Description() {return FindTag(NodeP, "description");};
+   virtual string SourceRpm();
 
    virtual bool HasFile(const char *File);
    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
index ef13648..4fb0f5f 100644 (file)
@@ -133,7 +133,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 < 0 )
+     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);
 }
                                                                        /*}}}*/