3 #include <zypp/ResObjects.h>
4 #include <zypp/sat/WhatObsoletes.h>
7 static std::string appname( __FILE__ );
10 ///////////////////////////////////////////////////////////////////
13 #define HEADL SEC << "===> "
15 inline std::ostream & errmessage( const std::string & msg_r = std::string() )
18 if ( ! msg_r.empty() )
19 cerr << msg_r << endl;
23 int usage( const std::string & msg_r = std::string(), int exit_r = 100 )
25 if ( ! msg_r.empty() )
31 cerr << "Usage: " << appname << " TESTCASE" << endl;
32 cerr << " Load and process testcase." << endl;
36 ///////////////////////////////////////////////////////////////////
42 zypp::base::LogControl::TmpLineWriter shutUp;
43 rres = getZYpp()->resolver()->doUpgrade();
47 ERR << "upgrade " << rres << endl;
48 getZYpp()->resolver()->problems();
51 MIL << "upgrade " << rres << endl;
57 static unsigned run = 0;
58 USR << "Solve " << run++ << endl;
61 zypp::base::LogControl::TmpLineWriter shutUp;
62 rres = getZYpp()->resolver()->resolvePool();
66 ERR << "resolve " << rres << endl;
67 getZYpp()->resolver()->problems();
74 ///////////////////////////////////////////////////////////////////
80 typedef std::vector<std::string>::const_iterator const_iterator;
85 ArgList( const std::string & line_r )
86 { str::splitEscaped( line_r, std::back_inserter(_argv) ); }
88 const_iterator begin() const { const_iterator ret =_argv.begin(); for ( unsigned i = _carg; i; --i ) ++ret; return ret; }
89 const_iterator end() const { return _argv.end(); }
91 void clear() { _argv.clear(); _carg = 0; }
92 bool empty() const { return _argv.size() == _carg; }
93 unsigned size() const { return _argv.size() - _carg; }
95 std::string & operator[]( int idx ) { return _argv[_carg+idx]; }
96 const std::string & operator[]( int idx ) const { return _argv[_carg+idx]; }
98 std::string at( int idx ) const { return _carg+idx < _argv.size() ? _argv[_carg+idx] : std::string(); }
100 unsigned carg() const { return _carg; }
101 void poparg( int cnt = 1 ) { _carg = arange( _carg + cnt ); }
104 std::vector<std::string> & get() { return _argv; }
105 const std::vector<std::string> & get() const { return _argv; }
107 unsigned arange( int idx ) const { return idx < 0 ? 0 : std::min( unsigned(idx), _argv.size() ); }
109 DefaultIntegral<unsigned,0> _carg;
110 std::vector<std::string> _argv;
113 std::ostream & operator<<( std::ostream & str, const ArgList & obj )
115 for_( it, 0U, obj.get().size() )
117 str << ( it == obj.carg() ? " | " : " " ) << obj.get()[it];
122 ///////////////////////////////////////////////////////////////////
123 #define DELGATE(N,F) if ( argv.at(0) == #N ) { argv.poparg(); F( argv ); return; }
124 ///////////////////////////////////////////////////////////////////
126 void exitCmd( ArgList & argv )
128 HEADL << argv << endl;
129 INT << "===[END]============================================" << endl << endl;
130 zypp::base::LogControl::TmpLineWriter shutUp;
134 ///////////////////////////////////////////////////////////////////
136 void helpCmd( ArgList & argv )
138 HEADL << argv << endl;
139 OUT << "list repos - list repos in pool" << endl;
140 OUT << "list NAME... - list solvables named or providing NAME" << endl;
141 OUT << "help - this" << endl;
142 OUT << "exit - exit" << endl;
145 ///////////////////////////////////////////////////////////////////
147 void listReposCmd( ArgList & argv )
149 HEADL << "list repos" << endl;
151 sat::Pool satpool( test.satpool() );
152 for_( it, satpool.reposBegin(), satpool.reposEnd() )
158 void listIdent( IdString ident_r )
160 HEADL << "list " << ident_r << endl;
162 ui::Selectable::Ptr sel( ui::Selectable::get( ident_r ) );
166 << " I" << sel->installedSize()
167 << " A" << sel->availableSize()
168 << " " << sel->status()
170 for_( it, sel->installedBegin(), sel->installedEnd() )
172 OUT << "i " << *it << endl;
174 PoolItem cand( sel->candidateObj() );
175 for_( it, sel->availableBegin(), sel->availableEnd() )
177 OUT << (*it == cand ? "* " : " ") << *it << endl;
182 sat::WhatProvides q( (Capability( ident_r.id() )) );
184 for_( it, q.begin(), q.end() )
186 if ( it->ident() != ident_r )
190 OUT << "provided by:" << endl;
193 OUT << " " << PoolItem( *it ) << endl;
200 void listCmd( ArgList & argv )
202 DELGATE( repos, listReposCmd );
204 for_( it, argv.begin(), argv.end() )
206 listIdent( IdString(*it) );
210 ///////////////////////////////////////////////////////////////////
212 void gocmd( ArgList & argv )
220 switch ( argv[0][0] )
223 DELGATE( exit, exitCmd );
227 DELGATE( help, helpCmd );
231 DELGATE( list, listCmd );
234 // no command fall back to list
240 std::cin.tie( &std::cout );
244 std::cout << "Hallo : ";
245 str::splitEscaped( iostr::getline( std::cin ), std::back_inserter(argv.get()) );
251 ///////////////////////////////////////////////////////////////////
253 /******************************************************************
255 ** FUNCTION NAME : main
256 ** FUNCTION TYPE : int
258 int main( int argc, char * argv[] )
260 INT << "===[START]==========================================" << endl;
261 appname = Pathname::basename( argv[0] );
264 ///////////////////////////////////////////////////////////////////
269 Pathname mtest( *argv );
273 if ( ! PathInfo( mtest / "solver-test.xml" ).isFile() )
275 return usage( "No testcase at " + mtest.asString() );
278 ///////////////////////////////////////////////////////////////////
280 test.loadTestcaseRepos( mtest ); // <<< repos
281 #define GOCMD(c) { ArgList argv( #c ); gocmd( argv ); }
283 GOCMD( iscsitarget );
286 INT << "===[END]============================================" << endl << endl;
287 zypp::base::LogControl::TmpLineWriter shutUp;