1.1 --- a/src/main.c Thu Oct 01 20:02:23 2009 +0100
1.2 +++ b/src/main.c Fri Jan 27 08:12:19 2012 +0000
1.3 @@ -1,7 +1,7 @@
1.4 /*
1.5 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
1.6 * Copyright (C) 2008 Red Hat, Inc
1.7 - * Copyright (C) 2009 J. Ali Harlow <ali@juiblex.co.uk>
1.8 + * Copyright (C) 2009, 2011 J. Ali Harlow <ali@juiblex.co.uk>
1.9 *
1.10 * This program is free software; you can redistribute it and/or modify
1.11 * it under the terms of the GNU General Public License as published by
1.12 @@ -49,8 +49,11 @@
1.13 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
1.14
1.15 static int
1.16 -update_packages(struct razor_transaction *trans, struct razor_set *system,
1.17 - struct razor_set *next, struct razor_relocations *relocations);
1.18 +update_packages(struct razor_transaction *trans,
1.19 + struct razor_install_iterator *ii, struct razor_set *system,
1.20 + struct razor_set *next, struct razor_atomic *atomic,
1.21 + struct razor_relocations *relocations,
1.22 + enum razor_stage_type stage);
1.23
1.24 static struct razor_package_iterator *
1.25 create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
1.26 @@ -113,6 +116,7 @@
1.27 command_list(int argc, const char *argv[])
1.28 {
1.29 struct razor_package_iterator *pi;
1.30 + struct razor_atomic *atomic;
1.31 struct razor_set *set;
1.32 uint32_t flags = 0;
1.33 int i = 0;
1.34 @@ -122,14 +126,19 @@
1.35 i++;
1.36 }
1.37
1.38 - set = razor_root_open_read_only(install_root);
1.39 - if (set == NULL)
1.40 + atomic = razor_atomic_open("List installed packages");
1.41 + set = razor_root_open_read_only(install_root, atomic);
1.42 + if (set == NULL) {
1.43 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.44 + razor_atomic_destroy(atomic);
1.45 return 1;
1.46 + }
1.47
1.48 pi = create_iterator_from_argv(set, argc - i, argv + i);
1.49 list_packages(pi, flags);
1.50 razor_package_iterator_destroy(pi);
1.51 - razor_set_destroy(set);
1.52 + razor_set_unref(set);
1.53 + razor_atomic_destroy(atomic);
1.54
1.55 return 0;
1.56 }
1.57 @@ -175,13 +184,18 @@
1.58 list_properties(int argc, const char *argv[], uint32_t type)
1.59 {
1.60 struct razor_set *set;
1.61 + struct razor_atomic *atomic;
1.62 struct razor_package *package;
1.63 struct razor_package_iterator *pi;
1.64 const char *name, *version, *arch;
1.65
1.66 - set = razor_root_open_read_only(install_root);
1.67 - if (set == NULL)
1.68 + atomic = razor_atomic_open("List package properties");
1.69 + set = razor_root_open_read_only(install_root, atomic);
1.70 + if (set == NULL) {
1.71 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.72 + razor_atomic_destroy(atomic);
1.73 return 1;
1.74 + }
1.75
1.76 pi = create_iterator_from_argv(set, argc, argv);
1.77 while (razor_package_iterator_next(pi, &package,
1.78 @@ -191,7 +205,8 @@
1.79 RAZOR_DETAIL_LAST))
1.80 list_package_properties(set, package, type);
1.81 razor_package_iterator_destroy(pi);
1.82 - razor_set_destroy(set);
1.83 + razor_set_unref(set);
1.84 + razor_atomic_destroy(atomic);
1.85
1.86 return 0;
1.87 }
1.88 @@ -224,13 +239,18 @@
1.89 command_list_scripts(int argc, const char *argv[])
1.90 {
1.91 struct razor_set *set;
1.92 + struct razor_atomic *atomic;
1.93 struct razor_package *package;
1.94 struct razor_package_iterator *pi;
1.95 const char *preunprog, *preun, *postunprog, *postun;
1.96
1.97 - set = razor_root_open_read_only(install_root);
1.98 - if (set == NULL)
1.99 + atomic = razor_atomic_open("List package scripts");
1.100 + set = razor_root_open_read_only(install_root, atomic);
1.101 + if (set == NULL) {
1.102 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.103 + razor_atomic_destroy(atomic);
1.104 return 1;
1.105 + }
1.106
1.107 pi = create_iterator_from_argv(set, argc, argv);
1.108 while (razor_package_iterator_next(pi, &package,
1.109 @@ -253,7 +273,8 @@
1.110 }
1.111 }
1.112 razor_package_iterator_destroy(pi);
1.113 - razor_set_destroy(set);
1.114 + razor_set_unref(set);
1.115 + razor_atomic_destroy(atomic);
1.116
1.117 return 0;
1.118 }
1.119 @@ -261,14 +282,20 @@
1.120 static int
1.121 command_list_files(int argc, const char *argv[])
1.122 {
1.123 + struct razor_atomic *atomic;
1.124 struct razor_set *set;
1.125
1.126 - set = razor_root_open_read_only(install_root);
1.127 - if (set == NULL)
1.128 + atomic = razor_atomic_open("List package files");
1.129 + set = razor_root_open_read_only(install_root, atomic);
1.130 + if (set == NULL) {
1.131 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.132 + razor_atomic_destroy(atomic);
1.133 return 1;
1.134 + }
1.135
1.136 razor_set_list_files(set, argv[0]);
1.137 - razor_set_destroy(set);
1.138 + razor_set_unref(set);
1.139 + razor_atomic_destroy(atomic);
1.140
1.141 return 0;
1.142 }
1.143 @@ -276,18 +303,24 @@
1.144 static int
1.145 command_list_file_packages(int argc, const char *argv[])
1.146 {
1.147 + struct razor_atomic *atomic;
1.148 struct razor_set *set;
1.149 struct razor_package_iterator *pi;
1.150
1.151 - set = razor_root_open_read_only(install_root);
1.152 - if (set == NULL)
1.153 + atomic = razor_atomic_open("List file packages");
1.154 + set = razor_root_open_read_only(install_root, atomic);
1.155 + if (set == NULL) {
1.156 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.157 + razor_atomic_destroy(atomic);
1.158 return 1;
1.159 + }
1.160
1.161 pi = razor_package_iterator_create_for_file(set, argv[0]);
1.162 list_packages(pi, 0);
1.163 razor_package_iterator_destroy(pi);
1.164
1.165 - razor_set_destroy(set);
1.166 + razor_set_unref(set);
1.167 + razor_atomic_destroy(atomic);
1.168
1.169 return 0;
1.170 }
1.171 @@ -295,14 +328,19 @@
1.172 static int
1.173 command_list_package_files(int argc, const char *argv[])
1.174 {
1.175 + struct razor_atomic *atomic;
1.176 struct razor_set *set;
1.177 struct razor_package_iterator *pi;
1.178 struct razor_package *package;
1.179 const char *name, *version, *arch;
1.180
1.181 - set = razor_root_open_read_only(install_root);
1.182 - if (set == NULL)
1.183 + atomic = razor_atomic_open("List package files");
1.184 + set = razor_root_open_read_only(install_root, atomic);
1.185 + if (set == NULL) {
1.186 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.187 + razor_atomic_destroy(atomic);
1.188 return 1;
1.189 + }
1.190
1.191 pi = create_iterator_from_argv(set, argc, argv);
1.192 while (razor_package_iterator_next(pi, &package,
1.193 @@ -313,7 +351,8 @@
1.194 razor_set_list_package_files(set, package);
1.195 razor_package_iterator_destroy(pi);
1.196
1.197 - razor_set_destroy(set);
1.198 + razor_set_unref(set);
1.199 + razor_atomic_destroy(atomic);
1.200
1.201 return 0;
1.202 }
1.203 @@ -323,6 +362,7 @@
1.204 const char *ref_version,
1.205 uint32_t type)
1.206 {
1.207 + struct razor_atomic *atomic;
1.208 struct razor_set *set;
1.209 struct razor_property *property;
1.210 struct razor_property_iterator *prop_iter;
1.211 @@ -333,9 +373,13 @@
1.212 if (ref_name == NULL)
1.213 return 0;
1.214
1.215 - set = razor_root_open_read_only(install_root);
1.216 - if (set == NULL)
1.217 + atomic = razor_atomic_open("List package properties");
1.218 + set = razor_root_open_read_only(install_root, atomic);
1.219 + if (set == NULL) {
1.220 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.221 + razor_atomic_destroy(atomic);
1.222 return 1;
1.223 + }
1.224
1.225 prop_iter = razor_property_iterator_create(set, NULL);
1.226 while (razor_property_iterator_next(prop_iter, &property,
1.227 @@ -357,7 +401,8 @@
1.228 }
1.229 razor_property_iterator_destroy(prop_iter);
1.230
1.231 - razor_set_destroy(set);
1.232 + razor_set_unref(set);
1.233 + razor_atomic_destroy(atomic);
1.234
1.235 return 0;
1.236 }
1.237 @@ -454,7 +499,9 @@
1.238 static int
1.239 command_import_yum(int argc, const char *argv[])
1.240 {
1.241 + int retval;
1.242 struct razor_set *set;
1.243 + struct razor_atomic *atomic;
1.244 char buffer[512];
1.245
1.246 printf("downloading from %s.\n", yum_url);
1.247 @@ -470,14 +517,17 @@
1.248 set = razor_set_create_from_yum();
1.249 if (set == NULL)
1.250 return 1;
1.251 - if (razor_set_write(set, rawhide_repo_filename, RAZOR_SECTION_ALL)) {
1.252 - perror(rawhide_repo_filename);
1.253 - return -1;
1.254 - }
1.255 - razor_set_destroy(set);
1.256 - printf("wrote %s\n", rawhide_repo_filename);
1.257 + atomic = razor_atomic_open("Yum import repository");
1.258 + razor_set_write(set, atomic, rawhide_repo_filename, RAZOR_SECTION_ALL);
1.259 + retval = razor_atomic_commit(atomic);
1.260 + razor_set_unref(set);
1.261 + if (retval)
1.262 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.263 + else
1.264 + printf("wrote %s\n", rawhide_repo_filename);
1.265 + razor_atomic_destroy(atomic);
1.266
1.267 - return 0;
1.268 + return retval;
1.269 }
1.270
1.271 #if HAVE_RPMLIB
1.272 @@ -486,10 +536,17 @@
1.273 {
1.274 struct razor_set *set;
1.275 struct razor_root *root;
1.276 + struct razor_atomic *atomic;
1.277 + int retval;
1.278
1.279 - root = razor_root_open(install_root);
1.280 - if (root == NULL)
1.281 + atomic = razor_atomic_open("Import RPM database");
1.282 +
1.283 + root = razor_root_open(install_root, atomic);
1.284 + if (root == NULL) {
1.285 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.286 + razor_atomic_destroy(atomic);
1.287 return 1;
1.288 + }
1.289
1.290 set = razor_set_create_from_rpmdb();
1.291 if (set == NULL)
1.292 @@ -497,7 +554,13 @@
1.293
1.294 razor_root_update(root, set);
1.295
1.296 - return razor_root_commit(root);
1.297 + retval = razor_root_commit(root);
1.298 + if (retval)
1.299 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.300 +
1.301 + razor_atomic_destroy(atomic);
1.302 +
1.303 + return retval;
1.304 }
1.305 #endif
1.306
1.307 @@ -553,45 +616,69 @@
1.308 struct razor_root *root;
1.309 struct razor_set *system, *upstream, *next;
1.310 struct razor_transaction *trans;
1.311 - int i, errors;
1.312 + struct razor_atomic *atomic;
1.313 + struct razor_install_iterator *ii;
1.314 + int i, retval;
1.315
1.316 - root = razor_root_open(install_root);
1.317 - system = razor_root_get_system_set(root);
1.318 + atomic = razor_atomic_open("Remove packages");
1.319 +
1.320 + root = razor_root_open(install_root, atomic);
1.321 + system = razor_set_ref(razor_root_get_system_set(root));
1.322 if (system == NULL) {
1.323 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.324 razor_root_close(root);
1.325 + razor_atomic_destroy(atomic);
1.326 return 1;
1.327 }
1.328
1.329 upstream = razor_set_create_without_root();
1.330 trans = razor_transaction_create(system, upstream);
1.331 + razor_set_unref(upstream);
1.332 for (i = 0; i < argc; i++) {
1.333 if (mark_packages_for_removal(trans, system, argv[i]) == 0) {
1.334 fprintf(stderr, "no match for %s\n", argv[i]);
1.335 razor_transaction_destroy(trans);
1.336 - razor_set_destroy(upstream);
1.337 + razor_set_unref(system);
1.338 razor_root_close(root);
1.339 + razor_atomic_destroy(atomic);
1.340 return 1;
1.341 }
1.342 }
1.343
1.344 razor_transaction_resolve(trans);
1.345 - errors = razor_transaction_describe(trans);
1.346 - if (errors) {
1.347 + retval = razor_transaction_describe(trans);
1.348 + if (retval) {
1.349 razor_transaction_destroy(trans);
1.350 - razor_set_destroy(upstream);
1.351 + razor_set_unref(system);
1.352 razor_root_close(root);
1.353 + razor_atomic_destroy(atomic);
1.354 return 1;
1.355 }
1.356
1.357 next = razor_transaction_commit(trans);
1.358 - update_packages(trans, system, next, NULL);
1.359 + ii = razor_set_create_install_iterator(system, next);
1.360 + update_packages(trans, ii, system, next, atomic, NULL,
1.361 + RAZOR_STAGE_SCRIPTS_PRE);
1.362 + update_packages(trans, ii, system, next, atomic, NULL,
1.363 + RAZOR_STAGE_FILES);
1.364 +
1.365 razor_root_update(root, next);
1.366
1.367 + (void)razor_root_commit(root);
1.368 + retval = razor_atomic_commit(atomic);
1.369 + if (retval)
1.370 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.371 + else
1.372 + update_packages(trans, ii, system, next, atomic, NULL,
1.373 + RAZOR_STAGE_SCRIPTS_POST);
1.374 + razor_install_iterator_destroy(ii);
1.375 +
1.376 razor_transaction_destroy(trans);
1.377 - razor_set_destroy(next);
1.378 - razor_set_destroy(upstream);
1.379 + razor_atomic_destroy(atomic);
1.380 + razor_set_unref(system);
1.381 + razor_set_unref(next);
1.382
1.383 - return razor_root_commit(root);
1.384 + return retval;
1.385 }
1.386
1.387 static void
1.388 @@ -611,17 +698,23 @@
1.389 static int
1.390 command_diff(int argc, const char *argv[])
1.391 {
1.392 + struct razor_atomic *atomic;
1.393 struct razor_set *set, *updated;
1.394
1.395 - set = razor_root_open_read_only(install_root);
1.396 - updated = razor_set_open(rawhide_repo_filename);
1.397 - if (set == NULL || updated == NULL)
1.398 + atomic = razor_atomic_open("Show package differences");
1.399 + set = razor_root_open_read_only(install_root, atomic);
1.400 + updated = razor_set_open(rawhide_repo_filename, atomic);
1.401 + if (set == NULL || updated == NULL) {
1.402 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.403 + razor_atomic_destroy(atomic);
1.404 return 1;
1.405 + }
1.406
1.407 razor_set_diff(set, updated, print_diff, NULL);
1.408
1.409 - razor_set_destroy(set);
1.410 - razor_set_destroy(updated);
1.411 + razor_set_unref(set);
1.412 + razor_set_unref(updated);
1.413 + razor_atomic_destroy(atomic);
1.414
1.415 return 0;
1.416 }
1.417 @@ -634,9 +727,11 @@
1.418 struct razor_importer *importer;
1.419 struct razor_set *set;
1.420 struct razor_rpm *rpm;
1.421 + struct razor_atomic *atomic;
1.422 int len, imported_count = 0;
1.423 char filename[256];
1.424 const char *dirname = argv[0];
1.425 + int retval;
1.426
1.427 if (dirname == NULL) {
1.428 fprintf(stderr, "usage: razor import-rpms DIR\n");
1.429 @@ -654,15 +749,17 @@
1.430 while (de = readdir(dir), de != NULL) {
1.431 len = strlen(de->d_name);
1.432 if (len < 5 || strcmp(de->d_name + len - 4, ".rpm") != 0)
1.433 - continue;
1.434 + continue;
1.435 snprintf(filename, sizeof filename,
1.436 "%s/%s", dirname, de->d_name);
1.437 - rpm = razor_rpm_open(filename);
1.438 - if (rpm == NULL) {
1.439 - fprintf(stderr,
1.440 - "failed to open rpm \"%s\"\n", filename);
1.441 + atomic = razor_atomic_open("Read RPM");
1.442 + rpm = razor_rpm_open(filename, atomic);
1.443 + if (rpm == NULL)
1.444 + fprintf(stderr, "%s\n",
1.445 + razor_atomic_get_error_msg(atomic));
1.446 + razor_atomic_destroy(atomic);
1.447 + if (rpm == NULL)
1.448 continue;
1.449 - }
1.450 if (razor_importer_add_rpm(importer, rpm)) {
1.451 fprintf(stderr, "couldn't import %s\n", filename);
1.452 break;
1.453 @@ -681,17 +778,22 @@
1.454 printf("\nsaving\n");
1.455 set = razor_importer_finish(importer);
1.456
1.457 - razor_set_write(set, repo_filename, RAZOR_SECTION_ALL);
1.458 - razor_set_destroy(set);
1.459 - printf("wrote %s\n", repo_filename);
1.460 + atomic = razor_atomic_open("Update system database");
1.461 + razor_set_write(set, atomic, repo_filename, RAZOR_SECTION_ALL);
1.462 + razor_set_unref(set);
1.463 + retval = razor_atomic_commit(atomic);
1.464 + if (retval)
1.465 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.466 + else
1.467 + printf("wrote %s\n", repo_filename);
1.468 + razor_atomic_destroy(atomic);
1.469
1.470 - return 0;
1.471 + return retval;
1.472 }
1.473
1.474 -static const char *
1.475 +static char *
1.476 rpm_filename(const char *name, const char *version, const char *arch)
1.477 {
1.478 - static char file[PATH_MAX];
1.479 const char *v;
1.480
1.481 /* Skip epoch */
1.482 @@ -701,9 +803,7 @@
1.483 else
1.484 v = version;
1.485
1.486 - snprintf(file, sizeof file, "%s-%s.%s.rpm", name, v, arch);
1.487 -
1.488 - return file;
1.489 + return razor_concat(name, "-", v, ".", arch, ".rpm", NULL);
1.490 }
1.491
1.492 static int
1.493 @@ -713,7 +813,7 @@
1.494 struct razor_package *package;
1.495 enum razor_install_action action;
1.496 const char *name, *version, *arch;
1.497 - char file[PATH_MAX], url[256];
1.498 + char *file, *url, *s;
1.499 int errors = 0, count;
1.500
1.501 ii = razor_set_create_install_iterator(system, next);
1.502 @@ -727,13 +827,14 @@
1.503 RAZOR_DETAIL_ARCH, &arch,
1.504 RAZOR_DETAIL_LAST);
1.505
1.506 - snprintf(url, sizeof url,
1.507 - "%s/Packages/%s",
1.508 - yum_url, rpm_filename(name, version, arch));
1.509 - snprintf(file, sizeof file,
1.510 - "rpms/%s", rpm_filename(name, version, arch));
1.511 + s = rpm_filename(name, version, arch);
1.512 + url = razor_concat(yum_url, "/Packages/", s, NULL);
1.513 + file = razor_concat("rpms/", s, NULL);
1.514 + free(s);
1.515 if (download_if_missing(url, file) < 0)
1.516 errors++;
1.517 + free(file);
1.518 + free(url);
1.519 }
1.520 razor_install_iterator_destroy(ii);
1.521
1.522 @@ -746,7 +847,8 @@
1.523 }
1.524
1.525 static struct razor_set *
1.526 -relocate_packages(struct razor_set *set, struct razor_relocations *relocations)
1.527 +relocate_packages(struct razor_set *set, struct razor_atomic *atomic,
1.528 + struct razor_relocations *relocations)
1.529 {
1.530 int i;
1.531 struct razor_importer *importer;
1.532 @@ -760,7 +862,7 @@
1.533 const char *preunprog, *preun, *postunprog, *postun;
1.534 const char *install_prefix;
1.535 const char *const *prefixes;
1.536 - char file[PATH_MAX];
1.537 + char *file, *s;
1.538 uint32_t flags;
1.539
1.540 importer = razor_importer_create();
1.541 @@ -779,11 +881,12 @@
1.542 RAZOR_DETAIL_POSTUNPROG, &postunprog,
1.543 RAZOR_DETAIL_POSTUN, &postun,
1.544 RAZOR_DETAIL_LAST)) {
1.545 - snprintf(file, sizeof file,
1.546 - "rpms/%s", rpm_filename(name, version, arch));
1.547 - rpm = razor_rpm_open(file);
1.548 + s = rpm_filename(name, version, arch);
1.549 + file = razor_concat("rpms/", s, NULL);
1.550 + free(s);
1.551 + rpm = razor_rpm_open(file, atomic);
1.552 + free(file);
1.553 if (rpm == NULL) {
1.554 - fprintf(stderr, "failed to open rpm %s\n", file);
1.555 razor_package_iterator_destroy(pkg_iter);
1.556 razor_importer_destroy(importer);
1.557 return NULL;
1.558 @@ -834,12 +937,13 @@
1.559
1.560 static int
1.561 install_package(struct razor_transaction *trans, struct razor_set *set,
1.562 - struct razor_package *package,
1.563 - struct razor_relocations *relocations)
1.564 + struct razor_atomic *atomic, struct razor_package *package,
1.565 + struct razor_relocations *relocations, int install_count,
1.566 + enum razor_stage_type stage)
1.567 {
1.568 int retval;
1.569 const char *name, *version, *arch;
1.570 - char file[PATH_MAX];
1.571 + char *file, *s;
1.572 struct razor_rpm *rpm;
1.573
1.574 razor_package_get_details(set, package,
1.575 @@ -848,45 +952,57 @@
1.576 RAZOR_DETAIL_ARCH, &arch,
1.577 RAZOR_DETAIL_LAST);
1.578
1.579 - printf("install %s-%s\n", name, version);
1.580 + if (stage & RAZOR_STAGE_SCRIPTS_PRE)
1.581 + printf("install %s-%s\n", name, version);
1.582
1.583 - snprintf(file, sizeof file,
1.584 - "rpms/%s", rpm_filename(name, version, arch));
1.585 - rpm = razor_rpm_open(file);
1.586 + s = rpm_filename(name, version, arch);
1.587 + file = razor_concat("rpms/", s, NULL);
1.588 + free(s);
1.589 + rpm = razor_rpm_open(file, atomic);
1.590 + free(file);
1.591 if (rpm == NULL) {
1.592 - fprintf(stderr, "failed to open rpm %s\n", file);
1.593 + fprintf(stderr, "%s\n",
1.594 + razor_atomic_get_error_msg(atomic));
1.595 return -1;
1.596 }
1.597 if (relocations)
1.598 razor_rpm_set_relocations(rpm, relocations);
1.599 razor_transaction_fixup_package(trans, package, rpm);
1.600 - retval = razor_rpm_install(rpm, install_root, 1);
1.601 - if (retval < 0)
1.602 - fprintf(stderr, "failed to install rpm %s\n", file);
1.603 + retval = razor_rpm_install(rpm, atomic, install_root, install_count,
1.604 + stage);
1.605 + if (retval < 0) {
1.606 + s = rpm_filename(name, version, arch);
1.607 + fprintf(stderr, "%s: %s\n", s,
1.608 + razor_atomic_get_error_msg(atomic));
1.609 + free(s);
1.610 + }
1.611 razor_rpm_close(rpm);
1.612 return retval;
1.613 }
1.614
1.615 static int
1.616 -update_packages(struct razor_transaction *trans, struct razor_set *system,
1.617 - struct razor_set *next, struct razor_relocations *relocations)
1.618 +update_packages(struct razor_transaction *trans,
1.619 + struct razor_install_iterator *ii, struct razor_set *system,
1.620 + struct razor_set *next, struct razor_atomic *atomic,
1.621 + struct razor_relocations *relocations,
1.622 + enum razor_stage_type stage)
1.623 {
1.624 - struct razor_install_iterator *ii;
1.625 struct razor_package *package;
1.626 enum razor_install_action action;
1.627 int retval = 0, count;
1.628
1.629 - ii = razor_set_create_install_iterator(system, next);
1.630 + razor_install_iterator_rewind(ii);
1.631 +
1.632 while (!retval && razor_install_iterator_next(ii, &package,
1.633 &action, &count)) {
1.634 if (action == RAZOR_INSTALL_ACTION_ADD)
1.635 - retval = install_package(trans, next, package,
1.636 - relocations);
1.637 + retval = install_package(trans, next, atomic, package,
1.638 + relocations, count, stage);
1.639 else if (action == RAZOR_INSTALL_ACTION_REMOVE)
1.640 - retval = razor_package_remove(system, next, package,
1.641 - install_root, count);
1.642 + retval = razor_package_remove(system, next, atomic,
1.643 + package, install_root,
1.644 + count, stage);
1.645 }
1.646 - razor_install_iterator_destroy(ii);
1.647
1.648 return retval;
1.649 }
1.650 @@ -898,12 +1014,22 @@
1.651 struct razor_relocations *relocations=NULL;
1.652 struct razor_set *system, *upstream, *next, *set;
1.653 struct razor_transaction *trans;
1.654 - int i, len, dependencies = 1;
1.655 + struct razor_atomic *atomic;
1.656 + struct razor_install_iterator *ii;
1.657 + int i, retval, len, dependencies = 1;
1.658 char *oldpath;
1.659
1.660 - root = razor_root_open(install_root);
1.661 - if (root == NULL)
1.662 + if (do_update)
1.663 + atomic = razor_atomic_open("Update packages");
1.664 + else
1.665 + atomic = razor_atomic_open("Install packages");
1.666 +
1.667 + root = razor_root_open(install_root, atomic);
1.668 + if (root == NULL) {
1.669 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.670 + razor_atomic_destroy(atomic);
1.671 return 1;
1.672 + }
1.673
1.674 for (i = 0; i < argc; i++) {
1.675 if (strcmp(argv[i], "--no-dependencies") == 0)
1.676 @@ -933,19 +1059,30 @@
1.677 break;
1.678 }
1.679
1.680 - system = razor_root_get_system_set(root);
1.681 - upstream = razor_set_open(rawhide_repo_filename);
1.682 + upstream = razor_set_open(rawhide_repo_filename, atomic);
1.683 if (upstream == NULL) {
1.684 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.685 razor_root_close(root);
1.686 + razor_atomic_destroy(atomic);
1.687 return 1;
1.688 }
1.689
1.690 if (relocations) {
1.691 - set = relocate_packages(upstream, relocations);
1.692 - razor_set_destroy(upstream);
1.693 + set = relocate_packages(upstream, atomic, relocations);
1.694 + if (set == NULL) {
1.695 + fprintf(stderr, "%s\n",
1.696 + razor_atomic_get_error_msg(atomic));
1.697 + razor_root_close(root);
1.698 + razor_atomic_destroy(atomic);
1.699 + razor_set_unref(upstream);
1.700 + return 1;
1.701 + }
1.702 + razor_set_unref(upstream);
1.703 upstream = set;
1.704 }
1.705
1.706 + system = razor_set_ref(razor_root_get_system_set(root));
1.707 +
1.708 trans = razor_transaction_create(system, upstream);
1.709
1.710 if (i == argc && do_update)
1.711 @@ -957,8 +1094,10 @@
1.712 if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
1.713 fprintf(stderr, "no package matched %s\n", argv[i]);
1.714 razor_transaction_destroy(trans);
1.715 - razor_set_destroy(upstream);
1.716 + razor_set_unref(upstream);
1.717 + razor_set_unref(system);
1.718 razor_root_close(root);
1.719 + razor_atomic_destroy(atomic);
1.720 return 1;
1.721 }
1.722 }
1.723 @@ -967,41 +1106,67 @@
1.724 razor_transaction_resolve(trans);
1.725 if (razor_transaction_describe(trans) > 0) {
1.726 razor_transaction_destroy(trans);
1.727 - razor_set_destroy(upstream);
1.728 + razor_set_unref(upstream);
1.729 + razor_set_unref(system);
1.730 razor_root_close(root);
1.731 + razor_atomic_destroy(atomic);
1.732 return 1;
1.733 }
1.734 }
1.735
1.736 - if (mkdir("rpms", 0777) && errno != EEXIST) {
1.737 - fprintf(stderr, "failed to create rpms directory.\n");
1.738 + if (razor_atomic_create_dir(atomic, "rpms",
1.739 + S_IRWXU | S_IRWXG | S_IRWXO)) {
1.740 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.741 razor_transaction_destroy(trans);
1.742 - razor_set_destroy(upstream);
1.743 + razor_set_unref(upstream);
1.744 + razor_set_unref(system);
1.745 razor_root_close(root);
1.746 + razor_atomic_destroy(atomic);
1.747 return 1;
1.748 }
1.749
1.750 next = razor_transaction_commit(trans);
1.751
1.752 if (download_packages(system, next) < 0) {
1.753 - razor_set_destroy(next);
1.754 + razor_set_unref(next);
1.755 razor_transaction_destroy(trans);
1.756 - razor_set_destroy(upstream);
1.757 + razor_set_unref(upstream);
1.758 + razor_set_unref(system);
1.759 razor_root_close(root);
1.760 + razor_atomic_destroy(atomic);
1.761 return 1;
1.762 }
1.763
1.764 - update_packages(trans, system, next, relocations);
1.765 + ii = razor_set_create_install_iterator(system, next);
1.766 +
1.767 + update_packages(trans, ii, system, next, atomic, relocations,
1.768 + RAZOR_STAGE_SCRIPTS_PRE);
1.769 + update_packages(trans, ii, system, next, atomic, relocations,
1.770 + RAZOR_STAGE_FILES);
1.771
1.772 razor_root_update(root, next);
1.773
1.774 + razor_set_unref(upstream);
1.775 +
1.776 + (void)razor_root_commit(root);
1.777 + retval = razor_atomic_commit(atomic);
1.778 + if (retval)
1.779 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.780 + else
1.781 + update_packages(trans, ii, system, next, atomic, relocations,
1.782 + RAZOR_STAGE_SCRIPTS_POST);
1.783 +
1.784 razor_transaction_destroy(trans);
1.785 if (relocations)
1.786 razor_relocations_destroy(relocations);
1.787 - razor_set_destroy(next);
1.788 - razor_set_destroy(upstream);
1.789 + razor_install_iterator_destroy(ii);
1.790
1.791 - return razor_root_commit(root);
1.792 + razor_atomic_destroy(atomic);
1.793 +
1.794 + razor_set_unref(next);
1.795 + razor_set_unref(system);
1.796 +
1.797 + return retval;
1.798 }
1.799
1.800 static int
1.801 @@ -1025,6 +1190,7 @@
1.802 static int
1.803 command_download(int argc, const char *argv[])
1.804 {
1.805 + struct razor_atomic *atomic;
1.806 struct razor_set *set;
1.807 struct razor_package_iterator *pi;
1.808 struct razor_package *package;
1.809 @@ -1032,12 +1198,24 @@
1.810 char url[256], file[256];
1.811 int matches = 0;
1.812
1.813 - if (mkdir("rpms", 0777) && errno != EEXIST) {
1.814 - fprintf(stderr, "failed to create rpms directory.\n");
1.815 + atomic = razor_atomic_open("Download packages");
1.816 +
1.817 + if (razor_atomic_create_dir(atomic, "rpms",
1.818 + S_IRWXU | S_IRWXG | S_IRWXO)) {
1.819 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.820 + razor_atomic_destroy(atomic);
1.821 return 1;
1.822 }
1.823
1.824 - set = razor_set_open(rawhide_repo_filename);
1.825 + set = razor_set_open(rawhide_repo_filename, atomic);
1.826 +
1.827 + if (razor_atomic_commit(atomic)) {
1.828 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.829 + razor_atomic_destroy(atomic);
1.830 + return 1;
1.831 + }
1.832 + razor_atomic_destroy(atomic);
1.833 +
1.834 pi = razor_package_iterator_create(set);
1.835 while (razor_package_iterator_next(pi, &package,
1.836 RAZOR_DETAIL_NAME, &name,
1.837 @@ -1056,7 +1234,7 @@
1.838 download_if_missing(url, file);
1.839 }
1.840 razor_package_iterator_destroy(pi);
1.841 - razor_set_destroy(set);
1.842 + razor_set_unref(set);
1.843
1.844 if (matches == 0)
1.845 fprintf(stderr, "no packages matched \"%s\"\n", pattern);
1.846 @@ -1071,15 +1249,20 @@
1.847 static int
1.848 command_info(int argc, const char *argv[])
1.849 {
1.850 + struct razor_atomic *atomic;
1.851 struct razor_set *set;
1.852 struct razor_package_iterator *pi;
1.853 struct razor_package *package;
1.854 const char *pattern = argv[0], *name, *version, *arch;
1.855 const char *summary, *description, *url, *license;
1.856
1.857 - set = razor_root_open_read_only(install_root);
1.858 - if (set == NULL)
1.859 + atomic = razor_atomic_open("Package info");
1.860 + set = razor_root_open_read_only(install_root, atomic);
1.861 + if (set == NULL) {
1.862 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.863 + razor_atomic_destroy(atomic);
1.864 return 1;
1.865 + }
1.866
1.867 pi = razor_package_iterator_create(set);
1.868 while (razor_package_iterator_next(pi, &package,
1.869 @@ -1108,7 +1291,8 @@
1.870 printf ("\n");
1.871 }
1.872 razor_package_iterator_destroy(pi);
1.873 - razor_set_destroy(set);
1.874 + razor_set_unref(set);
1.875 + razor_atomic_destroy(atomic);
1.876
1.877 return 0;
1.878 }
1.879 @@ -1118,6 +1302,7 @@
1.880 static int
1.881 command_search(int argc, const char *argv[])
1.882 {
1.883 + struct razor_atomic *atomic;
1.884 struct razor_set *set;
1.885 struct razor_package_iterator *pi;
1.886 struct razor_package *package;
1.887 @@ -1132,9 +1317,14 @@
1.888
1.889 snprintf(pattern, sizeof pattern, "*%s*", argv[0]);
1.890
1.891 - set = razor_set_open(rawhide_repo_filename);
1.892 - if (set == NULL)
1.893 + atomic = razor_atomic_open("Search packages");
1.894 + set = razor_set_open(rawhide_repo_filename, atomic);
1.895 + if (set == NULL || razor_atomic_commit(atomic)) {
1.896 + fprintf(stderr, "%s\n", razor_atomic_get_error_msg(atomic));
1.897 + razor_atomic_destroy(atomic);
1.898 return 1;
1.899 + }
1.900 + razor_atomic_destroy(atomic);
1.901
1.902 pi = razor_package_iterator_create(set);
1.903 while (razor_package_iterator_next(pi, &package,
1.904 @@ -1153,7 +1343,7 @@
1.905 printf("%s-%s.%s: %s\n", name, version, arch, summary);
1.906 }
1.907 razor_package_iterator_destroy(pi);
1.908 - razor_set_destroy(set);
1.909 + razor_set_unref(set);
1.910
1.911 return 0;
1.912 }