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