From 63c60185d8836a3369887e4f344cb4678e17ff85 Mon Sep 17 00:00:00 2001 From: J. Ali Harlow Date: Tue, 9 Sep 2014 15:04:24 +0100 Subject: [PATCH] Add razor_transaction_unsatisfied() --- librazor/razor.h | 13 +++++++- librazor/transaction.c | 77 +++++++++++++++++++++++++++++++----------------- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/librazor/razor.h b/librazor/razor.h index 521f809..cc13905 100644 --- a/librazor/razor.h +++ b/librazor/razor.h @@ -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 @@ -432,6 +432,17 @@ void razor_transaction_fixup_package(struct razor_transaction *trans, struct razor_rpm *rpm); void razor_transaction_update_all(struct razor_transaction *transaction); int razor_transaction_resolve(struct razor_transaction *trans); + +typedef void (*razor_unsatisfied_callback_t)(const char *requirement, + struct razor_package *package, + const char *name, + const char *version, + const char *arch, + void *data); + +int razor_transaction_unsatisfied(struct razor_transaction *trans, + razor_unsatisfied_callback_t callback, + void *data); int razor_transaction_describe(struct razor_transaction *trans); struct razor_set *razor_transaction_commit(struct razor_transaction *trans); void razor_transaction_destroy(struct razor_transaction *trans); diff --git a/librazor/transaction.c b/librazor/transaction.c index 5e2a748..60a4d94 100644 --- a/librazor/transaction.c +++ b/librazor/transaction.c @@ -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 @@ razor_transaction_resolve(struct razor_transaction *trans) } 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 @@ razor_transaction_describe(struct razor_transaction *trans) 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 @@ razor_transaction_describe(struct razor_transaction *trans) 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 @@ razor_transaction_describe(struct razor_transaction *trans) 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, -- 1.7.1