/*
* Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
* Copyright (C) 2008 Red Hat, Inc
- * Copyright (C) 2009, 2011, 2012 J. Ali Harlow <ali@juiblex.co.uk>
+ * Copyright (C) 2009, 2011, 2012, 2014 J. Ali Harlow <ali@juiblex.co.uk>
*
* 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
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);
/*
* Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
* Copyright (C) 2008 Red Hat, Inc
- * Copyright (C) 2009, 2011, 2012 J. Ali Harlow <ali@juiblex.co.uk>
+ * Copyright (C) 2009, 2011, 2012, 2014 J. Ali Harlow <ali@juiblex.co.uk>
*
* 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
}
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;
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++;
}
}
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++;
}
}
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,