From: J. Ali Harlow Date: Fri, 1 May 2009 15:48:47 +0000 (+0100) Subject: Add very basic support for removing packages X-Git-Tag: 0.1~15 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=2071b01d98b9d23bf2512415b3f22891d3c9158a;p=razor.git Add very basic support for removing packages --- diff --git a/librazor/razor.c b/librazor/razor.c index 5bcb60a..8795684 100644 --- a/librazor/razor.c +++ b/librazor/razor.c @@ -78,17 +78,28 @@ struct razor_set_section_index razor_details_sections[] = { }; RAZOR_EXPORT struct razor_set * -razor_set_create(void) +razor_set_create_without_root(void) { struct razor_set *set; - struct razor_entry *e; char *empty; set = zalloc(sizeof *set); - e = array_add(&set->files, sizeof *e); 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; + + set = razor_set_create_without_root(); + + e = array_add(&set->files, sizeof *e); e->name = 0; e->flags = RAZOR_ENTRY_LAST; e->start = 0; diff --git a/librazor/razor.h b/librazor/razor.h index b182629..cbe0f7a 100644 --- a/librazor/razor.h +++ b/librazor/razor.h @@ -80,6 +80,7 @@ struct razor_property; * * 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 --git a/src/main.c b/src/main.c index c9fb686..db055be 100644 --- a/src/main.c +++ b/src/main.c @@ -49,6 +49,10 @@ static const char *yum_url; #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 @@ command_update(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 @@ -812,51 +828,88 @@ relocate_packages(struct razor_set *set, struct razor_relocations *relocations) } 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 @@ -949,7 +1002,7 @@ command_install(int argc, const char *argv[]) return 1; } - install_packages(system, next, relocations); + update_packages(system, next, relocations); if (relocations) razor_relocations_destroy(relocations); diff --git a/test/Makefile.am b/test/Makefile.am index 29e6b70..f567b95 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -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 @@ relocate: relocate.sh primary.xml.gz 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 @@ EXTRA_DIST = \ zap.spec \ zip.spec \ zsh.spec \ + zsh2.spec \ filesystem.spec \ lua.sh \ + remove.sh \ named-root.sh \ relocate.sh diff --git a/test/remove.sh b/test/remove.sh new file mode 100755 index 0000000..e08fbb6 --- /dev/null +++ b/test/remove.sh @@ -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 --git a/test/zsh.spec b/test/zsh.spec index 2e74827..72e0dda 100644 --- a/test/zsh.spec +++ b/test/zsh.spec @@ -21,7 +21,7 @@ Test package 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 --git a/test/zsh2.spec b/test/zsh2.spec new file mode 100644 index 0000000..c184067 --- /dev/null +++ b/test/zsh2.spec @@ -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