Import summary and description into the repo files.
authorJames Bowes <jbowes@redhat.com>
Sun, 8 Jun 2008 21:10:39 +0000 (17:10 -0400)
committerJames Bowes <jbowes@redhat.com>
Sun, 8 Jun 2008 21:11:41 +0000 (17:11 -0400)
Also add a 'info' command for displaying them.

main.c
razor.c
razor.h
rpm.c
yum.c

diff --git a/main.c b/main.c
index 80ad114..f2f587d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -810,6 +810,35 @@ command_download(int argc, const char *argv[])
        return 0;
 }
 
+static int
+command_info(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, *arch;
+
+       set = razor_set_open(repo_filename);
+       pi = razor_package_iterator_create(set);
+       while (razor_package_iterator_next(pi, &package,
+                                          &name, &version, &arch)) {
+               if (pattern && fnmatch(pattern, name, 0) != 0)
+                       continue;
+
+               printf ("Name:        %s\n", name);
+               printf ("Arch:        %s\n", arch);
+               printf ("Version:     %s\n", version);
+               printf ("Summary:     %s\n", razor_package_get_summary (set, package));
+               printf ("Description:\n");
+               printf ("%s\n", razor_package_get_description (set, package));
+               printf ("\n");
+       }
+       razor_package_iterator_destroy(pi);
+       razor_set_destroy(set);
+
+       return 0;
+}
+
 static struct {
        const char *name;
        const char *description;
@@ -834,7 +863,8 @@ static struct {
        { "diff", "show diff between two package sets", command_diff },
        { "install", "install rpm", command_install },
        { "init", "init razor root", command_init },
-       { "download", "download packages", command_download }
+       { "download", "download packages", command_download },
+       { "info", "display package details", command_info }
 };
 
 static int
diff --git a/razor.c b/razor.c
index f77f53f..eebdd51 100644 (file)
--- a/razor.c
+++ b/razor.c
@@ -63,6 +63,8 @@ struct razor_set_header {
 struct razor_package {
        uint name  : 24;
        uint flags : 8;
+       uint32_t summary;
+       uint32_t description;
        uint32_t version;
        uint32_t arch;
        struct list_head properties;
@@ -328,6 +330,15 @@ razor_importer_finish_package(struct razor_importer *importer)
 }
 
 void
+razor_importer_add_details(struct razor_importer *importer,
+                          const char *summary,
+                          const char *description)
+{
+       importer->package->summary = hashtable_tokenize(&importer->table, summary);
+       importer->package->description = hashtable_tokenize(&importer->table, description);
+}
+
+void
 razor_importer_add_property(struct razor_importer *importer,
                            const char *name,
                            enum razor_version_relation relation,
@@ -910,6 +921,20 @@ razor_set_get_package(struct razor_set *set, const char *package)
        return p;
 }
 
+const char *
+razor_package_get_summary(struct razor_set *set, struct razor_package *package)
+{
+       const char *pool = set->string_pool.data;
+       return &pool[package->summary];
+}
+
+const char *
+razor_package_get_description(struct razor_set *set, struct razor_package *package)
+{
+       const char *pool = set->string_pool.data;
+       return &pool[package->description];
+}
+
 struct razor_property_iterator {
        struct razor_set *set;
        struct razor_property *property, *end;
diff --git a/razor.h b/razor.h
index 8a7cb83..5927991 100644 (file)
--- a/razor.h
+++ b/razor.h
@@ -51,6 +51,11 @@ int razor_set_write(struct razor_set *set, const char *filename);
 struct razor_package *
 razor_set_get_package(struct razor_set *set, const char *package);
 
+const char *
+razor_package_get_summary(struct razor_set *set, struct razor_package *package);
+const char *
+razor_package_get_description(struct razor_set *set, struct razor_package *package);
+
 struct razor_package_iterator;
 struct razor_package_iterator *
 razor_package_iterator_create(struct razor_set *set);
@@ -170,6 +175,9 @@ void razor_importer_begin_package(struct razor_importer *importer,
                                  const char *name,
                                  const char *version,
                                  const char *arch);
+void razor_importer_add_details(struct razor_importer *importer,
+                               const char *summary,
+                               const char *description);
 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 9b6f7ec..4eec65f 100644 (file)
--- a/rpm.c
+++ b/rpm.c
@@ -592,7 +592,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, *arch;
+       const char *name, *version, *release, *arch, *summary;
        const uint_32 *epoch;
        char evr[128], buf[16];
 
@@ -601,6 +601,7 @@ razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm)
        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);
+       summary = razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL);
 
        if (epoch) {
                snprintf(buf, sizeof buf, "%u", ntohl(*epoch));
@@ -672,7 +673,7 @@ razor_set_create_from_rpmdb(void)
        rpmdbMatchIterator iter;
        Header h;
        int_32 type, count, i;
-       union rpm_entry name, epoch, version, release, arch;
+       union rpm_entry name, epoch, version, release, arch, summary, description;
        union rpm_entry basenames, dirnames, dirindexes;
        char filename[PATH_MAX], evr[128], buf[16];
        rpmdb db;
@@ -693,6 +694,8 @@ razor_set_create_from_rpmdb(void)
                headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
                headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
                headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count);
+               headerGetEntry(h, RPMTAG_SUMMARY, &type, &summary.p, &count);
+               headerGetEntry(h, RPMTAG_DESCRIPTION, &type, &description.p, &count);
 
                if (epoch.flags != NULL) {
                        snprintf(buf, sizeof buf, "%u", *epoch.flags);
@@ -705,6 +708,7 @@ razor_set_create_from_rpmdb(void)
 
                razor_importer_begin_package(importer,
                                             name.string, evr, arch.string);
+               razor_importer_add_details(importer, summary.string, description.string);
 
                add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
                               RPMTAG_REQUIRENAME,
diff --git a/yum.c b/yum.c
index e866856..0cb69f0 100644 (file)
--- a/yum.c
+++ b/yum.c
@@ -37,6 +37,8 @@ enum {
        YUM_STATE_BEGIN,
        YUM_STATE_PACKAGE_NAME,
        YUM_STATE_PACKAGE_ARCH,
+       YUM_STATE_SUMMARY,
+       YUM_STATE_DESCRIPTION,
        YUM_STATE_CHECKSUM,
        YUM_STATE_REQUIRES,
        YUM_STATE_PROVIDES,
@@ -52,7 +54,7 @@ struct yum_context {
 
        struct razor_importer *importer;
        struct import_property_context *current_property_context;
-       char name[256], arch[64], buffer[512], *p;
+       char name[256], arch[64], summary[512], description[4096], buffer[512], *p;
        char pkgid[128];
        int state;
 };
@@ -113,6 +115,12 @@ 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, ctx->arch);
+       } else if (strcmp(name, "summary") == 0) {
+               ctx->p = ctx->summary;
+               ctx->state = YUM_STATE_SUMMARY;
+       } else if (strcmp(name, "description") == 0) {
+               ctx->p = ctx->description;
+               ctx->state = YUM_STATE_DESCRIPTION;
        } else if (strcmp(name, "checksum") == 0) {
                ctx->p = ctx->pkgid;
                ctx->state = YUM_STATE_CHECKSUM;
@@ -188,6 +196,8 @@ 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_SUMMARY:
+       case YUM_STATE_DESCRIPTION:
        case YUM_STATE_CHECKSUM:
        case YUM_STATE_FILE:
                ctx->state = YUM_STATE_BEGIN;
@@ -195,6 +205,8 @@ yum_primary_end_element (void *data, const char *name)
        }
 
        if (strcmp(name, "package") == 0) {
+               razor_importer_add_details(ctx->importer, ctx->summary, ctx->description);
+
                XML_StopParser(ctx->current_parser, XML_TRUE);
                ctx->current_parser = ctx->filelists_parser;
        }
@@ -208,6 +220,8 @@ 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_SUMMARY:
+       case YUM_STATE_DESCRIPTION:
        case YUM_STATE_CHECKSUM:
        case YUM_STATE_FILE:
                memcpy(ctx->p, s, len);