1.1 --- a/razor.c Mon Mar 10 14:12:31 2008 -0400
1.2 +++ b/razor.c Tue Mar 11 11:44:51 2008 -0400
1.3 @@ -1843,19 +1843,23 @@
1.4 static int
1.5 compare_transaction_packages(const void *one, const void *two)
1.6 {
1.7 - const struct razor_transaction_package *tp1 = one;
1.8 - const struct razor_transaction_package *tp2 = two;
1.9 -
1.10 - return strcmp(tp1->name, tp2->name);
1.11 + struct razor_transaction_package **tp1 = (void *)one;
1.12 + struct razor_transaction_package **tp2 = (void *)two;
1.13 +
1.14 + if (!(*tp1)->name)
1.15 + return 1;
1.16 + else if (!(*tp2)->name)
1.17 + return -1;
1.18 + else
1.19 + return strcmp((*tp1)->name, (*tp2)->name);
1.20 }
1.21
1.22 static void
1.23 -find_packages(struct razor_transaction_resolver *trans,
1.24 - int update_count, const char **update_packages,
1.25 - int remove_count, const char **remove_packages)
1.26 +resolve_new_packages(struct razor_transaction_resolver *trans,
1.27 + int start, int end)
1.28 {
1.29 struct razor_package *sp, *spkgs, *up, *upkgs, *send, *uend;
1.30 - struct razor_transaction_package *packages, *tp;
1.31 + struct razor_transaction_package **packages;
1.32 const char *spool, *upool;
1.33 int i;
1.34
1.35 @@ -1866,51 +1870,44 @@
1.36 uend = trans->upstream->packages.data + trans->upstream->packages.size;
1.37 upool = trans->upstream->string_pool.data;
1.38
1.39 - for (i = 0; i < update_count; i++) {
1.40 - tp = array_add(&trans->packages, sizeof *tp);
1.41 - memset(tp, 0, sizeof *tp);
1.42 - tp->name = update_packages[i];
1.43 - tp->state = RAZOR_PACKAGE_INSTALL;
1.44 - }
1.45 - for (i = 0; i < remove_count; i++) {
1.46 - tp = array_add(&trans->packages, sizeof *tp);
1.47 - memset(tp, 0, sizeof *tp);
1.48 - tp->name = remove_packages[i];
1.49 - tp->state = RAZOR_PACKAGE_REMOVE;
1.50 - }
1.51 - qsort(trans->packages.data, update_count + remove_count,
1.52 - sizeof *tp, compare_transaction_packages);
1.53 - packages = trans->packages.data;
1.54 + packages = calloc(end - start, sizeof *packages);
1.55 + for (i = start; i < end; i++)
1.56 + packages[i - start] = ((struct razor_transaction_package *)trans->packages.data) + i;
1.57 + qsort(packages, end - start, sizeof *packages,
1.58 + compare_transaction_packages);
1.59
1.60 sp = spkgs;
1.61 up = upkgs;
1.62 - for (i = 0; i < update_count + remove_count; i++) {
1.63 - while (sp < send && strcmp(&spool[sp->name], packages[i].name) < 0)
1.64 + for (i = 0; i < end - start; i++) {
1.65 + if (!packages[i]->name)
1.66 + continue;
1.67 + while (sp < send && strcmp(&spool[sp->name], packages[i]->name) < 0)
1.68 sp++;
1.69 - while (up < uend && strcmp(&upool[up->name], packages[i].name) < 0)
1.70 + while (up < uend && strcmp(&upool[up->name], packages[i]->name) < 0)
1.71 up++;
1.72
1.73 - if (packages[i].state == RAZOR_PACKAGE_REMOVE) {
1.74 - if (sp < send && strcmp(packages[i].name, &spool[sp->name]) == 0) {
1.75 - packages[i].old_package = sp;
1.76 - packages[i].name = &spool[sp->name];
1.77 - packages[i].old_version = &spool[sp->version];
1.78 + if (packages[i]->state == RAZOR_PACKAGE_REMOVE ||
1.79 + packages[i]->state == RAZOR_PACKAGE_OBSOLETED) {
1.80 + if (sp < send && strcmp(packages[i]->name, &spool[sp->name]) == 0) {
1.81 + packages[i]->old_package = sp;
1.82 + packages[i]->name = &spool[sp->name];
1.83 + packages[i]->old_version = &spool[sp->version];
1.84 bitarray_set(&trans->syspkgs, sp - spkgs, 0);
1.85 } else {
1.86 - packages[i].name = strdup(packages[i].name);
1.87 - packages[i].state = RAZOR_PACKAGE_REMOVE_NOT_INSTALLED;
1.88 + packages[i]->name = strdup(packages[i]->name);
1.89 + packages[i]->state = RAZOR_PACKAGE_REMOVE_NOT_INSTALLED;
1.90 trans->errors++;
1.91 }
1.92 } else {
1.93 - if (up < uend && strcmp(packages[i].name, &upool[up->name]) == 0) {
1.94 - packages[i].new_package = up;
1.95 - packages[i].name = &upool[up->name];
1.96 - packages[i].new_version = &upool[up->version];
1.97 - if (sp < send && strcmp(packages[i].name, &spool[sp->name]) == 0) {
1.98 - packages[i].old_package = sp;
1.99 - packages[i].old_version = &spool[sp->version];
1.100 + if (up < uend && strcmp(packages[i]->name, &upool[up->name]) == 0) {
1.101 + packages[i]->new_package = up;
1.102 + packages[i]->name = &upool[up->name];
1.103 + packages[i]->new_version = &upool[up->version];
1.104 + if (sp < send && strcmp(packages[i]->name, &spool[sp->name]) == 0) {
1.105 + packages[i]->old_package = sp;
1.106 + packages[i]->old_version = &spool[sp->version];
1.107 if (versioncmp(&spool[sp->version], &upool[up->version]) >= 0) {
1.108 - packages[i].state = RAZOR_PACKAGE_UP_TO_DATE;
1.109 + packages[i]->state = RAZOR_PACKAGE_UP_TO_DATE;
1.110 trans->errors++;
1.111 continue;
1.112 }
1.113 @@ -1918,8 +1915,8 @@
1.114 }
1.115 bitarray_set(&trans->uppkgs, up - upkgs, 1);
1.116 } else {
1.117 - packages[i].name = strdup(packages[i].name);
1.118 - packages[i].state = RAZOR_PACKAGE_INSTALL_UNAVAILABLE;
1.119 + packages[i]->name = strdup(packages[i]->name);
1.120 + packages[i]->state = RAZOR_PACKAGE_INSTALL_UNAVAILABLE;
1.121 trans->errors++;
1.122 }
1.123 }
1.124 @@ -2198,56 +2195,6 @@
1.125 return pkg;
1.126 }
1.127
1.128 -/* FIXME */
1.129 -static struct razor_package *
1.130 -find_upgrade_for_installed_conflict(struct razor_transaction_resolver *trans,
1.131 - struct razor_package *conflicting_pkg,
1.132 - struct razor_property *prop)
1.133 -{
1.134 - struct razor_package *upkgs, *up, *uend;
1.135 - struct razor_property *uprops;
1.136 - const char *spool, *upool;
1.137 - struct list *p;
1.138 -
1.139 - up = upkgs = trans->upstream->packages.data;
1.140 - uend = trans->upstream->packages.data + trans->upstream->packages.size;
1.141 - upool = trans->upstream->string_pool.data;
1.142 - uprops = trans->upstream->properties.data;
1.143 - spool = trans->system->string_pool.data;
1.144 -
1.145 - while (up < uend &&
1.146 - strcmp(&upool[up->name], &spool[conflicting_pkg->name]) < 0)
1.147 - up++;
1.148 - if (up == uend || strcmp(&upool[up->name], &spool[conflicting_pkg->name]) != 0)
1.149 - return NULL;
1.150 -
1.151 - for (p = list_first(&up->properties, &trans->upstream->property_pool); p; p = list_next(p)) {
1.152 - if (prop->type == RAZOR_PROPERTY_PROVIDES &&
1.153 - uprops[p->data].type == RAZOR_PROPERTY_CONFLICTS &&
1.154 - provider_satisfies_requirement(prop, upool, &uprops[p->data], upool))
1.155 - return NULL;
1.156 - else if (prop->type == RAZOR_PROPERTY_CONFLICTS &&
1.157 - uprops[p->data].type == RAZOR_PROPERTY_PROVIDES &&
1.158 - provider_satisfies_requirement(&uprops[p->data], upool, prop, upool))
1.159 - return NULL;
1.160 - }
1.161 - return up;
1.162 -}
1.163 -
1.164 -/* FIXME */
1.165 -static int
1.166 -prop_is_being_installed(struct razor_transaction_resolver *trans,
1.167 - struct razor_property *prop)
1.168 -{
1.169 - struct list *pkg;
1.170 -
1.171 - for (pkg = list_first(&prop->packages, &trans->upstream->package_pool); pkg; pkg = list_next(pkg)) {
1.172 - if (bitarray_get(&trans->uppkgs, pkg->data))
1.173 - return 1;
1.174 - }
1.175 - return 0;
1.176 -}
1.177 -
1.178 static struct razor_transaction_package *
1.179 find_transaction_package(struct razor_transaction_resolver *trans,
1.180 const char *name)
1.181 @@ -2264,6 +2211,52 @@
1.182 return NULL;
1.183 }
1.184
1.185 +/* FIXME? */
1.186 +static int
1.187 +prop_is_being_installed(struct razor_transaction_resolver *trans,
1.188 + struct razor_property *prop)
1.189 +{
1.190 + struct list *pkg;
1.191 +
1.192 + for (pkg = list_first(&prop->packages, &trans->upstream->package_pool); pkg; pkg = list_next(pkg)) {
1.193 + if (bitarray_get(&trans->uppkgs, pkg->data))
1.194 + return 1;
1.195 + }
1.196 + return 0;
1.197 +}
1.198 +
1.199 +static int
1.200 +prop_is_being_removed(struct razor_transaction_resolver *trans,
1.201 + struct razor_property *prop)
1.202 +{
1.203 + struct list *pkg;
1.204 +
1.205 + for (pkg = list_first(&prop->packages, &trans->system->package_pool); pkg; pkg = list_next(pkg)) {
1.206 + if (bitarray_get(&trans->syspkgs, pkg->data))
1.207 + return 0;
1.208 + }
1.209 + return 1;
1.210 +}
1.211 +
1.212 +static int
1.213 +prop_is_being_updated(struct razor_transaction_resolver *trans,
1.214 + struct razor_property *prop)
1.215 +{
1.216 + struct razor_package *packages = trans->system->packages.data;
1.217 + const char *pool = trans->system->string_pool.data;
1.218 + struct razor_transaction_package *tp;
1.219 + struct list *pkg;
1.220 +
1.221 + /* Assumes prop_is_being_removed returns true */
1.222 +
1.223 + for (pkg = list_first(&prop->packages, &trans->system->package_pool); pkg; pkg = list_next(pkg)) {
1.224 + tp = find_transaction_package(trans, &pool[packages[pkg->data].name]);
1.225 + if (tp && tp->state == RAZOR_PACKAGE_REMOVE)
1.226 + return 0;
1.227 + }
1.228 + return 1;
1.229 +}
1.230 +
1.231 static void
1.232 add_transaction_package(struct razor_transaction_resolver *trans,
1.233 struct razor_package *new_package,
1.234 @@ -2273,27 +2266,21 @@
1.235 struct razor_property *req_prop)
1.236 {
1.237 struct razor_set *new_package_set, *old_package_set, *req_set;
1.238 - struct bitarray *newpkgbits, *oldpkgbits, *reqpkgbits;
1.239 + struct bitarray *reqpkgbits;
1.240 struct razor_transaction_package *tp, *already;
1.241 const char *pool;
1.242 struct razor_package *pkgs;
1.243 struct list *pkg;
1.244 int contradiction = 0;
1.245
1.246 - if (package_in_set(new_package, trans->system)) {
1.247 + if (package_in_set(new_package, trans->system))
1.248 new_package_set = trans->system;
1.249 - newpkgbits = &trans->syspkgs;
1.250 - } else {
1.251 + else
1.252 new_package_set = trans->upstream;
1.253 - newpkgbits = &trans->uppkgs;
1.254 - }
1.255 - if (package_in_set(old_package, trans->system)) {
1.256 + if (package_in_set(old_package, trans->system))
1.257 old_package_set = trans->system;
1.258 - oldpkgbits = &trans->syspkgs;
1.259 - } else {
1.260 + else
1.261 old_package_set = trans->upstream;
1.262 - oldpkgbits = &trans->uppkgs;
1.263 - }
1.264 if (property_in_set(req_prop, trans->system)) {
1.265 req_set = trans->system;
1.266 reqpkgbits = &trans->syspkgs;
1.267 @@ -2339,7 +2326,6 @@
1.268 tp->new_version = &pool[new_package->version];
1.269
1.270 pkgs = new_package_set->packages.data;
1.271 - bitarray_set(newpkgbits, new_package - pkgs, 1);
1.272 }
1.273 if (old_package) {
1.274 pool = old_package_set->string_pool.data;
1.275 @@ -2348,7 +2334,6 @@
1.276 tp->old_version = &pool[old_package->version];
1.277
1.278 pkgs = old_package_set->packages.data;
1.279 - bitarray_set(oldpkgbits, old_package - pkgs, 0);
1.280 }
1.281
1.282 tp->state = state;
1.283 @@ -2389,37 +2374,15 @@
1.284 tp->dep_version = &pool[req_prop->version];
1.285 }
1.286
1.287 -/* FIXME: make this more efficient */
1.288 -static struct razor_package *
1.289 -find_old_version(struct razor_transaction_resolver *trans,
1.290 - struct razor_package *pkg)
1.291 +static void
1.292 +razor_transaction_satisfy(struct razor_transaction_resolver *trans)
1.293 {
1.294 - struct razor_package *spkgs, *sp, *send;
1.295 - const char *spool, *upool;
1.296 -
1.297 - if (!package_in_set(pkg, trans->upstream))
1.298 - return NULL;
1.299 -
1.300 - sp = spkgs = trans->system->packages.data;
1.301 - send = trans->system->packages.data + trans->system->packages.size;
1.302 - spool = trans->system->string_pool.data;
1.303 - upool = trans->upstream->string_pool.data;
1.304 -
1.305 - while (sp < send &&
1.306 - strcmp(&spool[sp->name], &upool[pkg->name]) < 0)
1.307 - sp++;
1.308 - if (sp < send && strcmp(&spool[sp->name], &upool[pkg->name]) == 0)
1.309 - return sp;
1.310 - return NULL;
1.311 -}
1.312 -
1.313 -static void
1.314 -razor_transaction_satisfy_installs(struct razor_transaction_resolver *trans)
1.315 -{
1.316 - struct razor_package *spkgs, *upkgs, *pkg, *upgrade;
1.317 + struct razor_package *spkgs, *upkgs, *pkg;
1.318 struct razor_property *sp, *sprops, *sprop_end;
1.319 struct razor_property *up, *uprops, *uprop_end;
1.320 - const char *spool, *upool;
1.321 + struct razor_property *sr, *ur, *first_up;
1.322 + const char *spool, *upool, *removed_package;
1.323 + struct list *reqpkg;
1.324
1.325 spkgs = trans->system->packages.data;
1.326 sprops = trans->system->properties.data;
1.327 @@ -2431,8 +2394,7 @@
1.328 upool = trans->upstream->string_pool.data;
1.329
1.330 sp = sprops;
1.331 - up = uprops;
1.332 - while (up < uprop_end) {
1.333 + for (up = uprops; up < uprop_end; up++) {
1.334 /* Skip 'up' ahead to a property of a package which is
1.335 * to-be-installed.
1.336 */
1.337 @@ -2460,7 +2422,7 @@
1.338 pkg = find_uninstalled_package_for_property(trans, sp, up, up);
1.339 if (!pkg)
1.340 pkg = find_uninstalled_package_for_file(trans, &upool[up->name]);
1.341 - add_transaction_package(trans, pkg, find_old_version(trans, pkg),
1.342 + add_transaction_package(trans, pkg, NULL,
1.343 RAZOR_PACKAGE_INSTALL,
1.344 NULL, up);
1.345 break;
1.346 @@ -2477,18 +2439,14 @@
1.347 /* pkg CONFLICTS with what 'up' PROVIDES. Try
1.348 * finding an upgrade
1.349 */
1.350 - upgrade = find_upgrade_for_installed_conflict(trans, pkg, up);
1.351 - if (upgrade) {
1.352 - add_transaction_package(trans, upgrade, pkg,
1.353 - RAZOR_PACKAGE_INSTALL,
1.354 - &spool[pkg->name], sp);
1.355 - }
1.356 - break;
1.357 + add_transaction_package(trans, NULL, pkg,
1.358 + RAZOR_PACKAGE_FORCED_UPDATE,
1.359 + &spool[pkg->name], sp);
1.360 + } else {
1.361 + add_transaction_package(trans, NULL, pkg,
1.362 + RAZOR_PACKAGE_CONTRADICTION,
1.363 + NULL, up);
1.364 }
1.365 -
1.366 - add_transaction_package(trans, NULL, pkg,
1.367 - RAZOR_PACKAGE_OLD_CONFLICT,
1.368 - NULL, up);
1.369 break;
1.370
1.371 case RAZOR_PROPERTY_CONFLICTS:
1.372 @@ -2500,18 +2458,14 @@
1.373 /* Conflicts with something already installed.
1.374 * Try to upgrade out.
1.375 */
1.376 - upgrade = find_upgrade_for_installed_conflict(trans, pkg, up);
1.377 - if (upgrade) {
1.378 - add_transaction_package(trans, upgrade, pkg,
1.379 - RAZOR_PACKAGE_INSTALL,
1.380 - NULL, up);
1.381 - break;
1.382 - }
1.383 + add_transaction_package(trans, NULL, pkg,
1.384 + RAZOR_PACKAGE_FORCED_UPDATE,
1.385 + NULL, up);
1.386 + } else {
1.387 + add_transaction_package(trans, pkg, NULL,
1.388 + RAZOR_PACKAGE_CONTRADICTION,
1.389 + NULL, up);
1.390 }
1.391 -
1.392 - add_transaction_package(trans, pkg, NULL,
1.393 - RAZOR_PACKAGE_NEW_CONFLICT,
1.394 - NULL, up);
1.395 break;
1.396
1.397 case RAZOR_PROPERTY_OBSOLETES:
1.398 @@ -2530,259 +2484,7 @@
1.399 /* can't happen */
1.400 break;
1.401 }
1.402 - up++;
1.403 }
1.404 -}
1.405 -
1.406 -#if 0
1.407 -/* Look through pkg's PROVIDES, and for each one that no other package
1.408 - * provides, add its property index to lost_provides.
1.409 - */
1.410 -static void
1.411 -gather_lost_provides(struct razor_set *set, struct razor_package *pkg,
1.412 - struct array *lost_provides)
1.413 -{
1.414 - struct razor_property *props = set->properties.data, *prop;
1.415 - struct list *p, *providers;
1.416 - uint32_t *lost;
1.417 -
1.418 - for (p = list_first(&pkg->properties, &set->property_pool); p; p = list_next(p)) {
1.419 - prop = &props[p->data];
1.420 - if (prop->type != RAZOR_PROPERTY_PROVIDES)
1.421 - continue;
1.422 -
1.423 - providers = list_first(&prop->packages, &set->package_pool);
1.424 - if (providers && !list_next(providers)) {
1.425 - lost = array_add(lost_provides, sizeof *lost);
1.426 - *lost = p->data;
1.427 - }
1.428 - }
1.429 -}
1.430 -
1.431 -static void
1.432 -gather_lost_files(struct razor_set *set, struct razor_package *pkg,
1.433 - struct array *lost_files)
1.434 -{
1.435 - struct razor_entry *entries = set->files.data, *entry, **lost;
1.436 - struct list *e, *providers;
1.437 -
1.438 - for (e = list_first(&pkg->files, &set->file_pool); e; e = list_next(e)) {
1.439 - entry = &entries[e->data];
1.440 - providers = list_first(&entry->packages, &set->package_pool);
1.441 - if (providers && !list_next(providers)) {
1.442 - lost = array_add(lost_files, sizeof *lost);
1.443 - *lost = entry;
1.444 - }
1.445 - }
1.446 -}
1.447 -
1.448 -static void
1.449 -lose_required_package(struct razor_transaction_resolver *trans,
1.450 - struct razor_property *req,
1.451 - struct list_head *lost_package_list)
1.452 -{
1.453 - struct razor_package *pkgs, *lost_package;
1.454 - char *pool = trans->system->string_pool.data;
1.455 - struct list *p;
1.456 -
1.457 - pkgs = trans->system->packages.data;
1.458 - lost_package = &pkgs[list_first(lost_package_list, &trans->system->package_pool)->data];
1.459 -
1.460 - for (p = list_first(&req->packages, &trans->system->package_pool); p; p = list_next(p)) {
1.461 - add_transaction_package(trans, NULL, &pkgs[p->data],
1.462 - RAZOR_PACKAGE_REMOVE,
1.463 - &pool[lost_package->name], req);
1.464 - }
1.465 -}
1.466 -
1.467 -static void
1.468 -lose_requirement(struct razor_transaction_resolver *trans,
1.469 - struct razor_property *req,
1.470 - struct razor_property *lost_provider,
1.471 - struct razor_property *first_provider)
1.472 -{
1.473 - struct razor_property *provider, *prop_end;
1.474 - char *pool = trans->system->string_pool.data;
1.475 -
1.476 - prop_end = trans->system->properties.data + trans->system->properties.size;
1.477 -
1.478 - /* See if any other provider satisfies req */
1.479 - for (provider = first_provider;
1.480 - provider < prop_end && provider->type == RAZOR_PROPERTY_PROVIDES && provider->name == lost_provider->name;
1.481 - provider++) {
1.482 - if (provider == lost_provider)
1.483 - continue;
1.484 -
1.485 - if (provider_satisfies_requirement(provider, pool, req, pool))
1.486 - return;
1.487 - }
1.488 -
1.489 - lose_required_package(trans, req, &lost_provider->packages);
1.490 -}
1.491 -
1.492 -static void
1.493 -razor_transaction_satisfy_removes(struct razor_transaction_resolver *trans,
1.494 - int start, int end)
1.495 -{
1.496 - struct razor_transaction_package *packages;
1.497 - struct razor_package *pkgs;
1.498 - int pkg_count, r;
1.499 - uint32_t *lost, *lost_end;
1.500 - struct razor_entry *entry, **lostf, **lostf_end;
1.501 - struct razor_property *props, *prop_end, *req, *first_provider;
1.502 - struct array lost_provides, lost_files;
1.503 - char *pool;
1.504 -
1.505 - pkgs = trans->system->packages.data;
1.506 - pkg_count = trans->system->packages.size / sizeof (struct razor_package);
1.507 - props = trans->system->properties.data;
1.508 - prop_end = trans->system->properties.data + trans->system->properties.size;
1.509 - pool = trans->system->string_pool.data;
1.510 - packages = trans->packages.data;
1.511 -
1.512 - array_init(&lost_files);
1.513 - array_init(&lost_provides);
1.514 - for (r = start; r < end; r++) {
1.515 - if (!packages[r].old_package ||
1.516 - (packages[r].state != RAZOR_PACKAGE_REMOVE &&
1.517 - packages[r].state != RAZOR_PACKAGE_INSTALL &&
1.518 - packages[r].state != RAZOR_PACKAGE_FORCED_UPDATE &&
1.519 - packages[r].state != RAZOR_PACKAGE_OBSOLETED)
1.520 - continue;
1.521 -
1.522 - gather_lost_provides(trans->system, packages[r].old_package,
1.523 - &lost_provides);
1.524 - gather_lost_files(trans->system, packages[r].old_package,
1.525 - &lost_files);
1.526 - }
1.527 -
1.528 - /* Handle lost_provides */
1.529 - lost_end = lost_provides.data + lost_provides.size;
1.530 - for (lost = lost_provides.data; lost < lost_end; lost++) {
1.531 - /* Requires FOO will appear before Provides FOO */
1.532 - for (req = &props[*lost]; req > props && req->name == props[*lost].name && req->type != RAZOR_PROPERTY_REQUIRES; req--)
1.533 - ;
1.534 - first_provider = req + 1;
1.535 -
1.536 - while (req > props && req->name == props[*lost].name) {
1.537 - lose_requirement(trans, req, &props[*lost],
1.538 - first_provider);
1.539 - req--;
1.540 - }
1.541 - }
1.542 - array_release(&lost_provides);
1.543 -
1.544 - /* And now lost_files. FIXME, inefficient */
1.545 - lostf_end = lost_files.data + lost_files.size;
1.546 -
1.547 - req = props;
1.548 - /* Due to the sorting of props, this loop is likely a no-op */
1.549 - while (req < prop_end && pool[req->name] != '/')
1.550 - req++;
1.551 -
1.552 - for (; req < prop_end && pool[req->name] == '/'; req++) {
1.553 - if (req->type != RAZOR_PROPERTY_REQUIRES)
1.554 - continue;
1.555 -
1.556 - entry = find_entry(trans->system, trans->system->files.data,
1.557 - &pool[req->name]);
1.558 - if (!entry)
1.559 - continue;
1.560 -
1.561 - for (lostf = lost_files.data; lostf < lostf_end; lostf++) {
1.562 - if (*lostf == entry)
1.563 - break;
1.564 - }
1.565 - if (lostf == lostf_end)
1.566 - continue;
1.567 -
1.568 - lose_required_package(trans, req, &entry->packages);
1.569 - }
1.570 - array_release(&lost_files);
1.571 -}
1.572 -#endif
1.573 -
1.574 -static struct razor_package *
1.575 -find_upgrade_for_lost_requirement(struct razor_transaction_resolver *trans,
1.576 - struct razor_package *pkg,
1.577 - struct razor_property *req)
1.578 -{
1.579 - struct razor_package *upkgs, *up, *uend;
1.580 - struct razor_property *uprops;
1.581 - const char *spool, *upool;
1.582 - struct list *prop;
1.583 -
1.584 - up = upkgs = trans->upstream->packages.data;
1.585 - uend = trans->upstream->packages.data + trans->upstream->packages.size;
1.586 - upool = trans->upstream->string_pool.data;
1.587 - uprops = trans->upstream->properties.data;
1.588 - spool = trans->system->string_pool.data;
1.589 -
1.590 - while (up < uend &&
1.591 - strcmp(&upool[up->name], &spool[pkg->name]) < 0)
1.592 - up++;
1.593 - if (up == uend || strcmp(&upool[up->name], &spool[pkg->name]) != 0)
1.594 - return NULL;
1.595 -
1.596 - for (prop = list_first(&up->properties, &trans->system->property_pool); prop; prop = list_next(prop)) {
1.597 - if (uprops[prop->data].type == RAZOR_PROPERTY_REQUIRES &&
1.598 - strcmp(&upool[uprops[prop->data].name], &spool[req->name]) == 0 &&
1.599 - uprops[prop->data].relation == req->relation &&
1.600 - strcmp(&upool[uprops[prop->data].version], &spool[req->version]) == 0)
1.601 - return NULL;
1.602 - }
1.603 - return up;
1.604 -}
1.605 -
1.606 -static int
1.607 -prop_is_being_removed(struct razor_transaction_resolver *trans,
1.608 - struct razor_property *prop)
1.609 -{
1.610 - struct list *pkg;
1.611 -
1.612 - for (pkg = list_first(&prop->packages, &trans->system->package_pool); pkg; pkg = list_next(pkg)) {
1.613 - if (bitarray_get(&trans->syspkgs, pkg->data))
1.614 - return 0;
1.615 - }
1.616 - return 1;
1.617 -}
1.618 -
1.619 -static int
1.620 -prop_is_being_updated(struct razor_transaction_resolver *trans,
1.621 - struct razor_property *prop)
1.622 -{
1.623 - struct razor_package *packages = trans->system->packages.data;
1.624 - const char *pool = trans->system->string_pool.data;
1.625 - struct razor_transaction_package *tp;
1.626 - struct list *pkg;
1.627 -
1.628 - /* Assumes prop_is_being_removed returns true */
1.629 -
1.630 - for (pkg = list_first(&prop->packages, &trans->system->package_pool); pkg; pkg = list_next(pkg)) {
1.631 - tp = find_transaction_package(trans, &pool[packages[pkg->data].name]);
1.632 - if (tp && tp->state == RAZOR_PACKAGE_REMOVE)
1.633 - return 0;
1.634 - }
1.635 - return 1;
1.636 -}
1.637 -
1.638 -static void
1.639 -razor_transaction_satisfy_removes(struct razor_transaction_resolver *trans)
1.640 -{
1.641 - struct razor_package *spkgs, *upkgs, *pkg, *upgrade;
1.642 - struct razor_property *sp, *sprops, *sprop_end, *sr;
1.643 - struct razor_property *up, *uprops, *uprop_end, *ur, *first_up;
1.644 - const char *spool, *upool, *removed_package;
1.645 - struct list *reqpkg;
1.646 -
1.647 - spkgs = trans->system->packages.data;
1.648 - sprops = trans->system->properties.data;
1.649 - sprop_end = trans->system->properties.data + trans->system->properties.size;
1.650 - spool = trans->system->string_pool.data;
1.651 - upkgs = trans->upstream->packages.data;
1.652 - uprops = trans->upstream->properties.data;
1.653 - uprop_end = trans->upstream->properties.data + trans->upstream->properties.size;
1.654 - upool = trans->upstream->string_pool.data;
1.655
1.656 up = uprops;
1.657 for (sp = sprops; sp < sprop_end; sp++) {
1.658 @@ -2844,17 +2546,9 @@
1.659 continue;
1.660 pkg = &spkgs[reqpkg->data];
1.661 if (prop_is_being_updated(trans, sp)) {
1.662 - upgrade = find_upgrade_for_lost_requirement(trans, pkg, sr);
1.663 - if (upgrade) {
1.664 - add_transaction_package(trans, upgrade, pkg,
1.665 - RAZOR_PACKAGE_FORCED_UPDATE,
1.666 - removed_package, NULL);
1.667 - } else {
1.668 - /* This will cause a CONTRADICTION */
1.669 - add_transaction_package(trans, pkg, NULL,
1.670 - RAZOR_PACKAGE_INSTALL,
1.671 - removed_package, sr);
1.672 - }
1.673 + add_transaction_package(trans, NULL, pkg,
1.674 + RAZOR_PACKAGE_FORCED_UPDATE,
1.675 + removed_package, NULL);
1.676 } else {
1.677 add_transaction_package(trans, NULL, pkg,
1.678 RAZOR_PACKAGE_REMOVE,
1.679 @@ -2872,7 +2566,8 @@
1.680 {
1.681 struct razor_transaction_resolver trans;
1.682 struct razor_transaction *ret_trans;
1.683 - int start, end;
1.684 + struct razor_transaction_package *tp;
1.685 + int start, end, i;
1.686
1.687 trans.system = system;
1.688 trans.upstream = upstream ? upstream : razor_set_create();
1.689 @@ -2882,18 +2577,30 @@
1.690 trans.errors = 0;
1.691
1.692 if (update_count > 0 || remove_count > 0) {
1.693 - find_packages(&trans,
1.694 - update_count, update_packages,
1.695 - remove_count, remove_packages);
1.696 + for (i = 0; i < update_count; i++) {
1.697 + tp = array_add(&trans.packages, sizeof *tp);
1.698 + memset(tp, 0, sizeof *tp);
1.699 + tp->name = update_packages[i];
1.700 + tp->state = RAZOR_PACKAGE_INSTALL;
1.701 + }
1.702 + for (i = 0; i < remove_count; i++) {
1.703 + tp = array_add(&trans.packages, sizeof *tp);
1.704 + memset(tp, 0, sizeof *tp);
1.705 + tp->name = remove_packages[i];
1.706 + tp->state = RAZOR_PACKAGE_REMOVE;
1.707 + }
1.708 } else
1.709 find_all_packages(&trans);
1.710
1.711 start = 0;
1.712 end = trans.packages.size / sizeof (struct razor_transaction_package);
1.713
1.714 - while (!trans.errors && start != end) {
1.715 - razor_transaction_satisfy_installs(&trans);
1.716 - razor_transaction_satisfy_removes(&trans);
1.717 + while (start != end) {
1.718 + resolve_new_packages(&trans, start, end);
1.719 + if (trans.errors)
1.720 + break;
1.721 +
1.722 + razor_transaction_satisfy(&trans);
1.723
1.724 start = end;
1.725 end = trans.packages.size / sizeof (struct razor_transaction_package);
1.726 @@ -3079,7 +2786,7 @@
1.727 array_init(&install_packages);
1.728 array_init(&remove_packages);
1.729 for (p = 0; p < trans->package_count; p++) {
1.730 - if (trans->packages[p].state == RAZOR_PACKAGE_INSTALL) {
1.731 + if (trans->packages[p].new_package) {
1.732 pkg = array_add(&install_packages, sizeof *pkg);
1.733 *pkg = *trans->packages[p].new_package;
1.734 } else {