summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-06-15 22:33:15 -0400
committerKristian Høgsberg <krh@redhat.com>2008-06-15 22:33:15 -0400
commitd0effd8fe00f7e7194398a73a5e24e24d822d4de (patch)
treedd7240282c37eb107c50c2f51c07f0f1052da727
parent9467facac39f69bb70fd474757b8aa5612076c8d (diff)
Use depsolver to verify rpm -e, flush out more options.
-rw-r--r--main.c6
-rw-r--r--razor.c43
-rw-r--r--razor.h2
-rw-r--r--rpm-razor.c52
4 files changed, 76 insertions, 27 deletions
diff --git a/main.c b/main.c
index b261c10..c8488e0 100644
--- a/main.c
+++ b/main.c
@@ -446,7 +446,7 @@ command_update(int argc, const char *argv[])
static int
command_remove(int argc, const char *argv[])
{
- struct razor_set *set;
+ struct razor_set *set, *upstream;
struct razor_transaction *trans;
int i, errors;
@@ -454,7 +454,8 @@ command_remove(int argc, const char *argv[])
if (set == NULL)
return 1;
- trans = razor_transaction_create(set, NULL);
+ upstream = razor_set_create();
+ trans = razor_transaction_create(set, upstream);
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]);
@@ -469,6 +470,7 @@ command_remove(int argc, const char *argv[])
set = razor_transaction_finish(trans);
razor_set_write(set, updated_repo_filename);
razor_set_destroy(set);
+ razor_set_destroy(upstream);
printf("wrote system-updated.repo\n");
return 0;
diff --git a/razor.c b/razor.c
index 52cab91..b74f3dd 100644
--- a/razor.c
+++ b/razor.c
@@ -2391,39 +2391,54 @@ describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
const char *name, *version, *arch, *pool;
pool = set->string_pool.data;
- fprintf(stderr, "could not satisfy %s %s %s, required by",
- &pool[rp->name],
- relation_string[rp->relation],
- &pool[rp->version]);
-
- razor_package_iterator_init_for_property(&pi, set, rp);
- while (razor_package_iterator_next(&pi, &pkg, &name, &version, &arch))
- fprintf(stderr, " %s-%s", name, version);
-
- fprintf(stderr, "\n");
+ if (pool[rp->version] == '\0') {
+ razor_package_iterator_init_for_property(&pi, set, rp);
+ while (razor_package_iterator_next(&pi, &pkg,
+ &name, &version, &arch))
+ fprintf(stderr, "%s is needed by %s-%s.%s\n",
+ &pool[rp->name],
+ name, version, arch);
+ } else {
+ razor_package_iterator_init_for_property(&pi, set, rp);
+ while (razor_package_iterator_next(&pi, &pkg,
+ &name, &version, &arch))
+ fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
+ &pool[rp->name],
+ relation_string[rp->relation],
+ &pool[rp->version],
+ name, version, arch);
+ }
}
-void
+int
razor_transaction_describe(struct razor_transaction *trans)
{
struct prop_iter rpi;
struct razor_property *rp;
+ int unsatisfied;
flush_scheduled_system_updates(trans);
flush_scheduled_upstream_updates(trans);
mark_all_satisfied_requires(trans);
+ unsatisfied = 0;
prop_iter_init(&rpi, &trans->system);
while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
- if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
+ if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
describe_unsatisfied(trans->system.set, rp);
+ unsatisfied++;
+ }
}
prop_iter_init(&rpi, &trans->upstream);
while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
- if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
+ if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
describe_unsatisfied(trans->upstream.set, rp);
+ unsatisfied++;
+ }
}
+
+ return unsatisfied;
}
int
@@ -2518,8 +2533,6 @@ razor_transaction_destroy(struct razor_transaction *trans)
transaction_set_release(&trans->system);
transaction_set_release(&trans->upstream);
free(trans);
-
- /* FIXME: free upstream if it was created as an empty set */
}
struct razor_package_query {
diff --git a/razor.h b/razor.h
index aa1794f..4f2cc05 100644
--- a/razor.h
+++ b/razor.h
@@ -118,7 +118,7 @@ void razor_transaction_update_package(struct razor_transaction *trans,
struct razor_package *package);
void razor_transaction_update_all(struct razor_transaction *transaction);
int razor_transaction_resolve(struct razor_transaction *trans);
-void razor_transaction_describe(struct razor_transaction *trans);
+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/rpm-razor.c b/rpm-razor.c
index 21abd9c..4727a5f 100644
--- a/rpm-razor.c
+++ b/rpm-razor.c
@@ -73,10 +73,12 @@ static const struct option query_options[] = {
{ }
};
+static int option_nodeps;
+
static const struct option verify_options[] = {
{ OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL },
{ OPTION_BOOL, "nofiles", 0, NULL, "don't verify files in package", NULL },
- { OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", NULL },
+ { OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", &option_nodeps },
{ OPTION_BOOL, "noscript", 0, NULL, "don't execute verify script(s)", NULL, },
{ OPTION_BOOL, "all", 'a', NULL, "query/verify all packages", &option_all },
{ OPTION_BOOL, "file", 'f', NULL, "query/verify package(s) owning file", NULL },
@@ -125,7 +127,8 @@ static const struct option database_options[] = {
{ }
};
-static int option_erase, option_install, option_upgrade;
+static int option_erase, option_install, option_upgrade, option_justdb;
+static int option_test;
static const struct option install_options[] = {
{ OPTION_BOOL, "aid", 0, NULL, "add suggested packages to transaction", NULL, },
@@ -143,8 +146,8 @@ static const struct option install_options[] = {
{ OPTION_BOOL, "ignoreos", 0, NULL, "don't verify package operating system", NULL, },
{ OPTION_BOOL, "ignoresize", 0, NULL, "don't check disk space before installing", NULL },
{ OPTION_BOOL, "install", 'i', NULL, "install package(s)", &option_install },
- { OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", NULL, },
- { OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", NULL, },
+ { OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", &option_justdb, },
+ { OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", &option_nodeps, },
{ OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL, },
{ OPTION_BOOL, "nocontexts", 0, NULL, "don't install file security contexts", NULL, },
{ OPTION_BOOL, "noorder", 0, NULL, "do not reorder package installation to satisfy dependencies", NULL, },
@@ -158,7 +161,7 @@ static const struct option install_options[] = {
{ OPTION_BOOL, "repackage", 0, NULL, "save erased package files by repackaging", NULL, },
{ OPTION_BOOL, "replacefiles", 0, NULL, "ignore file conflicts between packages", NULL, },
{ OPTION_BOOL, "replacepkgs", 0, NULL, "reinstall if the package is already present", NULL, },
- { OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", NULL },
+ { OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", &option_test },
{ OPTION_BOOL, "upgrade", 'U', "<packagefile>+", "upgrade package(s)", &option_upgrade },
{ }
};
@@ -298,17 +301,20 @@ add_command_line_packages(struct razor_set *set,
struct razor_package *package;
struct razor_package_iterator *pi;
const char *name, *version, *arch;
- int i, cmp;
+ int i, cmp, errors;
qsort(argv, argc, sizeof(*argv), strcmpp);
i = 0;
+ errors = 0;
pi = razor_package_iterator_create(set);
while (razor_package_iterator_next(pi, &package,
&name, &version, &arch)) {
while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
- printf("package %s is not installed\n", argv[i]);
+ fprintf(stderr, "error: package %s is not installed\n",
+ argv[i]);
+ errors++;
i++;
}
@@ -319,6 +325,9 @@ add_command_line_packages(struct razor_set *set,
}
razor_package_iterator_destroy(pi);
+
+ if (errors)
+ exit(1);
}
static struct razor_package_iterator *
@@ -500,9 +509,18 @@ command_verify(int argc, const char *argv[])
}
static void
+remove_package(const char *name,
+ const char *old_version, const char *new_version,
+ const char *arch, void *data)
+{
+ if (old_version)
+ printf("remove %s-%s.%s\n", name, old_version, arch);
+}
+
+static void
command_erase(int argc, const char *argv[])
{
- struct razor_set *set, *next;
+ struct razor_set *set, *upstream, *next;
struct razor_transaction *trans;
struct razor_package_query *query;
struct razor_package_iterator *pi;
@@ -515,8 +533,9 @@ command_erase(int argc, const char *argv[])
}
set = razor_set_open(repo_filename);
+ upstream = razor_set_create();
- trans = razor_transaction_create(set, NULL);
+ trans = razor_transaction_create(set, upstream);
query = razor_package_query_create(set);
add_command_line_packages(set, query, argc, argv);
@@ -527,8 +546,23 @@ command_erase(int argc, const char *argv[])
razor_transaction_remove_package(trans, package);
razor_package_iterator_destroy(pi);
+ if (!option_nodeps) {
+ if (razor_transaction_describe(trans) > 0) {
+ printf("unsatisfied dependencies.\n");
+ exit(1);
+ }
+ }
+
+ if (option_test)
+ exit(0);
+
next = razor_transaction_finish(trans);
+
+ if (!option_justdb)
+ razor_set_diff(set, next, remove_package, NULL);
+
razor_set_destroy(set);
+ razor_set_destroy(upstream);
razor_set_destroy(next);
}