From: Dan Winship Date: Tue, 4 Mar 2008 15:55:01 +0000 (-0500) Subject: Fix version handling (particularly wrt epoch) on import X-Git-Tag: 0.1~218 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=60970a45d474d25601a3596f7eae4dfd33e192ef;p=razor2.git%2F.git Fix version handling (particularly wrt epoch) on import --- diff --git a/razor.c b/razor.c index 1eec941..605f8a8 100644 --- a/razor.c +++ b/razor.c @@ -229,6 +229,29 @@ razor_set_write(struct razor_set *set, const char *filename) } 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 --git a/razor.h b/razor.h index 59d9867..930a745 100644 --- a/razor.h +++ b/razor.h @@ -130,7 +130,7 @@ struct razor_rpm; 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 @@ int razor_importer_add_rpm(struct razor_importer *importer, 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 --git a/rpm.c b/rpm.c index 5091afc..366ca51 100644 --- a/rpm.c +++ b/rpm.c @@ -109,7 +109,6 @@ import_properties(struct razor_importer *importer, unsigned long type, 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 @@ razor_rpm_close(struct razor_rpm *rpm) 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 @@ razor_set_create_from_rpmdb(void) 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 @@ razor_set_create_from_rpmdb(void) 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 --git a/yum.c b/yum.c index 8937077..eefc266 100644 --- a/yum.c +++ b/yum.c @@ -62,7 +62,7 @@ static void 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 @@ yum_primary_start_element(void *data, const char *name, const char **atts) 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 @@ yum_primary_start_element(void *data, const char *name, const char **atts) 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 @@ yum_primary_start_element(void *data, const char *name, const char **atts) } 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 @@ yum_primary_start_element(void *data, const char *name, const char **atts) 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,