builtin/config: introduce "remove-section" subcommand

Introduce a new "remove-section" subcommand to git-config(1). Please
refer to preceding commits regarding the motivation behind this change.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 2024-05-06 10:56:47 +02:00 committed by Junio C Hamano
parent 3418e96f37
commit 15dad20c3f
3 changed files with 41 additions and 6 deletions

View File

@ -14,7 +14,7 @@ SYNOPSIS
'git config set' [<file-option>] [--type=<type>] [--all] [--value=<value>] [--fixed-value] <name> <value>
'git config unset' [<file-option>] [--all] [--value=<value>] [--fixed-value] <name> <value>
'git config rename-section' [<file-option>] <old-name> <new-name>
'git config' [<file-option>] --remove-section <name>
'git config remove-section' [<file-option>] <name>
'git config' [<file-option>] --get-colorbool <name> [<stdout-is-tty>]
'git config' [<file-option>] -e | --edit

@ -95,6 +95,9 @@ unset::
rename-section::
Rename the given section to a new name.

remove-section::
Remove the given section from the configuration file.

[[OPTIONS]]
OPTIONS
-------
@ -192,9 +195,6 @@ See also <<FILES>>.
section in linkgit:gitrevisions[7] for a more complete list of
ways to spell blob names.

--remove-section::
Remove the given section from the configuration file.

--fixed-value::
When used with the `value-pattern` argument, treat `value-pattern` as
an exact string instead of a regular expression. This will restrict
@ -333,6 +333,9 @@ recommended to migrate to the new syntax.
--rename-section <old-name> <new-name>::
Replaced by `git config rename-section <old-name> <new-name>`.

--remove-section <name>::
Replaced by `git config remove-section <name>`.

CONFIGURATION
-------------
`pager.config` is only respected when listing configuration, i.e., when

View File

@ -21,6 +21,7 @@ static const char *const builtin_config_usage[] = {
N_("git config set [<file-option>] [--type=<type>] [--all] [--value=<value>] [--fixed-value] <name> <value>"),
N_("git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] <name> <value>"),
N_("git config rename-section [<file-option>] <old-name> <new-name>"),
N_("git config remove-section [<file-option>] <name>"),
NULL
};

@ -49,6 +50,11 @@ static const char *const builtin_config_rename_section_usage[] = {
NULL
};

static const char *const builtin_config_remove_section_usage[] = {
N_("git config remove-section [<file-option>] <name>"),
NULL
};

static char *key;
static regex_t *key_regexp;
static const char *value_pattern;
@ -980,12 +986,38 @@ static int cmd_config_rename_section(int argc, const char **argv, const char *pr
return 0;
}

static int cmd_config_remove_section(int argc, const char **argv, const char *prefix)
{
struct option opts[] = {
CONFIG_LOCATION_OPTIONS,
OPT_END(),
};
int ret;

argc = parse_options(argc, argv, prefix, opts, builtin_config_remove_section_usage,
PARSE_OPT_STOP_AT_NON_OPTION);
check_write();
check_argc(argc, 1, 1);

handle_config_location(prefix);

ret = git_config_rename_section_in_file(given_config_source.file,
argv[0], NULL);
if (ret < 0)
return ret;
else if (!ret)
die(_("no such section: %s"), argv[0]);

return 0;
}

static struct option builtin_subcommand_options[] = {
OPT_SUBCOMMAND("list", &subcommand, cmd_config_list),
OPT_SUBCOMMAND("get", &subcommand, cmd_config_get),
OPT_SUBCOMMAND("set", &subcommand, cmd_config_set),
OPT_SUBCOMMAND("unset", &subcommand, cmd_config_unset),
OPT_SUBCOMMAND("rename-section", &subcommand, cmd_config_rename_section),
OPT_SUBCOMMAND("remove-section", &subcommand, cmd_config_remove_section),
OPT_END(),
};


View File

@ -813,7 +813,7 @@ cat >> .git/config << EOF
EOF

test_expect_success 'remove section' '
git config --remove-section branch.zwei
git config ${mode_prefix}remove-section branch.zwei
'

cat > expect << EOF
@ -2602,7 +2602,7 @@ test_expect_success 'refuse --fixed-value for incompatible actions' '
test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null bogus &&
test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null bogus &&
test_must_fail git config ${mode_prefix}rename-section --file=config --fixed-value dev null &&
test_must_fail git config --file=config --fixed-value --remove-section dev &&
test_must_fail git config ${mode_prefix}remove-section --file=config --fixed-value dev &&
test_must_fail git config ${mode_prefix}list --file=config --fixed-value &&
test_must_fail git config --file=config --fixed-value --get-color dev.null &&
test_must_fail git config --file=config --fixed-value --get-colorbool dev.null &&