From 9074e439d6102180298f5dcb4822fbcf2399a226 Mon Sep 17 00:00:00 2001 From: James Bowes Date: Sun, 8 Jun 2008 17:10:39 -0400 Subject: [PATCH] Import summary and description into the repo files. Also add a 'info' command for displaying them. --- main.c | 32 +++++++++++++++++++++++++++++++- razor.c | 25 +++++++++++++++++++++++++ razor.h | 8 ++++++++ rpm.c | 8 ++++++-- yum.c | 16 +++++++++++++++- 5 files changed, 85 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index 80ad114..f2f587d 100644 --- 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 --- 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 --- 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 --- 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 --- 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); -- 1.7.1