1.1 --- a/razor.c Wed Sep 19 15:50:36 2007 -0400
1.2 +++ b/razor.c Wed Sep 19 17:19:11 2007 -0400
1.3 @@ -908,6 +908,100 @@
1.4 array_release(&unsatisfied);
1.5 }
1.6
1.7 +static void
1.8 +add_package(struct razor_importer *importer,
1.9 + struct razor_package *package, struct razor_set *set)
1.10 +{
1.11 + char *pool;
1.12 + unsigned long *r;
1.13 + struct razor_property *p, *properties;
1.14 +
1.15 + pool = set->string_pool.data;
1.16 + razor_importer_begin_package(importer,
1.17 + &pool[package->name],
1.18 + &pool[package->version]);
1.19 +
1.20 + r = (unsigned long *) set->property_pool.data + package->requires;
1.21 + properties = set->requires.data;
1.22 + while (~*r) {
1.23 + p = &properties[*r++];
1.24 + razor_importer_add_requires(importer,
1.25 + &pool[p->name], &pool[p->version]);
1.26 + }
1.27 +
1.28 + r = (unsigned long *) set->property_pool.data + package->provides;
1.29 + properties = set->provides.data;
1.30 + while (~*r) {
1.31 + p = &properties[*r++];
1.32 + razor_importer_add_provides(importer,
1.33 + &pool[p->name], &pool[p->version]);
1.34 + }
1.35 +
1.36 + razor_importer_finish_package(importer);
1.37 +}
1.38 +
1.39 +/* Add packages from 'upstream' to 'set'. The packages to add are
1.40 + * specified by the 'packages' array, which is a sorted list of
1.41 + * package indexes. Returns a newly allocated package set. Does not
1.42 + * enforce validity of the resulting package set. */
1.43 +
1.44 +struct razor_set *
1.45 +razor_set_add(struct razor_set *set, struct razor_set *upstream,
1.46 + struct array *packages)
1.47 +{
1.48 + struct razor_importer *importer;
1.49 + struct razor_package *upstream_packages, *p, *s, *send;
1.50 + char *spool, *upool;
1.51 + unsigned long *u, *uend;
1.52 + int cmp;
1.53 +
1.54 + importer = razor_importer_new();
1.55 + upstream_packages = upstream->packages.data;
1.56 + u = packages->data;
1.57 + uend = packages->data + packages->size;
1.58 + upool = upstream->string_pool.data;
1.59 + s = set->packages.data;
1.60 + send = set->packages.data + set->packages.size;
1.61 + spool = set->string_pool.data;
1.62 +
1.63 + while (s < send) {
1.64 + p = upstream_packages + *u;
1.65 + cmp = strcmp(&spool[s->name], &upool[p->name]);
1.66 + if (cmp < 0 || u == uend) {
1.67 + add_package(importer, s, set);
1.68 + s++;
1.69 + } else if (cmp == 0) {
1.70 + add_package(importer, p, upstream);
1.71 + s++;
1.72 + u++;
1.73 + } else {
1.74 + add_package(importer, p, upstream);
1.75 + u++;
1.76 + }
1.77 + }
1.78 +
1.79 + return razor_importer_finish(importer);
1.80 +}
1.81 +
1.82 +struct razor_set *
1.83 +razor_set_update(struct razor_set *set, struct razor_set *upstream,
1.84 + int count, const char **packages)
1.85 +{
1.86 + struct razor_package *p;
1.87 + struct array list;
1.88 + unsigned long *r;
1.89 + int i;
1.90 +
1.91 + array_init(&list);
1.92 + for (i = 0; i < count; i++) {
1.93 + p = razor_set_get_package(upstream, packages[i]);
1.94 + r = array_add(&list, sizeof *r);
1.95 + *r = p - (struct razor_package *) upstream->packages.data;
1.96 + }
1.97 +
1.98 + return razor_set_add(set, upstream, &list);
1.99 +}
1.100 +
1.101 void
1.102 razor_set_info(struct razor_set *set)
1.103 {
1.104 @@ -952,7 +1046,7 @@
1.105 int
1.106 main(int argc, const char *argv[])
1.107 {
1.108 - struct razor_set *set;
1.109 + struct razor_set *set, *upstream, *new;
1.110 struct stat statbuf;
1.111 char *repo;
1.112
1.113 @@ -1028,6 +1122,16 @@
1.114 return 1;
1.115 razor_set_list_unsatisfied(set);
1.116 razor_set_destroy(set);
1.117 + } else if (strcmp(argv[1], "update") == 0) {
1.118 + set = razor_set_open(repo_filename);
1.119 + upstream = razor_set_open(rawhide_repo_filename);
1.120 + if (set == NULL || upstream == NULL)
1.121 + return 1;
1.122 + new = razor_set_update(set, upstream, argc - 2, argv + 2);
1.123 + razor_set_write(new, "system-updated.repo");
1.124 + razor_set_destroy(new);
1.125 + razor_set_destroy(set);
1.126 + razor_set_destroy(upstream);
1.127 } else {
1.128 usage();
1.129 }