Merge branch 'fl/config'

* fl/config:
  config: add support for --bool and --int while setting values
maint
Junio C Hamano 2007-06-30 23:49:01 -07:00
commit cd5ada993d
4 changed files with 95 additions and 21 deletions

View File

@ -9,9 +9,9 @@ git-config - Get and set repository or global options
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git-config' [--system | --global] [-z|--null] name [value [value_regex]] 'git-config' [--system | --global] [type] [-z|--null] name [value [value_regex]]
'git-config' [--system | --global] --add name value 'git-config' [--system | --global] [type] --add name value
'git-config' [--system | --global] --replace-all name [value [value_regex]] '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 name [value_regex]
'git-config' [--system | --global] [type] [-z|--null] --get-all 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] 'git-config' [--system | --global] [type] [-z|--null] --get-regexp name_regex [value_regex]
@ -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 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 '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, convert the value to the canonical form (simple decimal number for int,
a "true" or "false" string for bool). Type specifiers currently only a "true" or "false" string for bool). If no type specifier is passed,
take effect for reading operations. If no type specifier is passed,
no checks or transformations are performed on the value. no checks or transformations are performed on the value.


This command will fail if: This command will fail if:

View File

@ -138,9 +138,33 @@ free_strings:
return ret; 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 cmd_config(int argc, const char **argv, const char *prefix)
{ {
int nongit = 0; int nongit = 0;
char* value;
setup_git_directory_gently(&nongit); setup_git_directory_gently(&nongit);


while (1 < argc) { while (1 < argc) {
@ -217,9 +241,10 @@ int cmd_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], NULL); return get_value(argv[2], NULL);
} else } else {

value = normalize_value(argv[1], argv[2]);
return git_config_set(argv[1], argv[2]); return git_config_set(argv[1], value);
}
case 4: case 4:
if (!strcmp(argv[1], "--unset")) if (!strcmp(argv[1], "--unset"))
return git_config_set_multivar(argv[2], NULL, argv[3], 0); return git_config_set_multivar(argv[2], NULL, argv[3], 0);
@ -235,17 +260,21 @@ int cmd_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], "--add")) } else if (!strcmp(argv[1], "--add")) {
return git_config_set_multivar(argv[2], argv[3], "^$", 0); value = normalize_value(argv[2], argv[3]);
else if (!strcmp(argv[1], "--replace-all")) return git_config_set_multivar(argv[2], value, "^$", 0);

} else if (!strcmp(argv[1], "--replace-all")) {
return git_config_set_multivar(argv[2], argv[3], NULL, 1); value = normalize_value(argv[2], argv[3]);
else return git_config_set_multivar(argv[2], value, NULL, 1);

} else {
return git_config_set_multivar(argv[1], argv[2], argv[3], 0); value = normalize_value(argv[1], argv[2]);
return git_config_set_multivar(argv[1], value, argv[3], 0);
}
case 5: case 5:
if (!strcmp(argv[1], "--replace-all")) if (!strcmp(argv[1], "--replace-all")) {
return git_config_set_multivar(argv[2], argv[3], argv[4], 1); value = normalize_value(argv[2], argv[3]);
return git_config_set_multivar(argv[2], value, argv[4], 1);
}
case 1: case 1:
default: default:
usage(git_config_set_usage); usage(git_config_set_usage);

View File

@ -471,11 +471,57 @@ test_expect_success bool '
done && done &&
cmp expect result' cmp expect result'


test_expect_failure 'invalid bool' ' test_expect_failure 'invalid bool (--get)' '


git-config bool.nobool foobar && git-config bool.nobool foobar &&
git-config --bool --get bool.nobool' 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 rm .git/config


git-config quote.leading " test" git-config quote.leading " test"

View File

@ -38,7 +38,7 @@ echo >empty &&
git commit -q -m "First Commit" && git commit -q -m "First Commit" &&
git clone -q --local --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 && 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.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 exit 1


# note that cvs doesn't accept absolute pathnames # note that cvs doesn't accept absolute pathnames
@ -255,7 +255,7 @@ rm -fr "$SERVERDIR"
cd "$WORKDIR" && cd "$WORKDIR" &&
git clone -q --local --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 && 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.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 exit 1


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