1.1 --- a/librazor/razor.c Fri May 01 16:43:37 2009 +0100
1.2 +++ b/librazor/razor.c Fri May 01 16:48:47 2009 +0100
1.3 @@ -78,17 +78,28 @@
1.4 };
1.5
1.6 RAZOR_EXPORT struct razor_set *
1.7 +razor_set_create_without_root(void)
1.8 +{
1.9 + struct razor_set *set;
1.10 + char *empty;
1.11 +
1.12 + set = zalloc(sizeof *set);
1.13 +
1.14 + empty = array_add(&set->string_pool, 1);
1.15 + *empty = '\0';
1.16 +
1.17 + return set;
1.18 +}
1.19 +
1.20 +RAZOR_EXPORT struct razor_set *
1.21 razor_set_create(void)
1.22 {
1.23 struct razor_set *set;
1.24 struct razor_entry *e;
1.25 - char *empty;
1.26
1.27 - set = zalloc(sizeof *set);
1.28 + set = razor_set_create_without_root();
1.29
1.30 e = array_add(&set->files, sizeof *e);
1.31 - empty = array_add(&set->string_pool, 1);
1.32 - *empty = '\0';
1.33 e->name = 0;
1.34 e->flags = RAZOR_ENTRY_LAST;
1.35 e->start = 0;
2.1 --- a/librazor/razor.h Fri May 01 16:43:37 2009 +0100
2.2 +++ b/librazor/razor.h Fri May 01 16:48:47 2009 +0100
2.3 @@ -80,6 +80,7 @@
2.4 *
2.5 * Returns: the new #razor_set object.
2.6 **/
2.7 +struct razor_set *razor_set_create_without_root(void);
2.8 struct razor_set *razor_set_create(void);
2.9 struct razor_set *razor_set_open(const char *filename);
2.10 void razor_set_destroy(struct razor_set *set);
3.1 --- a/src/main.c Fri May 01 16:43:37 2009 +0100
3.2 +++ b/src/main.c Fri May 01 16:48:47 2009 +0100
3.3 @@ -49,6 +49,10 @@
3.4
3.5 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
3.6
3.7 +static int
3.8 +update_packages(struct razor_set *system, struct razor_set *next,
3.9 + struct razor_relocations *relocations);
3.10 +
3.11 static struct razor_package_iterator *
3.12 create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
3.13 {
3.14 @@ -561,35 +565,47 @@
3.15 static int
3.16 command_remove(int argc, const char *argv[])
3.17 {
3.18 - struct razor_set *set, *upstream;
3.19 + struct razor_root *root;
3.20 + struct razor_set *system, *upstream, *next;
3.21 struct razor_transaction *trans;
3.22 int i, errors;
3.23
3.24 - set = razor_root_open_read_only(install_root);
3.25 - if (set == NULL)
3.26 + root = razor_root_open(install_root);
3.27 + system = razor_root_get_system_set(root);
3.28 + if (system == NULL) {
3.29 + razor_root_close(root);
3.30 return 1;
3.31 + }
3.32
3.33 - upstream = razor_set_create();
3.34 - trans = razor_transaction_create(set, upstream);
3.35 + upstream = razor_set_create_without_root();
3.36 + trans = razor_transaction_create(system, upstream);
3.37 for (i = 0; i < argc; i++) {
3.38 - if (mark_packages_for_removal(trans, set, argv[i]) == 0) {
3.39 + if (mark_packages_for_removal(trans, system, argv[i]) == 0) {
3.40 fprintf(stderr, "no match for %s\n", argv[i]);
3.41 + razor_transaction_destroy(trans);
3.42 + razor_set_destroy(upstream);
3.43 + razor_root_close(root);
3.44 return 1;
3.45 }
3.46 }
3.47
3.48 razor_transaction_resolve(trans);
3.49 errors = razor_transaction_describe(trans);
3.50 - if (errors)
3.51 + if (errors) {
3.52 + razor_transaction_destroy(trans);
3.53 + razor_set_destroy(upstream);
3.54 + razor_root_close(root);
3.55 return 1;
3.56 + }
3.57
3.58 - set = razor_transaction_finish(trans);
3.59 - razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
3.60 - razor_set_destroy(set);
3.61 + next = razor_transaction_finish(trans);
3.62 + update_packages(system, next, NULL);
3.63 + razor_root_update(root, next);
3.64 +
3.65 + razor_set_destroy(next);
3.66 razor_set_destroy(upstream);
3.67 - printf("wrote system-updated.rzdb\n");
3.68
3.69 - return 0;
3.70 + return razor_root_commit(root);
3.71 }
3.72
3.73 static void
3.74 @@ -812,51 +828,88 @@
3.75 }
3.76
3.77 static int
3.78 -install_packages(struct razor_set *system, struct razor_set *next,
3.79 - struct razor_relocations *relocations)
3.80 +install_package(struct razor_set *set, struct razor_package *package,
3.81 + struct razor_relocations *relocations)
3.82 +{
3.83 + int retval;
3.84 + const char *name, *version, *arch;
3.85 + char file[PATH_MAX];
3.86 + struct razor_rpm *rpm;
3.87 +
3.88 + razor_package_get_details(set, package,
3.89 + RAZOR_DETAIL_NAME, &name,
3.90 + RAZOR_DETAIL_VERSION, &version,
3.91 + RAZOR_DETAIL_ARCH, &arch,
3.92 + RAZOR_DETAIL_LAST);
3.93 +
3.94 + printf("install %s-%s\n", name, version);
3.95 +
3.96 + snprintf(file, sizeof file,
3.97 + "rpms/%s", rpm_filename(name, version, arch));
3.98 + rpm = razor_rpm_open(file);
3.99 + if (rpm == NULL) {
3.100 + fprintf(stderr, "failed to open rpm %s\n", file);
3.101 + return -1;
3.102 + }
3.103 + if (relocations)
3.104 + razor_rpm_set_relocations(rpm, relocations);
3.105 + retval = razor_rpm_install(rpm, install_root);
3.106 + if (retval < 0)
3.107 + fprintf(stderr, "failed to install rpm %s\n", file);
3.108 + razor_rpm_close(rpm);
3.109 + return retval;
3.110 +}
3.111 +
3.112 +static int
3.113 +remove_package(struct razor_set *set, struct razor_package *package)
3.114 +{
3.115 + struct razor_file_iterator *fi;
3.116 + struct razor_package_iterator *pi;
3.117 + struct razor_package *p;
3.118 + char buffer[PATH_MAX];
3.119 + const char *name;
3.120 + int retval = 0, count;
3.121 +
3.122 + fi = razor_file_iterator_create(set, package);
3.123 +
3.124 + while (!retval && razor_file_iterator_next(fi, &name)) {
3.125 + pi = razor_package_iterator_create_for_file(set, name);
3.126 + count = 0;
3.127 + while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
3.128 + count++;
3.129 + razor_package_iterator_destroy(pi);
3.130 + if (count <= 1) {
3.131 + snprintf(buffer, sizeof buffer, "%s%s", install_root,
3.132 + name);
3.133 + retval = remove(buffer);
3.134 + }
3.135 + }
3.136 +
3.137 + razor_file_iterator_destroy(fi);
3.138 + return retval;
3.139 +}
3.140 +
3.141 +static int
3.142 +update_packages(struct razor_set *system, struct razor_set *next,
3.143 + struct razor_relocations *relocations)
3.144 {
3.145 struct razor_install_iterator *ii;
3.146 struct razor_package *package;
3.147 struct razor_set *set;
3.148 enum razor_install_action action;
3.149 - struct razor_rpm *rpm;
3.150 - const char *name, *version, *arch;
3.151 - char file[PATH_MAX];
3.152 - int count;
3.153 + int retval = 0, count;
3.154
3.155 ii = razor_set_create_install_iterator(system, next);
3.156 - while (razor_install_iterator_next(ii, &set, &package,
3.157 - &action, &count)) {
3.158 - if (action == RAZOR_INSTALL_ACTION_REMOVE)
3.159 - continue;
3.160 -
3.161 - razor_package_get_details(set, package,
3.162 - RAZOR_DETAIL_NAME, &name,
3.163 - RAZOR_DETAIL_VERSION, &version,
3.164 - RAZOR_DETAIL_ARCH, &arch,
3.165 - RAZOR_DETAIL_LAST);
3.166 -
3.167 - printf("install %s-%s\n", name, version);
3.168 -
3.169 - snprintf(file, sizeof file,
3.170 - "rpms/%s", rpm_filename(name, version, arch));
3.171 - rpm = razor_rpm_open(file);
3.172 - if (rpm == NULL) {
3.173 - fprintf(stderr, "failed to open rpm %s\n", file);
3.174 - return -1;
3.175 - }
3.176 - if (relocations)
3.177 - razor_rpm_set_relocations(rpm, relocations);
3.178 - if (razor_rpm_install(rpm, install_root) < 0) {
3.179 - fprintf(stderr,
3.180 - "failed to install rpm %s\n", file);
3.181 - return -1;
3.182 - }
3.183 - razor_rpm_close(rpm);
3.184 + while (!retval && razor_install_iterator_next(ii, &set, &package,
3.185 + &action, &count)) {
3.186 + if (action == RAZOR_INSTALL_ACTION_ADD)
3.187 + retval = install_package(set, package, relocations);
3.188 + else if (action == RAZOR_INSTALL_ACTION_REMOVE)
3.189 + retval = remove_package(set, package);
3.190 }
3.191 razor_install_iterator_destroy(ii);
3.192
3.193 - return 0;
3.194 + return retval;
3.195 }
3.196
3.197 static int
3.198 @@ -949,7 +1002,7 @@
3.199 return 1;
3.200 }
3.201
3.202 - install_packages(system, next, relocations);
3.203 + update_packages(system, next, relocations);
3.204
3.205 if (relocations)
3.206 razor_relocations_destroy(relocations);
4.1 --- a/test/Makefile.am Fri May 01 16:43:37 2009 +0100
4.2 +++ b/test/Makefile.am Fri May 01 16:48:47 2009 +0100
4.3 @@ -1,6 +1,6 @@
4.4 ## Process this file with automake to produce Makefile.in
4.5
4.6 -check_SCRIPTS = relocate named-root
4.7 +check_SCRIPTS = relocate named-root remove
4.8 if HAVE_LUA
4.9 check_SCRIPTS += lua
4.10 endif
4.11 @@ -11,15 +11,19 @@
4.12 named-root: named-root.sh primary.xml.gz
4.13 cp $(srcdir)/named-root.sh named-root
4.14
4.15 +remove: remove.sh primary.xml.gz
4.16 + cp $(srcdir)/remove.sh remove
4.17 +
4.18 lua: lua.sh primary.xml.gz
4.19 cp $(srcdir)/lua.sh lua
4.20
4.21 -primary.xml.gz: zsh.spec zip.spec zap.spec filesystem.spec Makefile
4.22 +primary.xml.gz: zsh.spec zsh2.spec zip.spec zap.spec filesystem.spec Makefile
4.23 rm -rf rpmbuild rpms repodata
4.24 mkdir -p rpmbuild/BUILD rpmbuild/RPMS
4.25 rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zap.spec
4.26 rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zip.spec
4.27 rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zsh.spec
4.28 + rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/zsh2.spec
4.29 rpmbuild --define "_topdir `pwd`/rpmbuild" -bb $(srcdir)/filesystem.spec
4.30 mkdir rpms
4.31 mv rpmbuild/RPMS/noarch/*.rpm rpms
4.32 @@ -33,8 +37,10 @@
4.33 zap.spec \
4.34 zip.spec \
4.35 zsh.spec \
4.36 + zsh2.spec \
4.37 filesystem.spec \
4.38 lua.sh \
4.39 + remove.sh \
4.40 named-root.sh \
4.41 relocate.sh
4.42
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
5.2 +++ b/test/remove.sh Fri May 01 16:48:47 2009 +0100
5.3 @@ -0,0 +1,61 @@
5.4 +#!/bin/sh
5.5 +check_file()
5.6 +{
5.7 + ../src/razor list-files | grep -x "$1" > /dev/null
5.8 + if [ $? -ne 0 ]; then
5.9 + echo $1: Not in database >&2
5.10 + ../src/razor list-files >&2
5.11 + exit 1
5.12 + fi
5.13 + ../src/razor list-files "$1" | grep -x "$1" > /dev/null
5.14 + if [ $? -ne 0 ]; then
5.15 + echo $1: Not seen by patterned list >&2
5.16 + ../src/razor list-files "$1" >&2
5.17 + exit 1
5.18 + fi
5.19 + pkgs=`../src/razor list-file-packages "$1"`
5.20 + if [ -z "$pkgs" ]; then
5.21 + echo $1: Not owned by any package >&2
5.22 + ../src/razor list-file-packages "$1"
5.23 + exit 1
5.24 + fi
5.25 + for nevra in "$pkgs"; do
5.26 + name=`echo $nevra | sed 's/\-.*$//'`
5.27 + ../src/razor list-package-files "$name" | grep -x "$1" > /dev/null
5.28 + if [ $? -ne 0 ]; then
5.29 + echo $1: Not in database for package $name >&2
5.30 + ../src/razor list-package-files "$name"
5.31 + exit 1
5.32 + fi
5.33 + done
5.34 + if [ ! -e "$RAZOR_ROOT$1" ]; then
5.35 + echo $1: Not in filesystem >&2
5.36 + exit 1
5.37 + fi
5.38 +}
5.39 +check_no_file()
5.40 +{
5.41 + ../src/razor list-files | grep -x "$1" > /dev/null
5.42 + if [ $? -eq 0 ]; then
5.43 + echo $1: Still in database >&2
5.44 + exit 1
5.45 + fi
5.46 + if [ -e "$RAZOR_ROOT$1" ]; then
5.47 + echo $1: Still in filesystem >&2
5.48 + exit 1
5.49 + fi
5.50 +}
5.51 +export RAZOR_ROOT=`mktemp -dt` || exit 1
5.52 +../src/razor init || exit 1
5.53 +export YUM_URL="file://localhost/`pwd`"
5.54 +../src/razor import-yum || exit 1
5.55 +../src/razor install zip || exit 1
5.56 +../src/razor remove zip || exit 1
5.57 +check_file /usr/bin/zap
5.58 +check_no_file /usr/bin/zip
5.59 +../src/razor install zsh || exit 1
5.60 +../src/razor install zsh2 || exit 1
5.61 +../src/razor remove zsh || exit 1
5.62 +check_file /etc/zsh.conf
5.63 +check_no_file /usr/bin/zsh
5.64 +rm -rf "$RAZOR_ROOT"
6.1 --- a/test/zsh.spec Fri May 01 16:43:37 2009 +0100
6.2 +++ b/test/zsh.spec Fri May 01 16:48:47 2009 +0100
6.3 @@ -21,7 +21,7 @@
6.4 mkdir -p $RPM_BUILD_ROOT/usr/bin
6.5 mkdir -p $RPM_BUILD_ROOT/etc
6.6 touch $RPM_BUILD_ROOT/usr/bin/zsh
6.7 -touch $RPM_BUILD_ROOT/etc/zsh.conf
6.8 +echo "DEVICE /dev/tty" > $RPM_BUILD_ROOT/etc/zsh.conf
6.9
6.10 %clean
6.11
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
7.2 +++ b/test/zsh2.spec Fri May 01 16:48:47 2009 +0100
7.3 @@ -0,0 +1,30 @@
7.4 +Name: zsh2
7.5 +Summary: Test package
7.6 +Group: Test
7.7 +License: GPL
7.8 +Version: 1
7.9 +Release: 1
7.10 +Source: zsh2.tar
7.11 +BuildArch: noarch
7.12 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
7.13 +Prefix: /usr
7.14 +Requires: zip
7.15 +
7.16 +%description
7.17 +New and improved test package
7.18 +
7.19 +%prep
7.20 +
7.21 +%build
7.22 +
7.23 +%install
7.24 +mkdir -p $RPM_BUILD_ROOT/usr/bin
7.25 +mkdir -p $RPM_BUILD_ROOT/etc
7.26 +touch $RPM_BUILD_ROOT/usr/bin/zsh2
7.27 +echo "DEVICE /dev/tty" > $RPM_BUILD_ROOT/etc/zsh.conf
7.28 +
7.29 +%clean
7.30 +
7.31 +%files
7.32 +/usr/bin/zsh2
7.33 +/etc/zsh.conf