razor.c
changeset 38 88f3ec190a3f
parent 37 094daff9a8dc
child 39 5fe9c9286cd0
     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