#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+static int
+update_packages(struct razor_set *system, struct razor_set *next,
+ struct razor_relocations *relocations);
+
static struct razor_package_iterator *
create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
{
static int
command_remove(int argc, const char *argv[])
{
- struct razor_set *set, *upstream;
+ struct razor_root *root;
+ struct razor_set *system, *upstream, *next;
struct razor_transaction *trans;
int i, errors;
- set = razor_root_open_read_only(install_root);
- if (set == NULL)
+ root = razor_root_open(install_root);
+ system = razor_root_get_system_set(root);
+ if (system == NULL) {
+ razor_root_close(root);
return 1;
+ }
- upstream = razor_set_create();
- trans = razor_transaction_create(set, upstream);
+ upstream = razor_set_create_without_root();
+ trans = razor_transaction_create(system, upstream);
for (i = 0; i < argc; i++) {
- if (mark_packages_for_removal(trans, set, argv[i]) == 0) {
+ if (mark_packages_for_removal(trans, system, argv[i]) == 0) {
fprintf(stderr, "no match for %s\n", argv[i]);
+ razor_transaction_destroy(trans);
+ razor_set_destroy(upstream);
+ razor_root_close(root);
return 1;
}
}
razor_transaction_resolve(trans);
errors = razor_transaction_describe(trans);
- if (errors)
+ if (errors) {
+ razor_transaction_destroy(trans);
+ razor_set_destroy(upstream);
+ razor_root_close(root);
return 1;
+ }
- set = razor_transaction_finish(trans);
- razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
- razor_set_destroy(set);
+ next = razor_transaction_finish(trans);
+ update_packages(system, next, NULL);
+ razor_root_update(root, next);
+
+ razor_set_destroy(next);
razor_set_destroy(upstream);
- printf("wrote system-updated.rzdb\n");
- return 0;
+ return razor_root_commit(root);
}
static void
}
static int
-install_packages(struct razor_set *system, struct razor_set *next,
- struct razor_relocations *relocations)
+install_package(struct razor_set *set, struct razor_package *package,
+ struct razor_relocations *relocations)
{
- struct razor_install_iterator *ii;
- struct razor_package *package;
- struct razor_set *set;
- enum razor_install_action action;
- struct razor_rpm *rpm;
+ int retval;
const char *name, *version, *arch;
char file[PATH_MAX];
- int count;
+ struct razor_rpm *rpm;
- ii = razor_set_create_install_iterator(system, next);
- while (razor_install_iterator_next(ii, &set, &package,
- &action, &count)) {
- if (action == RAZOR_INSTALL_ACTION_REMOVE)
- continue;
+ razor_package_get_details(set, package,
+ RAZOR_DETAIL_NAME, &name,
+ RAZOR_DETAIL_VERSION, &version,
+ RAZOR_DETAIL_ARCH, &arch,
+ RAZOR_DETAIL_LAST);
- razor_package_get_details(set, package,
- RAZOR_DETAIL_NAME, &name,
- RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch,
- RAZOR_DETAIL_LAST);
+ printf("install %s-%s\n", name, version);
- printf("install %s-%s\n", name, version);
+ snprintf(file, sizeof file,
+ "rpms/%s", rpm_filename(name, version, arch));
+ rpm = razor_rpm_open(file);
+ if (rpm == NULL) {
+ fprintf(stderr, "failed to open rpm %s\n", file);
+ return -1;
+ }
+ if (relocations)
+ razor_rpm_set_relocations(rpm, relocations);
+ retval = razor_rpm_install(rpm, install_root);
+ if (retval < 0)
+ fprintf(stderr, "failed to install rpm %s\n", file);
+ razor_rpm_close(rpm);
+ return retval;
+}
- snprintf(file, sizeof file,
- "rpms/%s", rpm_filename(name, version, arch));
- rpm = razor_rpm_open(file);
- if (rpm == NULL) {
- fprintf(stderr, "failed to open rpm %s\n", file);
- return -1;
- }
- if (relocations)
- razor_rpm_set_relocations(rpm, relocations);
- if (razor_rpm_install(rpm, install_root) < 0) {
- fprintf(stderr,
- "failed to install rpm %s\n", file);
- return -1;
+static int
+remove_package(struct razor_set *set, struct razor_package *package)
+{
+ struct razor_file_iterator *fi;
+ struct razor_package_iterator *pi;
+ struct razor_package *p;
+ char buffer[PATH_MAX];
+ const char *name;
+ int retval = 0, count;
+
+ fi = razor_file_iterator_create(set, package);
+
+ while (!retval && razor_file_iterator_next(fi, &name)) {
+ pi = razor_package_iterator_create_for_file(set, name);
+ count = 0;
+ while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
+ count++;
+ razor_package_iterator_destroy(pi);
+ if (count <= 1) {
+ snprintf(buffer, sizeof buffer, "%s%s", install_root,
+ name);
+ retval = remove(buffer);
}
- razor_rpm_close(rpm);
+ }
+
+ razor_file_iterator_destroy(fi);
+ return retval;
+}
+
+static int
+update_packages(struct razor_set *system, struct razor_set *next,
+ struct razor_relocations *relocations)
+{
+ struct razor_install_iterator *ii;
+ struct razor_package *package;
+ struct razor_set *set;
+ enum razor_install_action action;
+ int retval = 0, count;
+
+ ii = razor_set_create_install_iterator(system, next);
+ while (!retval && razor_install_iterator_next(ii, &set, &package,
+ &action, &count)) {
+ if (action == RAZOR_INSTALL_ACTION_ADD)
+ retval = install_package(set, package, relocations);
+ else if (action == RAZOR_INSTALL_ACTION_REMOVE)
+ retval = remove_package(set, package);
}
razor_install_iterator_destroy(ii);
- return 0;
+ return retval;
}
static int
return 1;
}
- install_packages(system, next, relocations);
+ update_packages(system, next, relocations);
if (relocations)
razor_relocations_destroy(relocations);
--- /dev/null
+#!/bin/sh
+check_file()
+{
+ ../src/razor list-files | grep -x "$1" > /dev/null
+ if [ $? -ne 0 ]; then
+ echo $1: Not in database >&2
+ ../src/razor list-files >&2
+ exit 1
+ fi
+ ../src/razor list-files "$1" | grep -x "$1" > /dev/null
+ if [ $? -ne 0 ]; then
+ echo $1: Not seen by patterned list >&2
+ ../src/razor list-files "$1" >&2
+ exit 1
+ fi
+ pkgs=`../src/razor list-file-packages "$1"`
+ if [ -z "$pkgs" ]; then
+ echo $1: Not owned by any package >&2
+ ../src/razor list-file-packages "$1"
+ exit 1
+ fi
+ for nevra in "$pkgs"; do
+ name=`echo $nevra | sed 's/\-.*$//'`
+ ../src/razor list-package-files "$name" | grep -x "$1" > /dev/null
+ if [ $? -ne 0 ]; then
+ echo $1: Not in database for package $name >&2
+ ../src/razor list-package-files "$name"
+ exit 1
+ fi
+ done
+ if [ ! -e "$RAZOR_ROOT$1" ]; then
+ echo $1: Not in filesystem >&2
+ exit 1
+ fi
+}
+check_no_file()
+{
+ ../src/razor list-files | grep -x "$1" > /dev/null
+ if [ $? -eq 0 ]; then
+ echo $1: Still in database >&2
+ exit 1
+ fi
+ if [ -e "$RAZOR_ROOT$1" ]; then
+ echo $1: Still in filesystem >&2
+ exit 1
+ fi
+}
+export RAZOR_ROOT=`mktemp -dt` || exit 1
+../src/razor init || exit 1
+export YUM_URL="file://localhost/`pwd`"
+../src/razor import-yum || exit 1
+../src/razor install zip || exit 1
+../src/razor remove zip || exit 1
+check_file /usr/bin/zap
+check_no_file /usr/bin/zip
+../src/razor install zsh || exit 1
+../src/razor install zsh2 || exit 1
+../src/razor remove zsh || exit 1
+check_file /etc/zsh.conf
+check_no_file /usr/bin/zsh
+rm -rf "$RAZOR_ROOT"