razor.h
author Kristian H?gsberg <krh@redhat.com>
Mon Jun 09 12:47:37 2008 -0400 (2008-06-09)
changeset 230 c1e2aed8dd07
parent 216 b97c130460a5
child 234 7f5d32472bef
permissions -rw-r--r--
Rewrite depsolver to use a series of passes over all packages.

The big change is that we follow one step of the depedency chain for
each package to resolve in each iteration, and repeat until there are
no more possible moves. In contrast the old depsolver would try to
follow the dependency chain completely for one package at a time.

This new approach is simpler and faster, and at the same time more
roboust. Instead of knowing how one newly installed package may
affect other packages (obsoleting, pulling in new packages etc), the
new algorithm just looks at the total list of requires, provides,
obsoletes and conflicts after installing new packages.
     1 /*
     2  * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     3  * Copyright (C) 2008  Red Hat, Inc
     4  *
     5  * This program is free software; you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation; either version 2 of the License, or
     8  * (at your option) any later version.
     9  *
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  * GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License along
    16  * with this program; if not, write to the Free Software Foundation, Inc.,
    17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    18  */
    19 
    20 #ifndef _RAZOR_H_
    21 #define _RAZOR_H_
    22 
    23 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
    24 
    25 struct razor_set;
    26 struct razor_package;
    27 struct razor_property;
    28 
    29 enum razor_property_type {
    30 	RAZOR_PROPERTY_REQUIRES,
    31 	RAZOR_PROPERTY_PROVIDES,
    32 	RAZOR_PROPERTY_CONFLICTS,
    33 	RAZOR_PROPERTY_OBSOLETES
    34 };
    35 
    36 enum razor_version_relation {
    37 	RAZOR_VERSION_LESS,
    38 	RAZOR_VERSION_LESS_OR_EQUAL,
    39 	RAZOR_VERSION_EQUAL,
    40 	RAZOR_VERSION_GREATER_OR_EQUAL,
    41 	RAZOR_VERSION_GREATER
    42 };
    43 extern const char * const razor_version_relations[];
    44 
    45 struct razor_set *razor_set_create(void);
    46 struct razor_set *razor_set_open(const char *filename);
    47 void razor_set_destroy(struct razor_set *set);
    48 int razor_set_write_to_fd(struct razor_set *set, int fd);
    49 int razor_set_write(struct razor_set *set, const char *filename);
    50 
    51 struct razor_package *
    52 razor_set_get_package(struct razor_set *set, const char *package);
    53 
    54 struct razor_package_iterator;
    55 struct razor_package_iterator *
    56 razor_package_iterator_create(struct razor_set *set);
    57 struct razor_package_iterator *
    58 razor_package_iterator_create_for_property(struct razor_set *set,
    59 					   struct razor_property *property);
    60 struct razor_package_iterator *
    61 razor_package_iterator_create_for_file(struct razor_set *set,
    62 				       const char *filename);
    63 
    64 int razor_package_iterator_next(struct razor_package_iterator *pi,
    65 				struct razor_package **package,
    66 				const char **name,
    67 				const char **version,
    68 				const char **arch);
    69 void razor_package_iterator_destroy(struct razor_package_iterator *pi);
    70 
    71 struct razor_package_query *
    72 razor_package_query_create(struct razor_set *set);
    73 void
    74 razor_package_query_add_package(struct razor_package_query *pq,
    75 				struct razor_package *p);
    76 void
    77 razor_package_query_add_iterator(struct razor_package_query *pq,
    78 				 struct razor_package_iterator *pi);
    79 struct razor_package_iterator *
    80 razor_package_query_finish(struct razor_package_query *pq);
    81 
    82 struct razor_property_iterator;
    83 struct razor_property_iterator *
    84 razor_property_iterator_create(struct razor_set *set,
    85 			       struct razor_package *package);
    86 int razor_property_iterator_next(struct razor_property_iterator *pi,
    87 				 struct razor_property **property,
    88 				 const char **name,
    89 				 enum razor_version_relation *relation,
    90 				 const char **version,
    91 				 enum razor_property_type *type);
    92 void
    93 razor_property_iterator_destroy(struct razor_property_iterator *pi);
    94 
    95 void razor_set_list_files(struct razor_set *set, const char *prefix);
    96 void razor_set_list_package_files(struct razor_set *set, const char *name);
    97 
    98 void razor_set_list_unsatisfied(struct razor_set *set);
    99 
   100 typedef void (*razor_package_callback_t)(const char *name,
   101 					 const char *old_version,
   102 					 const char *new_version,
   103 					 const char *arch,
   104 					 void *data);
   105 void
   106 razor_set_diff(struct razor_set *set, struct razor_set *upstream,
   107 	       razor_package_callback_t callback, void *data);
   108 
   109 /* Package transactions */
   110 
   111 struct razor_transaction *
   112 razor_transaction_create(struct razor_set *system, struct razor_set *upstream);
   113 void razor_transaction_install_package(struct razor_transaction *transaction,
   114 				       struct razor_package *package);
   115 void razor_transaction_remove_package(struct razor_transaction *transaction,
   116 				      struct razor_package *package);
   117 void razor_transaction_update_package(struct razor_transaction *trans,
   118 				      struct razor_package *package);
   119 void razor_transaction_update_all(struct razor_transaction *transaction);
   120 int razor_transaction_resolve(struct razor_transaction *trans);
   121 struct razor_set *razor_transaction_finish(struct razor_transaction *trans);
   122 void razor_transaction_destroy(struct razor_transaction *trans);
   123 
   124 /* Temporary helper for test suite. */
   125 int razor_transaction_unsatisfied_property(struct razor_transaction *trans,
   126 					   const char *name,
   127 					   enum razor_version_relation rel,
   128 					   const char *version,
   129 					   enum razor_property_type type);
   130 
   131 /* Importer interface; for building a razor set from external sources,
   132  * like yum, rpmdb or razor package files. */
   133 
   134 struct razor_importer;
   135 struct razor_rpm;
   136 
   137 struct razor_importer *razor_importer_new(void);
   138 void razor_importer_destroy(struct razor_importer *importer);
   139 void razor_importer_begin_package(struct razor_importer *importer,
   140 				  const char *name,
   141 				  const char *version,
   142 				  const char *arch);
   143 void razor_importer_add_property(struct razor_importer *importer,
   144 				 const char *name,
   145 				 enum razor_version_relation relation,
   146 				 const char *version,
   147 				 enum razor_property_type type);
   148 void razor_importer_add_file(struct razor_importer *importer,
   149 			     const char *name);
   150 void razor_importer_finish_package(struct razor_importer *importer);
   151 
   152 int razor_importer_add_rpm(struct razor_importer *importer,
   153 			   struct razor_rpm *rpm);
   154 
   155 struct razor_set *razor_importer_finish(struct razor_importer *importer);
   156 
   157 void razor_build_evr(char *evr_buf, int size, const char *epoch,
   158 		     const char *version, const char *release);
   159 
   160 struct razor_set *razor_set_create_from_yum(void);
   161 struct razor_set *razor_set_create_from_rpmdb(void);
   162 
   163 /* RPM functions */
   164 
   165 struct razor_rpm *razor_rpm_open(const char *filename);
   166 int razor_rpm_install(struct razor_rpm *rpm, const char *root);
   167 int razor_rpm_close(struct razor_rpm *rpm);
   168 
   169 #endif /* _RAZOR_H_ */