Also add a 'info' command for displaying them.
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;
{ "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
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;
}
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,
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;
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);
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,
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];
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));
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;
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);
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,
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,
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;
};
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;
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;
}
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;
}
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);