Change the install iterator API to what we want.
1.1 --- a/librazor/razor.c Tue Jul 08 21:59:36 2008 -0400
1.2 +++ b/librazor/razor.c Tue Jul 08 22:02:58 2008 -0400
1.3 @@ -739,60 +739,96 @@
1.4 razor_package_iterator_destroy(pi2);
1.5 }
1.6
1.7 +struct install_action {
1.8 + enum razor_install_action action;
1.9 + struct razor_package *package;
1.10 +};
1.11 +
1.12 +struct razor_install_iterator {
1.13 + struct razor_set *set;
1.14 + struct razor_set *next;
1.15 + struct array actions;
1.16 + struct install_action *a, *end;
1.17 +};
1.18 +
1.19 static void
1.20 -add_new_package(enum razor_diff_action action,
1.21 - struct razor_package *package,
1.22 - const char *name,
1.23 - const char *version,
1.24 - const char *arch,
1.25 - void *data)
1.26 +add_action(enum razor_diff_action action,
1.27 + struct razor_package *package,
1.28 + const char *name,
1.29 + const char *version,
1.30 + const char *arch,
1.31 + void *data)
1.32 {
1.33 - if (action == RAZOR_DIFF_ACTION_ADD)
1.34 - razor_package_query_add_package(data, package);
1.35 + struct razor_install_iterator *ii = data;
1.36 + struct install_action *a;
1.37 +
1.38 + a = array_add(&ii->actions, sizeof *a);
1.39 + a->package = package;
1.40 +
1.41 + switch (action) {
1.42 + case RAZOR_DIFF_ACTION_ADD:
1.43 + a->action = RAZOR_INSTALL_ACTION_ADD;
1.44 + break;
1.45 + case RAZOR_DIFF_ACTION_REMOVE:
1.46 + a->action = RAZOR_INSTALL_ACTION_REMOVE;
1.47 + break;
1.48 + }
1.49 }
1.50
1.51 -RAZOR_EXPORT struct razor_package_iterator *
1.52 -razor_set_create_remove_iterator(struct razor_set *set,
1.53 - struct razor_set *next)
1.54 +RAZOR_EXPORT struct razor_install_iterator *
1.55 +razor_set_create_install_iterator(struct razor_set *set,
1.56 + struct razor_set *next)
1.57 {
1.58 - struct razor_package_query *query;
1.59 - struct razor_package_iterator *pi;
1.60 + struct razor_install_iterator *ii;
1.61
1.62 assert (set != NULL);
1.63 assert (next != NULL);
1.64
1.65 - query = razor_package_query_create(set);
1.66 - razor_set_diff(next, set, add_new_package, query);
1.67 + ii = zalloc(sizeof *ii);
1.68 + ii->set = set;
1.69 + ii->next = next;
1.70 +
1.71 + razor_set_diff(set, next, add_action, ii);
1.72
1.73 - pi = razor_package_query_finish(query);
1.74 + ii->a = ii->actions.data;
1.75 + ii->end = ii->actions.data + ii->actions.size;
1.76
1.77 /* FIXME: We need to figure out the right install order here,
1.78 * so the post and pre scripts can run. */
1.79
1.80 - /* sort */
1.81 -
1.82 - return pi;
1.83 + return ii;
1.84 }
1.85
1.86 -RAZOR_EXPORT struct razor_package_iterator *
1.87 -razor_set_create_install_iterator(struct razor_set *set,
1.88 - struct razor_set *next)
1.89 +RAZOR_EXPORT int
1.90 +razor_install_iterator_next(struct razor_install_iterator *ii,
1.91 + struct razor_set **set,
1.92 + struct razor_package **package,
1.93 + enum razor_install_action *action,
1.94 + int *count)
1.95 {
1.96 - struct razor_package_query *query;
1.97 - struct razor_package_iterator *pi;
1.98 + if (ii->a == ii->end)
1.99 + return 0;
1.100
1.101 - assert (set != NULL);
1.102 - assert (next != NULL);
1.103 + switch (ii->a->action) {
1.104 + case RAZOR_INSTALL_ACTION_ADD:
1.105 + *set = ii->next;
1.106 + break;
1.107 + case RAZOR_INSTALL_ACTION_REMOVE:
1.108 + *set = ii->set;
1.109 + break;
1.110 + }
1.111
1.112 - query = razor_package_query_create(next);
1.113 - razor_set_diff(set, next, add_new_package, query);
1.114 + *package = ii->a->package;
1.115 + *action = ii->a->action;
1.116 + *count = 0;
1.117 + ii->a++;
1.118
1.119 - pi = razor_package_query_finish(query);
1.120 + return 1;
1.121 +}
1.122
1.123 - /* FIXME: We need to figure out the right install order here,
1.124 - * so the post and pre scripts can run. */
1.125 -
1.126 - /* sort */
1.127 -
1.128 - return pi;
1.129 +RAZOR_EXPORT void
1.130 +razor_install_iterator_destroy(struct razor_install_iterator *ii)
1.131 +{
1.132 + array_release(&ii->actions);
1.133 + free(ii);
1.134 }
2.1 --- a/librazor/razor.h Tue Jul 08 21:59:36 2008 -0400
2.2 +++ b/librazor/razor.h Tue Jul 08 22:02:58 2008 -0400
2.3 @@ -191,13 +191,26 @@
2.4 void
2.5 razor_set_diff(struct razor_set *set, struct razor_set *upstream,
2.6 razor_diff_callback_t callback, void *data);
2.7 -struct razor_package_iterator *
2.8 -razor_set_create_remove_iterator(struct razor_set *set,
2.9 - struct razor_set *next);
2.10 -struct razor_package_iterator *
2.11 +
2.12 +struct razor_install_iterator;
2.13 +
2.14 +enum razor_install_action {
2.15 + RAZOR_INSTALL_ACTION_ADD,
2.16 + RAZOR_INSTALL_ACTION_REMOVE
2.17 +};
2.18 +
2.19 +struct razor_install_iterator *
2.20 razor_set_create_install_iterator(struct razor_set *set,
2.21 struct razor_set *next);
2.22
2.23 +int razor_install_iterator_next(struct razor_install_iterator *ii,
2.24 + struct razor_set **set,
2.25 + struct razor_package **package,
2.26 + enum razor_install_action *action,
2.27 + int *count);
2.28 +
2.29 +void razor_install_iterator_destroy(struct razor_install_iterator *ii);
2.30 +
2.31 /**
2.32 * SECTION:transaction
2.33 * @title: Transaction
3.1 --- a/src/main.c Tue Jul 08 21:59:36 2008 -0400
3.2 +++ b/src/main.c Tue Jul 08 22:02:58 2008 -0400
3.3 @@ -684,19 +684,26 @@
3.4 static int
3.5 download_packages(struct razor_set *system, struct razor_set *next)
3.6 {
3.7 - struct razor_package_iterator *pi;
3.8 + struct razor_install_iterator *ii;
3.9 struct razor_package *package;
3.10 + struct razor_set *set;
3.11 + enum razor_install_action action;
3.12 const char *name, *version, *arch;
3.13 char file[PATH_MAX], url[256];
3.14 - int errors;
3.15 -
3.16 - pi = razor_set_create_install_iterator(system, next);
3.17 - errors = 0;
3.18 - while (razor_package_iterator_next(pi, &package,
3.19 - RAZOR_DETAIL_NAME, &name,
3.20 - RAZOR_DETAIL_VERSION, &version,
3.21 - RAZOR_DETAIL_ARCH, &arch,
3.22 - RAZOR_DETAIL_LAST)) {
3.23 + int errors = 0, count;
3.24 +
3.25 + ii = razor_set_create_install_iterator(system, next);
3.26 + while (razor_install_iterator_next(ii, &set, &package,
3.27 + &action, &count)) {
3.28 + if (action == RAZOR_INSTALL_ACTION_REMOVE)
3.29 + continue;
3.30 +
3.31 + razor_package_get_details(set, package,
3.32 + RAZOR_DETAIL_NAME, &name,
3.33 + RAZOR_DETAIL_VERSION, &version,
3.34 + RAZOR_DETAIL_ARCH, &arch,
3.35 + RAZOR_DETAIL_LAST);
3.36 +
3.37 snprintf(url, sizeof url,
3.38 "%s/Packages/%s",
3.39 yum_url, rpm_filename(name, version, arch));
3.40 @@ -705,7 +712,7 @@
3.41 if (download_if_missing(url, file) < 0)
3.42 errors++;
3.43 }
3.44 - razor_package_iterator_destroy(pi);
3.45 + razor_install_iterator_destroy(ii);
3.46
3.47 if (errors > 0) {
3.48 fprintf(stderr, "failed to download %d packages\n", errors);
3.49 @@ -718,18 +725,27 @@
3.50 static int
3.51 install_packages(struct razor_set *system, struct razor_set *next)
3.52 {
3.53 - struct razor_package_iterator *pi;
3.54 + struct razor_install_iterator *ii;
3.55 struct razor_package *package;
3.56 + struct razor_set *set;
3.57 + enum razor_install_action action;
3.58 struct razor_rpm *rpm;
3.59 const char *name, *version, *arch;
3.60 char file[PATH_MAX];
3.61 + int count;
3.62
3.63 - pi = razor_set_create_install_iterator(system, next);
3.64 - while (razor_package_iterator_next(pi, &package,
3.65 - RAZOR_DETAIL_NAME, &name,
3.66 - RAZOR_DETAIL_VERSION, &version,
3.67 - RAZOR_DETAIL_ARCH, &arch,
3.68 - RAZOR_DETAIL_LAST)) {
3.69 + ii = razor_set_create_install_iterator(system, next);
3.70 + while (razor_install_iterator_next(ii, &set, &package,
3.71 + &action, &count)) {
3.72 + if (action == RAZOR_INSTALL_ACTION_REMOVE)
3.73 + continue;
3.74 +
3.75 + razor_package_get_details(set, package,
3.76 + RAZOR_DETAIL_NAME, &name,
3.77 + RAZOR_DETAIL_VERSION, &version,
3.78 + RAZOR_DETAIL_ARCH, &arch,
3.79 + RAZOR_DETAIL_LAST);
3.80 +
3.81 printf("install %s-%s\n", name, version);
3.82
3.83 snprintf(file, sizeof file,
3.84 @@ -746,7 +762,7 @@
3.85 }
3.86 razor_rpm_close(rpm);
3.87 }
3.88 - razor_package_iterator_destroy(pi);
3.89 + razor_install_iterator_destroy(ii);
3.90
3.91 return 0;
3.92 }