razor.c
changeset 145 097f7b60b97a
parent 144 56c487a56fa2
child 146 1d4043c9f869
     1.1 --- a/razor.c	Tue Mar 04 19:07:14 2008 -0500
     1.2 +++ b/razor.c	Wed Mar 05 10:46:40 2008 -0500
     1.3 @@ -1754,28 +1754,26 @@
     1.4  				bitarray_set(&trans->syspkgs, sp - spkgs, 0);
     1.5  			} else {
     1.6  				packages[i].name = strdup(packages[i].name);
     1.7 -				packages[i].state |= RAZOR_PACKAGE_UNAVAILABLE;
     1.8 +				packages[i].state = RAZOR_PACKAGE_REMOVE_NOT_INSTALLED;
     1.9  				trans->errors++;
    1.10  			}
    1.11  		} else {
    1.12  			if (up < uend && strcmp(packages[i].name, &upool[up->name]) == 0) {
    1.13 +				packages[i].package = up;
    1.14 +				packages[i].name = &upool[up->name];
    1.15 +				packages[i].version = &upool[up->version];
    1.16  				if (sp < send && strcmp(packages[i].name, &spool[sp->name]) == 0) {
    1.17  					if (versioncmp(&spool[sp->version], &upool[up->version]) >= 0) {
    1.18 -						/* FIXME: need a distinct error */
    1.19 -						packages[i].name = strdup(packages[i].name);
    1.20 -						packages[i].state |= RAZOR_PACKAGE_UNAVAILABLE;
    1.21 +						packages[i].state = RAZOR_PACKAGE_UP_TO_DATE;
    1.22  						trans->errors++;
    1.23  						continue;
    1.24  					}
    1.25  					bitarray_set(&trans->syspkgs, sp - spkgs, 0);
    1.26  				}
    1.27 -				packages[i].package = up;
    1.28 -				packages[i].name = &upool[up->name];
    1.29 -				packages[i].version = &upool[up->version];
    1.30  				bitarray_set(&trans->uppkgs, up - upkgs, 1);
    1.31  			} else {
    1.32  				packages[i].name = strdup(packages[i].name);
    1.33 -				packages[i].state |= RAZOR_PACKAGE_UNAVAILABLE;
    1.34 +				packages[i].state = RAZOR_PACKAGE_INSTALL_UNAVAILABLE;
    1.35  				trans->errors++;
    1.36  			}
    1.37  		}
    1.38 @@ -2099,13 +2097,21 @@
    1.39  			const char *req_package,
    1.40  			struct razor_property *req_prop)
    1.41  {
    1.42 -	struct razor_set *package_set;
    1.43 +	struct razor_set *package_set, *req_set;
    1.44 +	struct bitarray *reqpkgbits;
    1.45  	struct razor_transaction_package *tp, *packages;
    1.46  	const char *pool;
    1.47  	struct razor_package *pkgs;
    1.48  	struct list *pkg;
    1.49  
    1.50  	package_set = package_in_set(package, trans->system) ? trans->system : trans->upstream;
    1.51 +	if (property_in_set(req_prop, trans->system)) {
    1.52 +		req_set = trans->system;
    1.53 +		reqpkgbits = &trans->syspkgs;
    1.54 +	} else {
    1.55 +		req_set = trans->upstream;
    1.56 +		reqpkgbits = &trans->uppkgs;
    1.57 +	}
    1.58  
    1.59  	tp = array_add(&trans->packages, sizeof *tp);
    1.60  	memset(tp, 0, sizeof *tp);
    1.61 @@ -2125,7 +2131,11 @@
    1.62  					return;
    1.63  				}
    1.64  				/* Oops. We lose */
    1.65 -				state |= RAZOR_PACKAGE_BLOCKED;
    1.66 +				if (state != RAZOR_PACKAGE_CONTRADICTION) {
    1.67 +					add_transaction_package(trans, package,
    1.68 +								RAZOR_PACKAGE_CONTRADICTION,
    1.69 +								NULL, NULL);
    1.70 +				}
    1.71  				break;
    1.72  			}
    1.73  		}
    1.74 @@ -2134,35 +2144,39 @@
    1.75  		tp->name = &pool[package->name];
    1.76  		tp->version = &pool[package->version];
    1.77  		tp->state = state;
    1.78 -	} else
    1.79 -		tp->state = state | RAZOR_PACKAGE_UNSATISFIABLE;
    1.80 +
    1.81 +		pkgs = package_set->packages.data;
    1.82 +		if (tp->state == RAZOR_PACKAGE_INSTALL)
    1.83 +			bitarray_set(&trans->uppkgs, package - pkgs, 1);
    1.84 +		else if (tp->state == RAZOR_PACKAGE_REMOVE)
    1.85 +			bitarray_set(&trans->syspkgs, package - pkgs, 0);
    1.86 +		else
    1.87 +			trans->errors++;
    1.88 +	} else {
    1.89 +		tp->state = RAZOR_PACKAGE_UNSATISFIABLE;
    1.90 +		trans->errors++;
    1.91 +	}
    1.92  
    1.93  	if (req_package)
    1.94 -		tp->req_package = req_package;
    1.95 -	else {
    1.96 -		for (pkg = list_first(&req_prop->packages, &trans->upstream->package_pool); pkg; pkg = list_next(pkg)) {
    1.97 -			if (bitarray_get(&trans->uppkgs, pkg->data))
    1.98 +		tp->dep_package = req_package;
    1.99 +	if (!req_prop)
   1.100 +		return;
   1.101 +
   1.102 +	pool = req_set->string_pool.data;
   1.103 +	pkgs = req_set->packages.data;
   1.104 +	if (!req_package) {
   1.105 +		for (pkg = list_first(&req_prop->packages, &req_set->package_pool); pkg; pkg = list_next(pkg)) {
   1.106 +			if (bitarray_get(reqpkgbits, pkg->data))
   1.107  				break;
   1.108  		}
   1.109 -		if (pkg) {
   1.110 -			pool = trans->upstream->string_pool.data;
   1.111 -			pkgs = trans->upstream->packages.data;
   1.112 -			tp->req_package = &pool[pkgs[pkg->data].name];
   1.113 -		}
   1.114 +		if (pkg)
   1.115 +			tp->dep_package = &pool[pkgs[pkg->data].name];
   1.116  	}
   1.117  
   1.118 -	tp->req_type = req_prop->type;
   1.119 -	tp->req_property = &pool[req_prop->name];
   1.120 -	tp->req_relation = req_prop->relation;
   1.121 -	tp->req_version = &pool[req_prop->version];
   1.122 -
   1.123 -	pkgs = package_set->packages.data;
   1.124 -	if (tp->state == RAZOR_PACKAGE_INSTALL)
   1.125 -		bitarray_set(&trans->uppkgs, package - pkgs, 1);
   1.126 -	else if (tp->state == RAZOR_PACKAGE_REMOVE)
   1.127 -		bitarray_set(&trans->syspkgs, package - pkgs, 0);
   1.128 -	else
   1.129 -		trans->errors++;
   1.130 +	tp->dep_type = req_prop->type;
   1.131 +	tp->dep_property = &pool[req_prop->name];
   1.132 +	tp->dep_relation = req_prop->relation;
   1.133 +	tp->dep_version = &pool[req_prop->version];
   1.134  }
   1.135  
   1.136  /* FIXME: make this more efficient */
   1.137 @@ -2191,11 +2205,12 @@
   1.138  	struct razor_package *spkgs, *upkgs, *pkg, *upgrade;
   1.139  	struct razor_property *sp, *sprops, *sprop_end;
   1.140  	struct razor_property *up, *uprops, *uprop_end;
   1.141 -	const char *upool;
   1.142 +	const char *spool, *upool;
   1.143  
   1.144  	spkgs = trans->system->packages.data;
   1.145  	sprops = trans->system->properties.data;
   1.146  	sprop_end = trans->system->properties.data + trans->system->properties.size;
   1.147 +	spool = trans->system->string_pool.data;
   1.148  	upkgs = trans->upstream->packages.data;
   1.149  	uprops = trans->upstream->properties.data;
   1.150  	uprop_end = trans->upstream->properties.data + trans->upstream->properties.size;
   1.151 @@ -2248,21 +2263,23 @@
   1.152  			if (!pkg)
   1.153  				break;
   1.154  
   1.155 -			/* pkg CONFLICTS with what 'up' PROVIDES. Try
   1.156 -			 * finding an upgrade
   1.157 -			 */
   1.158 -			upgrade = find_upgrade_for_installed_conflict(trans, pkg, up);
   1.159 -			if (upgrade) {
   1.160 -				bitarray_set(&trans->syspkgs, pkg - spkgs, 0);
   1.161 -				add_transaction_package(trans, upgrade,
   1.162 -							RAZOR_PACKAGE_INSTALL,
   1.163 -							NULL, up);
   1.164 -			} else {
   1.165 -				add_transaction_package(trans, pkg,
   1.166 -							/* FIXME? */
   1.167 -							RAZOR_PACKAGE_REMOVE_CONFLICT,
   1.168 -							NULL, up);
   1.169 +			if (package_in_set(pkg, trans->system)) {
   1.170 +				/* pkg CONFLICTS with what 'up' PROVIDES. Try
   1.171 +				 * finding an upgrade
   1.172 +				 */
   1.173 +				upgrade = find_upgrade_for_installed_conflict(trans, pkg, up);
   1.174 +				if (upgrade) {
   1.175 +					bitarray_set(&trans->syspkgs, pkg - spkgs, 0);
   1.176 +					add_transaction_package(trans, upgrade,
   1.177 +								RAZOR_PACKAGE_INSTALL,
   1.178 +								&spool[pkg->name], sp);
   1.179 +				}
   1.180 +				break;
   1.181  			}
   1.182 +
   1.183 +			add_transaction_package(trans, pkg,
   1.184 +						RAZOR_PACKAGE_OLD_CONFLICT,
   1.185 +						NULL, up);
   1.186  			break;
   1.187  
   1.188  		case RAZOR_PROPERTY_CONFLICTS:
   1.189 @@ -2280,34 +2297,24 @@
   1.190  					add_transaction_package(trans, upgrade,
   1.191  								RAZOR_PACKAGE_INSTALL,
   1.192  								NULL, up);
   1.193 -				} else {
   1.194 -					add_transaction_package(trans, pkg,
   1.195 -								RAZOR_PACKAGE_INSTALL_CONFLICT,
   1.196 -								NULL, up);
   1.197 +					break;
   1.198  				}
   1.199 -			} else {
   1.200 -				/* Conflicts with something already to-be-installed */
   1.201 -				add_transaction_package(trans, pkg,
   1.202 -							RAZOR_PACKAGE_INSTALL_CONFLICT,
   1.203 -							NULL, up);
   1.204  			}
   1.205 +
   1.206 +			add_transaction_package(trans, pkg,
   1.207 +						RAZOR_PACKAGE_NEW_CONFLICT,
   1.208 +						NULL, up);
   1.209  			break;
   1.210  
   1.211  		case RAZOR_PROPERTY_OBSOLETES:
   1.212  			pkg = find_installed_package_for_property(trans, &sp, up);
   1.213 -			if (!pkg)
   1.214 -				break;
   1.215 -
   1.216 -			if (package_in_set(pkg, trans->system)) {
   1.217 -				/* Obsoletes something installed */
   1.218 +			if (pkg) {
   1.219 +				/* If pkg is to-be-installed, this
   1.220 +				 * will add a CONTRADICTION error as well.
   1.221 +				 */
   1.222  				add_transaction_package(trans, pkg,
   1.223  							RAZOR_PACKAGE_REMOVE,
   1.224  							NULL, up);
   1.225 -			} else {
   1.226 -				/* Obsoletes something that was to-be-installed */
   1.227 -				add_transaction_package(trans, pkg,
   1.228 -							RAZOR_PACKAGE_REMOVE_CONFLICT,
   1.229 -							NULL, up);
   1.230  			}
   1.231  			break;
   1.232  
   1.233 @@ -2580,11 +2587,6 @@
   1.234  	"requires", "provides", "conflicts with", "obsoletes"
   1.235  };
   1.236  
   1.237 -const char * const razor_property_types_removal[] = {
   1.238 -	/* same order as enum razor_property_type */
   1.239 -	"required", "provided", "conflicted with", "was obsoleted by"
   1.240 -};
   1.241 -
   1.242  void
   1.243  razor_transaction_describe(struct razor_transaction *trans)
   1.244  {
   1.245 @@ -2599,93 +2601,110 @@
   1.246  			if (errors_only)
   1.247  				break;
   1.248  
   1.249 -			printf ("Installing %s %s", p->name, p->version);
   1.250 -			if (p->req_package) {
   1.251 -				printf (" for %s", p->req_package);
   1.252 -			print_requirement:
   1.253 -				if (*p->req_version) {
   1.254 -					printf (", which %s %s %s %s",
   1.255 -						razor_property_types[p->req_type],
   1.256 -						p->req_property,
   1.257 -						razor_version_relations[p->req_relation],
   1.258 -						p->req_version);
   1.259 -				} else if (strcmp(p->req_property, p->name) != 0) {
   1.260 -					printf (", which %s %s",
   1.261 -						razor_property_types[p->req_type],
   1.262 -						p->req_property);
   1.263 +			printf("Installing %s %s", p->name, p->version);
   1.264 +			if (p->dep_package) {
   1.265 +				if (p->dep_type == RAZOR_PROPERTY_CONFLICTS &&
   1.266 +				    !strcmp(p->dep_package, p->name)) {
   1.267 +					printf(" because installed %s conflicts with %s",
   1.268 +					       p->name, p->dep_property);
   1.269 +					if (*p->dep_version) {
   1.270 +						printf(" %s %s",
   1.271 +						       razor_version_relations[p->dep_relation],
   1.272 +						       p->dep_version);
   1.273 +					}
   1.274 +				} else {
   1.275 +					printf(" for %s", p->dep_package);
   1.276 +					if (*p->dep_version) {
   1.277 +						printf(", which %s %s %s %s",
   1.278 +						       razor_property_types[p->dep_type],
   1.279 +						       p->dep_property,
   1.280 +						       razor_version_relations[p->dep_relation],
   1.281 +						       p->dep_version);
   1.282 +					} else if (strcmp(p->dep_property, p->name) != 0) {
   1.283 +						printf(", which %s %s",
   1.284 +						       razor_property_types[p->dep_type],
   1.285 +						       p->dep_property);
   1.286 +					}
   1.287  				}
   1.288  			}
   1.289  			printf("\n");
   1.290  			break;
   1.291  
   1.292 -		case RAZOR_PACKAGE_INSTALL_UNAVAILABLE:
   1.293 -			printf ("Can't find %s", p->name);
   1.294 -			if (p->req_package) {
   1.295 -				if (*p->req_version && strcmp(p->req_property, p->name) == 0) {
   1.296 -					printf ("%s %s, which is required by %s",
   1.297 -						razor_version_relations[p->req_relation],
   1.298 -						p->req_version,
   1.299 -						p->req_package);
   1.300 -				} else {
   1.301 -					if (*p->version)
   1.302 -						printf (" %s", p->version);
   1.303 -
   1.304 -					if (p->req_package) {
   1.305 -						printf ("  which is required by %s",
   1.306 -							p->req_package);
   1.307 -						if (strcmp(p->req_property, p->name) != 0)
   1.308 -							printf (" for %s", p->req_property);
   1.309 -					}
   1.310 -				}
   1.311 -			} else if (p->version && *p->version)
   1.312 -				printf (" %s", p->version);
   1.313 -			printf("\n");
   1.314 -			errors_only = 1;
   1.315 -			break;
   1.316 -
   1.317 -		case RAZOR_PACKAGE_INSTALL_CONFLICT:
   1.318 -			printf ("Cannot install %s", p->req_package);
   1.319 -			errors_only = 1;
   1.320 -			goto print_requirement;
   1.321 -
   1.322 -		case RAZOR_PACKAGE_INSTALL_UNSATISFIABLE:
   1.323 -			printf ("Cannot find package for %s", p->req_property);
   1.324 -			if (*p->req_version) {
   1.325 -				printf (" %s %s",
   1.326 -					razor_version_relations[p->req_relation],
   1.327 -					p->req_version);
   1.328 -			}
   1.329 -			printf (" which is required by %s\n",
   1.330 -				p->req_package);
   1.331 -			errors_only = 1;
   1.332 -			break;
   1.333 -
   1.334  		case RAZOR_PACKAGE_REMOVE:
   1.335  			if (errors_only)
   1.336  				break;
   1.337 -			printf ("Removing %s %s", p->name, p->version);
   1.338 -			if (p->req_package) {
   1.339 -				printf (" which %s %s",
   1.340 -					razor_property_types_removal[p->req_type],
   1.341 -					p->req_package);
   1.342 -				if (strcmp(p->req_property, p->name) != 0)
   1.343 -					printf (" for %s", p->req_property);
   1.344 +			printf("Removing %s %s", p->name, p->version);
   1.345 +			if (p->dep_package) {
   1.346 +				if (p->dep_type == RAZOR_PROPERTY_OBSOLETES) {
   1.347 +					printf(" which is obsoleted by %s",
   1.348 +					       p->dep_package);
   1.349 +				} else {
   1.350 +					printf(" which required %s",
   1.351 +					       p->dep_package);
   1.352 +					if (strcmp(p->dep_property, p->name) != 0)
   1.353 +						printf(" for %s", p->dep_property);
   1.354 +				}
   1.355  			}
   1.356  			printf("\n");
   1.357  			break;
   1.358  
   1.359 -		case RAZOR_PACKAGE_REMOVE_NOT_INSTALLED:
   1.360 -			printf ("Package %s is not installed\n", p->name);
   1.361 +		case RAZOR_PACKAGE_INSTALL_UNAVAILABLE:
   1.362 +			printf("Error: can't install %s: not found\n", p->name);
   1.363  			errors_only = 1;
   1.364  			break;
   1.365  
   1.366 -		case RAZOR_PACKAGE_REMOVE_BLOCKED:
   1.367 -			printf ("Cannot remove %s, which is marked for installation but requires %s\n", p->name, p->req_package);
   1.368 +		case RAZOR_PACKAGE_REMOVE_NOT_INSTALLED:
   1.369 +			printf("Error: can't remove %s: not installed\n", p->name);
   1.370  			errors_only = 1;
   1.371  			break;
   1.372  
   1.373 -		case RAZOR_PACKAGE_REMOVE_CONFLICT:
   1.374 -			printf ("Cannot remove %s, which is marked for installation but is obsoleted by %s\n", p->name, p->req_package);
   1.375 +		case RAZOR_PACKAGE_UP_TO_DATE:
   1.376 +			printf("Error: can't upgrade %s: no newer version is available", p->name);
   1.377 +			errors_only = 1;
   1.378 +			break;
   1.379 +
   1.380 +		case RAZOR_PACKAGE_CONTRADICTION:
   1.381 +			printf("Error: package %s is marked for both installation and removal", p->name);
   1.382 +			errors_only = 1;
   1.383 +			break;
   1.384 +
   1.385 +		case RAZOR_PACKAGE_OLD_CONFLICT:
   1.386 +			printf("Error: can't install %s, because installed package %s conflicts with ",
   1.387 +			       p->name, p->dep_package);
   1.388 +			if (*p->dep_version) {
   1.389 +				printf("%s %s %s",
   1.390 +				       p->dep_property,
   1.391 +				       razor_version_relations[p->dep_relation],
   1.392 +				       p->dep_version);
   1.393 +			} else
   1.394 +				printf("it");
   1.395 +			printf("\n");
   1.396 +
   1.397 +			errors_only = 1;
   1.398 +			break;
   1.399 +
   1.400 +		case RAZOR_PACKAGE_NEW_CONFLICT:
   1.401 +			printf("Error: can't install %s, because it conflicts with %s",
   1.402 +			       p->name, p->dep_package);
   1.403 +			if (*p->dep_version) {
   1.404 +				printf(" %s %s",
   1.405 +				       razor_version_relations[p->dep_relation],
   1.406 +				       p->dep_version);
   1.407 +			}
   1.408 +			printf("\n");
   1.409 +
   1.410 +			errors_only = 1;
   1.411 +			break;
   1.412 +
   1.413 +		case RAZOR_PACKAGE_UNSATISFIABLE:
   1.414 +			printf("Error: can't find package for %s", p->dep_property);
   1.415 +			if (*p->dep_version) {
   1.416 +				printf(" %s %s",
   1.417 +					razor_version_relations[p->dep_relation],
   1.418 +					p->dep_version);
   1.419 +			}
   1.420 +			printf(" which is required by %s\n",
   1.421 +				p->dep_package);
   1.422  			errors_only = 1;
   1.423  			break;
   1.424  
   1.425 @@ -2715,7 +2734,7 @@
   1.426  	array_init(&install_packages);
   1.427  	array_init(&remove_packages);
   1.428  	for (p = 0; p < trans->package_count; p++) {
   1.429 -		if (trans->packages[p].state & RAZOR_PACKAGE_INSTALL)
   1.430 +		if (trans->packages[p].state == RAZOR_PACKAGE_INSTALL)
   1.431  			pkg = array_add(&install_packages, sizeof *pkg);
   1.432  		else
   1.433  			pkg = array_add(&remove_packages, sizeof *pkg);
   1.434 @@ -2791,7 +2810,7 @@
   1.435  	int p;
   1.436  
   1.437  	for (p = 0; p < trans->package_count; p++) {
   1.438 -		if (!trans->packages[p].req_package &&
   1.439 +		if (!trans->packages[p].dep_package &&
   1.440  		    (trans->packages[p].state == RAZOR_PACKAGE_INSTALL_UNAVAILABLE ||
   1.441  		     trans->packages[p].state == RAZOR_PACKAGE_REMOVE_NOT_INSTALLED))
   1.442  			free((char *)trans->packages[p].name);