1.1 --- a/src/main.c Fri May 01 16:48:47 2009 +0100
1.2 +++ b/src/main.c Thu Jul 02 11:31:45 2009 +0100
1.3 @@ -50,8 +50,8 @@
1.4 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
1.5
1.6 static int
1.7 -update_packages(struct razor_set *system, struct razor_set *next,
1.8 - struct razor_relocations *relocations);
1.9 +update_packages(struct razor_transaction *trans, struct razor_set *system,
1.10 + struct razor_set *next, struct razor_relocations *relocations);
1.11
1.12 static struct razor_package_iterator *
1.13 create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
1.14 @@ -222,6 +222,44 @@
1.15 }
1.16
1.17 static int
1.18 +command_list_scripts(int argc, const char *argv[])
1.19 +{
1.20 + struct razor_set *set;
1.21 + struct razor_package *package;
1.22 + struct razor_package_iterator *pi;
1.23 + const char *preunprog, *preun, *postunprog, *postun;
1.24 +
1.25 + set = razor_root_open_read_only(install_root);
1.26 + if (set == NULL)
1.27 + return 1;
1.28 +
1.29 + pi = create_iterator_from_argv(set, argc, argv);
1.30 + while (razor_package_iterator_next(pi, &package,
1.31 + RAZOR_DETAIL_PREUNPROG, &preunprog,
1.32 + RAZOR_DETAIL_PREUN, &preun,
1.33 + RAZOR_DETAIL_POSTUNPROG, &postunprog,
1.34 + RAZOR_DETAIL_POSTUN, &postun,
1.35 + RAZOR_DETAIL_LAST)) {
1.36 + if (preun && *preun) {
1.37 + printf("preuninstall scriptlet");
1.38 + if (preunprog && *preunprog)
1.39 + printf(" (using %s)",preunprog);
1.40 + printf(":\n%s\n",preun);
1.41 + }
1.42 + if (postun && *postun) {
1.43 + printf("postuninstall scriptlet");
1.44 + if (postunprog && *postunprog)
1.45 + printf(" (using %s)",postunprog);
1.46 + printf(":\n%s\n",postun);
1.47 + }
1.48 + }
1.49 + razor_package_iterator_destroy(pi);
1.50 + razor_set_destroy(set);
1.51 +
1.52 + return 0;
1.53 +}
1.54 +
1.55 +static int
1.56 command_list_files(int argc, const char *argv[])
1.57 {
1.58 struct razor_set *set;
1.59 @@ -542,6 +580,7 @@
1.60 for (i = 0; i < argc; i++) {
1.61 if (mark_packages_for_update(trans, set, argv[i]) == 0) {
1.62 fprintf(stderr, "no match for %s\n", argv[i]);
1.63 + razor_transaction_destroy(trans);
1.64 return 1;
1.65 }
1.66 }
1.67 @@ -550,11 +589,13 @@
1.68 errors = razor_transaction_describe(trans);
1.69 if (errors) {
1.70 fprintf(stderr, "unresolved dependencies\n");
1.71 + razor_transaction_destroy(trans);
1.72 return 1;
1.73 }
1.74
1.75 - set = razor_transaction_finish(trans);
1.76 + set = razor_transaction_commit(trans);
1.77 razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
1.78 + razor_transaction_destroy(trans);
1.79 razor_set_destroy(set);
1.80 razor_set_destroy(upstream);
1.81 printf("wrote system-updated.rzdb\n");
1.82 @@ -598,10 +639,11 @@
1.83 return 1;
1.84 }
1.85
1.86 - next = razor_transaction_finish(trans);
1.87 - update_packages(system, next, NULL);
1.88 + next = razor_transaction_commit(trans);
1.89 + update_packages(trans, system, next, NULL);
1.90 razor_root_update(root, next);
1.91
1.92 + razor_transaction_destroy(trans);
1.93 razor_set_destroy(next);
1.94 razor_set_destroy(upstream);
1.95
1.96 @@ -774,6 +816,7 @@
1.97 struct razor_property *property;
1.98 struct razor_rpm *rpm;
1.99 const char *name, *version, *arch, *summary, *desc, *url, *license;
1.100 + const char *preunprog, *preun, *postunprog, *postun;
1.101 char file[PATH_MAX];
1.102 uint32_t flags;
1.103
1.104 @@ -788,6 +831,10 @@
1.105 RAZOR_DETAIL_DESCRIPTION, &desc,
1.106 RAZOR_DETAIL_URL, &url,
1.107 RAZOR_DETAIL_LICENSE, &license,
1.108 + RAZOR_DETAIL_PREUNPROG, &preunprog,
1.109 + RAZOR_DETAIL_PREUN, &preun,
1.110 + RAZOR_DETAIL_POSTUNPROG, &postunprog,
1.111 + RAZOR_DETAIL_POSTUN, &postun,
1.112 RAZOR_DETAIL_LAST)) {
1.113 snprintf(file, sizeof file,
1.114 "rpms/%s", rpm_filename(name, version, arch));
1.115 @@ -820,6 +867,11 @@
1.116 }
1.117 razor_file_iterator_destroy(file_iter);
1.118
1.119 + razor_importer_add_script(importer, RAZOR_PROPERTY_PREUN,
1.120 + preunprog, preun);
1.121 + razor_importer_add_script(importer, RAZOR_PROPERTY_POSTUN,
1.122 + postunprog, postun);
1.123 +
1.124 razor_importer_finish_package(importer);
1.125 }
1.126
1.127 @@ -828,7 +880,8 @@
1.128 }
1.129
1.130 static int
1.131 -install_package(struct razor_set *set, struct razor_package *package,
1.132 +install_package(struct razor_transaction *trans, struct razor_set *set,
1.133 + struct razor_package *package,
1.134 struct razor_relocations *relocations)
1.135 {
1.136 int retval;
1.137 @@ -853,6 +906,7 @@
1.138 }
1.139 if (relocations)
1.140 razor_rpm_set_relocations(rpm, relocations);
1.141 + razor_transaction_fixup_package(trans, package, rpm);
1.142 retval = razor_rpm_install(rpm, install_root);
1.143 if (retval < 0)
1.144 fprintf(stderr, "failed to install rpm %s\n", file);
1.145 @@ -861,37 +915,8 @@
1.146 }
1.147
1.148 static int
1.149 -remove_package(struct razor_set *set, struct razor_package *package)
1.150 -{
1.151 - struct razor_file_iterator *fi;
1.152 - struct razor_package_iterator *pi;
1.153 - struct razor_package *p;
1.154 - char buffer[PATH_MAX];
1.155 - const char *name;
1.156 - int retval = 0, count;
1.157 -
1.158 - fi = razor_file_iterator_create(set, package);
1.159 -
1.160 - while (!retval && razor_file_iterator_next(fi, &name)) {
1.161 - pi = razor_package_iterator_create_for_file(set, name);
1.162 - count = 0;
1.163 - while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
1.164 - count++;
1.165 - razor_package_iterator_destroy(pi);
1.166 - if (count <= 1) {
1.167 - snprintf(buffer, sizeof buffer, "%s%s", install_root,
1.168 - name);
1.169 - retval = remove(buffer);
1.170 - }
1.171 - }
1.172 -
1.173 - razor_file_iterator_destroy(fi);
1.174 - return retval;
1.175 -}
1.176 -
1.177 -static int
1.178 -update_packages(struct razor_set *system, struct razor_set *next,
1.179 - struct razor_relocations *relocations)
1.180 +update_packages(struct razor_transaction *trans, struct razor_set *system,
1.181 + struct razor_set *next, struct razor_relocations *relocations)
1.182 {
1.183 struct razor_install_iterator *ii;
1.184 struct razor_package *package;
1.185 @@ -903,9 +928,11 @@
1.186 while (!retval && razor_install_iterator_next(ii, &set, &package,
1.187 &action, &count)) {
1.188 if (action == RAZOR_INSTALL_ACTION_ADD)
1.189 - retval = install_package(set, package, relocations);
1.190 + retval = install_package(trans, set, package,
1.191 + relocations);
1.192 else if (action == RAZOR_INSTALL_ACTION_REMOVE)
1.193 - retval = remove_package(set, package);
1.194 + retval = razor_package_remove(set, package,
1.195 + install_root);
1.196 }
1.197 razor_install_iterator_destroy(ii);
1.198
1.199 @@ -974,6 +1001,7 @@
1.200 for (; i < argc; i++) {
1.201 if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
1.202 fprintf(stderr, "no package matched %s\n", argv[i]);
1.203 + razor_transaction_destroy(trans);
1.204 razor_root_close(root);
1.205 return 1;
1.206 }
1.207 @@ -982,28 +1010,32 @@
1.208 if (dependencies) {
1.209 razor_transaction_resolve(trans);
1.210 if (razor_transaction_describe(trans) > 0) {
1.211 + razor_transaction_destroy(trans);
1.212 razor_root_close(root);
1.213 return 1;
1.214 }
1.215 }
1.216
1.217 - next = razor_transaction_finish(trans);
1.218 -
1.219 - razor_root_update(root, next);
1.220 + next = razor_transaction_commit(trans);
1.221
1.222 if (mkdir("rpms", 0777) && errno != EEXIST) {
1.223 fprintf(stderr, "failed to create rpms directory.\n");
1.224 + razor_transaction_destroy(trans);
1.225 razor_root_close(root);
1.226 return 1;
1.227 }
1.228
1.229 if (download_packages(system, next) < 0) {
1.230 + razor_transaction_destroy(trans);
1.231 razor_root_close(root);
1.232 return 1;
1.233 }
1.234
1.235 - update_packages(system, next, relocations);
1.236 + update_packages(trans, system, next, relocations);
1.237
1.238 + razor_root_update(root, next);
1.239 +
1.240 + razor_transaction_destroy(trans);
1.241 if (relocations)
1.242 razor_relocations_destroy(relocations);
1.243 razor_set_destroy(next);
1.244 @@ -1167,6 +1199,7 @@
1.245 { "list-provides", "list all provides for the given package", command_list_provides },
1.246 { "list-obsoletes", "list all obsoletes for the given package", command_list_obsoletes },
1.247 { "list-conflicts", "list all conflicts for the given package", command_list_conflicts },
1.248 + { "list-scripts", "list all scripts for the given package", command_list_scripts },
1.249 { "list-files", "list files for package set", command_list_files },
1.250 { "list-file-packages", "list packages owning file", command_list_file_packages },
1.251 { "list-package-files", "list files in package", command_list_package_files },