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 patchesBegin() { return poolProxyBegin<Patch>(); }
48 static inline PoolProxyIterator patchesEnd() { return poolProxyEnd<Patch>(); }
50 template<typename T> bool contains( const std::set<T> & container, T search )
52 return container.find( search ) != container.end();
57 static void addDirectlySelectedPackages ( set<string> & pkgNames );
58 template<class PkgSet_T> void addPkgSetPackages( set<string> & pkgNames );
60 static void addPatchPackages ( set<string> & pkgNames );
64 set<string> userWantedPackageNames()
68 DBG << "Collecting packages the user explicitly asked for" << endl;
70 addDirectlySelectedPackages ( pkgNames );
71 addPatchPackages ( pkgNames );
78 static void addDirectlySelectedPackages( set<string> & pkgNames )
80 for ( PoolProxyIterator it = pkgBegin();
84 // Add all packages the user wanted to transact directly,
85 // no matter what the transaction is (install, update, delete)
87 if ( (*it)->toModify() && (*it)->modifiedBy() == ResStatus::USER )
89 DBG << "Explicit user transaction on pkg \"" << (*it)->name() << "\"" << endl;
91 pkgNames.insert( (*it)->name() );
97 static void addPatchPackages( set<string> & pkgNames )
99 for ( PoolProxyIterator patch_it = patchesBegin();
100 patch_it != patchesEnd();
103 Patch::constPtr patch = dynamic_pointer_cast<const Patch>( (*patch_it)->theObj() ? (*patch_it)->theObj().resolvable() : 0 );
105 if ( patch && (*patch_it)->toModify() )
107 DBG << "Patch will be transacted: \"" << patch->name()
108 << "\" - \"" << patch->summary() << "\"" << endl;
110 Patch::Contents contents( patch->contents() );
111 for_( it, contents.begin(), contents.end() )
113 pkgNames.insert( it->name() );