Mark package to be installed or removed after creating the transaction.
authorKristian Høgsberg <krh@jiraiya.boston.redhat.com>
Tue, 8 Apr 2008 03:52:14 +0000 (23:52 -0400)
committerKristian Høgsberg <krh@jiraiya.boston.redhat.com>
Tue, 8 Apr 2008 03:52:14 +0000 (23:52 -0400)
This lets us implement support for fnmatch wildcard and do
better error checking.

main.c
razor.c
razor.h
test-driver.c

diff --git a/main.c b/main.c
index a72d419..23f08c8 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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);
index c94b48e..2bdc3e6 100644 (file)
@@ -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");