Add --add option to git-repo-config

For multivars, the "git-repo-config name value ^$" is useful but
nonintuitive and troublesome to do repeatedly (since the value is not
at the end of the command line).  This commit simply adds an --add
option that adds a new value to a multivar.  Particularly useful for
tracking a new branch on a remote:

git-repo-config --add remote.origin.fetch +next:origin/next

Includes documentation and test.

Signed-off-by: Brian Gernhardt <benji@silverinsanity.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Brian Gernhardt 2006-12-15 07:39:04 -05:00 committed by Junio C Hamano
parent 9013192449
commit 89c4afe0d0
3 changed files with 27 additions and 3 deletions

View file

@ -10,6 +10,7 @@ SYNOPSIS
-------- --------
[verse] [verse]
'git-repo-config' [--global] [type] name [value [value_regex]] 'git-repo-config' [--global] [type] name [value [value_regex]]
'git-repo-config' [--global] [type] --add name value
'git-repo-config' [--global] [type] --replace-all name [value [value_regex]] 'git-repo-config' [--global] [type] --replace-all name [value [value_regex]]
'git-repo-config' [--global] [type] --get name [value_regex] 'git-repo-config' [--global] [type] --get name [value_regex]
'git-repo-config' [--global] [type] --get-all name [value_regex] 'git-repo-config' [--global] [type] --get-all name [value_regex]
@ -23,7 +24,8 @@ You can query/set/replace/unset options with this command. The name is
actually the section and the key separated by a dot, and the value will be actually the section and the key separated by a dot, and the value will be
escaped. escaped.
If you want to set/unset an option which can occur on multiple Multiple lines can be added to an option by using the '--add' option.
If you want to update or unset an option which can occur on multiple
lines, a POSIX regexp `value_regex` needs to be given. Only the lines, a POSIX regexp `value_regex` needs to be given. Only the
existing values that match the regexp are updated or unset. If existing values that match the regexp are updated or unset. If
you want to handle the lines that do *not* match the regex, just you want to handle the lines that do *not* match the regex, just
@ -53,6 +55,10 @@ OPTIONS
Default behavior is to replace at most one line. This replaces Default behavior is to replace at most one line. This replaces
all lines matching the key (and optionally the value_regex). all lines matching the key (and optionally the value_regex).
--add::
Adds a new line to the option without altering any existing
values. This is the same as providing '^$' as the value_regex.
--get:: --get::
Get the value for a given key (optionally filtered by a regex Get the value for a given key (optionally filtered by a regex
matching the value). Returns error code 1 if the key was not matching the value). Returns error code 1 if the key was not
@ -194,6 +200,12 @@ To actually match only values with an exclamation mark, you have to
% git repo-config section.key value '[!]' % git repo-config section.key value '[!]'
------------ ------------
To add a new proxy, without altering any of the existing ones, use
------------
% git repo-config core.gitproxy '"proxy" for example.com'
------------
include::config.txt[] include::config.txt[]

View file

@ -3,7 +3,7 @@
#include <regex.h> #include <regex.h>
static const char git_config_set_usage[] = static const char git_config_set_usage[] =
"git-repo-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list"; "git-repo-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --list";
static char *key; static char *key;
static regex_t *key_regexp; static regex_t *key_regexp;
@ -190,7 +190,9 @@ int cmd_repo_config(int argc, const char **argv, const char *prefix)
use_key_regexp = 1; use_key_regexp = 1;
do_all = 1; do_all = 1;
return get_value(argv[2], argv[3]); return get_value(argv[2], argv[3]);
} else if (!strcmp(argv[1], "--replace-all")) } else if (!strcmp(argv[1], "--add"))
return git_config_set_multivar(argv[2], argv[3], "^$", 0);
else if (!strcmp(argv[1], "--replace-all"))
return git_config_set_multivar(argv[2], argv[3], NULL, 1); return git_config_set_multivar(argv[2], argv[3], NULL, 1);
else else

View file

@ -265,6 +265,16 @@ EOF
test_expect_success '--get-regexp' \ test_expect_success '--get-regexp' \
'git-repo-config --get-regexp in > output && cmp output expect' 'git-repo-config --get-regexp in > output && cmp output expect'
git-repo-config --add nextsection.nonewline "wow4 for you"
cat > expect << EOF
wow2 for me
wow4 for you
EOF
test_expect_success '--add' \
'git-repo-config --get-all nextsection.nonewline > output && cmp output expect'
cat > .git/config << EOF cat > .git/config << EOF
[novalue] [novalue]
variable variable