# HG changeset patch # User Dan Winship # Date 1204646101 18000 # Node ID 59a9513fac5490db462d89add09f600bb7319364 # Parent 4819c228434ce562eccad7c57e5cb9edcf86ad70 Fix version handling (particularly wrt epoch) on import diff -r 4819c228434c -r 59a9513fac54 razor.c --- a/razor.c Mon Mar 03 16:19:56 2008 -0500 +++ b/razor.c Tue Mar 04 10:55:01 2008 -0500 @@ -229,6 +229,29 @@ } void +razor_build_evr(char *evr_buf, int size, const char *epoch, + const char *version, const char *release) +{ + int len; + + if (!version || !*version) { + *evr_buf = '\0'; + return; + } + + if (epoch && *epoch && strcmp(epoch, "0") != 0) { + len = snprintf(evr_buf, size, "%s:", epoch); + evr_buf += len; + size -= len; + } + len = snprintf(evr_buf, size, "%s", version); + evr_buf += len; + size -= len; + if (release && *release) + snprintf(evr_buf, size, "-%s", release); +} + +void razor_importer_begin_package(struct razor_importer *importer, const char *name, const char *version) { diff -r 4819c228434c -r 59a9513fac54 razor.h --- a/razor.h Mon Mar 03 16:19:56 2008 -0500 +++ b/razor.h Tue Mar 04 10:55:01 2008 -0500 @@ -130,7 +130,7 @@ struct razor_importer *razor_importer_new(void); void razor_importer_destroy(struct razor_importer *importer); void razor_importer_begin_package(struct razor_importer *importer, - const char *name, const char *version); + const char *name, const char *version); void razor_importer_add_property(struct razor_importer *importer, const char *name, enum razor_version_relation relation, @@ -145,6 +145,9 @@ struct razor_set *razor_importer_finish(struct razor_importer *importer); +void razor_build_evr(char *evr_buf, int size, const char *epoch, + const char *version, const char *release); + struct razor_set *razor_set_create_from_yum(void); struct razor_set *razor_set_create_from_rpmdb(void); diff -r 4819c228434c -r 59a9513fac54 rpm.c --- a/rpm.c Mon Mar 03 16:19:56 2008 -0500 +++ b/rpm.c Tue Mar 04 10:55:01 2008 -0500 @@ -109,7 +109,6 @@ flags = *(uint_32 *)razor_rpm_get_indirect(rpm, flags_tag, &count); - /* FIXME: Concat version and release. */ version = razor_rpm_get_indirect(rpm, version_tag, &count); for (i = 0; i < count; i++) { razor_importer_add_property(importer, name, @@ -525,14 +524,16 @@ int razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm) { - const char *name, *version, *release; + const char *name, *epoch, *version, *release; + char evr[128]; name = razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL); + epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL); version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL); release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL); - /* FIXME: Concatenate version and release. */ - razor_importer_begin_package(importer, name, version); + razor_build_evr(evr, sizeof evr, epoch, version, release); + razor_importer_begin_package(importer, name, evr); import_properties(importer, RAZOR_PROPERTY_REQUIRES, rpm, RPMTAG_REQUIRENAME, @@ -595,9 +596,9 @@ rpmdbMatchIterator iter; Header h; int_32 type, count, i; - union rpm_entry name, version, release; + union rpm_entry name, epoch, version, release; union rpm_entry basenames, dirnames, dirindexes; - char filename[PATH_MAX]; + char filename[PATH_MAX], evr[128]; rpmdb db; rpmReadConfigFiles(NULL, NULL); @@ -612,11 +613,12 @@ iter = rpmdbInitIterator(db, 0, NULL, 0); while (h = rpmdbNextIterator(iter), h != NULL) { headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count); + headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count); headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count); headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count); - snprintf(filename, sizeof filename, "%s-%s", - version.string, release.string); - razor_importer_begin_package(importer, name.string, filename); + razor_build_evr(evr, sizeof evr, epoch.string, version.string, + release.string); + razor_importer_begin_package(importer, name.string, evr); add_properties(importer, RAZOR_PROPERTY_REQUIRES, h, RPMTAG_REQUIRENAME, diff -r 4819c228434c -r 59a9513fac54 yum.c --- a/yum.c Mon Mar 03 16:19:56 2008 -0500 +++ b/yum.c Tue Mar 04 10:55:01 2008 -0500 @@ -62,7 +62,7 @@ yum_primary_start_element(void *data, const char *name, const char **atts) { struct yum_context *ctx = data; - const char *n, *version, *release, *flags; + const char *n, *epoch, *version, *release, *flags; char buffer[128]; int i; @@ -70,10 +70,13 @@ ctx->state = YUM_STATE_PACKAGE_NAME; ctx->p = ctx->name; } else if (strcmp(name, "version") == 0) { + epoch = NULL; version = NULL; release = NULL; for (i = 0; atts[i]; i += 2) { - if (strcmp(atts[i], "ver") == 0) + if (strcmp(atts[i], "epoch") == 0) + epoch = atts[i + 1]; + else if (strcmp(atts[i], "ver") == 0) version = atts[i + 1]; else if (strcmp(atts[i], "rel") == 0) release = atts[i + 1]; @@ -84,7 +87,7 @@ return; } - snprintf(buffer, sizeof buffer, "%s-%s", version, release); + razor_build_evr(buffer, sizeof buffer, epoch, version, release); razor_importer_begin_package(ctx->importer, ctx->name, buffer); } else if (strcmp(name, "checksum") == 0) { ctx->p = ctx->pkgid; @@ -100,12 +103,15 @@ } else if (strcmp(name, "rpm:entry") == 0 && ctx->state != YUM_STATE_BEGIN) { n = NULL; + epoch = NULL; version = NULL; release = NULL; flags = NULL; for (i = 0; atts[i]; i += 2) { if (strcmp(atts[i], "name") == 0) n = atts[i + 1]; + else if (strcmp(atts[i], "epoch") == 0) + epoch = atts[i + 1]; else if (strcmp(atts[i], "ver") == 0) version = atts[i + 1]; else if (strcmp(atts[i], "rel") == 0) @@ -120,14 +126,7 @@ return; } - if (version && release) - snprintf(buffer, sizeof buffer, - "%s-%s", version, release); - else if (version) - strcpy(buffer, version); - else - buffer[0] = '\0'; - + razor_build_evr(buffer, sizeof buffer, epoch, version, release); switch (ctx->state) { case YUM_STATE_REQUIRES: razor_importer_add_property(ctx->importer, n,