razor.c
changeset 168 680d18568209
parent 167 28e203d118c7
child 169 2d0ad2111cb0
     1.1 --- a/razor.c	Tue Mar 11 18:12:02 2008 -0400
     1.2 +++ b/razor.c	Wed Mar 12 11:46:53 2008 -0400
     1.3 @@ -1836,6 +1836,42 @@
     1.4  		property < set->properties.data + set->properties.size;
     1.5  }
     1.6  
     1.7 +static struct razor_package *
     1.8 +property_provider_package(struct razor_transaction_resolver *trans,
     1.9 +			  struct razor_property *prop,
    1.10 +			  int installed)
    1.11 +{
    1.12 +	struct razor_set *set;
    1.13 +	struct bitarray *pkgbits;
    1.14 +	struct razor_package *pkgs;
    1.15 +	struct list *p;
    1.16 +
    1.17 +	if (installed && prop->type != RAZOR_PROPERTY_PROVIDES)
    1.18 +		return NULL;
    1.19 +	else if (!installed &&
    1.20 +		 prop->type != RAZOR_PROPERTY_PROVIDES &&
    1.21 +		 prop->type != RAZOR_PROPERTY_OBSOLETES)
    1.22 +		return NULL;
    1.23 +
    1.24 +	if (property_in_set(prop, trans->system)) {
    1.25 +		set = trans->system;
    1.26 +		pkgbits = &trans->syspkgs;
    1.27 +	} else {
    1.28 +		set = trans->upstream;
    1.29 +		pkgbits = &trans->uppkgs;
    1.30 +	}
    1.31 +	pkgs = set->packages.data;
    1.32 +
    1.33 +	for (p = list_first(&prop->packages, &set->package_pool); p; p = list_next(p)) {
    1.34 +		if (bitarray_get(pkgbits, p->data) != installed)
    1.35 +			continue;
    1.36 +		if (prop->type == RAZOR_PROPERTY_OBSOLETES ||
    1.37 +		    pkgs[p->data].name == prop->name)
    1.38 +			return &pkgs[p->data];
    1.39 +	}
    1.40 +	return NULL;
    1.41 +}
    1.42 +
    1.43  static int
    1.44  compare_transaction_packages(const void *one, const void *two)
    1.45  {
    1.46 @@ -1850,66 +1886,95 @@
    1.47  		return strcmp((*tp1)->name, (*tp2)->name);
    1.48  }
    1.49  
    1.50 +/* FIXME: merge this into the other property loop in razor_transaction_satisfy */
    1.51  static void
    1.52  resolve_new_packages(struct razor_transaction_resolver *trans,
    1.53  		     int start, int end)
    1.54  {
    1.55 -	struct razor_package *sp, *spkgs, *up, *upkgs, *send, *uend;
    1.56 +	struct razor_property *sp, *up, *sp_end, *up_end;
    1.57 +	struct razor_package *spkg, *spkgs, *upkg, *upkgs;
    1.58  	struct razor_transaction_package **packages;
    1.59  	const char *spool, *upool;
    1.60  	int i;
    1.61  
    1.62 +	sp_end = trans->system->properties.data + trans->system->properties.size;
    1.63 +	spool = trans->system->string_pool.data;
    1.64  	spkgs = trans->system->packages.data;
    1.65 -	send = trans->system->packages.data + trans->system->packages.size;
    1.66 -	spool = trans->system->string_pool.data;
    1.67 +	up_end = trans->upstream->properties.data + trans->upstream->properties.size;
    1.68 +	upool = trans->upstream->string_pool.data;
    1.69  	upkgs = trans->upstream->packages.data;
    1.70 -	uend = trans->upstream->packages.data + trans->upstream->packages.size;
    1.71 -	upool = trans->upstream->string_pool.data;
    1.72 -
    1.73 +
    1.74 +	/* FIXME, check if sorting the packages directly (rather than
    1.75 +	 * sorting pointers-to-packages) still results in confusing
    1.76 +	 * descriptions.
    1.77 +	 */
    1.78  	packages = calloc(end - start, sizeof *packages);
    1.79  	for (i = start; i < end; i++)
    1.80  		packages[i - start] = ((struct razor_transaction_package *)trans->packages.data) + i;
    1.81  	qsort(packages, end - start, sizeof *packages,
    1.82  	      compare_transaction_packages);
    1.83  
    1.84 -	sp = spkgs;
    1.85 -	up = upkgs;
    1.86 +	sp = trans->system->properties.data;
    1.87 +	up = trans->upstream->properties.data;
    1.88  	for (i = 0; i < end - start; i++) {
    1.89  		if (!packages[i]->name)
    1.90  			continue;
    1.91 -		while (sp < send && strcmp(&spool[sp->name], packages[i]->name) < 0)
    1.92 +
    1.93 +		spkg = NULL;
    1.94 +		while (sp < sp_end &&
    1.95 +		       strcmp(&spool[sp->name], packages[i]->name) < 0)
    1.96  			sp++;
    1.97 -		while (up < uend && strcmp(&upool[up->name], packages[i]->name) < 0)
    1.98 +		while (sp < sp_end &&
    1.99 +		       strcmp(&spool[sp->name], packages[i]->name) == 0 &&
   1.100 +		       !(spkg = property_provider_package(trans, sp, 1)))
   1.101 +			sp++;
   1.102 +
   1.103 +		upkg = NULL;
   1.104 +		while (up < up_end &&
   1.105 +		       strcmp(&upool[up->name], packages[i]->name) < 0)
   1.106 +			up++;
   1.107 +		while (up < up_end &&
   1.108 +		       strcmp(&upool[up->name], packages[i]->name) == 0 &&
   1.109 +		       !(upkg = property_provider_package(trans, up, 0)))
   1.110  			up++;
   1.111  
   1.112  		if (packages[i]->state == RAZOR_PACKAGE_REMOVE ||
   1.113  		    packages[i]->state == RAZOR_PACKAGE_OBSOLETED) {
   1.114 -			if (sp < send && strcmp(packages[i]->name, &spool[sp->name]) == 0) {
   1.115 -				packages[i]->old_package = sp;
   1.116 -				packages[i]->name = &spool[sp->name];
   1.117 -				packages[i]->old_version = &spool[sp->version];
   1.118 -				bitarray_set(&trans->syspkgs, sp - spkgs, 0);
   1.119 +			if (spkg) {
   1.120 +				packages[i]->old_package = spkg;
   1.121 +				packages[i]->name = &spool[spkg->name];
   1.122 +				packages[i]->old_version = &spool[spkg->version];
   1.123 +				bitarray_set(&trans->syspkgs, spkg - spkgs, 0);
   1.124  			} else {
   1.125  				packages[i]->name = strdup(packages[i]->name);
   1.126  				packages[i]->state = RAZOR_PACKAGE_REMOVE_NOT_INSTALLED;
   1.127  				trans->errors++;
   1.128  			}
   1.129  		} else {
   1.130 -			if (up < uend && strcmp(packages[i]->name, &upool[up->name]) == 0) {
   1.131 -				packages[i]->new_package = up;
   1.132 -				packages[i]->name = &upool[up->name];
   1.133 -				packages[i]->new_version = &upool[up->version];
   1.134 -				if (sp < send && strcmp(packages[i]->name, &spool[sp->name]) == 0) {
   1.135 -					packages[i]->old_package = sp;
   1.136 -					packages[i]->old_version = &spool[sp->version];
   1.137 -					if (versioncmp(&spool[sp->version], &upool[up->version]) >= 0) {
   1.138 +			if (upkg) {
   1.139 +				packages[i]->new_package = upkg;
   1.140 +				packages[i]->name = &upool[upkg->name];
   1.141 +				packages[i]->new_version = &upool[upkg->version];
   1.142 +
   1.143 +				if (up->name != upkg->name) {
   1.144 +					packages[i]->dep_package = &upool[upkg->name];
   1.145 +					packages[i]->dep_type = up->type;
   1.146 +					packages[i]->dep_property = &upool[up->name];
   1.147 +					packages[i]->dep_relation = up->relation;
   1.148 +					packages[i]->dep_version = &upool[up->version];
   1.149 +				}
   1.150 +
   1.151 +				if (spkg) {
   1.152 +					packages[i]->old_package = spkg;
   1.153 +					packages[i]->old_version = &spool[spkg->version];
   1.154 +					if (versioncmp(&spool[spkg->version], &upool[up->version]) >= 0) {
   1.155  						packages[i]->state = RAZOR_PACKAGE_UP_TO_DATE;
   1.156  						trans->errors++;
   1.157  						continue;
   1.158  					}
   1.159 -					bitarray_set(&trans->syspkgs, sp - spkgs, 0);
   1.160 +					bitarray_set(&trans->syspkgs, spkg - spkgs, 0);
   1.161  				}
   1.162 -				bitarray_set(&trans->uppkgs, up - upkgs, 1);
   1.163 +				bitarray_set(&trans->uppkgs, upkg - upkgs, 1);
   1.164  			} else {
   1.165  				packages[i]->name = strdup(packages[i]->name);
   1.166  				packages[i]->state = RAZOR_PACKAGE_INSTALL_UNAVAILABLE;