Mark package to be installed or removed after creating the transaction.
authorKristian H?gsberg <krh@jiraiya.boston.redhat.com>
Mon Apr 07 23:52:14 2008 -0400 (2008-04-07)
changeset 2087b460017c221
parent 207 b7d55f3fa183
child 209 78afac5bb7b8
Mark package to be installed or removed after creating the transaction.

This lets us implement support for fnmatch wildcard and do
better error checking.
main.c
razor.c
razor.h
test-driver.c
     1.1 --- a/main.c	Mon Apr 07 21:32:19 2008 -0400
     1.2 +++ b/main.c	Mon Apr 07 23:52:14 2008 -0400
     1.3 @@ -356,17 +356,71 @@
     1.4  }
     1.5  
     1.6  static int
     1.7 +mark_packages_for_update(struct razor_transaction *trans,
     1.8 +			 struct razor_set *set, const char *pattern)
     1.9 +{
    1.10 +	struct razor_package_iterator *pi;
    1.11 +	struct razor_package *package;
    1.12 +	const char *name, *version, *arch;
    1.13 +	int matches = 0;
    1.14 +
    1.15 +	pi = razor_package_iterator_create(set);
    1.16 +	while (razor_package_iterator_next(pi, &package,
    1.17 +					   &name, &version, &arch)) {
    1.18 +		if (pattern && fnmatch(pattern, name, 0) == 0) {
    1.19 +			razor_transaction_install_package(trans, package);
    1.20 +			matches++;
    1.21 +		}
    1.22 +	}
    1.23 +	razor_package_iterator_destroy(pi);
    1.24 +
    1.25 +	return matches;
    1.26 +}
    1.27 +
    1.28 +static int
    1.29 +mark_packages_for_removal(struct razor_transaction *trans,
    1.30 +			  struct razor_set *set, const char *pattern)
    1.31 +{
    1.32 +	struct razor_package_iterator *pi;
    1.33 +	struct razor_package *package;
    1.34 +	const char *name, *version, *arch;
    1.35 +	int matches = 0;
    1.36 +
    1.37 +	pi = razor_package_iterator_create(set);
    1.38 +	while (razor_package_iterator_next(pi, &package,
    1.39 +					   &name, &version, &arch)) {
    1.40 +		if (pattern && fnmatch(pattern, name, 0) == 0) {
    1.41 +			razor_transaction_remove_package(trans, package);
    1.42 +			matches++;
    1.43 +		}
    1.44 +	}
    1.45 +	razor_package_iterator_destroy(pi);
    1.46 +
    1.47 +	return matches;
    1.48 +}
    1.49 +
    1.50 +static int
    1.51  command_update(int argc, const char *argv[])
    1.52  {
    1.53  	struct razor_set *set, *upstream;
    1.54  	struct razor_transaction *trans;
    1.55 -	int errors;
    1.56 +	int i, errors;
    1.57  
    1.58  	set = razor_set_open(repo_filename);
    1.59  	upstream = razor_set_open(rawhide_repo_filename);
    1.60  	if (set == NULL || upstream == NULL)
    1.61  		return 1;
    1.62 -	trans = razor_transaction_create(set, upstream, argc, argv, 0, NULL);
    1.63 +
    1.64 +	trans = razor_transaction_create(set, upstream);
    1.65 +	if (argc == 0)
    1.66 +		razor_transaction_update_all(trans);
    1.67 +	for (i = 0; i < argc; i++) {
    1.68 +		if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
    1.69 +			fprintf(stderr, "no match for %s\n", argv[i]);
    1.70 +			return 1;
    1.71 +		}
    1.72 +	}
    1.73 +		
    1.74  	errors = razor_transaction_describe(trans);
    1.75  	if (errors)
    1.76  		return 1;
    1.77 @@ -385,12 +439,20 @@
    1.78  {
    1.79  	struct razor_set *set;
    1.80  	struct razor_transaction *trans;
    1.81 -	int errors;
    1.82 +	int i, errors;
    1.83  
    1.84  	set = razor_set_open(repo_filename);
    1.85  	if (set == NULL)
    1.86  		return 1;
    1.87 -	trans = razor_transaction_create(set, NULL, 0, NULL, argc, argv);
    1.88 +
    1.89 +	trans = razor_transaction_create(set, NULL);
    1.90 +	for (i = 0; i < argc; i++) {
    1.91 +		if (mark_packages_for_removal(trans, set, argv[i]) == 0) {
    1.92 +			fprintf(stderr, "no match for %s\n", argv[i]);
    1.93 +			return 1;
    1.94 +		}
    1.95 +	}
    1.96 +
    1.97  	errors = razor_transaction_describe(trans);
    1.98  	if (errors)
    1.99  		return 1;
   1.100 @@ -564,7 +626,7 @@
   1.101  	struct razor_set *system, *upstream, *next;
   1.102  	struct razor_transaction *trans;
   1.103  	char path[PATH_MAX], new_path[PATH_MAX];
   1.104 -	int errors, fd;
   1.105 +	int i, errors, fd;
   1.106  
   1.107  	/* Create the new next repo file up front to ensure exclusive
   1.108  	 * access. */
   1.109 @@ -590,8 +652,15 @@
   1.110  		unlink(new_path);
   1.111  		return 1;
   1.112  	}
   1.113 -	trans = razor_transaction_create(system, upstream,
   1.114 -					 argc, argv, 0, NULL);
   1.115 +	trans = razor_transaction_create(system, upstream);
   1.116 +	for (i = 0; i < argc; i++) {
   1.117 +		if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
   1.118 +			fprintf(stderr, "no package matched %s\n", argv[i]);
   1.119 +			unlink(new_path);
   1.120 +			return 1;
   1.121 +		}
   1.122 +	}
   1.123 +
   1.124  	errors = razor_transaction_describe(trans);
   1.125  	if (errors) {
   1.126  		unlink(new_path);
     2.1 --- a/razor.c	Mon Apr 07 21:32:19 2008 -0400
     2.2 +++ b/razor.c	Mon Apr 07 23:52:14 2008 -0400
     2.3 @@ -1949,39 +1949,6 @@
     2.4  	}
     2.5  }
     2.6  
     2.7 -static void
     2.8 -find_all_packages(struct razor_transaction *trans)
     2.9 -{
    2.10 -	struct razor_transaction_package *tp;
    2.11 -	struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend;
    2.12 -	const char *spool, *upool;
    2.13 -
    2.14 -	spkgs = trans->system->packages.data;
    2.15 -	send = trans->system->packages.data + trans->system->packages.size;
    2.16 -	spool = trans->system->string_pool.data;
    2.17 -	up = upkgs = trans->upstream->packages.data;
    2.18 -	uend = trans->upstream->packages.data + trans->upstream->packages.size;
    2.19 -	upool = trans->upstream->string_pool.data;
    2.20 -
    2.21 -	for (sp = spkgs; sp < send; sp++) {
    2.22 -		while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0)
    2.23 -			up++;
    2.24 -		if (strcmp(&spool[sp->name], &upool[up->name]) == 0 &&
    2.25 -		    versioncmp(&spool[sp->version], &upool[up->version]) < 0) {
    2.26 -			tp = array_add(&trans->packages, sizeof *tp);
    2.27 -			memset(tp, 0, sizeof *tp);
    2.28 -			tp->old_package = sp;
    2.29 -			tp->new_package = up;
    2.30 -			tp->name = &upool[up->name];
    2.31 -			tp->old_version = &spool[sp->version];
    2.32 -			tp->new_version = &upool[up->version];
    2.33 -			tp->state = RAZOR_PACKAGE_INSTALL;
    2.34 -			bitarray_set(&trans->uppkgs, up - upkgs, 1);
    2.35 -			bitarray_set(&trans->syspkgs, sp - spkgs, 0);
    2.36 -		}
    2.37 -	}
    2.38 -}
    2.39 -
    2.40  static int
    2.41  provider_satisfies_requirement(struct razor_property *provider,
    2.42  			       const char *provider_strings,
    2.43 @@ -2601,39 +2568,74 @@
    2.44  	}
    2.45  }
    2.46  
    2.47 +void
    2.48 +razor_transaction_install_package(struct razor_transaction *transaction,
    2.49 +				  struct razor_package *package)
    2.50 +{
    2.51 +	add_transaction_package(transaction, package, NULL,
    2.52 +				RAZOR_PACKAGE_INSTALL, NULL, NULL);
    2.53 +}
    2.54 +
    2.55 +void
    2.56 +razor_transaction_remove_package(struct razor_transaction *transaction,
    2.57 +				 struct razor_package *package)
    2.58 +{
    2.59 +	add_transaction_package(transaction, NULL, package,
    2.60 +				RAZOR_PACKAGE_REMOVE, NULL, NULL);
    2.61 +}
    2.62 +
    2.63 +void
    2.64 +razor_transaction_update_all(struct razor_transaction *trans)
    2.65 +{
    2.66 +	struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend;
    2.67 +	const char *spool, *upool;
    2.68 +
    2.69 +	spkgs = trans->system->packages.data;
    2.70 +	send = trans->system->packages.data + trans->system->packages.size;
    2.71 +	spool = trans->system->string_pool.data;
    2.72 +	up = upkgs = trans->upstream->packages.data;
    2.73 +	uend = trans->upstream->packages.data + trans->upstream->packages.size;
    2.74 +	upool = trans->upstream->string_pool.data;
    2.75 +
    2.76 +	for (sp = spkgs; sp < send; sp++) {
    2.77 +		while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0)
    2.78 +			up++;
    2.79 +		if (strcmp(&spool[sp->name], &upool[up->name]) == 0 &&
    2.80 +		    versioncmp(&spool[sp->version], &upool[up->version]) < 0) {
    2.81 +			add_transaction_package(trans, up, sp,
    2.82 +						RAZOR_PACKAGE_INSTALL,
    2.83 +						NULL, NULL);
    2.84 +		}
    2.85 +	}
    2.86 +}
    2.87 +
    2.88  struct razor_transaction *
    2.89 -razor_transaction_create(struct razor_set *system, struct razor_set *upstream,
    2.90 -			 int update_count, const char **update_packages,
    2.91 -			 int remove_count, const char **remove_packages)
    2.92 +razor_transaction_create(struct razor_set *system, struct razor_set *upstream)
    2.93  {
    2.94  	struct razor_transaction *trans;
    2.95 -	struct razor_transaction_package *tp;
    2.96 -	int start, end, i;
    2.97 +	int count;
    2.98  
    2.99  	trans = zalloc(sizeof *trans);
   2.100  
   2.101  	trans->system = system;
   2.102  	trans->upstream = upstream ? upstream : razor_set_create();
   2.103  	array_init(&trans->packages);
   2.104 -	bitarray_init(&trans->syspkgs, trans->system->packages.size / sizeof (struct razor_package), 1);
   2.105 -	bitarray_init(&trans->uppkgs, trans->upstream->packages.size / sizeof (struct razor_package), 0);
   2.106 -	trans->errors = 0;
   2.107 -
   2.108 -	if (update_count > 0 || remove_count > 0) {
   2.109 -		for (i = 0; i < update_count; i++) {
   2.110 -			tp = array_add(&trans->packages, sizeof *tp);
   2.111 -			memset(tp, 0, sizeof *tp);
   2.112 -			tp->name = update_packages[i];
   2.113 -			tp->state = RAZOR_PACKAGE_INSTALL;
   2.114 -		}
   2.115 -		for (i = 0; i < remove_count; i++) {
   2.116 -			tp = array_add(&trans->packages, sizeof *tp);
   2.117 -			memset(tp, 0, sizeof *tp);
   2.118 -			tp->name = remove_packages[i];
   2.119 -			tp->state = RAZOR_PACKAGE_REMOVE;
   2.120 -		}
   2.121 -	} else
   2.122 -		find_all_packages(trans);
   2.123 +	count = trans->system->packages.size / sizeof (struct razor_package);
   2.124 +	bitarray_init(&trans->syspkgs, count, 1);
   2.125 +	count = trans->upstream->packages.size / sizeof (struct razor_package);
   2.126 +	bitarray_init(&trans->uppkgs, count, 0);
   2.127 +
   2.128 +	return trans;
   2.129 +}
   2.130 +
   2.131 +static void
   2.132 +resolve_transaction(struct razor_transaction *trans)
   2.133 +{
   2.134 +	int start, end;
   2.135 +
   2.136 +	if (trans->package_count > 0)
   2.137 +		/* Already did this, return. */
   2.138 +		return;
   2.139  
   2.140  	start = 0;
   2.141  	end = trans->packages.size / sizeof (struct razor_transaction_package);
   2.142 @@ -2650,8 +2652,6 @@
   2.143  	}
   2.144  
   2.145  	trans->package_count = end;
   2.146 -
   2.147 -	return trans;
   2.148  }
   2.149  
   2.150  const char * const razor_version_relations[] = {
   2.151 @@ -2699,6 +2699,8 @@
   2.152  	struct razor_transaction_package *p, *pend, *tps;
   2.153  	int errors_only = 0;
   2.154  
   2.155 +	resolve_transaction(trans);
   2.156 +
   2.157  	tps = trans->packages.data;
   2.158  	pend = trans->packages.data + trans->packages.size;
   2.159  	for (p = trans->packages.data; p < pend; p++) {
   2.160 @@ -2837,6 +2839,8 @@
   2.161  {
   2.162  	struct razor_transaction_package *p, *end;
   2.163  
   2.164 +	resolve_transaction(trans);
   2.165 +
   2.166  	end = trans->packages.data + trans->packages.size;
   2.167  	for (p = trans->packages.data; p < end; p++) {
   2.168  		if (p->state != RAZOR_PACKAGE_UNSATISFIABLE)
   2.169 @@ -2865,6 +2869,8 @@
   2.170  	struct razor_transaction_package *p, *end;
   2.171  	int cmp;
   2.172  
   2.173 +	resolve_transaction(trans);
   2.174 +
   2.175  	/* FIXME */
   2.176  	if (trans->errors)
   2.177  		return NULL;
     3.1 --- a/razor.h	Mon Apr 07 21:32:19 2008 -0400
     3.2 +++ b/razor.h	Mon Apr 07 23:52:14 2008 -0400
     3.3 @@ -112,9 +112,12 @@
     3.4  };
     3.5  
     3.6  struct razor_transaction *
     3.7 -razor_transaction_create(struct razor_set *system, struct razor_set *upstream,
     3.8 -			 int update_count, const char **update_packages,
     3.9 -			 int remove_count, const char **remove_packages);
    3.10 +razor_transaction_create(struct razor_set *system, struct razor_set *upstream);
    3.11 +void razor_transaction_install_package(struct razor_transaction *transaction,
    3.12 +				       struct razor_package *package);
    3.13 +void razor_transaction_remove_package(struct razor_transaction *transaction,
    3.14 +				      struct razor_package *package);
    3.15 +void razor_transaction_update_all(struct razor_transaction *transaction);
    3.16  int razor_transaction_describe(struct razor_transaction *trans);
    3.17  struct razor_set *razor_transaction_finish(struct razor_transaction *trans);
    3.18  void razor_transaction_destroy(struct razor_transaction *trans);
     4.1 --- a/test-driver.c	Mon Apr 07 21:32:19 2008 -0400
     4.2 +++ b/test-driver.c	Mon Apr 07 23:52:14 2008 -0400
     4.3 @@ -252,13 +252,21 @@
     4.4  static void
     4.5  end_transaction(struct test_context *ctx)
     4.6  {
     4.7 -	int errors;
     4.8 +	struct razor_package *pkg;
     4.9 +	int errors, i;
    4.10  
    4.11 -	ctx->trans = razor_transaction_create(ctx->system_set, ctx->repo_set,
    4.12 -					      ctx->n_install_pkgs,
    4.13 -					      (const char **)ctx->install_pkgs,
    4.14 -					      ctx->n_remove_pkgs,
    4.15 -					      (const char **)ctx->remove_pkgs);
    4.16 +	ctx->trans = razor_transaction_create(ctx->system_set, ctx->repo_set);
    4.17 +	for (i = 0; i < ctx->n_install_pkgs; i++) {
    4.18 +		pkg = razor_set_get_package(ctx->repo_set,
    4.19 +					    ctx->install_pkgs[i]);
    4.20 +		razor_transaction_install_package(ctx->trans, pkg);
    4.21 +	}		
    4.22 +	for (i = 0; i < ctx->n_remove_pkgs; i++) {
    4.23 +		pkg = razor_set_get_package(ctx->repo_set,
    4.24 +					    ctx->remove_pkgs[i]);
    4.25 +		razor_transaction_remove_package(ctx->trans, pkg);
    4.26 +	}		
    4.27 +
    4.28  	errors = razor_transaction_describe(ctx->trans);
    4.29  	printf("\n");
    4.30