librazor/razor.c
changeset 382 4e261a14a6bd
parent 377 5549419824b4
child 383 6e73f3f08309
     1.1 --- a/librazor/razor.c	Wed Jul 08 22:14:16 2009 +0100
     1.2 +++ b/librazor/razor.c	Thu Aug 13 07:14:51 2009 +0100
     1.3 @@ -469,7 +469,8 @@
     1.4  
     1.5  /**
     1.6   * razor_package_remove:
     1.7 - * @set: a %razor_set
     1.8 + * @prev: The %razor_set before the current transaction
     1.9 + * @next: The %razor_set after the current transaction is applied
    1.10   * @package: a %razor_package
    1.11   * @root: the root into which the package is currently installed
    1.12   * @install_count: the value to pass to uninstall scripts
    1.13 @@ -477,8 +478,9 @@
    1.14   * Removes an installed package.
    1.15   **/
    1.16  RAZOR_EXPORT int
    1.17 -razor_package_remove(struct razor_set *set, struct razor_package *package,
    1.18 -		     const char *root, int install_count)
    1.19 +razor_package_remove(struct razor_set *prev, struct razor_set *next,
    1.20 +		     struct razor_package *package, const char *root,
    1.21 +		     int install_count)
    1.22  {
    1.23  	struct razor_file_iterator *fi;
    1.24  	struct razor_package_iterator *pi;
    1.25 @@ -491,16 +493,16 @@
    1.26  	const char *prefix;
    1.27  
    1.28  	environment_init(&env);
    1.29 -	link = list_first(&package->install_prefixes, &set->prefix_pool);
    1.30 +	link = list_first(&package->install_prefixes, &prev->prefix_pool);
    1.31  	for (i = 0; link; i++) {
    1.32 -		prefix = (const char *)set->string_pool.data + link->data;
    1.33 +		prefix = (const char *)prev->string_pool.data + link->data;
    1.34  		sprintf(buffer, "RPM_INSTALL_PREFIX%d", i);
    1.35  		environment_add_variable(&env, buffer, prefix);
    1.36  		link = list_next(link);
    1.37  	}
    1.38  	environment_set(&env);
    1.39  
    1.40 -	razor_package_get_details(set, package,
    1.41 +	razor_package_get_details(prev, package,
    1.42  				  RAZOR_DETAIL_PREUNPROG, &program,
    1.43  				  RAZOR_DETAIL_PREUN, &script,
    1.44  				  RAZOR_DETAIL_LAST);
    1.45 @@ -508,15 +510,15 @@
    1.46  	retval = razor_run_script(root, RAZOR_PROPERTY_PREUN, program, script,
    1.47  				  install_count);
    1.48  
    1.49 -	fi = razor_file_iterator_create(set, package, 1);
    1.50 +	fi = razor_file_iterator_create(prev, package, 1);
    1.51  
    1.52  	while (razor_file_iterator_next(fi, &name)) {
    1.53 -		pi = razor_package_iterator_create_for_file(set, name);
    1.54 +		pi = razor_package_iterator_create_for_file(next, name);
    1.55  		count = 0;
    1.56  		while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
    1.57  			count++;
    1.58  		razor_package_iterator_destroy(pi);
    1.59 -		if (count <= 1) {
    1.60 +		if (count <= 0) {
    1.61  			snprintf(buffer, sizeof buffer, "%s%s", root, name);
    1.62  			if (razor_remove(buffer) && errno != ENOENT) {
    1.63  				perror(name);
    1.64 @@ -527,7 +529,7 @@
    1.65  
    1.66  	razor_file_iterator_destroy(fi);
    1.67  
    1.68 -	razor_package_get_details(set, package,
    1.69 +	razor_package_get_details(prev, package,
    1.70  				  RAZOR_DETAIL_POSTUNPROG, &program,
    1.71  				  RAZOR_DETAIL_POSTUN, &script,
    1.72  				  RAZOR_DETAIL_LAST);
    1.73 @@ -878,29 +880,38 @@
    1.74  
    1.75  RAZOR_EXPORT int
    1.76  razor_install_iterator_next(struct razor_install_iterator *ii,
    1.77 -			    struct razor_set **set,
    1.78  			    struct razor_package **package,
    1.79  			    enum razor_install_action *action,
    1.80  			    int *count)
    1.81  {
    1.82  	struct install_action *a;
    1.83 +	struct razor_package_iterator *pi;
    1.84 +	struct razor_package *pkg;
    1.85 +	const char *removing, *name;
    1.86 +
    1.87  	if (deque_empty(ii->order))
    1.88  		return 0;
    1.89  
    1.90  	a = (struct install_action *)ii->actions.data + deque_pop(ii->order);
    1.91 -	switch (a->action) {
    1.92 -	case RAZOR_INSTALL_ACTION_ADD:
    1.93 -		*set = ii->next;
    1.94 -		break;
    1.95 -	case RAZOR_INSTALL_ACTION_REMOVE:
    1.96 -		*set = ii->set;
    1.97 -		break;
    1.98 -	}
    1.99 -
   1.100  	*package = a->package;
   1.101  	*action = a->action;
   1.102  	*count = 0;
   1.103  
   1.104 +	if (a->action == RAZOR_INSTALL_ACTION_REMOVE) {
   1.105 +		razor_package_get_details(ii->set, a->package,
   1.106 +					  RAZOR_DETAIL_NAME, &removing,
   1.107 +					  RAZOR_DETAIL_LAST);
   1.108 +
   1.109 +		pi = razor_package_iterator_create(ii->next);
   1.110 +		while (razor_package_iterator_next(pi, &pkg,
   1.111 +						   RAZOR_DETAIL_NAME, &name,
   1.112 +						   RAZOR_DETAIL_LAST)) {
   1.113 +			if (!strcmp(name, removing))
   1.114 +				(*count)++;
   1.115 +		}
   1.116 +		razor_package_iterator_destroy(pi);
   1.117 +	}
   1.118 +
   1.119  	return 1;
   1.120  }
   1.121