Add very basic support for removing packages
authorJ. Ali Harlow <ali@juiblex.co.uk>
Fri May 01 16:48:47 2009 +0100 (2009-05-01)
changeset 363c75a2d5caae9
parent 362 cf88b5df2884
child 364 66ec30bde5e5
Add very basic support for removing packages
librazor/razor.c
librazor/razor.h
src/main.c
test/Makefile.am
test/remove.sh
test/zsh.spec
test/zsh2.spec
     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