use sed instead of grep to get rid of the <?xml...> line
[platform/upstream/libsolv.git] / doc / libsolv-bindings.txt
index 3d1f65a..5a65235 100644 (file)
@@ -1,15 +1,15 @@
-LIBSOLV-BINDINGS(3)
+Libsolv-Bindings(3)
 ===================
 :man manual: LIBSOLV
 :man source: libsolv
 
 
-NAME
+Name
 ----
 libsolv-bindings - access libsolv from perl/python/ruby
 
 
-DESCRIPTION
+Description
 -----------
 Libsolv's language bindings offer an abstract, object orientated interface
 to the library. The supported languages are currently perl, python, and ruby.
@@ -18,7 +18,7 @@ the ``C-ish'' interface, then the syntax for perl, python, and ruby (in that
 order).
 
 
-PERL SPECIFICS
+Perl Specifics
 --------------
 Libsolv's perl bindings can be loaded with the following statement:
 
@@ -36,21 +36,21 @@ accessed by treating the object as standard hash reference:
        $pool->{appdata} = 42;
        printf "appdata is %d\n", $pool->{appdata};
 
-An special exception to this are iterator objects, they are encapsulated as
+A special exception to this are iterator objects, they are encapsulated as
 tied arrays so that it is possible to iterate with a for() statement:
 
        my $iter = $pool->solvables_iter();
        for my $solvable (@$iter) { ... };
 
-As a downside of this approach, iterator objects can have no attributes.
+As a downside of this approach, iterator objects cannot have attributes.
 
 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:
 
        my @problems = $solver->solve(\@jobs);
 
-Due to a bug in swig, stringification does not work for libsolv's object.
-Instead you have to call the object's str() method.
+Due to a bug in swig, stringification does not work for libsolv's objects.
+Instead, you have to call the object's str() method.
 
        print $dep->str() . "\n";
 
@@ -61,7 +61,7 @@ constant. Also do not forget to prepend the namespace of the constant:
        $pool->set_flag($solv::Pool::POOL_FLAG_OBSOLETEUSESCOLORS, 1);
        
 
-PYTHON SPECIFICS
+Python Specifics
 ----------------
 The python bindings can be loaded with:
 
@@ -82,7 +82,7 @@ Iterators also work as expected:
 
        for solvable in pool.solvables_iter():
 
-Arrays are passed an returned as list objects:
+Arrays are passed and returned as list objects:
 
        jobs = []
        problems = solver.solve(jobs)
@@ -98,7 +98,7 @@ Constants are attributes of the classes:
        pool.set_flag(solv.Pool.POOL_FLAG_OBSOLETEUSESCOLORS, 1);
 
 
-RUBY SPECIFICS
+Ruby Specifics
 --------------
 The ruby bindings can be loaded with:
 
@@ -120,7 +120,7 @@ Iterators also work as expected:
 
        for solvable in pool.solvables_iter() do ...
 
-Arrays are passed an returned as array objects:
+Arrays are passed and returned as array objects:
 
        jobs = []
        problems = solver.solve(jobs)
@@ -141,7 +141,7 @@ other ruby modules:
        puts "empty repo" if repo.isempty?
 
 
-THE SOLV CLASS
+The Solv Class
 --------------
 This is the main namespace of the library, you cannot create objects of this
 type but it contains some useful constants.
@@ -151,45 +151,45 @@ type but it contains some useful constants.
 Relational flag constants, the first three can be or-ed together
 
 *REL_LT*::
-  the ``less than'' bit
+the ``less than'' bit
 
 *REL_EQ*::
-  the ``equals to'' bit
+the ``equals to'' bit
 
 *REL_GT*::
-  the ``greater then'' bit
+the ``greater then'' bit
 
 *REL_ARCH*::
-  used for relations that describe an extra architecture filter, the
-  version part of the relation is interpreted as architecture.
+used for relations that describe an extra architecture filter, the
+version part of the relation is interpreted as architecture.
 
 Special Solvable Ids
 
 *SOLVID_META*::
-  Access the meta section of a repository or repodata area. This is
-  like an extra Solvable that has the Id SOLVID_META.
+Access the meta section of a repository or repodata area. This is
+like an extra Solvable that has the Id SOLVID_META.
 
 *SOLVID_POS*::
-  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 do not need this constant.
 
 Constant string Ids
   
 *ID_NULL*::
-  Always zero
+Always zero
 
 *ID_EMPTY*::
-  Always one, describes the empty string
+Always one, describes the empty string
 
 *SOLVABLE_NAME*::
-  The keyname Id of the name of the solvable.
+The keyname Id of the name of the solvable.
 
 *...*::
-  see the libsolv-constantids manpage for a list of fixed Ids.
+see the libsolv-constantids manpage for a list of fixed Ids.
 
 
-THE POOL CLASS
+The Pool Class
 --------------
 The pool is libsolv's central resource manager. A pool consists of Solvables,
 Repositories, Dependencies, each indexed by Ids.
@@ -201,8 +201,10 @@ Repositories, Dependencies, each indexed by Ids.
        pool = solv.Pool()
        pool = Solv::Pool.new()
 
-Create a new pool instance. In most cases you just need
-one pool.
+Create a new pool instance. In most cases you just need one pool.
+Note that the returned object "owns" the pool, i.e. if the object is 
+freed, the pool is also freed. You can use the disown method to
+break this ownership relation.
 
 === ATTRIBUTES ===
 
@@ -235,68 +237,74 @@ Look up a Repository by its id.
 
 Define which repository contains all the installed packages.
 
+       const char *errstr;             /* read only */
+       my $err = $pool->{errstr};
+       err = pool.errstr
+       err = pool.errstr
+
+Return the last error string that was stored in the pool.
+
 === CONSTANTS ===
 
 *POOL_FLAG_PROMOTEEPOCH*::
-  Promote the epoch of the providing dependency to the requesting
-  dependency if it does not contain an epoch. Used at some time
-  in old rpm versions, modern systems should never need this.
+Promote the epoch of the providing dependency to the requesting
+dependency if it does not contain an epoch. Used at some time
+in old rpm versions, modern systems should never need this.
 
 *POOL_FLAG_FORBIDSELFCONFLICTS*::
-  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 recently.
 
 *POOL_FLAG_OBSOLETEUSESPROVIDES*::
-  Make obsolete type dependency match against provides instead of
-  just the name and version of packages. Very old versions of rpm
-  used the name/version, then it got switched to provides and later
-  switched back again to just name/version.
+Make obsolete type dependency match against provides instead of
+just the name and version of packages. Very old versions of rpm
+used the name/version, then it got switched to provides and later
+switched back again to just name/version.
 
 *POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES*::
-  An implicit obsoletes is the internal mechanism to remove the
-  old package on an update. The default is to remove all packages
-  with the same name, rpm-5 switched to also removing packages
-  providing the same name.
+An implicit obsoletes is the internal mechanism to remove the
+old package on an update. The default is to remove all packages
+with the same name, rpm-5 switched to also removing packages
+providing the same name.
 
 *POOL_FLAG_OBSOLETEUSESCOLORS*::
-  Rpm's multilib implementation (used in RedHat and Fedora)
-  distinguishes between 32bit and 64bit packages (the terminology
-  is that they have a different color). If obsolteusescolors is
-  set, packages with different colors will not obsolete each other.
+Rpm's 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.
 
 *POOL_FLAG_IMPLICITOBSOLETEUSESCOLORS*::
-  Same as POOL_FLAG_OBSOLETEUSESCOLORS, but used to find out if
-  packages of the same name can be installed in parallel. For
-  current Fedora systems, POOL_FLAG_OBSOLETEUSESCOLORS should be
-  false and POOL_FLAG_IMPLICITOBSOLETEUSESCOLORS should be true
-  (this is the default if FEDORA is defined when libsolv is
-  compiled).
+Same as POOL_FLAG_OBSOLETEUSESCOLORS, but used to find out if
+packages of the same name can be installed in parallel. For
+current Fedora systems, POOL_FLAG_OBSOLETEUSESCOLORS should be
+false and POOL_FLAG_IMPLICITOBSOLETEUSESCOLORS should be true
+(this is the default if FEDORA is defined when libsolv is compiled).
 
 *POOL_FLAG_NOINSTALLEDOBSOLETES*::
-  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.
+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.
 
 *POOL_FLAG_HAVEDISTEPOCH*::
-  Mandriva added a new field called distepoch that gets checked in
-  version comparison if the epoch/version/release of two packages
-  are the same.
+Mandriva added a new field called distepoch that gets checked in
+version comparison if the epoch/version/release of two packages
+are the same.
 
 *POOL_FLAG_NOOBSOLETESMULTIVERSION*::
-  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 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.
 
 *POOL_FLAG_ADDFILEPROVIDESFILTERED*::
-  Make the addfileprovides method only add files from the standard
-  locations (i.e. the ``bin'' and ``etc'' directories). This is
-  useful if you have only few packages that use non-standard file
-  dependencies, but you still wand the fast speed that addfileprovides()
-  generates.
+Make the addfileprovides method only add files from the standard
+locations (i.e. the ``bin'' and ``etc'' directories). This is
+useful if you have only few packages that use non-standard file
+dependencies, but you still wand the fast speed that addfileprovides()
+generates.
 
 === METHODS ===
 
@@ -305,9 +313,18 @@ Define which repository contains all the installed packages.
        pool.free()
        pool.free()
 
-Free a pool. This is currently done with a method instead of relying on
-reference counting or garbage collection because it's hard to track every
-reference to a pool.
+Force a free of the pool. After this call, you must not access any object
+that still references the pool.
+
+       void disown()
+       $pool->disown();
+       pool.disown()
+       pool.disown()
+
+Break the ownership relation betwen the binding object and the pool. After
+this call, the pool will not get freed even if the object goes out of
+scope. This also means that you must manually call the free method to free
+the pool data.
 
        void setdebuglevel(int level)
        $pool->setdebuglevel($level);
@@ -560,7 +577,12 @@ desired solvable by Id.
 Lookup functions. Return the data element stored in the specified solvable.
 You should probably use the methods of the Solvable class instead.
 
-       Dataiterator Dataiterator(Id solvid, Id keyname, const char *match, int flags)
+       Dataiterator Dataiterator(Id keyname, const char *match = 0, int flags = 0)
+       my $di = $pool->Dataiterator($keyname, $match, $flags);
+       di = pool.Dataiterator(keyname, match, flags)
+       di = pool.Dataiterator(keyname, match, flags)
+
+       Dataiterator Dataiterator_solvid(Id solvid, Id keyname, const char *match = 0, int flags = 0)
        my $di = $pool->Dataiterator($solvid, $keyname, $match, $flags);
        di = pool.Dataiterator(solvid, keyname, match, flags)
        di = pool.Dataiterator(solvid, keyname, match, flags)
@@ -570,7 +592,8 @@ You should probably use the methods of the Solvable class instead.
        for d in di
 
 Iterate over the matching data elements. See the Dataiterator class for more
-information.
+information. The Dataiterator method iterates over all solvables in the pool,
+whereas the Dataiterator_solvid only iterates over the specified solvable.
 
 === ID METHODS ===
 
@@ -648,7 +671,7 @@ function has the same effect as id2str(). For relational dependencies, the
 result is the correct ``name relation evr'' string.
 
 
-THE DEPENDENCY CLASS
+The Dependency Class
 --------------------
 The dependency class is an object orientated way to work with strings and
 dependencies. Internally, dependencies are represented as Ids, i.e. simple
@@ -721,7 +744,7 @@ The dependencies are equal if they are part of the same pool and have the same
 ids.
 
 
-THE REPOSITORY CLASS
+The Repository Class
 --------------------
 A Repository describes a group of packages, normally coming from the same
 source. Repositories are created by the Pool's add_repo() method.
@@ -795,44 +818,45 @@ timestamp.
 === CONSTANTS ===
 
 *REPO_REUSE_REPODATA*::
-  Reuse the last repository data area (``repodata'') instead of creating a new
-  one.
+Reuse the last repository data area (``repodata'') instead of creating a
+new one.
 
 *REPO_NO_INTERNALIZE*::
-  Do not internalize the added repository data. This is useful if
-  you plan to add more data because internalization is a costly
-  operation.
+Do not internalize the added repository data. This is useful if
+you plan to add more data because internalization is a costly
+operation.
 
 *REPO_LOCALPOOL*::
-  Use the repodata's pool for Id storage instead of the global pool. Useful
-  if you don't want to pollute the global pool with many unneeded ids, like
-  when storing the filelist.
+Use the repodata's pool for Id storage instead of the global pool. Useful
+if you don't want to pollute the global pool with many unneeded ids, like
+when storing the filelist.
 
 *REPO_USE_LOADING*::
-  Use the repodata that is currently being loaded instead of creating a new one.
-  This only makes sense if used in a load callback.
+Use the repodata that is currently being loaded instead of creating a new
+one. This only makes sense if used in a load callback.
 
 *REPO_EXTEND_SOLVABLES*::
-  Do not create new solvables for the new data, but match existing solvables and
-  add the data to them. Repository metadata is often split into multiple parts,
-  with one primary file describing all packages and other parts holding
-  information that is normally not needed, like the changelog.
+Do not create new solvables for the new data, but match existing solvables
+and add the data to them. Repository metadata is often split into multiple
+parts, with one primary file describing all packages and other parts
+holding information that is normally not needed, like the changelog.
 
 *REPO_USE_ROOTDIR*::
-  Prepend the pool's rootdir to the path when doing file operations.
+Prepend the pool's rootdir to the path when doing file operations.
 
 *REPO_NO_LOCATION*::
-  Do not add a location element to the solvables. Useful if the solvables are
-  not in the final position, so you can add the correct location later in your code.
+Do not add a location element to the solvables. Useful if the solvables
+are not in the final position, so you can add the correct location later
+in your code.
 
 *SOLV_ADD_NO_STUBS*::
-  Do not create stubs for repository parts that can be downloaded on demand.
+Do not create stubs for repository parts that can be downloaded on demand.
 
 *SUSETAGS_RECORD_SHARES*::
-  This is specific to the add_susetags() method. Susetags allows to refer to already
-  read packages to save disk space. If this data sharing needs to work over multiple
-  calls to add_susetags, you need to specify this flag so that the share information
-  is made available to subsequent calls.
+This is specific to the add_susetags() method. Susetags allows to refer to
+already read packages to save disk space. If this data sharing needs to
+work over multiple calls to add_susetags, you need to specify this flag so
+that the share information is made available to subsequent calls.
 
 === METHODS ===
 
@@ -928,17 +952,24 @@ areas.
 
 Create a Selection consisting of all packages in the repository.
 
-       Dataiterator Dataiterator(Id p, Id key, const char *match, int flags)
-       my $di = $repo->Dataiterator($solvid, $keyname, $match, $flags);
-       di = repo.Dataiterator(solvid, keyname, match, flags)
-       di = repo.Dataiterator(solvid, keyname, match, flags)
+       Dataiterator Dataiterator(Id key, const char *match = 0, int flags = 0)
+       my $di = $repo->Dataiterator($keyname, $match, $flags);
+       di = repo.Dataiterator(keyname, match, flags)
+       di = repo.Dataiterator(keyname, match, flags)
+
+       Dataiterator Dataiterator_meta(Id key, const char *match = 0, int flags = 0)
+       my $di = $repo->Dataiterator_meta($keyname, $match, $flags);
+       di = repo.Dataiterator_meta(keyname, match, flags)
+       di = repo.Dataiterator_meta(keyname, match, flags)
 
        for my $d (@$di)
        for d in di:
        for d in di
 
 Iterate over the matching data elements in this repository. See the
-Dataiterator class for more information.
+Dataiterator class for more information. The Dataiterator() method
+iterates over all solvables in a repository, whereas the Dataiterator_meta
+method only iterates over the repository's meta data.
 
        <stringification>
        my $str = $repo->str;
@@ -965,37 +996,37 @@ Add a single empty solvable to the repository. Returns a Solvable object, see
 the Solvable class for more information.
 
        bool add_solv(const char *name, int flags = 0)
-       $repo->add_solv($name, $flags);
-       repo.add_solv(name, flags)
-       repo.add_solv(name, flags)
+       $repo->add_solv($name);
+       repo.add_solv(name)
+       repo.add_solv(name)
 
        bool add_solv(FILE *fp, int flags = 0)
-       $repo->add_solv($fp, $flags);
-       repo.add_solv(fp, flags)
-       repo.add_solv(fp, flags)
+       $repo->add_solv($fp);
+       repo.add_solv(fp)
+       repo.add_solv(fp)
 
 Read a ``solv'' file and add its contents to the repository. These files can be
 written with the write() method and are normally used as fast cache for
 repository metadata.
 
        bool add_rpmdb(int flags = 0)
-       $repo->add_rpmdb($flags);
-       repo.add_rpmdb(flags)
-       repo.add_rpmdb(flags)
+       $repo->add_rpmdb();
+       repo.add_rpmdb()
+       repo.add_rpmdb()
 
        bool add_rpmdb_reffp(FILE *reffp, int flags = 0)
-       $repo->add_rpmdb_reffp($reffp, $flags);
-       repo.add_rpmdb_reffp($reffp, flags)
-       repo.add_rpmdb_reffp($reffp, flags)
+       $repo->add_rpmdb_reffp($reffp);
+       repo.add_rpmdb_reffp(reffp)
+       repo.add_rpmdb_reffp(reffp)
 
 Add the contents of the rpm database to the repository. If a solv file
 containing an old version of the database is available, it can be passed as
 reffp to speed up reading.
 
-       bool add_rpm(const char *name, int flags = 0)
-       $repo->add_rpm($name, $flags);
-       repo.add_rpm(name, flags)
-       repo.add_rpm(name, flags)
+       Solvable add_rpm(const char *filename, int flags = 0)
+       my $solvable = $repo->add_rpm($filename);
+       solvable = repo.add_rpm(filename)
+       solvable = repo.add_rpm(filename)
 
 Add the metadata of a single rpm package to the repository.
 
@@ -1008,17 +1039,17 @@ Add all pubkeys contained in the rpm database to the repository. Note that
 newer rpm versions also allow to store the pubkeys in some directory instead
 of the rpm database.
 
-       bool add_pubkey(const char *keyfile, int flags = 0)
-       $repo->add_pubkey($keyfile);
-       repo.add_pubkey($keyfile)
-       repo.add_pubkey($keyfile)
+       Solvable add_pubkey(const char *keyfile, int flags = 0)
+       my $solvable = $repo->add_pubkey($keyfile);
+       solvable = repo.add_pubkey(keyfile)
+       solvable = repo.add_pubkey(keyfile)
 
 Add a pubkey from a file to the repository.
 
        bool add_rpmmd(FILE *fp, const char *language, int flags = 0)
-       $repo->add_rpmmd($fp, $language);
-       repo.add_rpmmd(fp, language)
-       repo.add_rpmmd(fp, language)
+       $repo->add_rpmmd($fp, undef);
+       repo.add_rpmmd(fp, None)
+       repo.add_rpmmd(fp, nil)
 
 Add metadata stored in the "rpm-md" format (i.e. from files in the ``repodata''
 directory) to a repository. Supported files are "primary", "filelists",
@@ -1070,41 +1101,41 @@ Add the contents of the debian installed package database to the repository.
 Add the contents of the debian repository metadata (the "packages" file)
 to the repository.
 
-       bool add_deb(const char *filename, int flags = 0)
-       $repo->add_deb($filename);
-       repo.add_deb(filename)
-       repo.add_deb(filename)
+       Solvable add_deb(const char *filename, int flags = 0)
+       my $solvable = $repo->add_deb($filename);
+       solvable = repo.add_deb(filename)
+       solvable = repo.add_deb(filename)
 
 Add the metadata of a single deb package to the repository.
 
        bool add_mdk(FILE *fp, int flags = 0)
        $repo->add_mdk($fp);
-       repo.add_mdk($fp)
-       repo.add_mdk($fp)
+       repo.add_mdk(fp)
+       repo.add_mdk(fp)
 
 Add the contents of the mageia/mandriva repository metadata (the
 "synthesis.hdlist" file) to the repository.
 
        bool add_mdk_info(FILE *fp, int flags = 0)
        $repo->add_mdk($fp);
-       repo.add_mdk($fp)
-       repo.add_mdk($fp)
+       repo.add_mdk(fp)
+       repo.add_mdk(fp)
 
 Extend the packages from the synthesis file with the info.xml and files.xml
 data. Do not forget to specify *REPO_EXTEND_SOLVABLES*.
 
        bool add_arch_repo(FILE *fp, int flags = 0)
        $repo->add_arch_repo($fp);
-       repo.add_arch_repo($fp)
-       repo.add_arch_repo($fp)
+       repo.add_arch_repo(fp)
+       repo.add_arch_repo(fp)
 
 Add the contents of the archlinux repository metadata (the ".db.tar" file) to
 the repository.
 
        bool add_arch_local(const char *dir, int flags = 0)
        $repo->add_arch_local($dir);
-       repo.add_arch_local($dir)
-       repo.add_arch_local($dir)
+       repo.add_arch_local(dir)
+       repo.add_arch_local(dir)
 
 Add the contents of the archlinux installed package database to the repository.
 The _dir_ parameter is usually set to "/var/lib/pacman/local".
@@ -1138,7 +1169,7 @@ Add the installed SUSE products database to the repository. The _dir_ parameter
 is usually "/etc/products.d".
 
 
-THE SOLVABLE CLASS
+The Solvable Class
 ------------------
 A solvable describes all the information of one package. Each solvable
 belongs to one repository, it can be added and filled manually but in
@@ -1270,6 +1301,18 @@ Return a tuple containing the on-media location and an optional
 media number for multi-part repositories (e.g. repositories
 spawning multiple DVDs).
 
+       Dataiterator Dataiterator(Id keyname, const char *match = 0, int flags = 0)
+       my $di = $solvable->Dataiterator($keyname, $match, $flags);
+       di = solvable.Dataiterator(keyname, match, flags)
+       di = solvable.Dataiterator(keyname, match, flags)
+
+       for my $d (@$di)
+       for d in di:
+       for d in di
+
+Iterate over the matching data elements. See the Dataiterator class for more
+information.
+
        void add_deparray(Id keyname, DepId dep, Id marker = -1);
        $solvable->add_deparray($keyname, $dep);
        solvable.add_deparray(keyname, dep)
@@ -1277,6 +1320,13 @@ spawning multiple DVDs).
 
 Add a new dependency to the attributes stored in keyname.
 
+       void unset(Id keyname);
+       $solvable->unset($keyname);
+       solvable.unset(keyname)
+       solvable.unset(keyname)
+
+Delete data stored for the specific keyname.
+
        bool installable();
        $solvable->installable()
        solvable.installable()
@@ -1292,6 +1342,22 @@ are not installable if the system does not support their architecture.
 
 Return true if the solvable is installed on the system.
 
+       bool identical(Solvable *other)
+       $solvable->identical($other)
+       $solvable.identical(other)
+       $solvable.identical?(other)
+
+Return true if the two solvables are identical.
+
+       int evrcmp(Solvable *other)
+       $solvable->evrcmp(other)
+       $solvable.evrcmp(other)
+       $solvable.evrcmp(other)
+
+Returns -1 if the epoch/version/release of the solvable is less then the
+one from the other solvable, 1 if it is greater, and 0 if they are equal.
+Note that "equal" does not mean that the evr is identical.
+
        Selection Selection(int setflags = 0)
        my $sel = $solvable->Selection();
        sel = solvable.Selection()
@@ -1323,7 +1389,7 @@ Two solvables are equal if they are part of the same pool and have the same
 ids.
 
 
-THE DATAITERATOR CLASS
+The Dataiterator Class
 ----------------------
 Dataiterators can be used to do complex string searches or
 to iterate over arrays. They can be created via the
@@ -1334,39 +1400,35 @@ the repository or the specific package.
 === CONSTANTS ===
 
 *SEARCH_STRING*::
-  Return a match if the search string matches the value.
+Return a match if the search string matches the value.
 
 *SEARCH_STRINGSTART*::
-  Return a match if the value starts with the search string.
+Return a match if the value starts with the search string.
 
 *SEARCH_STRINGEND*::
-  Return a match if the value ends with the search string.
+Return a match if the value ends with the search string.
 
 *SEARCH_SUBSTRING*::
-  Return a match if the search string can be matched somewhere
-  in the value.
+Return a match if the search string can be matched somewhere in the value.
 
 *SEARCH_GLOB*::
-  Do a glob match of the search string against the value.
+Do a glob match of the search string against the value.
 
 *SEARCH_REGEX*::
-  Do a regular expression match of the search string against
-  the value.
+Do a regular expression match of the search string against the value.
 
 *SEARCH_NOCASE*::
-  Ignore case when matching strings. Works for all the above
-  match types.
+Ignore case when matching strings. Works for all the above match types.
 
 *SEARCH_FILES*::
-  Match the complete filenames of the file list, not just the
-  base name.
+Match the complete filenames of the file list, not just the base name.
 
 *SEARCH_COMPLETE_FILELIST*::
-  When matching the file list, check every file of the package
-  not just the subset from the primary metadata.
+When matching the file list, check every file of the package not just the
+subset from the primary metadata.
 
 *SEARCH_CHECKSUMS*::
-  Allow the matching of checksum entries.
+Allow the matching of checksum entries.
 
 === METHODS ===
 
@@ -1393,7 +1455,7 @@ one.
 Iterate through the matches. If there is a match, the object
 in d will be of type Datamatch.
 
-THE DATAMATCH CLASS
+The Datamatch Class
 -------------------
 Objects of this type will be created for every value matched
 by a dataiterator.
@@ -1428,67 +1490,75 @@ The solvable containing the value that was matched.
 
 The id of the solvable that matched.
 
-=== METHODS ===
+       Id key_id;
+       $d->{key_id}
+       d.key_id
+       d.key_id
 
-       Id key_id();
-       $d->key_id()
-       d.key_id()
-       d.key_id()
-
-       const char *key_idstr();
-       $d->key_idstr()
-       d.key_idstr()
-       d.key_idstr()
+       const char *key_idstr;
+       $d->{key_idstr}
+       d.key_idstr
+       d.key_idstr
 
 The keyname that matched, either as id or string.
 
-       Id type_id();
-       $d->type_id()
-       d.type_id()
-       d.type_id()
+       Id type_id;
+       $d->{type_id}
+       d.type_id
+       d.type_id
 
-       const char *type_idstr();
-       $d->type_idstr();
-       d.type_idstr()
-       d.type_idstr()
+       const char *type_idstr;
+       $d->{type_idstr};
+       d.type_idstr
+       d.type_idstr
 
 The key type of the value that was matched, either as id or string.
 
-       Id id();
-       $d->id()
-       d.id()
-       d.id()
+       Id id;
+       $d->{id}
+       d.id
+       d.id
 
-       Id idstr();
-       $d->idstr()
-       d.idstr()
-       d.idstr()
+       Id idstr;
+       $d->{idstr}
+       d.idstr
+       d.idstr
 
 The Id of the value that was matched (only valid for id types),
 either as id or string.
 
-       const char *str();
-       $d->str()
-       d.str()
-       d.str()
+       const char *str;
+       $d->{str}
+       d.str
+       d.str
 
 The string value that was matched (only valid for string types).
 
-       unsigned long long num();
-       $d->num()
-       d.num()
-       d.num()
+       unsigned long long num;
+       $d->{num}
+       d.num
+       d.num
 
 The numeric value that was matched (only valid for numeric types).
 
-       unsigned int num2();
-       $d->num2()
-       d.num2()
-       d.num2()
+       unsigned int num2;
+       $d->{num2}
+       d.num2
+       d.num2
 
 The secondary numeric value that was matched (only valid for types
 containing two values).
 
+       unsigned int binary;
+       $d->{binary}
+       d.binary
+       d.binary
+
+The value in binary form, useful for checksums and other data
+that cannot be represented as a string.
+
+=== METHODS ===
+
        Datapos pos();
        my $pos = $d->pos();
        pos = d.pos()
@@ -1519,7 +1589,7 @@ it will return an empty string unless SEARCH_CHECKSUMS is used.
 Numeric values are currently stringified to an empty string.
 
 
-THE SELECTION CLASS
+The Selection Class
 -------------------
 Selections are a way to easily deal with sets of packages.
 There are multiple constructors to create them, the most useful
@@ -1528,51 +1598,49 @@ is probably the select() method in the Pool class.
 === CONSTANTS ===
 
 *SELECTION_NAME*::
-  Create the selection by matching package names
+Create the selection by matching package names.
 
 *SELECTION_PROVIDES*::
-  Create the selection by matching package provides
+Create the selection by matching package provides.
 
 *SELECTION_FILELIST*::
-  Create the selection by matching package files
+Create the selection by matching package files.
 
 *SELECTION_CANON*::
-  Create the selection by matching the canonical representation
-  of the package. This is normally a combination of the name,
-  the version, and the architecture of a package.
+Create the selection by matching the canonical representation
+of the package. This is normally a combination of the name,
+the version, and the architecture of a package.
 
 *SELECTION_DOTARCH*::
-  Allow an ``.<architecture>'' suffix when matching names or
-  provides.
+Allow an ``.<architecture>'' suffix when matching names or
+provides.
  
 *SELECTION_REL*::
-  Allow the specification of a relation when matching names
-  or provides, e.g. "name >= 1.2".
+Allow the specification of a relation when matching names
+or provides, e.g. "name >= 1.2".
 
 *SELECTION_INSTALLED_ONLY*::
-  Limit the package search to installed packages.
+Limit the package search to installed packages.
 
 *SELECTION_SOURCE_ONLY*::
-  Limit the package search to source packages only.
+Limit the package search to source packages only.
 
 *SELECTION_WITH_SOURCE*::
-  Extend the package search to also match source packages. The
-  default is only to match binary packages.
+Extend the package search to also match source packages. The default is
+only to match binary packages.
 
 *SELECTION_GLOB*::
-  Allow glob matching for package names, package provides, and
-  file names.
+Allow glob matching for package names, package provides, and file names.
 
 *SELECTION_NOCASE*::
-  Ignore case when matching package names, package provides,
-  and file names.
+Ignore case when matching package names, package provides, and file names.
 
 *SELECTION_FLAT*::
-  Return only one selection element describing the selected packages.
-  The default is to create multiple elements for all globbed packages.
-  Multiple elements are useful if you want to turn the selection into
-  an install job, in that case you want an install job for every
-  globbed package.
+Return only one selection element describing the selected packages.
+The default is to create multiple elements for all globbed packages.
+Multiple elements are useful if you want to turn the selection into
+an install job, in that case you want an install job for every
+globbed package.
 
 === ATTRIBUTES ===
 
@@ -1654,7 +1722,7 @@ Convert a selection into an array of Solvable objects.
 
 Return a string describing the selection.
 
-THE JOB CLASS
+The Job Class
 -------------
 Jobs are the way to specify to the dependency solver what to do.
 Most of the times jobs will get created by calling the jobs() method
@@ -1666,139 +1734,143 @@ Pool class.
 Selection constants:
 
 *SOLVER_SOLVABLE*::
-  The ``what'' part is the id of a solvable.
+The ``what'' part is the id of a solvable.
 
 *SOLVER_SOLVABLE_NAME*::
-  The ``what'' part is the id of a package name.
+The ``what'' part is the id of a package name.
 
 *SOLVER_SOLVABLE_PROVIDES*::
-  The ``what'' part is the id of a package provides.
+The ``what'' part is the id of a package provides.
 
 *SOLVER_SOLVABLE_ONE_OF*::
-  The ``what'' part is an offset into the ``whatprovides'' data, created
-  by calling the towhatprovides() pool method.
+The ``what'' part is an offset into the ``whatprovides'' data, created
+by calling the towhatprovides() pool method.
 
 *SOLVER_SOLVABLE_REPO*::
-  The ``what'' part is the id of a repository.
+The ``what'' part is the id of a repository.
 
 *SOLVER_SOLVABLE_ALL*::
-  The ``what'' part is ignored, all packages are selected.
+The ``what'' part is ignored, all packages are selected.
 
 *SOLVER_SOLVABLE_SELECTMASK*::
-  A mask containing all the above selection bits.
+A mask containing all the above selection bits.
 
 Action constants:
 
 *SOLVER_NOOP*::
-  Do nothing.
+Do nothing.
 
 *SOLVER_INSTALL*::
-  Install a package of the specified set of packages. It tries to install
-  the best matching package (i.e. the highest version of the packages from
-  the repositories with the highest priority).
+Install a package of the specified set of packages. It tries to install
+the best matching package (i.e. the highest version of the packages from
+the repositories with the highest priority).
 
 *SOLVER_ERASE*::
-  Erase all of the packages from the specified set. If a package is not
-  installed, erasing it will keep it from getting installed.
+Erase all of the packages from the specified set. If a package is not
+installed, erasing it will keep it from getting installed.
 
 *SOLVER_UPDATE*::
-  Update the matching installed packages to their best version. If none
-  of the specified packages are installed, try to update the installed
-  packages to the specified versions. See the section about targeted
-  updates about more information.
-  
+Update the matching installed packages to their best version. If none
+of the specified packages are installed, try to update the installed
+packages to the specified versions. See the section about targeted
+updates about more information.
 *SOLVER_WEAKENDEPS*::
-  Allow to break the dependencies of the matching packages. Handle with care.
+Allow to break the dependencies of the matching packages. Handle with care.
 
 *SOLVER_MULTIVERSION*::
-  Mark the matched packages for multiversion install. If they get to be installed
-  because of some other job, the installation will keep the old version of the
-  package installed (for rpm by using ``-i'' instead of ``-U'').
+Mark the matched packages for multiversion install. If they get to be
+installed because of some other job, the installation will keep the old
+version of the package installed (for rpm this is done by using ``-i''
+instead of ``-U'').
 
 *SOLVER_LOCK*::
-  Do not change the state of the matched packages, i.e. when they are installed
-  they stay installed, if not they are not selected for installation.
+Do not change the state of the matched packages, i.e. when they are
+installed they stay installed, if not they are not selected for
+installation.
 
 *SOLVER_DISTUPGRADE*::
-  Update the matching installed packages to the best version included in one
-  of the repositories. After this operation, all come from one of the available
-  repositories except orphaned packages. Orphaned packages are packages that
-  have no relation to the packages in the repositories, i.e. no package in the
-  repositories have the same name or obsolete the orphaned package.
-  This action brings the installed packages in sync with the ones in the
-  repository. It also turns of arch/vendor/version locking for the affected
-  packages to simulate a fresh installation. This means that distupgrade can
-  actually downgrade packages if only lower versions of a package are available
-  in the repositories.
+Update the matching installed packages to the best version included in one
+of the repositories. After this operation, all come from one of the available
+repositories except orphaned packages. Orphaned packages are packages that
+have no relation to the packages in the repositories, i.e. no package in the
+repositories have the same name or obsolete the orphaned package.
+This action brings the installed packages in sync with the ones in the
+repository. By default it also turns of arch/vendor/version locking for the
+affected packages to simulate a fresh installation. This means that distupgrade can
+actually downgrade packages if only lower versions of a package are available
+in the repositories. You can tweak this behavior with the SOLVER_FLAG_DUP_
+solver flags.
 
 *SOLVER_DROP_ORPHANED*::
-  Erase all the matching installed packages if they are orphaned. This only makes
-  sense if there is a ``distupgrade all packages'' job. The default is to erase
-  orphaned packages only if they block the installation of other packages.
+Erase all the matching installed packages if they are orphaned. This only makes
+sense if there is a ``distupgrade all packages'' job. The default is to erase
+orphaned packages only if they block the installation of other packages.
 
 *SOLVER_VERIFY*::
-  Fix dependency problems of matching installed packages. The default is to ignore
-  dependency problems for installed packages.
+Fix dependency problems of matching installed packages. The default is to ignore
+dependency problems for installed packages.
 
 *SOLVER_USERINSTALLED*::
-  The matching installed packages are considered to be installed by a user, thus
-  not installed to fulfill some dependency. This is needed input for the calculation
-  of unneeded packages for jobs that have the SOLVER_CLEANDEPS flag set.
+The matching installed packages are considered to be installed by a user,
+thus not installed to fulfill some dependency. This is needed input for
+the calculation of unneeded packages for jobs that have the
+SOLVER_CLEANDEPS flag set.
 
 *SOLVER_JOBMASK*::
-  A mask containing all the above action bits.
+A mask containing all the above action bits.
 
 Action modifier constants:
 
 *SOLVER_WEAK*::
-  Makes the job a weak job. The solver tries to fulfill weak jobs, but does not
-  report a problem if it is not possible to do so.
+Makes the job a weak job. The solver tries to fulfill weak jobs, but does
+not report a problem if it is not possible to do so.
 
 *SOLVER_ESSENTIAL*::
-  Makes the job an essential job. If there is a problem with the job, the solver
-  will not propose to remove the job as one solution (unless all other solutions
-  are also to remove essential jobs).
+Makes the job an essential job. If there is a problem with the job, the
+solver will not propose to remove the job as one solution (unless all
+other solutions are also to remove essential jobs).
 
 *SOLVER_CLEANDEPS*::
-  The solver will try to also erase all packages dragged in through dependencies
-  when erasing the package. This needs SOLVER_USERINSTALLED jobs to maximize user
-  satisfaction.
+The solver will try to also erase all packages dragged in through
+dependencies when erasing the package. This needs SOLVER_USERINSTALLED
+jobs to maximize user satisfaction.
 
 *SOLVER_FORCEBEST*::
-  Insist on the best package for install, update, and distupgrade jobs. If this
-  flag is not used, the solver will use the second-best package if the best
-  package cannot be installed for some reason. When this flag is used, the solver
-  will generate a problem instead.
+Insist on the best package for install, update, and distupgrade jobs. If
+this flag is not used, the solver will use the second-best package if the
+best package cannot be installed for some reason. When this flag is used,
+the solver will generate a problem instead.
 
 *SOLVER_TARGETED*::
-  Forces targeted operation update and distupgrade jobs. See the section about
-  targeted updates about more information.
+Forces targeted operation update and distupgrade jobs. See the section
+about targeted updates about more information.
 
 Set constants.
 
 *SOLVER_SETEV*::
-  The job specified the exact epoch and version of the package set.
+The job specified the exact epoch and version of the package set.
 
 *SOLVER_SETEVR*::
-  The job specified the exact epoch, version, and release of the package set.
+The job specified the exact epoch, version, and release of the package set.
 
 *SOLVER_SETARCH*::
-  The job specified the exact architecture of the packages from the set.
+The job specified the exact architecture of the packages from the set.
 
 *SOLVER_SETVENDOR*::
-  The job specified the exact vendor of the packages from the set.
+The job specified the exact vendor of the packages from the set.
 
 *SOLVER_SETREPO*::
-  The job specified the exact repository of the packages from the set.
+The job specified the exact repository of the packages from the set.
 
 *SOLVER_SETNAME*::
-  The job specified the exact name of the packages from the set.
+The job specified the exact name of the packages from the set.
 
 *SOLVER_NOAUTOSET*::
-  Turn of automatic set flag generation for SOLVER_SOLVABLE jobs.
+Turn of automatic set flag generation for SOLVER_SOLVABLE jobs.
 
 *SOLVER_SETMASK*::
-  A mask containing all the above set bits.
+A mask containing all the above set bits.
 
 See the section about set bits for more information.
 
@@ -1917,7 +1989,7 @@ different architecture. When using the Selection class to create jobs
 the set bits are automatically added, e.g. selecting ``screen.i586'' will
 automatically add SOLVER_SETARCH, and thus no problem will be reported.
 
-THE SOLVER CLASS
+The Solver Class
 ----------------
 Dependency solving is what this library is about. A solver object is needed
 for solving to store the result of the solver run. The solver object can be
@@ -1929,236 +2001,291 @@ re-use the dependency rules it already computed.
 Flags to modify some of the solver's behavior:
 
 *SOLVER_FLAG_ALLOW_DOWNGRADE*::
-  Allow the solver to downgrade packages without asking for confirmation
-  (i.e. reporting a problem).
+Allow the solver to downgrade packages without asking for confirmation
+(i.e. reporting a problem).
 
 *SOLVER_FLAG_ALLOW_ARCHCHANGE*::
-  Allow the solver to change the architecture of an installed package
-  without asking for confirmation. Note that changes to/from noarch
-  are always considered to be allowed.
+Allow the solver to change the architecture of an installed package
+without asking for confirmation. Note that changes to/from noarch
+are always considered to be allowed.
   
 *SOLVER_FLAG_ALLOW_VENDORCHANGE*::
-  Allow the solver to change the vendor of an installed package
-  without asking for confirmation. Each vendor is part of one or more
-  vendor equivalence classes, normally installed packages may only
-  change their vendor if the new vendor shares at least one equivalence
-  class.
+Allow the solver to change the vendor of an installed package
+without asking for confirmation. Each vendor is part of one or more
+vendor equivalence classes, normally installed packages may only
+change their vendor if the new vendor shares at least one equivalence
+class.
 
 *SOLVER_FLAG_ALLOW_NAMECHANGE*::
-  Allow the solver to change the name of an installed package, i.e.
-  install a package with a different name that obsoletes the installed
-  package. This option is on by default.
+Allow the solver to change the name of an installed package, i.e.
+install a package with a different name that obsoletes the installed
+package. This option is on by default.
 
 *SOLVER_FLAG_ALLOW_UNINSTALL*::
-  Allow the solver to erase installed packages to fulfill the jobs.
-  This flag also includes the above flags. You may want to set this
-  flag if you only have SOLVER_ERASE jobs, as in that case it's
-  better for the user to check the transaction overview instead of
-  approving every single package that needs to be erased.
+Allow the solver to erase installed packages to fulfill the jobs.
+This flag also includes the above flags. You may want to set this
+flag if you only have SOLVER_ERASE jobs, as in that case it's
+better for the user to check the transaction overview instead of
+approving every single package that needs to be erased.
+
+*SOLVER_FLAG_DUP_ALLOW_DOWNGRADE*::
+Like SOLVER_FLAG_ALLOW_DOWNGRADE, but used in distupgrade mode.
+
+*SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE*::
+Like SOLVER_FLAG_ALLOW_ARCHCHANGE, but used in distupgrade mode.
+
+*SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE*::
+Like SOLVER_FLAG_ALLOW_VENDORCHANGE, but used in distupgrade mode.
+
+*SOLVER_FLAG_DUP_ALLOW_NAMECHANGE*::
+Like SOLVER_FLAG_ALLOW_NAMECHANGE, but used in distupgrade mode.
 
 *SOLVER_FLAG_NO_UPDATEPROVIDE*::
-  If multiple packages obsolete an installed package, the solver checks
-  the provides of every such package and ignores all packages that
-  do not provide the installed package name. Thus, you can have an
-  official update candidate that provides the old name, and other
-  packages that also obsolete the package but are not considered for
-  updating. If you cannot use this feature, you can turn it off
-  by setting this flag.
+If multiple packages obsolete an installed package, the solver checks
+the provides of every such package and ignores all packages that
+do not provide the installed package name. Thus, you can have an
+official update candidate that provides the old name, and other
+packages that also obsolete the package but are not considered for
+updating. If you cannot use this feature, you can turn it off
+by setting this flag.
 
 *SOLVER_FLAG_SPLITPROVIDES*::
-  Make the solver aware of special provides of the form
-  ``<packagename>:<path>'' used in SUSE systems to support package
-  splits.
+Make the solver aware of special provides of the form
+``<packagename>:<path>'' used in SUSE systems to support package
+splits.
 
 *SOLVER_FLAG_IGNORE_RECOMMENDED*::
-  Do not process optional (aka weak) dependencies.
+Do not process optional (aka weak) dependencies.
 
 *SOLVER_FLAG_ADD_ALREADY_RECOMMENDED*::
-  Install recommended or supplemented packages even if they have no
-  connection to the current transaction. You can use this feature
-  to implement a simple way for the user to install new recommended
-  packages that were not available in the past.
+Install recommended or supplemented packages even if they have no
+connection to the current transaction. You can use this feature
+to implement a simple way for the user to install new recommended
+packages that were not available in the past.
   
 *SOLVER_FLAG_NO_INFARCHCHECK*::
-  Turn off the inferior architecture checking that is normally done
-  by the solver. Normally, the solver allows only the installation
-  of packages from the "best" architecture if a package is available
-  for multiple architectures.
+Turn off the inferior architecture checking that is normally done
+by the solver. Normally, the solver allows only the installation
+of packages from the "best" architecture if a package is available
+for multiple architectures.
 
 *SOLVER_FLAG_BEST_OBEY_POLICY*::
-  Make the SOLVER_FORCEBEST job option consider only packages that
-  meet the policies for installed packages, i.e. no downgrades,
-  no architecture change, no vendor change (see the first flags
-  of this section). If the flag is not specified, the solver will
-  enforce the installation of the best package ignoring the
-  installed packages, which may conflict with the set policy.
+Make the SOLVER_FORCEBEST job option consider only packages that
+meet the policies for installed packages, i.e. no downgrades,
+no architecture change, no vendor change (see the first flags
+of this section). If the flag is not specified, the solver will
+enforce the installation of the best package ignoring the
+installed packages, which may conflict with the set policy.
 
 *SOLVER_FLAG_NO_AUTOTARGET*::
-  Do not enable auto-targeting up update and distupgrade jobs. See
-  the section on targeted updates for more information.
+Do not enable auto-targeting up update and distupgrade jobs. See
+the section on targeted updates for more information.
 
 Basic rule types:
 
 *SOLVER_RULE_UNKNOWN*::
-  A rule of an unknown class. You should never encounter those.
+A rule of an unknown class. You should never encounter those.
 
 *SOLVER_RULE_RPM*::
-  A package dependency rule, called rpm rule for historical reasons.
+A package dependency rule, called rpm rule for historical reasons.
 
 *SOLVER_RULE_UPDATE*::
-  A rule to implement the update policy of installed packages. Every
-  installed package has an update rule that consists of the packages
-  that may replace the installed package.
+A rule to implement the update policy of installed packages. Every
+installed package has an update rule that consists of the packages
+that may replace the installed package.
 
 *SOLVER_RULE_FEATURE*::
-  Feature rules are fallback rules used when a update rule is disabled.
-  They include all packages that may replace the installed package
-  ignoring the update policy, i.e. they contain downgrades, arch
-  changes and so on. Without them, the solver would simply erase
-  installed packages if their update rule gets disabled.
+Feature rules are fallback rules used when a update rule is disabled. They
+include all packages that may replace the installed package ignoring the
+update policy, i.e. they contain downgrades, arch changes and so on.
+Without them, the solver would simply erase installed packages if their
+update rule gets disabled.
 
 *SOLVER_RULE_JOB*::
-  Job rules implement the job given to the solver.
+Job rules implement the job given to the solver.
 
 *SOLVER_RULE_DISTUPGRADE*::
-  This are simple negative assertions that make sure that only packages
-  are kept that are also available in one of the repositories.
+This are simple negative assertions that make sure that only packages
+are kept that are also available in one of the repositories.
 
 *SOLVER_RULE_INFARCH*::
-  Infarch rules are also negative assertions, they disallow the installation
-  of packages when there are packages of the same name but with a better
-  architecture.
+Infarch rules are also negative assertions, they disallow the installation
+of packages when there are packages of the same name but with a better
+architecture.
 
 *SOLVER_RULE_CHOICE*::
-  Choice rules are used to make sure that the solver prefers updating to
-  installing different packages when some dependency is provided by
-  multiple packages with different names. The solver may always break
-  choice rules, so you will not see them when a problem is found.
+Choice rules are used to make sure that the solver prefers updating to
+installing different packages when some dependency is provided by
+multiple packages with different names. The solver may always break
+choice rules, so you will not see them when a problem is found.
 
 *SOLVER_RULE_LEARNT*::
-  These rules are generated by the solver to keep it from running into
-  the same problem multiple times when it has to backtrack. They are
-  the main reason why a sat solver is faster then other dependency solver
-  implementations.
+These rules are generated by the solver to keep it from running into
+the same problem multiple times when it has to backtrack. They are
+the main reason why a sat solver is faster then other dependency solver
+implementations.
 
 Special dependency rule types:
 
 *SOLVER_RULE_RPM_NOT_INSTALLABLE*::
-  This rule was added to prevent the installation of a package of an
-  architecture that does not work on the system.
+This rule was added to prevent the installation of a package of an
+architecture that does not work on the system.
 
 *SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP*::
-  The package contains a required dependency which was not provided by
-  any package.
+The package contains a required dependency which was not provided by
+any package.
 
 *SOLVER_RULE_RPM_PACKAGE_REQUIRES*::
-  Similar to SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP, but in this case
-  some packages provided the dependency but none of them could be
-  installed due to other dependency issues.
+Similar to SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP, but in this case
+some packages provided the dependency but none of them could be
+installed due to other dependency issues.
 
 *SOLVER_RULE_RPM_SELF_CONFLICT*::
-  The package conflicts with itself. This is not allowed by older rpm
-  versions.
+The package conflicts with itself. This is not allowed by older rpm
+versions.
 
 *SOLVER_RULE_RPM_PACKAGE_CONFLICT*::
-  To fulfill the dependencies two packages need to be installed, but
-  one of the packages contains a conflict with the other one.
+To fulfill the dependencies two packages need to be installed, but
+one of the packages contains a conflict with the other one.
 
 *SOLVER_RULE_RPM_SAME_NAME*::
-  The dependencies can only be fulfilled by multiple versions of
-  a package, but installing multiple versions of the same package
-  is not allowed.
+The dependencies can only be fulfilled by multiple versions of
+a package, but installing multiple versions of the same package
+is not allowed.
 
 *SOLVER_RULE_RPM_PACKAGE_OBSOLETES*::
-  To fulfill the dependencies two packages need to be installed, but
-  one of the packages obsoletes the other one.
+To fulfill the dependencies two packages need to be installed, but
+one of the packages obsoletes the other one.
 
 *SOLVER_RULE_RPM_IMPLICIT_OBSOLETES*::
-  To fulfill the dependencies two packages need to be installed, but
-  one of the packages has provides a dependency that is obsoleted
-  by the other one. See the POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES
-  flag.
+To fulfill the dependencies two packages need to be installed, but
+one of the packages has provides a dependency that is obsoleted
+by the other one. See the POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES
+flag.
 
 *SOLVER_RULE_RPM_INSTALLEDPKG_OBSOLETES*::
-  To fulfill the dependencies a package needs to be installed that is
-  obsoleted by an installed package. See the POOL_FLAG_NOINSTALLEDOBSOLETES
-  flag.
+To fulfill the dependencies a package needs to be installed that is
+obsoleted by an installed package. See the POOL_FLAG_NOINSTALLEDOBSOLETES
+flag.
 
 *SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP*::
-  The user asked for installation of a package providing a specific
-  dependency, but no available package provides it.
+The user asked for installation of a package providing a specific
+dependency, but no available package provides it.
 
 *SOLVER_RULE_JOB_UNKNOWN_PACKAGE*::
-  The user asked for installation of a package with a specific name,
-  but no available package has that name.
+The user asked for installation of a package with a specific name,
+but no available package has that name.
 
 *SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM*::
-  The user asked for the erasure of a dependency that is provided by the
-  system (i.e. for special hardware or language dependencies), this
-  cannot be done with a job.
+The user asked for the erasure of a dependency that is provided by the
+system (i.e. for special hardware or language dependencies), this
+cannot be done with a job.
 
 *SOLVER_RULE_JOB_UNSUPPORTED*::
-  The user asked for something that is not yet implemented, e.g. the
-  installation of all packages at once.
+The user asked for something that is not yet implemented, e.g. the
+installation of all packages at once.
 
 Policy error constants
 
 *POLICY_ILLEGAL_DOWNGRADE*::
-  The solver ask for permission before downgrading packages.
+The solver ask for permission before downgrading packages.
 
 *POLICY_ILLEGAL_ARCHCHANGE*::
-  The solver ask for permission before changing the architecture of installed
-  packages.
+The solver ask for permission before changing the architecture of installed
+packages.
 
 *POLICY_ILLEGAL_VENDORCHANGE*::
-  The solver ask for permission before changing the vendor of installed
-  packages.
+The solver ask for permission before changing the vendor of installed
+packages.
 
 *POLICY_ILLEGAL_NAMECHANGE*::
-  The solver ask for permission before replacing an installed packages with
-  a package that has a different name.
+The solver ask for permission before replacing an installed packages with
+a package that has a different name.
 
 Solution element type constants
 
 *SOLVER_SOLUTION_JOB*::
-  The problem can be solved by removing the specified job.
+The problem can be solved by removing the specified job.
 
 *SOLVER_SOLUTION_POOLJOB*::
-  The problem can be solved by removing the specified job that is defined in the pool.
+The problem can be solved by removing the specified job that is defined
+in the pool.
 
 *SOLVER_SOLUTION_INFARCH*::
-  The problem can be solved by allowing the installation of the specified package
-  with an inferior architecture.
+The problem can be solved by allowing the installation of the specified
+package with an inferior architecture.
 
 *SOLVER_SOLUTION_DISTUPGRADE*::
-  The problem can be solved by allowing to keep the specified package installed.
+The problem can be solved by allowing to keep the specified package
+installed.
 
 *SOLVER_SOLUTION_BEST*::
-  The problem can be solved by allowing to install the specified package that is
-  not the best available package.
+The problem can be solved by allowing to install the specified package
+that is not the best available package.
 
 *SOLVER_SOLUTION_ERASE*::
-  The problem can be solved by allowing to erase the specified package.
+The problem can be solved by allowing to erase the specified package.
 
 *SOLVER_SOLUTION_REPLACE*::
-  The problem can be solved by allowing to replace the package with some other
-  package.
+The problem can be solved by allowing to replace the package with some
+other package.
 
 *SOLVER_SOLUTION_REPLACE_DOWNGRADE*::
-  The problem can be solved by allowing to replace the package with some other
-  package that has a lower version.
+The problem can be solved by allowing to replace the package with some
+other package that has a lower version.
 
 *SOLVER_SOLUTION_REPLACE_ARCHCHANGE*::
-  The problem can be solved by allowing to replace the package with some other
-  package that has a different architecture.
+The problem can be solved by allowing to replace the package with some
+other package that has a different architecture.
 
 *SOLVER_SOLUTION_REPLACE_VENDORCHANGE*::
-  The problem can be solved by allowing to replace the package with some other
-  package that has a different vendor.
+The problem can be solved by allowing to replace the package with some
+other package that has a different vendor.
 
 *SOLVER_SOLUTION_REPLACE_NAMECHANGE*::
-  The problem can be solved by allowing to replace the package with some other
-  package that has a different name.
+The problem can be solved by allowing to replace the package with some
+other package that has a different name.
+
+
+Reason constants
+
+*SOLVER_REASON_UNRELATED*::
+The package status did not change as it was not related to any job.
+
+*SOLVER_REASON_UNIT_RULE*::
+The package was installed/erased/kept because of a unit rule, i.e. a rule
+where all literals but one were false.
+
+*SOLVER_REASON_KEEP_INSTALLED*::
+The package was chosen when trying to keep as many packages installed as
+possible.
+
+*SOLVER_REASON_RESOLVE_JOB*::
+The decision happened to fulfill a job rule.
+
+*SOLVER_REASON_UPDATE_INSTALLED*::
+The decision happened to fulfill a package update request.
+
+*SOLVER_REASON_CLEANDEPS_ERASE*::
+The package was erased when cleaning up dependencies from other erased
+packages.
+
+*SOLVER_REASON_RESOLVE*::
+The package was installed to fulfill package dependencies.
+
+*SOLVER_REASON_WEAKDEP*::
+The package was installed because of a weak dependency (Recommends or
+Supplements).
+
+*SOLVER_REASON_RESOLVE_ORPHAN*::
+The decision about the package was made when deciding the fate of orphaned
+packages.
+
+*SOLVER_REASON_RECOMMENDED*::
+This is a special case of SOLVER_REASON_WEAKDEP.
+
+*SOLVER_REASON_SUPPLEMENTED*::
+This is a special case of SOLVER_REASON_WEAKDEP.
 
 
 === ATTRIBUTES ===
@@ -2173,14 +2300,14 @@ Back pointer to pool.
 === METHODS ===
 
        int set_flag(int flag, int value)
-       my $oldvalue = $pool->set_flag($flag, $value);
-       oldvalue = pool.set_flag(flag, value)
-       oldvalue = pool.set_flag(flag, value)
+       my $oldvalue = $solver->set_flag($flag, $value);
+       oldvalue = solver.set_flag(flag, value)
+       oldvalue = solver.set_flag(flag, value)
 
        int get_flag(int flag)
-       my $value = $pool->get_flag($flag);
-       value = pool.get_flag(flag)
-       value = pool.get_flag(flag)
+       my $value = $solver->get_flag($flag);
+       value = solver.get_flag(flag)
+       value = solver.get_flag(flag)
 
 Set/get a solver specific flag. The flags define the policies the solver has
 to obey. The flags are explained in the CONSTANTS section of this class.
@@ -2204,7 +2331,15 @@ Return the transaction to implement the calculated package changes. A transactio
 is available even if problems were found, this is useful for interactive user
 interfaces that show both the job result and the problems.
 
-THE PROBLEM CLASS
+       int reason = describe_decision(Solvable *s, Rule *OUTPUT)
+       my ($reason, $rule) = $solver->describe_decision($solvable);
+       (reason, rule) = solver.describe_decision(solvable)
+       (reason, rule) = solver.describe_decision(solvable)
+
+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.
+
+The Problem Class
 -----------------
 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
@@ -2263,7 +2398,16 @@ the solution class for more information.
 
 Return the number of solutions without creating solution objects.
 
-THE RULE CLASS
+       <stringification>
+       my $str = $problem->str;
+       str = str(problem)
+       str = problem.to_s
+
+Return a string describing the problem. This is a convenience function, it is
+a shorthand for calling findproblemrule(), then ruleinfo() on the problem
+rule and problemstr() on the ruleinfo object.
+
+The Rule Class
 --------------
 Rules are the basic block of sat solving. Each package dependency gets translated
 into one or multiple rules.
@@ -2317,7 +2461,7 @@ an array of all infos about a rule.
 
 Two rules are equal if they belong to the same solver and have the same id.
 
-THE RULEINFO CLASS
+The Ruleinfo Class
 ------------------
 A Ruleinfo describes one reason why a rule was created.
 
@@ -2375,7 +2519,7 @@ the dependency for conflicts.
 A string describing the ruleinfo from a problem perspective. This probably
 only makes sense if the rule is part of a problem.
 
-THE SOLUTION CLASS
+The Solution Class
 ------------------
 A solution solves one specific problem. It consists of multiple solution elements
 that all need to be executed.
@@ -2425,7 +2569,7 @@ count does not match the number of objects returned by the elements() method
 of expandreplaces is set to true.
 
 
-THE SOLUTIONELEMENT CLASS
+The Solutionelement Class
 -------------------------
 A solution element describes a single action of a solution. The action is always
 either to remove one specific job or to add a new job that installs or erases
@@ -2531,7 +2675,7 @@ you should replace the old job with the new one.
 
 A string describing the change the solution element consists of.
 
-THE TRANSACTION CLASS
+The Transaction Class
 ---------------------
 Transactions describe the output of a solver run. A transaction contains
 a number of transaction elements, each either the installation of a new
@@ -2545,114 +2689,114 @@ way.
 Transaction element types, both active and passive
 
 *SOLVER_TRANSACTION_IGNORE*::
-  This element does nothing. Used to map element types that do not
-  match the view mode.
+This element does nothing. Used to map element types that do not match
+the view mode.
 
 *SOLVER_TRANSACTION_INSTALL*::
-  This element installs a package.
+This element installs a package.
 
 *SOLVER_TRANSACTION_ERASE*::
-  This element erases a package.
+This element erases a package.
 
 *SOLVER_TRANSACTION_MULTIINSTALL*::
-  This element installs a package with a different version keeping the
-  other versions installed.
+This element installs a package with a different version keeping the other
+versions installed.
 
 *SOLVER_TRANSACTION_MULTIREINSTALL*::
-  This element reinstalls a installed package keeping the other versions
-  installed.
+This element reinstalls a installed package keeping the other versions
+installed.
 
 Transaction element types, active view
 
 *SOLVER_TRANSACTION_REINSTALL*::
-  This element re-installs a package, i.e. installs the same package again.
+This element re-installs a package, i.e. installs the same package again.
 
 *SOLVER_TRANSACTION_CHANGE*::
-  This element installs a package with same name, version, architecture but
-  different content.
+This element installs a package with same name, version, architecture but
+different content.
 
 *SOLVER_TRANSACTION_UPGRADE*::
-  This element installs a newer version of an installed package.
+This element installs a newer version of an installed package.
 
 *SOLVER_TRANSACTION_DOWNGRADE*::
-  This element installs a older version of an installed package.
+This element installs a older version of an installed package.
 
 *SOLVER_TRANSACTION_OBSOLETES*::
-  This element installs a package that obsoletes an installed package.
+This element installs a package that obsoletes an installed package.
 
 Transaction element types, passive view
 
 *SOLVER_TRANSACTION_REINSTALLED*::
-  This element re-installs a package, i.e. installs the same package again.
+This element re-installs a package, i.e. installs the same package again.
 
 *SOLVER_TRANSACTION_CHANGED*::
-  This element replaces an installed package with one of the same name,
-  version, architecture but different content.
+This element replaces an installed package with one of the same name,
+version, architecture but different content.
 
 *SOLVER_TRANSACTION_UPGRADED*::
-  This element replaces an installed package with a new version.
+This element replaces an installed package with a new version.
 
 *SOLVER_TRANSACTION_DOWNGRADED*::
-  This element replaces an installed package with an old version.
+This element replaces an installed package with an old version.
 
 *SOLVER_TRANSACTION_OBSOLETED*::
-  This element replaces an installed package with a package that obsoletes
-  it.
+This element replaces an installed package with a package that obsoletes
+it.
 
 Pseudo element types for showing extra information used by classify()
 
 *SOLVER_TRANSACTION_ARCHCHANGE*::
-  This element replaces an installed package with a package of a different
-  architecture.
+This element replaces an installed package with a package of a different
+architecture.
 
 *SOLVER_TRANSACTION_VENDORCHANGE*::
-  This element replaces an installed package with a package of a different
-  vendor.
+This element replaces an installed package with a package of a different
+vendor.
 
 Transaction mode flags
 
 *SOLVER_TRANSACTION_SHOW_ACTIVE*::
-  Filter for active view types. The default is to return passive view type,
-  i.e. to show how the installed packages get changed.
+Filter for active view types. The default is to return passive view type,
+i.e. to show how the installed packages get changed.
 
 *SOLVER_TRANSACTION_SHOW_OBSOLETES*::
-  Do not map the obsolete view type into INSTALL/ERASE elements.
+Do not map the obsolete view type into INSTALL/ERASE elements.
 
 *SOLVER_TRANSACTION_SHOW_ALL*::
-  If multiple packages replace an installed package, only the best of them
-  is kept as OBSOLETE element, the other ones are mapped to INSTALL/ERASE
-  elements. This is because most applications want to show just one package
-  replacing the installed one. The SOLVER_TRANSACTION_SHOW_ALL makes the
-  library keep all OBSOLETE elements.
+If multiple packages replace an installed package, only the best of them
+is kept as OBSOLETE element, the other ones are mapped to INSTALL/ERASE
+elements. This is because most applications want to show just one package
+replacing the installed one. The SOLVER_TRANSACTION_SHOW_ALL makes the
+library keep all OBSOLETE elements.
 
 *SOLVER_TRANSACTION_SHOW_MULTIINSTALL*::
-  The library maps MULTIINSTALL elements to simple INSTALL elements. This
-  flag can be used to disable the mapping.
+The library maps MULTIINSTALL elements to simple INSTALL elements. This
+flag can be used to disable the mapping.
 
 *SOLVER_TRANSACTION_CHANGE_IS_REINSTALL*::
-  Use this flag if you want to map CHANGE elements to the REINSTALL type.
+Use this flag if you want to map CHANGE elements to the REINSTALL type.
 
 *SOLVER_TRANSACTION_OBSOLETE_IS_UPGRADE*::
-  Use this flag if you want to map OBSOLETE elements to the UPGRADE type.
+Use this flag if you want to map OBSOLETE elements to the UPGRADE type.
 
 *SOLVER_TRANSACTION_MERGE_ARCHCHANGES*::
-  Do not add extra categories for every architecture change, instead cumulate
-  them in one category.
+Do not add extra categories for every architecture change, instead cumulate
+them in one category.
   
 *SOLVER_TRANSACTION_MERGE_VENDORCHANGES*::
-  Do not add extra categories for every vendor change, instead cumulate
-  them in one category.
+Do not add extra categories for every vendor change, instead cumulate
+them in one category.
 
 *SOLVER_TRANSACTION_RPM_ONLY*::
-  Special view mode that just returns IGNORE, ERASE, INSTALL, MULTIINSTALL
-  elements. Useful if you want to find out what to feed to the underlying
-  package manager.
+Special view mode that just returns IGNORE, ERASE, INSTALL, MULTIINSTALL
+elements. Useful if you want to find out what to feed to the underlying
+package manager.
 
 Transaction order flags
 
 *SOLVER_TRANSACTION_KEEP_ORDERDATA*::
-  Do not throw away the dependency graph used for ordering the transaction.
-  This flag is needed if you want to do manual ordering.
+Do not throw away the dependency graph used for ordering the transaction.
+This flag is needed if you want to do manual ordering.
 
 === ATTRIBUTES ===
 
@@ -2781,7 +2925,7 @@ in active mode. If the mode contains SOLVER_TRANSACTION_SHOW_ALL, the
 passive mode list will be unchanged but the active mode list will just
 contain A-2-1.
 
-THE TRANSACTIONCLASS CLASS
+The Transactionclass Class
 --------------------------
 Objects of this type are returned by the classify() Transaction method.
 
@@ -2845,7 +2989,7 @@ The id of the new vendor or architecture.
 
 Return the solvables for all transaction elements in the class.
 
-CHECKSUMS
+Checksums
 ---------
 Checksums (also called hashes) are used to make sure that downloaded data is
 not corrupt and also as a fingerprint mechanism to check if data has changed.
@@ -2927,6 +3071,13 @@ result can contain NUL bytes or unprintable characters.
 
 Finalize the checksum and return the result as hex string.
 
+       const char *typestr()
+       my $typestr = $chksum->typestr();
+       typestr = chksum.typestr
+       typestr = chksum.typestr
+
+Return the type of the checksum as a string, e.g. "sha256".
+
        <equality>
        if ($chksum1 == $chksum2)
        if chksum1 == chksum2:
@@ -2944,7 +3095,7 @@ If the checksum is finished, the checksum is returned as "<type>:<hex>" string.
 Otherwise "<type>:unfinished" is returned.
 
 
-FILE MANAGEMENT
+File Management
 ---------------
 This functions were added because libsolv uses standard *FILE* pointers to
 read/write files, but languages like perl have their own implementation of
@@ -3005,7 +3156,7 @@ style to close open files so that the file descriptors are freed right away.
 Returns false if there was an error.
 
 
-THE REPODATA CLASS
+The Repodata Class
 ------------------
 The Repodata stores attributes for packages and the repository itself, each
 repository can have multiple repodata areas. You normally only need to
@@ -3030,7 +3181,7 @@ Back pointer to repository object.
 
 The id of the repodata area. Repodata ids of different repositories overlap.
 
-=== METHODS ====
+=== METHODS ===
 
        internalize();
        $data->internalize();
@@ -3150,7 +3301,7 @@ handle as solvid to fill the structure with data and call add_flexarray
 to put the structure in an array.
 
 
-THE DATAPOS CLASS
+The Datapos Class
 -----------------
 Datapos objects describe a specific position in the repository data area.
 Thus they are only valid until the repository is modified in some way.
@@ -3226,6 +3377,18 @@ Return the delta rpm sequence from the structure describing a delta rpm.
 Lookup functions. Note that the returned Ids are always translated into
 the Ids of the global pool even if the repodata area contains its own pool.
 
+       Dataiterator Dataiterator(Id keyname, const char *match = 0, int flags = 0)
+       my $di = $datapos->Dataiterator($keyname, $match, $flags);
+       di = datapos.Dataiterator(keyname, match, flags)
+       di = datapos.Dataiterator(keyname, match, flags)
+
+       for my $d (@$di)
+       for d in di:
+       for d in di
+
+Iterate over the matching data elements. See the Dataiterator class for more
+information.
+
 Author
 ------
 Michael Schroeder <mls@suse.de>