1.1 --- a/rpm-razor.c Tue Jun 03 15:21:22 2008 -0400
1.2 +++ b/rpm-razor.c Wed Jun 04 13:27:49 2008 -0400
1.3 @@ -38,7 +38,8 @@
1.4 void *data;
1.5 };
1.6
1.7 -static int option_all;
1.8 +static int option_all, option_whatrequires, option_whatprovides;
1.9 +
1.10
1.11 static const struct option query_options[] = {
1.12 { OPTION_BOOL, "configfiles", 'c', NULL, "list all configuration files", NULL },
1.13 @@ -57,8 +58,8 @@
1.14 { OPTION_BOOL, "fileid", 0, NULL, "query/verify package(s) with file identifier", NULL },
1.15 { OPTION_BOOL, "specfile", 0, NULL, "query a spec file", NULL, },
1.16 { OPTION_BOOL, "triggeredby", 0, NULL, "query the package(s) triggered by the package", NULL },
1.17 - { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", NULL },
1.18 - { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", NULL },
1.19 + { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", &option_whatrequires },
1.20 + { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", &option_whatprovides },
1.21 { OPTION_BOOL, "nomanifest", 0, NULL, "do not process non-package files as manifests", NULL },
1.22 { }
1.23 };
1.24 @@ -78,8 +79,8 @@
1.25 { OPTION_BOOL, "fileid", 0, NULL, "query/verify package(s) with file identifier", NULL },
1.26 { OPTION_BOOL, "specfile", 0, NULL, "query a spec file", NULL },
1.27 { OPTION_BOOL, "triggeredby", 0, NULL, "query the package(s) triggered by the package", NULL },
1.28 - { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", NULL },
1.29 - { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", NULL },
1.30 + { OPTION_BOOL, "whatrequires", 0, NULL, "query/verify the package(s) which require a dependency", &option_whatrequires },
1.31 + { OPTION_BOOL, "whatprovides", 0, NULL, "query/verify the package(s) which provide a dependency", &option_whatprovides },
1.32 { OPTION_BOOL, "nomanifest", 0, NULL, "do not process non-package files as manifests", NULL },
1.33 { }
1.34 };
1.35 @@ -169,14 +170,16 @@
1.36 { }
1.37 };
1.38
1.39 +static int option_conflicts, option_obsoletes, option_requires, option_provides;
1.40 +
1.41 static const struct option alias_options[] = {
1.42 { OPTION_BOOL, "scripts", 0, NULL, "list install/erase scriptlets from package(s)", NULL, },
1.43 { OPTION_BOOL, "setperms", 0, NULL, "set permissions of files in a package", NULL, },
1.44 { OPTION_BOOL, "setugids", 0, NULL, "set user/group ownership of files in a package", NULL, },
1.45 - { OPTION_BOOL, "conflicts", 0, NULL, "list capabilities this package conflicts with", NULL, },
1.46 - { OPTION_BOOL, "obsoletes", 0, NULL, "list other packages removed by installing this package", NULL, },
1.47 - { OPTION_BOOL, "provides", 0, NULL, "list capabilities that this package provides", NULL, },
1.48 - { OPTION_BOOL, "requires", 0, NULL, "list capabilities required by package(s)", NULL, },
1.49 + { OPTION_BOOL, "conflicts", 0, NULL, "list capabilities this package conflicts with", &option_conflicts, },
1.50 + { OPTION_BOOL, "obsoletes", 0, NULL, "list other packages removed by installing this package", &option_obsoletes, },
1.51 + { OPTION_BOOL, "provides", 0, NULL, "list capabilities that this package provides", &option_provides, },
1.52 + { OPTION_BOOL, "requires", 0, NULL, "list capabilities required by package(s)", &option_requires, },
1.53 { OPTION_BOOL, "info", 0, NULL, "list descriptive information from package(s)", NULL, },
1.54 { OPTION_BOOL, "changelog", 0, NULL, "list change logs for this package", NULL, },
1.55 { OPTION_BOOL, "xml", 0, NULL, "list metadata in xml", NULL, },
1.56 @@ -224,15 +227,168 @@
1.57 { }
1.58 };
1.59
1.60 +static const char system_repo_filename[] = "system.repo";
1.61 +static const char *repo_filename = system_repo_filename;
1.62 +
1.63 +static struct razor_property *
1.64 +add_property_packages(struct razor_set *set,
1.65 + struct razor_package_query *query,
1.66 + const char *ref_name,
1.67 + const char *ref_version,
1.68 + enum razor_property_type ref_type)
1.69 +{
1.70 + struct razor_property *property;
1.71 + struct razor_property_iterator *pi;
1.72 + struct razor_package_iterator *pkgi;
1.73 + const char *name, *version;
1.74 + enum razor_property_type type;
1.75 + enum razor_version_relation relation;
1.76 +
1.77 + pi = razor_property_iterator_create(set, NULL);
1.78 + while (razor_property_iterator_next(pi, &property, &name,
1.79 + &relation, &version, &type)) {
1.80 + if (strcmp(ref_name, name) != 0)
1.81 + continue;
1.82 + if (ref_version && relation == RAZOR_VERSION_EQUAL &&
1.83 + strcmp(ref_version, version) != 0)
1.84 + continue;
1.85 + if (ref_type != type)
1.86 + continue;
1.87 +
1.88 + pkgi = razor_package_iterator_create_for_property(set,
1.89 + property);
1.90 + razor_package_query_add_iterator(query, pkgi);
1.91 + razor_package_iterator_destroy(pkgi);
1.92 + }
1.93 + razor_property_iterator_destroy(pi);
1.94 +
1.95 + return property;
1.96 +}
1.97 +
1.98 +static int
1.99 +strcmpp(const void *p1, const void *p2)
1.100 +{
1.101 + return strcmp(*(char * const *) p1, *(char * const *) p2);
1.102 +}
1.103 +
1.104 +static void
1.105 +add_command_line_packages(struct razor_set *set,
1.106 + struct razor_package_query *query,
1.107 + int argc, const char **argv)
1.108 +{
1.109 + struct razor_package *package;
1.110 + struct razor_package_iterator *pi;
1.111 + const char *name, *version, *arch;
1.112 + int i, cmp;
1.113 +
1.114 + qsort(argv, argc, sizeof(*argv), strcmpp);
1.115 + i = 0;
1.116 +
1.117 + pi = razor_package_iterator_create(set);
1.118 +
1.119 + while (razor_package_iterator_next(pi, &package,
1.120 + &name, &version, &arch)) {
1.121 + while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
1.122 + printf("package %s is not installed\n", argv[i]);
1.123 + i++;
1.124 + }
1.125 +
1.126 + if (cmp == 0) {
1.127 + razor_package_query_add_package(query, package);
1.128 + i++;
1.129 + }
1.130 + }
1.131 +
1.132 + razor_package_iterator_destroy(pi);
1.133 +}
1.134 +
1.135 +static void
1.136 +print_package_properties(struct razor_set *set,
1.137 + struct razor_package *package,
1.138 + enum razor_property_type ref_type)
1.139 +{
1.140 + struct razor_property *property;
1.141 + struct razor_property_iterator *pi;
1.142 + const char *name, *version;
1.143 + enum razor_property_type type;
1.144 + enum razor_version_relation relation;
1.145 +
1.146 + pi = razor_property_iterator_create(set, package);
1.147 + while (razor_property_iterator_next(pi, &property,
1.148 + &name, &relation, &version,
1.149 + &type)) {
1.150 + if (type != ref_type)
1.151 + continue;
1.152 + if (version[0] == '\0')
1.153 + printf("%s\n", name);
1.154 + else
1.155 + printf("%s %s %s\n", name,
1.156 + razor_version_relations[relation], version);
1.157 + }
1.158 + razor_property_iterator_destroy(pi);
1.159 +}
1.160 +
1.161 static void
1.162 command_query(int argc, const char *argv[])
1.163 {
1.164 - if (argc == 0 && !option_all) {
1.165 + struct razor_set *set;
1.166 + struct razor_package_iterator *pi;
1.167 + struct razor_package *package;
1.168 + struct razor_package_query *query;
1.169 + const char *name, *version, *arch;
1.170 +
1.171 + set = razor_set_open(repo_filename);
1.172 +
1.173 + if (option_all + option_whatprovides + option_whatrequires > 1) {
1.174 + printf("only one type of query/verify "
1.175 + "may be performed at a time\n");
1.176 + exit(1);
1.177 + }
1.178 +
1.179 + query = razor_package_query_create(set);
1.180 + if (option_all) {
1.181 + pi = razor_package_iterator_create(set);
1.182 + razor_package_query_add_iterator(query, pi);
1.183 + razor_package_iterator_destroy(pi);
1.184 + } else if (option_whatrequires) {
1.185 + add_property_packages(set, query,
1.186 + argv[0], NULL, RAZOR_PROPERTY_REQUIRES);
1.187 + } else if (option_whatprovides) {
1.188 + add_property_packages(set, query,
1.189 + argv[0], NULL, RAZOR_PROPERTY_PROVIDES);
1.190 + } else if (argc > 0) {
1.191 + add_command_line_packages(set, query, argc, argv);
1.192 + } else {
1.193 printf("no arguments given for query\n");
1.194 exit(1);
1.195 }
1.196
1.197 - printf("command query - not implemented\n");
1.198 + pi = razor_package_query_finish(query);
1.199 +
1.200 + while (razor_package_iterator_next(pi, &package,
1.201 + &name, &version, &arch)) {
1.202 + if (option_conflicts)
1.203 + print_package_properties(set, package,
1.204 + RAZOR_PROPERTY_CONFLICTS);
1.205 + if (option_obsoletes)
1.206 + print_package_properties(set, package,
1.207 + RAZOR_PROPERTY_OBSOLETES);
1.208 + if (option_requires)
1.209 + print_package_properties(set, package,
1.210 + RAZOR_PROPERTY_REQUIRES);
1.211 + if (option_provides)
1.212 + print_package_properties(set, package,
1.213 + RAZOR_PROPERTY_PROVIDES);
1.214 + if (!option_conflicts && !option_obsoletes &&
1.215 + !option_requires && !option_provides)
1.216 + printf("%s-%s.%s\n", name, version, arch);
1.217 + }
1.218 +
1.219 + razor_package_iterator_destroy(pi);
1.220 +
1.221 + razor_set_destroy(set);
1.222 +
1.223 + return;
1.224 }
1.225
1.226 static void