diff -r c9c90315ea24 -r 66ec30bde5e5 src/main.c --- a/src/main.c Wed Apr 22 15:09:17 2009 +0100 +++ b/src/main.c Sat May 09 21:30:22 2009 +0100 @@ -49,6 +49,10 @@ #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +static int +update_packages(struct razor_set *system, struct razor_set *next, + struct razor_relocations *relocations); + static struct razor_package_iterator * create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[]) { @@ -561,35 +565,47 @@ static int command_remove(int argc, const char *argv[]) { - struct razor_set *set, *upstream; + struct razor_root *root; + struct razor_set *system, *upstream, *next; struct razor_transaction *trans; int i, errors; - set = razor_root_open_read_only(install_root); - if (set == NULL) + root = razor_root_open(install_root); + system = razor_root_get_system_set(root); + if (system == NULL) { + razor_root_close(root); return 1; + } - upstream = razor_set_create(); - trans = razor_transaction_create(set, upstream); + upstream = razor_set_create_without_root(); + trans = razor_transaction_create(system, upstream); for (i = 0; i < argc; i++) { - if (mark_packages_for_removal(trans, set, argv[i]) == 0) { + if (mark_packages_for_removal(trans, system, argv[i]) == 0) { fprintf(stderr, "no match for %s\n", argv[i]); + razor_transaction_destroy(trans); + razor_set_destroy(upstream); + razor_root_close(root); return 1; } } razor_transaction_resolve(trans); errors = razor_transaction_describe(trans); - if (errors) + if (errors) { + razor_transaction_destroy(trans); + razor_set_destroy(upstream); + razor_root_close(root); return 1; + } - set = razor_transaction_finish(trans); - razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN); - razor_set_destroy(set); + next = razor_transaction_finish(trans); + update_packages(system, next, NULL); + razor_root_update(root, next); + + razor_set_destroy(next); razor_set_destroy(upstream); - printf("wrote system-updated.rzdb\n"); - return 0; + return razor_root_commit(root); } static void @@ -812,51 +828,88 @@ } static int -install_packages(struct razor_set *system, struct razor_set *next, - struct razor_relocations *relocations) +install_package(struct razor_set *set, struct razor_package *package, + struct razor_relocations *relocations) +{ + int retval; + const char *name, *version, *arch; + char file[PATH_MAX]; + struct razor_rpm *rpm; + + razor_package_get_details(set, package, + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, + RAZOR_DETAIL_LAST); + + printf("install %s-%s\n", name, version); + + snprintf(file, sizeof file, + "rpms/%s", rpm_filename(name, version, arch)); + rpm = razor_rpm_open(file); + if (rpm == NULL) { + fprintf(stderr, "failed to open rpm %s\n", file); + return -1; + } + if (relocations) + razor_rpm_set_relocations(rpm, relocations); + retval = razor_rpm_install(rpm, install_root); + if (retval < 0) + fprintf(stderr, "failed to install rpm %s\n", file); + razor_rpm_close(rpm); + return retval; +} + +static int +remove_package(struct razor_set *set, struct razor_package *package) +{ + struct razor_file_iterator *fi; + struct razor_package_iterator *pi; + struct razor_package *p; + char buffer[PATH_MAX]; + const char *name; + int retval = 0, count; + + fi = razor_file_iterator_create(set, package); + + while (!retval && razor_file_iterator_next(fi, &name)) { + pi = razor_package_iterator_create_for_file(set, name); + count = 0; + while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) + count++; + razor_package_iterator_destroy(pi); + if (count <= 1) { + snprintf(buffer, sizeof buffer, "%s%s", install_root, + name); + retval = remove(buffer); + } + } + + razor_file_iterator_destroy(fi); + return retval; +} + +static int +update_packages(struct razor_set *system, struct razor_set *next, + struct razor_relocations *relocations) { struct razor_install_iterator *ii; struct razor_package *package; struct razor_set *set; enum razor_install_action action; - struct razor_rpm *rpm; - const char *name, *version, *arch; - char file[PATH_MAX]; - int count; + int retval = 0, count; ii = razor_set_create_install_iterator(system, next); - while (razor_install_iterator_next(ii, &set, &package, - &action, &count)) { - if (action == RAZOR_INSTALL_ACTION_REMOVE) - continue; - - razor_package_get_details(set, package, - RAZOR_DETAIL_NAME, &name, - RAZOR_DETAIL_VERSION, &version, - RAZOR_DETAIL_ARCH, &arch, - RAZOR_DETAIL_LAST); - - printf("install %s-%s\n", name, version); - - snprintf(file, sizeof file, - "rpms/%s", rpm_filename(name, version, arch)); - rpm = razor_rpm_open(file); - if (rpm == NULL) { - fprintf(stderr, "failed to open rpm %s\n", file); - return -1; - } - if (relocations) - razor_rpm_set_relocations(rpm, relocations); - if (razor_rpm_install(rpm, install_root) < 0) { - fprintf(stderr, - "failed to install rpm %s\n", file); - return -1; - } - razor_rpm_close(rpm); + while (!retval && razor_install_iterator_next(ii, &set, &package, + &action, &count)) { + if (action == RAZOR_INSTALL_ACTION_ADD) + retval = install_package(set, package, relocations); + else if (action == RAZOR_INSTALL_ACTION_REMOVE) + retval = remove_package(set, package); } razor_install_iterator_destroy(ii); - return 0; + return retval; } static int @@ -949,7 +1002,7 @@ return 1; } - install_packages(system, next, relocations); + update_packages(system, next, relocations); if (relocations) razor_relocations_destroy(relocations);