Fix version handling (particularly wrt epoch) on import
authorDan Winship <danw@gnome.org>
Tue, 4 Mar 2008 15:55:01 +0000 (10:55 -0500)
committerDan Winship <danw@gnome.org>
Tue, 4 Mar 2008 15:55:01 +0000 (10:55 -0500)
razor.c
razor.h
rpm.c
yum.c

diff --git a/razor.c b/razor.c
index 1eec941..605f8a8 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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 (file)
--- 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,