libzypp 9.41.1
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 00005 | / /__ | | | | | | | 00006 | /_____||_| |_| |_| | 00007 | | 00008 \---------------------------------------------------------------------*/ 00012 #include <iostream> 00013 00014 #include "zypp/base/LogTools.h" 00015 #include "zypp/base/Tr1hash.h" 00016 #include "zypp/sat/WhatObsoletes.h" 00017 #include "zypp/sat/detail/PoolImpl.h" 00018 #include "zypp/PoolItem.h" 00019 00020 using std::endl; 00021 00023 namespace zypp 00024 { 00025 00026 namespace sat 00027 { 00028 00029 // Obsoletes may either match against provides, or names. 00030 // Configuration depends on the behaviour of rpm. 00031 #ifdef _RPM_5 00032 bool obsoleteUsesProvides = true; 00033 #else 00034 bool obsoleteUsesProvides = false; 00035 #endif 00036 00038 namespace 00039 { 00040 00041 typedef std::tr1::unordered_set<detail::IdType> set_type; 00042 typedef std::vector<sat::detail::IdType> vector_type; 00043 00045 } // namespace 00047 00048 WhatObsoletes::WhatObsoletes( Solvable item_r ) 00049 : _begin( 0 ) 00050 { 00051 ctorAdd( item_r ); 00052 ctorDone(); 00053 } 00054 00055 WhatObsoletes::WhatObsoletes( const PoolItem & item_r ) 00056 : _begin( 0 ) 00057 { 00058 ctorAdd( item_r ); 00059 ctorDone(); 00060 } 00061 00062 WhatObsoletes::WhatObsoletes( const ResObject::constPtr item_r ) 00063 : _begin( 0 ) 00064 { 00065 if ( item_r ) 00066 { 00067 ctorAdd( item_r->satSolvable() ); 00068 ctorDone(); 00069 } 00070 } 00071 00072 void WhatObsoletes::ctorAdd( const PoolItem & item_r ) 00073 { ctorAdd( item_r->satSolvable() ); } 00074 00075 void WhatObsoletes::ctorAdd( ResObject_constPtr item_r ) 00076 { if ( item_r ) ctorAdd( item_r->satSolvable() ); } 00077 00078 00079 namespace 00080 { 00082 inline void addToSet( Solvable item, set_type *& pdata, shared_ptr<void>& _private ) 00083 { 00084 if ( ! pdata ) 00085 { 00086 _private.reset( (pdata = new set_type) ); 00087 } 00088 pdata->insert( item.id() ); 00089 } 00090 } 00091 00092 void WhatObsoletes::ctorAdd( Solvable item_r ) 00093 { 00094 if ( item_r.multiversionInstall() ) 00095 return; // multiversion (rpm -i) does not evaluate any obsoletes 00096 00097 if ( obsoleteUsesProvides ) 00098 { 00099 WhatProvides obsoleted( item_r.obsoletes() ); 00100 if ( obsoleted.empty() ) 00101 return; 00102 00103 // use allocated private data to collect the results 00104 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 ); 00105 for_( it, obsoleted.begin(), obsoleted.end() ) 00106 { 00107 if ( it->isSystem() ) 00108 addToSet( *it, pdata, _private ); 00109 } 00110 } 00111 else // Obsoletes match names 00112 { 00113 Capabilities obsoletes( item_r.obsoletes() ); 00114 if ( obsoletes.empty() ) 00115 return; 00116 00117 // use allocated private data to collect the results 00118 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 ); 00119 for_( it, obsoletes.begin(), obsoletes.end() ) 00120 { 00121 // For each obsoletes find providers, but with the same name 00122 IdString ident( it->detail().name() ); 00123 WhatProvides obsoleted( *it ); 00124 for_( iit, obsoleted.begin(), obsoleted.end() ) 00125 { 00126 if ( iit->isSystem() && iit->ident() == ident ) 00127 addToSet( *iit, pdata, _private ); 00128 } 00129 } 00130 } 00131 } 00132 00133 void WhatObsoletes::ctorDone() 00134 { 00135 if ( _private ) 00136 { 00137 // copy set to vector and terminate _private 00138 set_type * sdata = reinterpret_cast<set_type*>( _private.get() ); 00139 00140 vector_type * pdata = new vector_type( sdata->begin(), sdata->end() ); 00141 pdata->push_back( sat::detail::noId ); 00142 _begin = &pdata->front(); 00143 00144 _private.reset( pdata ); 00145 } 00146 } 00147 00148 WhatObsoletes::size_type WhatObsoletes::size() const 00149 { 00150 if ( ! _begin ) 00151 return 0; 00152 00153 Capabilities::size_type ret = 0; 00154 for ( const sat::detail::IdType * end = _begin; *end; ++end ) 00155 { 00156 ++ret; 00157 } 00158 return ret; 00159 } 00160 00161 /****************************************************************** 00162 ** 00163 ** FUNCTION NAME : operator<< 00164 ** FUNCTION TYPE : std::ostream & 00165 */ 00166 std::ostream & operator<<( std::ostream & str, const WhatObsoletes & obj ) 00167 { 00168 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() ); 00169 } 00170 00172 } // namespace sat 00175 } // namespace zypp