razor_transaction_update_package(struct razor_transaction *trans,
struct razor_package *package)
{
- struct razor_package *spkgs;
+ struct razor_package *spkgs, *upkgs, *end;
spkgs = trans->system.set->packages.data;
- trans->system.packages[package - spkgs] |= TRANS_PACKAGE_UPDATE;
+ upkgs = trans->upstream.set->packages.data;
+ end = trans->system.set->packages.data +
+ trans->system.set->packages.size;
+ if (spkgs <= package && package < end)
+ trans->system.packages[package - spkgs] |= TRANS_PACKAGE_UPDATE;
+ else
+ trans->upstream.packages[package - upkgs] |= TRANS_PACKAGE_UPDATE;
}
struct prop_iter {
}
}
+static const char *relation_string[] = { "<", "<=", "=", ">=", ">" };
+
static void
mark_satisfied_requires(struct razor_transaction *trans,
struct transaction_set *rts,
}
}
-static const char *relation_string[] = { "<", "<=", "=", ">=", ">" };
-
static void
mark_all_satisfied_requires(struct razor_transaction *trans)
{
return trans->changes;
}
+static void
+describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
+{
+ struct razor_package_iterator pi;
+ struct razor_package *pkg;
+ 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");
+}
+
void
razor_transaction_describe(struct razor_transaction *trans)
{
struct prop_iter rpi;
struct razor_property *rp;
+ flush_scheduled_system_updates(trans);
+ flush_scheduled_upstream_updates(trans);
+ mark_all_satisfied_requires(trans);
+
prop_iter_init(&rpi, &trans->system);
while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
- fprintf(stderr, "could not satisfy req %s %s %s\n",
- &rpi.pool[rp->name],
- relation_string[rp->relation],
- &rpi.pool[rp->version]);
+ describe_unsatisfied(trans->system.set, rp);
}
prop_iter_init(&rpi, &trans->upstream);
while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
- fprintf(stderr, "could not satisfy req %s %s %s\n",
- &rpi.pool[rp->name],
- relation_string[rp->relation],
- &rpi.pool[rp->version]);
+ describe_unsatisfied(trans->upstream.set, rp);
}
}
razor_transaction_install_package(trans, package);
razor_package_iterator_destroy(pi);
+ razor_transaction_describe(trans);
next = razor_transaction_finish(trans);
razor_set_destroy(set);
razor_set_destroy(upstream);
static void
command_update(int argc, const char *argv[])
{
+ struct razor_set *set, *upstream, *next;
+ struct razor_transaction *trans;
+ struct razor_package_iterator *pi;
+ struct razor_package *package;
+ const char *name, *version, *arch;
+
if (argc == 0) {
printf("no packages given for update\n");
exit(1);
}
- printf("command update - not implemented\n");
+ set = razor_set_open(repo_filename);
+ upstream = create_set_from_command_line(argc, argv);
+
+ trans = razor_transaction_create(set, upstream);
+
+ pi = razor_package_iterator_create(upstream);
+ while (razor_package_iterator_next(pi, &package,
+ &name, &version, &arch))
+ razor_transaction_update_package(trans, package);
+ razor_package_iterator_destroy(pi);
+
+ razor_transaction_describe(trans);
+ next = razor_transaction_finish(trans);
+ razor_set_destroy(set);
+ razor_set_destroy(upstream);
+
+ razor_set_destroy(next);
}
static int