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;