1.1 --- a/razor.c Mon Mar 03 16:05:33 2008 -0500
1.2 +++ b/razor.c Mon Mar 03 16:19:56 2008 -0500
1.3 @@ -1803,30 +1803,40 @@
1.4 return 0;
1.5 }
1.6
1.7 -static int
1.8 -find_system_file(struct razor_transaction_resolver *trans,
1.9 - int installed, int up)
1.10 +static struct razor_package *
1.11 +find_file(struct razor_set *set, struct bitarray *pkgbits,
1.12 + const char *filename, int installed)
1.13 {
1.14 + struct razor_package *pkgs = set->packages.data;
1.15 struct razor_entry *entry;
1.16 - struct razor_property *uprops = trans->upstream->properties.data;
1.17 - const char *upool = trans->upstream->string_pool.data;
1.18 - const char *filename = &upool[uprops[up].name];
1.19 struct list *p;
1.20
1.21 if (filename[0] != '/')
1.22 return 0;
1.23
1.24 - entry = find_entry(trans->system, trans->system->files.data, filename);
1.25 + entry = find_entry(set, set->files.data, filename);
1.26 if (!entry)
1.27 return 0;
1.28
1.29 - for (p = list_first(&entry->packages, &trans->system->package_pool);
1.30 - p;
1.31 - p = list_next(p)) {
1.32 - if (bitarray_get(&trans->syspkgs, p->data) == installed)
1.33 - return 1;
1.34 + for (p = list_first(&entry->packages, &set->package_pool); p; p = list_next(p)) {
1.35 + if (bitarray_get(pkgbits, p->data) == installed)
1.36 + return &pkgs[p->data];
1.37 }
1.38 - return 0;
1.39 + return NULL;
1.40 +}
1.41 +
1.42 +static struct razor_package *
1.43 +find_system_file(struct razor_transaction_resolver *trans,
1.44 + const char *filename, int installed)
1.45 +{
1.46 + return find_file(trans->system, &trans->syspkgs, filename, installed);
1.47 +}
1.48 +
1.49 +static struct razor_package *
1.50 +find_upstream_file(struct razor_transaction_resolver *trans,
1.51 + const char *filename, int installed)
1.52 +{
1.53 + return find_file(trans->upstream, &trans->uppkgs, filename, installed);
1.54 }
1.55
1.56 static struct razor_package *
1.57 @@ -1955,31 +1965,6 @@
1.58 return find_upstream_provider(trans, 0, 1, &req, up);
1.59 }
1.60
1.61 -static struct razor_package *
1.62 -find_upstream_file(struct razor_transaction_resolver *trans,
1.63 - int installed, int up)
1.64 -{
1.65 - struct razor_package *upkgs = trans->upstream->packages.data;
1.66 - struct razor_property *uprops = trans->upstream->properties.data;
1.67 - const char *upool = trans->upstream->string_pool.data;
1.68 - const char *filename = &upool[uprops[up].name];
1.69 - struct razor_entry *entry;
1.70 - struct list *pkg;
1.71 -
1.72 - if (filename[0] != '/')
1.73 - return NULL;
1.74 -
1.75 - entry = find_entry(trans->upstream, trans->upstream->files.data, filename);
1.76 - if (!entry)
1.77 - return NULL;
1.78 -
1.79 - for (pkg = list_first(&entry->packages, &trans->upstream->package_pool); pkg; pkg = list_next(pkg)) {
1.80 - if (bitarray_get(&trans->uppkgs, pkg->data) == installed)
1.81 - return &upkgs[pkg->data];
1.82 - }
1.83 - return NULL;
1.84 -}
1.85 -
1.86 static void
1.87 add_transaction_package(struct razor_transaction_resolver *trans,
1.88 struct razor_package *package,
1.89 @@ -2046,7 +2031,7 @@
1.90 razor_transaction_satisfy_installs(struct razor_transaction_resolver *trans)
1.91 {
1.92 struct razor_package *spkgs, *upkgs, *pkg;
1.93 - struct razor_property *sprops, *uprops;
1.94 + struct razor_property *prop, *sprops, *uprops;
1.95 int sp, up, ucount;
1.96 const char *upool;
1.97
1.98 @@ -2069,15 +2054,16 @@
1.99 if (up == ucount)
1.100 break;
1.101
1.102 - switch (uprops[up].type) {
1.103 + prop = &uprops[up];
1.104 + switch (prop->type) {
1.105 case RAZOR_PROPERTY_REQUIRES:
1.106 - if (!strncmp(&upool[uprops[up].name], "rpmlib(", 7))
1.107 + if (!strncmp(&upool[prop->name], "rpmlib(", 7))
1.108 break;
1.109
1.110 - if (find_system_provider(trans, 1, 0, &uprops[up], &sp) ||
1.111 - find_upstream_provider(trans, 1, 0, &uprops[up], up) ||
1.112 - find_system_file(trans, 1, up) ||
1.113 - find_upstream_file(trans, 1, up)) {
1.114 + if (find_system_provider(trans, 1, 0, prop, &sp) ||
1.115 + find_upstream_provider(trans, 1, 0, prop, up) ||
1.116 + find_system_file(trans, &upool[prop->name], 1) ||
1.117 + find_upstream_file(trans, &upool[prop->name], 1)) {
1.118 /* Requires something that is either installed
1.119 * or to-be-installed.
1.120 */
1.121 @@ -2085,56 +2071,56 @@
1.122 }
1.123
1.124 /* See if we can install a new upstream provider */
1.125 - pkg = find_upstream_provider(trans, 0, 0, &uprops[up], up);
1.126 + pkg = find_upstream_provider(trans, 0, 0, prop, up);
1.127 if (!pkg)
1.128 - pkg = find_upstream_file(trans, 0, up);
1.129 + pkg = find_upstream_file(trans, &upool[prop->name], 0);
1.130 add_transaction_package(trans, pkg, trans->upstream,
1.131 RAZOR_PACKAGE_INSTALL,
1.132 - &uprops[up], trans->upstream);
1.133 + prop, trans->upstream);
1.134 break;
1.135
1.136 case RAZOR_PROPERTY_CONFLICTS:
1.137 - if ((pkg = find_system_provider(trans, 1, 1, &uprops[up], &sp))) {
1.138 + if ((pkg = find_system_provider(trans, 1, 1, prop, &sp))) {
1.139 struct razor_package *upgrade;
1.140
1.141 /* Conflicts with something already installed.
1.142 * Try to upgrade out.
1.143 */
1.144 - upgrade = find_upgrade(trans, &uprops[up], up);
1.145 + upgrade = find_upgrade(trans, prop, up);
1.146 if (upgrade) {
1.147 bitarray_set(&trans->syspkgs, pkg - spkgs, 0);
1.148 add_transaction_package(trans, upgrade,
1.149 trans->upstream,
1.150 RAZOR_PACKAGE_INSTALL,
1.151 - &uprops[up], trans->upstream);
1.152 + prop, trans->upstream);
1.153 } else {
1.154 add_transaction_package(trans, pkg,
1.155 trans->system,
1.156 RAZOR_PACKAGE_INSTALL_CONFLICT,
1.157 - &uprops[up], trans->upstream);
1.158 + prop, trans->upstream);
1.159 }
1.160 - } else if ((pkg = find_upstream_provider(trans, 1, 1, &uprops[up], up))) {
1.161 + } else if ((pkg = find_upstream_provider(trans, 1, 1, prop, up))) {
1.162 /* Conflicts with something already to-be-installed */
1.163 add_transaction_package(trans, pkg,
1.164 trans->upstream,
1.165 RAZOR_PACKAGE_INSTALL_CONFLICT,
1.166 - &uprops[up], trans->upstream);
1.167 + prop, trans->upstream);
1.168 }
1.169 break;
1.170
1.171 case RAZOR_PROPERTY_OBSOLETES:
1.172 - if ((pkg = find_system_provider(trans, 1, 1, &uprops[up], &sp))) {
1.173 + if ((pkg = find_system_provider(trans, 1, 1, prop, &sp))) {
1.174 /* Obsoletes something installed */
1.175 add_transaction_package(trans, pkg,
1.176 trans->system,
1.177 RAZOR_PACKAGE_REMOVE,
1.178 - &uprops[up], trans->upstream);
1.179 - } else if ((pkg = find_upstream_provider(trans, 1, 1, &uprops[up], up))) {
1.180 + prop, trans->upstream);
1.181 + } else if ((pkg = find_upstream_provider(trans, 1, 1, prop, up))) {
1.182 /* Obsoletes something that was to-be-installed */
1.183 add_transaction_package(trans, pkg,
1.184 trans->upstream,
1.185 RAZOR_PACKAGE_REMOVE_CONFLICT,
1.186 - &uprops[up], trans->upstream);
1.187 + prop, trans->upstream);
1.188 }
1.189 break;
1.190