Fix version handling (particularly wrt epoch) on import
authorDan Winship <danw@gnome.org>
Tue Mar 04 10:55:01 2008 -0500 (2008-03-04)
changeset 14359a9513fac54
parent 142 4819c228434c
child 144 56c487a56fa2
Fix version handling (particularly wrt epoch) on import
razor.c
razor.h
rpm.c
yum.c
     1.1 --- a/razor.c	Mon Mar 03 16:19:56 2008 -0500
     1.2 +++ b/razor.c	Tue Mar 04 10:55:01 2008 -0500
     1.3 @@ -229,6 +229,29 @@
     1.4  }
     1.5  
     1.6  void
     1.7 +razor_build_evr(char *evr_buf, int size, const char *epoch,
     1.8 +		const char *version, const char *release)
     1.9 +{
    1.10 +	int len;
    1.11 +
    1.12 +	if (!version || !*version) {
    1.13 +		*evr_buf = '\0';
    1.14 +		return;
    1.15 +	}
    1.16 +
    1.17 +	if (epoch && *epoch && strcmp(epoch, "0") != 0) {
    1.18 +		len = snprintf(evr_buf, size, "%s:", epoch);
    1.19 +		evr_buf += len;
    1.20 +		size -= len;
    1.21 +	}
    1.22 +	len = snprintf(evr_buf, size, "%s", version);
    1.23 +	evr_buf += len;
    1.24 +	size -= len;
    1.25 +	if (release && *release)
    1.26 +		snprintf(evr_buf, size, "-%s", release);
    1.27 +}
    1.28 +
    1.29 +void
    1.30  razor_importer_begin_package(struct razor_importer *importer,
    1.31  			     const char *name, const char *version)
    1.32  {
     2.1 --- a/razor.h	Mon Mar 03 16:19:56 2008 -0500
     2.2 +++ b/razor.h	Tue Mar 04 10:55:01 2008 -0500
     2.3 @@ -130,7 +130,7 @@
     2.4  struct razor_importer *razor_importer_new(void);
     2.5  void razor_importer_destroy(struct razor_importer *importer);
     2.6  void razor_importer_begin_package(struct razor_importer *importer,
     2.7 -				const char *name, const char *version);
     2.8 +				  const char *name, const char *version);
     2.9  void razor_importer_add_property(struct razor_importer *importer,
    2.10  				 const char *name,
    2.11  				 enum razor_version_relation relation,
    2.12 @@ -145,6 +145,9 @@
    2.13  
    2.14  struct razor_set *razor_importer_finish(struct razor_importer *importer);
    2.15  
    2.16 +void razor_build_evr(char *evr_buf, int size, const char *epoch,
    2.17 +		     const char *version, const char *release);
    2.18 +
    2.19  struct razor_set *razor_set_create_from_yum(void);
    2.20  struct razor_set *razor_set_create_from_rpmdb(void);
    2.21  
     3.1 --- a/rpm.c	Mon Mar 03 16:19:56 2008 -0500
     3.2 +++ b/rpm.c	Tue Mar 04 10:55:01 2008 -0500
     3.3 @@ -109,7 +109,6 @@
     3.4  
     3.5  	flags = *(uint_32 *)razor_rpm_get_indirect(rpm, flags_tag, &count);
     3.6  
     3.7 -	/* FIXME: Concat version and release. */
     3.8  	version = razor_rpm_get_indirect(rpm, version_tag, &count);
     3.9  	for (i = 0; i < count; i++) {
    3.10  		razor_importer_add_property(importer, name,
    3.11 @@ -525,14 +524,16 @@
    3.12  int
    3.13  razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm)
    3.14  {
    3.15 -	const char *name, *version, *release;
    3.16 +	const char *name, *epoch, *version, *release;
    3.17 +	char evr[128];
    3.18  
    3.19  	name = razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL);
    3.20 +	epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL);
    3.21  	version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL);
    3.22  	release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL);
    3.23  
    3.24 -	/* FIXME: Concatenate version and release. */
    3.25 -	razor_importer_begin_package(importer, name, version);
    3.26 +	razor_build_evr(evr, sizeof evr, epoch, version, release);
    3.27 +	razor_importer_begin_package(importer, name, evr);
    3.28  
    3.29  	import_properties(importer, RAZOR_PROPERTY_REQUIRES, rpm,
    3.30  			  RPMTAG_REQUIRENAME,
    3.31 @@ -595,9 +596,9 @@
    3.32  	rpmdbMatchIterator iter;
    3.33  	Header h;
    3.34  	int_32 type, count, i;
    3.35 -	union rpm_entry name, version, release;
    3.36 +	union rpm_entry name, epoch, version, release;
    3.37  	union rpm_entry basenames, dirnames, dirindexes;
    3.38 -	char filename[PATH_MAX];
    3.39 +	char filename[PATH_MAX], evr[128];
    3.40  	rpmdb db;
    3.41  
    3.42  	rpmReadConfigFiles(NULL, NULL);
    3.43 @@ -612,11 +613,12 @@
    3.44  	iter = rpmdbInitIterator(db, 0, NULL, 0);
    3.45  	while (h = rpmdbNextIterator(iter), h != NULL) {
    3.46  		headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count);
    3.47 +		headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count);
    3.48  		headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
    3.49  		headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
    3.50 -		snprintf(filename, sizeof filename, "%s-%s",
    3.51 -			 version.string, release.string);
    3.52 -		razor_importer_begin_package(importer, name.string, filename);
    3.53 +		razor_build_evr(evr, sizeof evr, epoch.string, version.string,
    3.54 +				release.string);
    3.55 +		razor_importer_begin_package(importer, name.string, evr);
    3.56  
    3.57  		add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
    3.58  			       RPMTAG_REQUIRENAME,
     4.1 --- a/yum.c	Mon Mar 03 16:19:56 2008 -0500
     4.2 +++ b/yum.c	Tue Mar 04 10:55:01 2008 -0500
     4.3 @@ -62,7 +62,7 @@
     4.4  yum_primary_start_element(void *data, const char *name, const char **atts)
     4.5  {
     4.6  	struct yum_context *ctx = data;
     4.7 -	const char *n, *version, *release, *flags;
     4.8 +	const char *n, *epoch, *version, *release, *flags;
     4.9  	char buffer[128];
    4.10  	int i;
    4.11  
    4.12 @@ -70,10 +70,13 @@
    4.13  		ctx->state = YUM_STATE_PACKAGE_NAME;
    4.14  		ctx->p = ctx->name;
    4.15  	} else if (strcmp(name, "version") == 0) {
    4.16 +		epoch = NULL;
    4.17  		version = NULL;
    4.18  		release = NULL;
    4.19  		for (i = 0; atts[i]; i += 2) {
    4.20 -			if (strcmp(atts[i], "ver") == 0)
    4.21 +			if (strcmp(atts[i], "epoch") == 0)
    4.22 +				epoch = atts[i + 1];
    4.23 +			else if (strcmp(atts[i], "ver") == 0)
    4.24  				version = atts[i + 1];
    4.25  			else if (strcmp(atts[i], "rel") == 0)
    4.26  				release = atts[i + 1];
    4.27 @@ -84,7 +87,7 @@
    4.28  			return;
    4.29  		}
    4.30  
    4.31 -		snprintf(buffer, sizeof buffer, "%s-%s", version, release);
    4.32 +		razor_build_evr(buffer, sizeof buffer, epoch, version, release);
    4.33  		razor_importer_begin_package(ctx->importer, ctx->name, buffer);
    4.34  	} else if (strcmp(name, "checksum") == 0) {
    4.35  		ctx->p = ctx->pkgid;
    4.36 @@ -100,12 +103,15 @@
    4.37  	} else if (strcmp(name, "rpm:entry") == 0 &&
    4.38  		   ctx->state != YUM_STATE_BEGIN) {
    4.39  		n = NULL;
    4.40 +		epoch = NULL;
    4.41  		version = NULL;
    4.42  		release = NULL;
    4.43  		flags = NULL;
    4.44  		for (i = 0; atts[i]; i += 2) {
    4.45  			if (strcmp(atts[i], "name") == 0)
    4.46  				n = atts[i + 1];
    4.47 +			else if (strcmp(atts[i], "epoch") == 0)
    4.48 +				epoch = atts[i + 1];
    4.49  			else if (strcmp(atts[i], "ver") == 0)
    4.50  				version = atts[i + 1];
    4.51  			else if (strcmp(atts[i], "rel") == 0)
    4.52 @@ -120,14 +126,7 @@
    4.53  			return;
    4.54  		}
    4.55  
    4.56 -		if (version && release)
    4.57 -			snprintf(buffer, sizeof buffer,
    4.58 -				 "%s-%s", version, release);
    4.59 -		else if (version)
    4.60 -			strcpy(buffer, version);
    4.61 -		else
    4.62 -			buffer[0] = '\0';
    4.63 -			
    4.64 +		razor_build_evr(buffer, sizeof buffer, epoch, version, release);
    4.65  		switch (ctx->state) {
    4.66  		case YUM_STATE_REQUIRES:
    4.67  			razor_importer_add_property(ctx->importer, n,