}
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;
{
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;
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. */
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);
}
}
-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,
}
}
+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);
}
trans->package_count = end;
-
- return trans;
}
const char * const razor_version_relations[] = {
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++) {
{
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)
struct razor_transaction_package *p, *end;
int cmp;
+ resolve_transaction(trans);
+
/* FIXME */
if (trans->errors)
return NULL;