1.1 --- a/src/main.c Fri Jun 20 21:38:29 2008 -0400
1.2 +++ b/src/main.c Fri Jun 20 21:56:43 2008 -0400
1.3 @@ -578,74 +578,86 @@
1.4 return 0;
1.5 }
1.6
1.7 -static void
1.8 -download_package(enum razor_diff_action action,
1.9 - struct razor_package *package,
1.10 - const char *name,
1.11 - const char *version,
1.12 - const char *arch,
1.13 - void *data)
1.14 +static const char *
1.15 +rpm_filename(const char *name, const char *version, const char *arch)
1.16 {
1.17 - char file[PATH_MAX], url[256];
1.18 - const char *v;
1.19 - int *errors = data;
1.20 -
1.21 - if (action != RAZOR_DIFF_ACTION_ADD)
1.22 - return;
1.23 -
1.24 - /* Skip epoch */
1.25 + static char file[PATH_MAX];
1.26 + const char *v;
1.27 +
1.28 + /* Skip epoch */
1.29 v = strchr(version, ':');
1.30 - if (v != NULL)
1.31 - v = v + 1;
1.32 - else
1.33 + if (v != NULL)
1.34 + v = v + 1;
1.35 + else
1.36 v = version;
1.37
1.38 - snprintf(url, sizeof url,
1.39 - "%s/Packages/%s-%s.%s.rpm", yum_url, name, v, arch);
1.40 - snprintf(file, sizeof file,
1.41 - "rpms/%s-%s.%s.rpm", name, v, arch);
1.42 - if (download_if_missing(url, file) < 0)
1.43 - (*errors)++;
1.44 + snprintf(file, sizeof file, "%s-%s.%s.rpm", name, v, arch);
1.45 +
1.46 + return file;
1.47 }
1.48
1.49 -static void
1.50 -install_package(enum razor_diff_action action,
1.51 - struct razor_package *package,
1.52 - const char *name,
1.53 - const char *version,
1.54 - const char *arch,
1.55 - void *data)
1.56 +static int
1.57 +download_packages(struct razor_set *system, struct razor_set *next)
1.58 {
1.59 - const char *v, *root = data;
1.60 + struct razor_package_iterator *pi;
1.61 + struct razor_package *package;
1.62 + const char *name, *version, *arch;
1.63 + char file[PATH_MAX], url[256];
1.64 + int errors;
1.65 +
1.66 + pi = razor_set_create_install_iterator(system, next);
1.67 + errors = 0;
1.68 + while (razor_package_iterator_next(pi, &package,
1.69 + &name, &version, &arch)) {
1.70 + snprintf(url, sizeof url,
1.71 + "%s/Packages/%s",
1.72 + yum_url, rpm_filename(name, version, arch));
1.73 + snprintf(file, sizeof file,
1.74 + "rpms/%s", rpm_filename(name, version, arch));
1.75 + if (download_if_missing(url, file) < 0)
1.76 + errors++;
1.77 + }
1.78 + razor_package_iterator_destroy(pi);
1.79 +
1.80 + if (errors > 0) {
1.81 + fprintf(stderr, "failed to download %d packages\n", errors);
1.82 + return -1;
1.83 + }
1.84 +
1.85 + return 0;
1.86 +}
1.87 +
1.88 +static int
1.89 +install_packages(struct razor_set *system, struct razor_set *next)
1.90 +{
1.91 + struct razor_package_iterator *pi;
1.92 + struct razor_package *package;
1.93 + struct razor_rpm *rpm;
1.94 + const char *name, *version, *arch;
1.95 char file[PATH_MAX];
1.96 - struct razor_rpm *rpm;
1.97
1.98 - if (action == RAZOR_DIFF_ACTION_REMOVE) {
1.99 - printf("removing %s %s not handled\n", name, version);
1.100 - return;
1.101 + pi = razor_set_create_install_iterator(system, next);
1.102 + while (razor_package_iterator_next(pi, &package,
1.103 + &name, &version, &arch)) {
1.104 + printf("install %s-%s\n", name, version);
1.105 +
1.106 + snprintf(file, sizeof file,
1.107 + "rpms/%s", rpm_filename(name, version, arch));
1.108 + rpm = razor_rpm_open(file);
1.109 + if (rpm == NULL) {
1.110 + fprintf(stderr, "failed to open rpm %s\n", file);
1.111 + return -1;
1.112 + }
1.113 + if (razor_rpm_install(rpm, install_root) < 0) {
1.114 + fprintf(stderr,
1.115 + "failed to install rpm %s\n", file);
1.116 + return -1;
1.117 + }
1.118 + razor_rpm_close(rpm);
1.119 }
1.120 + razor_package_iterator_destroy(pi);
1.121
1.122 - /* Skip epoch */
1.123 - v = strchr(version, ':');
1.124 - if (v != NULL)
1.125 - v = v + 1;
1.126 - else
1.127 - v = version;
1.128 -
1.129 - printf("install %s %s\n", name, v);
1.130 - snprintf(file, sizeof file, "rpms/%s-%s.%s.rpm", name, v, arch);
1.131 -
1.132 - rpm = razor_rpm_open(file);
1.133 - if (rpm == NULL) {
1.134 - fprintf(stderr, "failed to open rpm %s\n", file);
1.135 - return;
1.136 - }
1.137 - if (razor_rpm_install(rpm, root) < 0) {
1.138 - fprintf(stderr,
1.139 - "failed to install rpm %s\n", file);
1.140 - return;
1.141 - }
1.142 - razor_rpm_close(rpm);
1.143 + return 0;
1.144 }
1.145
1.146 static int
1.147 @@ -692,17 +704,12 @@
1.148 return 1;
1.149 }
1.150
1.151 - errors = 0;
1.152 - razor_set_diff(system, next, download_package, &errors);
1.153 - if (errors > 0) {
1.154 - fprintf(stderr, "failed to download %d packages\n", errors);
1.155 + if (download_packages(system, next) < 0) {
1.156 razor_root_close(root);
1.157 return 1;
1.158 }
1.159
1.160 - /* FIXME: We need to figure out the right install order here,
1.161 - * so the post and pre scripts can run. */
1.162 - razor_set_diff(system, next, install_package, (void *) install_root);
1.163 + install_packages(system, next);
1.164
1.165 razor_set_destroy(next);
1.166 razor_set_destroy(upstream);