1
/*---------------------------------------------------------------------\
3
| |__ / \ / / . \ . \ |
8
\---------------------------------------------------------------------*/
10
* \file zypp/ui/UserWantedPackages.cc
12
* \author Stefan Hundhammer <sh@suse.de>
16
#include "zypp/base/Logger.h"
18
#include "zypp/ui/UserWantedPackages.h"
20
#include "zypp/base/PtrTypes.h"
21
#include "zypp/ui/Selectable.h"
23
#include "zypp/ResObjects.h"
24
#include "zypp/ZYppFactory.h"
25
#include "zypp/ResPoolProxy.h"
37
typedef ResPoolProxy::const_iterator PoolProxyIterator;
39
static inline ResPoolProxy poolProxy() { return getZYpp()->poolProxy(); }
41
template<class T> PoolProxyIterator poolProxyBegin() { return poolProxy().byKindBegin<T>(); }
42
template<class T> PoolProxyIterator poolProxyEnd() { return poolProxy().byKindEnd<T>(); }
44
static inline PoolProxyIterator pkgBegin() { return poolProxyBegin<Package>(); }
45
static inline PoolProxyIterator pkgEnd() { return poolProxyEnd<Package>(); }
47
// static inline PoolProxyIterator langBegin() { return poolProxyBegin<Language>(); }
48
// static inline PoolProxyIterator langEnd() { return poolProxyEnd<Language>(); }
50
static inline PoolProxyIterator patchesBegin() { return poolProxyBegin<Patch>(); }
51
static inline PoolProxyIterator patchesEnd() { return poolProxyEnd<Patch>(); }
53
template<typename T> bool contains( const std::set<T> & container, T search )
55
return container.find( search ) != container.end();
60
static void addDirectlySelectedPackages ( set<string> & pkgNames );
61
template<class PkgSet_T> void addPkgSetPackages( set<string> & pkgNames );
63
static void addPatternPackages ( set<string> & pkgNames );
64
static void addPatchPackages ( set<string> & pkgNames );
68
set<string> userWantedPackageNames()
72
DBG << "Collecting packages the user explicitly asked for" << endl;
74
addDirectlySelectedPackages ( pkgNames );
75
addPatternPackages ( pkgNames );
76
addPatchPackages ( pkgNames );
83
static void addDirectlySelectedPackages( set<string> & pkgNames )
85
for ( PoolProxyIterator it = pkgBegin();
89
// Add all packages the user wanted to transact directly,
90
// no matter what the transaction is (install, update, delete)
92
if ( (*it)->toModify() && (*it)->modifiedBy() == ResStatus::USER )
94
DBG << "Explicit user transaction on pkg \"" << (*it)->name() << "\"" << endl;
96
pkgNames.insert( (*it)->name() );
103
static void addPatternPackages( set<string> & pkgNames )
105
addPkgSetPackages<Pattern>( pkgNames );
110
* Template to handle Patterns
112
template<class PkgSet_T> void addPkgSetPackages( set<string> & pkgNames )
114
for ( PoolProxyIterator it = poolProxyBegin<PkgSet_T>();
115
it != poolProxyEnd<PkgSet_T>();
118
// Take all pkg sets (patterns) into account that
119
// will be transacted, no matter if the user explicitly asked
120
// for that pkg set or if the patterns is required by another
121
// pkg set of the same class
123
typename PkgSet_T::constPtr pkgSet = dynamic_pointer_cast<const PkgSet_T>( (*it)->theObj() ? (*it)->theObj().resolvable() : 0L );
125
if ( pkgSet && (*it)->toModify() )
127
DBG << (*it)->theObj()->kind().asString()
128
<< " will be transacted: \"" << pkgSet->name() << "\"" << endl;
131
set<string> setPkgs;// = pkgSet->install_packages();
132
pkgNames.insert( setPkgs.begin(), setPkgs.end() );
138
static void addPatchPackages( set<string> & pkgNames )
140
for ( PoolProxyIterator patch_it = patchesBegin();
141
patch_it != patchesEnd();
144
Patch::constPtr patch = dynamic_pointer_cast<const Patch>( (*patch_it)->theObj() ? (*patch_it)->theObj().resolvable() : 0 );
146
if ( patch && (*patch_it)->toModify() )
148
DBG << "Patch will be transacted: \"" << patch->name()
149
<< "\" - \"" << patch->summary() << "\"" << endl;
151
Patch::Contents contents( patch->contents() );
152
for_( it, contents.begin(), contents.end() )
154
pkgNames.insert( it->name() );