Add very basic support for removing packages
authorJ. Ali Harlow <ali@juiblex.co.uk>
Fri, 1 May 2009 15:48:47 +0000 (16:48 +0100)
committerJ. Ali Harlow <ali@juiblex.co.uk>
Fri, 1 May 2009 15:48:47 +0000 (16:48 +0100)
librazor/razor.c
librazor/razor.h
src/main.c
test/Makefile.am
test/remove.sh [new file with mode: 0755]
test/zsh.spec
test/zsh2.spec [new file with mode: 0644]

index 5bcb60a..8795684 100644 (file)
@@ -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;
index b182629..cbe0f7a 100644 (file)
@@ -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);
index c9fb686..db055be 100644 (file)
@@ -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);
index 29e6b70..f567b95 100644 (file)
@@ -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 (executable)
index 0000000..e08fbb6
--- /dev/null
@@ -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"
index 2e74827..72e0dda 100644 (file)
@@ -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 (file)
index 0000000..c184067
--- /dev/null
@@ -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