pkg: provide error return codes for pkg_traverse() and pkg_verify_graph().

pull/15/head
William Pitcock 2012-05-06 21:42:15 -05:00
parent 601341fb8f
commit 4f50dad147
2 changed files with 25 additions and 13 deletions

34
pkg.c
View File

@ -431,13 +431,13 @@ pkg_verify_dependency(pkg_dependency_t *pkgdep, unsigned int flags, unsigned int
* verify the graph dependency nodes are satisfiable by walking the tree using * verify the graph dependency nodes are satisfiable by walking the tree using
* pkg_traverse(). * pkg_traverse().
*/ */
void unsigned int
pkg_verify_graph(pkg_t *root, int depth, unsigned int flags) pkg_verify_graph(pkg_t *root, int depth, unsigned int flags)
{ {
pkg_traverse(root, NULL, NULL, depth, flags); return pkg_traverse(root, NULL, NULL, depth, flags);
} }
void unsigned int
pkg_report_graph_error(pkg_t *pkg, pkg_dependency_t *node, unsigned int eflags) pkg_report_graph_error(pkg_t *pkg, pkg_dependency_t *node, unsigned int eflags)
{ {
if (eflags & PKG_ERRF_PACKAGE_NOT_FOUND) if (eflags & PKG_ERRF_PACKAGE_NOT_FOUND)
@ -460,17 +460,17 @@ pkg_report_graph_error(pkg_t *pkg, pkg_dependency_t *node, unsigned int eflags)
if (pkg != NULL) if (pkg != NULL)
pkg_free(pkg); pkg_free(pkg);
exit(EXIT_FAILURE); return eflags;
} }
static inline void static inline unsigned int
pkg_walk_list(pkg_dependency_t *deplist, pkg_walk_list(pkg_dependency_t *deplist,
void (*pkg_traverse_func)(pkg_t *package, void *data), void (*pkg_traverse_func)(pkg_t *package, void *data),
void *data, void *data,
int depth, int depth,
unsigned int flags) unsigned int flags)
{ {
unsigned int eflags; unsigned int eflags = PKG_ERRF_OK;
pkg_dependency_t *node; pkg_dependency_t *node;
foreach_list_entry(deplist, node) foreach_list_entry(deplist, node)
@ -488,6 +488,8 @@ pkg_walk_list(pkg_dependency_t *deplist,
pkg_free(pkgdep); pkg_free(pkgdep);
} }
return eflags;
} }
/* /*
@ -495,21 +497,31 @@ pkg_walk_list(pkg_dependency_t *deplist,
* *
* walk the dependency graph up to maxdepth levels. -1 means infinite recursion. * walk the dependency graph up to maxdepth levels. -1 means infinite recursion.
*/ */
void unsigned int
pkg_traverse(pkg_t *root, pkg_traverse(pkg_t *root,
void (*pkg_traverse_func)(pkg_t *package, void *data), void (*pkg_traverse_func)(pkg_t *package, void *data),
void *data, void *data,
int maxdepth, int maxdepth,
unsigned int flags) unsigned int flags)
{ {
if (maxdepth == 0) unsigned int eflags = PKG_ERRF_OK;
return;
pkg_walk_list(root->requires, pkg_traverse_func, data, maxdepth, flags); if (maxdepth == 0)
return eflags;
eflags = pkg_walk_list(root->requires, pkg_traverse_func, data, maxdepth, flags);
if (eflags != PKG_ERRF_OK)
return eflags;
if (flags & PKGF_SEARCH_PRIVATE) if (flags & PKGF_SEARCH_PRIVATE)
pkg_walk_list(root->requires_private, pkg_traverse_func, data, maxdepth, flags); {
eflags = pkg_walk_list(root->requires_private, pkg_traverse_func, data, maxdepth, flags);
if (eflags != PKG_ERRF_OK)
return eflags;
}
if (pkg_traverse_func != NULL) if (pkg_traverse_func != NULL)
pkg_traverse_func(root, data); pkg_traverse_func(root, data);
return eflags;
} }

4
pkg.h
View File

@ -137,8 +137,8 @@ struct pkg_ {
/* pkg.c */ /* pkg.c */
void pkg_free(pkg_t *pkg); void pkg_free(pkg_t *pkg);
pkg_t *pkg_find(const char *name, unsigned int flags); pkg_t *pkg_find(const char *name, unsigned int flags);
void pkg_traverse(pkg_t *root, void (*pkg_traverse_func)(pkg_t *package, void *data), void *data, int maxdepth, unsigned int flags); unsigned int pkg_traverse(pkg_t *root, void (*pkg_traverse_func)(pkg_t *package, void *data), void *data, int maxdepth, unsigned int flags);
void pkg_verify_graph(pkg_t *root, int depth, unsigned int flags); unsigned int pkg_verify_graph(pkg_t *root, int depth, unsigned int flags);
int pkg_compare_version(const char *a, const char *b); int pkg_compare_version(const char *a, const char *b);
pkg_t *pkg_verify_dependency(pkg_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags); pkg_t *pkg_verify_dependency(pkg_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags);
const char *pkg_get_comparator(pkg_dependency_t *pkgdep); const char *pkg_get_comparator(pkg_dependency_t *pkgdep);