update to match latest DEPSOLVE.txt changes; find updates of obsoleted packages
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;