Use depsolver to verify rpm -e, flush out more options.
1.1 --- a/main.c Mon Jun 09 23:51:52 2008 -0400
1.2 +++ b/main.c Sun Jun 15 22:33:15 2008 -0400
1.3 @@ -446,7 +446,7 @@
1.4 static int
1.5 command_remove(int argc, const char *argv[])
1.6 {
1.7 - struct razor_set *set;
1.8 + struct razor_set *set, *upstream;
1.9 struct razor_transaction *trans;
1.10 int i, errors;
1.11
1.12 @@ -454,7 +454,8 @@
1.13 if (set == NULL)
1.14 return 1;
1.15
1.16 - trans = razor_transaction_create(set, NULL);
1.17 + upstream = razor_set_create();
1.18 + trans = razor_transaction_create(set, upstream);
1.19 for (i = 0; i < argc; i++) {
1.20 if (mark_packages_for_removal(trans, set, argv[i]) == 0) {
1.21 fprintf(stderr, "no match for %s\n", argv[i]);
1.22 @@ -469,6 +470,7 @@
1.23 set = razor_transaction_finish(trans);
1.24 razor_set_write(set, updated_repo_filename);
1.25 razor_set_destroy(set);
1.26 + razor_set_destroy(upstream);
1.27 printf("wrote system-updated.repo\n");
1.28
1.29 return 0;
2.1 --- a/razor.c Mon Jun 09 23:51:52 2008 -0400
2.2 +++ b/razor.c Sun Jun 15 22:33:15 2008 -0400
2.3 @@ -2391,39 +2391,54 @@
2.4 const char *name, *version, *arch, *pool;
2.5
2.6 pool = set->string_pool.data;
2.7 - fprintf(stderr, "could not satisfy %s %s %s, required by",
2.8 - &pool[rp->name],
2.9 - relation_string[rp->relation],
2.10 - &pool[rp->version]);
2.11 -
2.12 - razor_package_iterator_init_for_property(&pi, set, rp);
2.13 - while (razor_package_iterator_next(&pi, &pkg, &name, &version, &arch))
2.14 - fprintf(stderr, " %s-%s", name, version);
2.15 -
2.16 - fprintf(stderr, "\n");
2.17 + if (pool[rp->version] == '\0') {
2.18 + razor_package_iterator_init_for_property(&pi, set, rp);
2.19 + while (razor_package_iterator_next(&pi, &pkg,
2.20 + &name, &version, &arch))
2.21 + fprintf(stderr, "%s is needed by %s-%s.%s\n",
2.22 + &pool[rp->name],
2.23 + name, version, arch);
2.24 + } else {
2.25 + razor_package_iterator_init_for_property(&pi, set, rp);
2.26 + while (razor_package_iterator_next(&pi, &pkg,
2.27 + &name, &version, &arch))
2.28 + fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
2.29 + &pool[rp->name],
2.30 + relation_string[rp->relation],
2.31 + &pool[rp->version],
2.32 + name, version, arch);
2.33 + }
2.34 }
2.35
2.36 -void
2.37 +int
2.38 razor_transaction_describe(struct razor_transaction *trans)
2.39 {
2.40 struct prop_iter rpi;
2.41 struct razor_property *rp;
2.42 + int unsatisfied;
2.43
2.44 flush_scheduled_system_updates(trans);
2.45 flush_scheduled_upstream_updates(trans);
2.46 mark_all_satisfied_requires(trans);
2.47
2.48 + unsatisfied = 0;
2.49 prop_iter_init(&rpi, &trans->system);
2.50 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
2.51 - if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
2.52 + if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
2.53 describe_unsatisfied(trans->system.set, rp);
2.54 + unsatisfied++;
2.55 + }
2.56 }
2.57
2.58 prop_iter_init(&rpi, &trans->upstream);
2.59 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
2.60 - if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
2.61 + if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
2.62 describe_unsatisfied(trans->upstream.set, rp);
2.63 + unsatisfied++;
2.64 + }
2.65 }
2.66 +
2.67 + return unsatisfied;
2.68 }
2.69
2.70 int
2.71 @@ -2518,8 +2533,6 @@
2.72 transaction_set_release(&trans->system);
2.73 transaction_set_release(&trans->upstream);
2.74 free(trans);
2.75 -
2.76 - /* FIXME: free upstream if it was created as an empty set */
2.77 }
2.78
2.79 struct razor_package_query {
3.1 --- a/razor.h Mon Jun 09 23:51:52 2008 -0400
3.2 +++ b/razor.h Sun Jun 15 22:33:15 2008 -0400
3.3 @@ -118,7 +118,7 @@
3.4 struct razor_package *package);
3.5 void razor_transaction_update_all(struct razor_transaction *transaction);
3.6 int razor_transaction_resolve(struct razor_transaction *trans);
3.7 -void razor_transaction_describe(struct razor_transaction *trans);
3.8 +int razor_transaction_describe(struct razor_transaction *trans);
3.9 struct razor_set *razor_transaction_finish(struct razor_transaction *trans);
3.10 void razor_transaction_destroy(struct razor_transaction *trans);
3.11
4.1 --- a/rpm-razor.c Mon Jun 09 23:51:52 2008 -0400
4.2 +++ b/rpm-razor.c Sun Jun 15 22:33:15 2008 -0400
4.3 @@ -73,10 +73,12 @@
4.4 { }
4.5 };
4.6
4.7 +static int option_nodeps;
4.8 +
4.9 static const struct option verify_options[] = {
4.10 { OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL },
4.11 { OPTION_BOOL, "nofiles", 0, NULL, "don't verify files in package", NULL },
4.12 - { OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", NULL },
4.13 + { OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", &option_nodeps },
4.14 { OPTION_BOOL, "noscript", 0, NULL, "don't execute verify script(s)", NULL, },
4.15 { OPTION_BOOL, "all", 'a', NULL, "query/verify all packages", &option_all },
4.16 { OPTION_BOOL, "file", 'f', NULL, "query/verify package(s) owning file", NULL },
4.17 @@ -125,7 +127,8 @@
4.18 { }
4.19 };
4.20
4.21 -static int option_erase, option_install, option_upgrade;
4.22 +static int option_erase, option_install, option_upgrade, option_justdb;
4.23 +static int option_test;
4.24
4.25 static const struct option install_options[] = {
4.26 { OPTION_BOOL, "aid", 0, NULL, "add suggested packages to transaction", NULL, },
4.27 @@ -143,8 +146,8 @@
4.28 { OPTION_BOOL, "ignoreos", 0, NULL, "don't verify package operating system", NULL, },
4.29 { OPTION_BOOL, "ignoresize", 0, NULL, "don't check disk space before installing", NULL },
4.30 { OPTION_BOOL, "install", 'i', NULL, "install package(s)", &option_install },
4.31 - { OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", NULL, },
4.32 - { OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", NULL, },
4.33 + { OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", &option_justdb, },
4.34 + { OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", &option_nodeps, },
4.35 { OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL, },
4.36 { OPTION_BOOL, "nocontexts", 0, NULL, "don't install file security contexts", NULL, },
4.37 { OPTION_BOOL, "noorder", 0, NULL, "do not reorder package installation to satisfy dependencies", NULL, },
4.38 @@ -158,7 +161,7 @@
4.39 { OPTION_BOOL, "repackage", 0, NULL, "save erased package files by repackaging", NULL, },
4.40 { OPTION_BOOL, "replacefiles", 0, NULL, "ignore file conflicts between packages", NULL, },
4.41 { OPTION_BOOL, "replacepkgs", 0, NULL, "reinstall if the package is already present", NULL, },
4.42 - { OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", NULL },
4.43 + { OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", &option_test },
4.44 { OPTION_BOOL, "upgrade", 'U', "<packagefile>+", "upgrade package(s)", &option_upgrade },
4.45 { }
4.46 };
4.47 @@ -298,17 +301,20 @@
4.48 struct razor_package *package;
4.49 struct razor_package_iterator *pi;
4.50 const char *name, *version, *arch;
4.51 - int i, cmp;
4.52 + int i, cmp, errors;
4.53
4.54 qsort(argv, argc, sizeof(*argv), strcmpp);
4.55 i = 0;
4.56 + errors = 0;
4.57
4.58 pi = razor_package_iterator_create(set);
4.59
4.60 while (razor_package_iterator_next(pi, &package,
4.61 &name, &version, &arch)) {
4.62 while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
4.63 - printf("package %s is not installed\n", argv[i]);
4.64 + fprintf(stderr, "error: package %s is not installed\n",
4.65 + argv[i]);
4.66 + errors++;
4.67 i++;
4.68 }
4.69
4.70 @@ -319,6 +325,9 @@
4.71 }
4.72
4.73 razor_package_iterator_destroy(pi);
4.74 +
4.75 + if (errors)
4.76 + exit(1);
4.77 }
4.78
4.79 static struct razor_package_iterator *
4.80 @@ -500,9 +509,18 @@
4.81 }
4.82
4.83 static void
4.84 +remove_package(const char *name,
4.85 + const char *old_version, const char *new_version,
4.86 + const char *arch, void *data)
4.87 +{
4.88 + if (old_version)
4.89 + printf("remove %s-%s.%s\n", name, old_version, arch);
4.90 +}
4.91 +
4.92 +static void
4.93 command_erase(int argc, const char *argv[])
4.94 {
4.95 - struct razor_set *set, *next;
4.96 + struct razor_set *set, *upstream, *next;
4.97 struct razor_transaction *trans;
4.98 struct razor_package_query *query;
4.99 struct razor_package_iterator *pi;
4.100 @@ -515,8 +533,9 @@
4.101 }
4.102
4.103 set = razor_set_open(repo_filename);
4.104 + upstream = razor_set_create();
4.105
4.106 - trans = razor_transaction_create(set, NULL);
4.107 + trans = razor_transaction_create(set, upstream);
4.108
4.109 query = razor_package_query_create(set);
4.110 add_command_line_packages(set, query, argc, argv);
4.111 @@ -527,8 +546,23 @@
4.112 razor_transaction_remove_package(trans, package);
4.113 razor_package_iterator_destroy(pi);
4.114
4.115 + if (!option_nodeps) {
4.116 + if (razor_transaction_describe(trans) > 0) {
4.117 + printf("unsatisfied dependencies.\n");
4.118 + exit(1);
4.119 + }
4.120 + }
4.121 +
4.122 + if (option_test)
4.123 + exit(0);
4.124 +
4.125 next = razor_transaction_finish(trans);
4.126 +
4.127 + if (!option_justdb)
4.128 + razor_set_diff(set, next, remove_package, NULL);
4.129 +
4.130 razor_set_destroy(set);
4.131 + razor_set_destroy(upstream);
4.132
4.133 razor_set_destroy(next);
4.134 }