unduplicate file-finding code
authorDan Winship <danw@gnome.org>
Mon Mar 03 16:19:56 2008 -0500 (2008-03-03)
changeset 1424819c228434c
parent 141 9b56280ea8ea
child 143 59a9513fac54
unduplicate file-finding code
razor.c
     1.1 --- a/razor.c	Mon Mar 03 16:05:33 2008 -0500
     1.2 +++ b/razor.c	Mon Mar 03 16:19:56 2008 -0500
     1.3 @@ -1803,30 +1803,40 @@
     1.4  	return 0;
     1.5  }
     1.6  
     1.7 -static int
     1.8 -find_system_file(struct razor_transaction_resolver *trans,
     1.9 -		 int installed, int up)
    1.10 +static struct razor_package *
    1.11 +find_file(struct razor_set *set, struct bitarray *pkgbits,
    1.12 +	  const char *filename, int installed)
    1.13  {
    1.14 +	struct razor_package *pkgs = set->packages.data;
    1.15  	struct razor_entry *entry;
    1.16 -	struct razor_property *uprops = trans->upstream->properties.data;
    1.17 -	const char *upool = trans->upstream->string_pool.data;
    1.18 -	const char *filename = &upool[uprops[up].name];
    1.19  	struct list *p;
    1.20  
    1.21  	if (filename[0] != '/')
    1.22  		return 0;
    1.23  
    1.24 -	entry = find_entry(trans->system, trans->system->files.data, filename);
    1.25 +	entry = find_entry(set, set->files.data, filename);
    1.26  	if (!entry)
    1.27  		return 0;
    1.28  
    1.29 -	for (p = list_first(&entry->packages, &trans->system->package_pool);
    1.30 -	     p;
    1.31 -	     p = list_next(p)) {
    1.32 -		if (bitarray_get(&trans->syspkgs, p->data) == installed)
    1.33 -			return 1;
    1.34 +	for (p = list_first(&entry->packages, &set->package_pool); p; p = list_next(p)) {
    1.35 +		if (bitarray_get(pkgbits, p->data) == installed)
    1.36 +			return &pkgs[p->data];
    1.37  	}
    1.38 -	return 0;
    1.39 +	return NULL;
    1.40 +}
    1.41 +
    1.42 +static struct razor_package *
    1.43 +find_system_file(struct razor_transaction_resolver *trans,
    1.44 +		 const char *filename, int installed)
    1.45 +{
    1.46 +	return find_file(trans->system, &trans->syspkgs, filename, installed);
    1.47 +}
    1.48 +
    1.49 +static struct razor_package *
    1.50 +find_upstream_file(struct razor_transaction_resolver *trans,
    1.51 +		   const char *filename, int installed)
    1.52 +{
    1.53 +	return find_file(trans->upstream, &trans->uppkgs, filename, installed);
    1.54  }
    1.55  
    1.56  static struct razor_package *
    1.57 @@ -1955,31 +1965,6 @@
    1.58  	return find_upstream_provider(trans, 0, 1, &req, up);
    1.59  }
    1.60  
    1.61 -static struct razor_package *
    1.62 -find_upstream_file(struct razor_transaction_resolver *trans,
    1.63 -		   int installed, int up)
    1.64 -{
    1.65 -	struct razor_package *upkgs = trans->upstream->packages.data;
    1.66 -	struct razor_property *uprops = trans->upstream->properties.data;
    1.67 -	const char *upool = trans->upstream->string_pool.data;
    1.68 -	const char *filename = &upool[uprops[up].name];
    1.69 -	struct razor_entry *entry;
    1.70 -	struct list *pkg;
    1.71 -
    1.72 -	if (filename[0] != '/')
    1.73 -		return NULL;
    1.74 -
    1.75 -	entry = find_entry(trans->upstream, trans->upstream->files.data, filename);
    1.76 -	if (!entry)
    1.77 -		return NULL;
    1.78 -
    1.79 -	for (pkg = list_first(&entry->packages, &trans->upstream->package_pool); pkg; pkg = list_next(pkg)) {
    1.80 -		if (bitarray_get(&trans->uppkgs, pkg->data) == installed)
    1.81 -			return &upkgs[pkg->data];
    1.82 -	}
    1.83 -	return NULL;
    1.84 -}
    1.85 -
    1.86  static void
    1.87  add_transaction_package(struct razor_transaction_resolver *trans,
    1.88  			struct razor_package *package,
    1.89 @@ -2046,7 +2031,7 @@
    1.90  razor_transaction_satisfy_installs(struct razor_transaction_resolver *trans)
    1.91  {
    1.92  	struct razor_package *spkgs, *upkgs, *pkg;
    1.93 -	struct razor_property *sprops, *uprops;
    1.94 +	struct razor_property *prop, *sprops, *uprops;
    1.95  	int sp, up, ucount;
    1.96  	const char *upool;
    1.97  
    1.98 @@ -2069,15 +2054,16 @@
    1.99  		if (up == ucount)
   1.100  			break;
   1.101  
   1.102 -		switch (uprops[up].type) {
   1.103 +		prop = &uprops[up];
   1.104 +		switch (prop->type) {
   1.105  		case RAZOR_PROPERTY_REQUIRES:
   1.106 -			if (!strncmp(&upool[uprops[up].name], "rpmlib(", 7))
   1.107 +			if (!strncmp(&upool[prop->name], "rpmlib(", 7))
   1.108  				break;
   1.109  
   1.110 -			if (find_system_provider(trans, 1, 0, &uprops[up], &sp) ||
   1.111 -			    find_upstream_provider(trans, 1, 0, &uprops[up], up) ||
   1.112 -			    find_system_file(trans, 1, up) ||
   1.113 -			    find_upstream_file(trans, 1, up)) {
   1.114 +			if (find_system_provider(trans, 1, 0, prop, &sp) ||
   1.115 +			    find_upstream_provider(trans, 1, 0, prop, up) ||
   1.116 +			    find_system_file(trans, &upool[prop->name], 1) ||
   1.117 +			    find_upstream_file(trans, &upool[prop->name], 1)) {
   1.118  				/* Requires something that is either installed
   1.119  				 * or to-be-installed.
   1.120  				 */
   1.121 @@ -2085,56 +2071,56 @@
   1.122  			}
   1.123  
   1.124  			/* See if we can install a new upstream provider */
   1.125 -			pkg = find_upstream_provider(trans, 0, 0, &uprops[up], up);
   1.126 +			pkg = find_upstream_provider(trans, 0, 0, prop, up);
   1.127  			if (!pkg)
   1.128 -				pkg = find_upstream_file(trans, 0, up);
   1.129 +				pkg = find_upstream_file(trans, &upool[prop->name], 0);
   1.130  			add_transaction_package(trans, pkg, trans->upstream,
   1.131  						RAZOR_PACKAGE_INSTALL,
   1.132 -						&uprops[up], trans->upstream);
   1.133 +						prop, trans->upstream);
   1.134  			break;
   1.135  
   1.136  		case RAZOR_PROPERTY_CONFLICTS:
   1.137 -			if ((pkg = find_system_provider(trans, 1, 1, &uprops[up], &sp))) {
   1.138 +			if ((pkg = find_system_provider(trans, 1, 1, prop, &sp))) {
   1.139  				struct razor_package *upgrade;
   1.140  
   1.141  				/* Conflicts with something already installed.
   1.142  				 * Try to upgrade out.
   1.143  				 */
   1.144 -				upgrade = find_upgrade(trans, &uprops[up], up);
   1.145 +				upgrade = find_upgrade(trans, prop, up);
   1.146  				if (upgrade) {
   1.147  					bitarray_set(&trans->syspkgs, pkg - spkgs, 0);
   1.148  					add_transaction_package(trans, upgrade,
   1.149  								trans->upstream,
   1.150  								RAZOR_PACKAGE_INSTALL,
   1.151 -								&uprops[up], trans->upstream);
   1.152 +								prop, trans->upstream);
   1.153  				} else {
   1.154  					add_transaction_package(trans, pkg,
   1.155  								trans->system, 
   1.156  								RAZOR_PACKAGE_INSTALL_CONFLICT,
   1.157 -								&uprops[up], trans->upstream);
   1.158 +								prop, trans->upstream);
   1.159  				}
   1.160 -			} else if ((pkg = find_upstream_provider(trans, 1, 1, &uprops[up], up))) {
   1.161 +			} else if ((pkg = find_upstream_provider(trans, 1, 1, prop, up))) {
   1.162  				/* Conflicts with something already to-be-installed */
   1.163  				add_transaction_package(trans, pkg,
   1.164  							trans->upstream, 
   1.165  							RAZOR_PACKAGE_INSTALL_CONFLICT,
   1.166 -							&uprops[up], trans->upstream);
   1.167 +							prop, trans->upstream);
   1.168  			}
   1.169  			break;
   1.170  
   1.171  		case RAZOR_PROPERTY_OBSOLETES:
   1.172 -			if ((pkg = find_system_provider(trans, 1, 1, &uprops[up], &sp))) {
   1.173 +			if ((pkg = find_system_provider(trans, 1, 1, prop, &sp))) {
   1.174  				/* Obsoletes something installed */
   1.175  				add_transaction_package(trans, pkg,
   1.176  							trans->system, 
   1.177  							RAZOR_PACKAGE_REMOVE,
   1.178 -							&uprops[up], trans->upstream);
   1.179 -			} else if ((pkg = find_upstream_provider(trans, 1, 1, &uprops[up], up))) {
   1.180 +							prop, trans->upstream);
   1.181 +			} else if ((pkg = find_upstream_provider(trans, 1, 1, prop, up))) {
   1.182  				/* Obsoletes something that was to-be-installed */
   1.183  				add_transaction_package(trans, pkg,
   1.184  							trans->upstream, 
   1.185  							RAZOR_PACKAGE_REMOVE_CONFLICT,
   1.186 -							&uprops[up], trans->upstream);
   1.187 +							prop, trans->upstream);
   1.188  			}
   1.189  			break;
   1.190