3 # %rename("to_s") string();
5 ##if defined(SWIGPYTHON)
6 # %rename("__str__") string();
13 /* Check if is a list */
15 if (PyList_Check($input)) {
16 int size = PyList_Size($input);
18 for (i = 0; i < size; i++) {
19 PyObject *o = PyList_GetItem($input,i);
21 int e = SWIG_AsVal_int(o, &v);
23 SWIG_exception_fail(SWIG_ArgError(e), "list must contain only integers");
30 PyErr_SetString(PyExc_TypeError,"not a list");
36 PyObject *o = PyList_New($1.count);
37 for (i = 0; i < $1.count; i++)
38 PyList_SetItem(o, i, SWIG_From_int($1.elements[i]));
42 %typemap(arginit) Queue {
45 %typemap(freearg) Queue {
59 #include "solverdebug.h"
60 #include "repo_solv.h"
63 #include "repo_rpmdb.h"
64 #include "repo_rpmmd.h"
65 #include "repo_write.h"
66 #include "repo_products.h"
67 #include "repo_susetags.h"
68 #include "repo_updateinfoxml.h"
69 #include "repo_deltainfoxml.h"
70 #include "repo_repomdxml.h"
71 #include "repo_content.h"
72 #include "sat_xfopen.h"
77 #define SOLVER_SOLUTION_DEINSTALL -100
78 #define SOLVER_SOLUTION_REPLACE -101
79 typedef struct chksum Chksum;
100 } Pool_solvable_iterator;
105 } Pool_repo_iterator;
110 } Repo_solvable_iterator;
147 %constant Id SOLVID_META;
148 %constant Id SOLVID_POS;
150 %constant int REL_EQ;
151 %constant int REL_GT;
152 %constant int REL_LT;
153 %constant int REL_ARCH;
171 # put before pool/repo so we can access the constructor
172 %nodefaultctor Dataiterator;
173 %nodefaultdtor Dataiterator;
174 typedef struct _Dataiterator {
193 typedef struct _Repo {
195 const char * const name;
198 int const nsolvables;
199 #if defined(SWIGRUBY)
202 #if defined(SWIGPERL)
207 %nodefaultctor Pool_solvable_iterator;
208 typedef struct {} Pool_solvable_iterator;
210 %nodefaultctor Pool_repo_iterator;
211 typedef struct {} Pool_repo_iterator;
213 %nodefaultctor Repo_solvable_iterator;
214 typedef struct {} Repo_solvable_iterator;
216 %nodefaultctor Solver;
217 %nodefaultdtor Solver;
220 bool ignorealreadyrecommended;
221 bool dosplitprovides;
226 bool allowarchchange;
227 bool allowvendorchange;
230 typedef struct chksum {
233 %rename(xfopen) sat_xfopen;
234 %rename(xfopen_fd) sat_xfopen_fd;
235 %rename(xfclose) sat_xfclose;
236 %rename(xfileno) sat_xfileno;
238 FILE *sat_xfopen(const char *fn);
239 FILE *sat_xfopen_fd(const char *fn, int fd);
241 int sat_xfclose(FILE *fp) {
244 int sat_xfileno(FILE *fp) {
268 %nodefaultctor Transaction;
269 %nodefaultdtor Transaction;
277 static const Id SOLVER_SOLVABLE = SOLVER_SOLVABLE;
278 static const Id SOLVER_SOLVABLE_NAME = SOLVER_SOLVABLE_NAME;
279 static const Id SOLVER_SOLVABLE_PROVIDES = SOLVER_SOLVABLE_PROVIDES;
280 static const Id SOLVER_SOLVABLE_ONE_OF = SOLVER_SOLVABLE_ONE_OF;
281 static const Id SOLVER_SOLVABLE_REPO = SOLVER_SOLVABLE_REPO;
282 static const Id SOLVER_SOLVABLE_ALL = SOLVER_SOLVABLE_ALL;
283 static const Id SOLVER_SELECTMASK = SOLVER_SELECTMASK;
284 static const Id SOLVER_NOOP = SOLVER_NOOP;
285 static const Id SOLVER_INSTALL = SOLVER_INSTALL;
286 static const Id SOLVER_ERASE = SOLVER_ERASE;
287 static const Id SOLVER_UPDATE = SOLVER_UPDATE;
288 static const Id SOLVER_WEAKENDEPS = SOLVER_WEAKENDEPS;
289 static const Id SOLVER_NOOBSOLETES = SOLVER_NOOBSOLETES;
290 static const Id SOLVER_LOCK = SOLVER_LOCK;
291 static const Id SOLVER_DISTUPGRADE = SOLVER_DISTUPGRADE;
292 static const Id SOLVER_VERIFY = SOLVER_VERIFY;
293 static const Id SOLVER_DROP_ORPHANED = SOLVER_DROP_ORPHANED;
294 static const Id SOLVER_USERINSTALLED = SOLVER_USERINSTALLED;
295 static const Id SOLVER_JOBMASK = SOLVER_JOBMASK;
296 static const Id SOLVER_WEAK = SOLVER_WEAK;
297 static const Id SOLVER_ESSENTIAL = SOLVER_ESSENTIAL;
298 static const Id SOLVER_CLEANDEPS = SOLVER_CLEANDEPS;
299 static const Id SOLVER_SETEV = SOLVER_SETEV;
300 static const Id SOLVER_SETEVR = SOLVER_SETEVR;
301 static const Id SOLVER_SETARCH = SOLVER_SETARCH;
302 static const Id SOLVER_SETVENDOR = SOLVER_SETVENDOR;
303 static const Id SOLVER_SETREPO = SOLVER_SETREPO;
304 static const Id SOLVER_NOAUTOSET = SOLVER_NOAUTOSET;
305 static const Id SOLVER_SETMASK = SOLVER_SETMASK;
307 Job(Pool *pool, Id how, Id what) {
308 Job *job = sat_calloc(1, sizeof(*job));
316 Pool *pool = $self->pool;
317 Id select = $self->how & SOLVER_SELECTMASK;
318 char *strstart = 0, *strend = 0;
319 switch ($self->how & SOLVER_JOBMASK) {
321 if (select == SOLVER_SOLVABLE && pool->installed && pool->solvables[$self->what].repo == pool->installed)
322 strstart = "keep ", strend = "installed";
323 else if (select == SOLVER_SOLVABLE_PROVIDES)
324 strstart = "install a solvable ";
326 strstart = "install ";
329 if (select == SOLVER_SOLVABLE && !(pool->installed && pool->solvables[$self->what].repo == pool->installed))
330 strstart = "keep ", strend = "uninstalled";
331 else if (select == SOLVER_SOLVABLE_PROVIDES)
332 strstart = "deinstall all solvables ";
334 strstart = "deinstall ";
337 strstart = "install the most recent version of ";
343 return "unknwon job";
345 return pool_tmpjoin(pool, strstart, solver_select2str(pool, select, $self->what), strend);
351 return (Chksum *)sat_chksum_create(type);
353 Chksum(Id type, const char *hex) {
354 unsigned char buf[64];
355 int l = sat_chksum_len(type);
358 if (sat_hex2bin(&hex, buf, sizeof(buf)) != l || hex[0])
360 return (Chksum *)sat_chksum_create_from_bin(type, buf);
363 sat_chksum_free($self, 0);
367 SWIGINTERN Id Chksum_type_get(Chksum *chksum) {
368 return sat_chksum_get_type(chksum);
371 void add(const char *str) {
372 sat_chksum_add($self, str, strlen((char *)str));
374 void add_fp(FILE *fp) {
377 while ((l = fread(buf, 1, sizeof(buf), fp)) > 0)
378 sat_chksum_add($self, buf, l);
379 rewind(fp); /* convenience */
381 void add_fd(int fd) {
384 while ((l = read(fd, buf, sizeof(buf))) > 0)
385 sat_chksum_add($self, buf, l);
386 lseek(fd, 0, 0); /* convenience */
388 void add_stat(const char *filename) {
390 if (stat(filename, &stb))
391 memset(&stb, 0, sizeof(stb));
392 sat_chksum_add($self, &stb.st_dev, sizeof(stb.st_dev));
393 sat_chksum_add($self, &stb.st_ino, sizeof(stb.st_ino));
394 sat_chksum_add($self, &stb.st_size, sizeof(stb.st_size));
395 sat_chksum_add($self, &stb.st_mtime, sizeof(stb.st_mtime));
397 bool matches(Chksum *othersum) {
399 const unsigned char *b, *bo;
402 if (sat_chksum_get_type($self) != sat_chksum_get_type(othersum))
404 b = sat_chksum_get($self, &l);
405 bo = sat_chksum_get(othersum, 0);
406 return memcmp(b, bo, l) == 0;
410 const unsigned char *b;
411 b = sat_chksum_get($self, &l);
412 return cdata_void((void *)b, l);
417 const unsigned char *b;
420 b = sat_chksum_get($self, &l);
421 ret = sat_malloc(2 * l + 1);
422 sat_bin2hex(b, l, ret);
431 Pool *pool = pool_create();
436 void set_debuglevel(int level) {
437 pool_setdebuglevel($self, level);
439 #if defined(SWIGPYTHON)
441 SWIGINTERN int loadcallback(Pool *pool, Repodata *data, void *d) {
442 XRepodata *xd = new_XRepodata(data->repo, data - data->repo->repodata);
443 PyObject *args = Py_BuildValue("(O)", SWIG_NewPointerObj(SWIG_as_voidptr(xd), SWIGTYPE_p_XRepodata, SWIG_POINTER_OWN | 0));
444 PyObject *result = PyEval_CallObject((PyObject *)d, args);
446 return 0; /* exception */
450 ecode = SWIG_AsVal_int(result, &vresult);
452 return SWIG_IsOK(ecode) ? vresult : 0;
455 void set_loadcallback(PyObject *callable) {
457 if ($self->loadcallback == loadcallback) {
458 Py_DECREF($self->loadcallbackdata);
459 pool_setloadcallback($self, 0, 0);
464 pool_setloadcallback($self, loadcallback, callable);
468 #if defined(SWIGPYTHON)
469 Pool_set_loadcallback($self, 0);
473 Id str2id(const char *str, int create=1) {
474 return str2id($self, str, create);
476 const char *id2str(Id id) {
477 return id2str($self, id);
479 const char *dep2str(Id id) {
480 return dep2str($self, id);
482 Id rel2id(Id name, Id evr, int flags, int create=1) {
483 return rel2id($self, name, evr, flags, create);
485 Id id2langid(Id id, const char *lang, int create=1) {
486 return pool_id2langid($self, id, lang, create);
488 void setarch(const char *arch) {
489 pool_setarch($self, arch);
491 Repo *add_repo(const char *name) {
492 return repo_create($self, name);
494 const char *lookup_str(Id entry, Id keyname) {
495 return pool_lookup_str($self, entry, keyname);
497 Id lookup_id(Id entry, Id keyname) {
498 return pool_lookup_id($self, entry, keyname);
500 unsigned int lookup_num(Id entry, Id keyname, unsigned int notfound = 0) {
501 return pool_lookup_num($self, entry, keyname, notfound);
503 bool lookup_void(Id entry, Id keyname) {
504 return pool_lookup_void($self, entry, keyname);
506 %newobject lookup_checksum;
507 Chksum *lookup_checksum(Id entry, Id keyname) {
509 const unsigned char *b = pool_lookup_bin_checksum($self, entry, keyname, &type);
510 return sat_chksum_create_from_bin(type, b);
512 %newobject dataiterator_new;
513 Dataiterator *dataiterator_new(Id p, Id key, const char *match, int flags) {
514 return new_Dataiterator($self, 0, p, key, match, flags);
516 const char *solvid2str(Id solvid) {
517 return solvid2str($self, solvid);
519 void addfileprovides() {
520 pool_addfileprovides($self);
522 Queue addfileprovides_ids() {
524 Id *addedfileprovides = 0;
526 pool_addfileprovides_ids($self, $self->installed, &addedfileprovides);
527 if (addedfileprovides) {
528 for (; *addedfileprovides; addedfileprovides++)
529 queue_push(&r, *addedfileprovides);
533 void createwhatprovides() {
534 pool_createwhatprovides($self);
536 %newobject solvables;
537 Pool_solvable_iterator * const solvables;
539 SWIGINTERN Pool_solvable_iterator * Pool_solvables_get(Pool *pool) {
540 Pool_solvable_iterator *s;
541 s = sat_calloc(1, sizeof(*s));
548 Pool_repo_iterator * const repos;
550 SWIGINTERN Pool_repo_iterator * Pool_repos_get(Pool *pool) {
551 Pool_repo_iterator *s;
552 s = sat_calloc(1, sizeof(*s));
560 SWIGINTERN void Pool_installed_set(Pool *pool, Repo *installed) {
561 pool_set_installed(pool, installed);
563 Repo *Pool_installed_get(Pool *pool) {
564 return pool->installed;
568 Queue providerids(Id dep) {
573 FOR_PROVIDES(p, pp, dep)
577 Queue allprovidingids() {
582 for (id = 1; id < pool->ss.nstrings; id++)
583 if (pool->whatprovides[id])
588 Queue jobsolvids(Job *job) {
593 how = job->how & SOLVER_SELECTMASK;
594 FOR_JOB_SELECT(p, pp, how, job->what)
598 Job *Job(Id how, Id what) {
599 return new_Job($self, how, what);
602 #if defined(SWIGPYTHON)
604 def jobsolvables (self, *args):
605 return [ self.solvables[id] for id in self.jobsolvids(*args) ]
606 def providers(self, *args):
607 return [ self.solvables[id] for id in self.providerids(*args) ]
611 Id towhatprovides(Queue q) {
612 return pool_queuetowhatprovides($self, &q);
614 bool isknownarch(Id id) {
616 if (id == ARCH_SRC || id == ARCH_NOSRC || id == ARCH_NOARCH)
618 if (pool->id2arch && (id > pool->lastarch || !pool->id2arch[id]))
623 %newobject create_solver;
624 Solver *create_solver() {
625 return solver_create($self);
630 static const int REPO_REUSE_REPODATA = REPO_REUSE_REPODATA;
631 static const int REPO_NO_INTERNALIZE = REPO_NO_INTERNALIZE;
632 static const int REPO_LOCALPOOL = REPO_LOCALPOOL;
633 static const int REPO_USE_LOADING = REPO_USE_LOADING;
634 static const int REPO_EXTEND_SOLVABLES = REPO_EXTEND_SOLVABLES;
635 static const int SOLV_ADD_NO_STUBS = SOLV_ADD_NO_STUBS; /* repo_solv */
636 static const int SUSETAGS_RECORD_SHARES = SUSETAGS_RECORD_SHARES; /* repo_susetags */
637 static const int SOLV_ADD_NO_STUBS = SOLV_ADD_NO_STUBS ; /* repo_solv */
639 void free(int reuseids = 0) {
640 repo_free($self, reuseids);
642 void empty(int reuseids = 0) {
643 repo_empty($self, reuseids);
645 bool add_solv(const char *name, int flags = 0) {
646 FILE *fp = fopen(name, "r");
649 int r = repo_add_solv_flags($self, fp, flags);
653 bool add_solv(FILE *fp, int flags = 0) {
654 return repo_add_solv_flags($self, fp, flags) == 0;
656 bool add_products(const char *proddir, int flags = 0) {
657 repo_add_products($self, proddir, 0, flags);
660 bool add_rpmmd(FILE *fp, const char *language, int flags = 0) {
661 repo_add_rpmmd($self, fp, language, flags);
664 bool add_rpmdb(Repo *ref, int flags = 0) {
665 repo_add_rpmdb($self, ref, 0, flags);
668 Id add_rpm(const char *name, int flags = 0) {
669 return repo_add_rpm($self, name, flags);
671 bool add_susetags(FILE *fp, Id defvendor, const char *language, int flags = 0) {
672 repo_add_susetags($self, fp, defvendor, language, flags);
675 bool add_repomdxml(FILE *fp, int flags = 0) {
676 repo_add_repomdxml($self, fp, flags);
679 bool add_content(FILE *fp, int flags = 0) {
680 repo_add_content($self, fp, flags);
683 bool add_updateinfoxml(FILE *fp, int flags = 0) {
684 repo_add_updateinfoxml($self, fp, flags);
687 bool add_deltainfoxml(FILE *fp, int flags = 0) {
688 repo_add_deltainfoxml($self, fp, flags);
692 repo_internalize($self);
694 const char *lookup_str(Id entry, Id keyname) {
695 return repo_lookup_str($self, entry, keyname);
697 Id lookup_id(Id entry, Id keyname) {
698 return repo_lookup_id($self, entry, keyname);
700 unsigned int lookup_num(Id entry, Id keyname, unsigned int notfound = 0) {
701 return repo_lookup_num($self, entry, keyname, notfound);
703 void write(FILE *fp) {
704 repo_write($self, fp, repo_write_stdkeyfilter, 0, 0);
706 # HACK, remove if no longer needed!
707 bool write_first_repodata(FILE *fp, int flags = 0) {
708 int oldnrepodata = $self->nrepodata;
709 $self->nrepodata = 1;
710 repo_write($self, fp, repo_write_stdkeyfilter, 0, 0);
711 $self->nrepodata = oldnrepodata;
714 %newobject dataiterator_new;
715 Dataiterator *dataiterator_new(Id p, Id key, const char *match, int flags) {
716 return new_Dataiterator($self->pool, $self, p, key, match, flags);
721 SWIGINTERN Id Repo_id_get(Repo *repo) {
725 Repo_solvable_iterator * const solvables;
727 SWIGINTERN Repo_solvable_iterator * Repo_solvables_get(Repo *repo) {
728 Repo_solvable_iterator *s;
729 s = sat_calloc(1, sizeof(*s));
736 XRepodata *add_repodata(int flags = 0) {
737 Repodata *rd = repo_add_repodata($self, flags);
738 return new_XRepodata($self, rd - $self->repodata);
741 void create_stubs() {
743 if (!$self->nrepodata)
745 data = $self->repodata + ($self->nrepodata - 1);
746 if (data->state != REPODATA_STUB)
747 repodata_create_stubs(data);
749 #if defined(SWIGPYTHON)
752 SWIGINTERN void Repo_appdata_set(Repo *repo, PyObject *o) {
755 SWIGINTERN PyObject *Repo_appdata_get(Repo *repo) {
756 PyObject *o = repo->appdata;
762 bool iscontiguous() {
764 for (i = $self->start; i < $self->end; i++)
765 if ($self->pool->solvables[i].repo != $self)
769 XRepodata *first_repodata() {
771 if (!$self->nrepodata)
773 /* make sure all repodatas but the first are extensions */
774 if ($self->repodata[0].loadcallback)
776 for (i = 1; i < $self->nrepodata; i++)
777 if (!$self->repodata[i].loadcallback)
778 return 0; /* oops, not an extension */
779 return new_XRepodata($self, 0);
783 %extend Dataiterator {
784 static const int SEARCH_STRING = SEARCH_STRING;
785 static const int SEARCH_SUBSTRING = SEARCH_SUBSTRING;
786 static const int SEARCH_GLOB = SEARCH_GLOB;
787 static const int SEARCH_REGEX = SEARCH_REGEX;
788 static const int SEARCH_NOCASE = SEARCH_NOCASE;
789 static const int SEARCH_FILES = SEARCH_FILES;
790 static const int SEARCH_COMPLETE_FILELIST = SEARCH_COMPLETE_FILELIST;
792 Dataiterator(Pool *pool, Repo *repo, Id p, Id key, const char *match, int flags) {
793 Dataiterator *di = sat_calloc(1, sizeof(*di));
794 dataiterator_init(di, pool, repo, p, key, match, flags);
798 dataiterator_free($self);
802 Dataiterator *__iter__() {
804 ndi = sat_calloc(1, sizeof(*ndi));
805 dataiterator_init_clone(ndi, $self);
811 PyErr_SetString(PyExc_StopIteration,"no more matches");
816 Dataiterator *next() {
818 if (!dataiterator_step($self)) {
821 ndi = sat_calloc(1, sizeof(*ndi));
822 dataiterator_init_clone(ndi, $self);
825 void setpos_parent() {
826 dataiterator_setpos_parent($self);
828 void prepend_keyname(Id key) {
829 dataiterator_prepend_keyname($self, key);
831 void skip_solvable() {
832 dataiterator_skip_solvable($self);
836 XSolvable * const solvable;
838 SWIGINTERN XSolvable *Dataiterator_solvable_get(Dataiterator *di) {
839 return new_XSolvable(di->pool, di->solvid);
843 return $self->key->name;
845 const char *key_idstr() {
846 return id2str($self->pool, $self->key->name);
849 return $self->key->type;
851 const char *keytype_idstr() {
852 return id2str($self->pool, $self->key->type);
857 const char *match_idstr() {
858 return id2str($self->pool, $self->kv.id);
860 const char *match_str() {
861 return $self->kv.str;
864 return $self->kv.num;
867 return $self->kv.num2;
872 %extend Pool_solvable_iterator {
874 Pool_solvable_iterator *__iter__() {
875 Pool_solvable_iterator *s;
876 s = sat_calloc(1, sizeof(*s));
883 PyErr_SetString(PyExc_StopIteration,"no more matches");
889 Pool *pool = $self->pool;
891 if ($self->id >= pool->nsolvables)
893 while (++$self->id < pool->nsolvables)
894 if (pool->solvables[$self->id].repo)
895 return new_XSolvable(pool, $self->id);
898 %newobject __getitem__;
899 XSolvable *__getitem__(Id key) {
900 Pool *pool = $self->pool;
901 if (key > 0 && key < pool->nsolvables && pool->solvables[key].repo)
902 return new_XSolvable(pool, key);
907 %extend Pool_repo_iterator {
909 Pool_repo_iterator *__iter__() {
910 Pool_repo_iterator *s;
911 s = sat_calloc(1, sizeof(*s));
918 PyErr_SetString(PyExc_StopIteration,"no more matches");
923 Pool *pool = $self->pool;
924 if ($self->id >= pool->nrepos + 1)
926 while (++$self->id < pool->nrepos + 1) {
927 Repo *r = pool_id2repo(pool, $self->id);
933 Repo *__getitem__(Id key) {
934 Pool *pool = $self->pool;
935 if (key > 0 && key < pool->nrepos + 1)
936 return pool_id2repo(pool, key);
941 %extend Repo_solvable_iterator {
943 Repo_solvable_iterator *__iter__() {
944 Repo_solvable_iterator *s;
945 s = sat_calloc(1, sizeof(*s));
952 PyErr_SetString(PyExc_StopIteration,"no more matches");
958 Repo *repo = $self->repo;
959 Pool *pool = repo->pool;
961 if (repo->start > 0 && $self->id < repo->start)
962 $self->id = repo->start - 1;
963 if ($self->id >= repo->end)
965 while (++$self->id < repo->end)
966 if (pool->solvables[$self->id].repo == repo)
967 return new_XSolvable(pool, $self->id);
970 %newobject __getitem__;
971 XSolvable *__getitem__(Id key) {
972 Repo *repo = $self->repo;
973 Pool *pool = repo->pool;
974 if (key > 0 && key < pool->nsolvables && pool->solvables[key].repo == repo)
975 return new_XSolvable(pool, key);
981 XSolvable(Pool *pool, Id id) {
984 XSolvable *s = sat_calloc(1, sizeof(*s));
990 return solvid2str($self->pool, $self->id);
992 const char *lookup_str(Id keyname) {
993 return pool_lookup_str($self->pool, $self->id, keyname);
995 Id lookup_id(Id keyname) {
996 return pool_lookup_id($self->pool, $self->id, keyname);
998 unsigned int lookup_num(Id keyname, unsigned int notfound = 0) {
999 return pool_lookup_num($self->pool, $self->id, keyname, notfound);
1001 bool lookup_void(Id keyname) {
1002 return pool_lookup_void($self->pool, $self->id, keyname);
1004 %newobject lookup_checksum;
1005 Chksum *lookup_checksum(Id keyname) {
1007 const unsigned char *b = pool_lookup_bin_checksum($self->pool, $self->id, keyname, &type);
1008 return sat_chksum_create_from_bin(type, b);
1010 const char *lookup_location(int *OUTPUT) {
1011 return solvable_get_location($self->pool->solvables + $self->id, OUTPUT);
1013 bool installable() {
1014 return pool_installable($self->pool, pool_id2solvable($self->pool, $self->id));
1016 bool isinstalled() {
1017 Pool *pool = $self->pool;
1018 return pool->installed && pool_id2solvable(pool, $self->id)->repo == pool->installed;
1021 const char * const name;
1023 SWIGINTERN const char *XSolvable_name_get(XSolvable *xs) {
1024 Pool *pool = xs->pool;
1025 return id2str(pool, pool->solvables[xs->id].name);
1030 SWIGINTERN Id XSolvable_nameid_get(XSolvable *xs) {
1031 return xs->pool->solvables[xs->id].name;
1034 const char * const evr;
1036 SWIGINTERN const char *XSolvable_evr_get(XSolvable *xs) {
1037 Pool *pool = xs->pool;
1038 return id2str(pool, pool->solvables[xs->id].evr);
1043 SWIGINTERN Id XSolvable_evrid_get(XSolvable *xs) {
1044 return xs->pool->solvables[xs->id].evr;
1047 const char * const arch;
1049 SWIGINTERN const char *XSolvable_arch_get(XSolvable *xs) {
1050 Pool *pool = xs->pool;
1051 return id2str(pool, pool->solvables[xs->id].arch);
1056 SWIGINTERN Id XSolvable_archid_get(XSolvable *xs) {
1057 return xs->pool->solvables[xs->id].arch;
1060 const char * const vendor;
1062 SWIGINTERN const char *XSolvable_vendor_get(XSolvable *xs) {
1063 Pool *pool = xs->pool;
1064 return id2str(pool, pool->solvables[xs->id].vendor);
1069 SWIGINTERN Id XSolvable_vendorid_get(XSolvable *xs) {
1070 return xs->pool->solvables[xs->id].vendor;
1075 SWIGINTERN Repo *XSolvable_repo_get(XSolvable *xs) {
1076 return xs->pool->solvables[xs->id].repo;
1082 Problem(Solver *solv, Id id) {
1084 p = sat_calloc(1, sizeof(*p));
1089 Id findproblemrule_helper() {
1090 return solver_findproblemrule($self->solv, $self->id);
1092 Queue findallproblemrules_helper(int unfiltered=0) {
1093 Solver *solv = $self->solv;
1098 solver_findallproblemrules(solv, $self->id, &q);
1101 for (i = j = 0; i < q.count; i++)
1103 probr = q.elements[i];
1104 if ((probr >= solv->updaterules && probr < solv->updaterules_end) || (probr >= solv->jobrules && probr < solv->jobrules_end))
1106 q.elements[j++] = probr;
1109 queue_truncate(&q, j);
1113 int solution_count() {
1114 return solver_solution_count($self->solv, $self->id);
1116 #if defined(SWIGPYTHON)
1118 def findproblemrule(self):
1119 return XRule(self.solv, self.findproblemrule_helper())
1120 def findallproblemrules(self, unfiltered=0):
1121 return [ XRule(self.solv, i) for i in self.findallproblemrules_helper(unfiltered) ]
1122 def solutions(self):
1123 return [ Solution(self, i) for i in range(1, self.solution_count() + 1) ];
1129 Solution(Problem *p, Id id) {
1131 s = sat_calloc(1, sizeof(*s));
1133 s->problemid = p->id;
1137 int element_count() {
1138 return solver_solutionelement_count($self->solv, $self->problemid, $self->id);
1140 #if defined(SWIGPYTHON)
1143 return [ Solutionelement(self, i) for i in range(1, self.element_count() + 1) ];
1148 %extend Solutionelement {
1149 Solutionelement(Solution *s, Id id) {
1151 e = sat_calloc(1, sizeof(*e));
1153 e->problemid = s->problemid;
1154 e->solutionid = s->id;
1156 solver_next_solutionelement(e->solv, e->problemid, e->solutionid, e->id - 1, &e->p, &e->rp);
1158 e->type = e->rp ? SOLVER_SOLUTION_REPLACE : SOLVER_SOLUTION_DEINSTALL;
1166 int illegalreplace() {
1167 if ($self->type != SOLVER_SOLUTION_REPLACE || $self->p <= 0 || $self->rp <= 0)
1169 return policy_is_illegal($self->solv, $self->solv->pool->solvables + $self->p, $self->solv->pool->solvables + $self->rp, 0);
1171 %newobject solvable;
1172 XSolvable * const solvable;
1173 %newobject replacement;
1174 XSolvable * const replacement;
1177 SWIGINTERN XSolvable *Solutionelement_solvable_get(Solutionelement *e) {
1178 return new_XSolvable(e->solv->pool, e->p);
1180 SWIGINTERN XSolvable *Solutionelement_replacement_get(Solutionelement *e) {
1181 return new_XSolvable(e->solv->pool, e->rp);
1183 SWIGINTERN int Solutionelement_jobidx_get(Solutionelement *e) {
1184 return (e->p - 1) / 2;
1190 static const int SOLVER_RULE_UNKNOWN = SOLVER_RULE_UNKNOWN;
1191 static const int SOLVER_RULE_RPM = SOLVER_RULE_RPM;
1192 static const int SOLVER_RULE_RPM_NOT_INSTALLABLE = SOLVER_RULE_RPM_NOT_INSTALLABLE;
1193 static const int SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP = SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP;
1194 static const int SOLVER_RULE_RPM_PACKAGE_REQUIRES = SOLVER_RULE_RPM_PACKAGE_REQUIRES;
1195 static const int SOLVER_RULE_RPM_SELF_CONFLICT = SOLVER_RULE_RPM_SELF_CONFLICT;
1196 static const int SOLVER_RULE_RPM_PACKAGE_CONFLICT = SOLVER_RULE_RPM_PACKAGE_CONFLICT;
1197 static const int SOLVER_RULE_RPM_SAME_NAME = SOLVER_RULE_RPM_SAME_NAME;
1198 static const int SOLVER_RULE_RPM_PACKAGE_OBSOLETES = SOLVER_RULE_RPM_PACKAGE_OBSOLETES;
1199 static const int SOLVER_RULE_RPM_IMPLICIT_OBSOLETES = SOLVER_RULE_RPM_IMPLICIT_OBSOLETES;
1200 static const int SOLVER_RULE_RPM_INSTALLEDPKG_OBSOLETES = SOLVER_RULE_RPM_INSTALLEDPKG_OBSOLETES;
1201 static const int SOLVER_RULE_UPDATE = SOLVER_RULE_UPDATE;
1202 static const int SOLVER_RULE_FEATURE = SOLVER_RULE_FEATURE;
1203 static const int SOLVER_RULE_JOB = SOLVER_RULE_JOB;
1204 static const int SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP = SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
1205 static const int SOLVER_RULE_DISTUPGRADE = SOLVER_RULE_DISTUPGRADE;
1206 static const int SOLVER_RULE_INFARCH = SOLVER_RULE_INFARCH;
1207 static const int SOLVER_RULE_CHOICE = SOLVER_RULE_CHOICE;
1208 static const int SOLVER_RULE_LEARNT = SOLVER_RULE_LEARNT;
1210 static const int SOLVER_SOLUTION_JOB = SOLVER_SOLUTION_JOB;
1211 static const int SOLVER_SOLUTION_INFARCH = SOLVER_SOLUTION_INFARCH;
1212 static const int SOLVER_SOLUTION_DISTUPGRADE = SOLVER_SOLUTION_DISTUPGRADE;
1213 static const int SOLVER_SOLUTION_DEINSTALL = SOLVER_SOLUTION_DEINSTALL;
1214 static const int SOLVER_SOLUTION_REPLACE = SOLVER_SOLUTION_REPLACE;
1216 static const int POLICY_ILLEGAL_DOWNGRADE = POLICY_ILLEGAL_DOWNGRADE;
1217 static const int POLICY_ILLEGAL_ARCHCHANGE = POLICY_ILLEGAL_ARCHCHANGE;
1218 static const int POLICY_ILLEGAL_VENDORCHANGE = POLICY_ILLEGAL_VENDORCHANGE;
1223 #if defined(SWIGPYTHON)
1225 def solve(self, jobs):
1227 for job in jobs: j += [job.how, job.what]
1228 nprob = self.solve_helper(j)
1229 return [ Problem(self, pid) for pid in range(1, nprob + 1) ]
1232 int solve_helper(Queue jobs) {
1233 solver_solve($self, &jobs);
1234 return solver_problem_count($self);
1236 %newobject transaction;
1237 Transaction *transaction() {
1239 t = sat_calloc(1, sizeof(*t));
1240 transaction_init_clone(t, &$self->trans);
1245 %extend Transaction {
1246 static const int SOLVER_TRANSACTION_IGNORE = SOLVER_TRANSACTION_IGNORE;
1247 static const int SOLVER_TRANSACTION_ERASE = SOLVER_TRANSACTION_ERASE;
1248 static const int SOLVER_TRANSACTION_REINSTALLED = SOLVER_TRANSACTION_REINSTALLED;
1249 static const int SOLVER_TRANSACTION_DOWNGRADED = SOLVER_TRANSACTION_DOWNGRADED;
1250 static const int SOLVER_TRANSACTION_CHANGED = SOLVER_TRANSACTION_CHANGED;
1251 static const int SOLVER_TRANSACTION_UPGRADED = SOLVER_TRANSACTION_UPGRADED;
1252 static const int SOLVER_TRANSACTION_OBSOLETED = SOLVER_TRANSACTION_OBSOLETED;
1253 static const int SOLVER_TRANSACTION_INSTALL = SOLVER_TRANSACTION_INSTALL;
1254 static const int SOLVER_TRANSACTION_REINSTALL = SOLVER_TRANSACTION_REINSTALL;
1255 static const int SOLVER_TRANSACTION_DOWNGRADE = SOLVER_TRANSACTION_DOWNGRADE;
1256 static const int SOLVER_TRANSACTION_CHANGE = SOLVER_TRANSACTION_CHANGE;
1257 static const int SOLVER_TRANSACTION_UPGRADE = SOLVER_TRANSACTION_UPGRADE;
1258 static const int SOLVER_TRANSACTION_OBSOLETES = SOLVER_TRANSACTION_OBSOLETES;
1259 static const int SOLVER_TRANSACTION_MULTIINSTALL = SOLVER_TRANSACTION_MULTIINSTALL;
1260 static const int SOLVER_TRANSACTION_MULTIREINSTALL = SOLVER_TRANSACTION_MULTIREINSTALL;
1261 static const int SOLVER_TRANSACTION_MAXTYPE = SOLVER_TRANSACTION_MAXTYPE;
1262 static const int SOLVER_TRANSACTION_SHOW_ACTIVE = SOLVER_TRANSACTION_SHOW_ACTIVE;
1263 static const int SOLVER_TRANSACTION_SHOW_ALL = SOLVER_TRANSACTION_SHOW_ALL;
1264 static const int SOLVER_TRANSACTION_SHOW_OBSOLETES = SOLVER_TRANSACTION_SHOW_OBSOLETES;
1265 static const int SOLVER_TRANSACTION_SHOW_MULTIINSTALL = SOLVER_TRANSACTION_SHOW_MULTIINSTALL;
1266 static const int SOLVER_TRANSACTION_CHANGE_IS_REINSTALL = SOLVER_TRANSACTION_CHANGE_IS_REINSTALL;
1267 static const int SOLVER_TRANSACTION_MERGE_VENDORCHANGES = SOLVER_TRANSACTION_MERGE_VENDORCHANGES;
1268 static const int SOLVER_TRANSACTION_MERGE_ARCHCHANGES = SOLVER_TRANSACTION_MERGE_ARCHCHANGES;
1269 static const int SOLVER_TRANSACTION_RPM_ONLY = SOLVER_TRANSACTION_RPM_ONLY;
1270 static const int SOLVER_TRANSACTION_ARCHCHANGE = SOLVER_TRANSACTION_ARCHCHANGE;
1271 static const int SOLVER_TRANSACTION_VENDORCHANGE = SOLVER_TRANSACTION_VENDORCHANGE;
1272 static const int SOLVER_TRANSACTION_KEEP_ORDERDATA = SOLVER_TRANSACTION_KEEP_ORDERDATA;
1274 transaction_free($self);
1278 return $self->steps.count == 0;
1280 Queue classify_helper(int mode) {
1283 transaction_classify($self, mode, &q);
1286 Queue classify_pkgs_helper(int mode, Id cl, Id from, Id to) {
1289 transaction_classify_pkgs($self, mode, cl, from, to, &q);
1292 %newobject othersolvable;
1293 XSolvable *othersolvable(XSolvable *s) {
1294 Id op = transaction_obs_pkg($self, s->id);
1295 return new_XSolvable($self->pool, op);
1297 #if defined(SWIGPYTHON)
1299 def classify(self, mode = 0):
1301 cr = self.classify_helper(mode)
1302 for type, cnt, fromid, toid in zip(*([iter(cr)] * 4)):
1303 if type != self.SOLVER_TRANSACTION_IGNORE:
1304 r.append([ type, [ self.pool.solvables[j] for j in self.classify_pkgs_helper(mode, type, fromid, toid) ], fromid, toid ])
1308 Queue installedresult_helper(int *OUTPUT) {
1311 *OUTPUT = transaction_installedresult(self, &q);
1314 #if defined(SWIGPYTHON)
1316 def installedresult(self):
1317 r = self.installedresult_helper()
1319 rn = [ self.pool.solvables[r[i]] for i in range(0, newpkgs) ]
1320 rk = [ self.pool.solvables[r[i]] for i in range(newpkgs, len(r)) ]
1324 Queue steps_helper() {
1326 queue_init_clone(&q, &$self->steps);
1329 int steptype(XSolvable *s, int mode) {
1330 return transaction_type($self, s->id, mode);
1332 #if defined(SWIGPYTHON)
1335 return [ self.pool.solvables[i] for i in self.steps_helper() ]
1338 int calc_installsizechange() {
1339 return transaction_calc_installsizechange($self);
1344 XRule(Solver *solv, Id id) {
1347 XRule *xr = sat_calloc(1, sizeof(*xr));
1352 %apply Id *OUTPUT { Id *source, Id *target, Id *dep };
1353 int info_helper(Id *source, Id *target, Id *dep) {
1354 return solver_ruleinfo($self->solv, $self->id, source, target, dep);
1356 #if defined(SWIGPYTHON)
1359 type, source, target, dep = self.info_helper()
1361 source = self.solv.pool.solvables[source]
1363 target = self.solv.pool.solvables[target]
1364 return type, source, target, dep
1371 XRepodata(Repo *repo, Id id) {
1372 XRepodata *xr = sat_calloc(1, sizeof(*xr));
1378 return repodata_new_handle($self->repo->repodata + $self->id);
1380 void set_id(Id solvid, Id keyname, Id id) {
1381 repodata_set_id($self->repo->repodata + $self->id, solvid, keyname, id);
1383 void set_str(Id solvid, Id keyname, const char *str) {
1384 repodata_set_str($self->repo->repodata + $self->id, solvid, keyname, str);
1386 void set_poolstr(Id solvid, Id keyname, const char *str) {
1387 repodata_set_poolstr($self->repo->repodata + $self->id, solvid, keyname, str);
1389 void add_idarray(Id solvid, Id keyname, Id id) {
1390 repodata_add_idarray($self->repo->repodata + $self->id, solvid, keyname, id);
1392 void add_flexarray(Id solvid, Id keyname, Id handle) {
1393 repodata_add_flexarray($self->repo->repodata + $self->id, solvid, keyname, handle);
1395 void set_bin_checksum(Id solvid, Id keyname, Chksum *chksum) {
1396 const unsigned char *buf = sat_chksum_get(chksum, 0);
1398 repodata_set_bin_checksum($self->repo->repodata + $self->id, solvid, keyname, sat_chksum_get_type(chksum), buf);
1400 const char *lookup_str(Id solvid, Id keyname) {
1401 return repodata_lookup_str($self->repo->repodata + $self->id, solvid, keyname);
1403 Queue lookup_idarray(Id solvid, Id keyname) {
1406 repodata_lookup_idarray($self->repo->repodata + $self->id, solvid, keyname, &r);
1409 %newobject lookup_checksum;
1410 Chksum *lookup_checksum(Id solvid, Id keyname) {
1412 const unsigned char *b = repodata_lookup_bin_checksum($self->repo->repodata + $self->id, solvid, keyname, &type);
1413 return sat_chksum_create_from_bin(type, b);
1415 void internalize() {
1416 repodata_internalize($self->repo->repodata + $self->id);
1418 void create_stubs() {
1419 repodata_create_stubs($self->repo->repodata + $self->id);
1421 void write(FILE *fp) {
1422 repodata_write($self->repo->repodata + $self->id, fp, repo_write_stdkeyfilter, 0);
1424 bool read_solv_flags(FILE *fp, int flags = 0) {
1425 Repodata *data = $self->repo->repodata + $self->id;
1426 int r, oldstate = data->state;
1427 data->state = REPODATA_LOADING;
1428 r = repo_add_solv_flags(data->repo, fp, flags | REPO_USE_LOADING);
1430 data->state = oldstate;
1433 void extend_to_repo() {
1434 Repodata *data = $self->repo->repodata + $self->id;
1435 repodata_extend_block(data, data->repo->start, data->repo->end - data->repo->start);