Split command line interface out into main.c.
authorKristian H?gsberg <krh@redhat.com>
Sun Sep 30 00:18:20 2007 -0400 (2007-09-30)
changeset 43d37d57c99cac
parent 42 aedfc8f95227
child 44 3d1a1517fa1d
Split command line interface out into main.c.
Makefile
main.c
razor.c
razor.h
     1.1 --- a/Makefile	Sat Sep 29 23:30:35 2007 -0400
     1.2 +++ b/Makefile	Sun Sep 30 00:18:20 2007 -0400
     1.3 @@ -1,7 +1,7 @@
     1.4  CFLAGS = -Wall -g -O2
     1.5  LDLIBS = -lexpat -g -lrpm
     1.6  
     1.7 -razor : razor.o import.o sha1.o
     1.8 +razor : razor.o import.o sha1.o main.o
     1.9  
    1.10  import : razor primary.xml.gz
    1.11  	zcat primary.xml.gz | ./razor eat-yum
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/main.c	Sun Sep 30 00:18:20 2007 -0400
     2.3 @@ -0,0 +1,181 @@
     2.4 +#include <stdlib.h>
     2.5 +#include <stddef.h>
     2.6 +#include <stdio.h>
     2.7 +#include <string.h>
     2.8 +#include <unistd.h>
     2.9 +
    2.10 +#include "razor.h"
    2.11 +
    2.12 +static const char *repo_filename = "system.repo";
    2.13 +static const char rawhide_repo_filename[] = "rawhide.repo";
    2.14 +
    2.15 +static int
    2.16 +command_list(int argc, const char *argv[])
    2.17 +{
    2.18 +	struct razor_set *set;
    2.19 +
    2.20 +	set = razor_set_open(repo_filename);
    2.21 +	razor_set_list(set);
    2.22 +	razor_set_destroy(set);
    2.23 +
    2.24 +	return 0;
    2.25 +}
    2.26 +
    2.27 +static int
    2.28 +command_list_requires(int argc, const char *argv[])
    2.29 +{
    2.30 +	struct razor_set *set;
    2.31 +
    2.32 +	set = razor_set_open(repo_filename);
    2.33 +	razor_set_list_requires(set, argv[2]);
    2.34 +	razor_set_destroy(set);
    2.35 +
    2.36 +	return 0;
    2.37 +}
    2.38 +
    2.39 +static int
    2.40 +command_list_provides(int argc, const char *argv[])
    2.41 +{
    2.42 +	struct razor_set *set;
    2.43 +
    2.44 +	set = razor_set_open(repo_filename);
    2.45 +	razor_set_list_provides(set, argv[2]);
    2.46 +	razor_set_destroy(set);
    2.47 +
    2.48 +	return 0;
    2.49 +}
    2.50 +
    2.51 +static int
    2.52 +command_what_requires(int argc, const char *argv[])
    2.53 +{
    2.54 +	struct razor_set *set;
    2.55 +
    2.56 +	set = razor_set_open(repo_filename);
    2.57 +	razor_set_list_requires_packages(set, argv[2], argv[3]);
    2.58 +	razor_set_destroy(set);
    2.59 +
    2.60 +	return 0;
    2.61 +}
    2.62 +
    2.63 +static int
    2.64 +command_what_provides(int argc, const char *argv[])
    2.65 +{
    2.66 +	struct razor_set *set;
    2.67 +
    2.68 +	set = razor_set_open(repo_filename);
    2.69 +	razor_set_list_provides_packages(set, argv[2], argv[3]);
    2.70 +	razor_set_destroy(set);
    2.71 +
    2.72 +	return 0;
    2.73 +}
    2.74 +
    2.75 +static int
    2.76 +command_import_yum(int argc, const char *argv[])
    2.77 +{
    2.78 +	struct razor_set *set;
    2.79 +
    2.80 +	set = razor_set_create_from_yum_filelist(STDIN_FILENO);
    2.81 +	if (set == NULL)
    2.82 +		return 1;
    2.83 +	razor_set_write(set, rawhide_repo_filename);
    2.84 +	razor_set_destroy(set);
    2.85 +	printf("wrote %s\n", rawhide_repo_filename);
    2.86 +
    2.87 +	return 0;
    2.88 +}
    2.89 +
    2.90 +static int
    2.91 +command_import_rpmdb(int argc, const char *argv[])
    2.92 +{
    2.93 +	struct razor_set *set;
    2.94 +
    2.95 +	set = razor_set_create_from_rpmdb();
    2.96 +	if (set == NULL)
    2.97 +		return 1;
    2.98 +	razor_set_write(set, repo_filename);
    2.99 +	razor_set_destroy(set);
   2.100 +	printf("wrote %s\n", repo_filename);
   2.101 +
   2.102 +	return 0;
   2.103 +}
   2.104 +
   2.105 +static int
   2.106 +command_validate(int argc, const char *argv[])
   2.107 +{
   2.108 +	struct razor_set *set;
   2.109 +
   2.110 +	set = razor_set_open(repo_filename);
   2.111 +	if (set == NULL)
   2.112 +		return 1;
   2.113 +	razor_set_list_unsatisfied(set);
   2.114 +	razor_set_destroy(set);
   2.115 +
   2.116 +	return 0;
   2.117 +}
   2.118 +
   2.119 +static int
   2.120 +command_update(int argc, const char *argv[])
   2.121 +{
   2.122 +	struct razor_set *set, *upstream;
   2.123 +
   2.124 +	set = razor_set_open(repo_filename);
   2.125 +	upstream = razor_set_open(rawhide_repo_filename);
   2.126 +	if (set == NULL || upstream == NULL)
   2.127 +		return 1;
   2.128 +	set = razor_set_update(set, upstream, argc - 2, argv + 2);
   2.129 +	razor_set_write(set, "system-updated.repo");
   2.130 +	razor_set_destroy(set);
   2.131 +	razor_set_destroy(upstream);
   2.132 +	printf("wrote system-updated.repo\n");
   2.133 +
   2.134 +	return 0;
   2.135 +}
   2.136 +
   2.137 +static struct {
   2.138 +	const char *name;
   2.139 +	const char *description;
   2.140 +	int (*func)(int argc, const char *argv[]);
   2.141 +} razor_commands[] = {
   2.142 +	{ "list", "list all packages", command_list },
   2.143 +	{ "list-requires", "list all requires or requires for the given package", command_list_requires },
   2.144 +	{ "list-provides", "list all provides or provides for the give package", command_list_provides },
   2.145 +	{ "what-requires", "list the packages that have the given requires", command_what_requires },
   2.146 +	{ "what-provides", "list the packages that have the given provides", command_what_provides },
   2.147 +	{ "import-yum", "import yum filelist.xml on stdin", command_import_yum },
   2.148 +	{ "import-rpmdb", "import the system rpm database", command_import_rpmdb },
   2.149 +	{ "validate", "validate a package set", command_validate },
   2.150 +	{ "update", "update all or specified packages", command_update }
   2.151 +};
   2.152 +
   2.153 +static int
   2.154 +usage(void)
   2.155 +{
   2.156 +	int i;
   2.157 +
   2.158 +	printf("usage:\n");
   2.159 +	for (i = 0; i < ARRAY_SIZE(razor_commands); i++)
   2.160 +		printf("  %-20s%s\n",
   2.161 +		       razor_commands[i].name, razor_commands[i].description);
   2.162 +
   2.163 +	return 1;
   2.164 +}
   2.165 +
   2.166 +int
   2.167 +main(int argc, const char *argv[])
   2.168 +{
   2.169 +	char *repo;
   2.170 +	int i;
   2.171 +
   2.172 +	repo = getenv("RAZOR_REPO");
   2.173 +	if (repo != NULL)
   2.174 +		repo_filename = repo;
   2.175 +
   2.176 +	if (argc < 2)
   2.177 +		return usage();
   2.178 +
   2.179 +	for (i = 0; i < ARRAY_SIZE(razor_commands); i++)
   2.180 +		if (strcmp(razor_commands[i].name, argv[1]) == 0)
   2.181 +			return razor_commands[i].func(argc - 2, argv + 2);
   2.182 +
   2.183 +	return usage();
   2.184 +}
     3.1 --- a/razor.c	Sat Sep 29 23:30:35 2007 -0400
     3.2 +++ b/razor.c	Sun Sep 30 00:18:20 2007 -0400
     3.3 @@ -14,8 +14,6 @@
     3.4  
     3.5  #include "razor.h"
     3.6  
     3.7 -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     3.8 -
     3.9  struct array {
    3.10  	void *data;
    3.11  	int size, alloc;
    3.12 @@ -220,7 +218,7 @@
    3.13  	free(set);
    3.14  }
    3.15  
    3.16 -static int
    3.17 +int
    3.18  razor_set_write(struct razor_set *set, const char *filename)
    3.19  {
    3.20  	char data[4096];
    3.21 @@ -836,7 +834,7 @@
    3.22  		razor_set_list_all_properties(set, &set->provides);
    3.23  }
    3.24  
    3.25 -void
    3.26 +static void
    3.27  razor_set_list_property_packages(struct razor_set *set,
    3.28  				 struct array *properties,
    3.29  				 const char *name,
    3.30 @@ -870,6 +868,22 @@
    3.31  }
    3.32  
    3.33  void
    3.34 +razor_set_list_requires_packages(struct razor_set *set,
    3.35 +				 const char *name,
    3.36 +				 const char *version)
    3.37 +{
    3.38 +	razor_set_list_property_packages(set, &set->requires, name, version);
    3.39 +}
    3.40 +
    3.41 +void
    3.42 +razor_set_list_provides_packages(struct razor_set *set,
    3.43 +				 const char *name,
    3.44 +				 const char *version)
    3.45 +{
    3.46 +	razor_set_list_property_packages(set, &set->provides, name, version);
    3.47 +}
    3.48 +
    3.49 +static void
    3.50  razor_set_validate(struct razor_set *set, struct array *unsatisfied)
    3.51  {
    3.52  	struct razor_property *r, *p, *rend, *pend;
    3.53 @@ -1331,7 +1345,7 @@
    3.54  		 int count, const char **packages)
    3.55  {
    3.56  	struct razor_set *new;
    3.57 -	struct razor_package *p, *upackages;
    3.58 +	struct razor_package *upackages;
    3.59  	struct array list, unsatisfied;
    3.60  	char *pool;
    3.61  	unsigned long *u, *end;
    3.62 @@ -1346,16 +1360,9 @@
    3.63  	end = list.data + list.size;
    3.64  	upackages = upstream->packages.data;
    3.65  	pool = upstream->string_pool.data;
    3.66 -	for (u = list.data; u < end; u++) {
    3.67 -		p = upackages + *u;
    3.68 -		printf("package %s-%s set to be updated\n",
    3.69 -		       &pool[p->name], &pool[p->version]);
    3.70 -	}
    3.71  	total += list.size / sizeof *u;
    3.72  
    3.73  	while (list.size > 0) {
    3.74 -		printf(" -- satisfying new requires\n");
    3.75 -
    3.76  		new = razor_set_add(set, upstream, &list);
    3.77  		array_release(&list);
    3.78  		razor_set_destroy(set);
    3.79 @@ -1370,164 +1377,11 @@
    3.80  		end = list.data + list.size;
    3.81  		upackages = upstream->packages.data;
    3.82  		pool = upstream->string_pool.data;
    3.83 -		for (u = list.data; u < end; u++) {
    3.84 -			p = upackages + *u;
    3.85 -			printf("package %s-%s set to be updated\n",
    3.86 -			       &pool[p->name], &pool[p->version]);
    3.87 -		}
    3.88  		total += list.size / sizeof *u;
    3.89  	}
    3.90  
    3.91  	array_release(&list);
    3.92  
    3.93 -	printf("total of %d packages set to be updated\n", total);
    3.94 -
    3.95  	return set;
    3.96  }
    3.97  
    3.98 -void
    3.99 -razor_set_info(struct razor_set *set)
   3.100 -{
   3.101 -	unsigned int offset, size;
   3.102 -	int i;
   3.103 -
   3.104 -	for (i = 0; i < set->header->sections[i].type; i++) {
   3.105 -		offset = set->header->sections[i].offset;
   3.106 -		size = set->header->sections[i].size;
   3.107 -
   3.108 -		switch (set->header->sections[i].type) {
   3.109 -		case RAZOR_PACKAGES:
   3.110 -			printf("package section:\t%dkb\n", size / 1024);
   3.111 -			break;
   3.112 -		case RAZOR_REQUIRES:
   3.113 -			printf("requires section:\t%dkb\n", size / 1024);
   3.114 -			break;
   3.115 -		case RAZOR_PROVIDES:
   3.116 -			printf("provides section:\t%dkb\n", size / 1024);
   3.117 -			break;
   3.118 -		case RAZOR_STRING_POOL:
   3.119 -			printf("string pool:\t\t%dkb\n", size / 1024);
   3.120 -			break;
   3.121 -		}
   3.122 -	}
   3.123 -}
   3.124 -
   3.125 -static int
   3.126 -usage(void)
   3.127 -{
   3.128 -	printf("usage: razor [ import FILES | lookup <key> | "
   3.129 -	       "list | list-requires | list-provides | eat-yum | info ]\n");
   3.130 -	exit(1);
   3.131 -}
   3.132 -
   3.133 -static const char *repo_filename = "system.repo";
   3.134 -static const char rawhide_repo_filename[] = "rawhide.repo";
   3.135 -
   3.136 -int
   3.137 -main(int argc, const char *argv[])
   3.138 -{
   3.139 -	struct razor_set *set, *upstream;
   3.140 -	struct stat statbuf;
   3.141 -	char *repo;
   3.142 -
   3.143 -	repo = getenv("RAZOR_REPO");
   3.144 -	if (repo != NULL)
   3.145 -		repo_filename = repo;
   3.146 -
   3.147 -	if (argc < 2) {
   3.148 -		usage();
   3.149 -	} else if (strcmp(argv[1], "import") == 0) {
   3.150 -		if (stat("set", &statbuf) && mkdir("set", 0777)) {
   3.151 -			fprintf(stderr, "could not create directory 'set'\n");
   3.152 -			exit(-1);
   3.153 -		}
   3.154 -			
   3.155 -		set = razor_import_rzr_files(argc - 2, argv + 2);
   3.156 -
   3.157 -		printf("pool size: %d\n", set->string_pool.size);
   3.158 -		printf("pool allocation: %d\n", set->string_pool.alloc);
   3.159 -		printf("packages: %d\n",
   3.160 -		       set->packages.size / sizeof(struct razor_package));
   3.161 -		printf("requires: %d\n",
   3.162 -		       set->requires.size / sizeof(struct razor_property));
   3.163 -		printf("provides: %d\n",
   3.164 -		       set->provides.size / sizeof(struct razor_property));
   3.165 -
   3.166 -		razor_set_write(set, repo_filename);
   3.167 -
   3.168 -		razor_set_destroy(set);
   3.169 -	} else if (strcmp(argv[1], "list") == 0) {
   3.170 -		set = razor_set_open(repo_filename);
   3.171 -		razor_set_list(set);
   3.172 -		razor_set_destroy(set);
   3.173 -	} else if (strcmp(argv[1], "list-requires") == 0) {
   3.174 -		set = razor_set_open(repo_filename);
   3.175 -		razor_set_list_requires(set, argv[2]);
   3.176 -		razor_set_destroy(set);
   3.177 -	} else if (strcmp(argv[1], "list-provides") == 0) {
   3.178 -		set = razor_set_open(repo_filename);
   3.179 -		razor_set_list_provides(set, argv[2]);
   3.180 -		razor_set_destroy(set);
   3.181 -	} else if (strcmp(argv[1], "what-requires") == 0) {
   3.182 -		set = razor_set_open(repo_filename);
   3.183 -		razor_set_list_property_packages(set, &set->requires,
   3.184 -						 argv[2], argv[3]);
   3.185 -		razor_set_destroy(set);
   3.186 -	} else if (strcmp(argv[1], "what-provides") == 0) {
   3.187 -		set = razor_set_open(repo_filename);
   3.188 -		razor_set_list_property_packages(set, &set->provides,
   3.189 -						 argv[2], argv[3]);
   3.190 -		razor_set_destroy(set);
   3.191 -	} else if (strcmp(argv[1], "info") == 0) {
   3.192 -		set = razor_set_open(repo_filename);
   3.193 -		razor_set_info(set);
   3.194 -		razor_set_destroy(set);
   3.195 -	} else if (strcmp(argv[1], "eat-yum") == 0) {
   3.196 -		set = razor_set_create_from_yum_filelist(STDIN_FILENO);
   3.197 -		if (set == NULL)
   3.198 -			return 1;
   3.199 -		razor_set_write(set, rawhide_repo_filename);
   3.200 -		razor_set_destroy(set);
   3.201 -		printf("wrote %s\n", rawhide_repo_filename);
   3.202 -	} else if (strcmp(argv[1], "import-rpmdb") == 0) {
   3.203 -		set = razor_set_create_from_rpmdb();
   3.204 -		if (set == NULL)
   3.205 -			return 1;
   3.206 -		razor_set_write(set, repo_filename);
   3.207 -		razor_set_destroy(set);
   3.208 -		printf("wrote %s\n", repo_filename);
   3.209 -	} else if (strcmp(argv[1], "validate") == 0) {
   3.210 -		set = razor_set_open(repo_filename);
   3.211 -		if (set == NULL)
   3.212 -			return 1;
   3.213 -		razor_set_list_unsatisfied(set);
   3.214 -		razor_set_destroy(set);
   3.215 -	} else if (strcmp(argv[1], "add") == 0) {
   3.216 -		struct array list;
   3.217 -
   3.218 -		set = razor_set_open(repo_filename);
   3.219 -		upstream = razor_set_open(rawhide_repo_filename);
   3.220 -		if (set == NULL || upstream == NULL)
   3.221 -			return 1;
   3.222 -		array_init(&list);
   3.223 -		find_packages(upstream, argc - 2, argv + 2, &list);
   3.224 -		set = razor_set_add(set, upstream, &list);
   3.225 -		razor_set_write(set, "system-updated.repo");
   3.226 -		razor_set_destroy(set);
   3.227 -		printf("wrote system-updated.repo\n");
   3.228 -	} else if (strcmp(argv[1], "update") == 0) {
   3.229 -		set = razor_set_open(repo_filename);
   3.230 -		upstream = razor_set_open(rawhide_repo_filename);
   3.231 -		if (set == NULL || upstream == NULL)
   3.232 -			return 1;
   3.233 -		set = razor_set_update(set, upstream, argc - 2, argv + 2);
   3.234 -		razor_set_write(set, "system-updated.repo");
   3.235 -		razor_set_destroy(set);
   3.236 -		razor_set_destroy(upstream);
   3.237 -		printf("wrote system-updated.repo\n");
   3.238 -	} else {
   3.239 -		usage();
   3.240 -	}
   3.241 -
   3.242 -	return 0;
   3.243 -}
     4.1 --- a/razor.h	Sat Sep 29 23:30:35 2007 -0400
     4.2 +++ b/razor.h	Sun Sep 30 00:18:20 2007 -0400
     4.3 @@ -1,6 +1,29 @@
     4.4  #ifndef _RAZOR_H_
     4.5  #define _RAZOR_H_
     4.6  
     4.7 +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     4.8 +
     4.9 +struct razor_set;
    4.10 +
    4.11 +struct razor_set *razor_set_open(const char *filename);
    4.12 +void razor_set_destroy(struct razor_set *set);
    4.13 +int razor_set_write(struct razor_set *set, const char *filename);
    4.14 +
    4.15 +void razor_set_list(struct razor_set *set);
    4.16 +void razor_set_list_requires(struct razor_set *set, const char *name);
    4.17 +void razor_set_list_provides(struct razor_set *set, const char *name);
    4.18 +void razor_set_list_requires_packages(struct razor_set *set,
    4.19 +				      const char *name,
    4.20 +				      const char *version);
    4.21 +void razor_set_list_provides_packages(struct razor_set *set,
    4.22 +				      const char *name,
    4.23 +				      const char *version);
    4.24 +
    4.25 +void razor_set_list_unsatisfied(struct razor_set *set);
    4.26 +struct razor_set *razor_set_update(struct razor_set *set,
    4.27 +				   struct razor_set *upstream,
    4.28 +				   int count, const char **packages);
    4.29 +
    4.30  struct razor_importer;
    4.31  
    4.32  struct razor_importer *razor_importer_new(void);