Add basic support for uninstall scripts.
authorJ. Ali Harlow <ali@juiblex.co.uk>
Fri Jun 12 16:59:11 2009 +0100 (2009-06-12)
changeset 369f8c27fe9fe63
parent 368 ea743486ba6f
child 370 a3e288343fe7
Add basic support for uninstall scripts.
RPM_INSTALL_PREFIX{n} is not yet supported and upgrading a package
where an uninstall script changes may need more work to ensure the
old script doesn't get included in the merged set (when it is too
late to remove). I haven't yet tested whether this is a real problem.
librazor/importer.c
librazor/merger.c
librazor/razor-internal.h
librazor/razor.c
librazor/razor.h
librazor/rpm.c
librazor/transaction.c
src/import-rpmdb.c
src/main.c
src/rpm.c
src/test-driver.c
test/remove.sh
test/zip.spec
     1.1 --- a/librazor/importer.c	Wed Jun 03 08:26:09 2009 +0100
     1.2 +++ b/librazor/importer.c	Fri Jun 12 16:59:11 2009 +0100
     1.3 @@ -1,6 +1,7 @@
     1.4  /*
     1.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     1.6   * Copyright (C) 2008  Red Hat, Inc
     1.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     1.8   *
     1.9   * This program is free software; you can redistribute it and/or modify
    1.10   * it under the terms of the GNU General Public License as published by
    1.11 @@ -82,6 +83,7 @@
    1.12  			     const char *version,
    1.13  			     const char *arch)
    1.14  {
    1.15 +	uint32_t empty;
    1.16  	struct razor_package *p;
    1.17  
    1.18  	p = array_add(&importer->set->packages, sizeof *p);
    1.19 @@ -92,6 +94,12 @@
    1.20  
    1.21  	importer->package = p;
    1.22  	array_init(&importer->properties);
    1.23 +
    1.24 +	empty = hashtable_tokenize(&importer->details_table, "");
    1.25 +	importer->package->preun.program = empty;
    1.26 +	importer->package->preun.body = empty;
    1.27 +	importer->package->postun.program = empty;
    1.28 +	importer->package->postun.body = empty;
    1.29  }
    1.30  
    1.31  /**
    1.32 @@ -135,6 +143,39 @@
    1.33  }
    1.34  
    1.35  /**
    1.36 + * razor_importer_add_script:
    1.37 + * @importer: the %razor_importer
    1.38 + * @script: either %RAZOR_PROPERTY_PREUN or %RAZOR_PROPERTY_POSTUN
    1.39 + * @program: the program to run the script
    1.40 + * @body: the body of the script
    1.41 + *
    1.42 + * Provide a script to use when uninstalling the current package.
    1.43 + **/
    1.44 +RAZOR_EXPORT void
    1.45 +razor_importer_add_script(struct razor_importer *importer,
    1.46 +			  enum razor_property_flags script,
    1.47 +			  const char *program,
    1.48 +			  const char *body)
    1.49 +{
    1.50 +	switch (script) {
    1.51 +	case RAZOR_PROPERTY_PREUN:
    1.52 +		importer->package->preun.program =
    1.53 +			hashtable_tokenize(&importer->table, program);
    1.54 +		importer->package->preun.body =
    1.55 +			hashtable_tokenize(&importer->table, body);
    1.56 +		break;
    1.57 +	case RAZOR_PROPERTY_POSTUN:
    1.58 +		importer->package->postun.program =
    1.59 +			hashtable_tokenize(&importer->table, program);
    1.60 +		importer->package->postun.body =
    1.61 +			hashtable_tokenize(&importer->table, body);
    1.62 +		break;
    1.63 +	default:
    1.64 +		break;
    1.65 +	}
    1.66 +}
    1.67 +
    1.68 +/**
    1.69   * razor_importer_add_property:
    1.70   * @importer: the %razor_importer
    1.71   * @name: name of the property
     2.1 --- a/librazor/merger.c	Wed Jun 03 08:26:09 2009 +0100
     2.2 +++ b/librazor/merger.c	Fri Jun 12 16:59:11 2009 +0100
     2.3 @@ -1,6 +1,7 @@
     2.4  /*
     2.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     2.6   * Copyright (C) 2008  Red Hat, Inc
     2.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     2.8   *
     2.9   * This program is free software; you can redistribute it and/or modify
    2.10   * it under the terms of the GNU General Public License as published by
    2.11 @@ -18,6 +19,7 @@
    2.12   */
    2.13  
    2.14  #include <string.h>
    2.15 +#include <assert.h>
    2.16  #include "razor-internal.h"
    2.17  #include "razor.h"
    2.18  
    2.19 @@ -30,6 +32,7 @@
    2.20  };
    2.21  
    2.22  struct razor_merger {
    2.23 +	int committed;
    2.24  	struct razor_set *set;
    2.25  	struct hashtable table;
    2.26  	struct hashtable file_table;
    2.27 @@ -79,6 +82,8 @@
    2.28  	struct source *source;
    2.29  	uint32_t flags;
    2.30  
    2.31 +	assert(merger->committed == 0);
    2.32 +
    2.33  	set1 = merger->source1.set;
    2.34  	if (set1->packages.data <= (void *) package &&
    2.35  	    (void *) package < set1->packages.data + set1->packages.size) {
    2.36 @@ -111,6 +116,15 @@
    2.37  		source->file_map[r->data] = 1;
    2.38  		r = list_next(r);
    2.39  	}
    2.40 +
    2.41 +	p->preun.program = hashtable_tokenize(&merger->table,
    2.42 +					      &pool[package->preun.program]);
    2.43 +	p->preun.body = hashtable_tokenize(&merger->table,
    2.44 +					   &pool[package->preun.body]);
    2.45 +	p->postun.program = hashtable_tokenize(&merger->table,
    2.46 +					       &pool[package->postun.program]);
    2.47 +	p->postun.body = hashtable_tokenize(&merger->table,
    2.48 +					    &pool[package->postun.body]);
    2.49  }
    2.50  
    2.51  static uint32_t
    2.52 @@ -481,9 +495,8 @@
    2.53  }
    2.54  
    2.55  struct razor_set *
    2.56 -razor_merger_finish(struct razor_merger *merger)
    2.57 +razor_merger_commit(struct razor_merger *merger)
    2.58  {
    2.59 -	struct razor_set *result;
    2.60  	struct razor_package *p, *pend;
    2.61  
    2.62  	/* As we built the package list, we filled out a bitvector of
    2.63 @@ -523,10 +536,49 @@
    2.64  	rebuild_property_package_lists(merger->set);
    2.65  	rebuild_file_package_lists(merger->set);
    2.66  
    2.67 -	result = merger->set;
    2.68 +	merger->committed = 1;
    2.69 +
    2.70 +	return merger->set;
    2.71 +}
    2.72 +
    2.73 +void
    2.74 +razor_merger_package_add_script(struct razor_merger *merger,
    2.75 +				struct razor_package *package,
    2.76 +				enum razor_property_flags script,
    2.77 +				const char *program, const char *body)
    2.78 +{
    2.79 +	uint32_t p, b;
    2.80 +	char *pool;
    2.81 +	struct razor_set *set = merger->set;
    2.82 +	assert ((void *)package >= set->packages.data && \
    2.83 +	    (void *)package < set->packages.data + set->packages.size);
    2.84 +
    2.85 +	p = hashtable_tokenize(&merger->table, program);
    2.86 +	b = hashtable_tokenize(&merger->table, body);
    2.87 +
    2.88 +	pool = merger->set->string_pool.data;
    2.89 +
    2.90 +	switch (script) {
    2.91 +	case RAZOR_PROPERTY_PREUN:
    2.92 +		assert(pool[package->preun.program] == '\0');
    2.93 +		assert(pool[package->preun.body] == '\0');
    2.94 +		package->preun.program = p;
    2.95 +		package->preun.body = b;
    2.96 +		break;
    2.97 +	case RAZOR_PROPERTY_POSTUN:
    2.98 +		assert(pool[package->postun.program] == '\0');
    2.99 +		assert(pool[package->postun.body] == '\0');
   2.100 +		package->postun.program = p;
   2.101 +		package->postun.body = b;
   2.102 +		break;
   2.103 +	default:
   2.104 +		break;
   2.105 +	}
   2.106 +}
   2.107 +
   2.108 +void razor_merger_destroy(struct razor_merger *merger)
   2.109 +{
   2.110  	hashtable_release(&merger->table);
   2.111  	hashtable_release(&merger->file_table);
   2.112  	free(merger);
   2.113 -
   2.114 -	return result;
   2.115  }
     3.1 --- a/librazor/razor-internal.h	Wed Jun 03 08:26:09 2009 +0100
     3.2 +++ b/librazor/razor-internal.h	Fri Jun 12 16:59:11 2009 +0100
     3.3 @@ -1,6 +1,7 @@
     3.4  /*
     3.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     3.6   * Copyright (C) 2008  Red Hat, Inc
     3.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     3.8   *
     3.9   * This program is free software; you can redistribute it and/or modify
    3.10   * it under the terms of the GNU General Public License as published by
    3.11 @@ -67,6 +68,11 @@
    3.12  #define RAZOR_FILE_POOL			"file_pool"
    3.13  #define RAZOR_FILE_STRING_POOL		"file_string_pool"
    3.14  
    3.15 +struct razor_script {
    3.16 +	uint32_t program;
    3.17 +	uint32_t body;
    3.18 +};
    3.19 +
    3.20  struct razor_package {
    3.21  	unsigned int name  : 24;
    3.22  	unsigned int flags : 8;
    3.23 @@ -78,6 +84,8 @@
    3.24  	uint32_t license;
    3.25  	struct list_head properties;
    3.26  	struct list_head files;
    3.27 +	struct razor_script preun;
    3.28 +	struct razor_script postun;
    3.29  };
    3.30  
    3.31  
    3.32 @@ -175,17 +183,28 @@
    3.33  razor_merger_add_package(struct razor_merger *merger,
    3.34  			 struct razor_package *package);
    3.35  struct razor_set *
    3.36 -razor_merger_finish(struct razor_merger *merger);
    3.37 +razor_merger_commit(struct razor_merger *merger);
    3.38 +void
    3.39 +razor_merger_package_add_script(struct razor_merger *merger,
    3.40 +				struct razor_package *package,
    3.41 +				enum razor_property_flags script,
    3.42 +				const char *program, const char *body);
    3.43 +void
    3.44 +razor_merger_destroy(struct razor_merger *merger);
    3.45  
    3.46  int run_lua_script(const char *root, const char *name, const char *body,
    3.47  		   ssize_t len);
    3.48  
    3.49 +int razor_run_script(const char *root, enum razor_property_flags script,
    3.50 +		     const char *program, const char *body);
    3.51 +
    3.52  /* Utility functions */
    3.53  
    3.54  void
    3.55  razor_package_get_details_varg(struct razor_set *set,
    3.56  			       struct razor_package *package,
    3.57  			       va_list args);
    3.58 +void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
    3.59  
    3.60  int razor_create_dir(const char *root, const char *path);
    3.61  int razor_write(int fd, const void *data, size_t size);
     4.1 --- a/librazor/razor.c	Wed Jun 03 08:26:09 2009 +0100
     4.2 +++ b/librazor/razor.c	Fri Jun 12 16:59:11 2009 +0100
     4.3 @@ -1,6 +1,7 @@
     4.4  /*
     4.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     4.6   * Copyright (C) 2008  Red Hat, Inc
     4.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     4.8   *
     4.9   * This program is free software; you can redistribute it and/or modify
    4.10   * it under the terms of the GNU General Public License as published by
    4.11 @@ -34,6 +35,7 @@
    4.12  #include <errno.h>
    4.13  #include <ctype.h>
    4.14  #include <fnmatch.h>
    4.15 +#include <limits.h>
    4.16  #include <assert.h>
    4.17  
    4.18  #include "razor-internal.h"
    4.19 @@ -410,6 +412,22 @@
    4.20  		pool = set->details_string_pool.data;
    4.21  		return &pool[package->license];
    4.22  
    4.23 +	case RAZOR_DETAIL_PREUNPROG:
    4.24 +		pool = set->string_pool.data;
    4.25 +		return &pool[package->preun.program];
    4.26 +
    4.27 +	case RAZOR_DETAIL_PREUN:
    4.28 +		pool = set->string_pool.data;
    4.29 +		return &pool[package->preun.body];
    4.30 +
    4.31 +	case RAZOR_DETAIL_POSTUNPROG:
    4.32 +		pool = set->string_pool.data;
    4.33 +		return &pool[package->postun.program];
    4.34 +
    4.35 +	case RAZOR_DETAIL_POSTUN:
    4.36 +		pool = set->string_pool.data;
    4.37 +		return &pool[package->postun.body];
    4.38 +
    4.39  	default:
    4.40  		fprintf(stderr, "type %u not found\n", type);
    4.41  		return NULL;
    4.42 @@ -466,6 +484,60 @@
    4.43  	va_end (args);
    4.44  }
    4.45  
    4.46 +/**
    4.47 + * razor_package_remove:
    4.48 + * @set: a %razor_set
    4.49 + * @package: a %razor_package
    4.50 + * @root: the root into which the package is currently installed
    4.51 + *
    4.52 + * Removes an installed package.
    4.53 + **/
    4.54 +RAZOR_EXPORT int
    4.55 +razor_package_remove(struct razor_set *set, struct razor_package *package,
    4.56 +		     const char *root)
    4.57 +{
    4.58 +	struct razor_file_iterator *fi;
    4.59 +	struct razor_package_iterator *pi;
    4.60 +	struct razor_package *p;
    4.61 +	char buffer[PATH_MAX];
    4.62 +	const char *name, *program, *script;
    4.63 +	int retval = 0, count;
    4.64 +
    4.65 +	razor_package_get_details(set, package,
    4.66 +				  RAZOR_DETAIL_PREUNPROG, &program,
    4.67 +				  RAZOR_DETAIL_PREUN, &script,
    4.68 +				  RAZOR_DETAIL_LAST);
    4.69 +
    4.70 +	if (razor_run_script(root, RAZOR_PROPERTY_PREUN, program, script))
    4.71 +		return -1;
    4.72 +
    4.73 +	fi = razor_file_iterator_create(set, package);
    4.74 +
    4.75 +	while (!retval && razor_file_iterator_next(fi, &name)) {
    4.76 +		pi = razor_package_iterator_create_for_file(set, name);
    4.77 +		count = 0;
    4.78 +		while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
    4.79 +			count++;
    4.80 +		razor_package_iterator_destroy(pi);
    4.81 +		if (count <= 1) {
    4.82 +			snprintf(buffer, sizeof buffer, "%s%s", root, name);
    4.83 +			retval = remove(buffer);
    4.84 +		}
    4.85 +	}
    4.86 +
    4.87 +	razor_file_iterator_destroy(fi);
    4.88 +
    4.89 +	if (retval)
    4.90 +		return retval;
    4.91 +
    4.92 +	razor_package_get_details(set, package,
    4.93 +				  RAZOR_DETAIL_POSTUNPROG, &program,
    4.94 +				  RAZOR_DETAIL_POSTUN, &script,
    4.95 +				  RAZOR_DETAIL_LAST);
    4.96 +
    4.97 +	return razor_run_script(root, RAZOR_PROPERTY_POSTUN, program, script);
    4.98 +}
    4.99 +
   4.100  RAZOR_EXPORT const char *
   4.101  razor_property_relation_to_string(struct razor_property *p)
   4.102  {
     5.1 --- a/librazor/razor.h	Wed Jun 03 08:26:09 2009 +0100
     5.2 +++ b/librazor/razor.h	Fri Jun 12 16:59:11 2009 +0100
     5.3 @@ -1,6 +1,7 @@
     5.4  /*
     5.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     5.6   * Copyright (C) 2008  Red Hat, Inc
     5.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     5.8   *
     5.9   * This program is free software; you can redistribute it and/or modify
    5.10   * it under the terms of the GNU General Public License as published by
    5.11 @@ -36,7 +37,11 @@
    5.12  	RAZOR_DETAIL_SUMMARY,
    5.13  	RAZOR_DETAIL_DESCRIPTION,
    5.14  	RAZOR_DETAIL_URL,
    5.15 -	RAZOR_DETAIL_LICENSE
    5.16 +	RAZOR_DETAIL_LICENSE,
    5.17 +	RAZOR_DETAIL_PREUNPROG,
    5.18 +	RAZOR_DETAIL_PREUN,
    5.19 +	RAZOR_DETAIL_POSTUNPROG,
    5.20 +	RAZOR_DETAIL_POSTUN
    5.21  };
    5.22  
    5.23  enum razor_property_flags {
    5.24 @@ -103,6 +108,9 @@
    5.25  void
    5.26  razor_package_get_details(struct razor_set *set,
    5.27  			  struct razor_package *package, ...);
    5.28 +int
    5.29 +razor_package_remove(struct razor_set *set, struct razor_package *package,
    5.30 +		     const char *root);
    5.31  
    5.32  
    5.33  /**
    5.34 @@ -234,6 +242,8 @@
    5.35   * from packages from one or more other package sets.
    5.36   **/
    5.37  
    5.38 +struct razor_rpm;
    5.39 +
    5.40  struct razor_transaction *
    5.41  razor_transaction_create(struct razor_set *system, struct razor_set *upstream);
    5.42  void razor_transaction_install_package(struct razor_transaction *transaction,
    5.43 @@ -242,10 +252,13 @@
    5.44  				      struct razor_package *package);
    5.45  void razor_transaction_update_package(struct razor_transaction *trans,
    5.46  				      struct razor_package *package);
    5.47 +void razor_transaction_fixup_package(struct razor_transaction *trans,
    5.48 +				     struct razor_package *package,
    5.49 +				     struct razor_rpm *rpm);
    5.50  void razor_transaction_update_all(struct razor_transaction *transaction);
    5.51  int razor_transaction_resolve(struct razor_transaction *trans);
    5.52  int razor_transaction_describe(struct razor_transaction *trans);
    5.53 -struct razor_set *razor_transaction_finish(struct razor_transaction *trans);
    5.54 +struct razor_set *razor_transaction_commit(struct razor_transaction *trans);
    5.55  void razor_transaction_destroy(struct razor_transaction *trans);
    5.56  
    5.57  /* Temporary helper for test suite. */
    5.58 @@ -264,7 +277,6 @@
    5.59   **/
    5.60  
    5.61  struct razor_relocations;
    5.62 -struct razor_rpm;
    5.63  
    5.64  struct razor_relocations *razor_relocations_create(void);
    5.65  void razor_relocations_add(struct razor_relocations *relocations,
    5.66 @@ -276,6 +288,7 @@
    5.67  void razor_relocations_destroy(struct razor_relocations *relocations);
    5.68  
    5.69  struct razor_rpm *razor_rpm_open(const char *filename);
    5.70 +void razor_rpm_get_details(struct razor_rpm *rpm, ...);
    5.71  void razor_rpm_set_relocations(struct razor_rpm *rpm,
    5.72  			       struct razor_relocations *relocations);
    5.73  int razor_rpm_install(struct razor_rpm *rpm, const char *root);
    5.74 @@ -332,6 +345,10 @@
    5.75  				const char *description,
    5.76  				const char *url,
    5.77  				const char *license);
    5.78 +void razor_importer_add_script(struct razor_importer *importer,
    5.79 +			       enum razor_property_flags script,
    5.80 +			       const char *program,
    5.81 +			       const char *body);
    5.82  void razor_importer_add_property(struct razor_importer *importer,
    5.83  				 const char *name,
    5.84  				 uint32_t flags,
     6.1 --- a/librazor/rpm.c	Wed Jun 03 08:26:09 2009 +0100
     6.2 +++ b/librazor/rpm.c	Fri Jun 12 16:59:11 2009 +0100
     6.3 @@ -256,6 +256,7 @@
     6.4  	size_t size;
     6.5  	void *payload;
     6.6  	struct razor_relocations *relocations;
     6.7 +	char *evr;
     6.8  };
     6.9  
    6.10  enum razor_relocation_flags {
    6.11 @@ -491,6 +492,95 @@
    6.12  	}
    6.13  }
    6.14  
    6.15 +static void
    6.16 +razor_rpm_build_evr(struct razor_rpm *rpm)
    6.17 +{
    6.18 +	const char *version, *release;
    6.19 +	const uint32_t *epoch;
    6.20 +	char evr[128], buf[16];
    6.21 +
    6.22 +	epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL);
    6.23 +	version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL);
    6.24 +	release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL);
    6.25 +	if (epoch)
    6.26 +		snprintf(buf, sizeof buf, "%lu", (unsigned long)ntohl(*epoch));
    6.27 +	razor_build_evr(evr, sizeof evr, epoch ? buf : NULL, version, release);
    6.28 +	rpm->evr = strdup(evr);
    6.29 +}
    6.30 +
    6.31 +static const char *
    6.32 +razor_rpm_get_details_type(struct razor_rpm *rpm, enum razor_detail_type type)
    6.33 +{
    6.34 +	switch(type) {
    6.35 +	case RAZOR_DETAIL_NAME:
    6.36 +		return razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL);
    6.37 +
    6.38 +	case RAZOR_DETAIL_VERSION:
    6.39 +		if (!rpm->evr)
    6.40 +			razor_rpm_build_evr(rpm);
    6.41 +		return rpm->evr;
    6.42 +
    6.43 +	case RAZOR_DETAIL_ARCH:
    6.44 +		return razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL);
    6.45 +
    6.46 +	case RAZOR_DETAIL_SUMMARY:
    6.47 +		return razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL);
    6.48 +
    6.49 +	case RAZOR_DETAIL_DESCRIPTION:
    6.50 +		return razor_rpm_get_indirect(rpm, RPMTAG_DESCRIPTION, NULL);
    6.51 +
    6.52 +	case RAZOR_DETAIL_URL:
    6.53 +		return razor_rpm_get_indirect(rpm, RPMTAG_URL, NULL);
    6.54 +
    6.55 +	case RAZOR_DETAIL_LICENSE:
    6.56 +		return razor_rpm_get_indirect(rpm, RPMTAG_LICENSE, NULL);
    6.57 +
    6.58 +	case RAZOR_DETAIL_PREUNPROG:
    6.59 +		return razor_rpm_get_indirect(rpm, RPMTAG_PREUNPROG, NULL);
    6.60 +
    6.61 +	case RAZOR_DETAIL_PREUN:
    6.62 +		return razor_rpm_get_indirect(rpm, RPMTAG_PREUN, NULL);
    6.63 +
    6.64 +	case RAZOR_DETAIL_POSTUNPROG:
    6.65 +		return razor_rpm_get_indirect(rpm, RPMTAG_POSTUNPROG, NULL);
    6.66 +
    6.67 +	case RAZOR_DETAIL_POSTUN:
    6.68 +		return razor_rpm_get_indirect(rpm, RPMTAG_POSTUN, NULL);
    6.69 +
    6.70 +	default:
    6.71 +		fprintf(stderr, "type %u not found\n", type);
    6.72 +		return NULL;
    6.73 +	}
    6.74 +}
    6.75 +
    6.76 +void
    6.77 +razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args)
    6.78 +{
    6.79 +	int i;
    6.80 +	enum razor_detail_type type;
    6.81 +	const char **data;
    6.82 +
    6.83 +	for (i = 0;; i += 2) {
    6.84 +		type = va_arg(args, enum razor_detail_type);
    6.85 +		if (type == RAZOR_DETAIL_LAST)
    6.86 +			break;
    6.87 +		data = va_arg(args, const char **);
    6.88 +                *data = razor_rpm_get_details_type(rpm, type);
    6.89 +        }
    6.90 +}
    6.91 +
    6.92 +RAZOR_EXPORT void
    6.93 +razor_rpm_get_details(struct razor_rpm *rpm, ...)
    6.94 +{
    6.95 +	va_list args;
    6.96 +
    6.97 +	assert(rpm != NULL);
    6.98 +
    6.99 +	va_start(args, rpm);
   6.100 +	razor_rpm_get_details_varg(rpm, args);
   6.101 +	va_end(args);
   6.102 +}
   6.103 +
   6.104  RAZOR_EXPORT struct razor_rpm *
   6.105  razor_rpm_open(const char *filename)
   6.106  {
   6.107 @@ -865,7 +955,7 @@
   6.108  		}
   6.109  	}
   6.110  
   6.111 -	if (strcmp(program, "<lua>") == 0)
   6.112 +	if (program && strcmp(program, "<lua>") == 0)
   6.113  		retval = run_script_lua(installer->root, script_tag, script);
   6.114  	else
   6.115  		retval = run_script_external(installer->root, program, script);
   6.116 @@ -881,6 +971,47 @@
   6.117  	return retval;
   6.118  }
   6.119  
   6.120 +int
   6.121 +razor_run_script(const char *root, enum razor_property_flags script,
   6.122 +		 const char *program, const char *body)
   6.123 +{
   6.124 +	int retval;
   6.125 +	unsigned int script_tag;
   6.126 +
   6.127 +	if (program && !*program)
   6.128 +		program = NULL;
   6.129 +	if (body && !*body)
   6.130 +		body = NULL;
   6.131 +	if (program == NULL && body == NULL)
   6.132 +		return 0;
   6.133 +
   6.134 +	if (program && strcmp(program, "<lua>") == 0)
   6.135 +	{
   6.136 +		switch(script) {
   6.137 +		case RAZOR_PROPERTY_PRE:
   6.138 +			script_tag = RPMTAG_PREIN;
   6.139 +			break;
   6.140 +		case RAZOR_PROPERTY_POST:
   6.141 +			script_tag = RPMTAG_POSTIN;
   6.142 +			break;
   6.143 +		case RAZOR_PROPERTY_PREUN:
   6.144 +			script_tag = RPMTAG_PREUN;
   6.145 +			break;
   6.146 +		case RAZOR_PROPERTY_POSTUN:
   6.147 +			script_tag = RPMTAG_POSTUN;
   6.148 +			break;
   6.149 +		default:
   6.150 +			script_tag = 0;
   6.151 +			break;
   6.152 +		}
   6.153 +		retval = run_script_lua(root, script_tag, body);
   6.154 +	}
   6.155 +	else
   6.156 +		retval = run_script_external(root, program, body);
   6.157 +
   6.158 +	return retval;
   6.159 +}
   6.160 +
   6.161  static int
   6.162  installer_init(struct installer *installer)
   6.163  {
   6.164 @@ -1035,6 +1166,7 @@
   6.165  	free(rpm->dirs);
   6.166  	free(rpm->prefixes);
   6.167  	err = razor_file_free_contents(rpm->map, rpm->size);
   6.168 +	free(rpm->evr);
   6.169  	free(rpm);
   6.170  
   6.171  	return err;
   6.172 @@ -1043,32 +1175,23 @@
   6.173  RAZOR_EXPORT int
   6.174  razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm)
   6.175  {
   6.176 -	const char *name, *version, *release, *arch;
   6.177 +	const char *name, *version, *arch;
   6.178  	const char *summary, *description, *url, *license;
   6.179 -	const uint32_t *epoch;
   6.180 -	char evr[128], buf[16];
   6.181  
   6.182  	assert (importer != NULL);
   6.183  	assert (rpm != NULL);
   6.184  
   6.185 -	name = razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL);
   6.186 -	epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL);
   6.187 -	version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL);
   6.188 -	release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL);
   6.189 -	arch = razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL);
   6.190 +	razor_rpm_get_details(rpm,
   6.191 +			      RAZOR_DETAIL_NAME, &name,
   6.192 +			      RAZOR_DETAIL_VERSION, &version,
   6.193 +			      RAZOR_DETAIL_ARCH, &arch,
   6.194 +			      RAZOR_DETAIL_SUMMARY, &summary,
   6.195 +			      RAZOR_DETAIL_DESCRIPTION, &description,
   6.196 +			      RAZOR_DETAIL_URL, &url,
   6.197 +			      RAZOR_DETAIL_LICENSE, &license,
   6.198 +			      RAZOR_DETAIL_LAST);
   6.199  
   6.200 -	summary = razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL);
   6.201 -	description = razor_rpm_get_indirect(rpm, RPMTAG_DESCRIPTION, NULL);
   6.202 -	url = razor_rpm_get_indirect(rpm, RPMTAG_URL, NULL);
   6.203 -	license = razor_rpm_get_indirect(rpm, RPMTAG_LICENSE, NULL);
   6.204 -
   6.205 -	if (epoch) {
   6.206 -		snprintf(buf, sizeof buf, "%lu", ntohl(*epoch));
   6.207 -		razor_build_evr(evr, sizeof evr, buf, version, release);
   6.208 -	} else {
   6.209 -		razor_build_evr(evr, sizeof evr, NULL, version, release);
   6.210 -	}
   6.211 -	razor_importer_begin_package(importer, name, evr, arch);
   6.212 +	razor_importer_begin_package(importer, name, version, arch);
   6.213  
   6.214  	razor_importer_add_details(importer, summary, description, url,
   6.215  				   license);
     7.1 --- a/librazor/transaction.c	Wed Jun 03 08:26:09 2009 +0100
     7.2 +++ b/librazor/transaction.c	Fri Jun 12 16:59:11 2009 +0100
     7.3 @@ -1,6 +1,7 @@
     7.4  /*
     7.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     7.6   * Copyright (C) 2008  Red Hat, Inc
     7.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     7.8   *
     7.9   * This program is free software; you can redistribute it and/or modify
    7.10   * it under the terms of the GNU General Public License as published by
    7.11 @@ -100,6 +101,7 @@
    7.12  	int package_count, errors;
    7.13  	struct transaction_set system, upstream;
    7.14  	int changes;
    7.15 +	struct razor_merger *merger;
    7.16  };
    7.17  
    7.18  static void
    7.19 @@ -854,9 +856,8 @@
    7.20  }
    7.21  
    7.22  RAZOR_EXPORT struct razor_set *
    7.23 -razor_transaction_finish(struct razor_transaction *trans)
    7.24 +razor_transaction_commit(struct razor_transaction *trans)
    7.25  {
    7.26 -	struct razor_merger *merger;
    7.27  	struct razor_package *u, *uend, *upkgs, *s, *send, *spkgs;
    7.28  	char *upool, *spool;
    7.29  	int cmp;
    7.30 @@ -873,7 +874,8 @@
    7.31  		trans->upstream.set->packages.size;
    7.32  	upool = trans->upstream.set->string_pool.data;
    7.33  
    7.34 -	merger = razor_merger_create(trans->system.set, trans->upstream.set);
    7.35 +	trans->merger = razor_merger_create(trans->system.set,
    7.36 +					    trans->upstream.set);
    7.37  	while (s < send || u < uend) {
    7.38  		if (s < send && u < uend)
    7.39  			cmp = strcmp(&spool[s->name], &upool[u->name]);
    7.40 @@ -884,26 +886,46 @@
    7.41  
    7.42  		if (cmp < 0) {
    7.43  			if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
    7.44 -				razor_merger_add_package(merger, s);
    7.45 +				razor_merger_add_package(trans->merger, s);
    7.46  			s++;
    7.47  		} else if (cmp == 0) {
    7.48  			if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
    7.49 -				razor_merger_add_package(merger, s);
    7.50 +				razor_merger_add_package(trans->merger, s);
    7.51  			if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
    7.52 -				razor_merger_add_package(merger, u);
    7.53 +				razor_merger_add_package(trans->merger, u);
    7.54  
    7.55  			s++;
    7.56  			u++;
    7.57  		} else {
    7.58  			if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
    7.59 -				razor_merger_add_package(merger, u);
    7.60 +				razor_merger_add_package(trans->merger, u);
    7.61  			u++;
    7.62  		}
    7.63  	}
    7.64  
    7.65 -	razor_transaction_destroy(trans);
    7.66 +	return razor_merger_commit(trans->merger);
    7.67 +}
    7.68  
    7.69 -	return razor_merger_finish(merger);
    7.70 +RAZOR_EXPORT void
    7.71 +razor_transaction_fixup_package(struct razor_transaction *trans,
    7.72 +				struct razor_package *package,
    7.73 +				struct razor_rpm *rpm)
    7.74 +{
    7.75 +	const char *preunprog, *preun, *postunprog, *postun;
    7.76 +
    7.77 +	razor_rpm_get_details(rpm,
    7.78 +			      RAZOR_DETAIL_PREUNPROG, &preunprog,
    7.79 +			      RAZOR_DETAIL_PREUN, &preun,
    7.80 +			      RAZOR_DETAIL_POSTUNPROG, &postunprog,
    7.81 +			      RAZOR_DETAIL_POSTUN, &postun,
    7.82 +			      RAZOR_DETAIL_LAST);
    7.83 +
    7.84 +	razor_merger_package_add_script(trans->merger, package,
    7.85 +					RAZOR_PROPERTY_PREUN,
    7.86 +					preunprog, preun);
    7.87 +	razor_merger_package_add_script(trans->merger, package,
    7.88 +					RAZOR_PROPERTY_POSTUN,
    7.89 +					postunprog, postun);
    7.90  }
    7.91  
    7.92  RAZOR_EXPORT void
    7.93 @@ -911,6 +933,8 @@
    7.94  {
    7.95  	assert (trans != NULL);
    7.96  
    7.97 +	if (trans->merger)
    7.98 +		razor_merger_destroy(trans->merger);
    7.99  	transaction_set_release(&trans->system);
   7.100  	transaction_set_release(&trans->upstream);
   7.101  	free(trans);
     8.1 --- a/src/import-rpmdb.c	Wed Jun 03 08:26:09 2009 +0100
     8.2 +++ b/src/import-rpmdb.c	Fri Jun 12 16:59:11 2009 +0100
     8.3 @@ -1,6 +1,7 @@
     8.4  /*
     8.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     8.6   * Copyright (C) 2008  Red Hat, Inc
     8.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
     8.8   *
     8.9   * This program is free software; you can redistribute it and/or modify
    8.10   * it under the terms of the GNU General Public License as published by
    8.11 @@ -79,6 +80,21 @@
    8.12  					    versions.list[i]);
    8.13  }
    8.14  
    8.15 +static void
    8.16 +add_script(struct razor_importer *importer,
    8.17 +	   uint32_t type_flags, Header h,
    8.18 +	   int32_t program_tag, int32_t body_tag)
    8.19 +{
    8.20 +	union rpm_entry program, body;
    8.21 +	int32_t type, count;
    8.22 +
    8.23 +	headerGetEntry(h, program_tag, &type, &program.p, &count);
    8.24 +	headerGetEntry(h, body_tag, &type, &body.p, &count);
    8.25 +
    8.26 +	razor_importer_add_script(importer, type_flags,
    8.27 +				  program.string, body.string);
    8.28 +}
    8.29 +
    8.30  struct razor_set *
    8.31  razor_set_create_from_rpmdb(void)
    8.32  {
    8.33 @@ -163,6 +179,12 @@
    8.34  			razor_importer_add_file(importer, filename);
    8.35  		}
    8.36  
    8.37 +		add_script(importer, RAZOR_PROPERTY_PREUN, h,
    8.38 +			   RPMTAG_PREUNPROG, RPMTAG_PREUN);
    8.39 +
    8.40 +		add_script(importer, RAZOR_PROPERTY_POSTUN, h,
    8.41 +			   RPMTAG_POSTUNPROG, RPMTAG_POSTUN);
    8.42 +
    8.43  		razor_importer_finish_package(importer);
    8.44  
    8.45  		printf("\rimporting %d", ++imported_count);
     9.1 --- a/src/main.c	Wed Jun 03 08:26:09 2009 +0100
     9.2 +++ b/src/main.c	Fri Jun 12 16:59:11 2009 +0100
     9.3 @@ -50,8 +50,8 @@
     9.4  #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     9.5  
     9.6  static int
     9.7 -update_packages(struct razor_set *system, struct razor_set *next,
     9.8 -		struct razor_relocations *relocations);
     9.9 +update_packages(struct razor_transaction *trans, struct razor_set *system,
    9.10 +		struct razor_set *next, struct razor_relocations *relocations);
    9.11  
    9.12  static struct razor_package_iterator *
    9.13  create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
    9.14 @@ -222,6 +222,44 @@
    9.15  }
    9.16  
    9.17  static int
    9.18 +command_list_scripts(int argc, const char *argv[])
    9.19 +{
    9.20 +	struct razor_set *set;
    9.21 +	struct razor_package *package;
    9.22 +	struct razor_package_iterator *pi;
    9.23 +	const char *preunprog, *preun, *postunprog, *postun;
    9.24 +
    9.25 +	set = razor_root_open_read_only(install_root);
    9.26 +	if (set == NULL)
    9.27 +		return 1;
    9.28 +
    9.29 +	pi = create_iterator_from_argv(set, argc, argv);
    9.30 +	while (razor_package_iterator_next(pi, &package,
    9.31 +					   RAZOR_DETAIL_PREUNPROG, &preunprog,
    9.32 +					   RAZOR_DETAIL_PREUN, &preun,
    9.33 +					   RAZOR_DETAIL_POSTUNPROG, &postunprog,
    9.34 +					   RAZOR_DETAIL_POSTUN, &postun,
    9.35 +					   RAZOR_DETAIL_LAST)) {
    9.36 +		if (preun && *preun) {
    9.37 +			printf("preuninstall scriptlet");
    9.38 +			if (preunprog && *preunprog)
    9.39 +				printf(" (using %s)",preunprog);
    9.40 +			printf(":\n%s\n",preun);
    9.41 +		}
    9.42 +		if (postun && *postun) {
    9.43 +			printf("postuninstall scriptlet");
    9.44 +			if (postunprog && *postunprog)
    9.45 +				printf(" (using %s)",postunprog);
    9.46 +			printf(":\n%s\n",postun);
    9.47 +		}
    9.48 +	}
    9.49 +	razor_package_iterator_destroy(pi);
    9.50 +	razor_set_destroy(set);
    9.51 +
    9.52 +	return 0;
    9.53 +}
    9.54 +
    9.55 +static int
    9.56  command_list_files(int argc, const char *argv[])
    9.57  {
    9.58  	struct razor_set *set;
    9.59 @@ -542,6 +580,7 @@
    9.60  	for (i = 0; i < argc; i++) {
    9.61  		if (mark_packages_for_update(trans, set, argv[i]) == 0) {
    9.62  			fprintf(stderr, "no match for %s\n", argv[i]);
    9.63 +			razor_transaction_destroy(trans);
    9.64  			return 1;
    9.65  		}
    9.66  	}
    9.67 @@ -550,11 +589,13 @@
    9.68  	errors = razor_transaction_describe(trans);
    9.69  	if (errors) {
    9.70  		fprintf(stderr, "unresolved dependencies\n");
    9.71 +		razor_transaction_destroy(trans);
    9.72  		return 1;
    9.73  	}
    9.74  
    9.75 -	set = razor_transaction_finish(trans);
    9.76 +	set = razor_transaction_commit(trans);
    9.77  	razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
    9.78 +	razor_transaction_destroy(trans);
    9.79  	razor_set_destroy(set);
    9.80  	razor_set_destroy(upstream);
    9.81  	printf("wrote system-updated.rzdb\n");
    9.82 @@ -598,10 +639,11 @@
    9.83  		return 1;
    9.84  	}
    9.85  
    9.86 -	next = razor_transaction_finish(trans);
    9.87 -	update_packages(system, next, NULL);
    9.88 +	next = razor_transaction_commit(trans);
    9.89 +	update_packages(trans, system, next, NULL);
    9.90  	razor_root_update(root, next);
    9.91  
    9.92 +	razor_transaction_destroy(trans);
    9.93  	razor_set_destroy(next);
    9.94  	razor_set_destroy(upstream);
    9.95  
    9.96 @@ -774,6 +816,7 @@
    9.97  	struct razor_property *property;
    9.98  	struct razor_rpm *rpm;
    9.99  	const char *name, *version, *arch, *summary, *desc, *url, *license;
   9.100 +	const char *preunprog, *preun, *postunprog, *postun;
   9.101  	char file[PATH_MAX];
   9.102  	uint32_t flags;
   9.103  
   9.104 @@ -788,6 +831,10 @@
   9.105  					   RAZOR_DETAIL_DESCRIPTION, &desc,
   9.106  					   RAZOR_DETAIL_URL, &url,
   9.107  					   RAZOR_DETAIL_LICENSE, &license,
   9.108 +					   RAZOR_DETAIL_PREUNPROG, &preunprog,
   9.109 +					   RAZOR_DETAIL_PREUN, &preun,
   9.110 +					   RAZOR_DETAIL_POSTUNPROG, &postunprog,
   9.111 +					   RAZOR_DETAIL_POSTUN, &postun,
   9.112  					   RAZOR_DETAIL_LAST)) {
   9.113  		snprintf(file, sizeof file,
   9.114  			 "rpms/%s", rpm_filename(name, version, arch));
   9.115 @@ -820,6 +867,11 @@
   9.116  		}
   9.117  		razor_file_iterator_destroy(file_iter);
   9.118  
   9.119 +		razor_importer_add_script(importer, RAZOR_PROPERTY_PREUN,
   9.120 +					  preunprog, preun);
   9.121 +		razor_importer_add_script(importer, RAZOR_PROPERTY_POSTUN,
   9.122 +					  postunprog, postun);
   9.123 +
   9.124  		razor_importer_finish_package(importer);
   9.125  	}
   9.126  
   9.127 @@ -828,7 +880,8 @@
   9.128  }
   9.129  
   9.130  static int
   9.131 -install_package(struct razor_set *set, struct razor_package *package,
   9.132 +install_package(struct razor_transaction *trans, struct razor_set *set,
   9.133 +		struct razor_package *package,
   9.134  		struct razor_relocations *relocations)
   9.135  {
   9.136  	int retval;
   9.137 @@ -853,6 +906,7 @@
   9.138  	}
   9.139  	if (relocations)
   9.140  		razor_rpm_set_relocations(rpm, relocations);
   9.141 +	razor_transaction_fixup_package(trans, package, rpm);
   9.142  	retval = razor_rpm_install(rpm, install_root);
   9.143  	if (retval < 0)
   9.144  		fprintf(stderr, "failed to install rpm %s\n", file);
   9.145 @@ -861,37 +915,8 @@
   9.146  }
   9.147  
   9.148  static int
   9.149 -remove_package(struct razor_set *set, struct razor_package *package)
   9.150 -{
   9.151 -	struct razor_file_iterator *fi;
   9.152 -	struct razor_package_iterator *pi;
   9.153 -	struct razor_package *p;
   9.154 -	char buffer[PATH_MAX];
   9.155 -	const char *name;
   9.156 -	int retval = 0, count;
   9.157 -
   9.158 -	fi = razor_file_iterator_create(set, package);
   9.159 -
   9.160 -	while (!retval && razor_file_iterator_next(fi, &name)) {
   9.161 -		pi = razor_package_iterator_create_for_file(set, name);
   9.162 -		count = 0;
   9.163 -		while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
   9.164 -			count++;
   9.165 -		razor_package_iterator_destroy(pi);
   9.166 -		if (count <= 1) {
   9.167 -			snprintf(buffer, sizeof buffer, "%s%s", install_root,
   9.168 -				 name);
   9.169 -			retval = remove(buffer);
   9.170 -		}
   9.171 -	}
   9.172 -
   9.173 -	razor_file_iterator_destroy(fi);
   9.174 -	return retval;
   9.175 -}
   9.176 -
   9.177 -static int
   9.178 -update_packages(struct razor_set *system, struct razor_set *next,
   9.179 -		struct razor_relocations *relocations)
   9.180 +update_packages(struct razor_transaction *trans, struct razor_set *system,
   9.181 +		struct razor_set *next, struct razor_relocations *relocations)
   9.182  {
   9.183  	struct razor_install_iterator *ii;
   9.184  	struct razor_package *package;
   9.185 @@ -903,9 +928,11 @@
   9.186  	while (!retval && razor_install_iterator_next(ii, &set, &package,
   9.187  						      &action, &count)) {
   9.188  		if (action == RAZOR_INSTALL_ACTION_ADD)
   9.189 -			retval = install_package(set, package, relocations);
   9.190 +			retval = install_package(trans, set, package,
   9.191 +						 relocations);
   9.192  		else if (action == RAZOR_INSTALL_ACTION_REMOVE)
   9.193 -			retval = remove_package(set, package);
   9.194 +			retval = razor_package_remove(set, package,
   9.195 +						      install_root);
   9.196  	}
   9.197  	razor_install_iterator_destroy(ii);
   9.198  
   9.199 @@ -974,6 +1001,7 @@
   9.200  	for (; i < argc; i++) {
   9.201  		if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
   9.202  			fprintf(stderr, "no package matched %s\n", argv[i]);
   9.203 +			razor_transaction_destroy(trans);
   9.204  			razor_root_close(root);
   9.205  			return 1;
   9.206  		}
   9.207 @@ -982,28 +1010,32 @@
   9.208  	if (dependencies) {
   9.209  		razor_transaction_resolve(trans);
   9.210  		if (razor_transaction_describe(trans) > 0) {
   9.211 +			razor_transaction_destroy(trans);
   9.212  			razor_root_close(root);
   9.213  			return 1;
   9.214  		}
   9.215  	}
   9.216  
   9.217 -	next = razor_transaction_finish(trans);
   9.218 -
   9.219 -	razor_root_update(root, next);
   9.220 +	next = razor_transaction_commit(trans);
   9.221  
   9.222  	if (mkdir("rpms", 0777) && errno != EEXIST) {
   9.223  		fprintf(stderr, "failed to create rpms directory.\n");
   9.224 +		razor_transaction_destroy(trans);
   9.225  		razor_root_close(root);
   9.226  		return 1;
   9.227  	}
   9.228  
   9.229  	if (download_packages(system, next) < 0) {
   9.230 +		razor_transaction_destroy(trans);
   9.231  		razor_root_close(root);
   9.232                  return 1;
   9.233          }
   9.234  
   9.235 -	update_packages(system, next, relocations);
   9.236 +	update_packages(trans, system, next, relocations);
   9.237  
   9.238 +	razor_root_update(root, next);
   9.239 +
   9.240 +	razor_transaction_destroy(trans);
   9.241  	if (relocations)
   9.242  		razor_relocations_destroy(relocations);
   9.243  	razor_set_destroy(next);
   9.244 @@ -1167,6 +1199,7 @@
   9.245  	{ "list-provides", "list all provides for the given package", command_list_provides },
   9.246  	{ "list-obsoletes", "list all obsoletes for the given package", command_list_obsoletes },
   9.247  	{ "list-conflicts", "list all conflicts for the given package", command_list_conflicts },
   9.248 +	{ "list-scripts", "list all scripts for the given package", command_list_scripts },
   9.249  	{ "list-files", "list files for package set", command_list_files },
   9.250  	{ "list-file-packages", "list packages owning file", command_list_file_packages },
   9.251  	{ "list-package-files", "list files in package", command_list_package_files },
    10.1 --- a/src/rpm.c	Wed Jun 03 08:26:09 2009 +0100
    10.2 +++ b/src/rpm.c	Fri Jun 12 16:59:11 2009 +0100
    10.3 @@ -1,6 +1,7 @@
    10.4  /*
    10.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
    10.6   * Copyright (C) 2008  Red Hat, Inc
    10.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
    10.8   *
    10.9   * This program is free software; you can redistribute it and/or modify
   10.10   * it under the terms of the GNU General Public License as published by
   10.11 @@ -602,17 +603,21 @@
   10.12  
   10.13  	if (!option_nodeps && razor_transaction_describe(trans) > 0) {
   10.14  		printf("unsatisfied dependencies.\n");
   10.15 +		razor_transaction_destroy(trans);
   10.16  		exit(1);
   10.17  	}
   10.18  
   10.19 -	if (option_test)
   10.20 +	if (option_test) {
   10.21 +		razor_transaction_destroy(trans);
   10.22  		exit(0);
   10.23 +	}
   10.24  
   10.25 -	next = razor_transaction_finish(trans);
   10.26 +	next = razor_transaction_commit(trans);
   10.27  
   10.28  	if (!option_justdb)
   10.29  		razor_set_diff(set, next, update_package, NULL);
   10.30  
   10.31 +	razor_transaction_destroy(trans);
   10.32  	razor_set_destroy(set);
   10.33  	razor_set_destroy(upstream);
   10.34  
   10.35 @@ -644,17 +649,21 @@
   10.36  
   10.37  	if (!option_nodeps && razor_transaction_describe(trans) > 0) {
   10.38  		printf("unsatisfied dependencies.\n");
   10.39 +		razor_transaction_destroy(trans);
   10.40  		exit(1);
   10.41  	}
   10.42  
   10.43 -	if (option_test)
   10.44 +	if (option_test) {
   10.45 +		razor_transaction_destroy(trans);
   10.46  		exit(0);
   10.47 +	}
   10.48  
   10.49 -	next = razor_transaction_finish(trans);
   10.50 +	next = razor_transaction_commit(trans);
   10.51  
   10.52  	if (!option_justdb)
   10.53  		razor_set_diff(set, next, update_package, NULL);
   10.54  
   10.55 +	razor_transaction_destroy(trans);
   10.56  	razor_set_destroy(set);
   10.57  	razor_set_destroy(upstream);
   10.58  
   10.59 @@ -686,17 +695,21 @@
   10.60  
   10.61  	if (!option_nodeps && razor_transaction_describe(trans) > 0) {
   10.62  		printf("unsatisfied dependencies.\n");
   10.63 +		razor_transaction_destroy(trans);
   10.64  		exit(1);
   10.65  	}
   10.66  
   10.67 -	if (option_test)
   10.68 +	if (option_test) {
   10.69 +		razor_transaction_destroy(trans);
   10.70  		exit(0);
   10.71 +	}
   10.72  
   10.73 -	next = razor_transaction_finish(trans);
   10.74 +	next = razor_transaction_commit(trans);
   10.75  
   10.76  	if (!option_justdb)
   10.77  		razor_set_diff(set, next, update_package, NULL);
   10.78  
   10.79 +	razor_transaction_destroy(trans);
   10.80  	razor_set_destroy(set);
   10.81  	razor_set_destroy(upstream);
   10.82  
    11.1 --- a/src/test-driver.c	Wed Jun 03 08:26:09 2009 +0100
    11.2 +++ b/src/test-driver.c	Fri Jun 12 16:59:11 2009 +0100
    11.3 @@ -1,6 +1,7 @@
    11.4  /*
    11.5   * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
    11.6   * Copyright (C) 2008  Red Hat, Inc
    11.7 + * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
    11.8   *
    11.9   * This program is free software; you can redistribute it and/or modify
   11.10   * it under the terms of the GNU General Public License as published by
   11.11 @@ -336,7 +337,8 @@
   11.12  
   11.13  	if (!errors) {
   11.14  		struct razor_set *new;
   11.15 -		new = razor_transaction_finish(ctx->trans);
   11.16 +		new = razor_transaction_commit(ctx->trans);
   11.17 +		razor_transaction_destroy(ctx->trans);
   11.18  		ctx->trans = NULL;
   11.19  		ctx->system_set = new;
   11.20  	}
    12.1 --- a/test/remove.sh	Wed Jun 03 08:26:09 2009 +0100
    12.2 +++ b/test/remove.sh	Fri Jun 12 16:59:11 2009 +0100
    12.3 @@ -1,4 +1,19 @@
    12.4  #!/bin/sh
    12.5 +fs_check_file()
    12.6 +{
    12.7 +    if [ ! -e "$RAZOR_ROOT$1" ]; then 
    12.8 +	echo $1: Not in filesystem >&2
    12.9 +	ls -R "$RAZOR_ROOT" >&2
   12.10 +	exit 1
   12.11 +    fi
   12.12 +}
   12.13 +fs_check_no_file()
   12.14 +{
   12.15 +    if [ -e "$RAZOR_ROOT$1" ]; then 
   12.16 +	echo $1: Still in filesystem >&2
   12.17 +	exit 1
   12.18 +    fi
   12.19 +}
   12.20  check_file()
   12.21  {
   12.22      ../src/razor list-files | grep -x "$1" > /dev/null
   12.23 @@ -28,10 +43,7 @@
   12.24  	    exit 1
   12.25  	fi
   12.26      done
   12.27 -    if [ ! -e "$RAZOR_ROOT$1" ]; then 
   12.28 -	echo $1: Not in filesystem >&2
   12.29 -	exit 1
   12.30 -    fi
   12.31 +    fs_check_file $1
   12.32  }
   12.33  check_no_file()
   12.34  {
   12.35 @@ -40,19 +52,18 @@
   12.36  	echo $1: Still in database >&2
   12.37  	exit 1
   12.38      fi
   12.39 -    if [ -e "$RAZOR_ROOT$1" ]; then 
   12.40 -	echo $1: Still in filesystem >&2
   12.41 -	exit 1
   12.42 -    fi
   12.43 +    fs_check_no_file $1
   12.44  }
   12.45  export RAZOR_ROOT=`mktemp -dt` || exit 1
   12.46  ../src/razor init || exit 1
   12.47  export YUM_URL="file://localhost/`pwd`"
   12.48  ../src/razor import-yum || exit 1
   12.49  ../src/razor install zip || exit 1
   12.50 +fs_check_file /usr/var/lib/zip/data.zap
   12.51  ../src/razor remove zip || exit 1
   12.52  check_file /usr/bin/zap
   12.53  check_no_file /usr/bin/zip
   12.54 +fs_check_no_file /usr/var/lib/zip/data.zap
   12.55  ../src/razor install zsh || exit 1
   12.56  ../src/razor install zsh2 || exit 1
   12.57  ../src/razor remove zsh || exit 1
    13.1 --- a/test/zip.spec	Wed Jun 03 08:26:09 2009 +0100
    13.2 +++ b/test/zip.spec	Fri Jun 12 16:59:11 2009 +0100
    13.3 @@ -43,7 +43,6 @@
    13.4  end
    13.5  
    13.6  %postun -p <lua>
    13.7 -print("zip: postun script\n");
    13.8  prefix=posix.getenv("RPM_INSTALL_PREFIX0")
    13.9  if prefix==nil then
   13.10      prefix="/usr"