X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=zypp%2FPattern.cc;h=fb0049f41c4132b444e59acc101f8cd25e2d598b;hb=42b5d038414cf4a4a050e816b471f890b24e8032;hp=45562f086e428edcd1e9fa44aad5fcc720343ab2;hpb=b61a0ff7e76a542a874714e4ee7753db48f9f8aa;p=platform%2Fupstream%2Flibzypp.git diff --git a/zypp/Pattern.cc b/zypp/Pattern.cc index 45562f0..fb0049f 100644 --- a/zypp/Pattern.cc +++ b/zypp/Pattern.cc @@ -181,7 +181,13 @@ namespace zypp { return lookupBoolAttribute( sat::SolvAttr::isdefault ); } bool Pattern::userVisible() const - { return lookupBoolAttribute( sat::SolvAttr::isvisible ); } + { + // bsc#900769: If visibility is a string(solvable ident) the pattern + // is visible IFF ident is available in the pool. + IdString ident( lookupStrAttribute( sat::SolvAttr::isvisible ) ); + return( ident.empty() ? lookupBoolAttribute( sat::SolvAttr::isvisible ) + : ! ResPool::instance().byIdent( ident ).empty() ); + } std::string Pattern::category( const Locale & lang_r ) const { return lookupStrAttribute( sat::SolvAttr::category, lang_r ); } @@ -290,6 +296,117 @@ namespace zypp return result; } + /////////////////////////////////////////////////////////////////// + namespace + { + // Get packages referenced by depKeeper dependency. + inline void dependsSetDoCollect( sat::Solvable depKeeper_r, Dep dep_r, Pattern::Contents & set_r ) + { + CapabilitySet caps; + addCaps( caps, depKeeper_r, dep_r ); + sat::WhatProvides prv( caps ); + for ( ui::Selectable::Ptr sel : prv.selectable() ) + { + const PoolItem & pi( sel->theObj() ); + if ( pi.isKind() ) + set_r.insert( pi ); + } + } + + // Get packages referenced by depKeeper. + inline void dependsSet( sat::Solvable depKeeper_r, Pattern::ContentsSet & collect_r ) + { + dependsSetDoCollect( depKeeper_r, Dep::REQUIRES, collect_r.req ); + dependsSetDoCollect( depKeeper_r, Dep::RECOMMENDS, collect_r.rec ), + dependsSetDoCollect( depKeeper_r, Dep::SUGGESTS, collect_r.sug ); + } + + // Whether this is a patterns depkeeper. + inline bool isPatternsPackage( sat::Solvable depKeeper_r ) + { + static const Capability indicator( "pattern()" ); + return depKeeper_r.provides().matches( indicator ); + } + } // namespace + /////////////////////////////////////////////////////////////////// + void Pattern::contentsSet( ContentsSet & collect_r, bool recursively_r ) const + { + sat::Solvable depKeeper( autoPackage() ); // (my required) patterns-package + if ( ! depKeeper ) + return; + + // step 2 data + std::set recTodo; // recommended patterns-packages to process + std::set allDone; // patterns-packages already expanded + { + // step 1: Expand requirements, remember recommends.... + // step 1 data (scoped to step1) + std::set reqTodo; // required patterns-packages to process + + collect_r.req.insert( depKeeper );// collect the depKeeper + reqTodo.insert( depKeeper ); // and expand it... + + while ( ! reqTodo.empty() ) + { + // pop one patterns-package from todo + depKeeper = ( *reqTodo.begin() ); + reqTodo.erase( reqTodo.begin() ); + allDone.insert( depKeeper ); + + // collects stats + ContentsSet result; + dependsSet( depKeeper, result ); + + // evaluate result.... + for ( sat::Solvable solv : result.req ) // remember unprocessed required patterns-packages... + { + if ( collect_r.req.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + reqTodo.insert( solv ); + } + for ( sat::Solvable solv : result.rec ) // remember unprocessed recommended patterns-packages... + { + if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + recTodo.insert( solv ); + } + for ( sat::Solvable solv : result.sug ) // NOTE: We don't expand suggested patterns! + { + collect_r.sug.insert( solv ); + } + } + } + // step 2: All requirements are expanded, now check remaining recommends.... + while ( ! recTodo.empty() ) + { + // pop one patterns-package from todo + depKeeper = ( *recTodo.begin() ); + recTodo.erase( recTodo.begin() ); + if ( ! allDone.insert( depKeeper ).second ) + continue; // allready expanded (in requires) + + // collects stats + ContentsSet result; + dependsSet( depKeeper, result ); + + // evaluate result.... + for ( sat::Solvable solv : result.req ) // remember unprocessed required patterns-packages... + { + // NOTE: Requirements of recommended patterns count as 'recommended' + if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + recTodo.insert( solv ); + } + for ( sat::Solvable solv : result.rec ) // remember unprocessed recommended patterns-packages... + { + if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + recTodo.insert( solv ); + } + for ( sat::Solvable solv : result.sug ) // NOTE: We don't expand suggested patterns! + { + collect_r.sug.insert( solv ); + } + } + } + + ///////////////////////////////////////////////////////////////// } // namespace zypp ///////////////////////////////////////////////////////////////////