src/main.c
changeset 254 ccb1c11968ab
parent 253 338a577cdfd2
child 255 5cd6aa72bbd5
     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);