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
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 {
{ }
};
+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 },
{ }
};
-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, },
{ 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, },
{ 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 },
{ }
};
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++;
}
}
razor_package_iterator_destroy(pi);
+
+ if (errors)
+ exit(1);
}
static struct razor_package_iterator *
}
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;
}
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);
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);
}