'\" t
.\" Title: Libsolv-Bindings
.\" Author: [see the "Author" section]
-.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\" Date: 02/28/2018
+.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
+.\" Date: 01/31/2023
.\" Manual: LIBSOLV
.\" Source: libsolv
.\" Language: English
.\"
-.TH "LIBSOLV\-BINDINGS" "3" "02/28/2018" "libsolv" "LIBSOLV"
+.TH "LIBSOLV\-BINDINGS" "3" "01/31/2023" "libsolv" "LIBSOLV"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
libsolv-bindings \- access libsolv from perl/python/ruby
.SH "DESCRIPTION"
.sp
-Libsolv\(cqs language bindings offer an abstract, object orientated interface to the library\&. The supported languages are currently perl, python, and ruby\&. All example code (except in the specifics sections, of course) lists first the \(lqC\-ish\(rq interface, then the syntax for perl, python, and ruby (in that order)\&.
+Libsolv\(cqs language bindings offer an abstract, object orientated interface to the library\&. The supported languages are currently perl, python, ruby and tcl\&. All example code (except in the specifics sections, of course) lists first the \(lqC\-ish\(rq interface, then the syntax for perl, python, and ruby (in that order)\&.
.SH "PERL SPECIFICS"
.sp
Libsolv\(cqs perl bindings can be loaded with the following statement:
.sp
As a downside of this approach, iterator objects cannot have attributes\&.
.sp
-If an array needs to be passed to a method it is usually done by reference, if a method returns an array it returns it on the stack:
+If an array needs to be passed to a method it is usually done by reference, if a method returns an array it returns it on the perl stack:
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-Constants are attributes of the classes:
+Constants are attributes of the corresponding classes:
.sp
.if n \{\
.RS 4
.RS 4
.\}
.nf
-\fI$pool\fR \fBset_flag\fR \fI$solv::Pool_POOL_FLAG_OBSOLETEUSESCOLORS\fR \fB1\fR
+\fI$pool\fR \fBset_flag\fR \fI$solv::Pool_POOL_FLAG_OBSOLETEUSESCOLORS\fR \fB1\fR
\fBputs [\fR\fI$solvable\fR \fBlookup_str\fR \fI$solv::SOLVABLE_SUMMARY\fR\fB]\fR
.fi
.if n \{\
.PP
\fBSOLVID_POS\fR
.RS 4
-Use the data position stored inside of the pool instead of accessing some solvable by Id\&. The bindings have the Datapos objects as an abstraction mechanism, so you do not need this constant\&.
+Use the data position stored inside of the pool instead of accessing some solvable by Id\&. The bindings have the Datapos objects as an abstraction mechanism, so you most likely do not need this constant\&.
.RE
.sp
Constant string Ids
.PP
\fBPOOL_FLAG_FORBIDSELFCONFLICTS\fR
.RS 4
-Disallow the installation of packages that conflict with themselves\&. Debian always allows self\-conflicting packages, rpm used to forbid them but switched to also allowing them recently\&.
+Disallow the installation of packages that conflict with themselves\&. Debian always allows self\-conflicting packages, rpm used to forbid them but switched to also allowing them since rpm\-4\&.9\&.0\&.
.RE
.PP
\fBPOOL_FLAG_OBSOLETEUSESPROVIDES\fR
.PP
\fBPOOL_FLAG_OBSOLETEUSESCOLORS\fR
.RS 4
-Rpm\(cqs multilib implementation (used in RedHat and Fedora) distinguishes between 32bit and 64bit packages (the terminology is that they have a different color)\&. If obsoleteusescolors is set, packages with different colors will not obsolete each other\&.
+Rpm\(cqs multilib implementation distinguishes between 32bit and 64bit packages (the terminology is that they have a different color)\&. If obsoleteusescolors is set, packages with different colors will not obsolete each other\&.
.RE
.PP
\fBPOOL_FLAG_IMPLICITOBSOLETEUSESCOLORS\fR
.PP
\fBPOOL_FLAG_NOINSTALLEDOBSOLETES\fR
.RS 4
-New versions of rpm consider the obsoletes of installed packages when checking for dependency, thus you may not install a package that is obsoleted by some other installed package, unless you also erase the other package\&.
+Since version 4\&.9\&.0 rpm considers the obsoletes of installed packages when checking for dependency conflicts, thus you may not install a package that is obsoleted by some other installed package unless you also erase the other package\&.
.RE
.PP
\fBPOOL_FLAG_HAVEDISTEPOCH\fR
.PP
\fBPOOL_FLAG_NOOBSOLETESMULTIVERSION\fR
.RS 4
-If a package is installed in multiversionmode, rpm used to ignore both the implicit obsoletes and the obsolete dependency of a package\&. This was changed to ignoring just the implicit obsoletes, thus you may install multiple versions of the same name, but obsoleted packages still get removed\&.
+If a package is installed in multiversion mode, rpm used to ignore both the implicit obsoletes and the obsolete dependency of a package\&. This was changed to ignoring just the implicit obsoletes, thus you may install multiple versions of the same name, but obsoleted packages still get removed\&.
.RE
.PP
\fBPOOL_FLAG_ADDFILEPROVIDESFILTERED\fR
.RS 4
Make the addfileprovides method only add files from the standard locations (i\&.e\&. the \(lqbin\(rq and \(lqetc\(rq directories)\&. This is useful if you have only few packages that use non\-standard file dependencies, but you still want the fast speed that addfileprovides() generates\&.
.RE
+.PP
+\fBPOOL_FLAG_NOWHATPROVIDESAUX\fR
+.RS 4
+Disable the creation of the auxillary whatprovides index\&. This saves a bit of memory but also makes the whatprovides lookups a bit slower\&.
+.RE
+.PP
+\fBPOOL_FLAG_WHATPROVIDESWITHDISABLED\fR
+.RS 4
+Make the whatprovides index also contain disabled packages\&. This means that you do not need to recreate the index if a package is enabled/disabled, i\&.e\&. the pool→considered bitmap is changed\&.
+.RE
.SS "METHODS"
.sp
.if n \{\
.RE
.\}
.sp
-Set/get a pool specific flag\&. The flags define how the system works, e\&.g\&. how the package manager treats obsoletes\&. The default flags should be sane for most applications, but in some cases you may want to tweak a flag, for example if you want to solv package dependencies for some other system than yours\&.
+Set/get a pool specific flag\&. The flags define how the system works, e\&.g\&. how the package manager treats obsoletes\&. The default flags should be sane for most applications, but in some cases you may want to tweak a flag, for example if you want to solve package dependencies for some other system\&.
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-Create the internal \(lqwhatprovides\(rq hash over all of the provides of all packages\&. This method must be called before doing any lookups on provides\&. It\(cqs encouraged to do it right after all repos are set up, usually right after the call to addfileprovides()\&.
+Create the internal \(lqwhatprovides\(rq hash over all of the provides of all installable packages\&. This method must be called before doing any lookups on provides\&. It\(cqs encouraged to do it right after all repos are set up, usually right after the call to addfileprovides()\&.
.sp
.if n \{\
.RS 4
.RS 4
.\}
.nf
+\fBSolvable *best_solvables(Solvable *\fR\fIsolvables\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->best_solvables(\fR\fI$solvables\fR\fB)\fR;
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.best_solvables(\fR\fIsolvables\fR\fB)\fR
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.best_solvables(\fR\fIsolvables\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Filter list of solvables by repo priority, architecture and version\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *whatcontainsdep(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatcontainsdep(\fR\fI$keyname\fR\fB,\fR \fI$dep\fR\fB)\fR;
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatcontainsdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatcontainsdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all solvables for which keyname contains the dependency\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *whatmatchesdep(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatmatchesdep(\fR\fI$keyname\fR\fB,\fR \fI$sdep\fR\fB)\fR;
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchesdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchesdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all solvables that have dependencies in keyname that match the dependency\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *whatmatchessolvable(Id\fR \fIkeyname\fR\fB, Solvable\fR \fIsolvable\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatmatchessolvable(\fR\fI$keyname\fR\fB,\fR \fI$solvable\fR\fB)\fR;
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchessolvable(\fR\fIkeyname\fR\fB,\fR \fIsolvable\fR\fB)\fR
+\fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchessolvable(\fR\fIkeyname\fR\fB,\fR \fIsolvable\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all solvables that match package dependencies against solvable\(cqs provides\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fBId *matchprovidingids(const char *\fR\fImatch\fR\fB, int\fR \fIflags\fR\fB)\fR
my \fI@ids\fR \fB=\fR \fI$pool\fR\fB\->matchprovidingids(\fR\fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
\fIids\fR \fB=\fR \fIpool\fR\fB\&.matchprovidingids(\fR\fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
.RE
.\}
.sp
-Manually set an namespace provides entry in the whatprovides index\&.
+Manually set a namespace provides entry in the whatprovides index\&.
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-Flush the cache of all namespacprovudes matching the specified namespace dependency\&. You can use zero as a wildcard argument\&.
+Flush the cache of all namespaceprovides matching the specified namespace dependency\&. You can use zero as a wildcard argument\&.
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-Create a new Job object\&. Kind of low level, in most cases you would use a Selection or Dep job constructor instead\&.
+Create a new Job object\&. Kind of low level, in most cases you would instead use a Selection or Dep job constructor\&.
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-Create a selection by matching package dependencies against the specified string\&. This can be used if you want to match other dependency types than "provides"\&.
+Create a selection by matching package dependencies against the specified string\&. This can be used if you want to match other dependency types than \(lqprovides\(rq\&.
.sp
.if n \{\
.RS 4
.\}
.nf
\fBSelection matchdepid(DepId\fR \fIdep\fR\fB, int\fR \fIflags\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
-my \fI$sel\fR \fB=\fR \fI$pool\fR\fB\->matchdepid(\fR\fIdep\fR\fB,\fR \fI$flags\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+my \fI$sel\fR \fB=\fR \fI$pool\fR\fB\->matchdepid(\fR\fI$dep\fR\fB,\fR \fI$flags\fR\fB,\fR \fI$keyname\fR\fB)\fR;
\fIsel\fR \fB=\fR \fIpool\fR\fB\&.matchdepid(\fR\fIdep\fR\fB,\fR \fIflags\fR\fB,\fR \fIkeyname\fR\fB)\fR
\fIsel\fR \fB=\fR \fIpool\fR\fB\&.matchdepid(\fR\fIdep\fR\fB,\fR \fIflags\fR\fB,\fR \fIkeyname\fR\fB)\fR
.fi
.RS 4
.\}
.nf
+\fBSelection matchsolvable(Solvable\fR \fIsolvable\fR\fB, int\fR \fIflags\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
+my \fI$sel\fR \fB=\fR \fI$pool\fR\fB\->matchsolvable(\fR\fI$solvable\fR\fB,\fR \fI$flags\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fIsel\fR \fB=\fR \fIpool\fR\fB\&.matchsolvable(\fR\fIsolvable\fR\fB,\fR \fIflags\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fIsel\fR \fB=\fR \fIpool\fR\fB\&.matchsolvable(\fR\fIsolvable\fR\fB,\fR \fIflags\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Create a selection by matching package dependencies against the specified solvable\(cqs provides\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fBvoid setpooljobs(Jobs *\fR\fIjobs\fR\fB)\fR
\fI$pool\fR\fB\->setpooljobs(\e\fR\fI@jobs\fR\fB)\fR;
\fIpool\fR\fB\&.setpooljobs(\fR\fIjobs\fR\fB)\fR
.RE
.\}
.sp
-Get/Set fixed jobs stored in the pool\&. Those jobs are automatically appended to all solver jobs, they are meant for fixed configurations like which packages can be multiversion installed, which packages were userinstalled or must not be erased\&.
+Get/Set fixed jobs stored in the pool\&. Those jobs are automatically appended to all solver jobs, they are meant for fixed configurations like which packages can be multiversion installed, which packages were userinstalled, or which packages must not be erased\&.
.sp
.if n \{\
.RS 4
.\}
.sp
Decrement the reference count of the appdata object\&. This can be used to break circular references (e\&.g\&. if the pool\(cqs appdata value points to some meta data structure that contains a pool handle)\&. If used incorrectly, this method can lead to application crashes, so beware\&. (This method is a no\-op for ruby and tcl\&.)
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId *get_considered_list()\fR
+my \fI@ids\fR \fB=\fR \fI$pool\fR\fB\->get_considered_list()\fR;
+\fIids\fR \fB=\fR \fIpool\fR\fB\&.get_considered_list()\fR
+\fIids\fR \fB=\fR \fIpool\fR\fB\&.get_considered_list()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid set_considered_list(Id *\fR\fIids\fR\fB)\fR
+\fI$pool\fR\fB\->set_considered_list(\e\fR\fI@ids\fR\fB)\fR;
+\fIpool\fR\fB\&.set_considered_list(\fR\fIids\fR\fB)\fR
+\fIpool\fR\fB\&.set_considered_list(\fR\fIids\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Get/set the list of solvables that are eligible for installation\&. Note that you need to recreate the whatprovides hash after changing the list\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId *get_disabled_list()\fR
+my \fI@ids\fR \fB=\fR \fI$pool\fR\fB\->get_disabled_list()\fR;
+\fIids\fR \fB=\fR \fIpool\fR\fB\&.get_disabled_list()\fR
+\fIids\fR \fB=\fR \fIpool\fR\fB\&.get_disabled_list()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid set_disabled_list(Id *\fR\fIids\fR\fB)\fR
+\fI$pool\fR\fB\->set_disabled_list(\e\fR\fI@ids\fR\fB)\fR;
+\fIpool\fR\fB\&.set_disabled_list(\fR\fIids\fR\fB)\fR
+\fIpool\fR\fB\&.set_disabled_list(\fR\fIids\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Get/set the list of solvables that are not eligible for installation\&. This is basically the inverse of the \(lqconsidered\(rq methods above, i\&.e\&. calling \(lqset_disabled_list()\(rq with an empty list will make all solvables eligible for installation\&. Note you need to recreate the whatprovides hash after changing the list\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *solvableset2str(Solvable *\fR\fIsolvables\fR\fB)\fR
+my \fI$str\fR \fB=\fR \fI$pool\fR\fB\->solvableset2str(\fR\fI$solvables\fR\fB)\fR;
+\fIstr\fR \fB=\fR \fIpool\fR\fB\&.solvableset2str(\fR\fIsolvables\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIpool\fR\fB\&.solvableset2str(\fR\fIsolvables\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing a list of solvables\&. The method tries to reduce the output by using version ranges if possible\&.
.SS "DATA RETRIEVAL METHODS"
.sp
In the following functions, the \fIkeyname\fR argument describes what to retrieve\&. For the standard cases you can use the available Id constants\&. For example,
.RS 4
.\}
.nf
+\fBconst char *solvidset2str(Id *\fR\fIsolvids\fR\fB)\fR
+my \fI$str\fR \fB=\fR \fI$pool\fR\fB\->solvidset2str(\e\fR\fI@solvids\fR\fB)\fR;
+\fIstr\fR \fB=\fR \fIpool\fR\fB\&.solvidset2str(\fR\fIsolvids\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIpool\fR\fB\&.solvidset2str(\fR\fIsolvids\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing a list of solvables\&. The method tries to reduce the output by using version ranges if possible\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fBId str2id(const char *\fR\fIstr\fR\fB, bool\fR \fIcreate\fR \fB= 1)\fR
my \fI$id\fR \fB=\fR \fIpool\fR\fB\->str2id(\fR\fI$string\fR\fB)\fR;
\fIid\fR \fB=\fR \fIpool\fR\fB\&.str2id(\fR\fIstring\fR\fB)\fR
.RE
.\}
.sp
-Create a \(lqrelational\(rq dependency\&. Such dependencies consist of a name part, the \fIflags\fR describing the relation, and a version part\&. The flags are:
+Create a \(lqrelational\(rq dependency\&. Such dependencies consist of a name part, \fIflags\fR describing the relation, and a version part\&. The flags are:
.sp
.if n \{\
.RS 4
.\}
.sp
The id of this dependency\&.
-.SH "METHODS"
+.SS "METHODS"
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-Create a relational dependency from to string dependencies and a flags argument\&. See the pool\(cqs rel2id method for a description of the flags\&.
+Create a relational dependency from the caller dependency, the flags, and a dependency describing the \(lqversion\(rq part\&. See the pool\(cqs rel2id method for a description of the flags\&.
.sp
.if n \{\
.RS 4
.RE
.\}
.sp
-The dependencies are equal if they are part of the same pool and have the same ids\&.
+Two dependencies are equal if they are part of the same pool and have the same ids\&.
.SH "THE REPOSITORY CLASS"
.sp
A Repository describes a group of packages, normally coming from the same source\&. Repositories are created by the Pool\(cqs add_repo() method\&.
.PP
\fBREPO_REUSE_REPODATA\fR
.RS 4
-Reuse the last repository data area (\(lqrepodata\(rq) instead of creating a new one\&.
+Reuse the last repository data area (\(lqrepodata\(rq) instead of creating a new area\&.
.RE
.PP
\fBREPO_NO_INTERNALIZE\fR
.nf
\fBId lookup_id(Id\fR \fIkeyname\fR\fB)\fR
my \fI$id\fR \fB=\fR \fI$solvable\fR\fB\->lookup_id(\fR\fI$keyname\fR\fB)\fR;
-\fIid\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_id(\fR\fIsolvid\fR\fB)\fR
-\fIid\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_id(\fR\fIsolvid\fR\fB)\fR
+\fIid\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_id(\fR\fIkeyname\fR\fB)\fR
+\fIid\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_id(\fR\fIkeyname\fR\fB)\fR
.fi
.if n \{\
.RE
.RS 4
.\}
.nf
-\fBunsigned long long lookup_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInotfound\fR \fB= 0)\fR
+\fBunsigned long long lookup_num(Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInotfound\fR \fB= 0)\fR
my \fI$num\fR \fB=\fR \fI$solvable\fR\fB\->lookup_num(\fR\fI$keyname\fR\fB)\fR;
\fInum\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_num(\fR\fIkeyname\fR\fB)\fR
\fInum\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_num(\fR\fIkeyname\fR\fB)\fR
.RS 4
.\}
.nf
-\fBconst char *lookup_location(unsigned int *\fR\fIOUTPUT\fR\fB)\fR;
-my \fB(\fR\fI$location\fR\fB,\fR \fI$medianr\fR\fB) =\fR \fI$solvable\fR\fB\->lookup_location()\fR;
-\fIlocation\fR\fB,\fR \fImedianr\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR
-\fIlocation\fR\fB,\fR \fImedianr\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR
+\fBconst char *lookup_location(unsigned int *\fR\fIOUTPUT\fR\fB)\fR
+my \fB(\fR\fI$location\fR\fB,\fR \fI$mediano\fR\fB) =\fR \fI$solvable\fR\fB\->lookup_location()\fR;
+\fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR
+\fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR
.fi
.if n \{\
.RE
.RS 4
.\}
.nf
-\fBconst char *lookup_sourcepkg()\fR;
+\fBconst char *lookup_sourcepkg()\fR
my \fI$sourcepkg\fR \fB=\fR \fI$solvable\fR\fB\->lookup_sourcepkg()\fR;
\fIsourcepkg\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_sourcepkg()\fR
\fIsourcepkg\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_sourcepkg()\fR
.RS 4
.\}
.nf
-\fBvoid add_deparray(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR;
+\fBvoid add_deparray(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
\fI$solvable\fR\fB\->add_deparray(\fR\fI$keyname\fR\fB,\fR \fI$dep\fR\fB)\fR;
\fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
\fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid unset(Id\fR \fIkeyname\fR\fB)\fR;
+\fBvoid unset(Id\fR \fIkeyname\fR\fB)\fR
\fI$solvable\fR\fB\->unset(\fR\fI$keyname\fR\fB)\fR;
\fIsolvable\fR\fB\&.unset(\fR\fIkeyname\fR\fB)\fR
\fIsolvable\fR\fB\&.unset(\fR\fIkeyname\fR\fB)\fR
.RS 4
.\}
.nf
-\fBbool installable()\fR;
+\fBbool installable()\fR
\fI$solvable\fR\fB\->installable()\fR
\fIsolvable\fR\fB\&.installable()\fR
\fIsolvable\fR\fB\&.installable?\fR
.RS 4
.\}
.nf
-\fBbool isinstalled()\fR;
+\fBbool isinstalled()\fR
\fI$solvable\fR\fB\->isinstalled()\fR
\fIsolvable\fR\fB\&.isinstalled()\fR
\fIsolvable\fR\fB\&.isinstalled?\fR
.\}
.nf
\fBvoid skip_solvable()\fR;
-\fI$di\fR\fB\->kip_solvable()\fR;
+\fI$di\fR\fB\->skip_solvable()\fR;
\fIdi\fR\fB\&.skip_solvable()\fR
\fIdi\fR\fB\&.skip_solvable()\fR
.fi
.RS 4
.\}
.nf
-\fBDatapos pos()\fR;
+\fBDatapos pos()\fR
my \fI$pos\fR \fB=\fR \fI$d\fR\fB\->pos()\fR;
\fIpos\fR \fB=\fR \fId\fR\fB\&.pos()\fR
\fIpos\fR \fB=\fR \fId\fR\fB\&.pos()\fR
.RS 4
.\}
.nf
-\fBDatapos parentpos()\fR;
+\fBDatapos parentpos()\fR
my \fI$pos\fR \fB=\fR \fI$d\fR\fB\->parentpos()\fR;
\fIpos\fR \fB=\fR \fId\fR\fB\&.parentpos()\fR
\fIpos\fR \fB=\fR \fId\fR\fB\&.parentpos()\fR
.\}
.sp
Back pointer to pool\&.
-.SS "METHODS"
.sp
.if n \{\
.RS 4
.\}
.nf
-\fBint flags()\fR
-my \fI$flags\fR \fB=\fR \fI$sel\fR\fB\->flags()\fR;
-\fIflags\fR \fB=\fR \fIsel\fR\fB\&.flags()\fR
-\fIflags\fR \fB=\fR \fIsel\fR\fB\&.flags()\fR
+\fBint flags;\fR /* read only */
+\fI$sel\fR\fB\->{flags}\fR
+\fIflags\fR \fB=\fR \fIsel\fR\fB\&.flags\fR
+\fIflags\fR \fB=\fR \fIsel\fR\fB\&.flags\fR
.fi
.if n \{\
.RE
.\}
.sp
-Return the result flags of the selection\&. The flags are a subset of the ones used when creating the selection, they describe which method was used to get the result\&. For example, if you create the selection with \(lqSELECTION_NAME | SELECTION_PROVIDES\(rq, the resulting flags will either be SELECTION_NAME or SELECTION_PROVIDES depending if there was a package that matched the name or not\&. If there was no match at all, the flags will be zero\&.
+The result flags of the selection\&. The flags are a subset of the ones used when creating the selection, they describe which method was used to get the result\&. For example, if you create the selection with \(lqSELECTION_NAME | SELECTION_PROVIDES\(rq, the resulting flags will either be SELECTION_NAME or SELECTION_PROVIDES depending if there was a package that matched the name or not\&. If there was no match at all, the flags will be zero\&.
+.SS "METHODS"
.sp
.if n \{\
.RS 4
.RS 4
.\}
.nf
+\fBvoid matchsolvable(Solvable\fR \fIsolvable\fR\fB, int\fR \fIflags\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
+\fI$sel\fR\fB\->matchsolvable(\fR\fI$solvable\fR\fB,\fR \fI$flags\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fIsel\fR\fB\&.matchsolvable(\fR\fIsolvable\fR\fB,\fR \fIflags\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fIsel\fR\fB\&.matchsolvable(\fR\fIsolvable\fR\fB,\fR \fIflags\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Do a matchsolvable operation and combine the result with the current selection\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fB<stringification>\fR
my \fI$str\fR \fB=\fR \fI$sel\fR\fB\->str\fR;
\fIstr\fR \fB= str(\fR\fIsel\fR\fB)\fR
Avoid the specified packages if the solver encounters an alternative\&. This can also be used to block recommended or supplemented packages from being installed\&.
.RE
.PP
+\fBSOLVER_EXCLUDEFROMWEAK\fR
+.RS 4
+Avoid the specified packages to satisfy recommended or supplemented dependencies\&. Unlike SOLVER_DISFAVOR, it does not interfere with other rules\&.
+.RE
+.PP
\fBSOLVER_JOBMASK\fR
.RS 4
A mask containing all the above action bits\&.
.RS 4
.\}
.nf
-\fBbool isemptyupdate()\fR;
+\fBbool isemptyupdate()\fR
\fI$job\fR\fB\->isemptyupdate()\fR
\fIjob\fR\fB\&.isemptyupdate()\fR
\fIjob\fR\fB\&.isemptyupdate?\fR
.PP
\fBSOLVER_RULE_PKG\fR
.RS 4
-A package dependency rule\&.
+A rule generated because of a package dependency\&.
.RE
.PP
\fBSOLVER_RULE_UPDATE\fR
.PP
\fBSOLVER_RULE_PKG_REQUIRES\fR
.RS 4
-Similar to SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP, but in this case some packages provided the dependency but none of them could be installed due to other dependency issues\&.
+The package contains a required dependency which was provided by at least one package\&.
.RE
.PP
\fBSOLVER_RULE_PKG_SELF_CONFLICT\fR
.PP
\fBSOLVER_RULE_PKG_CONFLICTS\fR
.RS 4
-To fulfill the dependencies two packages need to be installed, but one of the packages contains a conflict with the other one\&.
+The package conflices with some other package\&.
.RE
.PP
\fBSOLVER_RULE_PKG_SAME_NAME\fR
.RS 4
-The dependencies can only be fulfilled by multiple versions of a package, but installing multiple versions of the same package is not allowed\&.
+This rules make sure that only one version of a package is installed in the system\&.
.RE
.PP
\fBSOLVER_RULE_PKG_OBSOLETES\fR
To fulfill the dependencies a package needs to be installed that is obsoleted by an installed package\&. See the POOL_FLAG_NOINSTALLEDOBSOLETES flag\&.
.RE
.PP
+\fBSOLVER_RULE_PKG_RECOMMENDS\fR
+.RS 4
+The package contains a recommended dependency\&.
+.RE
+.PP
+\fBSOLVER_RULE_PKG_SUPPLEMENTS\fR
+.RS 4
+The package contains a dependency to specify it supplements another package\&.
+.RE
+.PP
+\fBSOLVER_RULE_PKG_CONSTRAINS\fR
+.RS 4
+The package contains a constraint against some other package (disttype conda)\&.
+.RE
+.PP
\fBSOLVER_RULE_JOB_NOTHING_PROVIDES_DEP\fR
.RS 4
The user asked for installation of a package providing a specific dependency, but no available package provides it\&.
.RS 4
This is a special case of SOLVER_REASON_WEAKDEP\&.
.RE
+.PP
+\fBSOLVER_REASON_UNSOLVABLE\fR
+.RS 4
+This is a special case where a rule cannot be fulfilled\&.
+.RE
+.PP
+\fBSOLVER_REASON_PREMISE\fR
+.RS 4
+This is a special case for the premises of learnt rules\&.
+.RE
.SS "ATTRIBUTES"
.sp
.if n \{\
.RS 4
.\}
.nf
-\fBint\fR \fIreason\fR \fB= describe_decision(Solvable *\fR\fIs\fR\fB, Rule *\fR\fIOUTPUT\fR\fB)\fR
-my \fB(\fR\fI$reason\fR\fB,\fR \fI$rule\fR\fB) =\fR \fI$solver\fR\fB\->describe_decision(\fR\fI$solvable\fR\fB)\fR;
-\fB(\fR\fIreason\fR\fB,\fR \fIrule\fR\fB) =\fR \fIsolver\fR\fB\&.describe_decision(\fR\fIsolvable\fR\fB)\fR
-\fB(\fR\fIreason\fR\fB,\fR \fIrule\fR\fB) =\fR \fIsolver\fR\fB\&.describe_decision(\fR\fIsolvable\fR\fB)\fR
+\fBSolvable *get_recommended(bool\fR \fInoselected\fR\fB=0)\fR
+my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_recommended()\fR;
+\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_recommended()\fR
+\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_recommended()\fR
.fi
.if n \{\
.RE
.\}
.sp
-Return the reason why a specific solvable was installed or erased\&. For most of the reasons the rule that triggered the decision is also returned\&.
+Return all solvables that are recommended by the solver run result\&. This includes solvables included in the result; set noselected if you want to filter those\&.
.sp
.if n \{\
.RS 4
.\}
.nf
-\fBSolvable *get_recommended(bool\fR \fInoselected\fR\fB=0)\fR;
-my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_recommended()\fR;
-\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_recommended()\fR
-\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_recommended()\fR
+\fBSolvable *get_suggested(bool\fR \fInoselected\fR\fB=0)\fR
+my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_suggested()\fR;
+\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_suggested()\fR
+\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_suggested()\fR
.fi
.if n \{\
.RE
.\}
.sp
-Return all solvables that are recommended by the solver run result\&. This includes solvables included in the result, set noselected if you want to filter those\&.
+Return all solvables that are suggested by the solver run result\&. This includes solvables included in the result; set noselected if you want to filter those\&.
.sp
.if n \{\
.RS 4
.\}
.nf
-\fBSolvable *get_suggested(bool\fR \fInoselected\fR\fB=0)\fR;
-my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_suggested()\fR;
-\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_suggested()\fR
-\fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_suggested()\fR
+\fIDecision\fR \fB= get_decision(Solvable *\fR\fIs\fR\fB)\fR
+my \fI$decision\fR \fB=\fR \fI$solver\fR\fB\->get_decision(\fR\fI$solvable\fR\fB)\fR;
+\fIdecision\fR \fB=\fR \fIsolver\fR\fB\&.get_decision(\fR\fIsolvable\fR\fB)\fR;
+\fIdecision\fR \fB=\fR \fIsolver\fR\fB\&.get_decision(\fR\fIsolvable\fR\fB)\fR;
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a decision object that describes why a specific solvable was installed or erased\&. See the Decision class for more information\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecision *get_decisionlist(Solvable *\fR\fIs\fR\fB)\fR
+my \fI@decisions\fR \fB=\fR \fI$solver\fR\fB\->get_decisionlist(\fR\fI$solvable\fR\fB)\fR;
+\fIdecisions\fR \fB=\fR \fIsolver\fR\fB\&.get_decisionlist(\fR\fIsolvable\fR\fB)\fR
+\fIdecisions\fR \fB=\fR \fIsolver\fR\fB\&.get_decisionlist(\fR\fIsolvable\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of decisions that caused the specific solvable to be installed or erased\&. This is usually more useful than the get_decision() method, as it returns every involved decision instead of just a single one\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBAlternative *alternatives()\fR
+my \fI@alternatives\fR \fB=\fR \fI$solver\fR\fB\->alternatives()\fR;
+\fIalternatives\fR \fB=\fR \fIsolver\fR\fB\&.alternatives()\fR
+\fIalternatives\fR \fB=\fR \fIsolver\fR\fB\&.alternatives()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all alternatives recorded in the solver run\&. See the Alternative class for more information\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint alternatives_count()\fR
+my \fI$cnt\fR \fB=\fR \fI$solver\fR\fB\->alternatives_count()\fR;
+\fIcnt\fR \fB=\fR \fIsolver\fR\fB\&.alternatives_count()\fR
+\fIcnt\fR \fB=\fR \fIsolver\fR\fB\&.alternatives_count()\fR
.fi
.if n \{\
.RE
.\}
.sp
-Return all solvables that are suggested by the solver run result\&. This includes solvables included in the result, set noselected if you want to filter those\&.
+Return the number of alternatives without creating alternative objects\&.
.SH "THE PROBLEM CLASS"
.sp
Problems are the way of the solver to interact with the user\&. You can simply list all problems and terminate your program, but a better way is to present solutions to the user and let him pick the ones he likes\&.
.RS 4
.\}
.nf
+\fBDecision *get_decisionlist()\fR
+my \fI@decisions\fR \fB=\fR \fI$problem\fR\fB\->get_decisionlist()\fR;
+\fIdecisions\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionlist()\fR
+\fIdecisions\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of decisions prooving the problem\&. This is somewhat similar to the findallproblemrules(), but the output is in an order that makes it easier to understand why the solver could not find a solution\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecisionset *get_decisionsetlist()\fR
+my \fI@decisionsets\fR \fB=\fR \fI$problem\fR\fB\->get_decisionsetlist()\fR;
+\fIdecisionsets\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionsetlist()\fR
+\fIdecisionsets\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionsetlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Like the get_decisionlist() method, but the decisions are merged into individual sets\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule *get_learnt()\fR
+my \fI@learnt\fR \fB=\fR \fI$problem\fR\fB\->get_learnt()\fR;
+\fIlearnt\fR \fB=\fR \fIproblem\fR\fB\&.get_learnt()\fR
+\fIlearnt\fR \fB=\fR \fIproblem\fR\fB\&.get_lerant()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of learnt rules that are part of the problem proof\&. This is useful for presenting a complete proof to the user\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fBSolution *solutions()\fR
my \fI@solutions\fR \fB=\fR \fI$problem\fR\fB\->solutions()\fR;
\fIsolutions\fR \fB=\fR \fIproblem\fR\fB\&.solutions()\fR
.RS 4
.\}
.nf
+\fBDecision *get_decisionlist()\fR
+my \fI@decisions\fR \fB=\fR \fI$rule\fR\fB\->get_decisionlist()\fR;
+\fIdecisions\fR \fB=\fR \fIrule\fR\fB\&.get_decisionlist()\fR
+\fIdecisions\fR \fB=\fR \fIrule\fR\fB\&.get_decisionlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of decisions prooving a learnt rule\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecision *get_decisionsetlist()\fR
+my \fI@decisionsets\fR \fB=\fR \fI$rule\fR\fB\->get_decisionsetlist()\fR;
+\fIdecisionsets\fR \fB=\fR \fIrule\fR\fB\&.get_decisionsetlist()\fR
+\fIdecisionsets\fR \fB=\fR \fIrule\fR\fB\&.get_decisionsetlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Like the get_decisionlist() method, but the decisions are merged into individual sets\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule *get_learnt()\fR
+my \fI@learnt\fR \fB=\fR \fI$rule\fR\fB\->get_learnt()\fR;
+\fIlearnt\fR \fB=\fR \fIrule\fR\fB\&.get_learnt()\fR
+\fIlearnt\fR \fB=\fR \fIrule\fR\fB\&.get_lerant()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of learnt rules that are part of the learnt rule proof\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fB<equality>\fR
\fBif (\fR\fI$rule1\fR \fB==\fR \fI$rule2\fR\fB)\fR
\fBif\fR \fIrule1\fR \fB==\fR \fIrule2\fR\fB:\fR
.\}
.nf
\fBDep *dep_id;\fR /* read only */
-\fI$ruleinfo\fR\fB\->{\*(Aqdep_id\*(Aq}\fR
+\fI$ruleinfo\fR\fB\->{\fR\fIdep_id\fR\fB}\fR
\fIruleinfo\fR\fB\&.dep_id\fR
\fIruleinfo\fR\fB\&.dep_id\fR
.fi
.RE
.\}
.sp
-The other involved Solvable (if any), e\&.g\&. the one containing providing the dependency for conflicts\&.
+The other involved Solvable (if any), e\&.g\&. the one providing the dependency\&.
.sp
.if n \{\
.RS 4
.\}
.sp
A string describing the ruleinfo from a problem perspective\&. This probably only makes sense if the rule is part of a problem\&.
-.SH "THE SOLUTION CLASS"
-.sp
-A solution solves one specific problem\&. It consists of multiple solution elements that all need to be executed\&.
-.SS "ATTRIBUTES"
.sp
.if n \{\
.RS 4
.\}
.nf
-\fBSolver *solv;\fR /* read only */
-\fI$solution\fR\fB\->{solv}\fR
-\fIsolution\fR\fB\&.solv\fR
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$ruleinfo\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIruleinfo\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIruleinfo\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+A string describing the ruleinfo, i\&.e\&. the reason why the corresponding rule has been created\&.
+.SH "THE SOLUTION CLASS"
+.sp
+A solution solves one specific problem\&. It consists of multiple solution elements that all need to be executed\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR /* read only */
+\fI$solution\fR\fB\->{solv}\fR
+\fIsolution\fR\fB\&.solv\fR
\fIsolution\fR\fB\&.solv\fR
.fi
.if n \{\
.RS 4
.\}
.nf
-\fBbool isempty()\fR;
+\fBbool isempty()\fR
\fI$trans\fR\fB\->isempty()\fR
\fItrans\fR\fB\&.isempty()\fR
\fItrans\fR\fB\&.isempty?\fR
.RS 4
.\}
.nf
-\fBSolvable *newsolvables()\fR;
+\fBSolvable *newsolvables()\fR
my \fI@newsolvables\fR \fB=\fR \fI$trans\fR\fB\->newsolvables()\fR;
\fInewsolvables\fR \fB=\fR \fItrans\fR\fB\&.newsolvables()\fR
\fInewsolvables\fR \fB=\fR \fItrans\fR\fB\&.newsolvables()\fR
.RS 4
.\}
.nf
-\fBSolvable *keptsolvables()\fR;
+\fBSolvable *keptsolvables()\fR
my \fI@keptsolvables\fR \fB=\fR \fI$trans\fR\fB\->keptsolvables()\fR;
\fIkeptsolvables\fR \fB=\fR \fItrans\fR\fB\&.keptsolvables()\fR
\fIkeptsolvables\fR \fB=\fR \fItrans\fR\fB\&.keptsolvables()\fR
.RS 4
.\}
.nf
-\fBSolvable *steps()\fR;
+\fBSolvable *steps()\fR
my \fI@steps\fR \fB=\fR \fI$trans\fR\fB\->steps()\fR;
\fIsteps\fR \fB=\fR \fItrans\fR\fB\&.steps()\fR
\fIsteps\fR \fB=\fR \fItrans\fR\fB\&.steps()\fR
.RS 4
.\}
.nf
-\fBSolvable othersolvable(Solvable *\fR\fIsolvable\fR\fB)\fR;
+\fBSolvable othersolvable(Solvable *\fR\fIsolvable\fR\fB)\fR
my \fI$other\fR \fB=\fR \fI$trans\fR\fB\->othersolvable(\fR\fI$solvable\fR\fB)\fR;
\fIother\fR \fB=\fR \fItrans\fR\fB\&.othersolvable(\fR\fIsolvable\fR\fB)\fR
\fIother\fR \fB=\fR \fItrans\fR\fB\&.othersolvable(\fR\fIsolvable\fR\fB)\fR
.RS 4
.\}
.nf
-\fBSolvable *allothersolvables(Solvable *\fR\fIsolvable\fR\fB)\fR;
+\fBSolvable *allothersolvables(Solvable *\fR\fIsolvable\fR\fB)\fR
my \fI@others\fR \fB=\fR \fI$trans\fR\fB\->allothersolvables(\fR\fI$solvable\fR\fB)\fR;
\fIothers\fR \fB=\fR \fItrans\fR\fB\&.allothersolvables(\fR\fIsolvable\fR\fB)\fR
\fIothers\fR \fB=\fR \fItrans\fR\fB\&.allothersolvables(\fR\fIsolvable\fR\fB)\fR
.RS 4
.\}
.nf
-\fBint calc_installsizechange()\fR;
+\fBlong long calc_installsizechange()\fR
my \fI$change\fR \fB=\fR \fI$trans\fR\fB\->calc_installsizechange()\fR;
\fIchange\fR \fB=\fR \fItrans\fR\fB\&.calc_installsizechange()\fR
\fIchange\fR \fB=\fR \fItrans\fR\fB\&.calc_installsizechange()\fR
.RS 4
.\}
.nf
-\fBvoid order(int\fR \fIflags\fR \fB= 0)\fR;
+\fBvoid order(int\fR \fIflags\fR \fB= 0)\fR
\fI$trans\fR\fB\->order()\fR;
\fItrans\fR\fB\&.order()\fR
\fItrans\fR\fB\&.order()\fR
.nf
\fBREPOKEY_TYPE_MD5\fR
\fBREPOKEY_TYPE_SHA1\fR
+\fBREPOKEY_TYPE_SHA224\fR
\fBREPOKEY_TYPE_SHA256\fR
+\fBREPOKEY_TYPE_SHA384\fR
+\fBREPOKEY_TYPE_SHA512\fR
.fi
.if n \{\
.RE
.\}
.nf
\fBvoid cloexec(bool\fR \fIstate\fR\fB)\fR
-\fI$file\fR\fB\->cloexec(\fR\fI$state\fR\fB)\fR
+\fI$file\fR\fB\->cloexec(\fR\fI$state\fR\fB)\fR;
\fIfile\fR\fB\&.cloexec(\fR\fIstate\fR\fB)\fR
\fIfile\fR\fB\&.cloexec(\fR\fIstate\fR\fB)\fR
.fi
.RS 4
.\}
.nf
-\fBinternalize()\fR;
+\fBinternalize()\fR
\fI$data\fR\fB\->internalize()\fR;
\fIdata\fR\fB\&.internalize()\fR
\fIdata\fR\fB\&.internalize()\fR
.RS 4
.\}
.nf
-\fBbool write(FILE *\fR\fIfp\fR\fB)\fR;
+\fBbool write(FILE *\fR\fIfp\fR\fB)\fR
\fI$data\fR\fB\->write(\fR\fI$fp\fR\fB)\fR;
\fIdata\fR\fB\&.write(\fR\fIfp\fR\fB)\fR
\fIdata\fR\fB\&.write(\fR\fIfp\fR\fB)\fR
.RS 4
.\}
.nf
-\fBbool add_solv(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR;
+\fBId str2dir(const char *\fR\fIdir\fR\fB, bool\fR \fIcreate\fR \fB= 1)\fR
+my \fI$did\fR \fB=\fR \fIdata\fR\fB\->str2dir(\fR\fI$dir\fR\fB)\fR;
+\fIdid\fR \fB=\fR \fIdata\fR\fB\&.str2dir(\fR\fIdir\fR\fB)\fR
+\fIdid\fR \fB=\fR \fIdata\fR\fB\&.str2dir(\fR\fIdir\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *dir2str(Id\fR \fIdid\fR\fB, const char *\fR\fIsuffix\fR \fB= 0)\fR
+\fI$dir\fR \fB=\fR \fIpool\fR\fB\->dir2str(\fR\fI$did\fR\fB)\fR;
+\fIdir\fR \fB=\fR \fIpool\fR\fB\&.dir2str(\fR\fIdid\fR\fB)\fR
+\fIdir\fR \fB=\fR \fIpool\fR\fB\&.dir2str(\fR\fIdid\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Convert a string (directory) into an Id and back\&. If the string is currently not in the pool and \fIcreate\fR is false, zero is returned\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid add_dirstr(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fIdir\fR\fB, const char *\fR\fIstr\fR\fB)\fR
+\fI$data\fR\fB\->add_dirstr(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$dir\fR\fB,\fR \fI$string\fR\fB)\fR;
+\fIdata\fR\fB\&.add_dirstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIdir\fR\fB,\fR \fIstring\fR\fB)\fR
+\fIdata\fR\fB\&.add_dirstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIdir\fR\fB,\fR \fIstring\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Add a file path consisting of a dirname Id and a basename string\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBbool add_solv(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
\fI$data\fR\fB\->add_solv(\fR\fI$fp\fR\fB)\fR;
\fIdata\fR\fB\&.add_solv(\fR\fIfp\fR\fB)\fR
\fIdata\fR\fB\&.add_solv(\fR\fIfp\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid create_stubs()\fR;
-\fI$data\fR\fB\->create_stubs()\fR
+\fBvoid create_stubs()\fR
+\fI$data\fR\fB\->create_stubs()\fR;
\fIdata\fR\fB\&.create_stubs()\fR
\fIdata\fR\fB\&.create_stubs()\fR
.fi
.RS 4
.\}
.nf
-\fBvoid extend_to_repo()\fR;
+\fBvoid extend_to_repo()\fR
\fI$data\fR\fB\->extend_to_repo()\fR;
\fIdata\fR\fB\&.extend_to_repo()\fR
\fIdata\fR\fB\&.extend_to_repo()\fR
.RS 4
.\}
.nf
+\fBconst char *lookup_id(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
+my \fI$string\fR \fB=\fR \fI$data\fR\fB\->lookup_id(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fIstring\fR \fB=\fR \fIdata\fR\fB\&.lookup_id(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fIstring\fR \fB=\fR \fIdata\fR\fB\&.lookup_id(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBunsigned long long lookup_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInotfound\fR \fB= 0)\fR
+my \fI$num\fR \fB=\fR \fI$data\fR\fB\->lookup_num(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fInum\fR \fB=\fR \fIdata\fR\fB\&.lookup_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fInum\fR \fB=\fR \fIdata\fR\fB\&.lookup_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBbool lookup_void(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
+my \fI$bool\fR \fB=\fR \fI$data\fR\fB\->lookup_void(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fIbool\fR \fB=\fR \fIdata\fR\fB\&.lookup_void(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fIbool\fR \fB=\fR \fIdata\fR\fB\&.lookup_void(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
\fBId *lookup_idarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
my \fI@ids\fR \fB=\fR \fI$data\fR\fB\->lookup_idarray(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
\fIids\fR \fB=\fR \fIdata\fR\fB\&.lookup_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid set_id(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR;
+\fBvoid set_str(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR
+\fI$data\fR\fB\->set_str(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$str\fR\fB)\fR;
+\fIdata\fR\fB\&.set_str(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
+\fIdata\fR\fB\&.set_str(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid set_id(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR
\fI$data\fR\fB\->set_id(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$id\fR\fB)\fR;
\fIdata\fR\fB\&.set_id(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
\fIdata\fR\fB\&.set_id(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid set_str(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR;
-\fI$data\fR\fB\->set_str(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$str\fR\fB)\fR;
-\fIdata\fR\fB\&.set_str(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
-\fIdata\fR\fB\&.set_str(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
+\fBvoid set_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInum\fR\fB)\fR
+\fI$data\fR\fB\->set_num(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$num\fR\fB)\fR;
+\fIdata\fR\fB\&.set_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fInum\fR\fB)\fR
+\fIdata\fR\fB\&.set_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fInum\fR\fB)\fR
.fi
.if n \{\
.RE
.RS 4
.\}
.nf
-\fBvoid set_poolstr(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR;
+\fBvoid set_void(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
+\fI$data\fR\fB\->set_void(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fIdata\fR\fB\&.set_void(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fIdata\fR\fB\&.set_void(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid set_poolstr(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR
\fI$data\fR\fB\->set_poolstr(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$str\fR\fB)\fR;
\fIdata\fR\fB\&.set_poolstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
\fIdata\fR\fB\&.set_poolstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid set_checksum(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Chksum *\fR\fIchksum\fR\fB)\fR;
+\fBvoid set_checksum(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Chksum *\fR\fIchksum\fR\fB)\fR
\fI$data\fR\fB\->set_checksum(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$chksum\fR\fB)\fR;
\fIdata\fR\fB\&.set_checksum(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIchksum\fR\fB)\fR
\fIdata\fR\fB\&.set_checksum(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIchksum\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid set_sourcepkg(Id\fR \fIsolvid\fR\fB, const char *\fR\fIsourcepkg\fR\fB)\fR;
+\fBvoid set_sourcepkg(Id\fR \fIsolvid\fR\fB, const char *\fR\fIsourcepkg\fR\fB)\fR
\fI$data\fR\fB\&.set_sourcepkg(\fR\fI$solvid\fR\fB,\fR \fI$sourcepkg\fR\fB)\fR;
\fIdata\fR\fB\&.set_sourcepkg(\fR\fIsolvid\fR\fB,\fR \fIsourcepkg\fR\fB)\fR
\fIdata\fR\fB\&.set_sourcepkg(\fR\fIsolvid\fR\fB,\fR \fIsourcepkg\fR\fB)\fR
.RS 4
.\}
.nf
-\fBvoid add_idarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR;
+\fBvoid set_location(Id\fR \fIsolvid\fR\fB, unsigned int\fR \fImediano\fR\fB, const char *\fR\fIlocation\fR\fB)\fR
+\fI$data\fR\fB\&.set_location(\fR\fI$solvid\fR\fB,\fR \fI$mediano\fR\fB,\fR \fI$location\fR\fB)\fR;
+\fIdata\fR\fB\&.set_location(\fR\fIsolvid\fR\fB,\fR \fImediano\fR\fB,\fR \fIlocation\fR\fB)\fR
+\fIdata\fR\fB\&.set_location(\fR\fIsolvid\fR\fB,\fR \fImediano\fR\fB,\fR \fIlocation\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid add_idarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR
\fI$data\fR\fB\->add_idarray(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$id\fR\fB)\fR;
\fIdata\fR\fB\&.add_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
\fIdata\fR\fB\&.add_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
.RS 4
.\}
.nf
-\fBId new_handle()\fR;
+\fBId new_handle()\fR
my \fI$handle\fR \fB=\fR \fI$data\fR\fB\->new_handle()\fR;
\fIhandle\fR \fB=\fR \fIdata\fR\fB\&.new_handle()\fR
\fIhandle\fR \fB=\fR \fIdata\fR\fB\&.new_handle()\fR
.RS 4
.\}
.nf
-\fBvoid add_flexarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fIhandle\fR\fB)\fR;
+\fBvoid add_flexarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fIhandle\fR\fB)\fR
\fI$data\fR\fB\->add_flexarray(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$handle\fR\fB)\fR;
\fIdata\fR\fB\&.add_flexarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIhandle\fR\fB)\fR
\fIdata\fR\fB\&.add_flexarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIhandle\fR\fB)\fR
.RE
.\}
.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid unset(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
+\fI$data\fR\fB\->unset(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
+\fIdata\fR\fB\&.unset(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+\fIdata\fR\fB\&.unset(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
Data storage methods\&. Probably only useful to store data in the special SOLVID_META solvid that stores repodata meta information\&. Note that repodata areas can have their own Id pool (see the REPO_LOCALPOOL flag), so be careful if you need to store ids\&. Arrays are created by calling the add function for every element\&. A flexarray is an array of sub\-structures, call new_handle to create a new structure, use the handle as solvid to fill the structure with data and call add_flexarray to put the structure in an array\&.
.SH "THE DATAPOS CLASS"
.sp
.RS 4
.\}
.nf
-\fBconst char *lookup_deltalocation(unsigned int *\fR\fIOUTPUT\fR\fB)\fR;
-my \fB(\fR\fI$location\fR\fB,\fR \fI$medianr\fR\fB) =\fR \fI$datapos\fR\fB\->lookup_deltalocation()\fR;
-\fIlocation\fR\fB,\fR \fImedianr\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltalocation()\fR
-\fIlocation\fR\fB,\fR \fImedianr\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltalocation()\fR
+\fBconst char *lookup_deltalocation(unsigned int *\fR\fIOUTPUT\fR\fB)\fR
+my \fB(\fR\fI$location\fR\fB,\fR \fI$mediano\fR\fB) =\fR \fI$datapos\fR\fB\->lookup_deltalocation()\fR;
+\fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltalocation()\fR
+\fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltalocation()\fR
.fi
.if n \{\
.RE
.RS 4
.\}
.nf
-\fBconst char *lookup_deltaseq()\fR;
+\fBconst char *lookup_deltaseq()\fR
my \fI$seq\fR \fB=\fR \fI$datapos\fR\fB\->lookup_deltaseq()\fR;
\fIseq\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltaseq()\fR;
\fIseq\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltaseq()\fR;
.\}
.sp
Iterate over the matching data elements\&. See the Dataiterator class for more information\&.
+.SH "THE ALTERNATIVE CLASS"
+.sp
+An Alternative object describes a branch point in the solving process\&. The solver found more than one good way to fulfill a dependency and chose one\&. It recorded the other possibilities in the alternative object so that they can be presented to the user in the case a different solution is preferable\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR /* read only */
+\fI$alternative\fR\fB\->{solv}\fR
+\fIalternative\fR\fB\&.solv\fR
+\fIalternative\fR\fB\&.solv\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Back pointer to solver object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId type;\fR /* read only */
+\fI$alternative\fR\fB\->{type}\fR
+\fIalternative\fR\fB\&.type\fR
+\fIalternative\fR\fB\&.type\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The type of the alternative\&. Alternatives can be created because of rule fulfillment, because of recommended packages, and because of suggested packages (currently unused)\&. See below for a list of valid types\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule rule;\fR /* read only */
+\fI$alternative\fR\fB\->{rule}\fR
+\fIalternative\fR\fB\&.rule\fR
+\fIalternative\fR\fB\&.rule\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The rule that caused the creation of the alternative (SOLVER_ALTERNATIVE_TYPE_RULE)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *dep;\fR /* read only */
+\fI$ruleinfo\fR\fB\->{dep}\fR
+\fIruleinfo\fR\fB\&.dep\fR
+\fIruleinfo\fR\fB\&.dep\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The dependency that caused the creation of the alternative (SOLVER_ALTERNATIVE_TYPE_RECOMMENDS)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *depsolvable;\fR /* read only */
+\fI$ruleinfo\fR\fB\->{depsolvable}\fR
+\fIruleinfo\fR\fB\&.depsolvable\fR
+\fIruleinfo\fR\fB\&.depsolvable\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The package containing the dependency (SOLVER_ALTERNATIVE_TYPE_RECOMMENDS)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable chosen;\fR /* read only */
+\fI$alternative\fR\fB\->{chosen}\fR
+\fIalternative\fR\fB\&.chosen\fR
+\fIalternative\fR\fB\&.chosen\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The solvable that the solver chose from the alternative\(cqs package set\&.
+.SS "CONSTANTS"
+.PP
+\fBSOLVER_ALTERNATIVE_TYPE_RULE\fR
+.RS 4
+The alternative was created when fulfilling a rule\&.
+.RE
+.PP
+\fBSOLVER_ALTERNATIVE_TYPE_RECOMMENDS\fR
+.RS 4
+The alternative was created when fulfilling a recommends dependency\&.
+.RE
+.PP
+\fBSOLVER_ALTERNATIVE_TYPE_SUGGESTS\fR
+.RS 4
+The alternative was created when fulfilling a suggests dependency\&.
+.RE
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *choices()\fR
+my \fI@choices\fR \fB=\fR \fI$alternative\fR\fB\->choices()\fR;
+\fIchoices\fR \fB=\fR \fIalternative\fR\fB\&.choices\fR
+\fIchoices\fR \fB=\fR \fIalternative\fR\fB\&.choices\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return the set of solvables that the solver could choose from when creating the alternative\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$alternative\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIalternative\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIalternative\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the alternative\&.
+.SH "THE DECISION CLASS"
+.sp
+A decision is created when the solver fulfills dependencies\&. It can be either to install a package to satisfy a dependency or to conflict a dependency because it conflicts with another package or its dependencies cannot be met\&. Most decisions are caused by rule processing, but there are some other types like orphaned package handling or weak dependency handling\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR /* read only */
+\fI$decision\fR\fB\->{solv}\fR
+\fIdecision\fR\fB\&.solv\fR
+\fIdecision\fR\fB\&.solv\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Back pointer to solver object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId p;\fR /* read only */
+\fI$decision\fR\fB\->{p}\fR
+\fIdecision\fR\fB\&.p\fR
+\fIdecision\fR\fB\&.p\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The decision package id, positive for installs and negative for conflicts\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint reason;\fR /* read only */
+\fI$decision\fR\fB\->{reason}\fR
+\fIdecision\fR\fB\&.reason\fR
+\fIdecision\fR\fB\&.reason\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The reason for the decision\&. See the SOLVER_REASON_ constants\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint infoid;\fR /* read only */
+\fI$decision\fR\fB\->{infoid}\fR
+\fIdecision\fR\fB\&.infoid\fR
+\fIdecision\fR\fB\&.infoid\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Extra info for the decision\&. This is the rule id for decisions caused by rule fulfillment\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable solvable;\fR /* read only */
+\fI$decision\fR\fB\->{solvable}\fR
+\fIdecision\fR\fB\&.solvable\fR
+\fIdecision\fR\fB\&.solvable\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The decision package object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule rule()\fR /* read only */
+\fI$decision\fR\fB\->{rule}\fR
+\fIdecision\fR\fB\&.rule\fR
+\fIdecision\fR\fB\&.rule\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The rule object for decisions that where caused by rule fulfilment\&.
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRuleinfo info()\fR
+my \fI$info\fR \fB=\fR \fI$decision\fR\fB\->info()\fR;
+\fIinfo\fR \fB=\fR \fIdecision\fR\fB\&.info()\fR
+\fIinfo\fR \fB=\fR \fIdecision\fR\fB\&.info()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a Ruleinfo object describing the decision\&. Some reasons like SOLVER_REASON_WEAKDEP are not caused by rules, but can be expressed by a Ruleinfo object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRuleinfo *allinfos()\fR
+my \fI@infos\fR \fB=\fR \fI$decision\fR\fB\->allinfos()\fR;
+\fIinfos\fR \fB=\fR \fIdecision\fR\fB\&.allinfos()\fR
+\fIinfos\fR \fB=\fR \fIdecision\fR\fB\&.allinfos()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Same as info(), but all Ruleinfo objects describing the decision are returned\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *reasonstr()\fR
+my \fIstr\fR \fB=\fR \fI$decision\fR\fB\->reasonstr()\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing why a decision was done (but without the decision itself)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$decison\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIdecision\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the decision (but without the reason)\&.
+.SH "THE DECISIONSET CLASS"
+.sp
+A decisionset consists of multiple decisions of the same reason and type that can be presented to the user as a single action\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR /* read only */
+\fI$decision\fR\fB\->{solv}\fR
+\fIdecision\fR\fB\&.solv\fR
+\fIdecision\fR\fB\&.solv\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Back pointer to solver object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId p;\fR /* read only */
+\fI$decision\fR\fB\->{p}\fR
+\fIdecision\fR\fB\&.p\fR
+\fIdecision\fR\fB\&.p\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The package id of the first decision, positive for installs and negative for conflicts\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint reason;\fR /* read only */
+\fI$decision\fR\fB\->{reason}\fR
+\fIdecision\fR\fB\&.reason\fR
+\fIdecision\fR\fB\&.reason\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The reason for the decisions in the set\&. See the SOLVER_REASON_ constants\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint type;\fR /* read only */
+\fI$ruleinfo\fR\fB\->{type}\fR
+\fIruleinfo\fR\fB\&.type\fR
+\fIruleinfo\fR\fB\&.type\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The type of the decision info\&. See the constant section of the solver class for the rule type list and the special type list\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *dep;\fR /* read only */
+\fI$ruleinfo\fR\fB\->{dep}\fR
+\fIruleinfo\fR\fB\&.dep\fR
+\fIruleinfo\fR\fB\&.dep\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The dependency that caused the decision
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *dep_id;\fR /* read only */
+\fI$ruleinfo\fR\fB\->{\fR\fIdep_id\fR\fB}\fR
+\fIruleinfo\fR\fB\&.dep_id\fR
+\fIruleinfo\fR\fB\&.dep_id\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The Id of the dependency that caused the decision\&.
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecision *decisions()\fR
+my \fI@decisions\fR \fB=\fR \fI$decisionset\fR\fB\->decisions()\fR;
+\fIdecisions\fR \fB=\fR \fIdecisionset\fR\fB\&.decisions()\fR
+\fIdecisions\fR \fB=\fR \fIdecisionset\fR\fB\&.decisions()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all the decisions of the set\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *solvables()\fR
+my \fI@pkgs\fR \fB=\fR \fI$decisionset\fR\fB\->solvables()\fR;
+\fIpkgs\fR \fB=\fR \fIdecisionset\fR\fB\&.solvables()\fR
+\fIpkgs\fR \fB=\fR \fIdecisionset\fR\fB\&.solvables()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all the packages that were decided in the set\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *reasonstr()\fR
+my \fIstr\fR \fB=\fR \fI$decision\fR\fB\->reasonstr()\fR;
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing why the decisions were done (but without the decisions themself)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$decison\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIdecision\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the decisions (but without the reason)\&.
.SH "AUTHOR"
.sp
Michael Schroeder <mls@suse\&.de>