razor.c
changeset 208 7b460017c221
parent 197 d29026900856
child 209 78afac5bb7b8
     1.1 --- a/razor.c	Mon Apr 07 00:35:27 2008 -0400
     1.2 +++ b/razor.c	Mon Apr 07 23:52:14 2008 -0400
     1.3 @@ -1949,39 +1949,6 @@
     1.4  	}
     1.5  }
     1.6  
     1.7 -static void
     1.8 -find_all_packages(struct razor_transaction *trans)
     1.9 -{
    1.10 -	struct razor_transaction_package *tp;
    1.11 -	struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend;
    1.12 -	const char *spool, *upool;
    1.13 -
    1.14 -	spkgs = trans->system->packages.data;
    1.15 -	send = trans->system->packages.data + trans->system->packages.size;
    1.16 -	spool = trans->system->string_pool.data;
    1.17 -	up = upkgs = trans->upstream->packages.data;
    1.18 -	uend = trans->upstream->packages.data + trans->upstream->packages.size;
    1.19 -	upool = trans->upstream->string_pool.data;
    1.20 -
    1.21 -	for (sp = spkgs; sp < send; sp++) {
    1.22 -		while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0)
    1.23 -			up++;
    1.24 -		if (strcmp(&spool[sp->name], &upool[up->name]) == 0 &&
    1.25 -		    versioncmp(&spool[sp->version], &upool[up->version]) < 0) {
    1.26 -			tp = array_add(&trans->packages, sizeof *tp);
    1.27 -			memset(tp, 0, sizeof *tp);
    1.28 -			tp->old_package = sp;
    1.29 -			tp->new_package = up;
    1.30 -			tp->name = &upool[up->name];
    1.31 -			tp->old_version = &spool[sp->version];
    1.32 -			tp->new_version = &upool[up->version];
    1.33 -			tp->state = RAZOR_PACKAGE_INSTALL;
    1.34 -			bitarray_set(&trans->uppkgs, up - upkgs, 1);
    1.35 -			bitarray_set(&trans->syspkgs, sp - spkgs, 0);
    1.36 -		}
    1.37 -	}
    1.38 -}
    1.39 -
    1.40  static int
    1.41  provider_satisfies_requirement(struct razor_property *provider,
    1.42  			       const char *provider_strings,
    1.43 @@ -2601,39 +2568,74 @@
    1.44  	}
    1.45  }
    1.46  
    1.47 +void
    1.48 +razor_transaction_install_package(struct razor_transaction *transaction,
    1.49 +				  struct razor_package *package)
    1.50 +{
    1.51 +	add_transaction_package(transaction, package, NULL,
    1.52 +				RAZOR_PACKAGE_INSTALL, NULL, NULL);
    1.53 +}
    1.54 +
    1.55 +void
    1.56 +razor_transaction_remove_package(struct razor_transaction *transaction,
    1.57 +				 struct razor_package *package)
    1.58 +{
    1.59 +	add_transaction_package(transaction, NULL, package,
    1.60 +				RAZOR_PACKAGE_REMOVE, NULL, NULL);
    1.61 +}
    1.62 +
    1.63 +void
    1.64 +razor_transaction_update_all(struct razor_transaction *trans)
    1.65 +{
    1.66 +	struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend;
    1.67 +	const char *spool, *upool;
    1.68 +
    1.69 +	spkgs = trans->system->packages.data;
    1.70 +	send = trans->system->packages.data + trans->system->packages.size;
    1.71 +	spool = trans->system->string_pool.data;
    1.72 +	up = upkgs = trans->upstream->packages.data;
    1.73 +	uend = trans->upstream->packages.data + trans->upstream->packages.size;
    1.74 +	upool = trans->upstream->string_pool.data;
    1.75 +
    1.76 +	for (sp = spkgs; sp < send; sp++) {
    1.77 +		while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0)
    1.78 +			up++;
    1.79 +		if (strcmp(&spool[sp->name], &upool[up->name]) == 0 &&
    1.80 +		    versioncmp(&spool[sp->version], &upool[up->version]) < 0) {
    1.81 +			add_transaction_package(trans, up, sp,
    1.82 +						RAZOR_PACKAGE_INSTALL,
    1.83 +						NULL, NULL);
    1.84 +		}
    1.85 +	}
    1.86 +}
    1.87 +
    1.88  struct razor_transaction *
    1.89 -razor_transaction_create(struct razor_set *system, struct razor_set *upstream,
    1.90 -			 int update_count, const char **update_packages,
    1.91 -			 int remove_count, const char **remove_packages)
    1.92 +razor_transaction_create(struct razor_set *system, struct razor_set *upstream)
    1.93  {
    1.94  	struct razor_transaction *trans;
    1.95 -	struct razor_transaction_package *tp;
    1.96 -	int start, end, i;
    1.97 +	int count;
    1.98  
    1.99  	trans = zalloc(sizeof *trans);
   1.100  
   1.101  	trans->system = system;
   1.102  	trans->upstream = upstream ? upstream : razor_set_create();
   1.103  	array_init(&trans->packages);
   1.104 -	bitarray_init(&trans->syspkgs, trans->system->packages.size / sizeof (struct razor_package), 1);
   1.105 -	bitarray_init(&trans->uppkgs, trans->upstream->packages.size / sizeof (struct razor_package), 0);
   1.106 -	trans->errors = 0;
   1.107 -
   1.108 -	if (update_count > 0 || remove_count > 0) {
   1.109 -		for (i = 0; i < update_count; i++) {
   1.110 -			tp = array_add(&trans->packages, sizeof *tp);
   1.111 -			memset(tp, 0, sizeof *tp);
   1.112 -			tp->name = update_packages[i];
   1.113 -			tp->state = RAZOR_PACKAGE_INSTALL;
   1.114 -		}
   1.115 -		for (i = 0; i < remove_count; i++) {
   1.116 -			tp = array_add(&trans->packages, sizeof *tp);
   1.117 -			memset(tp, 0, sizeof *tp);
   1.118 -			tp->name = remove_packages[i];
   1.119 -			tp->state = RAZOR_PACKAGE_REMOVE;
   1.120 -		}
   1.121 -	} else
   1.122 -		find_all_packages(trans);
   1.123 +	count = trans->system->packages.size / sizeof (struct razor_package);
   1.124 +	bitarray_init(&trans->syspkgs, count, 1);
   1.125 +	count = trans->upstream->packages.size / sizeof (struct razor_package);
   1.126 +	bitarray_init(&trans->uppkgs, count, 0);
   1.127 +
   1.128 +	return trans;
   1.129 +}
   1.130 +
   1.131 +static void
   1.132 +resolve_transaction(struct razor_transaction *trans)
   1.133 +{
   1.134 +	int start, end;
   1.135 +
   1.136 +	if (trans->package_count > 0)
   1.137 +		/* Already did this, return. */
   1.138 +		return;
   1.139  
   1.140  	start = 0;
   1.141  	end = trans->packages.size / sizeof (struct razor_transaction_package);
   1.142 @@ -2650,8 +2652,6 @@
   1.143  	}
   1.144  
   1.145  	trans->package_count = end;
   1.146 -
   1.147 -	return trans;
   1.148  }
   1.149  
   1.150  const char * const razor_version_relations[] = {
   1.151 @@ -2699,6 +2699,8 @@
   1.152  	struct razor_transaction_package *p, *pend, *tps;
   1.153  	int errors_only = 0;
   1.154  
   1.155 +	resolve_transaction(trans);
   1.156 +
   1.157  	tps = trans->packages.data;
   1.158  	pend = trans->packages.data + trans->packages.size;
   1.159  	for (p = trans->packages.data; p < pend; p++) {
   1.160 @@ -2837,6 +2839,8 @@
   1.161  {
   1.162  	struct razor_transaction_package *p, *end;
   1.163  
   1.164 +	resolve_transaction(trans);
   1.165 +
   1.166  	end = trans->packages.data + trans->packages.size;
   1.167  	for (p = trans->packages.data; p < end; p++) {
   1.168  		if (p->state != RAZOR_PACKAGE_UNSATISFIABLE)
   1.169 @@ -2865,6 +2869,8 @@
   1.170  	struct razor_transaction_package *p, *end;
   1.171  	int cmp;
   1.172  
   1.173 +	resolve_transaction(trans);
   1.174 +
   1.175  	/* FIXME */
   1.176  	if (trans->errors)
   1.177  		return NULL;