- add tag_enhances() and tag_supplements()
authorKlaus Kaempf <kkaempf@suse.de>
Mon, 27 Feb 2006 09:28:17 +0000 (09:28 +0000)
committerKlaus Kaempf <kkaempf@suse.de>
Mon, 27 Feb 2006 09:28:17 +0000 (09:28 +0000)
- create package from RpmHeader as standalone function

zypp/target/rpm/RpmDb.cc
zypp/target/rpm/RpmDb.h
zypp/target/rpm/RpmHeader.cc
zypp/target/rpm/RpmHeader.h
zypp/target/rpm/RpmPackageImpl.cc
zypp/target/rpm/RpmPackageImpl.h

index 7d5b0c4..c6ec3aa 100644 (file)
@@ -995,6 +995,99 @@ const std::list<Package::Ptr> & RpmDb::getPackages()
 }
 
 
+//
+// make Package::Ptr from RpmHeader
+// return NULL on error
+//
+
+Package::Ptr RpmDb::makePackageFromHeader( const RpmHeader::constPtr header, std::set<std::string> * filerequires )
+{
+    Package::Ptr pptr;
+
+    string name = header->tag_name();
+
+    // create dataprovider
+    detail::ResImplTraits<RPMPackageImpl>::Ptr impl( new RPMPackageImpl( header ) );
+
+    Edition edition;
+    Arch arch;
+
+    try {
+       edition = Edition( header->tag_version(),
+                          header->tag_release(),
+                          header->tag_epoch());
+    }
+    catch (Exception & excpt_r) {
+       ZYPP_CAUGHT( excpt_r );
+       WAR << "Package " << name << " has bad edition '"
+           << (header->tag_epoch().empty()?"":(header->tag_epoch()+":"))
+           << header->tag_version()
+           << (header->tag_release().empty()?"":(string("-") + header->tag_release())) << "'";
+       return pptr;
+    }
+
+    try {
+       arch = Arch( header->tag_arch() );
+    }
+    catch (Exception & excpt_r) {
+       ZYPP_CAUGHT( excpt_r );
+       WAR << "Package " << name << " has bad architecture '" << header->tag_arch() << "'";
+       return pptr;
+    }
+
+    // Collect basic Resolvable data
+    NVRAD dataCollect( header->tag_name(),
+                      edition,
+                      arch );
+
+    list<string> filenames = impl->filenames();
+    dataCollect[Dep::PROVIDES] = header->tag_provides ( filerequires );
+    CapFactory capfactory;
+    for (list<string>::const_iterator filename = filenames.begin();
+        filename != filenames.end();
+        filename++)
+    {
+      if (filename->find("/bin/") != string::npos
+       || filename->find("/sbin/") != string::npos
+       || filename->find("/lib/") != string::npos
+       || filename->find("/lib64/") != string::npos
+       || filename->find("/etc/") != string::npos
+       || filename->find("/usr/games/") != string::npos
+       || filename->find("/usr/share/dict/words") != string::npos
+       || filename->find("/usr/share/magic.mime") != string::npos
+       || filename->find("/opt/gnome/games") != string::npos)
+      {
+       try {
+         dataCollect[Dep::PROVIDES].insert( capfactory.parse(ResTraits<Package>::kind, *filename) );
+       }
+       catch (Exception & excpt_r)
+       {
+         ZYPP_CAUGHT( excpt_r );
+         WAR << "Ignoring invalid capability: " << *filename << endl;
+       }
+      }
+    }
+
+    dataCollect[Dep::REQUIRES]    = header->tag_requires( filerequires );
+    dataCollect[Dep::PREREQUIRES] = header->tag_prerequires( filerequires );
+    dataCollect[Dep::CONFLICTS]   = header->tag_conflicts( filerequires );
+    dataCollect[Dep::OBSOLETES]   = header->tag_obsoletes( filerequires );
+    dataCollect[Dep::ENHANCES]    = header->tag_enhances( filerequires );
+    dataCollect[Dep::SUPPLEMENTS] = header->tag_supplements( filerequires );
+
+    try {
+       // create package from dataprovider
+       pptr = detail::makeResolvableFromImpl( dataCollect, impl );
+    }
+    catch (Exception & excpt_r) {
+       ZYPP_CAUGHT( excpt_r );
+       ERR << "Can't create Package::Ptr" << endl;
+    }
+
+    return pptr;
+}
+
+
 const std::list<Package::Ptr> & RpmDb::doGetPackages(callback::SendReport<ScanDBReport> & report)
 {
   if ( packagesValid() ) {
@@ -1040,7 +1133,7 @@ const std::list<Package::Ptr> & RpmDb::doGetPackages(callback::SendReport<ScanDB
     Date installtime = iter->tag_installtime();
 #if 0
 This prevented from having packages multiple times
-    Package::Ptr & nptr = _packages._index[name]; // be shure to get a reference!
+    Package::Ptr & nptr = _packages._index[name]; // be sure to get a reference!
 
     if ( nptr ) {
       WAR << "Multiple entries for package '" << name << "' in rpmdb" << endl;
@@ -1050,75 +1143,9 @@ This prevented from having packages multiple times
     }
 #endif
 
-    // create dataprovider
-    detail::ResImplTraits<RPMPackageImpl>::Ptr impl(new RPMPackageImpl(*iter));
-
-    Edition edition;
-    Arch arch;
-
-    try {
-       edition = Edition( iter->tag_version(),
-                          iter->tag_release(),
-                          iter->tag_epoch());
-    }
-    catch (Exception & excpt_r) {
-       ZYPP_CAUGHT(excpt_r);
-       WAR << "Package " << name << " has bad edition '"
-           << (iter->tag_epoch().empty()?"":(iter->tag_epoch()+":"))
-           << iter->tag_version()
-           << (iter->tag_release().empty()?"":(string("-") + iter->tag_release())) << "'";
-       continue;
-    }
-
-    try {
-       arch = Arch (iter->tag_arch());
-    }
-    catch (Exception & excpt_r) {
-       ZYPP_CAUGHT(excpt_r);
-       WAR << "Package " << name << " has bad architecture '" << iter->tag_arch() << "'";
-       continue;
-    }
-
-    // Collect basic Resolvable data
-    NVRAD dataCollect( iter->tag_name(),
-                      edition,
-                      arch );
-
-    list<string> filenames = impl->filenames();
-    dataCollect[Dep::PROVIDES] = iter->tag_provides ( & _filerequires );
-    for (list<string>::const_iterator filename = filenames.begin();
-        filename != filenames.end();
-        filename++)
-    {
-      if (filename->find("/bin/") != string::npos
-       || filename->find("/sbin/") != string::npos
-       || filename->find("/lib/") != string::npos
-       || filename->find("/lib64/") != string::npos
-       || filename->find("/etc/") != string::npos
-       || filename->find("/usr/games/") != string::npos
-       || filename->find("/usr/share/dict/words") != string::npos
-       || filename->find("/usr/share/magic.mime") != string::npos
-       || filename->find("/opt/gnome/games") != string::npos)
-      {
-       try {
-         dataCollect[Dep::PROVIDES].insert(_f.parse(ResTraits<Package>::kind, *filename));
-       }
-       catch (Exception & excpt_r)
-       {
-         ZYPP_CAUGHT(excpt_r);
-         WAR << "Invalid capability: " << *filename << endl;
-       }
-      }
-    }
-
-    dataCollect[Dep::REQUIRES]    = iter->tag_requires ( &_filerequires );
-    dataCollect[Dep::PREREQUIRES] = iter->tag_prerequires ( &_filerequires );
-    dataCollect[Dep::CONFLICTS]   = iter->tag_conflicts( &_filerequires );
-    dataCollect[Dep::OBSOLETES]   = iter->tag_obsoletes( &_filerequires );
+    Package::Ptr pptr = makePackageFromHeader( *iter, &_filerequires );
 
-    // create package from dataprovider
-    Package::Ptr nptr = detail::makeResolvableFromImpl( dataCollect, impl );
-    _packages._list.push_back(nptr);
+    _packages._list.push_back( pptr );
   }
   _packages.buildIndex();
   DBG << "Found installed packages: " << _packages._list.size() << endl;
index 14191b7..5ac9c0f 100644 (file)
@@ -319,6 +319,14 @@ namespace zypp {
          void getData( const std::string & name_r, const Edition & ed_r,
                     RpmHeader::constPtr & result_r ) const;
       
+
+         /**
+          * Create a package from RpmHeader
+          * return NULL on error
+          **/
+
+         static Package::Ptr makePackageFromHeader( const RpmHeader::constPtr header, std::set<std::string> * filerequires = NULL );
+
          ///////////////////////////////////////////////////////////////////
          //
          ///////////////////////////////////////////////////////////////////
index be5372d..bde4029 100644 (file)
@@ -291,6 +291,17 @@ namespace zypp {
           kindFlags   = RPMTAG_CONFLICTFLAGS;
           kindVersion = RPMTAG_CONFLICTVERSION;
           break;
+        case RPMTAG_ENHANCESNAME:
+          kindFlags   = RPMTAG_ENHANCESFLAGS;
+          kindVersion = RPMTAG_ENHANCESVERSION;
+          break;
+#warning NEEDS RPMTAG_SUPPLEMENTSNAME
+#if 0
+        case RPMTAG_SUPPLEMENTSNAME:
+          kindFlags   = RPMTAG_SUPPLEMENTSFLAGS;
+          kindVersion = RPMTAG_SUPPLEMENTSVERSION;
+          break;
+#endif
         default:
           INT << "Illegal RPMTAG_dependencyNAME " << tag_r << endl;
          return ret;
@@ -434,6 +445,36 @@ namespace zypp {
       ///////////////////////////////////////////////////////////////////
       //
       //
+      //        METHOD NAME : RpmHeader::tag_enhances
+      //        METHOD TYPE : CapSet
+      //
+      //        DESCRIPTION :
+      //
+      CapSet RpmHeader::tag_enhances( set<string> * freq_r ) const
+      {
+        return PkgRelList_val( RPMTAG_ENHANCESNAME, false, freq_r );
+      }
+      
+      ///////////////////////////////////////////////////////////////////
+      //
+      //
+      //        METHOD NAME : RpmHeader::tag_supplements
+      //        METHOD TYPE : CapSet
+      //
+      //        DESCRIPTION :
+      //
+      CapSet RpmHeader::tag_supplements( set<string> * freq_r ) const
+      {
+       return CapSet();
+#warning NEEDS RPMTAG_SUPPLEMENTSNAME
+#if 0
+        return PkgRelList_val( RPMTAG_SUPPLEMENTSNAME, false, freq_r );
+#endif
+      }
+      
+      ///////////////////////////////////////////////////////////////////
+      //
+      //
       //        METHOD NAME : RpmHeader::tag_size
       //        METHOD TYPE : ByteCount
       //
index cf77e69..685f55b 100644 (file)
@@ -118,6 +118,14 @@ namespace zypp {
           * @see #tag_provides
           **/
          CapSet tag_obsoletes( std::set<std::string> * freq_r = 0 ) const;
+         /**
+          * @see #tag_provides
+          **/
+         CapSet tag_enhances( std::set<std::string> * freq_r = 0 ) const;
+         /**
+          * @see #tag_provides
+          **/
+         CapSet tag_supplements( std::set<std::string> * freq_r = 0 ) const;
 
          ByteCount tag_size()        const;
          ByteCount tag_archivesize() const;
index 9641d80..72bf2c6 100644 (file)
@@ -130,6 +130,10 @@ namespace zypp
       Changelog RPMPackageImpl::changelog() const
       { return _changelog; }
 
+      /** */
+      Pathname RPMPackageImpl::location() const
+      { return _location; }
+
       /** Don't ship it as class Url, because it might be
        * in fact anything but a legal Url. */
       std::string RPMPackageImpl::url() const
index 7b522af..9b5948c 100644 (file)
@@ -68,6 +68,8 @@ namespace zypp
        virtual PackageGroup group() const;
        /** */
        virtual Changelog changelog() const;
+       /** */
+       virtual Pathname location() const;
        /** Don't ship it as class Url, because it might be
         * in fact anything but a legal Url. */
        virtual std::string url() const;
@@ -98,6 +100,9 @@ namespace zypp
         /** */
         virtual DiskUsage diskUsage() const;
 
+       /** for 'local' RPMs  */
+       void setLocation (const Pathname & pathname) { _location = pathname; }
+
       protected:
        TranslatedText _summary;
        TranslatedText _description;
@@ -109,6 +114,7 @@ namespace zypp
        std::string _packager;
        PackageGroup _group;
        Changelog _changelog;
+       Pathname _location;                     // for 'local' rpms
        std::string _type;
        License _license_to_confirm;
        std::list<std::string> _authors;