1.1 --- a/librazor/razor.c Wed Jul 08 22:14:16 2009 +0100
1.2 +++ b/librazor/razor.c Thu Aug 13 07:14:51 2009 +0100
1.3 @@ -469,7 +469,8 @@
1.4
1.5 /**
1.6 * razor_package_remove:
1.7 - * @set: a %razor_set
1.8 + * @prev: The %razor_set before the current transaction
1.9 + * @next: The %razor_set after the current transaction is applied
1.10 * @package: a %razor_package
1.11 * @root: the root into which the package is currently installed
1.12 * @install_count: the value to pass to uninstall scripts
1.13 @@ -477,8 +478,9 @@
1.14 * Removes an installed package.
1.15 **/
1.16 RAZOR_EXPORT int
1.17 -razor_package_remove(struct razor_set *set, struct razor_package *package,
1.18 - const char *root, int install_count)
1.19 +razor_package_remove(struct razor_set *prev, struct razor_set *next,
1.20 + struct razor_package *package, const char *root,
1.21 + int install_count)
1.22 {
1.23 struct razor_file_iterator *fi;
1.24 struct razor_package_iterator *pi;
1.25 @@ -491,16 +493,16 @@
1.26 const char *prefix;
1.27
1.28 environment_init(&env);
1.29 - link = list_first(&package->install_prefixes, &set->prefix_pool);
1.30 + link = list_first(&package->install_prefixes, &prev->prefix_pool);
1.31 for (i = 0; link; i++) {
1.32 - prefix = (const char *)set->string_pool.data + link->data;
1.33 + prefix = (const char *)prev->string_pool.data + link->data;
1.34 sprintf(buffer, "RPM_INSTALL_PREFIX%d", i);
1.35 environment_add_variable(&env, buffer, prefix);
1.36 link = list_next(link);
1.37 }
1.38 environment_set(&env);
1.39
1.40 - razor_package_get_details(set, package,
1.41 + razor_package_get_details(prev, package,
1.42 RAZOR_DETAIL_PREUNPROG, &program,
1.43 RAZOR_DETAIL_PREUN, &script,
1.44 RAZOR_DETAIL_LAST);
1.45 @@ -508,15 +510,15 @@
1.46 retval = razor_run_script(root, RAZOR_PROPERTY_PREUN, program, script,
1.47 install_count);
1.48
1.49 - fi = razor_file_iterator_create(set, package, 1);
1.50 + fi = razor_file_iterator_create(prev, package, 1);
1.51
1.52 while (razor_file_iterator_next(fi, &name)) {
1.53 - pi = razor_package_iterator_create_for_file(set, name);
1.54 + pi = razor_package_iterator_create_for_file(next, name);
1.55 count = 0;
1.56 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
1.57 count++;
1.58 razor_package_iterator_destroy(pi);
1.59 - if (count <= 1) {
1.60 + if (count <= 0) {
1.61 snprintf(buffer, sizeof buffer, "%s%s", root, name);
1.62 if (razor_remove(buffer) && errno != ENOENT) {
1.63 perror(name);
1.64 @@ -527,7 +529,7 @@
1.65
1.66 razor_file_iterator_destroy(fi);
1.67
1.68 - razor_package_get_details(set, package,
1.69 + razor_package_get_details(prev, package,
1.70 RAZOR_DETAIL_POSTUNPROG, &program,
1.71 RAZOR_DETAIL_POSTUN, &script,
1.72 RAZOR_DETAIL_LAST);
1.73 @@ -878,29 +880,38 @@
1.74
1.75 RAZOR_EXPORT int
1.76 razor_install_iterator_next(struct razor_install_iterator *ii,
1.77 - struct razor_set **set,
1.78 struct razor_package **package,
1.79 enum razor_install_action *action,
1.80 int *count)
1.81 {
1.82 struct install_action *a;
1.83 + struct razor_package_iterator *pi;
1.84 + struct razor_package *pkg;
1.85 + const char *removing, *name;
1.86 +
1.87 if (deque_empty(ii->order))
1.88 return 0;
1.89
1.90 a = (struct install_action *)ii->actions.data + deque_pop(ii->order);
1.91 - switch (a->action) {
1.92 - case RAZOR_INSTALL_ACTION_ADD:
1.93 - *set = ii->next;
1.94 - break;
1.95 - case RAZOR_INSTALL_ACTION_REMOVE:
1.96 - *set = ii->set;
1.97 - break;
1.98 - }
1.99 -
1.100 *package = a->package;
1.101 *action = a->action;
1.102 *count = 0;
1.103
1.104 + if (a->action == RAZOR_INSTALL_ACTION_REMOVE) {
1.105 + razor_package_get_details(ii->set, a->package,
1.106 + RAZOR_DETAIL_NAME, &removing,
1.107 + RAZOR_DETAIL_LAST);
1.108 +
1.109 + pi = razor_package_iterator_create(ii->next);
1.110 + while (razor_package_iterator_next(pi, &pkg,
1.111 + RAZOR_DETAIL_NAME, &name,
1.112 + RAZOR_DETAIL_LAST)) {
1.113 + if (!strcmp(name, removing))
1.114 + (*count)++;
1.115 + }
1.116 + razor_package_iterator_destroy(pi);
1.117 + }
1.118 +
1.119 return 1;
1.120 }
1.121