Implement updating all packages.
1.1 --- a/razor.c Thu Sep 20 14:21:28 2007 -0400
1.2 +++ b/razor.c Thu Sep 20 14:53:03 2007 -0400
1.3 @@ -1090,6 +1090,46 @@
1.4 }
1.5 }
1.6
1.7 +static void
1.8 +find_packages(struct razor_set *set,
1.9 + int count, const char **packages, struct array *list)
1.10 +{
1.11 + struct razor_package *p;
1.12 + unsigned long *r;
1.13 + int i;
1.14 +
1.15 + /* FIXME: Sort the packages. */
1.16 + for (i = 0; i < count; i++) {
1.17 + p = razor_set_get_package(set, packages[i]);
1.18 + r = array_add(list, sizeof *r);
1.19 + *r = p - (struct razor_package *) set->packages.data;
1.20 + }
1.21 +}
1.22 +
1.23 +static void
1.24 +find_all_packages(struct razor_set *set,
1.25 + struct razor_set *upstream, struct array *list)
1.26 +{
1.27 + struct razor_package *p, *u, *pend, *uend;
1.28 + unsigned long *r;
1.29 + char *pool, *upool;
1.30 +
1.31 + pend = set->packages.data + set->packages.size;
1.32 + pool = set->string_pool.data;
1.33 + u = upstream->packages.data;
1.34 + uend = upstream->packages.data + upstream->packages.size;
1.35 + upool = upstream->string_pool.data;
1.36 +
1.37 + for (p = set->packages.data; p < pend; p++) {
1.38 + while (u < uend && strcmp(&pool[p->name], &upool[u->name]) > 0)
1.39 + u++;
1.40 + if (strcmp(&pool[p->name], &upool[u->name]) == 0) {
1.41 + r = array_add(list, sizeof *r);
1.42 + *r = u - (struct razor_package *) upstream->packages.data;
1.43 + }
1.44 + }
1.45 +}
1.46 +
1.47 struct razor_set *
1.48 razor_set_update(struct razor_set *set, struct razor_set *upstream,
1.49 int count, const char **packages)
1.50 @@ -1098,15 +1138,14 @@
1.51 struct razor_package *p, *upackages;
1.52 struct array list, unsatisfied;
1.53 char *pool;
1.54 - unsigned long *r, *u, *end;
1.55 - int i;
1.56 + unsigned long *u, *end;
1.57 + int total = 0;
1.58
1.59 array_init(&list);
1.60 - for (i = 0; i < count; i++) {
1.61 - p = razor_set_get_package(upstream, packages[i]);
1.62 - r = array_add(&list, sizeof *r);
1.63 - *r = p - (struct razor_package *) upstream->packages.data;
1.64 - }
1.65 + if (count > 0)
1.66 + find_packages(upstream, count, packages, &list);
1.67 + else
1.68 + find_all_packages(set, upstream, &list);
1.69
1.70 end = list.data + list.size;
1.71 upackages = upstream->packages.data;
1.72 @@ -1116,6 +1155,7 @@
1.73 printf("package %s-%s set to be updated\n",
1.74 &pool[p->name], &pool[p->version]);
1.75 }
1.76 + total += list.size / sizeof *u;
1.77
1.78 while (list.size > 0) {
1.79 printf(" -- satisfying new requires\n");
1.80 @@ -1139,10 +1179,13 @@
1.81 printf("package %s-%s set to be updated\n",
1.82 &pool[p->name], &pool[p->version]);
1.83 }
1.84 + total += list.size / sizeof *u;
1.85 }
1.86
1.87 array_release(&list);
1.88
1.89 + printf("total of %d packages set to be updated\n", total);
1.90 +
1.91 return set;
1.92 }
1.93