git/t/helper/test-env-helper.c
Calvin Wan b1bda75173 parse: separate out parsing functions from config.h
The files config.{h,c} contain functions that have to do with parsing,
but not config.

In order to further reduce all-in-one headers, separate out functions in
config.c that do not operate on config into its own file, parse.h,
and update the include directives in the .c files that need only such
functions accordingly.

Signed-off-by: Calvin Wan <calvinwan@google.com>
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-09-29 15:14:57 -07:00

101 lines
2.5 KiB
C

#include "test-tool.h"
#include "parse.h"
#include "parse-options.h"
static char const * const env__helper_usage[] = {
"test-tool env-helper --type=[bool|ulong] <options> <env-var>",
NULL
};
enum cmdmode {
ENV_HELPER_TYPE_BOOL = 1,
ENV_HELPER_TYPE_ULONG
};
static int option_parse_type(const struct option *opt, const char *arg,
int unset)
{
enum cmdmode *cmdmode = opt->value;
BUG_ON_OPT_NEG(unset);
if (!strcmp(arg, "bool"))
*cmdmode = ENV_HELPER_TYPE_BOOL;
else if (!strcmp(arg, "ulong"))
*cmdmode = ENV_HELPER_TYPE_ULONG;
else
die("unrecognized --type argument, %s", arg);
return 0;
}
int cmd__env_helper(int argc, const char **argv)
{
int exit_code = 0;
const char *env_variable = NULL;
const char *env_default = NULL;
int ret;
int ret_int, default_int;
unsigned long ret_ulong, default_ulong;
enum cmdmode cmdmode = 0;
struct option opts[] = {
OPT_CALLBACK_F(0, "type", &cmdmode, "type",
"value is given this type", PARSE_OPT_NONEG,
option_parse_type),
OPT_STRING(0, "default", &env_default, "value",
"default for git_env_*(...) to fall back on"),
OPT_BOOL(0, "exit-code", &exit_code,
"be quiet only use git_env_*() value as exit code"),
OPT_END(),
};
argc = parse_options(argc, argv, NULL, opts, env__helper_usage,
PARSE_OPT_KEEP_UNKNOWN_OPT);
if (env_default && !*env_default)
usage_with_options(env__helper_usage, opts);
if (!cmdmode)
usage_with_options(env__helper_usage, opts);
if (argc != 1)
usage_with_options(env__helper_usage, opts);
env_variable = argv[0];
switch (cmdmode) {
case ENV_HELPER_TYPE_BOOL:
if (env_default) {
default_int = git_parse_maybe_bool(env_default);
if (default_int == -1) {
error("option `--default' expects a boolean value with `--type=bool`, not `%s`",
env_default);
usage_with_options(env__helper_usage, opts);
}
} else {
default_int = 0;
}
ret_int = git_env_bool(env_variable, default_int);
if (!exit_code)
puts(ret_int ? "true" : "false");
ret = ret_int;
break;
case ENV_HELPER_TYPE_ULONG:
if (env_default) {
if (!git_parse_ulong(env_default, &default_ulong)) {
error("option `--default' expects an unsigned long value with `--type=ulong`, not `%s`",
env_default);
usage_with_options(env__helper_usage, opts);
}
} else {
default_ulong = 0;
}
ret_ulong = git_env_ulong(env_variable, default_ulong);
if (!exit_code)
printf("%lu\n", ret_ulong);
ret = ret_ulong;
break;
default:
BUG("unknown <type> value");
break;
}
return !ret;
}