diff -r 5549419824b4 -r 4e261a14a6bd librazor/razor.c --- a/librazor/razor.c Wed Jul 08 22:14:16 2009 +0100 +++ b/librazor/razor.c Thu Aug 13 07:14:51 2009 +0100 @@ -469,7 +469,8 @@ /** * razor_package_remove: - * @set: a %razor_set + * @prev: The %razor_set before the current transaction + * @next: The %razor_set after the current transaction is applied * @package: a %razor_package * @root: the root into which the package is currently installed * @install_count: the value to pass to uninstall scripts @@ -477,8 +478,9 @@ * Removes an installed package. **/ RAZOR_EXPORT int -razor_package_remove(struct razor_set *set, struct razor_package *package, - const char *root, int install_count) +razor_package_remove(struct razor_set *prev, struct razor_set *next, + struct razor_package *package, const char *root, + int install_count) { struct razor_file_iterator *fi; struct razor_package_iterator *pi; @@ -491,16 +493,16 @@ const char *prefix; environment_init(&env); - link = list_first(&package->install_prefixes, &set->prefix_pool); + link = list_first(&package->install_prefixes, &prev->prefix_pool); for (i = 0; link; i++) { - prefix = (const char *)set->string_pool.data + link->data; + prefix = (const char *)prev->string_pool.data + link->data; sprintf(buffer, "RPM_INSTALL_PREFIX%d", i); environment_add_variable(&env, buffer, prefix); link = list_next(link); } environment_set(&env); - razor_package_get_details(set, package, + razor_package_get_details(prev, package, RAZOR_DETAIL_PREUNPROG, &program, RAZOR_DETAIL_PREUN, &script, RAZOR_DETAIL_LAST); @@ -508,15 +510,15 @@ retval = razor_run_script(root, RAZOR_PROPERTY_PREUN, program, script, install_count); - fi = razor_file_iterator_create(set, package, 1); + fi = razor_file_iterator_create(prev, package, 1); while (razor_file_iterator_next(fi, &name)) { - pi = razor_package_iterator_create_for_file(set, name); + pi = razor_package_iterator_create_for_file(next, name); count = 0; while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) count++; razor_package_iterator_destroy(pi); - if (count <= 1) { + if (count <= 0) { snprintf(buffer, sizeof buffer, "%s%s", root, name); if (razor_remove(buffer) && errno != ENOENT) { perror(name); @@ -527,7 +529,7 @@ razor_file_iterator_destroy(fi); - razor_package_get_details(set, package, + razor_package_get_details(prev, package, RAZOR_DETAIL_POSTUNPROG, &program, RAZOR_DETAIL_POSTUN, &script, RAZOR_DETAIL_LAST); @@ -878,29 +880,38 @@ RAZOR_EXPORT int razor_install_iterator_next(struct razor_install_iterator *ii, - struct razor_set **set, struct razor_package **package, enum razor_install_action *action, int *count) { struct install_action *a; + struct razor_package_iterator *pi; + struct razor_package *pkg; + const char *removing, *name; + if (deque_empty(ii->order)) return 0; a = (struct install_action *)ii->actions.data + deque_pop(ii->order); - switch (a->action) { - case RAZOR_INSTALL_ACTION_ADD: - *set = ii->next; - break; - case RAZOR_INSTALL_ACTION_REMOVE: - *set = ii->set; - break; - } - *package = a->package; *action = a->action; *count = 0; + if (a->action == RAZOR_INSTALL_ACTION_REMOVE) { + razor_package_get_details(ii->set, a->package, + RAZOR_DETAIL_NAME, &removing, + RAZOR_DETAIL_LAST); + + pi = razor_package_iterator_create(ii->next); + while (razor_package_iterator_next(pi, &pkg, + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_LAST)) { + if (!strcmp(name, removing)) + (*count)++; + } + razor_package_iterator_destroy(pi); + } + return 1; }