# Module Cudf

    module Cudf: sig .. end

CUDF library

CUDF documents

    type package = {

`` | `package : `Cudf_types.pkgname`;`
`` | `version : `Cudf_types.version`;`
`` | `depends : `Cudf_types.vpkgformula`;`
`` | `conflicts : `Cudf_types.vpkglist`;`
`` | `provides : `Cudf_types.veqpkglist`;`
`` | `installed : `bool`;`
`` | `was_installed : `bool`;`
`` | `keep : `Cudf_types.enum_keep`;`
`` | `pkg_extra : `Cudf_types.typed_value Cudf_types.stanza`;`

`}`

Representation of a parsed package description item.

With this representation, optional properties have already been expanded to their default values (if they have one). It is not possible to know whether they were present or not in the CUDF syntax.

    val (=%) : package -> package -> bool

package equality up to <name, version> i.e. 2 packages are equal iff they have the same name and version

    val (<%) : package -> package -> int

Package comparison up to <name, version>. Same rules of package equality, but providing a suitable replacement for `Pervasives.compare`; useful for sorting.

    val (>%) : package -> package -> int

Same as `Cudf.(<%)`, but sort with greater versions first.

    type request = {

`` | `request_id : `string`;`
`` | `install : `Cudf_types.vpkglist`;`
`` | `remove : `Cudf_types.vpkglist`;`
`` | `upgrade : `Cudf_types.vpkglist`;`
`` | `req_extra : `Cudf_types.typed_value Cudf_types.stanza`;`

`}`

    type preamble = {

`` | `preamble_id : `string`;` | `(*` | text following the "preamble: " postmark | `*)`
`` | `property : `Cudf_types.typedecl`;` | `(*` | extra property declarations | `*)`
`` | `univ_checksum : `string`;` | `(*` | universe checksum | `*)`
`` | `status_checksum : `string`;` | `(*` | status checksum | `*)`
`` | `req_checksum : `string`;` | `(*` | request checksum | `*)`

`}`

    val default_preamble : preamble

implement preamble defaults

    val default_package : package

implement package defaults

    val default_request : request

implement request defaults

Syntactic CUDF representation

    type cudf_doc = preamble option * package list * request

a CUDF document with its information items

    type cudf_item = [ `Package of package
           | `Preamble of preamble
           | `Request of request ]

a single information item

Semantic CUDF representation

    exception Constraint_violation of string

violation of a constraint imposed by CUDF specification

    type universe

package universe (including package status, i.e., installed packages)

    type cudf = preamble * universe * request

    type solution = preamble * universe

CUDF-based encoding of solutions, see CUDF 2.0, appendix B

A universe encoding a solution matters only for its `installed` packages, which are considered to be the resulting package status

    val empty_universe : ?size:int -> unit -> universe

return an empty universe.

`size` : represents the initial size of the universe (default: 1023)

    val load_universe : package list -> universe

- Raises `Constraint_violation` when a global CUDF constraint is violated in the given package list

    val add_package : universe -> package -> unit

add a package to an existing universe. The universe is modified in place.

- Raises `Constraint_violation` if a package with the same name and version is alreayd in the given universe

    val remove_package : universe -> Cudf_types.pkgname * Cudf_types.version -> unit

remove a package from an existing universe. The universe is modified in place

###### CUDF manipulation

    val lookup_package : universe -> Cudf_types.pkgname * Cudf_types.version -> package

Lookup a specific package via a <name, version> key

- Raises `Not_found` if the requested package cannot be found

    val mem_package : universe -> Cudf_types.pkgname * Cudf_types.version -> bool

Check existence of a specific package in the universe via a <name, version> key

    val mem_installed : ?include_features:bool ->
           ?ignore:(package -> bool) -> universe -> Cudf_types.vpkg -> bool

check wheather a given package constraint is satisfied in a given package status (i.e., the universe subset of `installed` packages)

`include_features` : allow constraint to be satisfied by features (i.e., Provides). Default: true
`ignore` : make the lookup skip over all packages matching the given package predicate. Default: do not ignore any package

    val who_provides : ?installed:bool ->
           universe ->
           Cudf_types.vpkg -> (package * Cudf_types.version option) list

Ask who provides a given feature (predicate).

- Returns a list of packages providing the requested feature. Each package is paired with an optional version; if it is None, the given package provides all possible version of the feature; it if is Some v, the given package only provides version `v` of the feature.

`installed` : : consider only installed packages (default)

    val lookup_packages : ?filter:Cudf_types.constr ->
           universe -> Cudf_types.pkgname -> package list

lookup all available versions of a given package name

`filter` : filter the found packages according to the given version constraint. Default: None (i.e., no filtering)

    val get_installed : universe -> Cudf_types.pkgname -> package list

lookup all installed versions of a given package name. Shorthand for `lookup_packages` composed with filtering on installed=true

    val uid_by_package : universe -> package -> int

return a unique integer identifier for the given package in the universe

- Raises `Not_found` if the given package cannot be found in the universe

    val package_by_uid : universe -> int -> package

return the package corresponding to the given unique identifier

- Raises `Not_found` if no package in the universe corresponds to the given unique identifier

    val iter_packages : (package -> unit) -> universe -> unit

iter over all packages in the universe

    val fold_packages : ('a -> package -> 'a) -> 'a -> universe -> 'a

fold over all packages in the universe

    val iteri_packages : (int -> package -> unit) -> universe -> unit

iter on all packages in the universe, passing to the iteration function both the package and its unique identifier

    val iter_packages_by_name : (Cudf_types.pkgname -> package list -> unit) -> universe -> unit

iter on all packages grouped by name. Each package name is associated to a list of packages with the same name and different versions

    val fold_packages_by_name : ('a -> Cudf_types.pkgname -> package list -> 'a) ->
           'a -> universe -> 'a

fold on all packages grouped by name. Each package name is associated to a list of packages with the same name and different versions

    val package_names : universe -> Cudf_types.pkgname list

return the list of all unique package names

    val get_packages : ?filter:(package -> bool) -> universe -> package list

conversion from universe to plain package list

`filter` : only return packages matching a given predicate. Default is to return all packages

    val universe_size : universe -> int

total numer of available packages (no matter whether they are installed or not)

    val installed_size : universe -> int

total number of installed packages occurring in the universe

    val status : universe -> universe

Projection on packages having "installed: true".

Inefficient (involves Hashtbl.t cloning), use with care.

###### Low-level stanza manipulation

    val lookup_package_property : package -> string -> string

low-level property lookup: given a package, lookup on it a property by name, returning its (pretty-printed, see `Cudf_types`) value as a string

- Raises `Not_found` if the given property name is not associated to the given package (note that "being associated with" does not necessarily mean that the property appears in the stanza, due to default values)

    val lookup_request_property : request -> string -> string

Same as `Cudf.lookup_package_property`, but acting on request information items.

To lookup the request identifier as a string (which strictly speaking is not a property) you should lookup "request"

    val lookup_preamble_property : preamble -> string -> string

Same as `Cudf.lookup_package_property`, but acting on preamble information items.

To lookup the preamble identifier as a string (which strictly speaking is not a property) you should lookup "preamble"

    val lookup_typed_package_property : package -> string -> Cudf_types.typed_value

Same as `Cudf.lookup_package_property`, but return a typed value.

    val lookup_typed_request_property : request -> string -> Cudf_types.typed_value

Same as `Cudf.lookup_request_property`, but return a typed value.

    val lookup_typed_preamble_property : preamble -> string -> Cudf_types.typed_value

Same as `Cudf.lookup_preamble_property`, but return a typed value.

    val lookup_package_typedecl : ?extra:Cudf_types.typedecl -> string -> Cudf_types.typedecl1

lookup the type declaration of a given property (either core or extra)

- Raises `Not_found` if no declaration could be found for the given property

    val version_matches : Cudf_types.version -> Cudf_types.constr -> bool

Check whether a version matches a version constraint, e.g. `version_matches 1 (Some(`Eq, 2)) = false`

    val (|=) : Cudf_types.version -> Cudf_types.constr -> bool

Same as `Cudf.version_matches`