Flesh out the rpm -q part of the rpm command line wrapper.
1.1 --- a/Makefile Tue Jun 03 15:21:22 2008 -0400
1.2 +++ b/Makefile Wed Jun 04 13:27:49 2008 -0400
1.3 @@ -10,7 +10,7 @@
1.4
1.5 test-driver : razor.o types.o util.o test-driver.o
1.6
1.7 -rpm-razor : rpm-razor.o
1.8 +rpm-razor : rpm-razor.o razor.o types.o util.o
1.9
1.10 test : test-driver
1.11 ./test-driver test.xml
2.1 --- a/razor.c Tue Jun 03 15:21:22 2008 -0400
2.2 +++ b/razor.c Wed Jun 04 13:27:49 2008 -0400
2.3 @@ -810,6 +810,7 @@
2.4 struct razor_set *set;
2.5 struct razor_package *package, *end;
2.6 struct list *index;
2.7 + int free_index;
2.8 };
2.9
2.10 static struct razor_package_iterator *
2.11 @@ -886,6 +887,9 @@
2.12 void
2.13 razor_package_iterator_destroy(struct razor_package_iterator *pi)
2.14 {
2.15 + if (pi->free_index)
2.16 + free(pi->index);
2.17 +
2.18 free(pi);
2.19 }
2.20
2.21 @@ -2993,3 +2997,78 @@
2.22
2.23 /* FIXME: free upstream if it was created as an empty set */
2.24 }
2.25 +
2.26 +struct razor_package_query {
2.27 + struct razor_set *set;
2.28 + char *vector;
2.29 + int count;
2.30 +};
2.31 +
2.32 +struct razor_package_query *
2.33 +razor_package_query_create(struct razor_set *set)
2.34 +{
2.35 + struct razor_package_query *pq;
2.36 + int count;
2.37 +
2.38 + pq = zalloc(sizeof *pq);
2.39 + pq->set = set;
2.40 + count = set->packages.size / sizeof(struct razor_package);
2.41 + pq->vector = zalloc(count * sizeof(char));
2.42 +
2.43 + return pq;
2.44 +}
2.45 +
2.46 +void
2.47 +razor_package_query_add_package(struct razor_package_query *pq,
2.48 + struct razor_package *p)
2.49 +{
2.50 + struct razor_package *packages;
2.51 +
2.52 + packages = pq->set->packages.data;
2.53 + pq->count += pq->vector[p - packages] ^ 1;
2.54 + pq->vector[p - packages] = 1;
2.55 +}
2.56 +
2.57 +void
2.58 +razor_package_query_add_iterator(struct razor_package_query *pq,
2.59 + struct razor_package_iterator *pi)
2.60 +{
2.61 + struct razor_package *packages, *p;
2.62 + const char *name, *version, *arch;
2.63 +
2.64 + packages = pq->set->packages.data;
2.65 + while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
2.66 + pq->count += pq->vector[p - packages] ^ 1;
2.67 + pq->vector[p - packages] = 1;
2.68 + }
2.69 +}
2.70 +
2.71 +struct razor_package_iterator *
2.72 +razor_package_query_finish(struct razor_package_query *pq)
2.73 +{
2.74 + struct razor_package_iterator *pi;
2.75 + struct razor_set *set;
2.76 + struct list *index;
2.77 + int i, j, count;
2.78 +
2.79 + set = pq->set;
2.80 + count = set->packages.size / sizeof(struct razor_package);
2.81 + index = zalloc(pq->count * sizeof *index);
2.82 +
2.83 + for (i = 0, j = 0; i < count; i++) {
2.84 + if (!pq->vector[i])
2.85 + continue;
2.86 +
2.87 + index[j].data = i;
2.88 + if (j == pq->count - 1)
2.89 + index[j].flags = 0x80;
2.90 + j++;
2.91 + }
2.92 +
2.93 + free(pq);
2.94 +
2.95 + pi = razor_package_iterator_create_with_index(set, index);
2.96 + pi->free_index = 1;
2.97 +
2.98 + return pi;
2.99 +}
3.1 --- a/razor.h Tue Jun 03 15:21:22 2008 -0400
3.2 +++ b/razor.h Wed Jun 04 13:27:49 2008 -0400
3.3 @@ -68,6 +68,17 @@
3.4 const char **arch);
3.5 void razor_package_iterator_destroy(struct razor_package_iterator *pi);
3.6
3.7 +struct razor_package_query *
3.8 +razor_package_query_create(struct razor_set *set);
3.9 +void
3.10 +razor_package_query_add_package(struct razor_package_query *pq,
3.11 + struct razor_package *p);
3.12 +void
3.13 +razor_package_query_add_iterator(struct razor_package_query *pq,
3.14 + struct razor_package_iterator *pi);
3.15 +struct razor_package_iterator *
3.16 +razor_package_query_finish(struct razor_package_query *pq);
3.17 +
3.18 struct razor_property_iterator;
3.19 struct razor_property_iterator *
3.20 razor_property_iterator_create(struct razor_set *set,
4.1 --- a/rpm-razor.c Tue Jun 03 15:21:22 2008 -0400
4.2 +++ b/rpm-razor.c Wed Jun 04 13:27:49 2008 -0400
4.3 @@ -38,7 +38,8 @@
4.4 void *data;
4.5 };
4.6
4.7 -static int option_all;
4.8 +static int option_all, option_whatrequires, option_whatprovides;
4.9 +
4.10
4.11 static const struct option query_options[] = {
4.12 { OPTION_BOOL, "configfiles", 'c', NULL, "list all configuration files", NULL },
4.13 @@ -57,8 +58,8 @@
4.14 { OPTION_BOOL, "fileid", 0, NULL, "query/verify package(s) with file identifier", NULL },
4.15 { OPTION_BOOL, "specfile", 0, NULL, "query a spec file", NULL, },
4.16 { OPTION_BOOL, "triggeredby", 0, NULL, "query the package(s) triggered by the package", NULL },
4.17 - { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", NULL },
4.18 - { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", NULL },
4.19 + { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", &option_whatrequires },
4.20 + { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", &option_whatprovides },
4.21 { OPTION_BOOL, "nomanifest", 0, NULL, "do not process non-package files as manifests", NULL },
4.22 { }
4.23 };
4.24 @@ -78,8 +79,8 @@
4.25 { OPTION_BOOL, "fileid", 0, NULL, "query/verify package(s) with file identifier", NULL },
4.26 { OPTION_BOOL, "specfile", 0, NULL, "query a spec file", NULL },
4.27 { OPTION_BOOL, "triggeredby", 0, NULL, "query the package(s) triggered by the package", NULL },
4.28 - { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", NULL },
4.29 - { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", NULL },
4.30 + { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", &option_whatrequires },
4.31 + { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", &option_whatprovides },
4.32 { OPTION_BOOL, "nomanifest", 0, NULL, "do not process non-package files as manifests", NULL },
4.33 { }
4.34 };
4.35 @@ -169,14 +170,16 @@
4.36 { }
4.37 };
4.38
4.39 +static int option_conflicts, option_obsoletes, option_requires, option_provides;
4.40 +
4.41 static const struct option alias_options[] = {
4.42 { OPTION_BOOL, "scripts", 0, NULL, "list install/erase scriptlets from package(s)", NULL, },
4.43 { OPTION_BOOL, "setperms", 0, NULL, "set permissions of files in a package", NULL, },
4.44 { OPTION_BOOL, "setugids", 0, NULL, "set user/group ownership of files in a package", NULL, },
4.45 - { OPTION_BOOL, "conflicts", 0, NULL, "list capabilities this package conflicts with", NULL, },
4.46 - { OPTION_BOOL, "obsoletes", 0, NULL, "list other packages removed by installing this package", NULL, },
4.47 - { OPTION_BOOL, "provides", 0, NULL, "list capabilities that this package provides", NULL, },
4.48 - { OPTION_BOOL, "requires", 0, NULL, "list capabilities required by package(s)", NULL, },
4.49 + { OPTION_BOOL, "conflicts", 0, NULL, "list capabilities this package conflicts with", &option_conflicts, },
4.50 + { OPTION_BOOL, "obsoletes", 0, NULL, "list other packages removed by installing this package", &option_obsoletes, },
4.51 + { OPTION_BOOL, "provides", 0, NULL, "list capabilities that this package provides", &option_provides, },
4.52 + { OPTION_BOOL, "requires", 0, NULL, "list capabilities required by package(s)", &option_requires, },
4.53 { OPTION_BOOL, "info", 0, NULL, "list descriptive information from package(s)", NULL, },
4.54 { OPTION_BOOL, "changelog", 0, NULL, "list change logs for this package", NULL, },
4.55 { OPTION_BOOL, "xml", 0, NULL, "list metadata in xml", NULL, },
4.56 @@ -224,15 +227,168 @@
4.57 { }
4.58 };
4.59
4.60 +static const char system_repo_filename[] = "system.repo";
4.61 +static const char *repo_filename = system_repo_filename;
4.62 +
4.63 +static struct razor_property *
4.64 +add_property_packages(struct razor_set *set,
4.65 + struct razor_package_query *query,
4.66 + const char *ref_name,
4.67 + const char *ref_version,
4.68 + enum razor_property_type ref_type)
4.69 +{
4.70 + struct razor_property *property;
4.71 + struct razor_property_iterator *pi;
4.72 + struct razor_package_iterator *pkgi;
4.73 + const char *name, *version;
4.74 + enum razor_property_type type;
4.75 + enum razor_version_relation relation;
4.76 +
4.77 + pi = razor_property_iterator_create(set, NULL);
4.78 + while (razor_property_iterator_next(pi, &property, &name,
4.79 + &relation, &version, &type)) {
4.80 + if (strcmp(ref_name, name) != 0)
4.81 + continue;
4.82 + if (ref_version && relation == RAZOR_VERSION_EQUAL &&
4.83 + strcmp(ref_version, version) != 0)
4.84 + continue;
4.85 + if (ref_type != type)
4.86 + continue;
4.87 +
4.88 + pkgi = razor_package_iterator_create_for_property(set,
4.89 + property);
4.90 + razor_package_query_add_iterator(query, pkgi);
4.91 + razor_package_iterator_destroy(pkgi);
4.92 + }
4.93 + razor_property_iterator_destroy(pi);
4.94 +
4.95 + return property;
4.96 +}
4.97 +
4.98 +static int
4.99 +strcmpp(const void *p1, const void *p2)
4.100 +{
4.101 + return strcmp(*(char * const *) p1, *(char * const *) p2);
4.102 +}
4.103 +
4.104 +static void
4.105 +add_command_line_packages(struct razor_set *set,
4.106 + struct razor_package_query *query,
4.107 + int argc, const char **argv)
4.108 +{
4.109 + struct razor_package *package;
4.110 + struct razor_package_iterator *pi;
4.111 + const char *name, *version, *arch;
4.112 + int i, cmp;
4.113 +
4.114 + qsort(argv, argc, sizeof(*argv), strcmpp);
4.115 + i = 0;
4.116 +
4.117 + pi = razor_package_iterator_create(set);
4.118 +
4.119 + while (razor_package_iterator_next(pi, &package,
4.120 + &name, &version, &arch)) {
4.121 + while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
4.122 + printf("package %s is not installed\n", argv[i]);
4.123 + i++;
4.124 + }
4.125 +
4.126 + if (cmp == 0) {
4.127 + razor_package_query_add_package(query, package);
4.128 + i++;
4.129 + }
4.130 + }
4.131 +
4.132 + razor_package_iterator_destroy(pi);
4.133 +}
4.134 +
4.135 +static void
4.136 +print_package_properties(struct razor_set *set,
4.137 + struct razor_package *package,
4.138 + enum razor_property_type ref_type)
4.139 +{
4.140 + struct razor_property *property;
4.141 + struct razor_property_iterator *pi;
4.142 + const char *name, *version;
4.143 + enum razor_property_type type;
4.144 + enum razor_version_relation relation;
4.145 +
4.146 + pi = razor_property_iterator_create(set, package);
4.147 + while (razor_property_iterator_next(pi, &property,
4.148 + &name, &relation, &version,
4.149 + &type)) {
4.150 + if (type != ref_type)
4.151 + continue;
4.152 + if (version[0] == '\0')
4.153 + printf("%s\n", name);
4.154 + else
4.155 + printf("%s %s %s\n", name,
4.156 + razor_version_relations[relation], version);
4.157 + }
4.158 + razor_property_iterator_destroy(pi);
4.159 +}
4.160 +
4.161 static void
4.162 command_query(int argc, const char *argv[])
4.163 {
4.164 - if (argc == 0 && !option_all) {
4.165 + struct razor_set *set;
4.166 + struct razor_package_iterator *pi;
4.167 + struct razor_package *package;
4.168 + struct razor_package_query *query;
4.169 + const char *name, *version, *arch;
4.170 +
4.171 + set = razor_set_open(repo_filename);
4.172 +
4.173 + if (option_all + option_whatprovides + option_whatrequires > 1) {
4.174 + printf("only one type of query/verify "
4.175 + "may be performed at a time\n");
4.176 + exit(1);
4.177 + }
4.178 +
4.179 + query = razor_package_query_create(set);
4.180 + if (option_all) {
4.181 + pi = razor_package_iterator_create(set);
4.182 + razor_package_query_add_iterator(query, pi);
4.183 + razor_package_iterator_destroy(pi);
4.184 + } else if (option_whatrequires) {
4.185 + add_property_packages(set, query,
4.186 + argv[0], NULL, RAZOR_PROPERTY_REQUIRES);
4.187 + } else if (option_whatprovides) {
4.188 + add_property_packages(set, query,
4.189 + argv[0], NULL, RAZOR_PROPERTY_PROVIDES);
4.190 + } else if (argc > 0) {
4.191 + add_command_line_packages(set, query, argc, argv);
4.192 + } else {
4.193 printf("no arguments given for query\n");
4.194 exit(1);
4.195 }
4.196
4.197 - printf("command query - not implemented\n");
4.198 + pi = razor_package_query_finish(query);
4.199 +
4.200 + while (razor_package_iterator_next(pi, &package,
4.201 + &name, &version, &arch)) {
4.202 + if (option_conflicts)
4.203 + print_package_properties(set, package,
4.204 + RAZOR_PROPERTY_CONFLICTS);
4.205 + if (option_obsoletes)
4.206 + print_package_properties(set, package,
4.207 + RAZOR_PROPERTY_OBSOLETES);
4.208 + if (option_requires)
4.209 + print_package_properties(set, package,
4.210 + RAZOR_PROPERTY_REQUIRES);
4.211 + if (option_provides)
4.212 + print_package_properties(set, package,
4.213 + RAZOR_PROPERTY_PROVIDES);
4.214 + if (!option_conflicts && !option_obsoletes &&
4.215 + !option_requires && !option_provides)
4.216 + printf("%s-%s.%s\n", name, version, arch);
4.217 + }
4.218 +
4.219 + razor_package_iterator_destroy(pi);
4.220 +
4.221 + razor_set_destroy(set);
4.222 +
4.223 + return;
4.224 }
4.225
4.226 static void