razor.c
changeset 45 6b5f03f1c084
parent 43 d37d57c99cac
child 46 8de578466ece
     1.1 --- a/razor.c	Sun Sep 30 00:18:20 2007 -0400
     1.2 +++ b/razor.c	Fri Oct 05 16:38:59 2007 -0400
     1.3 @@ -1385,3 +1385,48 @@
     1.4  	return set;
     1.5  }
     1.6  
     1.7 +/* The diff order matters.  We should sort the packages so that a
     1.8 + * REMOVE of a package comes before the INSTALL, and so that all
     1.9 + * requires for a package have been installed before the package.
    1.10 + **/
    1.11 +
    1.12 +void
    1.13 +razor_set_diff(struct razor_set *set, struct razor_set *upstream,
    1.14 +	       razor_package_callback_t callback, void *data)
    1.15 +{
    1.16 +	struct razor_package *p, *pend, *u, *uend;
    1.17 +	char *ppool, *upool;
    1.18 +	int res = 0;
    1.19 +
    1.20 +	p = set->packages.data;
    1.21 +	pend = set->packages.data + set->packages.size;
    1.22 +	ppool = set->string_pool.data;
    1.23 +
    1.24 +	u = upstream->packages.data;
    1.25 +	uend = upstream->packages.data + upstream->packages.size;
    1.26 +	upool = upstream->string_pool.data;
    1.27 +
    1.28 +	while (p < pend || u < uend) {
    1.29 +		if (p < pend && u < uend) {
    1.30 +			res = strcmp(&ppool[p->name], &upool[u->name]);
    1.31 +			if (res == 0)
    1.32 +				res = versioncmp(&ppool[p->version],
    1.33 +						 &upool[u->version]);
    1.34 +		}
    1.35 +
    1.36 +		if (u == uend || res < 0) {
    1.37 +			callback(&ppool[p->name], &ppool[p->version],
    1.38 +				 NULL, data);
    1.39 +			p++;
    1.40 +			continue;
    1.41 +		} else if (p == pend || res > 0) {
    1.42 +			callback(&upool[u->name], NULL, &upool[u->version],
    1.43 +				 data);
    1.44 +			u++;
    1.45 +			continue;
    1.46 +		} else {
    1.47 +			p++;
    1.48 +			u++;
    1.49 +		}
    1.50 +	}
    1.51 +}