Also store the package arch in the pacakge set file.
authorKristian Høgsberg <krh@redhat.com>
Mon, 7 Apr 2008 03:35:46 +0000 (23:35 -0400)
committerKristian Høgsberg <krh@redhat.com>
Mon, 7 Apr 2008 03:35:46 +0000 (23:35 -0400)
main.c
razor.c
razor.h
rpm.c
test-driver.c
yum.c

diff --git a/main.c b/main.c
index 58277cd..66ff944 100644 (file)
--- a/main.c
+++ b/main.c
@@ -25,7 +25,7 @@ command_list(int argc, const char *argv[])
        struct razor_set *set;
        struct razor_package_iterator *pi;
        struct razor_package *package;
-       const char *pattern, *name, *version;
+       const char *pattern, *name, *version, *arch;
        int only_names = 0, i = 0;
 
        if (strcmp(argv[i], "--only-names") == 0) {
@@ -36,14 +36,15 @@ command_list(int argc, const char *argv[])
        pattern = argv[i];
        set = razor_set_open(repo_filename);
        pi = razor_package_iterator_create(set);
-       while (razor_package_iterator_next(pi, &package, &name, &version)) {
+       while (razor_package_iterator_next(pi, &package,
+                                          &name, &version, &arch)) {
                if (pattern && fnmatch(pattern, name, 0) != 0)
                        continue;
 
                if (only_names)
                        printf("%s\n", name);
                else
-                       printf("%s-%s\n", name, version);
+                       printf("%s-%s.%s\n", name, version, arch);
        }
        razor_package_iterator_destroy(pi);
        razor_set_destroy(set);
@@ -132,14 +133,15 @@ command_list_file_packages(int argc, const char *argv[])
        struct razor_set *set;
        struct razor_package_iterator *pi;
        struct razor_package *package;
-       const char *name, *version;
+       const char *name, *version, *arch;
 
        set = razor_set_open(repo_filename);
        if (set == NULL)
                return 1;
 
        pi = razor_package_iterator_create_for_file(set, argv[0]);
-       while (razor_package_iterator_next(pi, &package, &name, &version))
+       while (razor_package_iterator_next(pi, &package,
+                                          &name, &version, &arch))
                printf("%s-%s\n", name, version);
        razor_package_iterator_destroy(pi);
 
@@ -168,11 +170,12 @@ list_packages_for_property(struct razor_set *set,
 {
        struct razor_package_iterator *pi;
        struct razor_package *package;
-       const char *name, *version;
+       const char *name, *version, *arch;
 
        pi = razor_package_iterator_create_for_property(set, property);
-       while (razor_package_iterator_next(pi, &package, &name, &version))
-               printf("%s-%s\n", name, version);
+       while (razor_package_iterator_next(pi, &package,
+                                          &name, &version, &arch))
+               printf("%s-%s.%s\n", name, version, arch);
        razor_package_iterator_destroy(pi);
 }
 
@@ -385,7 +388,8 @@ command_remove(int argc, const char *argv[])
 
 static void
 print_diff(const char *name,
-          const char *old_version, const char *new_version, void *data)
+          const char *old_version, const char *new_version, const char *arch,
+          void *data)
 {
        if (old_version)
                printf("removing %s %s\n", name, old_version);
@@ -499,14 +503,15 @@ list_packages(int count, struct razor_set *set)
 {
        struct razor_package_iterator *pi;
        struct razor_package *package;
-       const char *name, *version;
+       const char *name, *version, *arch;
        char **packages;
        int i;
 
        packages = malloc(count * sizeof *packages);
        pi = razor_package_iterator_create(set);
        i = 0;
-       while (razor_package_iterator_next(pi, &package, &name, &version))
+       while (razor_package_iterator_next(pi, &package,
+                                          &name, &version, &arch))
                packages[i++] = strdup(name);
        razor_package_iterator_destroy(pi);
 
@@ -629,7 +634,7 @@ command_download(int argc, const char *argv[])
        struct razor_set *set;
        struct razor_package_iterator *pi;
        struct razor_package *package;
-       const char *pattern = argv[0], *name, *version;
+       const char *pattern = argv[0], *name, *version, *arch;
        char url[256], file[256];
        CURL *curl;
 
@@ -639,7 +644,8 @@ command_download(int argc, const char *argv[])
 
        set = razor_set_open(rawhide_repo_filename);
        pi = razor_package_iterator_create(set);
-       while (razor_package_iterator_next(pi, &package, &name, &version)) {
+       while (razor_package_iterator_next(pi, &package,
+                                          &name, &version, &arch)) {
                if (pattern && fnmatch(pattern, name, 0) != 0)
                        continue;
 
diff --git a/razor.c b/razor.c
index 1b9219e..def7174 100644 (file)
--- a/razor.c
+++ b/razor.c
@@ -45,6 +45,7 @@ struct razor_package {
        uint name  : 24;
        uint flags : 8;
        uint32_t version;
+       uint32_t arch;
        struct list_head properties;
        struct list_head files;
 };
@@ -268,7 +269,9 @@ razor_build_evr(char *evr_buf, int size, const char *epoch,
 
 void
 razor_importer_begin_package(struct razor_importer *importer,
-                            const char *name, const char *version)
+                            const char *name,
+                            const char *version,
+                            const char *arch)
 {
        struct razor_package *p;
 
@@ -276,6 +279,7 @@ razor_importer_begin_package(struct razor_importer *importer,
        p->name = hashtable_tokenize(&importer->table, name);
        p->flags = 0;
        p->version = hashtable_tokenize(&importer->table, version);
+       p->arch = hashtable_tokenize(&importer->table, arch);
 
        importer->package = p;
        array_init(&importer->properties);
@@ -816,7 +820,9 @@ razor_package_iterator_create_for_property(struct razor_set *set,
 int
 razor_package_iterator_next(struct razor_package_iterator *pi,
                            struct razor_package **package,
-                           const char **name, const char **version)
+                           const char **name,
+                           const char **version,
+                           const char **arch)
 {
        char *pool;
        int valid;
@@ -838,6 +844,7 @@ razor_package_iterator_next(struct razor_package_iterator *pi,
                *package = p;
                *name = &pool[p->name];
                *version = &pool[p->version];
+               *arch = &pool[p->arch];
        } else {
                *package = NULL;
        }
@@ -856,10 +863,10 @@ razor_set_get_package(struct razor_set *set, const char *package)
 {
        struct razor_package_iterator *pi;
        struct razor_package *p;
-       const char *name, *version;
+       const char *name, *version, *arch;
 
        pi = razor_package_iterator_create(set);
-       while (razor_package_iterator_next(pi, &p, &name, &version)) {
+       while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
                if (strcmp(package, name) == 0)
                        break;
        }
@@ -1234,6 +1241,8 @@ add_package(struct razor_merger *merger,
        p->flags = flags;
        p->version = hashtable_tokenize(&merger->table,
                                        &pool[package->version]);
+       p->arch = hashtable_tokenize(&merger->table,
+                                    &pool[package->arch]);
 
        p->properties = package->properties;
        r = list_first(&package->properties, &source->set->property_pool);
@@ -1681,14 +1690,14 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream,
 {
        struct razor_package_iterator *pi1, *pi2;
        struct razor_package *p1, *p2;
-       const char *name1, *name2, *version1, *version2;
+       const char *name1, *name2, *version1, *version2, *arch1, *arch2;
        int res;
 
        pi1 = razor_package_iterator_create(set);
        pi2 = razor_package_iterator_create(upstream);
 
-       razor_package_iterator_next(pi1, &p1, &name1, &version1);
-       razor_package_iterator_next(pi2, &p2, &name2, &version2);
+       razor_package_iterator_next(pi1, &p1, &name1, &version1, &arch1);
+       razor_package_iterator_next(pi2, &p2, &name2, &version2, &arch2);
 
        while (p1 || p2) {
                if (p1 && p2) {
@@ -1700,16 +1709,16 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream,
                }
 
                if (p2 == NULL || res < 0)
-                       callback(name1, version1, NULL, data);
+                       callback(name1, version1, NULL, arch1, data);
                else if (p1 == NULL || res > 0)
-                       callback(name2, NULL, version2, data);
+                       callback(name2, NULL, version2, arch2, data);
 
                if (p1 != NULL && res <= 0)
                        razor_package_iterator_next(pi1, &p1,
-                                                   &name1, &version1);
+                                                   &name1, &version1, &arch1);
                if (p2 != NULL && res >= 0)
                        razor_package_iterator_next(pi2, &p2,
-                                                   &name2, &version2);
+                                                   &name2, &version2, &arch2);
        }
 
        razor_package_iterator_destroy(pi1);
diff --git a/razor.h b/razor.h
index 7f17fd5..3ff813f 100644 (file)
--- a/razor.h
+++ b/razor.h
@@ -43,7 +43,9 @@ razor_package_iterator_create_for_file(struct razor_set *set,
 
 int razor_package_iterator_next(struct razor_package_iterator *pi,
                                struct razor_package **package,
-                               const char **name, const char **version);
+                               const char **name,
+                               const char **version,
+                               const char **arch);
 void razor_package_iterator_destroy(struct razor_package_iterator *pi);
 
 struct razor_property_iterator;
@@ -67,6 +69,7 @@ void razor_set_list_unsatisfied(struct razor_set *set);
 typedef void (*razor_package_callback_t)(const char *name,
                                         const char *old_version,
                                         const char *new_version,
+                                        const char *arch,
                                         void *data);
 void
 razor_set_diff(struct razor_set *set, struct razor_set *upstream,
@@ -130,7 +133,9 @@ 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,
+                                 const char *arch);
 void razor_importer_add_property(struct razor_importer *importer,
                                 const char *name,
                                 enum razor_version_relation relation,
diff --git a/rpm.c b/rpm.c
index 751253f..ea199c5 100644 (file)
--- a/rpm.c
+++ b/rpm.c
@@ -542,7 +542,7 @@ 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, *version, *release, *arch;
        const uint_32 *epoch;
        char evr[128], buf[16];
 
@@ -550,6 +550,7 @@ razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm)
        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);
+       arch = razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL);
 
        if (epoch) {
                snprintf(buf, sizeof buf, "%u", ntohl(*epoch));
@@ -557,7 +558,7 @@ razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm)
        } else {
                razor_build_evr(evr, sizeof evr, NULL, version, release);
        }
-       razor_importer_begin_package(importer, name, evr);
+       razor_importer_begin_package(importer, name, evr, arch);
 
        import_properties(importer, RAZOR_PROPERTY_REQUIRES, rpm,
                          RPMTAG_REQUIRENAME,
@@ -621,7 +622,7 @@ razor_set_create_from_rpmdb(void)
        rpmdbMatchIterator iter;
        Header h;
        int_32 type, count, i;
-       union rpm_entry name, epoch, version, release;
+       union rpm_entry name, epoch, version, release, arch;
        union rpm_entry basenames, dirnames, dirindexes;
        char filename[PATH_MAX], evr[128], buf[16];
        rpmdb db;
@@ -641,6 +642,7 @@ razor_set_create_from_rpmdb(void)
                headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count);
                headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
                headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
+               headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count);
 
                if (epoch.flags != NULL) {
                        snprintf(buf, sizeof buf, "%u", *epoch.flags);
@@ -651,7 +653,8 @@ razor_set_create_from_rpmdb(void)
                                        NULL, version.string, release.string);
                }
 
-               razor_importer_begin_package(importer, name.string, evr);
+               razor_importer_begin_package(importer,
+                                            name.string, evr, arch.string);
 
                add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
                               RPMTAG_REQUIRENAME,
index 6eeb5ac..bdfe0e5 100644 (file)
@@ -168,13 +168,17 @@ start_package(struct test_context *ctx, const char **atts)
 {
        const char *name = NULL, *version = NULL, *arch = NULL;
 
-       get_atts(atts, "name", &name, "version", &version, "arch", &arch, NULL);
+       get_atts(atts, "name", &name,
+                "version", &version,
+                "arch", &arch,
+                NULL);
+
        if (!name) {
                fprintf(stderr, "  package with no name\n");
                exit(1);
        }
 
-       razor_importer_begin_package(ctx->importer, name, version);
+       razor_importer_begin_package(ctx->importer, name, version, arch);
        razor_importer_add_property(ctx->importer, name,
                                    RAZOR_VERSION_EQUAL, version,
                                    RAZOR_PROPERTY_PROVIDES);
@@ -307,7 +311,9 @@ start_result(struct test_context *ctx, const char **atts)
 
 static void
 diff_callback(const char *name,
-             const char *old_version, const char *new_version,
+             const char *old_version,
+             const char *new_version,
+             const char *arch,
              void *data)
 {
        struct test_context *ctx = data;
diff --git a/yum.c b/yum.c
index eefc266..d6d4ec0 100644 (file)
--- a/yum.c
+++ b/yum.c
@@ -17,6 +17,7 @@
 enum {
        YUM_STATE_BEGIN,
        YUM_STATE_PACKAGE_NAME,
+       YUM_STATE_PACKAGE_ARCH,
        YUM_STATE_CHECKSUM,
        YUM_STATE_REQUIRES,
        YUM_STATE_PROVIDES,
@@ -32,7 +33,7 @@ struct yum_context {
 
        struct razor_importer *importer;
        struct import_property_context *current_property_context;
-       char name[256], buffer[512], *p;
+       char name[256], arch[64], buffer[512], *p;
        char pkgid[128];
        int state;
 };
@@ -69,6 +70,9 @@ yum_primary_start_element(void *data, const char *name, const char **atts)
        if (strcmp(name, "name") == 0) {
                ctx->state = YUM_STATE_PACKAGE_NAME;
                ctx->p = ctx->name;
+       } else if (strcmp(name, "arch") == 0) {
+               ctx->state = YUM_STATE_PACKAGE_ARCH;
+               ctx->p = ctx->arch;
        } else if (strcmp(name, "version") == 0) {
                epoch = NULL;
                version = NULL;
@@ -88,7 +92,8 @@ yum_primary_start_element(void *data, const char *name, const char **atts)
                }
 
                razor_build_evr(buffer, sizeof buffer, epoch, version, release);
-               razor_importer_begin_package(ctx->importer, ctx->name, buffer);
+               razor_importer_begin_package(ctx->importer,
+                                            ctx->name, buffer, ctx->arch);
        } else if (strcmp(name, "checksum") == 0) {
                ctx->p = ctx->pkgid;
                ctx->state = YUM_STATE_CHECKSUM;
@@ -163,6 +168,7 @@ yum_primary_end_element (void *data, const char *name)
 
        switch (ctx->state) {
        case YUM_STATE_PACKAGE_NAME:
+       case YUM_STATE_PACKAGE_ARCH:
        case YUM_STATE_CHECKSUM:
        case YUM_STATE_FILE:
                ctx->state = YUM_STATE_BEGIN;
@@ -182,6 +188,7 @@ yum_character_data (void *data, const XML_Char *s, int len)
 
        switch (ctx->state) {
        case YUM_STATE_PACKAGE_NAME:
+       case YUM_STATE_PACKAGE_ARCH:
        case YUM_STATE_CHECKSUM:
        case YUM_STATE_FILE:
                memcpy(ctx->p, s, len);