Change the install iterator API to what we want.
authorKristian Høgsberg <krh@redhat.com>
Wed, 9 Jul 2008 02:02:58 +0000 (22:02 -0400)
committerKristian Høgsberg <krh@redhat.com>
Wed, 9 Jul 2008 02:02:58 +0000 (22:02 -0400)
librazor/razor.c
librazor/razor.h
src/main.c

index 1a8dfda..4276381 100644 (file)
@@ -739,60 +739,96 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream,
        razor_package_iterator_destroy(pi2);
 }
 
+struct install_action {
+       enum razor_install_action action;
+       struct razor_package *package;
+};
+
+struct razor_install_iterator {
+       struct razor_set *set;
+       struct razor_set *next;
+       struct array actions;
+       struct install_action *a, *end;
+};
+
 static void
-add_new_package(enum razor_diff_action action,
-               struct razor_package *package,
-               const char *name,
-               const char *version,
-               const char *arch,
-               void *data)
+add_action(enum razor_diff_action action,
+          struct razor_package *package,
+          const char *name,
+          const char *version,
+          const char *arch,
+          void *data)
 {
-       if (action == RAZOR_DIFF_ACTION_ADD)
-               razor_package_query_add_package(data, package);
+       struct razor_install_iterator *ii = data;
+       struct install_action *a;
+
+       a = array_add(&ii->actions, sizeof *a);
+       a->package = package;
+
+       switch (action) {
+       case RAZOR_DIFF_ACTION_ADD:
+               a->action = RAZOR_INSTALL_ACTION_ADD;
+               break;
+       case RAZOR_DIFF_ACTION_REMOVE:
+               a->action = RAZOR_INSTALL_ACTION_REMOVE;
+               break;
+       }
 }
 
-RAZOR_EXPORT struct razor_package_iterator *
-razor_set_create_remove_iterator(struct razor_set *set,
-                                struct razor_set *next)
+RAZOR_EXPORT struct razor_install_iterator *
+razor_set_create_install_iterator(struct razor_set *set,
+                                 struct razor_set *next)
 {
-       struct razor_package_query *query;
-       struct razor_package_iterator *pi;
+       struct razor_install_iterator *ii;
 
        assert (set != NULL);
        assert (next != NULL);
 
-       query = razor_package_query_create(set);
-       razor_set_diff(next, set, add_new_package, query);
+       ii = zalloc(sizeof *ii);
+       ii->set = set;
+       ii->next = next;
+       
+       razor_set_diff(set, next, add_action, ii);
 
-       pi = razor_package_query_finish(query);
+       ii->a = ii->actions.data;
+       ii->end = ii->actions.data + ii->actions.size;
 
        /* FIXME: We need to figure out the right install order here,
         * so the post and pre scripts can run. */
 
-       /* sort */
-
-       return pi;
+       return ii;
 }
 
-RAZOR_EXPORT struct razor_package_iterator *
-razor_set_create_install_iterator(struct razor_set *set,
-                                 struct razor_set *next)
+RAZOR_EXPORT int
+razor_install_iterator_next(struct razor_install_iterator *ii,
+                           struct razor_set **set,
+                           struct razor_package **package,
+                           enum razor_install_action *action,
+                           int *count)
 {
-       struct razor_package_query *query;
-       struct razor_package_iterator *pi;
-
-       assert (set != NULL);
-       assert (next != NULL);
-
-       query = razor_package_query_create(next);
-       razor_set_diff(set, next, add_new_package, query);
+       if (ii->a == ii->end)
+               return 0;
+
+       switch (ii->a->action) {
+       case RAZOR_INSTALL_ACTION_ADD:
+               *set = ii->next;
+               break;
+       case RAZOR_INSTALL_ACTION_REMOVE:
+               *set = ii->set;
+               break;
+       }
 
-       pi = razor_package_query_finish(query);
+       *package = ii->a->package;
+       *action = ii->a->action;
+       *count = 0;
+       ii->a++;
 
-       /* FIXME: We need to figure out the right install order here,
-        * so the post and pre scripts can run. */
-
-       /* sort */
+       return 1;
+}
 
-       return pi;
+RAZOR_EXPORT void
+razor_install_iterator_destroy(struct razor_install_iterator *ii)
+{
+       array_release(&ii->actions);
+       free(ii);
 }
index 856a05f..51d05a7 100644 (file)
@@ -191,13 +191,26 @@ typedef void (*razor_diff_callback_t)(enum razor_diff_action action,
 void
 razor_set_diff(struct razor_set *set, struct razor_set *upstream,
               razor_diff_callback_t callback, void *data);
-struct razor_package_iterator *
-razor_set_create_remove_iterator(struct razor_set *set,
-                                struct razor_set *next);
-struct razor_package_iterator *
+
+struct razor_install_iterator;
+
+enum razor_install_action {
+       RAZOR_INSTALL_ACTION_ADD,
+       RAZOR_INSTALL_ACTION_REMOVE
+};
+
+struct razor_install_iterator *
 razor_set_create_install_iterator(struct razor_set *set,
                                  struct razor_set *next);
 
+int razor_install_iterator_next(struct razor_install_iterator *ii,
+                               struct razor_set **set,
+                               struct razor_package **package,
+                               enum razor_install_action *action,
+                               int *count);
+
+void razor_install_iterator_destroy(struct razor_install_iterator *ii);
+
 /**
  * SECTION:transaction
  * @title: Transaction
index 73e2b48..90e9f41 100644 (file)
@@ -684,19 +684,26 @@ rpm_filename(const char *name, const char *version, const char *arch)
 static int
 download_packages(struct razor_set *system, struct razor_set *next)
 {
-       struct razor_package_iterator *pi;
+       struct razor_install_iterator *ii;
        struct razor_package *package;
+       struct razor_set *set;
+       enum razor_install_action action;
        const char *name, *version, *arch;
        char file[PATH_MAX], url[256];
-       int errors;
-       pi = razor_set_create_install_iterator(system, next);
-       errors = 0;
-       while (razor_package_iterator_next(pi, &package,
-                                          RAZOR_DETAIL_NAME, &name,
-                                          RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch,
-                                          RAZOR_DETAIL_LAST)) {
+       int errors = 0, count;
+
+       ii = razor_set_create_install_iterator(system, next);
+       while (razor_install_iterator_next(ii, &set, &package,
+                                          &action, &count)) {
+               if (action == RAZOR_INSTALL_ACTION_REMOVE)
+                       continue;
+
+               razor_package_get_details(set, package,
+                                         RAZOR_DETAIL_NAME, &name,
+                                         RAZOR_DETAIL_VERSION, &version,
+                                         RAZOR_DETAIL_ARCH, &arch,
+                                         RAZOR_DETAIL_LAST);
+               
                snprintf(url, sizeof url,
                         "%s/Packages/%s",
                         yum_url, rpm_filename(name, version, arch));
@@ -705,7 +712,7 @@ download_packages(struct razor_set *system, struct razor_set *next)
                if (download_if_missing(url, file) < 0)
                        errors++;
        }
-       razor_package_iterator_destroy(pi);
+       razor_install_iterator_destroy(ii);
 
        if (errors > 0) {
                fprintf(stderr, "failed to download %d packages\n", errors);
@@ -718,18 +725,27 @@ download_packages(struct razor_set *system, struct razor_set *next)
 static int
 install_packages(struct razor_set *system, struct razor_set *next)
 {
-       struct razor_package_iterator *pi;
+       struct razor_install_iterator *ii;
        struct razor_package *package;
+       struct razor_set *set;
+       enum razor_install_action action;
        struct razor_rpm *rpm;
        const char *name, *version, *arch;
        char file[PATH_MAX];
+       int count;
+
+       ii = razor_set_create_install_iterator(system, next);
+       while (razor_install_iterator_next(ii, &set, &package,
+                                          &action, &count)) {
+               if (action == RAZOR_INSTALL_ACTION_REMOVE)
+                       continue;
+
+               razor_package_get_details(set, package,
+                                         RAZOR_DETAIL_NAME, &name,
+                                         RAZOR_DETAIL_VERSION, &version,
+                                         RAZOR_DETAIL_ARCH, &arch,
+                                         RAZOR_DETAIL_LAST);
 
-       pi = razor_set_create_install_iterator(system, next);
-       while (razor_package_iterator_next(pi, &package,
-                                          RAZOR_DETAIL_NAME, &name,
-                                          RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch,
-                                          RAZOR_DETAIL_LAST)) {
                printf("install %s-%s\n", name, version);
 
                snprintf(file, sizeof file,
@@ -746,7 +762,7 @@ install_packages(struct razor_set *system, struct razor_set *next)
                }
                razor_rpm_close(rpm);
        }
-       razor_package_iterator_destroy(pi);
+       razor_install_iterator_destroy(ii);
 
        return 0;
 }