xref: /haiku/src/libs/libsolv/solv/solver.h (revision f491972ca97c30b7b4ff6cf072de7bb345d58a69)
1*f491972cSAugustin Cavalier /*
2*f491972cSAugustin Cavalier  * Copyright (c) 2007, Novell Inc.
3*f491972cSAugustin Cavalier  *
4*f491972cSAugustin Cavalier  * This program is licensed under the BSD license, read LICENSE.BSD
5*f491972cSAugustin Cavalier  * for further information
6*f491972cSAugustin Cavalier  */
7*f491972cSAugustin Cavalier 
8*f491972cSAugustin Cavalier /*
9*f491972cSAugustin Cavalier  * solver.h
10*f491972cSAugustin Cavalier  *
11*f491972cSAugustin Cavalier  */
12*f491972cSAugustin Cavalier 
13*f491972cSAugustin Cavalier #ifndef LIBSOLV_SOLVER_H
14*f491972cSAugustin Cavalier #define LIBSOLV_SOLVER_H
15*f491972cSAugustin Cavalier 
16*f491972cSAugustin Cavalier #include "pooltypes.h"
17*f491972cSAugustin Cavalier #include "pool.h"
18*f491972cSAugustin Cavalier #include "repo.h"
19*f491972cSAugustin Cavalier #include "queue.h"
20*f491972cSAugustin Cavalier #include "bitmap.h"
21*f491972cSAugustin Cavalier #include "transaction.h"
22*f491972cSAugustin Cavalier #include "rules.h"
23*f491972cSAugustin Cavalier #include "problems.h"
24*f491972cSAugustin Cavalier 
25*f491972cSAugustin Cavalier #ifdef __cplusplus
26*f491972cSAugustin Cavalier extern "C" {
27*f491972cSAugustin Cavalier #endif
28*f491972cSAugustin Cavalier 
29*f491972cSAugustin Cavalier struct _Solver {
30*f491972cSAugustin Cavalier   Pool *pool;				/* back pointer to pool */
31*f491972cSAugustin Cavalier   Queue job;				/* copy of the job we're solving */
32*f491972cSAugustin Cavalier 
33*f491972cSAugustin Cavalier   int (*solution_callback)(struct _Solver *solv, void *data);
34*f491972cSAugustin Cavalier   void *solution_callback_data;
35*f491972cSAugustin Cavalier 
36*f491972cSAugustin Cavalier   int pooljobcnt;			/* number of pooljob entries in job queue */
37*f491972cSAugustin Cavalier 
38*f491972cSAugustin Cavalier #ifdef LIBSOLV_INTERNAL
39*f491972cSAugustin Cavalier   Repo *installed;			/* copy of pool->installed */
40*f491972cSAugustin Cavalier 
41*f491972cSAugustin Cavalier   /* list of rules, ordered
42*f491972cSAugustin Cavalier    * rpm rules first, then features, updates, jobs, learnt
43*f491972cSAugustin Cavalier    * see start/end offsets below
44*f491972cSAugustin Cavalier    */
45*f491972cSAugustin Cavalier   Rule *rules;				/* all rules */
46*f491972cSAugustin Cavalier   Id nrules;				/* [Offset] index of the last rule */
47*f491972cSAugustin Cavalier 
48*f491972cSAugustin Cavalier   Queue ruleassertions;			/* Queue of all assertion rules */
49*f491972cSAugustin Cavalier 
50*f491972cSAugustin Cavalier   /* start/end offset for rule 'areas' */
51*f491972cSAugustin Cavalier 
52*f491972cSAugustin Cavalier   Id rpmrules_end;                      /* [Offset] rpm rules end */
53*f491972cSAugustin Cavalier 
54*f491972cSAugustin Cavalier   Id featurerules;			/* feature rules start/end */
55*f491972cSAugustin Cavalier   Id featurerules_end;
56*f491972cSAugustin Cavalier 
57*f491972cSAugustin Cavalier   Id updaterules;			/* policy rules, e.g. keep packages installed or update. All literals > 0 */
58*f491972cSAugustin Cavalier   Id updaterules_end;
59*f491972cSAugustin Cavalier 
60*f491972cSAugustin Cavalier   Id jobrules;				/* user rules */
61*f491972cSAugustin Cavalier   Id jobrules_end;
62*f491972cSAugustin Cavalier 
63*f491972cSAugustin Cavalier   Id infarchrules;			/* inferior arch rules */
64*f491972cSAugustin Cavalier   Id infarchrules_end;
65*f491972cSAugustin Cavalier 
66*f491972cSAugustin Cavalier   Id duprules;				/* dist upgrade rules */
67*f491972cSAugustin Cavalier   Id duprules_end;
68*f491972cSAugustin Cavalier 
69*f491972cSAugustin Cavalier   Id bestrules;				/* rules from SOLVER_FORCEBEST */
70*f491972cSAugustin Cavalier   Id bestrules_end;
71*f491972cSAugustin Cavalier   Id *bestrules_pkg;
72*f491972cSAugustin Cavalier 
73*f491972cSAugustin Cavalier   Id choicerules;			/* choice rules (always weak) */
74*f491972cSAugustin Cavalier   Id choicerules_end;
75*f491972cSAugustin Cavalier   Id *choicerules_ref;
76*f491972cSAugustin Cavalier 
77*f491972cSAugustin Cavalier   Id learntrules;			/* learnt rules, (end == nrules) */
78*f491972cSAugustin Cavalier 
79*f491972cSAugustin Cavalier   Map noupdate;				/* don't try to update these
80*f491972cSAugustin Cavalier                                            installed solvables */
81*f491972cSAugustin Cavalier   Map multiversion;			/* ignore obsoletes for these (multiinstall) */
82*f491972cSAugustin Cavalier 
83*f491972cSAugustin Cavalier   Map updatemap;			/* bring these installed packages to the newest version */
84*f491972cSAugustin Cavalier   int updatemap_all;			/* bring all packages to the newest version */
85*f491972cSAugustin Cavalier 
86*f491972cSAugustin Cavalier   Map bestupdatemap;			/* create best rule for those packages */
87*f491972cSAugustin Cavalier   int bestupdatemap_all;		/* bring all packages to the newest version */
88*f491972cSAugustin Cavalier 
89*f491972cSAugustin Cavalier   Map fixmap;				/* fix these packages */
90*f491972cSAugustin Cavalier   int fixmap_all;			/* fix all packages */
91*f491972cSAugustin Cavalier 
92*f491972cSAugustin Cavalier   Queue weakruleq;			/* index into 'rules' for weak ones */
93*f491972cSAugustin Cavalier   Map weakrulemap;			/* map rule# to '1' for weak rules, 1..learntrules */
94*f491972cSAugustin Cavalier 
95*f491972cSAugustin Cavalier   Id *watches;				/* Array of rule offsets
96*f491972cSAugustin Cavalier 					 * watches has nsolvables*2 entries and is addressed from the middle
97*f491972cSAugustin Cavalier 					 * middle-solvable : decision to conflict, offset point to linked-list of rules
98*f491972cSAugustin Cavalier 					 * middle+solvable : decision to install: offset point to linked-list of rules
99*f491972cSAugustin Cavalier 					 */
100*f491972cSAugustin Cavalier 
101*f491972cSAugustin Cavalier   Queue ruletojob;                      /* index into job queue: jobs for which a rule exits */
102*f491972cSAugustin Cavalier 
103*f491972cSAugustin Cavalier   /* our decisions: */
104*f491972cSAugustin Cavalier   Queue decisionq;                      /* >0:install, <0:remove/conflict */
105*f491972cSAugustin Cavalier   Queue decisionq_why;			/* index of rule, Offset into rules */
106*f491972cSAugustin Cavalier 
107*f491972cSAugustin Cavalier   Id *decisionmap;			/* map for all available solvables,
108*f491972cSAugustin Cavalier 					 * = 0: undecided
109*f491972cSAugustin Cavalier 					 * > 0: level of decision when installed,
110*f491972cSAugustin Cavalier 					 * < 0: level of decision when conflict */
111*f491972cSAugustin Cavalier 
112*f491972cSAugustin Cavalier   int decisioncnt_update;
113*f491972cSAugustin Cavalier   int decisioncnt_keep;
114*f491972cSAugustin Cavalier   int decisioncnt_resolve;
115*f491972cSAugustin Cavalier   int decisioncnt_weak;
116*f491972cSAugustin Cavalier   int decisioncnt_orphan;
117*f491972cSAugustin Cavalier 
118*f491972cSAugustin Cavalier   /* learnt rule history */
119*f491972cSAugustin Cavalier   Queue learnt_why;
120*f491972cSAugustin Cavalier   Queue learnt_pool;
121*f491972cSAugustin Cavalier 
122*f491972cSAugustin Cavalier   Queue branches;
123*f491972cSAugustin Cavalier   int propagate_index;                  /* index into decisionq for non-propagated decisions */
124*f491972cSAugustin Cavalier 
125*f491972cSAugustin Cavalier   Queue problems;                       /* list of lists of conflicting rules, < 0 for job rules */
126*f491972cSAugustin Cavalier   Queue solutions;			/* refined problem storage space */
127*f491972cSAugustin Cavalier 
128*f491972cSAugustin Cavalier   Queue orphaned;			/* orphaned packages (to be removed?) */
129*f491972cSAugustin Cavalier 
130*f491972cSAugustin Cavalier   int stats_learned;			/* statistic */
131*f491972cSAugustin Cavalier   int stats_unsolvable;			/* statistic */
132*f491972cSAugustin Cavalier 
133*f491972cSAugustin Cavalier   Map recommendsmap;			/* recommended packages from decisionmap */
134*f491972cSAugustin Cavalier   Map suggestsmap;			/* suggested packages from decisionmap */
135*f491972cSAugustin Cavalier   int recommends_index;			/* recommendsmap/suggestsmap is created up to this level */
136*f491972cSAugustin Cavalier 
137*f491972cSAugustin Cavalier   Id *obsoletes;			/* obsoletes for each installed solvable */
138*f491972cSAugustin Cavalier   Id *obsoletes_data;			/* data area for obsoletes */
139*f491972cSAugustin Cavalier   Id *multiversionupdaters;		/* updaters for multiversion packages in updatesystem mode */
140*f491972cSAugustin Cavalier 
141*f491972cSAugustin Cavalier   /*-------------------------------------------------------------------------------------------------------------
142*f491972cSAugustin Cavalier    * Solver configuration
143*f491972cSAugustin Cavalier    *-------------------------------------------------------------------------------------------------------------*/
144*f491972cSAugustin Cavalier 
145*f491972cSAugustin Cavalier   int allowdowngrade;			/* allow to downgrade installed solvable */
146*f491972cSAugustin Cavalier   int allownamechange;			/* allow to change name of installed solvables */
147*f491972cSAugustin Cavalier   int allowarchchange;			/* allow to change architecture of installed solvables */
148*f491972cSAugustin Cavalier   int allowvendorchange;		/* allow to change vendor of installed solvables */
149*f491972cSAugustin Cavalier   int allowuninstall;			/* allow removal of installed solvables */
150*f491972cSAugustin Cavalier   int noupdateprovide;			/* true: update packages needs not to provide old package */
151*f491972cSAugustin Cavalier   int dosplitprovides;			/* true: consider legacy split provides */
152*f491972cSAugustin Cavalier   int dontinstallrecommended;		/* true: do not install recommended packages */
153*f491972cSAugustin Cavalier   int addalreadyrecommended;		/* true: also install recommended packages that were already recommended by the installed packages */
154*f491972cSAugustin Cavalier   int dontshowinstalledrecommended;	/* true: do not show recommended packages that are already installed */
155*f491972cSAugustin Cavalier 
156*f491972cSAugustin Cavalier   int noinfarchcheck;			/* true: do not forbid inferior architectures */
157*f491972cSAugustin Cavalier   int keepexplicitobsoletes;		/* true: honor obsoletes during multiinstall */
158*f491972cSAugustin Cavalier   int bestobeypolicy;			/* true: stay in policy with the best rules */
159*f491972cSAugustin Cavalier   int noautotarget;			/* true: do not assume targeted for up/dup jobs that contain no installed solvable */
160*f491972cSAugustin Cavalier 
161*f491972cSAugustin Cavalier 
162*f491972cSAugustin Cavalier   Map dupmap;				/* dup these packages*/
163*f491972cSAugustin Cavalier   int dupmap_all;			/* dup all packages */
164*f491972cSAugustin Cavalier   Map dupinvolvedmap;			/* packages involved in dup process */
165*f491972cSAugustin Cavalier   int dup_allowdowngrade;		/* dup mode: allow to downgrade installed solvable */
166*f491972cSAugustin Cavalier   int dup_allownamechange;		/* dup mode: allow to change name of installed solvable */
167*f491972cSAugustin Cavalier   int dup_allowarchchange;		/* dup mode: allow to change architecture of installed solvables */
168*f491972cSAugustin Cavalier   int dup_allowvendorchange;		/* dup mode: allow to change vendor of installed solvables */
169*f491972cSAugustin Cavalier 
170*f491972cSAugustin Cavalier   Map droporphanedmap;			/* packages to drop in dup mode */
171*f491972cSAugustin Cavalier   int droporphanedmap_all;
172*f491972cSAugustin Cavalier 
173*f491972cSAugustin Cavalier   Map cleandepsmap;			/* try to drop these packages as of cleandeps erases */
174*f491972cSAugustin Cavalier 
175*f491972cSAugustin Cavalier   Queue *ruleinfoq;			/* tmp space for solver_ruleinfo() */
176*f491972cSAugustin Cavalier 
177*f491972cSAugustin Cavalier   Queue *cleandeps_updatepkgs;		/* packages we update in cleandeps mode */
178*f491972cSAugustin Cavalier   Queue *cleandeps_mistakes;		/* mistakes we made */
179*f491972cSAugustin Cavalier 
180*f491972cSAugustin Cavalier   Queue *update_targets;		/* update to specific packages */
181*f491972cSAugustin Cavalier 
182*f491972cSAugustin Cavalier   Queue *installsuppdepq;		/* deps from the install namespace provides hack */
183*f491972cSAugustin Cavalier 
184*f491972cSAugustin Cavalier   Queue addedmap_deduceq;		/* deduce addedmap from rpm rules */
185*f491972cSAugustin Cavalier #endif	/* LIBSOLV_INTERNAL */
186*f491972cSAugustin Cavalier };
187*f491972cSAugustin Cavalier 
188*f491972cSAugustin Cavalier typedef struct _Solver Solver;
189*f491972cSAugustin Cavalier 
190*f491972cSAugustin Cavalier /*
191*f491972cSAugustin Cavalier  * queue commands
192*f491972cSAugustin Cavalier  */
193*f491972cSAugustin Cavalier 
194*f491972cSAugustin Cavalier #define SOLVER_SOLVABLE			0x01
195*f491972cSAugustin Cavalier #define SOLVER_SOLVABLE_NAME		0x02
196*f491972cSAugustin Cavalier #define SOLVER_SOLVABLE_PROVIDES	0x03
197*f491972cSAugustin Cavalier #define SOLVER_SOLVABLE_ONE_OF		0x04
198*f491972cSAugustin Cavalier #define SOLVER_SOLVABLE_REPO		0x05
199*f491972cSAugustin Cavalier #define SOLVER_SOLVABLE_ALL		0x06
200*f491972cSAugustin Cavalier 
201*f491972cSAugustin Cavalier #define SOLVER_SELECTMASK		0xff
202*f491972cSAugustin Cavalier 
203*f491972cSAugustin Cavalier #define SOLVER_NOOP			0x0000
204*f491972cSAugustin Cavalier #define SOLVER_INSTALL       		0x0100
205*f491972cSAugustin Cavalier #define SOLVER_ERASE         		0x0200
206*f491972cSAugustin Cavalier #define SOLVER_UPDATE			0x0300
207*f491972cSAugustin Cavalier #define SOLVER_WEAKENDEPS      		0x0400
208*f491972cSAugustin Cavalier #define SOLVER_MULTIVERSION		0x0500
209*f491972cSAugustin Cavalier #define SOLVER_LOCK			0x0600
210*f491972cSAugustin Cavalier #define SOLVER_DISTUPGRADE		0x0700
211*f491972cSAugustin Cavalier #define SOLVER_VERIFY			0x0800
212*f491972cSAugustin Cavalier #define SOLVER_DROP_ORPHANED		0x0900
213*f491972cSAugustin Cavalier #define SOLVER_USERINSTALLED            0x0a00
214*f491972cSAugustin Cavalier 
215*f491972cSAugustin Cavalier #define SOLVER_JOBMASK			0xff00
216*f491972cSAugustin Cavalier 
217*f491972cSAugustin Cavalier #define SOLVER_WEAK			0x010000
218*f491972cSAugustin Cavalier #define SOLVER_ESSENTIAL		0x020000
219*f491972cSAugustin Cavalier #define SOLVER_CLEANDEPS                0x040000
220*f491972cSAugustin Cavalier /* ORUPDATE makes SOLVER_INSTALL not prune to installed
221*f491972cSAugustin Cavalier  * packages, thus updating installed packages */
222*f491972cSAugustin Cavalier #define SOLVER_ORUPDATE			0x080000
223*f491972cSAugustin Cavalier /* FORCEBEST makes the solver insist on best packages, so
224*f491972cSAugustin Cavalier  * you will get problem reported if the best package is
225*f491972cSAugustin Cavalier  * not installable. This can be used with INSTALL, UPDATE
226*f491972cSAugustin Cavalier  * and DISTUPGRADE */
227*f491972cSAugustin Cavalier #define SOLVER_FORCEBEST		0x100000
228*f491972cSAugustin Cavalier /* TARGETED is used in up/dup jobs to make the solver
229*f491972cSAugustin Cavalier  * treat the specified selection as target packages.
230*f491972cSAugustin Cavalier  * It is automatically assumed if the selection does not
231*f491972cSAugustin Cavalier  * contain an "installed" package unless the
232*f491972cSAugustin Cavalier  * NO_AUTOTARGET solver flag is set */
233*f491972cSAugustin Cavalier #define SOLVER_TARGETED			0x200000
234*f491972cSAugustin Cavalier 
235*f491972cSAugustin Cavalier #define SOLVER_SETEV			0x01000000
236*f491972cSAugustin Cavalier #define SOLVER_SETEVR			0x02000000
237*f491972cSAugustin Cavalier #define SOLVER_SETARCH			0x04000000
238*f491972cSAugustin Cavalier #define SOLVER_SETVENDOR		0x08000000
239*f491972cSAugustin Cavalier #define SOLVER_SETREPO			0x10000000
240*f491972cSAugustin Cavalier #define SOLVER_NOAUTOSET		0x20000000
241*f491972cSAugustin Cavalier #define SOLVER_SETNAME			0x40000000
242*f491972cSAugustin Cavalier 
243*f491972cSAugustin Cavalier #define SOLVER_SETMASK			0x7f000000
244*f491972cSAugustin Cavalier 
245*f491972cSAugustin Cavalier /* legacy */
246*f491972cSAugustin Cavalier #define SOLVER_NOOBSOLETES 		SOLVER_MULTIVERSION
247*f491972cSAugustin Cavalier 
248*f491972cSAugustin Cavalier #define SOLVER_REASON_UNRELATED		0
249*f491972cSAugustin Cavalier #define SOLVER_REASON_UNIT_RULE		1
250*f491972cSAugustin Cavalier #define SOLVER_REASON_KEEP_INSTALLED	2
251*f491972cSAugustin Cavalier #define SOLVER_REASON_RESOLVE_JOB	3
252*f491972cSAugustin Cavalier #define SOLVER_REASON_UPDATE_INSTALLED	4
253*f491972cSAugustin Cavalier #define SOLVER_REASON_CLEANDEPS_ERASE	5
254*f491972cSAugustin Cavalier #define SOLVER_REASON_RESOLVE		6
255*f491972cSAugustin Cavalier #define SOLVER_REASON_WEAKDEP		7
256*f491972cSAugustin Cavalier #define SOLVER_REASON_RESOLVE_ORPHAN	8
257*f491972cSAugustin Cavalier 
258*f491972cSAugustin Cavalier #define SOLVER_REASON_RECOMMENDED	16
259*f491972cSAugustin Cavalier #define SOLVER_REASON_SUPPLEMENTED	17
260*f491972cSAugustin Cavalier 
261*f491972cSAugustin Cavalier 
262*f491972cSAugustin Cavalier #define SOLVER_FLAG_ALLOW_DOWNGRADE		1
263*f491972cSAugustin Cavalier #define SOLVER_FLAG_ALLOW_ARCHCHANGE		2
264*f491972cSAugustin Cavalier #define SOLVER_FLAG_ALLOW_VENDORCHANGE		3
265*f491972cSAugustin Cavalier #define SOLVER_FLAG_ALLOW_UNINSTALL		4
266*f491972cSAugustin Cavalier #define SOLVER_FLAG_NO_UPDATEPROVIDE		5
267*f491972cSAugustin Cavalier #define SOLVER_FLAG_SPLITPROVIDES		6
268*f491972cSAugustin Cavalier #define SOLVER_FLAG_IGNORE_RECOMMENDED		7
269*f491972cSAugustin Cavalier #define SOLVER_FLAG_ADD_ALREADY_RECOMMENDED	8
270*f491972cSAugustin Cavalier #define SOLVER_FLAG_NO_INFARCHCHECK		9
271*f491972cSAugustin Cavalier #define SOLVER_FLAG_ALLOW_NAMECHANGE		10
272*f491972cSAugustin Cavalier #define SOLVER_FLAG_KEEP_EXPLICIT_OBSOLETES	11
273*f491972cSAugustin Cavalier #define SOLVER_FLAG_BEST_OBEY_POLICY		12
274*f491972cSAugustin Cavalier #define SOLVER_FLAG_NO_AUTOTARGET		13
275*f491972cSAugustin Cavalier 
276*f491972cSAugustin Cavalier extern Solver *solver_create(Pool *pool);
277*f491972cSAugustin Cavalier extern void solver_free(Solver *solv);
278*f491972cSAugustin Cavalier extern int  solver_solve(Solver *solv, Queue *job);
279*f491972cSAugustin Cavalier extern Transaction *solver_create_transaction(Solver *solv);
280*f491972cSAugustin Cavalier extern int solver_set_flag(Solver *solv, int flag, int value);
281*f491972cSAugustin Cavalier extern int solver_get_flag(Solver *solv, int flag);
282*f491972cSAugustin Cavalier 
283*f491972cSAugustin Cavalier extern int  solver_get_decisionlevel(Solver *solv, Id p);
284*f491972cSAugustin Cavalier extern void solver_get_decisionqueue(Solver *solv, Queue *decisionq);
285*f491972cSAugustin Cavalier extern int  solver_get_lastdecisionblocklevel(Solver *solv);
286*f491972cSAugustin Cavalier extern void solver_get_decisionblock(Solver *solv, int level, Queue *decisionq);
287*f491972cSAugustin Cavalier 
288*f491972cSAugustin Cavalier extern void solver_get_orphaned(Solver *solv, Queue *orphanedq);
289*f491972cSAugustin Cavalier extern void solver_get_recommendations(Solver *solv, Queue *recommendationsq, Queue *suggestionsq, int noselected);
290*f491972cSAugustin Cavalier extern void solver_get_unneeded(Solver *solv, Queue *unneededq, int filtered);
291*f491972cSAugustin Cavalier 
292*f491972cSAugustin Cavalier extern int  solver_describe_decision(Solver *solv, Id p, Id *infop);
293*f491972cSAugustin Cavalier extern void solver_describe_weakdep_decision(Solver *solv, Id p, Queue *whyq);
294*f491972cSAugustin Cavalier 
295*f491972cSAugustin Cavalier 
296*f491972cSAugustin Cavalier extern void solver_calculate_multiversionmap(Pool *pool, Queue *job, Map *multiversionmap);
297*f491972cSAugustin Cavalier extern void solver_calculate_noobsmap(Pool *pool, Queue *job, Map *multiversionmap);	/* obsolete */
298*f491972cSAugustin Cavalier extern void solver_create_state_maps(Solver *solv, Map *installedmap, Map *conflictsmap);
299*f491972cSAugustin Cavalier 
300*f491972cSAugustin Cavalier /* XXX: why is this not static? */
301*f491972cSAugustin Cavalier Id *solver_create_decisions_obsoletesmap(Solver *solv);
302*f491972cSAugustin Cavalier 
303*f491972cSAugustin Cavalier void solver_calc_duchanges(Solver *solv, DUChanges *mps, int nmps);
304*f491972cSAugustin Cavalier int solver_calc_installsizechange(Solver *solv);
305*f491972cSAugustin Cavalier void solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res);
306*f491972cSAugustin Cavalier 
307*f491972cSAugustin Cavalier void pool_job2solvables(Pool *pool, Queue *pkgs, Id how, Id what);
308*f491972cSAugustin Cavalier int  pool_isemptyupdatejob(Pool *pool, Id how, Id what);
309*f491972cSAugustin Cavalier 
310*f491972cSAugustin Cavalier /* iterate over all literals of a rule */
311*f491972cSAugustin Cavalier #define FOR_RULELITERALS(l, pp, r)				\
312*f491972cSAugustin Cavalier     for (pp = r->d < 0 ? -r->d - 1 : r->d,			\
313*f491972cSAugustin Cavalier          l = r->p; l; l = (pp <= 0 ? (pp-- ? 0 : r->w2) :	\
314*f491972cSAugustin Cavalier          pool->whatprovidesdata[pp++]))
315*f491972cSAugustin Cavalier 
316*f491972cSAugustin Cavalier 
317*f491972cSAugustin Cavalier 
318*f491972cSAugustin Cavalier 
319*f491972cSAugustin Cavalier /* XXX: this currently doesn't work correctly for SOLVER_SOLVABLE_REPO and
320*f491972cSAugustin Cavalier    SOLVER_SOLVABLE_ALL */
321*f491972cSAugustin Cavalier 
322*f491972cSAugustin Cavalier /* iterate over all packages selected by a job */
323*f491972cSAugustin Cavalier #define FOR_JOB_SELECT(p, pp, select, what)					\
324*f491972cSAugustin Cavalier     if (select == SOLVER_SOLVABLE_REPO || select == SOLVER_SOLVABLE_ALL)	\
325*f491972cSAugustin Cavalier 	p = pp = 0;								\
326*f491972cSAugustin Cavalier     else for (pp = (select == SOLVER_SOLVABLE ? 0 :				\
327*f491972cSAugustin Cavalier                select == SOLVER_SOLVABLE_ONE_OF ? what : 			\
328*f491972cSAugustin Cavalier                pool_whatprovides(pool, what)),					\
329*f491972cSAugustin Cavalier          p = (select == SOLVER_SOLVABLE ? what : pool->whatprovidesdata[pp++]); \
330*f491972cSAugustin Cavalier 					 p ; p = pool->whatprovidesdata[pp++])	\
331*f491972cSAugustin Cavalier       if (select == SOLVER_SOLVABLE_NAME && 					\
332*f491972cSAugustin Cavalier 			pool_match_nevr(pool, pool->solvables + p, what) == 0)	\
333*f491972cSAugustin Cavalier 	continue;								\
334*f491972cSAugustin Cavalier       else
335*f491972cSAugustin Cavalier 
336*f491972cSAugustin Cavalier #ifdef __cplusplus
337*f491972cSAugustin Cavalier }
338*f491972cSAugustin Cavalier #endif
339*f491972cSAugustin Cavalier 
340*f491972cSAugustin Cavalier #endif /* LIBSOLV_SOLVER_H */
341