Browse Source

Merge branch 'fl/config'

* fl/config:
  config: add support for --bool and --int while setting values
maint
Junio C Hamano 18 years ago
parent
commit
cd5ada993d
  1. 9
      Documentation/git-config.txt
  2. 55
      builtin-config.c
  3. 48
      t/t1300-repo-config.sh
  4. 4
      t/t9400-git-cvsserver-server.sh

9
Documentation/git-config.txt

@ -9,9 +9,9 @@ git-config - Get and set repository or global options @@ -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]
@ -37,8 +37,7 @@ prepend a single exclamation mark in front (see also <<EXAMPLES>>). @@ -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:

55
builtin-config.c

@ -138,9 +138,33 @@ free_strings: @@ -138,9 +138,33 @@ free_strings:
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) {
@ -217,9 +241,10 @@ int cmd_config(int argc, const char **argv, const char *prefix) @@ -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);
@ -235,17 +260,21 @@ int cmd_config(int argc, const char **argv, const char *prefix) @@ -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);

48
t/t1300-repo-config.sh

@ -471,11 +471,57 @@ test_expect_success bool ' @@ -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"

4
t/t9400-git-cvsserver-server.sh

@ -38,7 +38,7 @@ echo >empty && @@ -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
@ -255,7 +255,7 @@ rm -fr "$SERVERDIR" @@ -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)' \

Loading…
Cancel
Save