Record the time of dependencies (post, pre, postun, preun).
authorKristian H?gsberg <krh@redhat.com>
Fri Jun 20 14:18:52 2008 -0400 (2008-06-20)
changeset 24763444a10fb8e
parent 246 f92d8239324e
child 248 057933050c42
Record the time of dependencies (post, pre, postun, preun).
librazor/razor.c
librazor/razor.h
librazor/rpm.c
src/import-rpmdb.c
src/import-yum.c
src/main.c
src/rpm.c
     1.1 --- a/librazor/razor.c	Thu Jun 19 15:09:48 2008 -0400
     1.2 +++ b/librazor/razor.c	Fri Jun 20 14:18:52 2008 -0400
     1.3 @@ -70,10 +70,8 @@
     1.4  };
     1.5  
     1.6  struct razor_property {
     1.7 -	uint name  : 24;
     1.8 -	uint flags : 6;
     1.9 -	enum razor_property_type type : 2;
    1.10 -	enum razor_version_relation relation : 32;
    1.11 +	uint32_t name;
    1.12 +	uint32_t flags;
    1.13  	uint32_t version;
    1.14  	struct list_head packages;
    1.15  };
    1.16 @@ -316,6 +314,7 @@
    1.17  	array_init(&importer->properties);
    1.18  }
    1.19  
    1.20 +
    1.21  void
    1.22  razor_importer_finish_package(struct razor_importer *importer)
    1.23  {
    1.24 @@ -330,18 +329,15 @@
    1.25  void
    1.26  razor_importer_add_property(struct razor_importer *importer,
    1.27  			    const char *name,
    1.28 -			    enum razor_version_relation relation,
    1.29 -			    const char *version,
    1.30 -			    enum razor_property_type type)
    1.31 +			    uint32_t flags,
    1.32 +			    const char *version)
    1.33  {
    1.34  	struct razor_property *p;
    1.35  	uint32_t *r;
    1.36  
    1.37  	p = array_add(&importer->set->properties, sizeof *p);
    1.38  	p->name = hashtable_tokenize(&importer->table, name);
    1.39 -	p->flags = 0;
    1.40 -	p->type = type;
    1.41 -	p->relation = relation;
    1.42 +	p->flags = flags;
    1.43  	p->version = hashtable_tokenize(&importer->table, version);
    1.44  	list_set_ptr(&p->packages, importer->package -
    1.45  		     (struct razor_package *) importer->set->packages.data);
    1.46 @@ -349,7 +345,8 @@
    1.47  	r = array_add(&importer->properties, sizeof *r);
    1.48  	*r = p - (struct razor_property *) importer->set->properties.data;
    1.49  
    1.50 -	if (type == RAZOR_PROPERTY_REQUIRES && *name == '/') {
    1.51 +	if (((flags & RAZOR_PROPERTY_TYPE_MASK) == RAZOR_PROPERTY_REQUIRES) &&
    1.52 +	    *name == '/') {
    1.53  		r = array_add(&importer->file_requires, sizeof *r);
    1.54  		*r = p->name;
    1.55  	}
    1.56 @@ -446,10 +443,8 @@
    1.57  
    1.58  	if (prop1->name != prop2->name)
    1.59  		return strcmp(&pool[prop1->name], &pool[prop2->name]);
    1.60 -	else if (prop1->type != prop2->type)
    1.61 -		return prop1->type - prop2->type;
    1.62 -	else if (prop1->relation != prop2->relation)
    1.63 -		return prop1->relation - prop2->relation;
    1.64 +	else if (prop1->flags != prop2->flags)
    1.65 +		return prop1->flags - prop2->flags;
    1.66  	else
    1.67  		return versioncmp(&pool[prop1->version], &pool[prop2->version]);
    1.68  }
    1.69 @@ -474,13 +469,12 @@
    1.70  	rmap = malloc(count * sizeof *map);
    1.71  	pkgs = zalloc(count * sizeof *pkgs);
    1.72  	for (rp = set->properties.data, up = rp, i = 0; rp < rp_end; rp++, i++) {
    1.73 -		if (rp->name != up->name || rp->type != up->type ||
    1.74 -		    rp->relation != up->relation || rp->version != up->version) {
    1.75 +		if (rp->name != up->name ||
    1.76 +		    rp->flags != up->flags ||
    1.77 +		    rp->version != up->version) {
    1.78  			up++;
    1.79  			up->name = rp->name;
    1.80 -			up->flags = 0;
    1.81 -			up->type = rp->type;
    1.82 -			up->relation = rp->relation;
    1.83 +			up->flags = rp->flags;
    1.84  			up->version = rp->version;
    1.85  		}
    1.86  
    1.87 @@ -718,8 +712,8 @@
    1.88  		for (pkg = list_first(&entry->packages, &importer->set->package_pool); pkg; pkg = list_next(pkg)) {
    1.89  			prop = array_add(&importer->set->properties, sizeof *prop);
    1.90  			prop->name = *req;
    1.91 -			prop->type = RAZOR_PROPERTY_PROVIDES;
    1.92 -			prop->relation = RAZOR_VERSION_EQUAL;
    1.93 +			prop->flags =
    1.94 +				RAZOR_PROPERTY_PROVIDES | RAZOR_PROPERTY_EQUAL;
    1.95  			prop->version = hashtable_tokenize(&importer->table, "");
    1.96  			list_set_ptr(&prop->packages, pkg->data);
    1.97  
    1.98 @@ -950,9 +944,8 @@
    1.99  razor_property_iterator_next(struct razor_property_iterator *pi,
   1.100  			     struct razor_property **property,
   1.101  			     const char **name,
   1.102 -			     enum razor_version_relation *relation,
   1.103 -			     const char **version,
   1.104 -			     enum razor_property_type *type)
   1.105 +			     uint32_t *flags,
   1.106 +			     const char **version)
   1.107  {
   1.108  	char *pool;
   1.109  	int valid;
   1.110 @@ -973,9 +966,8 @@
   1.111  		pool = pi->set->string_pool.data;
   1.112  		*property = p;
   1.113  		*name = &pool[p->name];
   1.114 -		*relation = p->relation;
   1.115 +		*flags = p->flags;
   1.116  		*version = &pool[p->version];
   1.117 -		*type = p->type;
   1.118  	} else {
   1.119  		*property = NULL;
   1.120  	}
   1.121 @@ -1242,16 +1234,13 @@
   1.122  
   1.123  static uint32_t
   1.124  add_property(struct razor_merger *merger,
   1.125 -	     const char *name, enum razor_version_relation relation,
   1.126 -	     const char *version, int type)
   1.127 +	     const char *name, uint32_t flags, const char *version)
   1.128  {
   1.129  	struct razor_property *p;
   1.130  
   1.131  	p = array_add(&merger->set->properties, sizeof *p);
   1.132  	p->name = hashtable_tokenize(&merger->table, name);
   1.133 -	p->flags = 0;
   1.134 -	p->type = type;
   1.135 -	p->relation = relation;
   1.136 +	p->flags = flags;
   1.137  	p->version = hashtable_tokenize(&merger->table, version);
   1.138  
   1.139  	return p - (struct razor_property *) merger->set->properties.data;
   1.140 @@ -1296,30 +1285,26 @@
   1.141  		else
   1.142  			cmp = 1;
   1.143  		if (cmp == 0)
   1.144 -			cmp = p1->type - p2->type;
   1.145 -		if (cmp == 0)
   1.146 -			cmp = p1->relation - p2->relation;
   1.147 +			cmp = p1->flags - p2->flags;
   1.148  		if (cmp == 0)
   1.149  			cmp = versioncmp(&pool1[p1->version],
   1.150  					 &pool2[p2->version]);
   1.151  		if (cmp < 0) {
   1.152  			map1[i++] = add_property(merger,
   1.153  						 &pool1[p1->name],
   1.154 -						 p1->relation,
   1.155 -						 &pool1[p1->version],
   1.156 -						 p1->type);
   1.157 +						 p1->flags,
   1.158 +						 &pool1[p1->version]);
   1.159  		} else if (cmp > 0) {
   1.160  			map2[j++] = add_property(merger,
   1.161  						 &pool2[p2->name],
   1.162 -						 p2->relation,
   1.163 -						 &pool2[p2->version],
   1.164 -						 p2->type);
   1.165 +						 p2->flags,
   1.166 +						 &pool2[p2->version]);
   1.167  		} else  {
   1.168 -			map1[i++] = map2[j++] = add_property(merger,
   1.169 -							     &pool1[p1->name],
   1.170 -							     p1->relation,
   1.171 -							     &pool1[p1->version],
   1.172 -							     p1->type);
   1.173 +			map1[i++] = map2[j++] =
   1.174 +				add_property(merger,
   1.175 +					     &pool1[p1->name],
   1.176 +					     p1->flags,
   1.177 +					     &pool1[p1->version]);
   1.178  		}
   1.179  	}
   1.180  }
   1.181 @@ -1709,7 +1694,7 @@
   1.182  static int
   1.183  provider_satisfies_requirement(struct razor_property *provider,
   1.184  			       const char *provider_strings,
   1.185 -			       enum razor_version_relation relation,
   1.186 +			       uint32_t flags,
   1.187  			       const char *required)
   1.188  {
   1.189  	int cmp, len;
   1.190 @@ -1718,24 +1703,24 @@
   1.191  	if (!*required)
   1.192  		return 1;
   1.193  	if (!*provided) {
   1.194 -		if (relation >= RAZOR_VERSION_EQUAL)
   1.195 +		if (flags & RAZOR_PROPERTY_LESS)
   1.196 +			return 0;
   1.197 +		else
   1.198  			return 1;
   1.199 -		else
   1.200 -			return 0;
   1.201  	}
   1.202  
   1.203  	cmp = versioncmp(provided, required);
   1.204  
   1.205 -	switch (relation) {
   1.206 -	case RAZOR_VERSION_LESS:
   1.207 +	switch (flags & RAZOR_PROPERTY_RELATION_MASK) {
   1.208 +	case RAZOR_PROPERTY_LESS:
   1.209  		return cmp < 0;
   1.210  
   1.211 -	case RAZOR_VERSION_LESS_OR_EQUAL:
   1.212 +	case RAZOR_PROPERTY_LESS | RAZOR_PROPERTY_EQUAL:
   1.213  		if (cmp <= 0)
   1.214  			return 1;
   1.215  		/* fall through: FIXME, make sure this is correct */
   1.216  
   1.217 -	case RAZOR_VERSION_EQUAL:
   1.218 +	case RAZOR_PROPERTY_EQUAL:
   1.219  		if (cmp == 0)
   1.220  			return 1;
   1.221  
   1.222 @@ -1745,10 +1730,10 @@
   1.223  			return 1;
   1.224  		return 0;
   1.225  
   1.226 -	case RAZOR_VERSION_GREATER_OR_EQUAL:
   1.227 +	case RAZOR_PROPERTY_GREATER | RAZOR_PROPERTY_EQUAL:
   1.228  		return cmp >= 0;
   1.229  
   1.230 -	case RAZOR_VERSION_GREATER:
   1.231 +	case RAZOR_PROPERTY_GREATER:
   1.232  		return cmp > 0;
   1.233  	}
   1.234  
   1.235 @@ -1903,12 +1888,11 @@
   1.236  }
   1.237  
   1.238  static int
   1.239 -prop_iter_next(struct prop_iter *pi,
   1.240 -	       enum razor_property_type type, struct razor_property **p)
   1.241 +prop_iter_next(struct prop_iter *pi, uint32_t flags, struct razor_property **p)
   1.242  {
   1.243  	while (pi->p < pi->end) {
   1.244  		if ((pi->present[pi->p - pi->start] & ~TRANS_PROPERTY_SATISFIED) &&
   1.245 -		    pi->p->type == type) {
   1.246 +		    (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) == flags) {
   1.247  			*p = pi->p++;
   1.248  			return 1;
   1.249  		}
   1.250 @@ -1920,7 +1904,7 @@
   1.251  
   1.252  static struct razor_property *
   1.253  prop_iter_seek_to(struct prop_iter *pi,
   1.254 -		  enum razor_property_type type, const char *match)
   1.255 +		  uint32_t flags, const char *match)
   1.256  {
   1.257  	uint32_t name;
   1.258  
   1.259 @@ -1933,7 +1917,7 @@
   1.260  	name = pi->p->name;
   1.261  	while (pi->p < pi->end &&
   1.262  	       pi->p->name == name &&
   1.263 -	       pi->p->type != type)
   1.264 +	       (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) != flags)
   1.265  		pi->p++;
   1.266  
   1.267  	if (pi->p == pi->end || pi->p->name != name)
   1.268 @@ -1948,7 +1932,7 @@
   1.269  static void
   1.270  remove_matching_providers(struct razor_transaction *trans,
   1.271  			  struct prop_iter *ppi,
   1.272 -			  enum razor_version_relation relation,
   1.273 +			  uint32_t flags,
   1.274  			  const char *version)
   1.275  {
   1.276  	struct razor_property *p;
   1.277 @@ -1956,6 +1940,7 @@
   1.278  	struct razor_package_iterator pkg_iter;
   1.279  	struct razor_set *set;
   1.280  	const char *n, *v, *a;
   1.281 +	uint32_t type;
   1.282  
   1.283  	if (ppi->present == trans->system.properties)
   1.284  		set = trans->system.set;
   1.285 @@ -1963,15 +1948,16 @@
   1.286  		set = trans->upstream.set;
   1.287  
   1.288  	pkgs = (struct razor_package *) set->packages.data;
   1.289 +	type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
   1.290  	for (p = ppi->p;
   1.291  	     p < ppi->end &&
   1.292  	     p->name == ppi->p->name &&
   1.293 -	     p->type == ppi->p->type;
   1.294 +	     (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
   1.295  	     p++) {
   1.296  		if (!ppi->present[p - ppi->start])
   1.297  			continue;
   1.298  		if (!provider_satisfies_requirement(p, ppi->pool,
   1.299 -						    relation, version))
   1.300 +						    flags, version))
   1.301  			continue;
   1.302  
   1.303  		razor_package_iterator_init_for_property(&pkg_iter, set, p);
   1.304 @@ -1995,7 +1981,7 @@
   1.305  	struct razor_package_iterator pkg_iter;
   1.306  	struct razor_set *set;
   1.307  	const char *name, *version, *arch;
   1.308 -	uint32_t *flags;
   1.309 +	uint32_t *flags, type;
   1.310  
   1.311  	if (ppi->present == trans->system.properties) {
   1.312  		set = trans->system.set;
   1.313 @@ -2006,15 +1992,16 @@
   1.314  	}
   1.315  
   1.316  	pkgs = (struct razor_package *) set->packages.data;
   1.317 +	type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
   1.318  	for (p = ppi->p;
   1.319  	     p < ppi->end &&
   1.320  		     p->name == ppi->p->name &&
   1.321 -		     p->type == ppi->p->type;
   1.322 +		     (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
   1.323  	     p++) {
   1.324  		if (!ppi->present[p - ppi->start])
   1.325  			continue;
   1.326  		if (!provider_satisfies_requirement(p, ppi->pool,
   1.327 -						    r->relation,
   1.328 +						    r->flags,
   1.329  						    &rpi->pool[r->version]))
   1.330  			continue;
   1.331  
   1.332 @@ -2035,12 +2022,13 @@
   1.333  static struct razor_package *
   1.334  pick_matching_provider(struct razor_set *set,
   1.335  		       struct prop_iter *ppi,
   1.336 -		       enum razor_version_relation relation,
   1.337 +		       uint32_t flags,
   1.338  		       const char *version)
   1.339  {
   1.340  	struct razor_property *p;
   1.341  	struct razor_package *pkgs;
   1.342  	struct list *i;
   1.343 +	uint32_t type;
   1.344  
   1.345  	/* This is where we decide which pkgs to pull in to satisfy a
   1.346  	 * requirement.  There may be several different providers
   1.347 @@ -2049,14 +2037,15 @@
   1.348  	 * from the first provider that matches. */
   1.349  
   1.350  	pkgs = set->packages.data;
   1.351 +	type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
   1.352  	for (p = ppi->p;
   1.353  	     p < ppi->end &&
   1.354  		     p->name == ppi->p->name &&
   1.355 -		     p->type == ppi->p->type &&
   1.356 +		     (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type &&
   1.357  		     ppi->present[p - ppi->start] == 0;
   1.358  	     p++) {
   1.359  		if (!provider_satisfies_requirement(p, ppi->pool,
   1.360 -						    relation, version))
   1.361 +						    flags, version))
   1.362  			continue;
   1.363  
   1.364  		i = list_first(&p->packages, &set->package_pool);
   1.365 @@ -2082,26 +2071,28 @@
   1.366  		if (!prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
   1.367  				       &upi.pool[up->name]))
   1.368  			continue;
   1.369 -		remove_matching_providers(trans, &spi, up->relation,
   1.370 +		remove_matching_providers(trans, &spi, up->flags,
   1.371  					  &upi.pool[up->version]);
   1.372  	}
   1.373  }
   1.374  
   1.375  static int
   1.376  any_provider_satisfies_requirement(struct prop_iter *ppi,
   1.377 -				   enum razor_version_relation relation,
   1.378 +				   uint32_t flags,
   1.379  				   const char *version)
   1.380  {
   1.381  	struct razor_property *p;
   1.382 -
   1.383 +	uint32_t type;
   1.384 +
   1.385 +	type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
   1.386  	for (p = ppi->p;
   1.387  	     p < ppi->end &&
   1.388  		     p->name == ppi->p->name &&
   1.389 -		     p->type == ppi->p->type;
   1.390 +		     (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
   1.391  	     p++) {
   1.392  		if (ppi->present[p - ppi->start] > 0 &&
   1.393  		    provider_satisfies_requirement(p, ppi->pool,
   1.394 -						   relation, version))
   1.395 +						   flags, version))
   1.396  			return 1;
   1.397  	}
   1.398  
   1.399 @@ -2125,7 +2116,46 @@
   1.400  	}
   1.401  }
   1.402  
   1.403 -static const char *relation_string[] = { "<", "<=", "=", ">=", ">" };
   1.404 +const char *
   1.405 +razor_property_relation_to_string(struct razor_property *p)
   1.406 +{
   1.407 +	switch (p->flags & RAZOR_PROPERTY_RELATION_MASK) {
   1.408 +	case RAZOR_PROPERTY_LESS:
   1.409 +		return "<";
   1.410 +
   1.411 +	case RAZOR_PROPERTY_LESS | RAZOR_PROPERTY_EQUAL:
   1.412 +		return "<=";
   1.413 +
   1.414 +	case RAZOR_PROPERTY_EQUAL:
   1.415 +		return "=";
   1.416 +
   1.417 +	case RAZOR_PROPERTY_GREATER | RAZOR_PROPERTY_EQUAL:
   1.418 +		return ">=";
   1.419 +
   1.420 +	case RAZOR_PROPERTY_GREATER:
   1.421 +		return ">";
   1.422 +
   1.423 +	default:
   1.424 +		return "?";
   1.425 +	}
   1.426 +}
   1.427 +
   1.428 +const char *
   1.429 +razor_property_type_to_string(struct razor_property *p)
   1.430 +{
   1.431 +	switch (p->flags & RAZOR_PROPERTY_TYPE_MASK) {
   1.432 +	case RAZOR_PROPERTY_REQUIRES:
   1.433 +		return "requires";
   1.434 +	case RAZOR_PROPERTY_PROVIDES:
   1.435 +		return "provides";
   1.436 +	case RAZOR_PROPERTY_CONFLICTS:
   1.437 +		return "conflicts";
   1.438 +	case RAZOR_PROPERTY_OBSOLETES:
   1.439 +		return "obsoletes";
   1.440 +	default:
   1.441 +		return NULL;
   1.442 +	}
   1.443 +}
   1.444  
   1.445  static void
   1.446  mark_satisfied_requires(struct razor_transaction *trans,
   1.447 @@ -2143,7 +2173,7 @@
   1.448  				       &rpi.pool[rp->name]))
   1.449  			continue;
   1.450  
   1.451 -		if (any_provider_satisfies_requirement(&ppi, rp->relation,
   1.452 +		if (any_provider_satisfies_requirement(&ppi, rp->flags,
   1.453  						       &rpi.pool[rp->version]))
   1.454  			rpi.present[rp - rpi.start] |= TRANS_PROPERTY_SATISFIED;
   1.455  	}
   1.456 @@ -2184,7 +2214,7 @@
   1.457  			fprintf(stderr, "updating %s because %s %s %s "
   1.458  				"isn't satisfied\n",
   1.459  				name, spi.pool + sp->name,
   1.460 -				relation_string[sp->relation],
   1.461 +				razor_property_relation_to_string(sp),
   1.462  				spi.pool + sp->version);
   1.463  			trans->system.packages[pkg - spkgs] |=
   1.464  				TRANS_PACKAGE_UPDATE;
   1.465 @@ -2221,7 +2251,7 @@
   1.466  				       &spi.pool[sp->name]))
   1.467  			continue;
   1.468  
   1.469 -		if (!any_provider_satisfies_requirement(&upi, sp->relation,
   1.470 +		if (!any_provider_satisfies_requirement(&upi, sp->flags,
   1.471  							&spi.pool[sp->version]))
   1.472  			continue;
   1.473  
   1.474 @@ -2267,7 +2297,7 @@
   1.475  		if (pp == NULL)
   1.476  			continue;
   1.477  		pkg = pick_matching_provider(trans->upstream.set,
   1.478 -					     ppi, rp->relation,
   1.479 +					     ppi, rp->flags,
   1.480  					     &rpi->pool[rp->version]);
   1.481  		if (pkg == NULL)
   1.482  			continue;
   1.483 @@ -2278,10 +2308,10 @@
   1.484  			"to satisfy %s %s %s\n",
   1.485  			ppi->pool + pkg->name,
   1.486  			ppi->pool + pp->name,
   1.487 -			relation_string[pp->relation],
   1.488 +			razor_property_relation_to_string(pp),
   1.489  			ppi->pool + pp->version,
   1.490  			&rpi->pool[rp->name],
   1.491 -			relation_string[rp->relation],
   1.492 +			razor_property_relation_to_string(rp),
   1.493  			&rpi->pool[rp->version]);
   1.494  
   1.495  		trans->upstream.packages[pkg - upkgs] |= TRANS_PACKAGE_UPDATE;
   1.496 @@ -2322,7 +2352,7 @@
   1.497  			continue;
   1.498  
   1.499  		pkg = pick_matching_provider(trans->upstream.set, &ppi,
   1.500 -					     RAZOR_VERSION_GREATER, version);
   1.501 +					     RAZOR_PROPERTY_GREATER, version);
   1.502  		if (pkg == NULL)
   1.503  			continue;
   1.504  
   1.505 @@ -2354,8 +2384,10 @@
   1.506  			continue;
   1.507  
   1.508  		if (prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES, name))
   1.509 -			remove_matching_providers(trans, &spi,
   1.510 -						  RAZOR_VERSION_LESS, version);
   1.511 +			remove_matching_providers(trans,
   1.512 +						  &spi,
   1.513 +						  RAZOR_PROPERTY_LESS,
   1.514 +						  version);
   1.515  		razor_transaction_install_package(trans, p);
   1.516  		fprintf(stderr, "installing %s-%s\n", name, version);
   1.517  	}
   1.518 @@ -2404,7 +2436,7 @@
   1.519  						   &name, &version, &arch))
   1.520  			fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
   1.521  				&pool[rp->name],
   1.522 -				relation_string[rp->relation],
   1.523 +				razor_property_relation_to_string(rp),
   1.524  				&pool[rp->version],
   1.525  				name, version, arch);
   1.526  	}
   1.527 @@ -2444,17 +2476,16 @@
   1.528  int
   1.529  razor_transaction_unsatisfied_property(struct razor_transaction *trans,
   1.530  				       const char *name,
   1.531 -				       enum razor_version_relation rel,
   1.532 -				       const char *version,
   1.533 -				       enum razor_property_type type)
   1.534 +				       uint32_t flags,
   1.535 +				       const char *version)
   1.536  {
   1.537  	struct prop_iter pi;
   1.538  	struct razor_property *p;
   1.539  
   1.540  	prop_iter_init(&pi, &trans->system);
   1.541 -	while (prop_iter_next(&pi, type, &p)) {
   1.542 +	while (prop_iter_next(&pi, flags, &p)) {
   1.543  		if (!(trans->system.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
   1.544 -		    p->relation == rel &&
   1.545 +		    p->flags == flags &&
   1.546  		    strcmp(&pi.pool[p->name], name) == 0 &&
   1.547  		    strcmp(&pi.pool[p->version], version) == 0)
   1.548  
   1.549 @@ -2462,9 +2493,9 @@
   1.550  	}
   1.551  
   1.552  	prop_iter_init(&pi, &trans->upstream);
   1.553 -	while (prop_iter_next(&pi, type, &p)) {
   1.554 +	while (prop_iter_next(&pi, flags, &p)) {
   1.555  		if (!(trans->upstream.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
   1.556 -		    p->relation == rel &&
   1.557 +		    p->flags == flags &&
   1.558  		    strcmp(&pi.pool[p->name], name) == 0 &&
   1.559  		    strcmp(&pi.pool[p->version], version) == 0)
   1.560  
     2.1 --- a/librazor/razor.h	Thu Jun 19 15:09:48 2008 -0400
     2.2 +++ b/librazor/razor.h	Fri Jun 20 14:18:52 2008 -0400
     2.3 @@ -26,21 +26,31 @@
     2.4  struct razor_package;
     2.5  struct razor_property;
     2.6  
     2.7 -enum razor_property_type {
     2.8 -	RAZOR_PROPERTY_REQUIRES,
     2.9 -	RAZOR_PROPERTY_PROVIDES,
    2.10 -	RAZOR_PROPERTY_CONFLICTS,
    2.11 -	RAZOR_PROPERTY_OBSOLETES
    2.12 +enum razor_property_flags {
    2.13 +	RAZOR_PROPERTY_LESS		= 1 << 0,
    2.14 +	RAZOR_PROPERTY_GREATER		= 1 << 1,
    2.15 +	RAZOR_PROPERTY_EQUAL		= 1 << 2,
    2.16 +	RAZOR_PROPERTY_RELATION_MASK	=
    2.17 +		RAZOR_PROPERTY_LESS |
    2.18 +		RAZOR_PROPERTY_GREATER |
    2.19 +		RAZOR_PROPERTY_EQUAL,
    2.20 +
    2.21 +	RAZOR_PROPERTY_REQUIRES		= 0 << 3,
    2.22 +	RAZOR_PROPERTY_PROVIDES		= 1 << 3,
    2.23 +	RAZOR_PROPERTY_CONFLICTS	= 2 << 3,
    2.24 +	RAZOR_PROPERTY_OBSOLETES	= 3 << 3,
    2.25 +	RAZOR_PROPERTY_TYPE_MASK	= 3 << 3,
    2.26 +		
    2.27 +	RAZOR_PROPERTY_PRE		= 1 << 5,
    2.28 +	RAZOR_PROPERTY_POST		= 1 << 6,
    2.29 +	RAZOR_PROPERTY_PREUN		= 1 << 7,
    2.30 +	RAZOR_PROPERTY_POSTUN		= 1 << 8
    2.31  };
    2.32  
    2.33 -enum razor_version_relation {
    2.34 -	RAZOR_VERSION_LESS,
    2.35 -	RAZOR_VERSION_LESS_OR_EQUAL,
    2.36 -	RAZOR_VERSION_EQUAL,
    2.37 -	RAZOR_VERSION_GREATER_OR_EQUAL,
    2.38 -	RAZOR_VERSION_GREATER
    2.39 -};
    2.40 -extern const char * const razor_version_relations[];
    2.41 +const char *
    2.42 +razor_property_relation_to_string(struct razor_property *p);
    2.43 +const char *
    2.44 +razor_property_type_to_string(struct razor_property *p);
    2.45  
    2.46  struct razor_set *razor_set_create(void);
    2.47  struct razor_set *razor_set_open(const char *filename);
    2.48 @@ -86,9 +96,8 @@
    2.49  int razor_property_iterator_next(struct razor_property_iterator *pi,
    2.50  				 struct razor_property **property,
    2.51  				 const char **name,
    2.52 -				 enum razor_version_relation *relation,
    2.53 -				 const char **version,
    2.54 -				 enum razor_property_type *type);
    2.55 +				 uint32_t *flags,
    2.56 +				 const char **version);
    2.57  void
    2.58  razor_property_iterator_destroy(struct razor_property_iterator *pi);
    2.59  
    2.60 @@ -125,9 +134,8 @@
    2.61  /* Temporary helper for test suite. */
    2.62  int razor_transaction_unsatisfied_property(struct razor_transaction *trans,
    2.63  					   const char *name,
    2.64 -					   enum razor_version_relation rel,
    2.65 -					   const char *version,
    2.66 -					   enum razor_property_type type);
    2.67 +					   uint32_t flags,
    2.68 +					   const char *version);
    2.69  
    2.70  /* Importer interface; for building a razor set from external sources,
    2.71   * like yum, rpmdb or razor package files. */
    2.72 @@ -143,9 +151,8 @@
    2.73  				  const char *arch);
    2.74  void razor_importer_add_property(struct razor_importer *importer,
    2.75  				 const char *name,
    2.76 -				 enum razor_version_relation relation,
    2.77 -				 const char *version,
    2.78 -				 enum razor_property_type type);
    2.79 +				 uint32_t flags,
    2.80 +				 const char *version);
    2.81  void razor_importer_add_file(struct razor_importer *importer,
    2.82  			     const char *name);
    2.83  void razor_importer_finish_package(struct razor_importer *importer);
     3.1 --- a/librazor/rpm.c	Thu Jun 19 15:09:48 2008 -0400
     3.2 +++ b/librazor/rpm.c	Fri Jun 20 14:18:52 2008 -0400
     3.3 @@ -48,9 +48,14 @@
     3.4  };
     3.5  
     3.6  enum {
     3.7 -    RPMSENSE_LESS	= (1 << 1),
     3.8 -    RPMSENSE_GREATER	= (1 << 2),
     3.9 -    RPMSENSE_EQUAL	= (1 << 3),
    3.10 +    RPMSENSE_LESS		= 1 << 1,
    3.11 +    RPMSENSE_GREATER		= 1 << 2,
    3.12 +    RPMSENSE_EQUAL		= 1 << 3,
    3.13 +    RPMSENSE_PREREQ		= 1 << 6,
    3.14 +    RPMSENSE_SCRIPT_PRE		= 1 << 9,
    3.15 +    RPMSENSE_SCRIPT_POST	= 1 << 10,
    3.16 +    RPMSENSE_SCRIPT_PREUN	= 1 << 11,
    3.17 +    RPMSENSE_SCRIPT_POSTUN	= 1 << 12,
    3.18  };
    3.19  
    3.20  enum {
    3.21 @@ -269,28 +274,33 @@
    3.22  	return NULL;
    3.23  }
    3.24  
    3.25 -static enum razor_version_relation
    3.26 +static uint32_t
    3.27  rpm_to_razor_flags(uint32_t flags)
    3.28  {
    3.29 -	switch (flags & (RPMSENSE_LESS | RPMSENSE_EQUAL | RPMSENSE_GREATER)) {
    3.30 -	case RPMSENSE_LESS:
    3.31 -		return RAZOR_VERSION_LESS;
    3.32 -	case RPMSENSE_LESS|RPMSENSE_EQUAL:
    3.33 -		return RAZOR_VERSION_LESS_OR_EQUAL;
    3.34 -	case RPMSENSE_EQUAL:
    3.35 -		return RAZOR_VERSION_EQUAL;
    3.36 -	case RPMSENSE_GREATER|RPMSENSE_EQUAL:
    3.37 -		return RAZOR_VERSION_GREATER_OR_EQUAL;
    3.38 -	case RPMSENSE_GREATER:
    3.39 -		return RAZOR_VERSION_GREATER;
    3.40 -	}
    3.41 +	uint32_t razor_flags;
    3.42  
    3.43 -	/* FIXME? */
    3.44 -	return RAZOR_VERSION_EQUAL;
    3.45 +	razor_flags = 0;
    3.46 +	if (flags & RPMSENSE_LESS)
    3.47 +		razor_flags |= RAZOR_PROPERTY_LESS;
    3.48 +	if (flags & RPMSENSE_EQUAL)
    3.49 +		razor_flags |= RAZOR_PROPERTY_EQUAL;
    3.50 +	if (flags & RPMSENSE_GREATER)
    3.51 +		razor_flags |= RAZOR_PROPERTY_GREATER;
    3.52 +
    3.53 +	if (flags & RPMSENSE_SCRIPT_PRE)
    3.54 +		razor_flags |= RAZOR_PROPERTY_PRE;
    3.55 +	if (flags & RPMSENSE_SCRIPT_POST)
    3.56 +		razor_flags |= RAZOR_PROPERTY_POST;
    3.57 +	if (flags & RPMSENSE_SCRIPT_PREUN)
    3.58 +		razor_flags |= RAZOR_PROPERTY_PREUN;
    3.59 +	if (flags & RPMSENSE_SCRIPT_POSTUN)
    3.60 +		razor_flags |= RAZOR_PROPERTY_POSTUN;
    3.61 +	
    3.62 +	return razor_flags;
    3.63  }
    3.64  
    3.65  static void
    3.66 -import_properties(struct razor_importer *importer, unsigned long type,
    3.67 +import_properties(struct razor_importer *importer, uint32_t type,
    3.68  		  struct razor_rpm *rpm,
    3.69  		  int name_tag, int version_tag, int flags_tag)
    3.70  {
    3.71 @@ -308,7 +318,7 @@
    3.72  	version = razor_rpm_get_indirect(rpm, version_tag, &count);
    3.73  	for (i = 0; i < count; i++) {
    3.74  		f = rpm_to_razor_flags(ntohl(flags[i]));
    3.75 -		razor_importer_add_property(importer, name, f, version, type);
    3.76 +		razor_importer_add_property(importer, name, f | type, version);
    3.77  		name += strlen(name) + 1;
    3.78  		version += strlen(version) + 1;
    3.79  	}
     4.1 --- a/src/import-rpmdb.c	Thu Jun 19 15:09:48 2008 -0400
     4.2 +++ b/src/import-rpmdb.c	Fri Jun 20 14:18:52 2008 -0400
     4.3 @@ -34,29 +34,34 @@
     4.4  	uint_32 integer;
     4.5  };
     4.6  
     4.7 -static enum razor_version_relation
     4.8 -rpm_to_razor_flags (uint_32 flags)
     4.9 +static uint32_t
    4.10 +rpm_to_razor_flags(uint32_t flags)
    4.11  {
    4.12 -	switch (flags & (RPMSENSE_LESS | RPMSENSE_EQUAL | RPMSENSE_GREATER)) {
    4.13 -	case RPMSENSE_LESS:
    4.14 -		return RAZOR_VERSION_LESS;
    4.15 -	case RPMSENSE_LESS|RPMSENSE_EQUAL:
    4.16 -		return RAZOR_VERSION_LESS_OR_EQUAL;
    4.17 -	case RPMSENSE_EQUAL:
    4.18 -		return RAZOR_VERSION_EQUAL;
    4.19 -	case RPMSENSE_GREATER|RPMSENSE_EQUAL:
    4.20 -		return RAZOR_VERSION_GREATER_OR_EQUAL;
    4.21 -	case RPMSENSE_GREATER:
    4.22 -		return RAZOR_VERSION_GREATER;
    4.23 -	}
    4.24 +	uint32_t razor_flags;
    4.25  
    4.26 -	/* FIXME? */
    4.27 -	return RAZOR_VERSION_EQUAL;
    4.28 +	razor_flags = 0;
    4.29 +	if (flags & RPMSENSE_LESS)
    4.30 +		razor_flags |= RAZOR_PROPERTY_LESS;
    4.31 +	if (flags & RPMSENSE_EQUAL)
    4.32 +		razor_flags |= RAZOR_PROPERTY_EQUAL;
    4.33 +	if (flags & RPMSENSE_GREATER)
    4.34 +		razor_flags |= RAZOR_PROPERTY_GREATER;
    4.35 +
    4.36 +	if (flags & RPMSENSE_SCRIPT_PRE)
    4.37 +		razor_flags |= RAZOR_PROPERTY_PRE;
    4.38 +	if (flags & RPMSENSE_SCRIPT_POST)
    4.39 +		razor_flags |= RAZOR_PROPERTY_POST;
    4.40 +	if (flags & RPMSENSE_SCRIPT_PREUN)
    4.41 +		razor_flags |= RAZOR_PROPERTY_PREUN;
    4.42 +	if (flags & RPMSENSE_SCRIPT_POSTUN)
    4.43 +		razor_flags |= RAZOR_PROPERTY_POSTUN;
    4.44 +
    4.45 +	return razor_flags;
    4.46  }
    4.47  
    4.48  static void
    4.49  add_properties(struct razor_importer *importer,
    4.50 -	       enum razor_property_type property_type,
    4.51 +	       uint32_t type_flags,
    4.52  	       Header h, int_32 name_tag, int_32 version_tag, int_32 flags_tag)
    4.53  {
    4.54  	union rpm_entry names, versions, flags;
    4.55 @@ -69,9 +74,8 @@
    4.56  	for (i = 0; i < count; i++)
    4.57  		razor_importer_add_property(importer,
    4.58  					    names.list[i],
    4.59 -					    rpm_to_razor_flags (flags.flags[i]),
    4.60 -					    versions.list[i],
    4.61 -					    property_type);
    4.62 +					    rpm_to_razor_flags (flags.flags[i]) | type_flags,
    4.63 +					    versions.list[i]);
    4.64  }
    4.65  
    4.66  struct razor_set *
     5.1 --- a/src/import-yum.c	Thu Jun 19 15:09:48 2008 -0400
     5.2 +++ b/src/import-yum.c	Fri Jun 20 14:18:52 2008 -0400
     5.3 @@ -21,6 +21,7 @@
     5.4  
     5.5  #include <string.h>
     5.6  #include <stdio.h>
     5.7 +#include <stdint.h>
     5.8  #include <sys/stat.h>
     5.9  #include <sys/mman.h>
    5.10  #include <unistd.h>
    5.11 @@ -54,36 +55,34 @@
    5.12  	struct import_property_context *current_property_context;
    5.13  	char name[256], arch[64], buffer[512], *p;
    5.14  	char pkgid[128];
    5.15 +	uint32_t property_type;
    5.16  	int state;
    5.17  };
    5.18  
    5.19 -static enum razor_version_relation
    5.20 -yum_to_razor_flags (const char *flags)
    5.21 +static uint32_t
    5.22 +yum_to_razor_relation (const char *flags)
    5.23  {
    5.24 -	/* FIXME? */
    5.25 -	if (!flags)
    5.26 -		return RAZOR_VERSION_EQUAL;
    5.27 -
    5.28  	if (flags[0] == 'L') {
    5.29  		if (flags[1] == 'T')
    5.30 -			return RAZOR_VERSION_LESS;
    5.31 +			return RAZOR_PROPERTY_LESS;
    5.32  		else
    5.33 -			return RAZOR_VERSION_LESS_OR_EQUAL;
    5.34 +			return RAZOR_PROPERTY_LESS | RAZOR_PROPERTY_EQUAL;
    5.35  	} else if (flags[0] == 'G') {
    5.36  		if (flags[1] == 'T')
    5.37 -			return RAZOR_VERSION_GREATER;
    5.38 +			return RAZOR_PROPERTY_GREATER;
    5.39  		else
    5.40 -			return RAZOR_VERSION_GREATER_OR_EQUAL;
    5.41 +			return RAZOR_PROPERTY_GREATER | RAZOR_PROPERTY_EQUAL;
    5.42  	} else
    5.43 -		return RAZOR_VERSION_EQUAL;
    5.44 +		return RAZOR_PROPERTY_EQUAL;
    5.45  }
    5.46  
    5.47  static void
    5.48  yum_primary_start_element(void *data, const char *name, const char **atts)
    5.49  {
    5.50  	struct yum_context *ctx = data;
    5.51 -	const char *n, *epoch, *version, *release, *flags;
    5.52 +	const char *n, *epoch, *version, *release;
    5.53  	char buffer[128];
    5.54 +	uint32_t pre, relation, flags;
    5.55  	int i;
    5.56  
    5.57  	if (strcmp(name, "name") == 0) {
    5.58 @@ -118,19 +117,24 @@
    5.59  		ctx->state = YUM_STATE_CHECKSUM;
    5.60  	} else if (strcmp(name, "rpm:requires") == 0) {
    5.61  		ctx->state = YUM_STATE_REQUIRES;
    5.62 +		ctx->property_type = RAZOR_PROPERTY_REQUIRES;
    5.63  	} else if (strcmp(name, "rpm:provides") == 0) {
    5.64  		ctx->state = YUM_STATE_PROVIDES;
    5.65 +		ctx->property_type = RAZOR_PROPERTY_PROVIDES;
    5.66  	} else if (strcmp(name, "rpm:obsoletes") == 0) {
    5.67  		ctx->state = YUM_STATE_OBSOLETES;
    5.68 +		ctx->property_type = RAZOR_PROPERTY_OBSOLETES;
    5.69  	} else if (strcmp(name, "rpm:conflicts") == 0) {
    5.70  		ctx->state = YUM_STATE_CONFLICTS;
    5.71 +		ctx->property_type = RAZOR_PROPERTY_CONFLICTS;
    5.72  	} else if (strcmp(name, "rpm:entry") == 0 &&
    5.73  		   ctx->state != YUM_STATE_BEGIN) {
    5.74  		n = NULL;
    5.75  		epoch = NULL;
    5.76  		version = NULL;
    5.77  		release = NULL;
    5.78 -		flags = NULL;
    5.79 +		relation = RAZOR_PROPERTY_EQUAL;
    5.80 +		pre = 0;
    5.81  		for (i = 0; atts[i]; i += 2) {
    5.82  			if (strcmp(atts[i], "name") == 0)
    5.83  				n = atts[i + 1];
    5.84 @@ -141,7 +145,13 @@
    5.85  			else if (strcmp(atts[i], "rel") == 0)
    5.86  				release = atts[i + 1];
    5.87  			else if (strcmp(atts[i], "flags") == 0)
    5.88 -				flags = atts[i + 1];
    5.89 +				relation = yum_to_razor_relation(atts[i + 1]);
    5.90 +			else if (strcmp(atts[i], "pre") == 0)
    5.91 +				pre = 
    5.92 +					RAZOR_PROPERTY_PRE |
    5.93 +					RAZOR_PROPERTY_POST |
    5.94 +					RAZOR_PROPERTY_PREUN |
    5.95 +					RAZOR_PROPERTY_POSTUN;
    5.96  		}
    5.97  
    5.98  		if (n == NULL) {
    5.99 @@ -151,32 +161,8 @@
   5.100  		}
   5.101  
   5.102  		razor_build_evr(buffer, sizeof buffer, epoch, version, release);
   5.103 -		switch (ctx->state) {
   5.104 -		case YUM_STATE_REQUIRES:
   5.105 -			razor_importer_add_property(ctx->importer, n,
   5.106 -						    yum_to_razor_flags (flags),
   5.107 -						    buffer,
   5.108 -						    RAZOR_PROPERTY_REQUIRES);
   5.109 -			break;
   5.110 -		case YUM_STATE_PROVIDES:
   5.111 -			razor_importer_add_property(ctx->importer, n,
   5.112 -						    yum_to_razor_flags (flags),
   5.113 -						    buffer,
   5.114 -						    RAZOR_PROPERTY_PROVIDES);
   5.115 -			break;
   5.116 -		case YUM_STATE_OBSOLETES:
   5.117 -			razor_importer_add_property(ctx->importer, n,
   5.118 -						    yum_to_razor_flags (flags),
   5.119 -						    buffer,
   5.120 -						    RAZOR_PROPERTY_OBSOLETES);
   5.121 -			break;
   5.122 -		case YUM_STATE_CONFLICTS:
   5.123 -			razor_importer_add_property(ctx->importer, n,
   5.124 -						    yum_to_razor_flags (flags),
   5.125 -						    buffer,
   5.126 -						    RAZOR_PROPERTY_CONFLICTS);
   5.127 -			break;
   5.128 -		}
   5.129 +		flags = ctx->property_type | relation | pre;
   5.130 +		razor_importer_add_property(ctx->importer, n, flags, buffer);
   5.131  	}
   5.132  }
   5.133  
     6.1 --- a/src/main.c	Thu Jun 19 15:09:48 2008 -0400
     6.2 +++ b/src/main.c	Fri Jun 20 14:18:52 2008 -0400
     6.3 @@ -73,17 +73,14 @@
     6.4  }
     6.5  
     6.6  static int
     6.7 -list_properties(const char *package_name,
     6.8 -		enum razor_property_type required_type)
     6.9 +list_properties(const char *package_name, uint32_t type)
    6.10  {
    6.11 -	static const char *relation_string[] = { "<", "<=", "=", ">=", ">" };
    6.12  	struct razor_set *set;
    6.13  	struct razor_property *property;
    6.14  	struct razor_package *package;
    6.15  	struct razor_property_iterator *pi;
    6.16  	const char *name, *version;
    6.17 -	enum razor_property_type type;
    6.18 -	enum razor_version_relation relation;
    6.19 +	uint32_t flags;
    6.20  
    6.21  	set = razor_set_open(repo_filename);
    6.22  	if (package_name)
    6.23 @@ -93,15 +90,28 @@
    6.24  
    6.25  	pi = razor_property_iterator_create(set, package);
    6.26  	while (razor_property_iterator_next(pi, &property,
    6.27 -					    &name, &relation, &version,
    6.28 -					    &type)) {
    6.29 -		if (type != required_type)
    6.30 +					    &name, &flags, &version)) {
    6.31 +		if ((flags & RAZOR_PROPERTY_TYPE_MASK) != type)
    6.32  			continue;
    6.33 -		if (version[0] == '\0')
    6.34 -			printf("%s\n", name);
    6.35 -		else
    6.36 -			printf("%s %s %s\n", name,
    6.37 -			       relation_string[relation], version);
    6.38 +		printf("%s", name);
    6.39 +		if (version[0] != '\0')
    6.40 +			printf(" %s %s",
    6.41 +			       razor_property_relation_to_string(property),
    6.42 +			       version);
    6.43 +
    6.44 +		if (flags & ~(RAZOR_PROPERTY_RELATION_MASK | RAZOR_PROPERTY_TYPE_MASK)) {
    6.45 +			printf(" [");
    6.46 +			if (flags & RAZOR_PROPERTY_PRE)
    6.47 +				printf(" pre");
    6.48 +			if (flags & RAZOR_PROPERTY_POST)
    6.49 +				printf(" post");
    6.50 +			if (flags & RAZOR_PROPERTY_PREUN)
    6.51 +				printf(" preun");
    6.52 +			if (flags & RAZOR_PROPERTY_POSTUN)
    6.53 +				printf(" postun");
    6.54 +			printf(" ]");
    6.55 +		}
    6.56 +		printf("\n");
    6.57  	}
    6.58  	razor_property_iterator_destroy(pi);
    6.59  
    6.60 @@ -203,14 +213,13 @@
    6.61  static int
    6.62  list_property_packages(const char *ref_name,
    6.63  		       const char *ref_version,
    6.64 -		       enum razor_property_type ref_type)
    6.65 +		       uint32_t type)
    6.66  {
    6.67  	struct razor_set *set;
    6.68  	struct razor_property *property;
    6.69  	struct razor_property_iterator *pi;
    6.70  	const char *name, *version;
    6.71 -	enum razor_property_type type;
    6.72 -	enum razor_version_relation relation;
    6.73 +	uint32_t flags;
    6.74  
    6.75  	if (ref_name == NULL)
    6.76  		return 0;
    6.77 @@ -221,14 +230,14 @@
    6.78  
    6.79  	pi = razor_property_iterator_create(set, NULL);
    6.80  	while (razor_property_iterator_next(pi, &property,
    6.81 -					    &name, &relation, &version,
    6.82 -					    &type)) {
    6.83 +					    &name, &flags, &version)) {
    6.84  		if (strcmp(ref_name, name) != 0)
    6.85  			continue;
    6.86 -		if (ref_version && relation == RAZOR_VERSION_EQUAL &&
    6.87 +		if (ref_version &&
    6.88 +		    (flags & RAZOR_PROPERTY_RELATION_MASK) == RAZOR_PROPERTY_EQUAL &&
    6.89  		    strcmp(ref_version, version) != 0)
    6.90  			continue;
    6.91 -		if (ref_type != type)
    6.92 +		if ((flags & RAZOR_PROPERTY_TYPE_MASK) != type)
    6.93  			continue;
    6.94  
    6.95  		list_packages_for_property(set, property);
     7.1 --- a/src/rpm.c	Thu Jun 19 15:09:48 2008 -0400
     7.2 +++ b/src/rpm.c	Fri Jun 20 14:18:52 2008 -0400
     7.3 @@ -20,6 +20,7 @@
     7.4  #include <stdlib.h>
     7.5  #include <string.h>
     7.6  #include <stdio.h>
     7.7 +#include <stdint.h>
     7.8  #include <dirent.h>
     7.9  #include "razor.h"
    7.10  
    7.11 @@ -257,24 +258,24 @@
    7.12  		      struct razor_package_query *query,
    7.13  		      const char *ref_name,
    7.14  		      const char *ref_version,
    7.15 -		      enum razor_property_type ref_type)
    7.16 +		      uint32_t ref_type)
    7.17  {
    7.18  	struct razor_property *property;
    7.19  	struct razor_property_iterator *pi;
    7.20  	struct razor_package_iterator *pkgi;
    7.21  	const char *name, *version;
    7.22 -	enum razor_property_type type;
    7.23 -	enum razor_version_relation relation;
    7.24 +	uint32_t flags;
    7.25  
    7.26  	pi = razor_property_iterator_create(set, NULL);
    7.27  	while (razor_property_iterator_next(pi, &property, &name,
    7.28 -					    &relation, &version, &type)) {
    7.29 +					    &flags, &version)) {
    7.30  		if (strcmp(ref_name, name) != 0)
    7.31  			continue;
    7.32 -		if (ref_version && relation == RAZOR_VERSION_EQUAL &&
    7.33 +		if (ref_version &&
    7.34 +		    (flags & RAZOR_PROPERTY_RELATION_MASK) == RAZOR_PROPERTY_EQUAL &&
    7.35  		    strcmp(ref_version, version) != 0)
    7.36  			continue;
    7.37 -		if (ref_type != type)
    7.38 +		if ((flags & RAZOR_PROPERTY_TYPE_MASK) != ref_type)
    7.39  			continue;
    7.40  
    7.41  		pkgi = razor_package_iterator_create_for_property(set,
    7.42 @@ -369,30 +370,27 @@
    7.43  	return razor_package_query_finish(query);
    7.44  }
    7.45  
    7.46 -static const char *relation_string[] = { "<", "<=", "=", ">=", ">" };
    7.47 -
    7.48  static void
    7.49  print_package_properties(struct razor_set *set,
    7.50  			 struct razor_package *package,
    7.51 -			 enum razor_property_type ref_type)
    7.52 +			 uint32_t ref_type)
    7.53  {
    7.54  	struct razor_property *property;
    7.55  	struct razor_property_iterator *pi;
    7.56  	const char *name, *version;
    7.57 -	enum razor_property_type type;
    7.58 -	enum razor_version_relation relation;
    7.59 +	uint32_t flags;
    7.60  
    7.61  	pi = razor_property_iterator_create(set, package);
    7.62  	while (razor_property_iterator_next(pi, &property,
    7.63 -					    &name, &relation, &version,
    7.64 -					    &type)) {
    7.65 -		if (type != ref_type)
    7.66 +					    &name, &flags, &version)) {
    7.67 +		if ((flags & RAZOR_PROPERTY_TYPE_MASK) != ref_type)
    7.68  			continue;
    7.69  		if (version[0] == '\0')
    7.70  			printf("%s\n", name);
    7.71  		else
    7.72  			printf("%s %s %s\n", name,
    7.73 -			       relation_string[relation], version);
    7.74 +			       razor_property_relation_to_string(property),
    7.75 +			       version);
    7.76  	}
    7.77  	razor_property_iterator_destroy(pi);
    7.78  }