diff -r 4aac72ec4537 -r bd740859c4a0 src/main.c --- a/src/main.c Thu Oct 01 20:02:23 2009 +0100 +++ b/src/main.c Thu Nov 10 10:35:21 2011 +0000 @@ -1,7 +1,7 @@ /* * Copyright (C) 2008 Kristian Høgsberg * Copyright (C) 2008 Red Hat, Inc - * Copyright (C) 2009 J. Ali Harlow + * Copyright (C) 2009, 2011 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,8 +49,11 @@ #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) static int -update_packages(struct razor_transaction *trans, struct razor_set *system, - struct razor_set *next, struct razor_relocations *relocations); +update_packages(struct razor_transaction *trans, + struct razor_install_iterator *ii, struct razor_set *system, + struct razor_set *next, struct razor_atomic *atomic, + struct razor_relocations *relocations, + enum razor_stage_type stage); static struct razor_package_iterator * create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[]) @@ -113,6 +116,7 @@ command_list(int argc, const char *argv[]) { struct razor_package_iterator *pi; + struct razor_atomic *atomic; struct razor_set *set; uint32_t flags = 0; int i = 0; @@ -122,14 +126,19 @@ i++; } - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("List installed packages"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } pi = create_iterator_from_argv(set, argc - i, argv + i); list_packages(pi, flags); razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -175,13 +184,18 @@ list_properties(int argc, const char *argv[], uint32_t type) { struct razor_set *set; + struct razor_atomic *atomic; struct razor_package *package; struct razor_package_iterator *pi; const char *name, *version, *arch; - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("List package properties"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } pi = create_iterator_from_argv(set, argc, argv); while (razor_package_iterator_next(pi, &package, @@ -191,7 +205,8 @@ RAZOR_DETAIL_LAST)) list_package_properties(set, package, type); razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -224,13 +239,18 @@ command_list_scripts(int argc, const char *argv[]) { struct razor_set *set; + struct razor_atomic *atomic; 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) + atomic = razor_atomic_open("List package scripts"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } pi = create_iterator_from_argv(set, argc, argv); while (razor_package_iterator_next(pi, &package, @@ -253,7 +273,8 @@ } } razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -261,14 +282,20 @@ static int command_list_files(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set; - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("List package files"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } razor_set_list_files(set, argv[0]); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -276,18 +303,24 @@ static int command_list_file_packages(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set; struct razor_package_iterator *pi; - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("List file packages"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } pi = razor_package_iterator_create_for_file(set, argv[0]); list_packages(pi, 0); razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -295,14 +328,19 @@ static int command_list_package_files(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set; struct razor_package_iterator *pi; struct razor_package *package; const char *name, *version, *arch; - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("List package files"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } pi = create_iterator_from_argv(set, argc, argv); while (razor_package_iterator_next(pi, &package, @@ -313,7 +351,8 @@ razor_set_list_package_files(set, package); razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -323,6 +362,7 @@ const char *ref_version, uint32_t type) { + struct razor_atomic *atomic; struct razor_set *set; struct razor_property *property; struct razor_property_iterator *prop_iter; @@ -333,9 +373,13 @@ if (ref_name == NULL) return 0; - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("List package properties"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } prop_iter = razor_property_iterator_create(set, NULL); while (razor_property_iterator_next(prop_iter, &property, @@ -357,7 +401,8 @@ } razor_property_iterator_destroy(prop_iter); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -454,7 +499,9 @@ static int command_import_yum(int argc, const char *argv[]) { + int retval; struct razor_set *set; + struct razor_atomic *atomic; char buffer[512]; printf("downloading from %s.\n", yum_url); @@ -470,14 +517,17 @@ set = razor_set_create_from_yum(); if (set == NULL) return 1; - if (razor_set_write(set, rawhide_repo_filename, RAZOR_SECTION_ALL)) { - perror(rawhide_repo_filename); - return -1; - } - razor_set_destroy(set); - printf("wrote %s\n", rawhide_repo_filename); + atomic = razor_atomic_open("Yum import repository"); + razor_set_write(set, atomic, rawhide_repo_filename, RAZOR_SECTION_ALL); + retval = razor_atomic_commit(atomic); + razor_set_unref(set); + if (retval) + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + else + printf("wrote %s\n", rawhide_repo_filename); + razor_atomic_destroy(atomic); - return 0; + return retval; } #if HAVE_RPMLIB @@ -486,10 +536,17 @@ { struct razor_set *set; struct razor_root *root; + struct razor_atomic *atomic; + int retval; - root = razor_root_open(install_root); - if (root == NULL) + atomic = razor_atomic_open("Import RPM database"); + + root = razor_root_open(install_root, atomic); + if (root == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } set = razor_set_create_from_rpmdb(); if (set == NULL) @@ -497,7 +554,13 @@ razor_root_update(root, set); - return razor_root_commit(root); + retval = razor_root_commit(root); + if (retval) + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + + razor_atomic_destroy(atomic); + + return retval; } #endif @@ -553,45 +616,69 @@ struct razor_root *root; struct razor_set *system, *upstream, *next; struct razor_transaction *trans; - int i, errors; + struct razor_atomic *atomic; + struct razor_install_iterator *ii; + int i, retval; - root = razor_root_open(install_root); - system = razor_root_get_system_set(root); + atomic = razor_atomic_open("Remove packages"); + + root = razor_root_open(install_root, atomic); + system = razor_set_ref(razor_root_get_system_set(root)); if (system == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } upstream = razor_set_create_without_root(); trans = razor_transaction_create(system, upstream); + razor_set_unref(upstream); for (i = 0; i < argc; i++) { 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_set_unref(system); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } } razor_transaction_resolve(trans); - errors = razor_transaction_describe(trans); - if (errors) { + retval = razor_transaction_describe(trans); + if (retval) { razor_transaction_destroy(trans); - razor_set_destroy(upstream); + razor_set_unref(system); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } next = razor_transaction_commit(trans); - update_packages(trans, system, next, NULL); + ii = razor_set_create_install_iterator(system, next); + update_packages(trans, ii, system, next, atomic, NULL, + RAZOR_STAGE_SCRIPTS_PRE); + update_packages(trans, ii, system, next, atomic, NULL, + RAZOR_STAGE_FILES); + razor_root_update(root, next); + (void)razor_root_commit(root); + retval = razor_atomic_commit(atomic); + if (retval) + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + else + update_packages(trans, ii, system, next, atomic, NULL, + RAZOR_STAGE_SCRIPTS_POST); + razor_install_iterator_destroy(ii); + razor_transaction_destroy(trans); - razor_set_destroy(next); - razor_set_destroy(upstream); + razor_atomic_destroy(atomic); + razor_set_unref(system); + razor_set_unref(next); - return razor_root_commit(root); + return retval; } static void @@ -611,17 +698,23 @@ static int command_diff(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set, *updated; - set = razor_root_open_read_only(install_root); - updated = razor_set_open(rawhide_repo_filename); - if (set == NULL || updated == NULL) + atomic = razor_atomic_open("Show package differences"); + set = razor_root_open_read_only(install_root, atomic); + updated = razor_set_open(rawhide_repo_filename, atomic); + if (set == NULL || updated == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } razor_set_diff(set, updated, print_diff, NULL); - razor_set_destroy(set); - razor_set_destroy(updated); + razor_set_unref(set); + razor_set_unref(updated); + razor_atomic_destroy(atomic); return 0; } @@ -634,9 +727,11 @@ struct razor_importer *importer; struct razor_set *set; struct razor_rpm *rpm; + struct razor_atomic *atomic; int len, imported_count = 0; char filename[256]; const char *dirname = argv[0]; + int retval; if (dirname == NULL) { fprintf(stderr, "usage: razor import-rpms DIR\n"); @@ -654,15 +749,17 @@ while (de = readdir(dir), de != NULL) { len = strlen(de->d_name); if (len < 5 || strcmp(de->d_name + len - 4, ".rpm") != 0) - continue; + continue; snprintf(filename, sizeof filename, "%s/%s", dirname, de->d_name); - rpm = razor_rpm_open(filename); - if (rpm == NULL) { - fprintf(stderr, - "failed to open rpm \"%s\"\n", filename); + atomic = razor_atomic_open("Read RPM"); + rpm = razor_rpm_open(filename, atomic); + if (rpm == NULL) + fprintf(stderr, "%s\n", + razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); + if (rpm == NULL) continue; - } if (razor_importer_add_rpm(importer, rpm)) { fprintf(stderr, "couldn't import %s\n", filename); break; @@ -681,17 +778,22 @@ printf("\nsaving\n"); set = razor_importer_finish(importer); - razor_set_write(set, repo_filename, RAZOR_SECTION_ALL); - razor_set_destroy(set); - printf("wrote %s\n", repo_filename); + atomic = razor_atomic_open("Update system database"); + razor_set_write(set, atomic, repo_filename, RAZOR_SECTION_ALL); + razor_set_unref(set); + retval = razor_atomic_commit(atomic); + if (retval) + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + else + printf("wrote %s\n", repo_filename); + razor_atomic_destroy(atomic); - return 0; + return retval; } -static const char * +static char * rpm_filename(const char *name, const char *version, const char *arch) { - static char file[PATH_MAX]; const char *v; /* Skip epoch */ @@ -701,9 +803,7 @@ else v = version; - snprintf(file, sizeof file, "%s-%s.%s.rpm", name, v, arch); - - return file; + return razor_concat(name, "-", v, ".", arch, ".rpm", NULL); } static int @@ -713,7 +813,7 @@ struct razor_package *package; enum razor_install_action action; const char *name, *version, *arch; - char file[PATH_MAX], url[256]; + char *file, *url, *s; int errors = 0, count; ii = razor_set_create_install_iterator(system, next); @@ -727,13 +827,14 @@ RAZOR_DETAIL_ARCH, &arch, RAZOR_DETAIL_LAST); - snprintf(url, sizeof url, - "%s/Packages/%s", - yum_url, rpm_filename(name, version, arch)); - snprintf(file, sizeof file, - "rpms/%s", rpm_filename(name, version, arch)); + s = rpm_filename(name, version, arch); + url = razor_concat(yum_url, "/Packages/", s, NULL); + file = razor_concat("rpms/", s, NULL); + free(s); if (download_if_missing(url, file) < 0) errors++; + free(file); + free(url); } razor_install_iterator_destroy(ii); @@ -746,7 +847,8 @@ } static struct razor_set * -relocate_packages(struct razor_set *set, struct razor_relocations *relocations) +relocate_packages(struct razor_set *set, struct razor_atomic *atomic, + struct razor_relocations *relocations) { int i; struct razor_importer *importer; @@ -760,7 +862,7 @@ const char *preunprog, *preun, *postunprog, *postun; const char *install_prefix; const char *const *prefixes; - char file[PATH_MAX]; + char *file, *s; uint32_t flags; importer = razor_importer_create(); @@ -779,11 +881,12 @@ RAZOR_DETAIL_POSTUNPROG, &postunprog, RAZOR_DETAIL_POSTUN, &postun, RAZOR_DETAIL_LAST)) { - snprintf(file, sizeof file, - "rpms/%s", rpm_filename(name, version, arch)); - rpm = razor_rpm_open(file); + s = rpm_filename(name, version, arch); + file = razor_concat("rpms/", s, NULL); + free(s); + rpm = razor_rpm_open(file, atomic); + free(file); if (rpm == NULL) { - fprintf(stderr, "failed to open rpm %s\n", file); razor_package_iterator_destroy(pkg_iter); razor_importer_destroy(importer); return NULL; @@ -834,12 +937,13 @@ static int install_package(struct razor_transaction *trans, struct razor_set *set, - struct razor_package *package, - struct razor_relocations *relocations) + struct razor_atomic *atomic, struct razor_package *package, + struct razor_relocations *relocations, int install_count, + enum razor_stage_type stage) { int retval; const char *name, *version, *arch; - char file[PATH_MAX]; + char *file, *s; struct razor_rpm *rpm; razor_package_get_details(set, package, @@ -848,45 +952,57 @@ RAZOR_DETAIL_ARCH, &arch, RAZOR_DETAIL_LAST); - printf("install %s-%s\n", name, version); + if (stage & RAZOR_STAGE_SCRIPTS_PRE) + printf("install %s-%s\n", name, version); - snprintf(file, sizeof file, - "rpms/%s", rpm_filename(name, version, arch)); - rpm = razor_rpm_open(file); + s = rpm_filename(name, version, arch); + file = razor_concat("rpms/", s, NULL); + free(s); + rpm = razor_rpm_open(file, atomic); + free(file); if (rpm == NULL) { - fprintf(stderr, "failed to open rpm %s\n", file); + fprintf(stderr, "%s\n", + razor_atomic_get_error_msg(atomic)); return -1; } if (relocations) razor_rpm_set_relocations(rpm, relocations); razor_transaction_fixup_package(trans, package, rpm); - retval = razor_rpm_install(rpm, install_root, 1); - if (retval < 0) - fprintf(stderr, "failed to install rpm %s\n", file); + retval = razor_rpm_install(rpm, atomic, install_root, install_count, + stage); + if (retval < 0) { + s = rpm_filename(name, version, arch); + fprintf(stderr, "%s: %s\n", s, + razor_atomic_get_error_msg(atomic)); + free(s); + } razor_rpm_close(rpm); return retval; } static int -update_packages(struct razor_transaction *trans, struct razor_set *system, - struct razor_set *next, struct razor_relocations *relocations) +update_packages(struct razor_transaction *trans, + struct razor_install_iterator *ii, struct razor_set *system, + struct razor_set *next, struct razor_atomic *atomic, + struct razor_relocations *relocations, + enum razor_stage_type stage) { - struct razor_install_iterator *ii; struct razor_package *package; enum razor_install_action action; int retval = 0, count; - ii = razor_set_create_install_iterator(system, next); + razor_install_iterator_rewind(ii); + while (!retval && razor_install_iterator_next(ii, &package, &action, &count)) { if (action == RAZOR_INSTALL_ACTION_ADD) - retval = install_package(trans, next, package, - relocations); + retval = install_package(trans, next, atomic, package, + relocations, count, stage); else if (action == RAZOR_INSTALL_ACTION_REMOVE) - retval = razor_package_remove(system, next, package, - install_root, count); + retval = razor_package_remove(system, next, atomic, + package, install_root, + count, stage); } - razor_install_iterator_destroy(ii); return retval; } @@ -898,12 +1014,22 @@ struct razor_relocations *relocations=NULL; struct razor_set *system, *upstream, *next, *set; struct razor_transaction *trans; - int i, len, dependencies = 1; + struct razor_atomic *atomic; + struct razor_install_iterator *ii; + int i, retval, len, dependencies = 1; char *oldpath; - root = razor_root_open(install_root); - if (root == NULL) + if (do_update) + atomic = razor_atomic_open("Update packages"); + else + atomic = razor_atomic_open("Install packages"); + + root = razor_root_open(install_root, atomic); + if (root == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } for (i = 0; i < argc; i++) { if (strcmp(argv[i], "--no-dependencies") == 0) @@ -933,19 +1059,30 @@ break; } - system = razor_root_get_system_set(root); - upstream = razor_set_open(rawhide_repo_filename); + upstream = razor_set_open(rawhide_repo_filename, atomic); if (upstream == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } if (relocations) { - set = relocate_packages(upstream, relocations); - razor_set_destroy(upstream); + set = relocate_packages(upstream, atomic, relocations); + if (set == NULL) { + fprintf(stderr, "%s\n", + razor_atomic_get_error_msg(atomic)); + razor_root_close(root); + razor_atomic_destroy(atomic); + razor_set_unref(upstream); + return 1; + } + razor_set_unref(upstream); upstream = set; } + system = razor_set_ref(razor_root_get_system_set(root)); + trans = razor_transaction_create(system, upstream); if (i == argc && do_update) @@ -957,8 +1094,10 @@ if (mark_packages_for_update(trans, upstream, argv[i]) == 0) { fprintf(stderr, "no package matched %s\n", argv[i]); razor_transaction_destroy(trans); - razor_set_destroy(upstream); + razor_set_unref(upstream); + razor_set_unref(system); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } } @@ -967,41 +1106,67 @@ razor_transaction_resolve(trans); if (razor_transaction_describe(trans) > 0) { razor_transaction_destroy(trans); - razor_set_destroy(upstream); + razor_set_unref(upstream); + razor_set_unref(system); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } } - if (mkdir("rpms", 0777) && errno != EEXIST) { - fprintf(stderr, "failed to create rpms directory.\n"); + if (razor_atomic_create_dir(atomic, "rpms", + S_IRWXU | S_IRWXG | S_IRWXO)) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); razor_transaction_destroy(trans); - razor_set_destroy(upstream); + razor_set_unref(upstream); + razor_set_unref(system); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } next = razor_transaction_commit(trans); if (download_packages(system, next) < 0) { - razor_set_destroy(next); + razor_set_unref(next); razor_transaction_destroy(trans); - razor_set_destroy(upstream); + razor_set_unref(upstream); + razor_set_unref(system); razor_root_close(root); + razor_atomic_destroy(atomic); return 1; } - update_packages(trans, system, next, relocations); + ii = razor_set_create_install_iterator(system, next); + + update_packages(trans, ii, system, next, atomic, relocations, + RAZOR_STAGE_SCRIPTS_PRE); + update_packages(trans, ii, system, next, atomic, relocations, + RAZOR_STAGE_FILES); razor_root_update(root, next); + razor_set_unref(upstream); + + (void)razor_root_commit(root); + retval = razor_atomic_commit(atomic); + if (retval) + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + else + update_packages(trans, ii, system, next, atomic, relocations, + RAZOR_STAGE_SCRIPTS_POST); + razor_transaction_destroy(trans); if (relocations) razor_relocations_destroy(relocations); - razor_set_destroy(next); - razor_set_destroy(upstream); + razor_install_iterator_destroy(ii); - return razor_root_commit(root); + razor_atomic_destroy(atomic); + + razor_set_unref(next); + razor_set_unref(system); + + return retval; } static int @@ -1025,6 +1190,7 @@ static int command_download(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set; struct razor_package_iterator *pi; struct razor_package *package; @@ -1032,12 +1198,24 @@ char url[256], file[256]; int matches = 0; - if (mkdir("rpms", 0777) && errno != EEXIST) { - fprintf(stderr, "failed to create rpms directory.\n"); + atomic = razor_atomic_open("Download packages"); + + if (razor_atomic_create_dir(atomic, "rpms", + S_IRWXU | S_IRWXG | S_IRWXO)) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; } - set = razor_set_open(rawhide_repo_filename); + set = razor_set_open(rawhide_repo_filename, atomic); + + if (razor_atomic_commit(atomic)) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); + return 1; + } + razor_atomic_destroy(atomic); + pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, @@ -1056,7 +1234,7 @@ download_if_missing(url, file); } razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); if (matches == 0) fprintf(stderr, "no packages matched \"%s\"\n", pattern); @@ -1071,15 +1249,20 @@ static int command_info(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set; struct razor_package_iterator *pi; struct razor_package *package; const char *pattern = argv[0], *name, *version, *arch; const char *summary, *description, *url, *license; - set = razor_root_open_read_only(install_root); - if (set == NULL) + atomic = razor_atomic_open("Package info"); + set = razor_root_open_read_only(install_root, atomic); + if (set == NULL) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, @@ -1108,7 +1291,8 @@ printf ("\n"); } razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); + razor_atomic_destroy(atomic); return 0; } @@ -1118,6 +1302,7 @@ static int command_search(int argc, const char *argv[]) { + struct razor_atomic *atomic; struct razor_set *set; struct razor_package_iterator *pi; struct razor_package *package; @@ -1132,9 +1317,14 @@ snprintf(pattern, sizeof pattern, "*%s*", argv[0]); - set = razor_set_open(rawhide_repo_filename); - if (set == NULL) + atomic = razor_atomic_open("Search packages"); + set = razor_set_open(rawhide_repo_filename, atomic); + if (set == NULL || razor_atomic_commit(atomic)) { + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); return 1; + } + razor_atomic_destroy(atomic); pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, @@ -1153,7 +1343,7 @@ printf("%s-%s.%s: %s\n", name, version, arch, summary); } razor_package_iterator_destroy(pi); - razor_set_destroy(set); + razor_set_unref(set); return 0; }