Add razor_transaction_unsatisfied()
authorJ. Ali Harlow <ali@juiblex.co.uk>
Tue, 9 Sep 2014 14:04:24 +0000 (15:04 +0100)
committerJ. Ali Harlow <ali@juiblex.co.uk>
Tue, 9 Sep 2014 14:04:24 +0000 (15:04 +0100)
librazor/razor.h
librazor/transaction.c

index 521f809..cc13905 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -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);
index 5e2a748..60a4d94 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -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,