From 7a29678aac20ac9e113704f8a5743f6051edef8d Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Thu, 25 Jun 2009 15:14:07 +0300 Subject: [PATCH] help: auto construct help And add some more verbosity to the help message. --- src/add.c | 90 +++++++++++----------- src/apk.c | 190 ++++++++++++++++++++++++++++++++++++----------- src/apk_applet.h | 15 +++- src/apk_blob.h | 5 +- src/audit.c | 10 ++- src/del.c | 5 +- src/fetch.c | 19 +++-- src/index.c | 11 ++- src/info.c | 28 +++---- src/search.c | 7 +- src/update.c | 4 +- src/upgrade.c | 9 ++- src/ver.c | 15 ++-- 13 files changed, 265 insertions(+), 143 deletions(-) diff --git a/src/add.c b/src/add.c index 91f9380..bc9f042 100644 --- a/src/add.c +++ b/src/add.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -51,49 +51,41 @@ static void md5_str(const char *str, md5sum_t csum) static int cup(void) { -/* compressed/uncompressed size is 259/1213 */ - static unsigned char z[] = { - 0x78,0x9c,0x9d,0x94,0x3d,0x8e,0xc4,0x20, - 0xc,0x85,0xfb,0x9c,0xc2,0x72,0x43,0x46, - 0x8a,0x4d,0x3f,0x67,0x89,0x64,0x77,0x2b, - 0x6d,0xbb,0x6d,0xe,0x3f,0xc6,0x84,0x4d, - 0x8,0x84,0x55,0xd6,0xa2,0xe0,0xef,0x7b, - 0x36,0xe1,0x11,0x80,0x6e,0xcc,0x53,0x7f, - 0x3e,0xc5,0xeb,0xcf,0x1d,0x20,0x22,0xcc, - 0x3c,0x53,0x8e,0x17,0xd9,0x80,0x6d,0xee, - 0xe,0x61,0x42,0x3c,0x8b,0xcf,0xc7,0x12, - 0x22,0x71,0x8b,0x31,0x5,0xd5,0xb0,0x11, - 0x4b,0xa7,0x32,0x2f,0x80,0x69,0x6b,0xb0, - 0x98,0x40,0xe2,0xcd,0xba,0x6a,0xba,0xe4, - 0x65,0xed,0x61,0x23,0x44,0xb5,0x95,0x6, - 0x8b,0xde,0x6c,0x61,0x70,0xde,0xe,0xb6, - 0xed,0xc4,0x43,0xc,0x56,0x6f,0x8f,0x31, - 0xd0,0x35,0xb5,0xc7,0x58,0x6,0xff,0x81, - 0x49,0x84,0xb8,0xe,0xb1,0xd8,0xc1,0x66, - 0x31,0xe,0x46,0x5c,0x43,0xc9,0xef,0xe5, - 0xdc,0x63,0xb1,0xdc,0x67,0x6d,0x31,0xb3, - 0xc9,0x69,0x74,0x87,0xc7,0xa3,0x1b,0x6a, - 0xb3,0xbd,0x2f,0x3b,0xd5,0xc,0x57,0x3b, - 0xce,0x7c,0x5e,0xe5,0x48,0xd0,0x48,0x1, - 0x92,0x49,0x8b,0xf7,0xfc,0x58,0x67,0xb3, - 0xf7,0x14,0x20,0x5c,0x4c,0x9e,0xcc,0xeb, - 0x78,0x7e,0x64,0xa6,0xa1,0xf5,0xb2,0x70, - 0x38,0x9,0x7c,0x7f,0xfd,0xc0,0x8a,0x4e, - 0xc8,0x55,0xe8,0x12,0xe2,0x9f,0x1a,0xb1, - 0xb9,0x82,0x52,0x2,0x7a,0xe5,0xf9,0xd9, - 0x88,0x47,0x79,0x3b,0x46,0x61,0x27,0xf9, - 0x51,0xb1,0x17,0xb0,0x2c,0xe,0xd5,0x39, - 0x2d,0x96,0x25,0x27,0xd6,0xd1,0x3f,0xa5, - 0x8,0xe1,0x9e,0x4e,0xa7,0xe9,0x3,0xb1, - 0xa,0xb6,0x75,}; + /* compressed/uncompressed size is 259/1213 */ + static unsigned char z[] = { + 0x78,0x9c,0x9d,0x94,0x3d,0x8e,0xc4,0x20,0x0c,0x85,0xfb,0x9c, + 0xc2,0x72,0x43,0x46,0x8a,0x4d,0x3f,0x67,0x89,0x64,0x77,0x2b, + 0x6d,0xbb,0x6d,0x0e,0x3f,0xc6,0x84,0x4d,0x08,0x84,0x55,0xd6, + 0xa2,0xe0,0xef,0x7b,0x36,0xe1,0x11,0x80,0x6e,0xcc,0x53,0x7f, + 0x3e,0xc5,0xeb,0xcf,0x1d,0x20,0x22,0xcc,0x3c,0x53,0x8e,0x17, + 0xd9,0x80,0x6d,0xee,0x0e,0x61,0x42,0x3c,0x8b,0xcf,0xc7,0x12, + 0x22,0x71,0x8b,0x31,0x05,0xd5,0xb0,0x11,0x4b,0xa7,0x32,0x2f, + 0x80,0x69,0x6b,0xb0,0x98,0x40,0xe2,0xcd,0xba,0x6a,0xba,0xe4, + 0x65,0xed,0x61,0x23,0x44,0xb5,0x95,0x06,0x8b,0xde,0x6c,0x61, + 0x70,0xde,0x0e,0xb6,0xed,0xc4,0x43,0x0c,0x56,0x6f,0x8f,0x31, + 0xd0,0x35,0xb5,0xc7,0x58,0x06,0xff,0x81,0x49,0x84,0xb8,0x0e, + 0xb1,0xd8,0xc1,0x66,0x31,0x0e,0x46,0x5c,0x43,0xc9,0xef,0xe5, + 0xdc,0x63,0xb1,0xdc,0x67,0x6d,0x31,0xb3,0xc9,0x69,0x74,0x87, + 0xc7,0xa3,0x1b,0x6a,0xb3,0xbd,0x2f,0x3b,0xd5,0x0c,0x57,0x3b, + 0xce,0x7c,0x5e,0xe5,0x48,0xd0,0x48,0x01,0x92,0x49,0x8b,0xf7, + 0xfc,0x58,0x67,0xb3,0xf7,0x14,0x20,0x5c,0x4c,0x9e,0xcc,0xeb, + 0x78,0x7e,0x64,0xa6,0xa1,0xf5,0xb2,0x70,0x38,0x09,0x7c,0x7f, + 0xfd,0xc0,0x8a,0x4e,0xc8,0x55,0xe8,0x12,0xe2,0x9f,0x1a,0xb1, + 0xb9,0x82,0x52,0x02,0x7a,0xe5,0xf9,0xd9,0x88,0x47,0x79,0x3b, + 0x46,0x61,0x27,0xf9,0x51,0xb1,0x17,0xb0,0x2c,0x0e,0xd5,0x39, + 0x2d,0x96,0x25,0x27,0xd6,0xd1,0x3f,0xa5,0x08,0xe1,0x9e,0x4e, + 0xa7,0xe9,0x03,0xb1,0x0a,0xb6,0x75 + }; unsigned char buf[1213]; - unsigned long len = 1213; //sizeof(buf); + unsigned long len = sizeof(buf); + uncompress(buf, &len, z, sizeof(z)); write(STDOUT_FILENO, buf, len); + return 0; } - + static int add_main(void *ctx, int argc, char **argv) { struct add_ctx *actx = (struct add_ctx *) ctx; @@ -104,21 +96,21 @@ static int add_main(void *ctx, int argc, char **argv) struct apk_dependency virtdep; int i, r; - if ((argc > 0) && (apk_verbosity > 1) && + if ((argc > 0) && (apk_verbosity > 1) && (strcmp(argv[0], "coffee") == 0)) return cup(); r = apk_db_open(&db, apk_root, actx->open_flags | APK_OPENF_WRITE); if (r != 0) return r; - + if (actx->virtpkg) { virtpkg = apk_pkg_new(); if (virtpkg == NULL) { apk_error("Failed to allocate virtual meta package"); goto err; } - virtpkg->name = apk_db_get_name(&db, APK_BLOB_STR(actx->virtpkg)); + virtpkg->name = apk_db_get_name(&db, APK_BLOB_STR(actx->virtpkg)); md5_str(virtpkg->name->name, virtpkg->csum); virtpkg->version = strdup("0"); virtpkg->description = strdup("virtual meta package"); @@ -174,15 +166,21 @@ err: return r; } -static struct option add_options[] = { - { "initdb", no_argument, NULL, 0x10000 }, - { "upgrade", no_argument, NULL, 'u' }, - { "virtual", required_argument, NULL, 't' }, +static struct apk_option add_options[] = { + { 0x10000, "initdb", "Initialize database" }, + { 'u', "upgrade", "Prefer to upgrade package" }, + { 't', "virtual", + "Instead of adding all the packages to 'world', create a new virtual " + "package with the listed dependencies and add that to 'world'. The " + "actions of the command are easily reverted by deleting the virtual " + "package.", required_argument, "NAME" }, }; static struct apk_applet apk_add = { .name = "add", - .usage = "[--initdb] [-u|--upgrade] [-t|--virtual NAME] PACKAGE...", + .help = "Add (or update) PACKAGEs to main dependencies and install " + "them, while ensuring that all dependencies are met.", + .arguments = "PACKAGE...", .context_size = sizeof(struct add_ctx), .num_options = ARRAY_SIZE(add_options), .options = add_options, diff --git a/src/apk.c b/src/apk.c index 64b0adb..25e7b07 100644 --- a/src/apk.c +++ b/src/apk.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -20,12 +20,29 @@ #include "apk_defines.h" #include "apk_applet.h" +#include "apk_blob.h" const char *apk_root; struct apk_repository_url apk_repository_list; int apk_verbosity = 1, apk_cwd_fd; unsigned int apk_flags = 0; +static struct apk_option generic_options[] = { + { 'h', "help", "Show generic help or applet specific help" }, + { 'p', "root", "Install packages to DIR", + required_argument, "DIR" }, + { 'X', "repository", "Use packages from REPO", + required_argument, "REPO" }, + { 'q', "quiet", "Print less information" }, + { 'v', "verbose", "Print more information" }, + { 'V', "version", "Print program version and exit" }, + { 'f', "force", "Do what was asked even if it looks dangerous" }, + { 0x101, "progress", "Show a progress bar" }, + { 0x102, "clean-protected", + "Do not create .apk-new files to configuration dirs" }, + { 0x104, "simulate", "Show what would be done without actually doing it" }, +}; + void apk_log(const char *prefix, const char *format, ...) { va_list va; @@ -38,34 +55,116 @@ void apk_log(const char *prefix, const char *format, ...) fprintf(stderr, "\n"); } -int version(void) +static int version(void) { printf("apk-tools " APK_VERSION "\n"); return 0; } -int generic_usage(void) -{ - struct apk_applet **a; - printf("usage: apk COMMAND [-h|--help] [-p|--root DIR] [-X|--repository REPO]\n" - "\t\t [-q|--quiet] [-v|--verbose] [-V|--version] [-f|--force]\n" - "\t\t [--progress] [--clean-protected] [--simulate] [ARGS]...\n\n" - "commands: "); +struct apk_indent { + int x; + int indent; +}; - for (a = &__start_apkapplets; a < &__stop_apkapplets; a++) { - printf("%s ", - (*a)->name); +static int print_indented(struct apk_indent *i, apk_blob_t blob) +{ + static const int wrap_length = 80; + + if (i->x + blob.len + 1 >= wrap_length) { + i->x = i->indent; + printf("\n%*s", i->indent - 1, ""); } - printf("\n\n"); - return 1; + i->x += printf(" %.*s", blob.len, blob.ptr); + return 0; } -int usage(struct apk_applet *applet) +static void print_indented_words(struct apk_indent *i, const char *text) { + apk_blob_for_each_segment(APK_BLOB_STR(text), " ", + (apk_blob_cb) print_indented, i); +} + +static int format_option(char *buf, size_t len, struct apk_option *o, + const char *separator) +{ + int i = 0; + + if (o->val <= 0xff && isalnum(o->val)) { + i += snprintf(&buf[i], len - i, "-%c", o->val); + if (o->name != NULL) + i += snprintf(&buf[i], len - i, "%s", separator); + } + if (o->name != NULL) + i += snprintf(&buf[i], len - i, "--%s", o->name); + if (o->arg_name != NULL) + i += snprintf(&buf[i], len - i, " %s", o->arg_name); + + return i; +} + +static void print_usage(const char *cmd, const char *args, int num_opts, + struct apk_option *opts) +{ + struct apk_indent indent = { 0, 11 }; + char word[128]; + int i, j; + + indent.x = printf("\nusage: apk %s", cmd) - 1; + for (i = 0; i < num_opts; i++) { + j = 0; + word[j++] = '['; + j += format_option(&word[j], sizeof(word) - j, &opts[i], "|"); + word[j++] = ']'; + print_indented(&indent, APK_BLOB_PTR_LEN(word, j)); + } + if (args != NULL) + print_indented(&indent, APK_BLOB_STR(args)); + printf("\n"); +} + +static void print_options(int num_opts, struct apk_option *opts) +{ + struct apk_indent indent = { 0, 26 }; + char word[128]; + int i; + + for (i = 0; i < num_opts; i++) { + format_option(word, sizeof(word), &opts[i], ", "); + indent.x = printf(" %-*s", indent.indent - 3, word); + print_indented_words(&indent, opts[i].help); + printf("\n"); + } +} + +static int usage(struct apk_applet *applet) +{ + struct apk_indent indent = { 0, 2 }; + version(); - if (applet == NULL) - return generic_usage(); - printf("usage: apk %s %s\n\n", applet->name, applet->usage); + if (applet == NULL) { + struct apk_applet **a; + + print_usage("COMMAND", "[ARGS]...", + ARRAY_SIZE(generic_options), generic_options); + + printf("\navailable commands:\n "); + for (a = &__start_apkapplets; a < &__stop_apkapplets; a++) + printf("%s ", (*a)->name); + } else { + print_usage(applet->name, applet->arguments, + applet->num_options, applet->options); + printf("\ndescription:\n%*s", indent.indent - 1, ""); + print_indented_words(&indent, applet->help); + } + printf("\n\ngeneric options:\n"); + print_options(ARRAY_SIZE(generic_options), generic_options); + + if (applet != NULL && applet->num_options > 0) { + printf("\noptions for %s command:\n", applet->name); + print_options(applet->num_options, applet->options); + } + printf("\nThis apk has coffee making abilities.\n\n"); + return 1; } @@ -77,7 +176,7 @@ static struct apk_applet *find_applet(const char *name) if (strcmp(name, (*a)->name) == 0) return *a; } - + return NULL; } @@ -110,7 +209,7 @@ static struct apk_applet *deduce_applet(int argc, char **argv) static struct apk_repository_url *apk_repository_new(const char *url) { - struct apk_repository_url *r = calloc(1, + struct apk_repository_url *r = calloc(1, sizeof(struct apk_repository_url)); if (r) { r->url = url; @@ -119,26 +218,25 @@ static struct apk_repository_url *apk_repository_new(const char *url) return r; } -#define NUM_GENERIC_OPTS 10 -static struct option generic_options[32] = { - { "help", no_argument, NULL, 'h'}, - { "root", required_argument, NULL, 'p' }, - { "repository", required_argument, NULL, 'X' }, - { "quiet", no_argument, NULL, 'q' }, - { "verbose", no_argument, NULL, 'v' }, - { "version", no_argument, NULL, 'V' }, - { "force", no_argument, NULL, 'f' }, - { "progress", no_argument, NULL, 0x101 }, - { "clean-protected", no_argument, NULL, 0x102 }, - { "simulate", no_argument, NULL, 0x104 }, -}; +static void merge_options(struct option *opts, struct apk_option *ao, int num) +{ + int i; + + for (i = 0; i < num; i++, opts++, ao++) { + opts->name = ao->name; + opts->has_arg = ao->has_arg; + opts->flag = NULL; + opts->val = ao->val; + } + opts->name = NULL; +} int main(int argc, char **argv) { struct apk_applet *applet; char short_options[256], *sopt; - struct option *opt; - int r, optindex; + struct option *opt, *all_options; + int r, optindex, num_options; void *ctx = NULL; struct apk_repository_url *repo = NULL; @@ -148,19 +246,20 @@ int main(int argc, char **argv) list_init(&apk_repository_list.list); applet = deduce_applet(argc, argv); + num_options = ARRAY_SIZE(generic_options) + 1; + if (applet != NULL) + num_options += applet->num_options; + all_options = alloca(sizeof(struct option) * num_options); + merge_options(&all_options[0], generic_options, + ARRAY_SIZE(generic_options)); if (applet != NULL) { - if (applet->num_options && applet->options) { - memcpy(&generic_options[NUM_GENERIC_OPTS], - applet->options, - applet->num_options * sizeof(struct option)); - } - + merge_options(&all_options[ARRAY_SIZE(generic_options)], + applet->options, applet->num_options); if (applet->context_size != 0) ctx = calloc(1, applet->context_size); } - for (opt = &generic_options[0], sopt = short_options; - opt->name != NULL; opt++) { + for (opt = all_options, sopt = short_options; opt->name != NULL; opt++) { if (opt->flag == NULL && opt->val <= 0xff && isalnum(opt->val)) { *(sopt++) = opt->val; @@ -171,7 +270,7 @@ int main(int argc, char **argv) optindex = 0; while ((r = getopt_long(argc, argv, short_options, - generic_options, &optindex)) != -1) { + all_options, &optindex)) != -1) { switch (r) { case 0: break; @@ -208,7 +307,8 @@ int main(int argc, char **argv) break; default: if (applet == NULL || applet->parse == NULL || - applet->parse(ctx, r, optindex - NUM_GENERIC_OPTS, + applet->parse(ctx, r, + optindex - ARRAY_SIZE(generic_options), optarg) != 0) return usage(applet); break; diff --git a/src/apk_applet.h b/src/apk_applet.h index dba5589..2782a92 100644 --- a/src/apk_applet.h +++ b/src/apk_applet.h @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -24,13 +24,22 @@ struct apk_repository_url { extern struct apk_repository_url apk_repository_list; +struct apk_option { + int val; + const char *name; + const char *help; + int has_arg; + const char *arg_name; +}; + struct apk_applet { const char *name; - const char *usage; + const char *arguments; + const char *help; int context_size; int num_options; - struct option *options; + struct apk_option *options; int (*parse)(void *ctx, int optch, int optindex, const char *optarg); int (*main)(void *ctx, int argc, char **argv); diff --git a/src/apk_blob.h b/src/apk_blob.h index 7e63293..29da722 100644 --- a/src/apk_blob.h +++ b/src/apk_blob.h @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -19,6 +19,7 @@ struct apk_blob { char *ptr; }; typedef struct apk_blob apk_blob_t; +typedef int (*apk_blob_cb)(void *ctx, apk_blob_t blob); #define APK_BLOB_IS_NULL(blob) (blob.ptr == NULL) @@ -44,7 +45,7 @@ unsigned long apk_blob_hash(apk_blob_t str); int apk_blob_compare(apk_blob_t a, apk_blob_t b); int apk_blob_for_each_segment(apk_blob_t blob, const char *split, - int (*cb)(void *ctx, apk_blob_t blob), void *ctx); + apk_blob_cb cb, void *ctx); int apk_hexdump_parse(apk_blob_t to, apk_blob_t from); int apk_hexdump_format(int tolen, char *to, apk_blob_t from); diff --git a/src/audit.c b/src/audit.c index 65275d4..9ea0f25 100644 --- a/src/audit.c +++ b/src/audit.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -128,13 +128,15 @@ static int audit_main(void *ctx, int argc, char **argv) return r; } -static struct option audit_options[] = { - { "backup", no_argument, NULL, 0x10000 }, +static struct apk_option audit_options[] = { + { 0x10000, "backup", + "List all modified configuration files that need to be backed up" }, }; static struct apk_applet apk_audit = { .name = "audit", - .usage = "--backup", + .help = "Audit the filesystem for changes compared to installed " + "database.", .context_size = sizeof(struct audit_ctx), .num_options = ARRAY_SIZE(audit_options), .options = audit_options, diff --git a/src/del.c b/src/del.c index b5b0477..b7f2ce5 100644 --- a/src/del.c +++ b/src/del.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -60,7 +60,8 @@ out: static struct apk_applet apk_del = { .name = "del", - .usage = "PACKAGE...", + .help = "Remove PACKAGEs from the main dependencies and uninstall them.", + .arguments = "PACKAGE...", .main = del_main, }; diff --git a/src/fetch.c b/src/fetch.c index fe257d0..84f0b39 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -184,17 +184,20 @@ err: return r; } -static struct option fetch_options[] = { - { "recursive", no_argument, NULL, 'R' }, - { "stdout", no_argument, NULL, 's' }, - { "link", no_argument, NULL, 'L' }, - { "output", required_argument, NULL, 'o' }, +static struct apk_option fetch_options[] = { + { 'l', "link", "Create hard links if possible" }, + { 'R', "recursive", "Fetch the PACKAGE and all it's dependencies" }, + { 's', "stdout", + "Dump the .apk to stdout (incompatible with -o and -R)" }, + { 'o', "output", "Directory to place the PACKAGEs to", + required_argument, "DIR" }, }; static struct apk_applet apk_fetch = { .name = "fetch", - .usage = "[-R|--recursive|--stdout] [-L|--link] [-o|--output DIR]\n" - "\t\t PACKAGE...", + .help = "Download PACKAGEs from repositories to a local directory from " + "which a local mirror repository can be created.", + .arguments = "PACKAGE...", .context_size = sizeof(struct fetch_ctx), .num_options = ARRAY_SIZE(fetch_options), .options = fetch_options, diff --git a/src/index.c b/src/index.c index 824d60e..960c42f 100644 --- a/src/index.c +++ b/src/index.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -113,13 +113,16 @@ static int index_main(void *ctx, int argc, char **argv) return 0; } -static struct option index_options[] = { - { "delete", required_argument, NULL, 'd' }, +static struct apk_option index_options[] = { + { 'd', "delete", + "Read existing INDEXFILE and delete the listed FILEs from it", + required_argument, "INDEXFILE" }, }; static struct apk_applet apk_index = { .name = "index", - .usage = "[-d|--delete INDEXFILE] FILE...", + .help = "Create repository index file from FILEs.", + .arguments = "FILE...", .context_size = sizeof(struct index_ctx), .num_options = ARRAY_SIZE(index_options), .options = index_options, diff --git a/src/info.c b/src/info.c index def6d69..41e8604 100644 --- a/src/info.c +++ b/src/info.c @@ -4,7 +4,7 @@ * Copyright (C) 2009 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -88,7 +88,7 @@ static int info_exists(struct info_ctx *ctx, struct apk_database *db, for (i = 0; i < argc; i++) { name = apk_db_query_name(db, APK_BLOB_STR(argv[i])); - if (name == NULL) { + if (name == NULL) { ret++; continue; } @@ -199,7 +199,7 @@ static void info_print_depends(struct apk_package *pkg) { int i; char *separator = apk_verbosity > 1 ? " " : "\n"; - if (apk_verbosity == 1) + if (apk_verbosity == 1) printf("%s-%s depends on:\n", pkg->name->name, pkg->version); if (pkg->depends == NULL) return; @@ -325,21 +325,21 @@ static int info_main(void *ctx, int argc, char **argv) return r; } -static struct option info_options[] = { - { "contents", no_argument, NULL, 'L' }, - { "installed", no_argument, NULL, 'e' }, - { "who-owns", no_argument, NULL, 'W' }, - { "depends", no_argument, NULL, 'R' }, - { "rdepends", no_argument, NULL, 'r' }, - { "webpage", no_argument, NULL, 'w' }, - { "size", no_argument, NULL, 's' }, - { "description", no_argument, NULL, 'd' }, +static struct apk_option info_options[] = { + { 'L', "contents", "List contents of the PACKAGE" }, + { 'e', "installed", "Check if PACKAGE is installed" }, + { 'W', "who-owns", "Print the package owning the specified file" }, + { 'R', "depends", "List packages that the PACKAGE depends on" }, + { 'r', "rdepends", "List all packages depending on PACKAGE" }, + { 'w', "webpage", "Show URL for more information about PACKAGE" }, + { 's', "size", "Show installed size of PACKAGE" }, + { 'd', "description", "Print description for PACKAGE" }, }; static struct apk_applet apk_info = { .name = "info", - .usage = "[-L|--contents] [-e|--installed] [-W|--who-owns] [-R|--depends]\n" - "\t\t[-r|--rdepends] [-w|--webage] [-s|--size] PACKAGE...", + .help = "Give detailed information about PACKAGEs.", + .arguments = "PACKAGE...", .context_size = sizeof(struct info_ctx), .num_options = ARRAY_SIZE(info_options), .options = info_options, diff --git a/src/search.c b/src/search.c index ada8606..9acf4f3 100644 --- a/src/search.c +++ b/src/search.c @@ -130,13 +130,14 @@ static int search_main(void *ctx, int argc, char **argv) return r; } -static struct option search_options[] = { - { "description", no_argument, NULL, 'd' }, +static struct apk_option search_options[] = { + { 'd', "description", "Search also package descriptions" }, }; static struct apk_applet apk_search = { .name = "search", - .usage = "[--description|-d] PATTERN", + .help = "Search package names (and descriptions) by wildcard PATTERN.", + .arguments = "PATTERN", .context_size = sizeof(struct search_ctx), .num_options = ARRAY_SIZE(search_options), .options = search_options, diff --git a/src/update.c b/src/update.c index c34fc07..aa7bd25 100644 --- a/src/update.c +++ b/src/update.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -30,7 +30,7 @@ static int update_main(void *ctx, int argc, char **argv) static struct apk_applet apk_update = { .name = "update", - .usage = "", + .help = "Update repository indexes from all remote repositories.", .main = update_main, }; diff --git a/src/upgrade.c b/src/upgrade.c index 59a113d..ff30c81 100644 --- a/src/upgrade.c +++ b/src/upgrade.c @@ -57,13 +57,16 @@ err: return r; } -static struct option upgrade_options[] = { - { "available", no_argument, NULL, 'a' }, +static struct apk_option upgrade_options[] = { + { 'a', "available", + "Re-install or downgrade if currently installed package is not " + "currently available from any repository" }, }; static struct apk_applet apk_upgrade = { .name = "upgrade", - .usage = "[-a|--available]", + .help = "Upgrade (or downgrade with -a) the currently installed " + "packages to versions available in repositories.", .num_options = ARRAY_SIZE(upgrade_options), .options = upgrade_options, .parse = upgrade_parse, diff --git a/src/ver.c b/src/ver.c index 25da3eb..fc3e8d5 100644 --- a/src/ver.c +++ b/src/ver.c @@ -4,7 +4,7 @@ * Copyright (C) 2008 Timo Teräs * All rights reserved. * - * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. See http://www.gnu.org/ for details. */ @@ -57,7 +57,7 @@ static int ver_validate(int argc, char **argv) } return r; } - + static int ver_parse(void *ctx, int opt, int optindex, const char *optarg) { struct ver_ctx *ictx = (struct ver_ctx *) ctx; @@ -84,7 +84,7 @@ static void ver_print_package_status(struct apk_package *pkg) latest = pkg; for (i = 0; i < name->pkgs->num; i++) { tmp = name->pkgs->item[i]; - if (tmp->name != name || + if (tmp->name != name || apk_pkg_get_state(tmp) == APK_PKG_INSTALLED) continue; r = apk_pkg_version_compare(tmp, latest); @@ -137,14 +137,15 @@ ver_exit: return ret; } -static struct option ver_options[] = { - { "test", no_argument, NULL, 't' }, - { "check", no_argument, NULL, 'c' }, +static struct apk_option ver_options[] = { + { 't', "test", "Compare two given versions" }, + { 'c', "check", "Check if the given version string is valid" }, }; static struct apk_applet apk_ver = { .name = "version", - .usage = "[-t|--test version1 version2] [-c|--check]", + .help = "Compare package versions (in installed database vs. available)" + " or do tests on version strings given on command line.", .context_size = sizeof(struct ver_ctx), .num_options = ARRAY_SIZE(ver_options), .options = ver_options,