Skip to content

Commit

Permalink
config: add support for --bool and --int while setting values
Browse files Browse the repository at this point in the history
Signed-off-by: Frank Lichtenheld <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
flichtenheld authored and gitster committed Jun 27, 2007
1 parent 9cc0589 commit db1696b
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 21 deletions.
9 changes: 4 additions & 5 deletions Documentation/git-config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ git-config - Get and set repository or global options
SYNOPSIS
--------
[verse]
'git-config' [--system | --global] [-z|--null] name [value [value_regex]]
'git-config' [--system | --global] --add name value
'git-config' [--system | --global] --replace-all name [value [value_regex]]
'git-config' [--system | --global] [type] [-z|--null] name [value [value_regex]]
'git-config' [--system | --global] [type] --add name value
'git-config' [--system | --global] [type] --replace-all name [value [value_regex]]
'git-config' [--system | --global] [type] [-z|--null] --get name [value_regex]
'git-config' [--system | --global] [type] [-z|--null] --get-all name [value_regex]
'git-config' [--system | --global] [type] [-z|--null] --get-regexp name_regex [value_regex]
Expand All @@ -37,8 +37,7 @@ prepend a single exclamation mark in front (see also <<EXAMPLES>>).
The type specifier can be either '--int' or '--bool', which will make
'git-config' ensure that the variable(s) are of the given type and
convert the value to the canonical form (simple decimal number for int,
a "true" or "false" string for bool). Type specifiers currently only
take effect for reading operations. If no type specifier is passed,
a "true" or "false" string for bool). If no type specifier is passed,
no checks or transformations are performed on the value.

This command will fail if:
Expand Down
55 changes: 42 additions & 13 deletions builtin-config.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,33 @@ static int get_value(const char* key_, const char* regex_)
return ret;
}

char *normalize_value(const char *key, const char *value)
{
char *normalized;

if (!value)
return NULL;

if (type == T_RAW)
normalized = xstrdup(value);
else {
normalized = xmalloc(64);
if (type == T_INT) {
int v = git_config_int(key, value);
sprintf(normalized, "%d", v);
}
else if (type == T_BOOL)
sprintf(normalized, "%s",
git_config_bool(key, value) ? "true" : "false");
}

return normalized;
}

int cmd_config(int argc, const char **argv, const char *prefix)
{
int nongit = 0;
char* value;
setup_git_directory_gently(&nongit);

while (1 < argc) {
Expand Down Expand Up @@ -217,9 +241,10 @@ int cmd_config(int argc, const char **argv, const char *prefix)
use_key_regexp = 1;
do_all = 1;
return get_value(argv[2], NULL);
} else

return git_config_set(argv[1], argv[2]);
} else {
value = normalize_value(argv[1], argv[2]);
return git_config_set(argv[1], value);
}
case 4:
if (!strcmp(argv[1], "--unset"))
return git_config_set_multivar(argv[2], NULL, argv[3], 0);
Expand All @@ -235,17 +260,21 @@ int cmd_config(int argc, const char **argv, const char *prefix)
use_key_regexp = 1;
do_all = 1;
return get_value(argv[2], argv[3]);
} 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);
else

return git_config_set_multivar(argv[1], argv[2], argv[3], 0);
} else if (!strcmp(argv[1], "--add")) {
value = normalize_value(argv[2], argv[3]);
return git_config_set_multivar(argv[2], value, "^$", 0);
} else if (!strcmp(argv[1], "--replace-all")) {
value = normalize_value(argv[2], argv[3]);
return git_config_set_multivar(argv[2], value, NULL, 1);
} else {
value = normalize_value(argv[1], argv[2]);
return git_config_set_multivar(argv[1], value, argv[3], 0);
}
case 5:
if (!strcmp(argv[1], "--replace-all"))
return git_config_set_multivar(argv[2], argv[3], argv[4], 1);
if (!strcmp(argv[1], "--replace-all")) {
value = normalize_value(argv[2], argv[3]);
return git_config_set_multivar(argv[2], value, argv[4], 1);
}
case 1:
default:
usage(git_config_set_usage);
Expand Down
48 changes: 47 additions & 1 deletion t/t1300-repo-config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -471,11 +471,57 @@ test_expect_success bool '
done &&
cmp expect result'

test_expect_failure 'invalid bool' '
test_expect_failure 'invalid bool (--get)' '
git-config bool.nobool foobar &&
git-config --bool --get bool.nobool'

test_expect_failure 'invalid bool (set)' '
git-config --bool bool.nobool foobar'

rm .git/config

cat > expect <<\EOF
[bool]
true1 = true
true2 = true
true3 = true
true4 = true
false1 = false
false2 = false
false3 = false
false4 = false
EOF

test_expect_success 'set --bool' '
git-config --bool bool.true1 01 &&
git-config --bool bool.true2 -1 &&
git-config --bool bool.true3 YeS &&
git-config --bool bool.true4 true &&
git-config --bool bool.false1 000 &&
git-config --bool bool.false2 "" &&
git-config --bool bool.false3 nO &&
git-config --bool bool.false4 FALSE &&
cmp expect .git/config'

rm .git/config

cat > expect <<\EOF
[int]
val1 = 1
val2 = -1
val3 = 5242880
EOF

test_expect_success 'set --int' '
git-config --int int.val1 01 &&
git-config --int int.val2 -1 &&
git-config --int int.val3 5m &&
cmp expect .git/config'

rm .git/config

git-config quote.leading " test"
Expand Down
4 changes: 2 additions & 2 deletions t/t9400-git-cvsserver-server.sh
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ echo >empty &&
git commit -q -m "First Commit" &&
git clone -q --local --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&
GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&
GIT_DIR="$SERVERDIR" git config --bool gitcvs.logfile "$SERVERDIR/gitcvs.log" ||
GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log" ||
exit 1

# note that cvs doesn't accept absolute pathnames
Expand Down Expand Up @@ -255,7 +255,7 @@ rm -fr "$SERVERDIR"
cd "$WORKDIR" &&
git clone -q --local --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&
GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&
GIT_DIR="$SERVERDIR" git config --bool gitcvs.logfile "$SERVERDIR/gitcvs.log" ||
GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log" ||
exit 1

test_expect_success 'cvs update (create new file)' \
Expand Down

0 comments on commit db1696b

Please sign in to comment.