librazor/merger.c
changeset 371 d7eea3164151
parent 359 c9c90315ea24
child 372 6e93e5485947
     1.1 --- a/librazor/merger.c	Wed Apr 22 15:09:17 2009 +0100
     1.2 +++ b/librazor/merger.c	Thu Jul 02 11:31:45 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 @@ -18,6 +19,7 @@
    1.12   */
    1.13  
    1.14  #include <string.h>
    1.15 +#include <assert.h>
    1.16  #include "razor-internal.h"
    1.17  #include "razor.h"
    1.18  
    1.19 @@ -30,6 +32,7 @@
    1.20  };
    1.21  
    1.22  struct razor_merger {
    1.23 +	int committed;
    1.24  	struct razor_set *set;
    1.25  	struct hashtable table;
    1.26  	struct hashtable file_table;
    1.27 @@ -79,6 +82,8 @@
    1.28  	struct source *source;
    1.29  	uint32_t flags;
    1.30  
    1.31 +	assert(merger->committed == 0);
    1.32 +
    1.33  	set1 = merger->source1.set;
    1.34  	if (set1->packages.data <= (void *) package &&
    1.35  	    (void *) package < set1->packages.data + set1->packages.size) {
    1.36 @@ -111,6 +116,15 @@
    1.37  		source->file_map[r->data] = 1;
    1.38  		r = list_next(r);
    1.39  	}
    1.40 +
    1.41 +	p->preun.program = hashtable_tokenize(&merger->table,
    1.42 +					      &pool[package->preun.program]);
    1.43 +	p->preun.body = hashtable_tokenize(&merger->table,
    1.44 +					   &pool[package->preun.body]);
    1.45 +	p->postun.program = hashtable_tokenize(&merger->table,
    1.46 +					       &pool[package->postun.program]);
    1.47 +	p->postun.body = hashtable_tokenize(&merger->table,
    1.48 +					    &pool[package->postun.body]);
    1.49  }
    1.50  
    1.51  static uint32_t
    1.52 @@ -481,9 +495,8 @@
    1.53  }
    1.54  
    1.55  struct razor_set *
    1.56 -razor_merger_finish(struct razor_merger *merger)
    1.57 +razor_merger_commit(struct razor_merger *merger)
    1.58  {
    1.59 -	struct razor_set *result;
    1.60  	struct razor_package *p, *pend;
    1.61  
    1.62  	/* As we built the package list, we filled out a bitvector of
    1.63 @@ -523,10 +536,49 @@
    1.64  	rebuild_property_package_lists(merger->set);
    1.65  	rebuild_file_package_lists(merger->set);
    1.66  
    1.67 -	result = merger->set;
    1.68 +	merger->committed = 1;
    1.69 +
    1.70 +	return merger->set;
    1.71 +}
    1.72 +
    1.73 +void
    1.74 +razor_merger_package_add_script(struct razor_merger *merger,
    1.75 +				struct razor_package *package,
    1.76 +				enum razor_property_flags script,
    1.77 +				const char *program, const char *body)
    1.78 +{
    1.79 +	uint32_t p, b;
    1.80 +	char *pool;
    1.81 +	struct razor_set *set = merger->set;
    1.82 +	assert ((void *)package >= set->packages.data && \
    1.83 +	    (void *)package < set->packages.data + set->packages.size);
    1.84 +
    1.85 +	p = hashtable_tokenize(&merger->table, program);
    1.86 +	b = hashtable_tokenize(&merger->table, body);
    1.87 +
    1.88 +	pool = merger->set->string_pool.data;
    1.89 +
    1.90 +	switch (script) {
    1.91 +	case RAZOR_PROPERTY_PREUN:
    1.92 +		assert(pool[package->preun.program] == '\0');
    1.93 +		assert(pool[package->preun.body] == '\0');
    1.94 +		package->preun.program = p;
    1.95 +		package->preun.body = b;
    1.96 +		break;
    1.97 +	case RAZOR_PROPERTY_POSTUN:
    1.98 +		assert(pool[package->postun.program] == '\0');
    1.99 +		assert(pool[package->postun.body] == '\0');
   1.100 +		package->postun.program = p;
   1.101 +		package->postun.body = b;
   1.102 +		break;
   1.103 +	default:
   1.104 +		break;
   1.105 +	}
   1.106 +}
   1.107 +
   1.108 +void razor_merger_destroy(struct razor_merger *merger)
   1.109 +{
   1.110  	hashtable_release(&merger->table);
   1.111  	hashtable_release(&merger->file_table);
   1.112  	free(merger);
   1.113 -
   1.114 -	return result;
   1.115  }