Mark package to be installed or removed after creating the transaction.
This lets us implement support for fnmatch wildcard and do
better error checking.
1.1 --- a/main.c Mon Apr 07 21:32:19 2008 -0400
1.2 +++ b/main.c Mon Apr 07 23:52:14 2008 -0400
1.3 @@ -356,17 +356,71 @@
1.4 }
1.5
1.6 static int
1.7 +mark_packages_for_update(struct razor_transaction *trans,
1.8 + struct razor_set *set, const char *pattern)
1.9 +{
1.10 + struct razor_package_iterator *pi;
1.11 + struct razor_package *package;
1.12 + const char *name, *version, *arch;
1.13 + int matches = 0;
1.14 +
1.15 + pi = razor_package_iterator_create(set);
1.16 + while (razor_package_iterator_next(pi, &package,
1.17 + &name, &version, &arch)) {
1.18 + if (pattern && fnmatch(pattern, name, 0) == 0) {
1.19 + razor_transaction_install_package(trans, package);
1.20 + matches++;
1.21 + }
1.22 + }
1.23 + razor_package_iterator_destroy(pi);
1.24 +
1.25 + return matches;
1.26 +}
1.27 +
1.28 +static int
1.29 +mark_packages_for_removal(struct razor_transaction *trans,
1.30 + struct razor_set *set, const char *pattern)
1.31 +{
1.32 + struct razor_package_iterator *pi;
1.33 + struct razor_package *package;
1.34 + const char *name, *version, *arch;
1.35 + int matches = 0;
1.36 +
1.37 + pi = razor_package_iterator_create(set);
1.38 + while (razor_package_iterator_next(pi, &package,
1.39 + &name, &version, &arch)) {
1.40 + if (pattern && fnmatch(pattern, name, 0) == 0) {
1.41 + razor_transaction_remove_package(trans, package);
1.42 + matches++;
1.43 + }
1.44 + }
1.45 + razor_package_iterator_destroy(pi);
1.46 +
1.47 + return matches;
1.48 +}
1.49 +
1.50 +static int
1.51 command_update(int argc, const char *argv[])
1.52 {
1.53 struct razor_set *set, *upstream;
1.54 struct razor_transaction *trans;
1.55 - int errors;
1.56 + int i, errors;
1.57
1.58 set = razor_set_open(repo_filename);
1.59 upstream = razor_set_open(rawhide_repo_filename);
1.60 if (set == NULL || upstream == NULL)
1.61 return 1;
1.62 - trans = razor_transaction_create(set, upstream, argc, argv, 0, NULL);
1.63 +
1.64 + trans = razor_transaction_create(set, upstream);
1.65 + if (argc == 0)
1.66 + razor_transaction_update_all(trans);
1.67 + for (i = 0; i < argc; i++) {
1.68 + if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
1.69 + fprintf(stderr, "no match for %s\n", argv[i]);
1.70 + return 1;
1.71 + }
1.72 + }
1.73 +
1.74 errors = razor_transaction_describe(trans);
1.75 if (errors)
1.76 return 1;
1.77 @@ -385,12 +439,20 @@
1.78 {
1.79 struct razor_set *set;
1.80 struct razor_transaction *trans;
1.81 - int errors;
1.82 + int i, errors;
1.83
1.84 set = razor_set_open(repo_filename);
1.85 if (set == NULL)
1.86 return 1;
1.87 - trans = razor_transaction_create(set, NULL, 0, NULL, argc, argv);
1.88 +
1.89 + trans = razor_transaction_create(set, NULL);
1.90 + for (i = 0; i < argc; i++) {
1.91 + if (mark_packages_for_removal(trans, set, argv[i]) == 0) {
1.92 + fprintf(stderr, "no match for %s\n", argv[i]);
1.93 + return 1;
1.94 + }
1.95 + }
1.96 +
1.97 errors = razor_transaction_describe(trans);
1.98 if (errors)
1.99 return 1;
1.100 @@ -564,7 +626,7 @@
1.101 struct razor_set *system, *upstream, *next;
1.102 struct razor_transaction *trans;
1.103 char path[PATH_MAX], new_path[PATH_MAX];
1.104 - int errors, fd;
1.105 + int i, errors, fd;
1.106
1.107 /* Create the new next repo file up front to ensure exclusive
1.108 * access. */
1.109 @@ -590,8 +652,15 @@
1.110 unlink(new_path);
1.111 return 1;
1.112 }
1.113 - trans = razor_transaction_create(system, upstream,
1.114 - argc, argv, 0, NULL);
1.115 + trans = razor_transaction_create(system, upstream);
1.116 + for (i = 0; i < argc; i++) {
1.117 + if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
1.118 + fprintf(stderr, "no package matched %s\n", argv[i]);
1.119 + unlink(new_path);
1.120 + return 1;
1.121 + }
1.122 + }
1.123 +
1.124 errors = razor_transaction_describe(trans);
1.125 if (errors) {
1.126 unlink(new_path);
2.1 --- a/razor.c Mon Apr 07 21:32:19 2008 -0400
2.2 +++ b/razor.c Mon Apr 07 23:52:14 2008 -0400
2.3 @@ -1949,39 +1949,6 @@
2.4 }
2.5 }
2.6
2.7 -static void
2.8 -find_all_packages(struct razor_transaction *trans)
2.9 -{
2.10 - struct razor_transaction_package *tp;
2.11 - struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend;
2.12 - const char *spool, *upool;
2.13 -
2.14 - spkgs = trans->system->packages.data;
2.15 - send = trans->system->packages.data + trans->system->packages.size;
2.16 - spool = trans->system->string_pool.data;
2.17 - up = upkgs = trans->upstream->packages.data;
2.18 - uend = trans->upstream->packages.data + trans->upstream->packages.size;
2.19 - upool = trans->upstream->string_pool.data;
2.20 -
2.21 - for (sp = spkgs; sp < send; sp++) {
2.22 - while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0)
2.23 - up++;
2.24 - if (strcmp(&spool[sp->name], &upool[up->name]) == 0 &&
2.25 - versioncmp(&spool[sp->version], &upool[up->version]) < 0) {
2.26 - tp = array_add(&trans->packages, sizeof *tp);
2.27 - memset(tp, 0, sizeof *tp);
2.28 - tp->old_package = sp;
2.29 - tp->new_package = up;
2.30 - tp->name = &upool[up->name];
2.31 - tp->old_version = &spool[sp->version];
2.32 - tp->new_version = &upool[up->version];
2.33 - tp->state = RAZOR_PACKAGE_INSTALL;
2.34 - bitarray_set(&trans->uppkgs, up - upkgs, 1);
2.35 - bitarray_set(&trans->syspkgs, sp - spkgs, 0);
2.36 - }
2.37 - }
2.38 -}
2.39 -
2.40 static int
2.41 provider_satisfies_requirement(struct razor_property *provider,
2.42 const char *provider_strings,
2.43 @@ -2601,39 +2568,74 @@
2.44 }
2.45 }
2.46
2.47 +void
2.48 +razor_transaction_install_package(struct razor_transaction *transaction,
2.49 + struct razor_package *package)
2.50 +{
2.51 + add_transaction_package(transaction, package, NULL,
2.52 + RAZOR_PACKAGE_INSTALL, NULL, NULL);
2.53 +}
2.54 +
2.55 +void
2.56 +razor_transaction_remove_package(struct razor_transaction *transaction,
2.57 + struct razor_package *package)
2.58 +{
2.59 + add_transaction_package(transaction, NULL, package,
2.60 + RAZOR_PACKAGE_REMOVE, NULL, NULL);
2.61 +}
2.62 +
2.63 +void
2.64 +razor_transaction_update_all(struct razor_transaction *trans)
2.65 +{
2.66 + struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend;
2.67 + const char *spool, *upool;
2.68 +
2.69 + spkgs = trans->system->packages.data;
2.70 + send = trans->system->packages.data + trans->system->packages.size;
2.71 + spool = trans->system->string_pool.data;
2.72 + up = upkgs = trans->upstream->packages.data;
2.73 + uend = trans->upstream->packages.data + trans->upstream->packages.size;
2.74 + upool = trans->upstream->string_pool.data;
2.75 +
2.76 + for (sp = spkgs; sp < send; sp++) {
2.77 + while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0)
2.78 + up++;
2.79 + if (strcmp(&spool[sp->name], &upool[up->name]) == 0 &&
2.80 + versioncmp(&spool[sp->version], &upool[up->version]) < 0) {
2.81 + add_transaction_package(trans, up, sp,
2.82 + RAZOR_PACKAGE_INSTALL,
2.83 + NULL, NULL);
2.84 + }
2.85 + }
2.86 +}
2.87 +
2.88 struct razor_transaction *
2.89 -razor_transaction_create(struct razor_set *system, struct razor_set *upstream,
2.90 - int update_count, const char **update_packages,
2.91 - int remove_count, const char **remove_packages)
2.92 +razor_transaction_create(struct razor_set *system, struct razor_set *upstream)
2.93 {
2.94 struct razor_transaction *trans;
2.95 - struct razor_transaction_package *tp;
2.96 - int start, end, i;
2.97 + int count;
2.98
2.99 trans = zalloc(sizeof *trans);
2.100
2.101 trans->system = system;
2.102 trans->upstream = upstream ? upstream : razor_set_create();
2.103 array_init(&trans->packages);
2.104 - bitarray_init(&trans->syspkgs, trans->system->packages.size / sizeof (struct razor_package), 1);
2.105 - bitarray_init(&trans->uppkgs, trans->upstream->packages.size / sizeof (struct razor_package), 0);
2.106 - trans->errors = 0;
2.107 -
2.108 - if (update_count > 0 || remove_count > 0) {
2.109 - for (i = 0; i < update_count; i++) {
2.110 - tp = array_add(&trans->packages, sizeof *tp);
2.111 - memset(tp, 0, sizeof *tp);
2.112 - tp->name = update_packages[i];
2.113 - tp->state = RAZOR_PACKAGE_INSTALL;
2.114 - }
2.115 - for (i = 0; i < remove_count; i++) {
2.116 - tp = array_add(&trans->packages, sizeof *tp);
2.117 - memset(tp, 0, sizeof *tp);
2.118 - tp->name = remove_packages[i];
2.119 - tp->state = RAZOR_PACKAGE_REMOVE;
2.120 - }
2.121 - } else
2.122 - find_all_packages(trans);
2.123 + count = trans->system->packages.size / sizeof (struct razor_package);
2.124 + bitarray_init(&trans->syspkgs, count, 1);
2.125 + count = trans->upstream->packages.size / sizeof (struct razor_package);
2.126 + bitarray_init(&trans->uppkgs, count, 0);
2.127 +
2.128 + return trans;
2.129 +}
2.130 +
2.131 +static void
2.132 +resolve_transaction(struct razor_transaction *trans)
2.133 +{
2.134 + int start, end;
2.135 +
2.136 + if (trans->package_count > 0)
2.137 + /* Already did this, return. */
2.138 + return;
2.139
2.140 start = 0;
2.141 end = trans->packages.size / sizeof (struct razor_transaction_package);
2.142 @@ -2650,8 +2652,6 @@
2.143 }
2.144
2.145 trans->package_count = end;
2.146 -
2.147 - return trans;
2.148 }
2.149
2.150 const char * const razor_version_relations[] = {
2.151 @@ -2699,6 +2699,8 @@
2.152 struct razor_transaction_package *p, *pend, *tps;
2.153 int errors_only = 0;
2.154
2.155 + resolve_transaction(trans);
2.156 +
2.157 tps = trans->packages.data;
2.158 pend = trans->packages.data + trans->packages.size;
2.159 for (p = trans->packages.data; p < pend; p++) {
2.160 @@ -2837,6 +2839,8 @@
2.161 {
2.162 struct razor_transaction_package *p, *end;
2.163
2.164 + resolve_transaction(trans);
2.165 +
2.166 end = trans->packages.data + trans->packages.size;
2.167 for (p = trans->packages.data; p < end; p++) {
2.168 if (p->state != RAZOR_PACKAGE_UNSATISFIABLE)
2.169 @@ -2865,6 +2869,8 @@
2.170 struct razor_transaction_package *p, *end;
2.171 int cmp;
2.172
2.173 + resolve_transaction(trans);
2.174 +
2.175 /* FIXME */
2.176 if (trans->errors)
2.177 return NULL;
3.1 --- a/razor.h Mon Apr 07 21:32:19 2008 -0400
3.2 +++ b/razor.h Mon Apr 07 23:52:14 2008 -0400
3.3 @@ -112,9 +112,12 @@
3.4 };
3.5
3.6 struct razor_transaction *
3.7 -razor_transaction_create(struct razor_set *system, struct razor_set *upstream,
3.8 - int update_count, const char **update_packages,
3.9 - int remove_count, const char **remove_packages);
3.10 +razor_transaction_create(struct razor_set *system, struct razor_set *upstream);
3.11 +void razor_transaction_install_package(struct razor_transaction *transaction,
3.12 + struct razor_package *package);
3.13 +void razor_transaction_remove_package(struct razor_transaction *transaction,
3.14 + struct razor_package *package);
3.15 +void razor_transaction_update_all(struct razor_transaction *transaction);
3.16 int razor_transaction_describe(struct razor_transaction *trans);
3.17 struct razor_set *razor_transaction_finish(struct razor_transaction *trans);
3.18 void razor_transaction_destroy(struct razor_transaction *trans);
4.1 --- a/test-driver.c Mon Apr 07 21:32:19 2008 -0400
4.2 +++ b/test-driver.c Mon Apr 07 23:52:14 2008 -0400
4.3 @@ -252,13 +252,21 @@
4.4 static void
4.5 end_transaction(struct test_context *ctx)
4.6 {
4.7 - int errors;
4.8 + struct razor_package *pkg;
4.9 + int errors, i;
4.10
4.11 - ctx->trans = razor_transaction_create(ctx->system_set, ctx->repo_set,
4.12 - ctx->n_install_pkgs,
4.13 - (const char **)ctx->install_pkgs,
4.14 - ctx->n_remove_pkgs,
4.15 - (const char **)ctx->remove_pkgs);
4.16 + ctx->trans = razor_transaction_create(ctx->system_set, ctx->repo_set);
4.17 + for (i = 0; i < ctx->n_install_pkgs; i++) {
4.18 + pkg = razor_set_get_package(ctx->repo_set,
4.19 + ctx->install_pkgs[i]);
4.20 + razor_transaction_install_package(ctx->trans, pkg);
4.21 + }
4.22 + for (i = 0; i < ctx->n_remove_pkgs; i++) {
4.23 + pkg = razor_set_get_package(ctx->repo_set,
4.24 + ctx->remove_pkgs[i]);
4.25 + razor_transaction_remove_package(ctx->trans, pkg);
4.26 + }
4.27 +
4.28 errors = razor_transaction_describe(ctx->trans);
4.29 printf("\n");
4.30