fix rpm building (bnc#329635)
[platform/upstream/libzypp.git] / tools / NameReqPrv.cc
1 #define INCLUDE_TESTSETUP_WITHOUT_BOOST
2 #include "zypp/../tests/lib/TestSetup.h"
3 #undef  INCLUDE_TESTSETUP_WITHOUT_BOOST
4
5 #include <algorithm>
6 #include <zypp/PoolQuery.h>
7
8 static std::string appname( "NameReqPrv" );
9
10 #define message cout
11 using std::flush;
12
13 int errexit( const std::string & msg_r = std::string(), int exit_r = 100 )
14 {
15   if ( ! msg_r.empty() )
16   {
17     cerr << endl << msg_r << endl << endl;
18   }
19   return exit_r;
20 }
21
22 int usage( const std::string & msg_r = std::string(), int exit_r = 100 )
23 {
24   if ( ! msg_r.empty() )
25   {
26     cerr << endl << msg_r << endl << endl;
27   }
28   cerr << "Usage: " << appname << " [--root ROOTDIR] [OPTIONS] NAME... [[OPTIONS] NAME...]..." << endl;
29   cerr << "  Load all enabled repositories (no refresh) and search for" << endl;
30   cerr << "  occurrences of NAME (regex) in package names, provides or" << endl;
31   cerr << "  requires." << endl;
32   cerr << "  --root   Load repos from the system located below ROOTDIR. If ROOTDIR" << endl;
33   cerr << "           denotes a sover testcase, the testcase is loaded." << endl;
34   cerr << "  --installed Process installed packages only." << endl;
35   cerr << "  -i/-I    turn on/off case insensitive search (default on)" << endl;
36   cerr << "  -n/-N    turn on/off looking for names       (default on)" << endl;
37   cerr << "  -p/-P    turn on/off looking for provides    (default off)" << endl;
38   cerr << "  -r/-R    turn on/off looking for requires    (default off)" << endl;
39   cerr << "  -c/-C    turn on/off looking for conflicts   (default off)" << endl;
40   cerr << "  -o/-O    turn on/off looking for obsoletes   (default off)" << endl;
41   cerr << "  -m/-M    turn on/off looking for recommends  (default off)" << endl;
42   cerr << "  -s/-S    turn on/off looking for supplements (default off)" << endl;
43   cerr << "  -a       short for -n -p -r" << endl;
44   cerr << "  -A       short for -n -P -R" << endl;
45   cerr << "" << endl;
46   return exit_r;
47 }
48
49 void tableOut( const std::string & s1 = std::string(),
50                const std::string & s2 = std::string(),
51                const std::string & s3 = std::string(),
52                const std::string & s4 = std::string(),
53                const std::string & s5 = std::string() )
54 {
55   message << "  ";
56 #define TABEL(N) static unsigned w##N = 0; if ( ! s##N.empty() ) w##N = std::max( w##N, unsigned(s##N.size()) ); message << str::form( " %-*s ", w##N, s##N.c_str() )
57 #define TABER(N) static unsigned w##N = 0; if ( ! s##N.empty() ) w##N = std::max( w##N, unsigned(s##N.size()) ); message << str::form( " %*s ", w##N, s##N.c_str() )
58   TABER( 1 ); TABEL( 2 ); TABEL( 3 ); TABEL( 4 ); TABEL( 5 );
59 #undef TABEL
60   message << endl;
61 }
62
63 /******************************************************************
64 **
65 **      FUNCTION NAME : main
66 **      FUNCTION TYPE : int
67 */
68 int main( int argc, char * argv[] )
69 {
70   INT << "===[START]==========================================" << endl;
71   appname = Pathname::basename( argv[0] );
72   --argc,++argv;
73
74   if ( ! argc )
75   {
76     return usage();
77   }
78
79   ///////////////////////////////////////////////////////////////////
80
81   ZConfig::instance();
82   Pathname sysRoot("/");
83   sat::Pool satpool( sat::Pool::instance() );
84
85   if ( argc && (*argv) == std::string("--root") )
86   {
87     --argc,++argv;
88     if ( ! argc )
89       return errexit("--root requires an argument.");
90
91     if ( ! PathInfo( *argv ).isDir() )
92       return errexit("--root requires a directory.");
93
94     sysRoot = *argv;
95     --argc,++argv;
96   }
97
98   bool onlyInstalled( false );
99   if ( argc && (*argv) == std::string("--installed") )
100   {
101     --argc,++argv;
102     onlyInstalled = true;
103   }
104
105   if ( TestSetup::isTestcase( sysRoot ) )
106   {
107     message << str::form( "*** Load Testcase from '%s'", sysRoot.c_str() ) << endl;
108     TestSetup test;
109     test.loadTestcaseRepos( sysRoot );
110     dumpRange( message, satpool.reposBegin(), satpool.reposEnd() ) << endl;
111   }
112   else if ( TestSetup::isTestSetup( sysRoot ) )
113   {
114     message << str::form( "*** Load TestSetup from '%s'", sysRoot.c_str() ) << endl;
115     TestSetup test( sysRoot, Arch_x86_64 );
116     test.loadRepos();
117     dumpRange( message, satpool.reposBegin(), satpool.reposEnd() ) << endl;
118   }
119   else
120   {
121     // a system
122     message << str::form( "*** Load system at '%s'", sysRoot.c_str() ) << endl;
123     if ( true )
124     {
125       message << "*** load target '" << Repository::systemRepoAlias() << "'\t" << endl;
126       getZYpp()->initializeTarget( sysRoot );
127       getZYpp()->target()->load();
128       message << satpool.systemRepo() << endl;
129     }
130
131     if ( !onlyInstalled )
132     {
133       RepoManager repoManager( sysRoot );
134       RepoInfoList repos = repoManager.knownRepositories();
135       for_( it, repos.begin(), repos.end() )
136       {
137         RepoInfo & nrepo( *it );
138
139         if ( ! nrepo.enabled() )
140           continue;
141
142         if ( ! repoManager.isCached( nrepo ) )
143         {
144           message << str::form( "*** omit uncached repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl;
145           continue;
146         }
147
148         message << str::form( "*** load repo '%s'\t", nrepo.name().c_str() ) << flush;
149         try
150         {
151           repoManager.loadFromCache( nrepo );
152           message << satpool.reposFind( nrepo.alias() ) << endl;
153         }
154         catch ( const Exception & exp )
155         {
156           message << exp.asString() + "\n" + exp.historyAsString() << endl;
157           message << str::form( "*** omit broken repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl;
158           continue;
159         }
160       }
161     }
162   }
163
164   ///////////////////////////////////////////////////////////////////
165
166   bool ignorecase       ( true );
167   bool names            ( true );
168   bool provides         ( false );
169   bool requires         ( false );
170   bool conflicts        ( false );
171   bool obsoletes        ( false );
172   bool recommends       ( false );
173   bool supplements      ( false );
174
175   for ( ; argc; --argc,++argv )
176   {
177     if ( (*argv)[0] == '-' )
178     {
179       switch ( (*argv)[1] )
180       {
181         case 'a':  names =      true,   requires = provides =   true;   break;
182         case 'A':  names =      true,   requires = provides =   false;  break;
183         case 'i': ignorecase =  true;   break;
184         case 'I': ignorecase =  false;  break;
185         case 'n': names =       true;   break;
186         case 'N': names =       false;  break;
187         case 'r': requires =    true;   break;
188         case 'R': requires =    false;  break;
189         case 'p': provides =    true;   break;
190         case 'P': provides =    false;  break;
191         case 'c': conflicts =   true;   break;
192         case 'C': conflicts =   false;  break;
193         case 'o': obsoletes =   true;   break;
194         case 'O': obsoletes =   false;  break;
195         case 'm': recommends =  true;   break;
196         case 'M': recommends =  false;  break;
197         case 's': supplements = true;   break;
198         case 'S': supplements = false;  break;
199       }
200       continue;
201     }
202
203     PoolQuery q;
204     if ( onlyInstalled )
205       q.setInstalledOnly();
206     std::string qstr( *argv );
207
208     if ( *argv == ResKind::product )
209     {
210       q.addKind( ResKind::product );
211     }
212     else if ( *argv == ResKind::patch )
213     {
214       q.addKind( ResKind::patch );
215     }
216     else if ( *argv == ResKind::pattern )
217     {
218       q.addKind( ResKind::pattern );
219     }
220     else
221     {
222     q.addString( qstr );
223     q.setMatchRegex();
224     q.setCaseSensitive( ! ignorecase );
225
226     if ( names )
227       q.addAttribute( sat::SolvAttr::name );
228     if ( provides )
229       q.addDependency( sat::SolvAttr::provides );
230     if ( requires )
231       q.addDependency( sat::SolvAttr::requires );
232     if ( conflicts )
233       q.addDependency( sat::SolvAttr::conflicts );
234     if ( obsoletes )
235       q.addDependency( sat::SolvAttr::obsoletes );
236     if ( recommends )
237       q.addDependency( sat::SolvAttr::recommends );
238     if ( supplements )
239       q.addDependency( sat::SolvAttr::supplements );
240     }
241
242     message << *argv << " [" << (ignorecase?'i':'_') << (names?'n':'_') << (requires?'r':'_') << (provides?'p':'_')
243             << (conflicts?'c':'_') << (obsoletes?'o':'_') << (recommends?'m':'_') << (supplements?'s':'_') << "] {" << endl;
244
245     for_( it, q.begin(), q.end() )
246     {
247       tableOut( str::numstring( it->id() ), it->asString(), it->repository().name(), it->vendor().asString(),
248                 str::numstring( PoolItem(*it)->buildtime() ) );
249       if ( ! it.matchesEmpty() )
250       {
251         for_( match, it.matchesBegin(), it.matchesEnd() )
252         {
253           tableOut( "", "", "", match->inSolvAttr().asString().substr( 9, 3 )+": " +match->asString() );
254         }
255       }
256     }
257
258     message << "}" << endl;
259   }
260
261   INT << "===[END]============================================" << endl << endl;
262   return 0;
263 }