razor.c
changeset 33 d8cb523fca84
parent 32 1609eb5d93a1
child 34 45caae67088b
     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  	}