diff -r c75a2d5caae9 -r a3e288343fe7 src/main.c --- a/src/main.c Fri May 01 16:48:47 2009 +0100 +++ b/src/main.c Thu Jul 02 11:31:03 2009 +0100 @@ -50,8 +50,8 @@ #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); +update_packages(struct razor_transaction *trans, 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[]) @@ -222,6 +222,44 @@ } static int +command_list_scripts(int argc, const char *argv[]) +{ + struct razor_set *set; + struct razor_package *package; + struct razor_package_iterator *pi; + const char *preunprog, *preun, *postunprog, *postun; + + set = razor_root_open_read_only(install_root); + if (set == NULL) + return 1; + + pi = create_iterator_from_argv(set, argc, argv); + while (razor_package_iterator_next(pi, &package, + RAZOR_DETAIL_PREUNPROG, &preunprog, + RAZOR_DETAIL_PREUN, &preun, + RAZOR_DETAIL_POSTUNPROG, &postunprog, + RAZOR_DETAIL_POSTUN, &postun, + RAZOR_DETAIL_LAST)) { + if (preun && *preun) { + printf("preuninstall scriptlet"); + if (preunprog && *preunprog) + printf(" (using %s)",preunprog); + printf(":\n%s\n",preun); + } + if (postun && *postun) { + printf("postuninstall scriptlet"); + if (postunprog && *postunprog) + printf(" (using %s)",postunprog); + printf(":\n%s\n",postun); + } + } + razor_package_iterator_destroy(pi); + razor_set_destroy(set); + + return 0; +} + +static int command_list_files(int argc, const char *argv[]) { struct razor_set *set; @@ -542,6 +580,7 @@ for (i = 0; i < argc; i++) { if (mark_packages_for_update(trans, set, argv[i]) == 0) { fprintf(stderr, "no match for %s\n", argv[i]); + razor_transaction_destroy(trans); return 1; } } @@ -550,11 +589,13 @@ errors = razor_transaction_describe(trans); if (errors) { fprintf(stderr, "unresolved dependencies\n"); + razor_transaction_destroy(trans); return 1; } - set = razor_transaction_finish(trans); + set = razor_transaction_commit(trans); razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN); + razor_transaction_destroy(trans); razor_set_destroy(set); razor_set_destroy(upstream); printf("wrote system-updated.rzdb\n"); @@ -598,10 +639,11 @@ return 1; } - next = razor_transaction_finish(trans); - update_packages(system, next, NULL); + next = razor_transaction_commit(trans); + update_packages(trans, system, next, NULL); razor_root_update(root, next); + razor_transaction_destroy(trans); razor_set_destroy(next); razor_set_destroy(upstream); @@ -774,6 +816,7 @@ struct razor_property *property; struct razor_rpm *rpm; const char *name, *version, *arch, *summary, *desc, *url, *license; + const char *preunprog, *preun, *postunprog, *postun; char file[PATH_MAX]; uint32_t flags; @@ -788,6 +831,10 @@ RAZOR_DETAIL_DESCRIPTION, &desc, RAZOR_DETAIL_URL, &url, RAZOR_DETAIL_LICENSE, &license, + RAZOR_DETAIL_PREUNPROG, &preunprog, + RAZOR_DETAIL_PREUN, &preun, + RAZOR_DETAIL_POSTUNPROG, &postunprog, + RAZOR_DETAIL_POSTUN, &postun, RAZOR_DETAIL_LAST)) { snprintf(file, sizeof file, "rpms/%s", rpm_filename(name, version, arch)); @@ -820,6 +867,11 @@ } razor_file_iterator_destroy(file_iter); + razor_importer_add_script(importer, RAZOR_PROPERTY_PREUN, + preunprog, preun); + razor_importer_add_script(importer, RAZOR_PROPERTY_POSTUN, + postunprog, postun); + razor_importer_finish_package(importer); } @@ -828,7 +880,8 @@ } static int -install_package(struct razor_set *set, struct razor_package *package, +install_package(struct razor_transaction *trans, struct razor_set *set, + struct razor_package *package, struct razor_relocations *relocations) { int retval; @@ -853,6 +906,7 @@ } if (relocations) razor_rpm_set_relocations(rpm, relocations); + razor_transaction_fixup_package(trans, package, rpm); retval = razor_rpm_install(rpm, install_root); if (retval < 0) fprintf(stderr, "failed to install rpm %s\n", file); @@ -861,37 +915,8 @@ } 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) +update_packages(struct razor_transaction *trans, struct razor_set *system, + struct razor_set *next, struct razor_relocations *relocations) { struct razor_install_iterator *ii; struct razor_package *package; @@ -903,9 +928,11 @@ while (!retval && razor_install_iterator_next(ii, &set, &package, &action, &count)) { if (action == RAZOR_INSTALL_ACTION_ADD) - retval = install_package(set, package, relocations); + retval = install_package(trans, set, package, + relocations); else if (action == RAZOR_INSTALL_ACTION_REMOVE) - retval = remove_package(set, package); + retval = razor_package_remove(set, package, + install_root); } razor_install_iterator_destroy(ii); @@ -974,6 +1001,7 @@ for (; i < argc; i++) { if (mark_packages_for_update(trans, upstream, argv[i]) == 0) { fprintf(stderr, "no package matched %s\n", argv[i]); + razor_transaction_destroy(trans); razor_root_close(root); return 1; } @@ -982,28 +1010,32 @@ if (dependencies) { razor_transaction_resolve(trans); if (razor_transaction_describe(trans) > 0) { + razor_transaction_destroy(trans); razor_root_close(root); return 1; } } - next = razor_transaction_finish(trans); - - razor_root_update(root, next); + next = razor_transaction_commit(trans); if (mkdir("rpms", 0777) && errno != EEXIST) { fprintf(stderr, "failed to create rpms directory.\n"); + razor_transaction_destroy(trans); razor_root_close(root); return 1; } if (download_packages(system, next) < 0) { + razor_transaction_destroy(trans); razor_root_close(root); return 1; } - update_packages(system, next, relocations); + update_packages(trans, system, next, relocations); + razor_root_update(root, next); + + razor_transaction_destroy(trans); if (relocations) razor_relocations_destroy(relocations); razor_set_destroy(next); @@ -1167,6 +1199,7 @@ { "list-provides", "list all provides for the given package", command_list_provides }, { "list-obsoletes", "list all obsoletes for the given package", command_list_obsoletes }, { "list-conflicts", "list all conflicts for the given package", command_list_conflicts }, + { "list-scripts", "list all scripts for the given package", command_list_scripts }, { "list-files", "list files for package set", command_list_files }, { "list-file-packages", "list packages owning file", command_list_file_packages }, { "list-package-files", "list files in package", command_list_package_files },