Split command line interface out into main.c.
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);