# HG changeset patch # User J. Ali Harlow # Date 1241192927 -3600 # Node ID c75a2d5caae9c56f26e22a4c8b5c27a5fdd2089a # Parent cf88b5df2884385513c4c861aacd4b618a2f7bf6 Add very basic support for removing packages diff -r cf88b5df2884 -r c75a2d5caae9 librazor/razor.c --- a/librazor/razor.c Fri May 01 16:43:37 2009 +0100 +++ b/librazor/razor.c Fri May 01 16:48:47 2009 +0100 @@ -78,17 +78,28 @@ }; RAZOR_EXPORT struct razor_set * +razor_set_create_without_root(void) +{ + struct razor_set *set; + char *empty; + + set = zalloc(sizeof *set); + + empty = array_add(&set->string_pool, 1); + *empty = '\0'; + + return set; +} + +RAZOR_EXPORT struct razor_set * razor_set_create(void) { struct razor_set *set; struct razor_entry *e; - char *empty; - set = zalloc(sizeof *set); + set = razor_set_create_without_root(); e = array_add(&set->files, sizeof *e); - empty = array_add(&set->string_pool, 1); - *empty = '\0'; e->name = 0; e->flags = RAZOR_ENTRY_LAST; e->start = 0; diff -r cf88b5df2884 -r c75a2d5caae9 librazor/razor.h --- a/librazor/razor.h Fri May 01 16:43:37 2009 +0100 +++ b/librazor/razor.h Fri May 01 16:48:47 2009 +0100 @@ -80,6 +80,7 @@ * * Returns: the new #razor_set object. **/ +struct razor_set *razor_set_create_without_root(void); struct razor_set *razor_set_create(void); struct razor_set *razor_set_open(const char *filename); void razor_set_destroy(struct razor_set *set); diff -r cf88b5df2884 -r c75a2d5caae9 src/main.c --- a/src/main.c Fri May 01 16:43:37 2009 +0100 +++ b/src/main.c Fri May 01 16:48:47 2009 +0100 @@ -49,6 +49,10 @@ #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[]) { @@ -561,35 +565,47 @@ 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 @@ -812,51 +828,88 @@ } 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) +{ + int retval; + const char *name, *version, *arch; + char file[PATH_MAX]; + struct razor_rpm *rpm; + + 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); + + 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; +} + +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_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; - struct razor_rpm *rpm; - const char *name, *version, *arch; - char file[PATH_MAX]; - int count; + int retval = 0, count; 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); - - 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); - if (razor_rpm_install(rpm, install_root) < 0) { - fprintf(stderr, - "failed to install rpm %s\n", file); - return -1; - } - razor_rpm_close(rpm); + 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 @@ -949,7 +1002,7 @@ return 1; } - install_packages(system, next, relocations); + update_packages(system, next, relocations); if (relocations) razor_relocations_destroy(relocations); diff -r cf88b5df2884 -r c75a2d5caae9 test/Makefile.am --- a/test/Makefile.am Fri May 01 16:43:37 2009 +0100 +++ b/test/Makefile.am Fri May 01 16:48:47 2009 +0100 @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in -check_SCRIPTS = relocate named-root +check_SCRIPTS = relocate named-root remove if HAVE_LUA check_SCRIPTS += lua endif @@ -11,15 +11,19 @@ named-root: named-root.sh primary.xml.gz cp $(srcdir)/named-root.sh named-root +remove: remove.sh primary.xml.gz + cp $(srcdir)/remove.sh remove + lua: lua.sh primary.xml.gz cp $(srcdir)/lua.sh lua -primary.xml.gz: zsh.spec zip.spec zap.spec filesystem.spec Makefile +primary.xml.gz: zsh.spec zsh2.spec zip.spec zap.spec filesystem.spec Makefile rm -rf rpmbuild rpms repodata mkdir -p rpmbuild/BUILD rpmbuild/RPMS rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zap.spec rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zip.spec rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zsh.spec + rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zsh2.spec rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/filesystem.spec mkdir rpms mv rpmbuild/RPMS/noarch/*.rpm rpms @@ -33,8 +37,10 @@ zap.spec \ zip.spec \ zsh.spec \ + zsh2.spec \ filesystem.spec \ lua.sh \ + remove.sh \ named-root.sh \ relocate.sh diff -r cf88b5df2884 -r c75a2d5caae9 test/remove.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/remove.sh Fri May 01 16:48:47 2009 +0100 @@ -0,0 +1,61 @@ +#!/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" diff -r cf88b5df2884 -r c75a2d5caae9 test/zsh.spec --- a/test/zsh.spec Fri May 01 16:43:37 2009 +0100 +++ b/test/zsh.spec Fri May 01 16:48:47 2009 +0100 @@ -21,7 +21,7 @@ mkdir -p $RPM_BUILD_ROOT/usr/bin mkdir -p $RPM_BUILD_ROOT/etc touch $RPM_BUILD_ROOT/usr/bin/zsh -touch $RPM_BUILD_ROOT/etc/zsh.conf +echo "DEVICE /dev/tty" > $RPM_BUILD_ROOT/etc/zsh.conf %clean diff -r cf88b5df2884 -r c75a2d5caae9 test/zsh2.spec --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/zsh2.spec Fri May 01 16:48:47 2009 +0100 @@ -0,0 +1,30 @@ +Name: zsh2 +Summary: Test package +Group: Test +License: GPL +Version: 1 +Release: 1 +Source: zsh2.tar +BuildArch: noarch +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +Prefix: /usr +Requires: zip + +%description +New and improved test package + +%prep + +%build + +%install +mkdir -p $RPM_BUILD_ROOT/usr/bin +mkdir -p $RPM_BUILD_ROOT/etc +touch $RPM_BUILD_ROOT/usr/bin/zsh2 +echo "DEVICE /dev/tty" > $RPM_BUILD_ROOT/etc/zsh.conf + +%clean + +%files +/usr/bin/zsh2 +/etc/zsh.conf