diff -r c4bcba8023a9 -r df914f383f5c librazor/transaction.c --- a/librazor/transaction.c Sat Aug 23 16:28:31 2014 +0100 +++ b/librazor/transaction.c Thu Oct 09 17:27:41 2014 +0100 @@ -1,7 +1,7 @@ /* * Copyright (C) 2008 Kristian Høgsberg * Copyright (C) 2008 Red Hat, Inc - * Copyright (C) 2009, 2011, 2012 J. Ali Harlow + * Copyright (C) 2009, 2011, 2012, 2014 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -778,40 +778,40 @@ } static void -describe_unsatisfied(struct razor_set *set, struct razor_property *rp) +describe_unsatisfied(struct razor_set *set, struct razor_property *rp, + razor_unsatisfied_callback_t callback, void *data) { struct razor_package_iterator pi; struct razor_package *pkg; const char *name, *version, *arch, *pool; + const char *requirement; + char *s = NULL; pool = set->string_pool.data; - if (pool[rp->version] == '\0') { - razor_package_iterator_init_for_property(&pi, set, rp); - while (razor_package_iterator_next(&pi, &pkg, - RAZOR_DETAIL_NAME, &name, - RAZOR_DETAIL_VERSION, &version, - RAZOR_DETAIL_ARCH, &arch, - RAZOR_DETAIL_LAST)) - fprintf(stderr, "%s is needed by %s-%s.%s\n", - &pool[rp->name], - name, version, arch); - } else { - razor_package_iterator_init_for_property(&pi, set, rp); - while (razor_package_iterator_next(&pi, &pkg, - RAZOR_DETAIL_NAME, &name, - RAZOR_DETAIL_VERSION, &version, - RAZOR_DETAIL_ARCH, &arch, - RAZOR_DETAIL_LAST)) - fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n", - &pool[rp->name], - razor_property_relation_to_string(rp), - &pool[rp->version], - name, version, arch); + if (pool[rp->version] == '\0') + requirement = &pool[rp->name]; + else { + s = razor_concat(&pool[rp->name], " ", + razor_property_relation_to_string(rp), " ", + &pool[rp->version], NULL); + requirement = s; } + + razor_package_iterator_init_for_property(&pi, set, rp); + while (razor_package_iterator_next(&pi, &pkg, + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, + RAZOR_DETAIL_LAST)) + callback(requirement, pkg, name, version, arch, data); + + if (s) + free(s); } RAZOR_EXPORT int -razor_transaction_describe(struct razor_transaction *trans) +razor_transaction_unsatisfied(struct razor_transaction *trans, + razor_unsatisfied_callback_t callback, void *data) { struct prop_iter rpi; struct razor_property *rp; @@ -825,7 +825,9 @@ prop_iter_init(&rpi, &trans->system); while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) { if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) { - describe_unsatisfied(trans->system.set, rp); + if (callback) + describe_unsatisfied(trans->system.set, rp, + callback, data); unsatisfied++; } } @@ -833,7 +835,9 @@ prop_iter_init(&rpi, &trans->upstream); while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) { if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) { - describe_unsatisfied(trans->upstream.set, rp); + if (callback) + describe_unsatisfied(trans->upstream.set, rp, + callback, data); unsatisfied++; } } @@ -841,6 +845,25 @@ return unsatisfied; } +static void +describe_unsatisfied_callback(const char *requirement, + struct razor_package *package, const char *name, + const char *version, const char *arch, void *data) +{ + FILE *fp = data; + + fprintf(fp, "%s is needed by %s-%s.%s\n", requirement, + name, version, arch); +} + +RAZOR_EXPORT int +razor_transaction_describe(struct razor_transaction *trans) +{ + return razor_transaction_unsatisfied(trans, + describe_unsatisfied_callback, + stderr); +} + RAZOR_EXPORT int razor_transaction_unsatisfied_property(struct razor_transaction *trans, const char *name,