From d67faacbf4d1eda443013b802c55e2ce55ceaaea Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 7 Apr 2008 23:52:14 -0400 Subject: [PATCH] Mark package to be installed or removed after creating the transaction. This lets us implement support for fnmatch wildcard and do better error checking. --- main.c | 83 +++++++++++++++++++++++++++++++++++--- razor.c | 124 ++++++++++++++++++++++++++++++--------------------------- razor.h | 9 +++- test-driver.c | 20 ++++++--- 4 files changed, 161 insertions(+), 75 deletions(-) diff --git a/main.c b/main.c index a72d419..23f08c8 100644 --- a/main.c +++ b/main.c @@ -356,17 +356,71 @@ command_validate(int argc, const char *argv[]) } static int +mark_packages_for_update(struct razor_transaction *trans, + struct razor_set *set, const char *pattern) +{ + struct razor_package_iterator *pi; + struct razor_package *package; + const char *name, *version, *arch; + int matches = 0; + + pi = razor_package_iterator_create(set); + while (razor_package_iterator_next(pi, &package, + &name, &version, &arch)) { + if (pattern && fnmatch(pattern, name, 0) == 0) { + razor_transaction_install_package(trans, package); + matches++; + } + } + razor_package_iterator_destroy(pi); + + return matches; +} + +static int +mark_packages_for_removal(struct razor_transaction *trans, + struct razor_set *set, const char *pattern) +{ + struct razor_package_iterator *pi; + struct razor_package *package; + const char *name, *version, *arch; + int matches = 0; + + pi = razor_package_iterator_create(set); + while (razor_package_iterator_next(pi, &package, + &name, &version, &arch)) { + if (pattern && fnmatch(pattern, name, 0) == 0) { + razor_transaction_remove_package(trans, package); + matches++; + } + } + razor_package_iterator_destroy(pi); + + return matches; +} + +static int command_update(int argc, const char *argv[]) { struct razor_set *set, *upstream; struct razor_transaction *trans; - int errors; + int i, errors; set = razor_set_open(repo_filename); upstream = razor_set_open(rawhide_repo_filename); if (set == NULL || upstream == NULL) return 1; - trans = razor_transaction_create(set, upstream, argc, argv, 0, NULL); + + trans = razor_transaction_create(set, upstream); + if (argc == 0) + razor_transaction_update_all(trans); + for (i = 0; i < argc; i++) { + if (mark_packages_for_update(trans, upstream, argv[i]) == 0) { + fprintf(stderr, "no match for %s\n", argv[i]); + return 1; + } + } + errors = razor_transaction_describe(trans); if (errors) return 1; @@ -385,12 +439,20 @@ command_remove(int argc, const char *argv[]) { struct razor_set *set; struct razor_transaction *trans; - int errors; + int i, errors; set = razor_set_open(repo_filename); if (set == NULL) return 1; - trans = razor_transaction_create(set, NULL, 0, NULL, argc, argv); + + trans = razor_transaction_create(set, NULL); + for (i = 0; i < argc; i++) { + if (mark_packages_for_removal(trans, set, argv[i]) == 0) { + fprintf(stderr, "no match for %s\n", argv[i]); + return 1; + } + } + errors = razor_transaction_describe(trans); if (errors) return 1; @@ -564,7 +626,7 @@ command_install(int argc, const char *argv[]) struct razor_set *system, *upstream, *next; struct razor_transaction *trans; char path[PATH_MAX], new_path[PATH_MAX]; - int errors, fd; + int i, errors, fd; /* Create the new next repo file up front to ensure exclusive * access. */ @@ -590,8 +652,15 @@ command_install(int argc, const char *argv[]) unlink(new_path); return 1; } - trans = razor_transaction_create(system, upstream, - argc, argv, 0, NULL); + trans = razor_transaction_create(system, upstream); + for (i = 0; i < argc; i++) { + if (mark_packages_for_update(trans, upstream, argv[i]) == 0) { + fprintf(stderr, "no package matched %s\n", argv[i]); + unlink(new_path); + return 1; + } + } + errors = razor_transaction_describe(trans); if (errors) { unlink(new_path); diff --git a/razor.c b/razor.c index 722f41b..071ceae 100644 --- a/razor.c +++ b/razor.c @@ -1949,39 +1949,6 @@ resolve_new_packages(struct razor_transaction *trans, } } -static void -find_all_packages(struct razor_transaction *trans) -{ - struct razor_transaction_package *tp; - struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend; - const char *spool, *upool; - - spkgs = trans->system->packages.data; - send = trans->system->packages.data + trans->system->packages.size; - spool = trans->system->string_pool.data; - up = upkgs = trans->upstream->packages.data; - uend = trans->upstream->packages.data + trans->upstream->packages.size; - upool = trans->upstream->string_pool.data; - - for (sp = spkgs; sp < send; sp++) { - while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0) - up++; - if (strcmp(&spool[sp->name], &upool[up->name]) == 0 && - versioncmp(&spool[sp->version], &upool[up->version]) < 0) { - tp = array_add(&trans->packages, sizeof *tp); - memset(tp, 0, sizeof *tp); - tp->old_package = sp; - tp->new_package = up; - tp->name = &upool[up->name]; - tp->old_version = &spool[sp->version]; - tp->new_version = &upool[up->version]; - tp->state = RAZOR_PACKAGE_INSTALL; - bitarray_set(&trans->uppkgs, up - upkgs, 1); - bitarray_set(&trans->syspkgs, sp - spkgs, 0); - } - } -} - static int provider_satisfies_requirement(struct razor_property *provider, const char *provider_strings, @@ -2601,39 +2568,74 @@ razor_transaction_satisfy(struct razor_transaction *trans) } } +void +razor_transaction_install_package(struct razor_transaction *transaction, + struct razor_package *package) +{ + add_transaction_package(transaction, package, NULL, + RAZOR_PACKAGE_INSTALL, NULL, NULL); +} + +void +razor_transaction_remove_package(struct razor_transaction *transaction, + struct razor_package *package) +{ + add_transaction_package(transaction, NULL, package, + RAZOR_PACKAGE_REMOVE, NULL, NULL); +} + +void +razor_transaction_update_all(struct razor_transaction *trans) +{ + struct razor_package *sp, *spkgs, *send, *up, *upkgs, *uend; + const char *spool, *upool; + + spkgs = trans->system->packages.data; + send = trans->system->packages.data + trans->system->packages.size; + spool = trans->system->string_pool.data; + up = upkgs = trans->upstream->packages.data; + uend = trans->upstream->packages.data + trans->upstream->packages.size; + upool = trans->upstream->string_pool.data; + + for (sp = spkgs; sp < send; sp++) { + while (up < uend && strcmp(&spool[sp->name], &upool[up->name]) > 0) + up++; + if (strcmp(&spool[sp->name], &upool[up->name]) == 0 && + versioncmp(&spool[sp->version], &upool[up->version]) < 0) { + add_transaction_package(trans, up, sp, + RAZOR_PACKAGE_INSTALL, + NULL, NULL); + } + } +} + struct razor_transaction * -razor_transaction_create(struct razor_set *system, struct razor_set *upstream, - int update_count, const char **update_packages, - int remove_count, const char **remove_packages) +razor_transaction_create(struct razor_set *system, struct razor_set *upstream) { struct razor_transaction *trans; - struct razor_transaction_package *tp; - int start, end, i; + int count; trans = zalloc(sizeof *trans); trans->system = system; trans->upstream = upstream ? upstream : razor_set_create(); array_init(&trans->packages); - bitarray_init(&trans->syspkgs, trans->system->packages.size / sizeof (struct razor_package), 1); - bitarray_init(&trans->uppkgs, trans->upstream->packages.size / sizeof (struct razor_package), 0); - trans->errors = 0; - - if (update_count > 0 || remove_count > 0) { - for (i = 0; i < update_count; i++) { - tp = array_add(&trans->packages, sizeof *tp); - memset(tp, 0, sizeof *tp); - tp->name = update_packages[i]; - tp->state = RAZOR_PACKAGE_INSTALL; - } - for (i = 0; i < remove_count; i++) { - tp = array_add(&trans->packages, sizeof *tp); - memset(tp, 0, sizeof *tp); - tp->name = remove_packages[i]; - tp->state = RAZOR_PACKAGE_REMOVE; - } - } else - find_all_packages(trans); + count = trans->system->packages.size / sizeof (struct razor_package); + bitarray_init(&trans->syspkgs, count, 1); + count = trans->upstream->packages.size / sizeof (struct razor_package); + bitarray_init(&trans->uppkgs, count, 0); + + return trans; +} + +static void +resolve_transaction(struct razor_transaction *trans) +{ + int start, end; + + if (trans->package_count > 0) + /* Already did this, return. */ + return; start = 0; end = trans->packages.size / sizeof (struct razor_transaction_package); @@ -2650,8 +2652,6 @@ razor_transaction_create(struct razor_set *system, struct razor_set *upstream, } trans->package_count = end; - - return trans; } const char * const razor_version_relations[] = { @@ -2699,6 +2699,8 @@ razor_transaction_describe(struct razor_transaction *trans) struct razor_transaction_package *p, *pend, *tps; int errors_only = 0; + resolve_transaction(trans); + tps = trans->packages.data; pend = trans->packages.data + trans->packages.size; for (p = trans->packages.data; p < pend; p++) { @@ -2837,6 +2839,8 @@ razor_transaction_unsatisfied_property(struct razor_transaction *trans, { struct razor_transaction_package *p, *end; + resolve_transaction(trans); + end = trans->packages.data + trans->packages.size; for (p = trans->packages.data; p < end; p++) { if (p->state != RAZOR_PACKAGE_UNSATISFIABLE) @@ -2865,6 +2869,8 @@ razor_transaction_finish(struct razor_transaction *trans) struct razor_transaction_package *p, *end; int cmp; + resolve_transaction(trans); + /* FIXME */ if (trans->errors) return NULL; diff --git a/razor.h b/razor.h index 62e8e5f..b64d661 100644 --- a/razor.h +++ b/razor.h @@ -112,9 +112,12 @@ enum razor_transaction_package_state { }; struct razor_transaction * -razor_transaction_create(struct razor_set *system, struct razor_set *upstream, - int update_count, const char **update_packages, - int remove_count, const char **remove_packages); +razor_transaction_create(struct razor_set *system, struct razor_set *upstream); +void razor_transaction_install_package(struct razor_transaction *transaction, + struct razor_package *package); +void razor_transaction_remove_package(struct razor_transaction *transaction, + struct razor_package *package); +void razor_transaction_update_all(struct razor_transaction *transaction); int razor_transaction_describe(struct razor_transaction *trans); struct razor_set *razor_transaction_finish(struct razor_transaction *trans); void razor_transaction_destroy(struct razor_transaction *trans); diff --git a/test-driver.c b/test-driver.c index c94b48e..2bdc3e6 100644 --- a/test-driver.c +++ b/test-driver.c @@ -252,13 +252,21 @@ start_transaction(struct test_context *ctx, const char **atts) static void end_transaction(struct test_context *ctx) { - int errors; + struct razor_package *pkg; + int errors, i; + + ctx->trans = razor_transaction_create(ctx->system_set, ctx->repo_set); + for (i = 0; i < ctx->n_install_pkgs; i++) { + pkg = razor_set_get_package(ctx->repo_set, + ctx->install_pkgs[i]); + razor_transaction_install_package(ctx->trans, pkg); + } + for (i = 0; i < ctx->n_remove_pkgs; i++) { + pkg = razor_set_get_package(ctx->repo_set, + ctx->remove_pkgs[i]); + razor_transaction_remove_package(ctx->trans, pkg); + } - ctx->trans = razor_transaction_create(ctx->system_set, ctx->repo_set, - ctx->n_install_pkgs, - (const char **)ctx->install_pkgs, - ctx->n_remove_pkgs, - (const char **)ctx->remove_pkgs); errors = razor_transaction_describe(ctx->trans); printf("\n"); -- 1.7.1