}
+//
+// 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() ) {
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;
}
#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;
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;
///////////////////////////////////////////////////////////////////
//
//
+ // 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
//