1.1 --- a/razor.c Sun Sep 30 00:18:20 2007 -0400
1.2 +++ b/razor.c Fri Oct 05 16:26:27 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 +}