rpm-razor.c
changeset 216 b97c130460a5
parent 215 85381bba83df
child 217 bf5d87af3e1e
     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