From: Kristian Høgsberg Date: Sun, 30 Sep 2007 04:18:08 +0000 (-0400) Subject: Split command line interface out into main.c. X-Git-Tag: 0.1~317 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=34a1973d729f47e9153493d37253e336bae05c2d;p=razor2.git%2F.git Split command line interface out into main.c. --- diff --git a/Makefile b/Makefile index 7effe2e..c6ba436 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CFLAGS = -Wall -g -O2 LDLIBS = -lexpat -g -lrpm -razor : razor.o import.o sha1.o +razor : razor.o import.o sha1.o main.o import : razor primary.xml.gz zcat primary.xml.gz | ./razor eat-yum diff --git a/main.c b/main.c new file mode 100644 index 0000000..87c3a54 --- /dev/null +++ b/main.c @@ -0,0 +1,181 @@ +#include +#include +#include +#include +#include + +#include "razor.h" + +static const char *repo_filename = "system.repo"; +static const char rawhide_repo_filename[] = "rawhide.repo"; + +static int +command_list(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_open(repo_filename); + razor_set_list(set); + razor_set_destroy(set); + + return 0; +} + +static int +command_list_requires(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_open(repo_filename); + razor_set_list_requires(set, argv[2]); + razor_set_destroy(set); + + return 0; +} + +static int +command_list_provides(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_open(repo_filename); + razor_set_list_provides(set, argv[2]); + razor_set_destroy(set); + + return 0; +} + +static int +command_what_requires(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_open(repo_filename); + razor_set_list_requires_packages(set, argv[2], argv[3]); + razor_set_destroy(set); + + return 0; +} + +static int +command_what_provides(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_open(repo_filename); + razor_set_list_provides_packages(set, argv[2], argv[3]); + razor_set_destroy(set); + + return 0; +} + +static int +command_import_yum(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_create_from_yum_filelist(STDIN_FILENO); + if (set == NULL) + return 1; + razor_set_write(set, rawhide_repo_filename); + razor_set_destroy(set); + printf("wrote %s\n", rawhide_repo_filename); + + return 0; +} + +static int +command_import_rpmdb(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_create_from_rpmdb(); + if (set == NULL) + return 1; + razor_set_write(set, repo_filename); + razor_set_destroy(set); + printf("wrote %s\n", repo_filename); + + return 0; +} + +static int +command_validate(int argc, const char *argv[]) +{ + struct razor_set *set; + + set = razor_set_open(repo_filename); + if (set == NULL) + return 1; + razor_set_list_unsatisfied(set); + razor_set_destroy(set); + + return 0; +} + +static int +command_update(int argc, const char *argv[]) +{ + struct razor_set *set, *upstream; + + set = razor_set_open(repo_filename); + upstream = razor_set_open(rawhide_repo_filename); + if (set == NULL || upstream == NULL) + return 1; + set = razor_set_update(set, upstream, argc - 2, argv + 2); + razor_set_write(set, "system-updated.repo"); + razor_set_destroy(set); + razor_set_destroy(upstream); + printf("wrote system-updated.repo\n"); + + return 0; +} + +static struct { + const char *name; + const char *description; + int (*func)(int argc, const char *argv[]); +} razor_commands[] = { + { "list", "list all packages", command_list }, + { "list-requires", "list all requires or requires for the given package", command_list_requires }, + { "list-provides", "list all provides or provides for the give package", command_list_provides }, + { "what-requires", "list the packages that have the given requires", command_what_requires }, + { "what-provides", "list the packages that have the given provides", command_what_provides }, + { "import-yum", "import yum filelist.xml on stdin", command_import_yum }, + { "import-rpmdb", "import the system rpm database", command_import_rpmdb }, + { "validate", "validate a package set", command_validate }, + { "update", "update all or specified packages", command_update } +}; + +static int +usage(void) +{ + int i; + + printf("usage:\n"); + for (i = 0; i < ARRAY_SIZE(razor_commands); i++) + printf(" %-20s%s\n", + razor_commands[i].name, razor_commands[i].description); + + return 1; +} + +int +main(int argc, const char *argv[]) +{ + char *repo; + int i; + + repo = getenv("RAZOR_REPO"); + if (repo != NULL) + repo_filename = repo; + + if (argc < 2) + return usage(); + + for (i = 0; i < ARRAY_SIZE(razor_commands); i++) + if (strcmp(razor_commands[i].name, argv[1]) == 0) + return razor_commands[i].func(argc - 2, argv + 2); + + return usage(); +} diff --git a/razor.c b/razor.c index 7a9c7de..9154b88 100644 --- a/razor.c +++ b/razor.c @@ -14,8 +14,6 @@ #include "razor.h" -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - struct array { void *data; int size, alloc; @@ -220,7 +218,7 @@ razor_set_destroy(struct razor_set *set) free(set); } -static int +int razor_set_write(struct razor_set *set, const char *filename) { char data[4096]; @@ -836,7 +834,7 @@ razor_set_list_provides(struct razor_set *set, const char *name) razor_set_list_all_properties(set, &set->provides); } -void +static void razor_set_list_property_packages(struct razor_set *set, struct array *properties, const char *name, @@ -870,6 +868,22 @@ razor_set_list_property_packages(struct razor_set *set, } void +razor_set_list_requires_packages(struct razor_set *set, + const char *name, + const char *version) +{ + razor_set_list_property_packages(set, &set->requires, name, version); +} + +void +razor_set_list_provides_packages(struct razor_set *set, + const char *name, + const char *version) +{ + razor_set_list_property_packages(set, &set->provides, name, version); +} + +static void razor_set_validate(struct razor_set *set, struct array *unsatisfied) { struct razor_property *r, *p, *rend, *pend; @@ -1331,7 +1345,7 @@ razor_set_update(struct razor_set *set, struct razor_set *upstream, int count, const char **packages) { struct razor_set *new; - struct razor_package *p, *upackages; + struct razor_package *upackages; struct array list, unsatisfied; char *pool; unsigned long *u, *end; @@ -1346,16 +1360,9 @@ razor_set_update(struct razor_set *set, struct razor_set *upstream, end = list.data + list.size; upackages = upstream->packages.data; pool = upstream->string_pool.data; - for (u = list.data; u < end; u++) { - p = upackages + *u; - printf("package %s-%s set to be updated\n", - &pool[p->name], &pool[p->version]); - } total += list.size / sizeof *u; while (list.size > 0) { - printf(" -- satisfying new requires\n"); - new = razor_set_add(set, upstream, &list); array_release(&list); razor_set_destroy(set); @@ -1370,164 +1377,11 @@ razor_set_update(struct razor_set *set, struct razor_set *upstream, end = list.data + list.size; upackages = upstream->packages.data; pool = upstream->string_pool.data; - for (u = list.data; u < end; u++) { - p = upackages + *u; - printf("package %s-%s set to be updated\n", - &pool[p->name], &pool[p->version]); - } total += list.size / sizeof *u; } array_release(&list); - printf("total of %d packages set to be updated\n", total); - return set; } -void -razor_set_info(struct razor_set *set) -{ - unsigned int offset, size; - int i; - - for (i = 0; i < set->header->sections[i].type; i++) { - offset = set->header->sections[i].offset; - size = set->header->sections[i].size; - - switch (set->header->sections[i].type) { - case RAZOR_PACKAGES: - printf("package section:\t%dkb\n", size / 1024); - break; - case RAZOR_REQUIRES: - printf("requires section:\t%dkb\n", size / 1024); - break; - case RAZOR_PROVIDES: - printf("provides section:\t%dkb\n", size / 1024); - break; - case RAZOR_STRING_POOL: - printf("string pool:\t\t%dkb\n", size / 1024); - break; - } - } -} - -static int -usage(void) -{ - printf("usage: razor [ import FILES | lookup | " - "list | list-requires | list-provides | eat-yum | info ]\n"); - exit(1); -} - -static const char *repo_filename = "system.repo"; -static const char rawhide_repo_filename[] = "rawhide.repo"; - -int -main(int argc, const char *argv[]) -{ - struct razor_set *set, *upstream; - struct stat statbuf; - char *repo; - - repo = getenv("RAZOR_REPO"); - if (repo != NULL) - repo_filename = repo; - - if (argc < 2) { - usage(); - } else if (strcmp(argv[1], "import") == 0) { - if (stat("set", &statbuf) && mkdir("set", 0777)) { - fprintf(stderr, "could not create directory 'set'\n"); - exit(-1); - } - - set = razor_import_rzr_files(argc - 2, argv + 2); - - printf("pool size: %d\n", set->string_pool.size); - printf("pool allocation: %d\n", set->string_pool.alloc); - printf("packages: %d\n", - set->packages.size / sizeof(struct razor_package)); - printf("requires: %d\n", - set->requires.size / sizeof(struct razor_property)); - printf("provides: %d\n", - set->provides.size / sizeof(struct razor_property)); - - razor_set_write(set, repo_filename); - - razor_set_destroy(set); - } else if (strcmp(argv[1], "list") == 0) { - set = razor_set_open(repo_filename); - razor_set_list(set); - razor_set_destroy(set); - } else if (strcmp(argv[1], "list-requires") == 0) { - set = razor_set_open(repo_filename); - razor_set_list_requires(set, argv[2]); - razor_set_destroy(set); - } else if (strcmp(argv[1], "list-provides") == 0) { - set = razor_set_open(repo_filename); - razor_set_list_provides(set, argv[2]); - razor_set_destroy(set); - } else if (strcmp(argv[1], "what-requires") == 0) { - set = razor_set_open(repo_filename); - razor_set_list_property_packages(set, &set->requires, - argv[2], argv[3]); - razor_set_destroy(set); - } else if (strcmp(argv[1], "what-provides") == 0) { - set = razor_set_open(repo_filename); - razor_set_list_property_packages(set, &set->provides, - argv[2], argv[3]); - razor_set_destroy(set); - } else if (strcmp(argv[1], "info") == 0) { - set = razor_set_open(repo_filename); - razor_set_info(set); - razor_set_destroy(set); - } else if (strcmp(argv[1], "eat-yum") == 0) { - set = razor_set_create_from_yum_filelist(STDIN_FILENO); - if (set == NULL) - return 1; - razor_set_write(set, rawhide_repo_filename); - razor_set_destroy(set); - printf("wrote %s\n", rawhide_repo_filename); - } else if (strcmp(argv[1], "import-rpmdb") == 0) { - set = razor_set_create_from_rpmdb(); - if (set == NULL) - return 1; - razor_set_write(set, repo_filename); - razor_set_destroy(set); - printf("wrote %s\n", repo_filename); - } else if (strcmp(argv[1], "validate") == 0) { - set = razor_set_open(repo_filename); - if (set == NULL) - return 1; - razor_set_list_unsatisfied(set); - razor_set_destroy(set); - } else if (strcmp(argv[1], "add") == 0) { - struct array list; - - set = razor_set_open(repo_filename); - upstream = razor_set_open(rawhide_repo_filename); - if (set == NULL || upstream == NULL) - return 1; - array_init(&list); - find_packages(upstream, argc - 2, argv + 2, &list); - set = razor_set_add(set, upstream, &list); - razor_set_write(set, "system-updated.repo"); - razor_set_destroy(set); - printf("wrote system-updated.repo\n"); - } else if (strcmp(argv[1], "update") == 0) { - set = razor_set_open(repo_filename); - upstream = razor_set_open(rawhide_repo_filename); - if (set == NULL || upstream == NULL) - return 1; - set = razor_set_update(set, upstream, argc - 2, argv + 2); - razor_set_write(set, "system-updated.repo"); - razor_set_destroy(set); - razor_set_destroy(upstream); - printf("wrote system-updated.repo\n"); - } else { - usage(); - } - - return 0; -} diff --git a/razor.h b/razor.h index 6b911ff..f295532 100644 --- a/razor.h +++ b/razor.h @@ -1,6 +1,29 @@ #ifndef _RAZOR_H_ #define _RAZOR_H_ +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +struct razor_set; + +struct razor_set *razor_set_open(const char *filename); +void razor_set_destroy(struct razor_set *set); +int razor_set_write(struct razor_set *set, const char *filename); + +void razor_set_list(struct razor_set *set); +void razor_set_list_requires(struct razor_set *set, const char *name); +void razor_set_list_provides(struct razor_set *set, const char *name); +void razor_set_list_requires_packages(struct razor_set *set, + const char *name, + const char *version); +void razor_set_list_provides_packages(struct razor_set *set, + const char *name, + const char *version); + +void razor_set_list_unsatisfied(struct razor_set *set); +struct razor_set *razor_set_update(struct razor_set *set, + struct razor_set *upstream, + int count, const char **packages); + struct razor_importer; struct razor_importer *razor_importer_new(void);