summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/apk.c374
-rw-r--r--src/apk_applet.h18
-rw-r--r--src/app_add.c46
-rw-r--r--src/app_audit.c42
-rw-r--r--src/app_cache.c27
-rw-r--r--src/app_del.c22
-rw-r--r--src/app_dot.c27
-rw-r--r--src/app_fetch.c43
-rw-r--r--src/app_fix.c50
-rw-r--r--src/app_index.c41
-rw-r--r--src/app_info.c92
-rw-r--r--src/app_list.c71
-rw-r--r--src/app_search.c49
-rw-r--r--src/app_upgrade.c42
-rw-r--r--src/app_version.c52
-rw-r--r--src/help.c2
16 files changed, 563 insertions, 435 deletions
diff --git a/src/apk.c b/src/apk.c
index e993ac6..bb0dc79 100644
--- a/src/apk.c
+++ b/src/apk.c
@@ -13,6 +13,7 @@
#include <fcntl.h>
#include <ctype.h>
#include <errno.h>
+#include <assert.h>
#include <signal.h>
#include <stdarg.h>
#include <stdlib.h>
@@ -35,7 +36,6 @@
#include "apk_print.h"
#include "apk_io.h"
-static const struct apk_option_group *default_optgroups[] = { &optgroup_global, NULL };
static struct list_head apk_applet_list;
#define foreach_applet(iter) list_for_each_entry(iter, &apk_applet_list, node)
@@ -75,112 +75,185 @@ static struct apk_repository_list *apk_repository_new(const char *url)
return r;
}
-static int option_parse_global(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_GLOBAL_allow_untrusted,
+ OPT_GLOBAL_arch,
+ OPT_GLOBAL_cache_dir,
+ OPT_GLOBAL_cache_max_age,
+ OPT_GLOBAL_force,
+ OPT_GLOBAL_force_binary_stdout,
+ OPT_GLOBAL_force_broken_world,
+ OPT_GLOBAL_force_non_repository,
+ OPT_GLOBAL_force_old_apk,
+ OPT_GLOBAL_force_overwrite,
+ OPT_GLOBAL_force_refresh,
+ OPT_GLOBAL_help,
+ OPT_GLOBAL_interactive,
+ OPT_GLOBAL_keys_dir,
+ OPT_GLOBAL_no_cache,
+ OPT_GLOBAL_no_network,
+ OPT_GLOBAL_no_progress,
+ OPT_GLOBAL_print_arch,
+ OPT_GLOBAL_progress,
+ OPT_GLOBAL_progress_fd,
+ OPT_GLOBAL_purge,
+ OPT_GLOBAL_quiet,
+ OPT_GLOBAL_repositories_file,
+ OPT_GLOBAL_repository,
+ OPT_GLOBAL_root,
+ OPT_GLOBAL_update_cache,
+ OPT_GLOBAL_verbose,
+ OPT_GLOBAL_version,
+ OPT_GLOBAL_wait,
+#ifdef TEST_MODE
+ OPT_GLOBAL_test_instdb,
+ OPT_GLOBAL_test_repo,
+ OPT_GLOBAL_test_world,
+#endif
+};
+
+static const char optiondesc_global[] =
+ APK_OPTGROUP("Global")
+ APK_OPT1n("allow-untrusted")
+ APK_OPT1R("arch")
+ APK_OPT1R("cache-dir")
+ APK_OPT1R("cache-max-age")
+ APK_OPT2n("force", "f")
+ APK_OPT1n("force-binary-stdout")
+ APK_OPT1n("force-broken-world")
+ APK_OPT1n("force-non-repository")
+ APK_OPT1n("force-old-apk")
+ APK_OPT1n("force-overwrite")
+ APK_OPT1n("force-refresh")
+ APK_OPT2n("help", "h")
+ APK_OPT2n("interactive", "i")
+ APK_OPT1R("keys-dir")
+ APK_OPT1n("no-cache")
+ APK_OPT1n("no-network")
+ APK_OPT1n("no-progress")
+ APK_OPT1n("print-arch")
+ APK_OPT1n("progress")
+ APK_OPT1R("progress-fd")
+ APK_OPT1n("purge")
+ APK_OPT2n("quiet", "q")
+ APK_OPT1R("repositories-file")
+ APK_OPT2R("repository", "X")
+ APK_OPT2R("root", "p")
+ APK_OPT2n("update-cache", "U")
+ APK_OPT2n("verbose", "v")
+ APK_OPT2n("version", "V")
+ APK_OPT1R("wait")
+#ifdef TEST_MODE
+ APK_OPT1R("test-instdb")
+ APK_OPT1R("test-repo")
+ APK_OPT1R("test-world")
+#endif
+ ;
+
+static int option_parse_global(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct apk_repository_list *repo;
- switch (optch) {
- case 'h': return -EINVAL;
- case 'p':
+ switch (opt) {
+ case OPT_GLOBAL_help:
+ return -EINVAL;
+ case OPT_GLOBAL_root:
dbopts->root = optarg;
break;
- case 0x107:
+ case OPT_GLOBAL_keys_dir:
dbopts->keys_dir = optarg;
break;
- case 0x108:
+ case OPT_GLOBAL_repositories_file:
dbopts->repositories_file = optarg;
break;
- case 'X':
+ case OPT_GLOBAL_repository:
repo = apk_repository_new(optarg);
if (repo) list_add(&repo->list, &dbopts->repository_list);
break;
- case 'q':
+ case OPT_GLOBAL_quiet:
apk_verbosity--;
break;
- case 'v':
+ case OPT_GLOBAL_verbose:
apk_verbosity++;
break;
- case 'V':
+ case OPT_GLOBAL_version:
version();
return -ESHUTDOWN;
- case 'f':
+ case OPT_GLOBAL_force:
apk_force |= APK_FORCE_OVERWRITE | APK_FORCE_OLD_APK
| APK_FORCE_BROKEN_WORLD | APK_FORCE_NON_REPOSITORY
| APK_FORCE_BINARY_STDOUT;
break;
- case 0x120:
+ case OPT_GLOBAL_force_overwrite:
apk_force |= APK_FORCE_OVERWRITE;
break;
- case 0x121:
+ case OPT_GLOBAL_force_old_apk:
apk_force |= APK_FORCE_OLD_APK;
break;
- case 0x122:
+ case OPT_GLOBAL_force_broken_world:
apk_force |= APK_FORCE_BROKEN_WORLD;
break;
- case 0x123:
+ case OPT_GLOBAL_force_refresh:
apk_force |= APK_FORCE_REFRESH;
break;
- case 0x124:
+ case OPT_GLOBAL_force_non_repository:
apk_force |= APK_FORCE_NON_REPOSITORY;
break;
- case 0x125:
+ case OPT_GLOBAL_force_binary_stdout:
apk_force |= APK_FORCE_BINARY_STDOUT;
break;
- case 'i':
+ case OPT_GLOBAL_interactive:
apk_flags |= APK_INTERACTIVE;
break;
- case 0x101:
+ case OPT_GLOBAL_progress:
apk_flags |= APK_PROGRESS;
break;
- case 0x104:
- apk_flags |= APK_SIMULATE;
- break;
- case 0x110:
+ case OPT_GLOBAL_no_progress:
apk_flags &= ~APK_PROGRESS;
break;
- case 0x10f:
+ case OPT_GLOBAL_progress_fd:
apk_progress_fd = atoi(optarg);
break;
- case 0x103:
+ case OPT_GLOBAL_allow_untrusted:
apk_flags |= APK_ALLOW_UNTRUSTED;
break;
- case 0x106:
+ case OPT_GLOBAL_purge:
apk_flags |= APK_PURGE;
break;
- case 0x105:
+ case OPT_GLOBAL_wait:
dbopts->lock_wait = atoi(optarg);
break;
- case 0x109:
+ case OPT_GLOBAL_no_network:
apk_flags |= APK_NO_NETWORK;
break;
- case 0x115:
+ case OPT_GLOBAL_no_cache:
apk_flags |= APK_NO_CACHE;
break;
- case 0x116:
+ case OPT_GLOBAL_cache_dir:
dbopts->cache_dir = optarg;
break;
- case 'U':
+ case OPT_GLOBAL_update_cache:
/* Make it one minute, to avoid updating indexes twice
* when doing self-upgrade's re-exec */
dbopts->cache_max_age = 60;
break;
- case 0x119:
+ case OPT_GLOBAL_cache_max_age:
dbopts->cache_max_age = atoi(optarg) * 60;
break;
- case 0x112:
+ case OPT_GLOBAL_arch:
dbopts->arch = optarg;
break;
- case 0x114:
+ case OPT_GLOBAL_print_arch:
puts(APK_DEFAULT_ARCH);
return -ESHUTDOWN;
#ifdef TEST_MODE
- case 0x200:
+ case OPT_GLOBAL_test_repo:
*apk_string_array_add(&test_repos) = (char*) optarg;
break;
- case 0x201:
+ case OPT_GLOBAL_test_instdb:
test_installed_db = optarg;
break;
- case 0x202:
+ case OPT_GLOBAL_test_world:
test_world = optarg;
break;
#endif
@@ -190,69 +263,48 @@ static int option_parse_global(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_global[] = {
- { 'h', "help" },
- { 'p', "root", required_argument },
- { 'X', "repository", required_argument },
- { 'q', "quiet" },
- { 'v', "verbose" },
- { 'i', "interactive" },
- { 'V', "version" },
- { 'f', "force" },
- { 0x125, "force-binary-stdout" },
- { 0x122, "force-broken-world" },
- { 0x124, "force-non-repository" },
- { 0x121, "force-old-apk" },
- { 0x120, "force-overwrite" },
- { 0x123, "force-refresh" },
- { 'U', "update-cache" },
- { 0x101, "progress" },
- { 0x10f, "progress-fd", required_argument },
- { 0x110, "no-progress" },
- { 0x106, "purge" },
- { 0x103, "allow-untrusted" },
- { 0x105, "wait", required_argument },
- { 0x107, "keys-dir", required_argument },
- { 0x108, "repositories-file", required_argument },
- { 0x109, "no-network" },
- { 0x115, "no-cache" },
- { 0x116, "cache-dir", required_argument },
- { 0x119, "cache-max-age", required_argument },
- { 0x112, "arch", required_argument },
- { 0x114, "print-arch" },
-#ifdef TEST_MODE
- { 0x200, "test-repo", required_argument },
- { 0x201, "test-instdb", required_argument },
- { 0x202, "test-world", required_argument },
-#endif
-};
-
const struct apk_option_group optgroup_global = {
- .name = "Global",
- .options = options_global,
- .num_options = ARRAY_SIZE(options_global),
+ .desc = optiondesc_global,
.parse = option_parse_global,
};
-static int option_parse_commit(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_COMMIT_clean_protected,
+ OPT_COMMIT_initramfs_diskless_boot,
+ OPT_COMMIT_no_commit_hooks,
+ OPT_COMMIT_no_scripts,
+ OPT_COMMIT_overlay_from_stdin,
+ OPT_COMMIT_simulate,
+};
+
+static const char optiondesc_commit[] =
+ APK_OPTGROUP("commit")
+ APK_OPT1n("clean-protected")
+ APK_OPT1n("initramfs-diskless-boot")
+ APK_OPT1n("no-commit-hooks")
+ APK_OPT1n("no-scripts")
+ APK_OPT1n("overlay-from-stdin")
+ APK_OPT2n("simulate", "s");
+
+static int option_parse_commit(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
- switch (optch) {
- case 's':
+ switch (opt) {
+ case OPT_COMMIT_simulate:
apk_flags |= APK_SIMULATE;
break;
- case 0x102:
+ case OPT_COMMIT_clean_protected:
apk_flags |= APK_CLEAN_PROTECTED;
break;
- case 0x111:
+ case OPT_COMMIT_overlay_from_stdin:
apk_flags |= APK_OVERLAY_FROM_STDIN;
break;
- case 0x113:
+ case OPT_COMMIT_no_scripts:
apk_flags |= APK_NO_SCRIPTS;
break;
- case 0x117:
+ case OPT_COMMIT_no_commit_hooks:
apk_flags |= APK_NO_COMMIT_HOOKS;
break;
- case 0x118:
+ case OPT_COMMIT_initramfs_diskless_boot:
dbopts->open_flags |= APK_OPENF_CREATE;
apk_flags |= APK_NO_COMMIT_HOOKS;
apk_force |= APK_FORCE_OVERWRITE | APK_FORCE_OLD_APK
@@ -264,19 +316,8 @@ static int option_parse_commit(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_commit[] = {
- { 's', "simulate" },
- { 0x102, "clean-protected" },
- { 0x111, "overlay-from-stdin" },
- { 0x113, "no-scripts" },
- { 0x117, "no-commit-hooks" },
- { 0x118, "initramfs-diskless-boot" },
-};
-
const struct apk_option_group optgroup_commit = {
- .name = "Commit",
- .options = options_commit,
- .num_options = ARRAY_SIZE(options_commit),
+ .desc = optiondesc_commit,
.parse = option_parse_commit,
};
@@ -315,28 +356,81 @@ static struct apk_applet *deduce_applet(int argc, char **argv)
return find_applet(prog + 4);
for (i = 1; i < argc; i++) {
- if (argv[i][0] == '-')
- continue;
-
+ if (argv[i][0] == '-') continue;
a = find_applet(argv[i]);
- if (a != NULL)
- return a;
+ if (a) return a;
}
return NULL;
}
-static void merge_options(struct option *opts, const struct apk_option *ao, int num)
+static int parse_options(int argc, char **argv, struct apk_applet *applet, void *ctx, struct apk_db_options *dbopts)
{
- int i;
+ const struct apk_option_group *default_optgroups[] = { &optgroup_global, NULL };
+ const struct apk_option_group *og, **optgroups = default_optgroups;
+ struct option all_options[80], *opt;
+ char short_options[256], *sopt;
+ unsigned short short_option_val[64];
+ int r, p, help_requested = 0, num_short;
+
+ memset(short_option_val, 0, sizeof short_option_val);
- 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;
+ if (applet && applet->optgroups[0]) optgroups = applet->optgroups;
+
+ for (p = 0, opt = &all_options[0], sopt = short_options; (og = optgroups[p]) != 0; p++) {
+ assert(opt < &all_options[ARRAY_SIZE(all_options)]);
+ assert(sopt < &short_options[sizeof short_options]);
+ const char *d = og->desc + strlen(og->desc) + 1;
+ for (r = 0; *d; r++) {
+ opt->val = (p << 10) + r;
+ opt->flag = 0;
+ opt->has_arg = no_argument;
+ if ((unsigned char)*d == 0xaf) {
+ opt->has_arg = required_argument;
+ d++;
+ }
+ num_short = 1;
+ if ((unsigned char)*d >= 0xf0)
+ num_short = *d++ & 0x0f;
+ for (; num_short > 0; num_short--) {
+ assert(*d >= 64 && *d < 128);
+ short_option_val[*d - 64] = opt->val;
+ *sopt++ = *d++;
+ if (opt->has_arg != no_argument)
+ *sopt++ = ':';
+ }
+ opt->name = d;
+ opt++;
+ d += strlen(d) + 1;
+ }
}
- opts->name = NULL;
+ opt->name = 0;
+ *sopt = 0;
+
+ r = 0;
+ while ((p = getopt_long(argc, argv, short_options, all_options, NULL)) != -1) {
+ if (p >= 64 && p < 128) p = short_option_val[p - 64];
+ og = optgroups[p >> 10];
+ r = og->parse(ctx, dbopts, p & 0x3ff, optarg);
+ if (r == 0) continue;
+ if (r == -EINVAL) {
+ help_requested = 1;
+ continue;
+ }
+ if (r != -ENOTSUP) return r;
+ }
+
+ if (help_requested || r == -ENOTSUP)
+ return usage(applet);
+
+ if (applet == NULL) {
+ if (argc > 1) {
+ apk_error("'%s' is not an apk command. See 'apk --help'.", argv[1]);
+ return 1;
+ }
+ return usage(NULL);
+ }
+ return 0;
}
static void fini_openssl(void)
@@ -407,14 +501,11 @@ static void on_sigint(int s)
int main(int argc, char **argv)
{
- struct apk_applet *applet;
- char short_options[256], *sopt;
- struct option *opt, *all_options;
- int i, p, r, num_options, help_requested = 0;
void *ctx = NULL;
struct apk_db_options dbopts;
- const struct apk_option_group **optgroups = default_optgroups;
struct apk_string_array *args;
+ struct apk_applet *applet;
+ int r;
apk_string_array_init(&args);
#ifdef TEST_MODE
@@ -434,13 +525,6 @@ int main(int argc, char **argv)
setup_terminal();
applet = deduce_applet(argc, argv);
- if (applet && applet->optgroups[0]) optgroups = applet->optgroups;
-
- for (i = 0, num_options = 1; optgroups[i]; i++)
- num_options += optgroups[i]->num_options;
- all_options = alloca(sizeof(struct option) * num_options);
- for (i = r = 0; optgroups[i]; r += optgroups[i]->num_options, i++)
- merge_options(&all_options[r], optgroups[i]->options, optgroups[i]->num_options);
if (applet != NULL) {
if (applet->context_size != 0)
ctx = calloc(1, applet->context_size);
@@ -448,45 +532,13 @@ int main(int argc, char **argv)
apk_flags |= applet->forced_flags;
apk_force |= applet->forced_force;
}
- for (opt = all_options, sopt = short_options; opt->name != NULL; opt++) {
- if (opt->flag == NULL &&
- opt->val <= 0xff && isalnum(opt->val)) {
- *(sopt++) = opt->val;
- if (opt->has_arg != no_argument)
- *(sopt++) = ':';
- }
- }
- *(sopt++) = 0;
init_openssl();
setup_automatic_flags();
fetchConnectionCacheInit(32, 4);
- while ((p = getopt_long(argc, argv, short_options, all_options, NULL)) != -1) {
- for (i = 0; optgroups[i]; i++) {
- r = optgroups[i]->parse(ctx, &dbopts, p, optarg);
- if (r == 0) break;
- if (r == -EINVAL) {
- help_requested = 1;
- break;
- }
- if (r != -ENOTSUP) goto err;
- }
- }
-
- if (help_requested || r == -ENOTSUP) {
- r = usage(applet);
- goto err;
- }
-
- if (applet == NULL) {
- if (argc > 1) {
- r = 1;
- apk_error("'%s' is not an apk command. See 'apk --help'.", argv[1]);
- } else
- r = usage(NULL);
- goto err;
- }
+ r = parse_options(argc, argv, applet, ctx, &dbopts);
+ if (r != 0) goto err;
argc -= optind;
argv += optind;
@@ -519,7 +571,7 @@ int main(int argc, char **argv)
if (test_installed_db != NULL) {
apk_db_index_read(&db, apk_istream_from_file(AT_FDCWD, test_installed_db), -1);
}
- for (i = 0; i < test_repos->num; i++) {
+ for (int i = 0; i < test_repos->num; i++) {
apk_blob_t spec = APK_BLOB_STR(test_repos->item[i]), name, tag;
int repo_tag = 0, repo = APK_REPOSITORY_FIRST_CONFIGURED + i;
@@ -561,10 +613,8 @@ int main(int argc, char **argv)
#endif
err:
- if (r == -ESHUTDOWN)
- r = 0;
- if (ctx)
- free(ctx);
+ if (r == -ESHUTDOWN) r = 0;
+ if (ctx) free(ctx);
fetchConnectionCacheClose();
apk_string_array_free(&args);
diff --git a/src/apk_applet.h b/src/apk_applet.h
index 390ec59..f1bf9b2 100644
--- a/src/apk_applet.h
+++ b/src/apk_applet.h
@@ -17,19 +17,17 @@
#include "apk_defines.h"
#include "apk_database.h"
-struct apk_option {
- int val;
- const char *name;
- int has_arg;
-};
+#define APK_OPTAPPLET "\x00"
+#define APK_OPTGROUP(_name) _name "\x00"
+#define APK_OPT1n(_opt) "\xf0" _opt "\x00"
+#define APK_OPT1R(_opt) "\xaf" "\xf0" _opt "\x00"
+#define APK_OPT2n(_opt, _short) _short _opt "\x00"
+#define APK_OPT2R(_opt, _short) "\xaf" _short _opt "\x00"
struct apk_option_group {
- const char *name;
- int num_options;
- const struct apk_option *options;
-
+ const char *desc;
int (*parse)(void *ctx, struct apk_db_options *dbopts,
- int optch, const char *optarg);
+ int opt, const char *optarg);
};
struct apk_applet {
diff --git a/src/app_add.c b/src/app_add.c
index 1e1fe00..9331fb8 100644
--- a/src/app_add.c
+++ b/src/app_add.c
@@ -23,24 +23,40 @@ struct add_ctx {
unsigned short extract_flags;
};
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_ADD_initdb,
+ OPT_ADD_latest,
+ OPT_ADD_no_chown,
+ OPT_ADD_upgrade,
+ OPT_ADD_virtual,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT1n("initdb")
+ APK_OPT2n("latest", "l")
+ APK_OPT1n("no-chown")
+ APK_OPT2n("upgrade", "u")
+ APK_OPT2R("virtual", "t");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct add_ctx *actx = (struct add_ctx *) ctx;
- switch (optch) {
- case 0x10000:
+ switch (opt) {
+ case OPT_ADD_initdb:
dbopts->open_flags |= APK_OPENF_CREATE;
break;
- case 0x10001:
+ case OPT_ADD_latest:
+ actx->solver_flags |= APK_SOLVERF_LATEST;
+ break;
+ case OPT_ADD_no_chown:
actx->extract_flags |= APK_EXTRACTF_NO_CHOWN;
break;
- case 'u':
+ case OPT_ADD_upgrade:
actx->solver_flags |= APK_SOLVERF_UPGRADE;
break;
- case 'l':
- actx->solver_flags |= APK_SOLVERF_LATEST;
- break;
- case 't':
+ case OPT_ADD_virtual:
actx->virtpkg = optarg;
break;
default:
@@ -49,18 +65,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 0x10000, "initdb" },
- { 0x10001, "no-chown" },
- { 'u', "upgrade" },
- { 'l', "latest" },
- { 't', "virtual", required_argument },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Add",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_audit.c b/src/app_audit.c
index f2df583..4e59ddf 100644
--- a/src/app_audit.c
+++ b/src/app_audit.c
@@ -37,24 +37,40 @@ struct audit_ctx {
unsigned packages_only : 1;
};
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_AUDIT_backup,
+ OPT_AUDIT_check_permissions,
+ OPT_AUDIT_packages,
+ OPT_AUDIT_recursive,
+ OPT_AUDIT_system,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT1n("backup")
+ APK_OPT1n("check-permissions")
+ APK_OPT1n("packages")
+ APK_OPT2n("recursive", "r")
+ APK_OPT1n("system");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct audit_ctx *actx = (struct audit_ctx *) ctx;
- switch (optch) {
- case 0x10000:
+ switch (opt) {
+ case OPT_AUDIT_backup:
actx->mode = MODE_BACKUP;
break;
- case 0x10001:
+ case OPT_AUDIT_system:
actx->mode = MODE_SYSTEM;
break;
- case 0x10002:
+ case OPT_AUDIT_check_permissions:
actx->check_permissions = 1;
break;
- case 0x10003:
+ case OPT_AUDIT_packages:
actx->packages_only = 1;
break;
- case 'r':
+ case OPT_AUDIT_recursive:
actx->recursive = 1;
break;
default:
@@ -63,18 +79,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 0x10000, "backup" },
- { 0x10001, "system" },
- { 0x10002, "check-permissions" },
- { 'r', "recursive" },
- { 0x10003, "packages" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Audit",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_cache.c b/src/app_cache.c
index b499ad2..2d86c59 100644
--- a/src/app_cache.c
+++ b/src/app_cache.c
@@ -30,15 +30,25 @@ struct cache_ctx {
unsigned short solver_flags;
};
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_CACHE_latest,
+ OPT_CACHE_upgrade,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("latest", "l")
+ APK_OPT2n("upgrade", "u");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct cache_ctx *cctx = (struct cache_ctx *) ctx;
- switch (optch) {
- case 'u':
+ switch (opt) {
+ case OPT_CACHE_upgrade:
cctx->solver_flags |= APK_SOLVERF_UPGRADE;
break;
- case 'l':
+ case OPT_CACHE_latest:
cctx->solver_flags |= APK_SOLVERF_LATEST;
break;
default:
@@ -47,15 +57,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'u', "upgrade" },
- { 'l', "latest" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Cache",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_del.c b/src/app_del.c
index a978f10..989f0e9 100644
--- a/src/app_del.c
+++ b/src/app_del.c
@@ -21,12 +21,20 @@ struct del_ctx {
int errors;
};
-static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_DEL_redepends,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("rdepends", "r");
+
+static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct del_ctx *ctx = (struct del_ctx *) pctx;
- switch (optch) {
- case 'r':
+ switch (opt) {
+ case OPT_DEL_redepends:
ctx->recursive_delete = 1;
break;
default:
@@ -35,14 +43,8 @@ static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int op
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'r', "rdepends" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Delete",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_dot.c b/src/app_dot.c
index d567e5a..548e6e3 100644
--- a/src/app_dot.c
+++ b/src/app_dot.c
@@ -24,15 +24,25 @@ struct dot_ctx {
int installed_only : 1;
};
-static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_DOT_errors,
+ OPT_DOT_installed,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT1n("errors")
+ APK_OPT1n("installed");
+
+static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct dot_ctx *ctx = (struct dot_ctx *) pctx;
- switch (optch) {
- case 0x10000:
+ switch (opt) {
+ case OPT_DOT_errors:
ctx->errors_only = 1;
break;
- case 0x10001:
+ case OPT_DOT_installed:
ctx->installed_only = 1;
dbopts->open_flags &= ~APK_OPENF_NO_INSTALLED;
break;
@@ -42,15 +52,8 @@ static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int op
return 0;
}
-static const struct apk_option options_applet[] = {
- { 0x10000, "errors" },
- { 0x10001, "installed" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Dot",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_fetch.c b/src/app_fetch.c
index 224618b..a0bb40b 100644
--- a/src/app_fetch.c
+++ b/src/app_fetch.c
@@ -68,21 +68,40 @@ static int cup(void)
return write(STDOUT_FILENO, buf, len) != len;
}
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_FETCH_link,
+ OPT_FETCH_recursive,
+ OPT_FETCH_output,
+ OPT_FETCH_simulate,
+ OPT_FETCH_stdout,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("link", "l")
+ APK_OPT2n("recursive", "R")
+ APK_OPT2R("output", "o")
+ APK_OPT1n("simulate")
+ APK_OPT2n("stdout", "s");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct fetch_ctx *fctx = (struct fetch_ctx *) ctx;
- switch (optch) {
- case 'R':
+ switch (opt) {
+ case OPT_FETCH_simulate:
+ apk_flags |= APK_SIMULATE;
+ break;
+ case OPT_FETCH_recursive:
fctx->flags |= FETCH_RECURSIVE;
break;
- case 's':
+ case OPT_FETCH_stdout:
fctx->flags |= FETCH_STDOUT;
break;
- case 'L':
+ case OPT_FETCH_link:
fctx->flags |= FETCH_LINK;
break;
- case 'o':
+ case OPT_FETCH_output:
fctx->outdir_fd = openat(AT_FDCWD, optarg, O_RDONLY | O_CLOEXEC);
break;
default:
@@ -91,18 +110,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'L', "link" },
- { 'R', "recursive" },
- { 0x104, "simulate" },
- { 's', "stdout" },
- { 'o', "output", required_argument },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Fetch",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_fix.c b/src/app_fix.c
index 6f332af..d5f1cc7 100644
--- a/src/app_fix.c
+++ b/src/app_fix.c
@@ -24,24 +24,40 @@ struct fix_ctx {
int errors;
};
-static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_FIX_depends,
+ OPT_FIX_directory_permissions,
+ OPT_FIX_reinstall,
+ OPT_FIX_upgrade,
+ OPT_FIX_xattr,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("depends", "d")
+ APK_OPT1n("directory-permissions")
+ APK_OPT2n("reinstall", "r")
+ APK_OPT2n("upgrade", "u")
+ APK_OPT2n("xattr", "x");
+
+static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct fix_ctx *ctx = (struct fix_ctx *) pctx;
- switch (optch) {
- case 'd':
+ switch (opt) {
+ case OPT_FIX_depends:
ctx->fix_depends = 1;
break;
- case 'x':
- ctx->fix_xattrs = 1;
- break;
- case 'u':
- ctx->solver_flags |= APK_SOLVERF_UPGRADE;
+ case OPT_FIX_directory_permissions:
+ ctx->fix_directory_permissions = 1;
break;
- case 'r':
+ case OPT_FIX_reinstall:
ctx->solver_flags |= APK_SOLVERF_REINSTALL;
break;
- case 0x10000:
- ctx->fix_directory_permissions = 1;
+ case OPT_FIX_upgrade:
+ ctx->solver_flags |= APK_SOLVERF_UPGRADE;
+ break;
+ case OPT_FIX_xattr:
+ ctx->fix_xattrs = 1;
break;
default:
return -ENOTSUP;
@@ -49,18 +65,8 @@ static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int op
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'd', "depends" },
- { 'r', "reinstall" },
- { 'u', "upgrade" },
- { 'x', "xattr" },
- { 0x10000, "directory-permissions" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Fix",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_index.c b/src/app_index.c
index 094388b..8bd3a6a 100644
--- a/src/app_index.c
+++ b/src/app_index.c
@@ -32,21 +32,35 @@ struct index_ctx {
int method;
};
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_INDEX_description,
+ OPT_INDEX_index,
+ OPT_INDEX_output,
+ OPT_INDEX_rewrite_arch,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2R("description", "d")
+ APK_OPT2R("index", "x")
+ APK_OPT2R("output", "o")
+ APK_OPT1R("rewrite-arch");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct index_ctx *ictx = (struct index_ctx *) ctx;
- switch (optch) {
- case 'x':
+ switch (opt) {
+ case OPT_INDEX_description:
+ ictx->description = optarg;
+ break;
+ case OPT_INDEX_index:
ictx->index = optarg;
break;
- case 'o':
+ case OPT_INDEX_output:
ictx->output = optarg;
break;
- case 'd':
- ictx->description = optarg;
- break;
- case 0x10000:
+ case OPT_INDEX_rewrite_arch:
ictx->rewrite_arch = apk_blob_atomize(APK_BLOB_STR(optarg));
break;
default:
@@ -55,17 +69,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'o', "output", required_argument },
- { 'x', "index", required_argument },
- { 'd', "description", required_argument },
- { 0x10000, "rewrite-arch", required_argument },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Index",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_info.c b/src/app_info.c
index 9b2bcb1..553dd2e 100644
--- a/src/app_info.c
+++ b/src/app_info.c
@@ -366,57 +366,93 @@ static void print_name_info(struct apk_database *db, const char *match, struct a
info_subaction(ctx, p->pkg);
}
-static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_INFO_all,
+ OPT_INFO_contents,
+ OPT_INFO_depends,
+ OPT_INFO_description,
+ OPT_INFO_install_if,
+ OPT_INFO_installed,
+ OPT_INFO_license,
+ OPT_INFO_provides,
+ OPT_INFO_rdepends,
+ OPT_INFO_replaces,
+ OPT_INFO_rinstall_if,
+ OPT_INFO_size,
+ OPT_INFO_triggers,
+ OPT_INFO_webpage,
+ OPT_INFO_who_owns,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("all", "a")
+ APK_OPT2n("contents", "L")
+ APK_OPT2n("depends", "R")
+ APK_OPT2n("description", "d")
+ APK_OPT1n("install-if")
+ APK_OPT2n("installed", "e")
+ APK_OPT1n("license")
+ APK_OPT2n("provides", "P")
+ APK_OPT2n("rdepends", "r")
+ APK_OPT1n("replaces")
+ APK_OPT1n("rinstall-if")
+ APK_OPT2n("size", "s")
+ APK_OPT2n("triggers", "t")
+ APK_OPT2n("webpage", "w")
+ APK_OPT2n("who-owns", "W");
+
+static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct info_ctx *ctx = (struct info_ctx *) pctx;
ctx->action = NULL;
- switch (optch) {
- case 'e':
+ switch (opt) {
+ case OPT_INFO_installed:
ctx->action = info_exists;
dbopts->open_flags |= APK_OPENF_NO_REPOS;
break;
- case 'W':
+ case OPT_INFO_who_owns:
ctx->action = info_who_owns;
dbopts->open_flags |= APK_OPENF_NO_REPOS;
break;
- case 'w':
+ case OPT_INFO_webpage:
ctx->subaction_mask |= APK_INFO_URL;
break;
- case 'R':
+ case OPT_INFO_depends:
ctx->subaction_mask |= APK_INFO_DEPENDS;
break;
- case 'P':
+ case OPT_INFO_provides:
ctx->subaction_mask |= APK_INFO_PROVIDES;
break;
- case 'r':
+ case OPT_INFO_rdepends:
ctx->subaction_mask |= APK_INFO_RDEPENDS;
break;
- case 0x10002:
+ case OPT_INFO_install_if:
ctx->subaction_mask |= APK_INFO_INSTALL_IF;
break;
- case 0x10003:
+ case OPT_INFO_rinstall_if:
ctx->subaction_mask |= APK_INFO_RINSTALL_IF;
break;
- case 's':
+ case OPT_INFO_size:
ctx->subaction_mask |= APK_INFO_SIZE;
break;
- case 'd':
+ case OPT_INFO_description:
ctx->subaction_mask |= APK_INFO_DESC;
break;
- case 'L':
+ case OPT_INFO_contents:
ctx->subaction_mask |= APK_INFO_CONTENTS;
break;
- case 't':
+ case OPT_INFO_triggers:
ctx->subaction_mask |= APK_INFO_TRIGGERS;
break;
- case 0x10000:
+ case OPT_INFO_replaces:
ctx->subaction_mask |= APK_INFO_REPLACES;
break;
- case 0x10001:
+ case OPT_INFO_license:
ctx->subaction_mask |= APK_INFO_LICENSE;
break;
- case 'a':
+ case OPT_INFO_all:
ctx->subaction_mask = 0xffffffff;
break;
default:
@@ -449,28 +485,8 @@ static int info_main(void *ctx, struct apk_database *db, struct apk_string_array
return ictx->errors;
}
-static const struct apk_option options_applet[] = {
- { 'L', "contents" },
- { 'e', "installed" },
- { 'W', "who-owns" },
- { 'R', "depends" },
- { 'P', "provides" },
- { 'r', "rdepends" },
- { 0x10000, "replaces" },
- { 0x10002, "install-if" },
- { 0x10003, "rinstall-if" },
- { 'w', "webpage" },
- { 's', "size" },
- { 'd', "description" },
- { 0x10001, "license" },
- { 't', "triggers" },
- { 'a', "all" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Info",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_list.c b/src/app_list.c
index f46d30f..7f141f5 100644
--- a/src/app_list.c
+++ b/src/app_list.c
@@ -187,38 +187,57 @@ static void print_result(struct apk_database *db, const char *match, struct apk_
iterate_providers(name, ctx);
}
-static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_LIST_available,
+ OPT_LIST_installed,
+ OPT_LIST_depends,
+ OPT_LIST_origin,
+ OPT_LIST_orphaned,
+ OPT_LIST_providers,
+ OPT_LIST_upgradeable,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("available", "a")
+ APK_OPT2n("installed", "I")
+ APK_OPT2n("depends", "d")
+ APK_OPT2n("origin", "o")
+ APK_OPT2n("orphaned", "O")
+ APK_OPT2n("providers", "P")
+ APK_OPT2n("upgradeable", "u");
+
+static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct list_ctx *ctx = pctx;
- switch (optch)
- {
- case 'I':
+ switch (opt) {
+ case OPT_LIST_available:
+ ctx->available = 1;
+ ctx->orphaned = 0;
+ break;
+ case OPT_LIST_installed:
ctx->installed = 1;
break;
- case 'O':
+ case OPT_LIST_depends:
+ ctx->match_depends = 1;
+ break;
+ case OPT_LIST_origin:
+ ctx->match_origin = 1;
+ break;
+ case OPT_LIST_orphaned:
ctx->installed = 1;
ctx->orphaned = 1;
break;
- case 'u':
+ case OPT_LIST_providers:
+ ctx->match_providers = 1;
+ break;
+ case OPT_LIST_upgradeable:
ctx->available = 1;
ctx->orphaned = 0;
ctx->installed = 0;
ctx->upgradable = 1;
break;
- case 'a':
- ctx->available = 1;
- ctx->orphaned = 0;
- break;
- case 'o':
- ctx->match_origin = 1;
- break;
- case 'd':
- ctx->match_depends = 1;
- break;
- case 'P':
- ctx->match_providers = 1;
- break;
default:
return -ENOTSUP;
}
@@ -226,20 +245,8 @@ static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int op
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'I', "installed" },
- { 'O', "orphaned" },
- { 'a', "available" },
- { 'u', "upgradable" },
- { 'o', "origin" },
- { 'd', "depends" },
- { 'P', "providers" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "List",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_search.c b/src/app_search.c
index 5d70432..823bc67 100644
--- a/src/app_search.c
+++ b/src/app_search.c
@@ -74,30 +74,47 @@ static void print_rdepends(struct search_ctx *ctx, struct apk_package *pkg)
apk_pkg_foreach_reverse_dependency(pkg, ctx->matches, print_rdep_pkg, ctx);
}
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_SEARCH_all,
+ OPT_SEARCH_description,
+ OPT_SEARCH_exact,
+ OPT_SEARCH_has_origin,
+ OPT_SEARCH_origin,
+ OPT_SEARCH_rdepends,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("all", "a")
+ APK_OPT2n("description", "d")
+ APK_OPT2n("exact", "\xf2""ex")
+ APK_OPT1n("has-origin")
+ APK_OPT2n("origin", "o")
+ APK_OPT2n("rdepends", "r");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct search_ctx *ictx = (struct search_ctx *) ctx;
- switch (optch) {
- case 'a':
+ switch (opt) {
+ case OPT_SEARCH_all:
ictx->show_all = 1;
break;
- case 'd':
+ case OPT_SEARCH_description:
ictx->search_description = 1;
ictx->search_exact = 1;
ictx->show_all = 1;
break;
- case 'e':
- case 'x':
+ case OPT_SEARCH_exact:
ictx->search_exact = 1;
break;
- case 'o':
+ case OPT_SEARCH_origin:
ictx->print_package = print_origin_name;
break;
- case 'r':
+ case OPT_SEARCH_rdepends:
ictx->print_result = print_rdepends;
break;
- case 0x10000:
+ case OPT_SEARCH_has_origin:
ictx->search_origin = 1;
ictx->search_exact = 1;
ictx->show_all = 1;
@@ -108,20 +125,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'a', "all" },
- { 'd', "description" },
- { 'x', "exact" },
- { 'e', NULL },
- { 'o', "origin" },
- { 'r', "rdepends" },
- { 0x10000, "has-origin" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Search",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_upgrade.c b/src/app_upgrade.c
index 3f7f096..5eda0eb 100644
--- a/src/app_upgrade.c
+++ b/src/app_upgrade.c
@@ -25,24 +25,40 @@ struct upgrade_ctx {
int ignore : 1;
};
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_UPGRADE_available,
+ OPT_UPGRADE_ignore,
+ OPT_UPGRADE_latest,
+ OPT_UPGRADE_no_self_upgrade,
+ OPT_UPGRADE_self_upgrade_only,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("available", "a")
+ APK_OPT1n("ignore")
+ APK_OPT2n("latest", "l")
+ APK_OPT1n("no-self-upgrade")
+ APK_OPT1n("self-upgrade-only");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct upgrade_ctx *uctx = (struct upgrade_ctx *) ctx;
- switch (optch) {
- case 0x10000:
+ switch (opt) {
+ case OPT_UPGRADE_no_self_upgrade:
uctx->no_self_upgrade = 1;
break;
- case 0x10001:
+ case OPT_UPGRADE_self_upgrade_only:
uctx->self_upgrade_only = 1;
break;
- case 0x10002:
+ case OPT_UPGRADE_ignore:
uctx->ignore = 1;
break;
- case 'a':
+ case OPT_UPGRADE_available:
uctx->solver_flags |= APK_SOLVERF_AVAILABLE;
break;
- case 'l':
+ case OPT_UPGRADE_latest:
uctx->solver_flags |= APK_SOLVERF_LATEST;
break;
default:
@@ -51,18 +67,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'a', "available" },
- { 'l', "latest" },
- { 0x10000, "no-self-upgrade" },
- { 0x10001, "self-upgrade-only" },
- { 0x10002, "ignore" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Upgrade",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/app_version.c b/src/app_version.c
index 33d787e..eb6922d 100644
--- a/src/app_version.c
+++ b/src/app_version.c
@@ -68,26 +68,42 @@ static int ver_validate(struct apk_database *db, struct apk_string_array *args)
return errors;
}
-static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_VERSION_all,
+ OPT_VERSION_check,
+ OPT_VERSION_indexes,
+ OPT_VERSION_limit,
+ OPT_VERSION_test,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("all", "a")
+ APK_OPT2n("check", "c")
+ APK_OPT2n("indexes", "I")
+ APK_OPT2R("limit", "l")
+ APK_OPT2n("test", "t");
+
+static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct ver_ctx *ictx = (struct ver_ctx *) ctx;
- switch (optch) {
- case 'I':
- ictx->action = ver_indexes;
- break;
- case 't':
- ictx->action = ver_test;
- dbopts->open_flags |= APK_OPENF_NO_STATE | APK_OPENF_NO_REPOS;
+ switch (opt) {
+ case OPT_VERSION_all:
+ ictx->all_tags = 1;
break;
- case 'c':
+ case OPT_VERSION_check:
ictx->action = ver_validate;
dbopts->open_flags |= APK_OPENF_NO_STATE | APK_OPENF_NO_REPOS;
break;
- case 'l':
+ case OPT_VERSION_indexes:
+ ictx->action = ver_indexes;
+ break;
+ case OPT_VERSION_limit:
ictx->limchars = optarg;
break;
- case 'a':
- ictx->all_tags = 1;
+ case OPT_VERSION_test:
+ ictx->action = ver_test;
+ dbopts->open_flags |= APK_OPENF_NO_STATE | APK_OPENF_NO_REPOS;
break;
default:
return -ENOTSUP;
@@ -95,18 +111,8 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
return 0;
}
-static const struct apk_option options_applet[] = {
- { 'I', "indexes" },
- { 't', "test" },
- { 'c', "check" },
- { 'a', "all" },
- { 'l', "limit", required_argument },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Version",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};
diff --git a/src/help.c b/src/help.c
index a27992a..ece6845 100644
--- a/src/help.c
+++ b/src/help.c
@@ -17,7 +17,7 @@ static int is_group(struct apk_applet *applet, const char *topic)
if (!applet) return strcasecmp(topic, "apk") == 0;
if (strcasecmp(topic, applet->name) == 0) return 1;
for (int i = 0; applet->optgroups[i] && i < ARRAY_SIZE(applet->optgroups); i++)
- if (strcasecmp(applet->optgroups[i]->name, topic) == 0) return 1;
+ if (strcasecmp(applet->optgroups[i]->desc, topic) == 0) return 1;
return 0;
}