rhughes@241: /* rhughes@241: * Copyright (C) 2008 Kristian Høgsberg rhughes@241: * Copyright (C) 2008 Red Hat, Inc rhughes@241: * rhughes@241: * This program is free software; you can redistribute it and/or modify rhughes@241: * it under the terms of the GNU General Public License as published by rhughes@241: * the Free Software Foundation; either version 2 of the License, or rhughes@241: * (at your option) any later version. rhughes@241: * rhughes@241: * This program is distributed in the hope that it will be useful, rhughes@241: * but WITHOUT ANY WARRANTY; without even the implied warranty of rhughes@241: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the rhughes@241: * GNU General Public License for more details. rhughes@241: * rhughes@241: * You should have received a copy of the GNU General Public License along rhughes@241: * with this program; if not, write to the Free Software Foundation, Inc., rhughes@241: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. rhughes@241: */ rhughes@241: rhughes@241: #ifndef _RAZOR_H_ rhughes@241: #define _RAZOR_H_ rhughes@241: jbowes@284: #include jbowes@284: jbowes@258: enum razor_repo_file_type { jbowes@258: RAZOR_REPO_FILE_MAIN, jbowes@258: RAZOR_REPO_FILE_DETAILS, jbowes@258: RAZOR_REPO_FILE_FILES jbowes@258: }; jbowes@258: richard@302: enum razor_detail_type { richard@307: RAZOR_DETAIL_LAST = 0, /* the sentinel */ richard@307: RAZOR_DETAIL_NAME, richard@302: RAZOR_DETAIL_VERSION, richard@302: RAZOR_DETAIL_ARCH, richard@302: RAZOR_DETAIL_SUMMARY, richard@302: RAZOR_DETAIL_DESCRIPTION, richard@302: RAZOR_DETAIL_URL, richard@302: RAZOR_DETAIL_LICENSE richard@302: }; richard@302: krh@247: enum razor_property_flags { krh@247: RAZOR_PROPERTY_LESS = 1 << 0, krh@247: RAZOR_PROPERTY_GREATER = 1 << 1, krh@247: RAZOR_PROPERTY_EQUAL = 1 << 2, krh@247: RAZOR_PROPERTY_RELATION_MASK = krh@247: RAZOR_PROPERTY_LESS | krh@247: RAZOR_PROPERTY_GREATER | krh@247: RAZOR_PROPERTY_EQUAL, krh@247: krh@247: RAZOR_PROPERTY_REQUIRES = 0 << 3, krh@247: RAZOR_PROPERTY_PROVIDES = 1 << 3, krh@247: RAZOR_PROPERTY_CONFLICTS = 2 << 3, krh@247: RAZOR_PROPERTY_OBSOLETES = 3 << 3, krh@247: RAZOR_PROPERTY_TYPE_MASK = 3 << 3, krh@247: krh@247: RAZOR_PROPERTY_PRE = 1 << 5, krh@247: RAZOR_PROPERTY_POST = 1 << 6, krh@247: RAZOR_PROPERTY_PREUN = 1 << 7, krh@247: RAZOR_PROPERTY_POSTUN = 1 << 8 rhughes@241: }; rhughes@241: krh@262: /** krh@262: * SECTION:set krh@262: * @title: Package Set krh@262: * @short_description: Represents a set of packages and their metadata. krh@262: * krh@262: * This object represents a set of packages, their dependency krh@262: * information, the file lists and a number of other details. krh@262: **/ rhughes@241: krh@262: struct razor_set; krh@262: struct razor_package; krh@262: struct razor_property; krh@262: krh@262: /** krh@262: * razor_set_create: krh@262: * krh@262: * Create a new #razor_set object. krh@262: * krh@262: * Returns: the new #razor_set object. krh@262: **/ rhughes@241: struct razor_set *razor_set_create(void); rhughes@241: struct razor_set *razor_set_open(const char *filename); rhughes@241: void razor_set_destroy(struct razor_set *set); jbowes@258: int razor_set_write_to_fd(struct razor_set *set, int fd, jbowes@258: enum razor_repo_file_type type); jbowes@258: int razor_set_write(struct razor_set *set, const char *filename, jbowes@258: enum razor_repo_file_type type); jbowes@258: jbowes@288: int razor_set_open_details(struct razor_set *set, const char *filename); jbowes@288: int razor_set_open_files(struct razor_set *set, const char *filename); rhughes@241: rhughes@241: struct razor_package * rhughes@241: razor_set_get_package(struct razor_set *set, const char *package); rhughes@241: jbowes@258: void richard@304: razor_package_get_details(struct razor_set *set, richard@307: struct razor_package *package, ...); jbowes@258: krh@262: krh@262: /** krh@262: * SECTION:iterator krh@262: * @title: Iterators krh@262: * @short_description: Objects for traversing packages or properties. krh@262: * krh@262: * The razor iterator objects provides a way to iterate through a set krh@262: * of packages or properties. krh@262: **/ krh@262: rhughes@241: struct razor_package_iterator; krh@262: krh@262: /** krh@262: * razor_package_iterator_create: krh@262: * krh@262: * Create a new #razor_package_iterator object. krh@262: * krh@262: * Returns: the new #razor_package_iterator object. krh@262: **/ krh@262: rhughes@241: struct razor_package_iterator * rhughes@241: razor_package_iterator_create(struct razor_set *set); krh@262: krh@262: /** krh@262: * razor_package_iterator_create_for_property: krh@262: * krh@262: * Create a new #razor_package_iterator object for the packages that krh@262: * own the given property. krh@262: * krh@262: * Returns: the new #razor_package_iterator object. krh@262: **/ rhughes@241: struct razor_package_iterator * rhughes@241: razor_package_iterator_create_for_property(struct razor_set *set, rhughes@241: struct razor_property *property); jbowes@277: jbowes@277: /** jbowes@277: * razor_package_iterator_create_for_file: jbowes@277: * jbowes@277: * Create a new #razor_package_iterator object for the packages that jbowes@277: * contain the given file name. jbowes@277: * jbowes@277: * Returns: the new #razor_package_iterator object. jbowes@277: **/ rhughes@241: struct razor_package_iterator * rhughes@241: razor_package_iterator_create_for_file(struct razor_set *set, rhughes@241: const char *filename); rhughes@241: rhughes@241: int razor_package_iterator_next(struct razor_package_iterator *pi, richard@307: struct razor_package **package, ...); rhughes@241: void razor_package_iterator_destroy(struct razor_package_iterator *pi); rhughes@241: rhughes@241: struct razor_package_query * rhughes@241: razor_package_query_create(struct razor_set *set); rhughes@241: void rhughes@241: razor_package_query_add_package(struct razor_package_query *pq, rhughes@241: struct razor_package *p); rhughes@241: void rhughes@241: razor_package_query_add_iterator(struct razor_package_query *pq, rhughes@241: struct razor_package_iterator *pi); rhughes@241: struct razor_package_iterator * rhughes@241: razor_package_query_finish(struct razor_package_query *pq); rhughes@241: rhughes@241: struct razor_property_iterator; rhughes@241: struct razor_property_iterator * rhughes@241: razor_property_iterator_create(struct razor_set *set, rhughes@241: struct razor_package *package); rhughes@241: int razor_property_iterator_next(struct razor_property_iterator *pi, rhughes@241: struct razor_property **property, rhughes@241: const char **name, krh@247: uint32_t *flags, krh@247: const char **version); rhughes@241: void rhughes@241: razor_property_iterator_destroy(struct razor_property_iterator *pi); rhughes@241: rhughes@241: void razor_set_list_files(struct razor_set *set, const char *prefix); krh@306: void razor_set_list_package_files(struct razor_set *set, krh@306: struct razor_package *package); rhughes@241: krh@253: enum razor_diff_action { krh@253: RAZOR_DIFF_ACTION_ADD, krh@253: RAZOR_DIFF_ACTION_REMOVE, krh@253: }; krh@253: krh@253: typedef void (*razor_diff_callback_t)(enum razor_diff_action action, krh@253: struct razor_package *package, krh@253: const char *name, krh@253: const char *version, krh@253: const char *arch, krh@253: void *data); krh@253: rhughes@241: void rhughes@241: razor_set_diff(struct razor_set *set, struct razor_set *upstream, krh@253: razor_diff_callback_t callback, void *data); krh@254: struct razor_package_iterator * krh@254: razor_set_create_remove_iterator(struct razor_set *set, krh@254: struct razor_set *next); krh@254: struct razor_package_iterator * krh@254: razor_set_create_install_iterator(struct razor_set *set, krh@254: struct razor_set *next); rhughes@241: krh@262: /** krh@262: * SECTION:transaction krh@262: * @title: Transaction krh@262: * @short_description: Create a new package set by merging two or more sets. krh@262: * krh@262: * The razor transaction object provides a way to create a new package set krh@262: * from packages from one or more other package sets. krh@262: **/ rhughes@241: rhughes@241: struct razor_transaction * rhughes@241: razor_transaction_create(struct razor_set *system, struct razor_set *upstream); rhughes@241: void razor_transaction_install_package(struct razor_transaction *transaction, rhughes@241: struct razor_package *package); rhughes@241: void razor_transaction_remove_package(struct razor_transaction *transaction, rhughes@241: struct razor_package *package); rhughes@241: void razor_transaction_update_package(struct razor_transaction *trans, rhughes@241: struct razor_package *package); rhughes@241: void razor_transaction_update_all(struct razor_transaction *transaction); rhughes@241: int razor_transaction_resolve(struct razor_transaction *trans); rhughes@241: int razor_transaction_describe(struct razor_transaction *trans); rhughes@241: struct razor_set *razor_transaction_finish(struct razor_transaction *trans); rhughes@241: void razor_transaction_destroy(struct razor_transaction *trans); rhughes@241: rhughes@241: /* Temporary helper for test suite. */ rhughes@241: int razor_transaction_unsatisfied_property(struct razor_transaction *trans, rhughes@241: const char *name, krh@247: uint32_t flags, krh@247: const char *version); rhughes@241: krh@262: /** krh@262: * SECTION:rpm krh@262: * @title: Razor RPM krh@262: * @short_description: Operating on RPM files. krh@262: * krh@262: * Functions for open RPM files and extracting information and krh@262: * installing or removing RPM files. krh@262: **/ rhughes@241: krh@262: struct razor_rpm; krh@262: krh@262: struct razor_rpm *razor_rpm_open(const char *filename); krh@262: int razor_rpm_install(struct razor_rpm *rpm, const char *root); krh@262: int razor_rpm_close(struct razor_rpm *rpm); krh@262: krh@262: /** krh@262: * SECTION:importer krh@262: * @title: Importer krh@262: * @short_description: A mechanism for building #razor_set objects krh@262: * krh@309: * The %razor_importer is a helper object for building a razor set krh@309: * from external sources, like yum metadata, the RPM database or RPM krh@309: * files. krh@309: * krh@309: * The importer is a stateful object; it has the notion of a current krh@309: * package, and the caller can provide meta data such as properties, krh@309: * files and similiar for the package as it becomes available. Once a krh@309: * package is fully described, the next pacakge can begin. When all krh@309: * packages have been described to the importer, the importer will krh@309: * create a new %razor_set with the specified packages. krh@309: * krh@309: * A typical use krh@309: * of the importer will follow this template: krh@309: * |[ krh@309: * importer = razor_importer_create(); krh@309: * krh@309: * while ( /* more packages to import */; ) { krh@309: * /* get name, version and arch of next package */ krh@309: * razor_importer_begin_package(importer, name, version, arch); krh@309: * razor_importer_add_details(importer, summary, description, url, license); krh@309: * krh@309: * while ( /* more properties to add */ ) krh@309: * razor_importer_add_property(importer, name, flags, version); krh@309: * krh@309: * while ( /* [more files to add */ ) krh@309: * razor_importer_add_file(importer, name); krh@309: * krh@309: * razor_importer_finish_package(importer); krh@309: * } krh@309: * krh@309: * return razor_importer_finish(importer); krh@309: * ]| krh@262: **/ rhughes@241: struct razor_importer; rhughes@241: krh@249: struct razor_importer *razor_importer_create(void); rhughes@241: void razor_importer_destroy(struct razor_importer *importer); rhughes@241: void razor_importer_begin_package(struct razor_importer *importer, rhughes@241: const char *name, rhughes@241: const char *version, rhughes@241: const char *arch); jbowes@258: void razor_importer_add_details(struct razor_importer *importer, jbowes@258: const char *summary, jbowes@258: const char *description, jbowes@258: const char *url, jbowes@258: const char *license); rhughes@241: void razor_importer_add_property(struct razor_importer *importer, rhughes@241: const char *name, krh@247: uint32_t flags, krh@247: const char *version); rhughes@241: void razor_importer_add_file(struct razor_importer *importer, rhughes@241: const char *name); rhughes@241: void razor_importer_finish_package(struct razor_importer *importer); rhughes@241: rhughes@241: int razor_importer_add_rpm(struct razor_importer *importer, rhughes@241: struct razor_rpm *rpm); rhughes@241: rhughes@241: struct razor_set *razor_importer_finish(struct razor_importer *importer); rhughes@241: rhughes@241: struct razor_set *razor_set_create_from_yum(void); rhughes@241: struct razor_set *razor_set_create_from_rpmdb(void); rhughes@241: krh@262: /** krh@262: * SECTION:root krh@262: * @title: Root krh@262: * @short_description: Functions for accessing an install root. krh@262: * krh@262: * The #razor_root object encapsulate access to and locking of a razor krh@262: * install root. krh@262: **/ rhughes@241: struct razor_root; rhughes@241: rhughes@241: int razor_root_create(const char *root); krh@250: struct razor_root *razor_root_open(const char *root); rhughes@241: struct razor_set *razor_root_open_read_only(const char *root); krh@250: struct razor_set *razor_root_get_system_set(struct razor_root *root); krh@250: int razor_root_close(struct razor_root *root); krh@250: void razor_root_update(struct razor_root *root, struct razor_set *next); krh@250: int razor_root_commit(struct razor_root *root); rhughes@241: krh@262: krh@262: /** krh@262: * SECTION:misc krh@262: * @title: Miscellaneous Functions krh@262: * @short_description: Various helper functions krh@262: * krh@262: * Functions that doesn't fit anywhere else. krh@262: **/ krh@262: krh@262: const char * krh@262: razor_property_relation_to_string(struct razor_property *p); krh@262: const char * krh@262: razor_property_type_to_string(struct razor_property *p); krh@262: krh@262: void razor_build_evr(char *evr_buf, int size, const char *epoch, krh@262: const char *version, const char *release); krh@262: int razor_versioncmp(const char *s1, const char *s2); krh@262: krh@262: rhughes@241: #endif /* _RAZOR_H_ */