Change the install iterator API to what we want.
authorKristian H?gsberg <krh@redhat.com>
Tue Jul 08 22:02:58 2008 -0400 (2008-07-08)
changeset 3165ebed314390c
parent 315 1c52b84bfc33
child 317 019a53b65271
Change the install iterator API to what we want.
librazor/razor.c
librazor/razor.h
src/main.c
     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  }