2005-11-17 22:50:08 +01:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Johannes Schindelin
|
|
|
|
#
|
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
test_description='Test git config in different settings'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'clear default config' '
|
|
|
|
rm -f .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[core]
|
|
|
|
penguin = little blue
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'initial' '
|
|
|
|
git config core.penguin "little blue" &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[core]
|
|
|
|
penguin = little blue
|
|
|
|
Movie = BadPhysics
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'mixed case' '
|
|
|
|
git config Core.Movie BadPhysics &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[core]
|
|
|
|
penguin = little blue
|
|
|
|
Movie = BadPhysics
|
|
|
|
[Cores]
|
|
|
|
WhatEver = Second
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'similar section' '
|
2011-12-08 14:10:17 +01:00
|
|
|
git config Cores.WhatEver Second &&
|
2011-10-12 20:29:20 +02:00
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[core]
|
|
|
|
penguin = little blue
|
|
|
|
Movie = BadPhysics
|
|
|
|
UPPERCASE = true
|
|
|
|
[Cores]
|
|
|
|
WhatEver = Second
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'uppercase section' '
|
|
|
|
git config CORE.UPPERCASE true &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'replace with non-match' '
|
|
|
|
git config core.penguin kingpin !blue
|
|
|
|
'
|
2005-11-20 13:24:18 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'replace with non-match (actually matching)' '
|
|
|
|
git config core.penguin "very blue" !kingpin
|
|
|
|
'
|
2005-11-20 13:24:18 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[core]
|
|
|
|
penguin = very blue
|
|
|
|
Movie = BadPhysics
|
|
|
|
UPPERCASE = true
|
|
|
|
penguin = kingpin
|
|
|
|
[Cores]
|
|
|
|
WhatEver = Second
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'non-match result' 'test_cmp expect .git/config'
|
2005-11-20 13:24:18 +01:00
|
|
|
|
2011-10-12 20:30:02 +02:00
|
|
|
test_expect_success 'find mixed-case key by canonical name' '
|
|
|
|
echo Second >expect &&
|
|
|
|
git config cores.whatever >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'find mixed-case key by non-canonical name' '
|
|
|
|
echo Second >expect &&
|
|
|
|
git config CoReS.WhAtEvEr >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'subsections are not canonicalized by git-config' '
|
|
|
|
cat >>.git/config <<-\EOF &&
|
|
|
|
[section.SubSection]
|
|
|
|
key = one
|
|
|
|
[section "SubSection"]
|
|
|
|
key = two
|
|
|
|
EOF
|
|
|
|
echo one >expect &&
|
|
|
|
git config section.subsection.key >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
echo two >expect &&
|
|
|
|
git config section.SubSection.key >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2005-11-20 13:24:18 +01:00
|
|
|
|
2008-02-11 01:23:03 +01:00
|
|
|
cat > .git/config <<\EOF
|
|
|
|
[alpha]
|
|
|
|
bar = foo
|
|
|
|
[beta]
|
|
|
|
baz = multiple \
|
|
|
|
lines
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'unset with cont. lines' '
|
|
|
|
git config --unset beta.baz
|
|
|
|
'
|
2008-02-11 01:23:03 +01:00
|
|
|
|
|
|
|
cat > expect <<\EOF
|
|
|
|
[alpha]
|
|
|
|
bar = foo
|
|
|
|
[beta]
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'unset with cont. lines is correct' 'test_cmp expect .git/config'
|
2008-02-11 01:23:03 +01:00
|
|
|
|
2005-11-17 22:50:08 +01:00
|
|
|
cat > .git/config << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
haha ="beta" # last silly comment
|
2005-11-20 06:52:22 +01:00
|
|
|
haha = hello
|
|
|
|
haha = bello
|
2005-11-17 22:50:08 +01:00
|
|
|
[nextSection] noNewline = ouch
|
|
|
|
EOF
|
|
|
|
|
2005-11-20 06:52:22 +01:00
|
|
|
cp .git/config .git/config2
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'multiple unset' '
|
|
|
|
git config --unset-all beta.haha
|
|
|
|
'
|
2005-11-20 06:52:22 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
[nextSection] noNewline = ouch
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'multiple unset is correct' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-20 06:52:22 +01:00
|
|
|
|
2009-03-17 10:46:37 +01:00
|
|
|
cp .git/config2 .git/config
|
|
|
|
|
|
|
|
test_expect_success '--replace-all missing value' '
|
|
|
|
test_must_fail git config --replace-all beta.haha &&
|
|
|
|
test_cmp .git/config2 .git/config
|
|
|
|
'
|
|
|
|
|
|
|
|
rm .git/config2
|
2005-11-20 06:52:22 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success '--replace-all' '
|
|
|
|
git config --replace-all beta.haha gamma
|
|
|
|
'
|
2005-11-20 06:52:22 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
haha = gamma
|
|
|
|
[nextSection] noNewline = ouch
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'all replaced' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
haha = alpha
|
|
|
|
[nextSection] noNewline = ouch
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'really mean test' '
|
|
|
|
git config beta.haha alpha &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
haha = alpha
|
|
|
|
[nextSection]
|
|
|
|
nonewline = wow
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'really really mean test' '
|
|
|
|
git config nextsection.nonewline wow &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get value' '
|
|
|
|
echo alpha >expect &&
|
|
|
|
git config beta.haha >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
[nextSection]
|
|
|
|
nonewline = wow
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'unset' '
|
|
|
|
git config --unset beta.haha &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
[nextSection]
|
|
|
|
nonewline = wow
|
|
|
|
NoNewLine = wow2 for me
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'multivar' '
|
|
|
|
git config nextsection.NoNewLine "wow2 for me" "for me$" &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'non-match' '
|
|
|
|
git config --get nextsection.nonewline !for
|
|
|
|
'
|
2005-11-20 13:24:18 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'non-match value' '
|
|
|
|
echo wow >expect &&
|
|
|
|
git config --get nextsection.nonewline !for >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2005-11-20 13:24:18 +01:00
|
|
|
|
git-config: do not complain about duplicate entries
If git-config is asked for a single value, it will complain
and exit with an error if it finds multiple instances of
that value. This is unlike the usual internal config
parsing, however, which will generally overwrite previous
values, leaving only the final one. For example:
[set a multivar]
$ git config user.email one@example.com
$ git config --add user.email two@example.com
[use the internal parser to fetch it]
$ git var GIT_AUTHOR_IDENT
Your Name <two@example.com> ...
[use git-config to fetch it]
$ git config user.email
one@example.com
error: More than one value for the key user.email: two@example.com
This overwriting behavior is critical for the regular
parser, which starts with the lowest-priority file (e.g.,
/etc/gitconfig) and proceeds to the highest-priority file
($GIT_DIR/config). Overwriting yields the highest priority
value at the end.
Git-config solves this problem by implementing its own
parsing. It goes from highest to lowest priorty, but does
not proceed to the next file if it has seen a value.
So in practice, this distinction never mattered much,
because it only triggered for values in the same file. And
there was not much point in doing that; the real value is in
overwriting values from lower-priority files.
However, this changed with the implementation of config
include files. Now we might see an include overriding a
value from the parent file, which is a sensible thing to do,
but git-config will flag as a duplication.
This patch drops the duplicate detection for git-config and
switches to a pure-overwrite model (for the single case;
--get-all can still be used if callers want to do something
more fancy).
As is shown by the modifications to the test suite, this is
a user-visible change in behavior. An alternative would be
to just change the include case, but this is much cleaner
for a few reasons:
1. If you change the include case, then to what? If you
just stop parsing includes after getting a value, then
you will get a _different_ answer than the regular
config parser (you'll get the first value instead of
the last value). So you'd want to implement overwrite
semantics anyway.
2. Even though it is a change in behavior for git-config,
it is bringing us in line with what the internal
parsers already do.
3. The file-order reimplementation is the only thing
keeping us from sharing more code with the internal
config parser, which will help keep differences to a
minimum.
Going under the assumption that the primary purpose of
git-config is to behave identically to how git's internal
parsing works, this change can be seen as a bug-fix.
Signed-off-by: Jeff King <peff@peff.net>
2012-10-23 22:52:44 +02:00
|
|
|
test_expect_success 'multi-valued get returns final one' '
|
|
|
|
echo "wow2 for me" >expect &&
|
|
|
|
git config --get nextsection.nonewline >actual &&
|
|
|
|
test_cmp expect actual
|
2008-02-01 10:50:53 +01:00
|
|
|
'
|
2005-11-20 06:52:22 +01:00
|
|
|
|
2012-10-24 00:05:49 +02:00
|
|
|
test_expect_success 'multi-valued get-all returns all' '
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
wow
|
|
|
|
wow2 for me
|
|
|
|
EOF
|
|
|
|
git config --get-all nextsection.nonewline >actual &&
|
|
|
|
test_cmp expect actual
|
2012-10-23 20:59:26 +02:00
|
|
|
'
|
2005-11-20 06:52:22 +01:00
|
|
|
|
2005-11-17 22:50:08 +01:00
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
[nextSection]
|
|
|
|
nonewline = wow3
|
|
|
|
NoNewLine = wow2 for me
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'multivar replace' '
|
|
|
|
git config nextsection.nonewline "wow3" "wow$" &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2008-02-01 10:50:53 +01:00
|
|
|
test_expect_success 'ambiguous unset' '
|
2008-07-12 17:47:52 +02:00
|
|
|
test_must_fail git config --unset nextsection.nonewline
|
2008-02-01 10:50:53 +01:00
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2008-02-01 10:50:53 +01:00
|
|
|
test_expect_success 'invalid unset' '
|
2008-07-12 17:47:52 +02:00
|
|
|
test_must_fail git config --unset somesection.nonewline
|
2008-02-01 10:50:53 +01:00
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
[nextSection]
|
|
|
|
NoNewLine = wow2 for me
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'multivar unset' '
|
|
|
|
git config --unset nextsection.nonewline "wow3$" &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2008-07-12 17:47:52 +02:00
|
|
|
test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
test_expect_success 'correct key' 'git config 123456.a123 987'
|
2005-11-17 22:50:08 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'hierarchical section' '
|
|
|
|
git config Version.1.2.3eX.Alpha beta
|
|
|
|
'
|
2005-11-20 21:22:19 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[beta] ; silly comment # another comment
|
|
|
|
noIndent= sillyValue ; 'nother silly comment
|
|
|
|
|
|
|
|
# empty line
|
|
|
|
; comment
|
|
|
|
[nextSection]
|
|
|
|
NoNewLine = wow2 for me
|
|
|
|
[123456]
|
|
|
|
a123 = 987
|
2006-05-09 21:24:02 +02:00
|
|
|
[Version "1.2.3eX"]
|
|
|
|
Alpha = beta
|
2005-11-20 21:22:19 +01:00
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'hierarchical section value' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2005-11-20 21:22:19 +01:00
|
|
|
|
2006-05-02 14:22:48 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
beta.noindent=sillyValue
|
|
|
|
nextsection.nonewline=wow2 for me
|
|
|
|
123456.a123=987
|
2006-05-15 22:48:22 +02:00
|
|
|
version.1.2.3eX.alpha=beta
|
2006-05-02 14:22:48 +02:00
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'working --list' '
|
|
|
|
git config --list > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2010-10-21 16:45:44 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success '--list without repo produces empty output' '
|
|
|
|
git --git-dir=nonexistent config --list >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
2015-08-10 11:46:06 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
beta.noindent
|
|
|
|
nextsection.nonewline
|
|
|
|
123456.a123
|
|
|
|
version.1.2.3eX.alpha
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success '--name-only --list' '
|
|
|
|
git config --name-only --list >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
2006-05-02 14:22:48 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
beta.noindent sillyValue
|
|
|
|
nextsection.nonewline wow2 for me
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success '--get-regexp' '
|
|
|
|
git config --get-regexp in >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2006-05-02 14:22:48 +02:00
|
|
|
|
2015-08-10 11:46:06 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
beta.noindent
|
|
|
|
nextsection.nonewline
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success '--name-only --get-regexp' '
|
|
|
|
git config --name-only --get-regexp in >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
2006-12-15 13:39:04 +01:00
|
|
|
cat > expect << EOF
|
|
|
|
wow2 for me
|
|
|
|
wow4 for you
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success '--add' '
|
|
|
|
git config --add nextsection.nonewline "wow4 for you" &&
|
|
|
|
git config --get-all nextsection.nonewline > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2006-12-15 13:39:04 +01:00
|
|
|
|
2006-03-06 06:23:30 +01:00
|
|
|
cat > .git/config << EOF
|
|
|
|
[novalue]
|
|
|
|
variable
|
2008-02-07 06:23:46 +01:00
|
|
|
[emptyvalue]
|
|
|
|
variable =
|
2006-03-06 06:23:30 +01:00
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get variable with no value' '
|
|
|
|
git config --get novalue.variable ^$
|
|
|
|
'
|
2006-03-06 06:23:30 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get variable with empty value' '
|
|
|
|
git config --get emptyvalue.variable ^$
|
|
|
|
'
|
2008-02-07 06:23:46 +01:00
|
|
|
|
2007-06-25 16:03:54 +02:00
|
|
|
echo novalue.variable > expect
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get-regexp variable with no value' '
|
|
|
|
git config --get-regexp novalue > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2007-06-25 16:03:54 +02:00
|
|
|
|
2011-10-10 14:54:51 +02:00
|
|
|
echo 'novalue.variable true' > expect
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get-regexp --bool variable with no value' '
|
|
|
|
git config --bool --get-regexp novalue > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2011-10-10 14:54:51 +02:00
|
|
|
|
2008-02-07 06:23:46 +01:00
|
|
|
echo 'emptyvalue.variable ' > expect
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get-regexp variable with empty value' '
|
|
|
|
git config --get-regexp emptyvalue > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2008-02-07 06:23:46 +01:00
|
|
|
|
|
|
|
echo true > expect
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get bool variable with no value' '
|
|
|
|
git config --bool novalue.variable > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2008-02-07 06:23:46 +01:00
|
|
|
|
|
|
|
echo false > expect
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get bool variable with empty value' '
|
|
|
|
git config --bool emptyvalue.variable > output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2008-02-07 06:23:46 +01:00
|
|
|
|
2009-03-07 18:14:04 +01:00
|
|
|
test_expect_success 'no arguments, but no crash' '
|
|
|
|
test_must_fail git config >output 2>&1 &&
|
2012-08-27 07:36:55 +02:00
|
|
|
test_i18ngrep usage output
|
2009-03-07 18:14:04 +01:00
|
|
|
'
|
2006-05-02 14:22:48 +02:00
|
|
|
|
2006-05-06 21:43:43 +02:00
|
|
|
cat > .git/config << EOF
|
|
|
|
[a.b]
|
|
|
|
c = d
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[a.b]
|
|
|
|
c = d
|
|
|
|
[a]
|
|
|
|
x = y
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'new section is partial match of another' '
|
|
|
|
git config a.x y &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2006-05-06 21:43:43 +02:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
[a.b]
|
|
|
|
c = d
|
|
|
|
[a]
|
|
|
|
x = y
|
|
|
|
b = c
|
|
|
|
[b]
|
|
|
|
x = y
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'new variable inserts into proper section' '
|
|
|
|
git config b.x y &&
|
|
|
|
git config a.b c &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2006-05-06 21:43:43 +02:00
|
|
|
|
2014-03-21 00:17:01 +01:00
|
|
|
test_expect_success 'alternative --file (non-existing file should fail)' '
|
2012-10-23 20:59:26 +02:00
|
|
|
test_must_fail git config --file non-existing-config -l
|
|
|
|
'
|
2007-07-31 12:30:52 +02:00
|
|
|
|
2006-06-20 00:51:58 +02:00
|
|
|
cat > other-config << EOF
|
|
|
|
[ein]
|
|
|
|
bahn = strasse
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
ein.bahn=strasse
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'alternative GIT_CONFIG' '
|
2014-02-18 23:58:55 +01:00
|
|
|
GIT_CONFIG=other-config git config --list >output &&
|
2011-10-12 20:29:20 +02:00
|
|
|
test_cmp expect output
|
|
|
|
'
|
2006-06-20 00:51:58 +02:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'alternative GIT_CONFIG (--file)' '
|
2014-02-18 23:58:55 +01:00
|
|
|
git config --file other-config --list >output &&
|
2012-10-23 20:59:26 +02:00
|
|
|
test_cmp expect output
|
|
|
|
'
|
2007-07-31 12:30:52 +02:00
|
|
|
|
2014-02-18 23:58:55 +01:00
|
|
|
test_expect_success 'alternative GIT_CONFIG (--file=-)' '
|
|
|
|
git config --file - --list <other-config >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'setting a value in stdin is an error' '
|
|
|
|
test_must_fail git config --file - some.value foo
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'editing stdin is an error' '
|
|
|
|
test_must_fail git config --file - --edit
|
|
|
|
'
|
|
|
|
|
2010-01-26 16:02:16 +01:00
|
|
|
test_expect_success 'refer config from subdirectory' '
|
|
|
|
mkdir x &&
|
|
|
|
(
|
|
|
|
cd x &&
|
2012-02-16 09:02:18 +01:00
|
|
|
echo strasse >expect &&
|
2010-01-26 16:02:16 +01:00
|
|
|
git config --get --file ../other-config ein.bahn >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2014-03-21 00:17:01 +01:00
|
|
|
test_expect_success 'refer config from subdirectory via --file' '
|
config: stop using config_exclusive_filename
The git-config command sometimes operates on the default set
of config files (either reading from all, or writing to repo
config), and sometimes operates on a specific file. In the
latter case, we set the magic global config_exclusive_filename,
and the code in config.c does the right thing.
Instead, let's have git-config use the "advanced" variants
of config.c's functions which let it specify an individual
filename (or NULL for the default). This makes the code a
lot more obvious, and fixes two small bugs:
1. A relative path specified by GIT_CONFIG=foo will look
in the wrong directory if we have to chdir as part of
repository setup. We already handle this properly for
"git config -f foo", but the GIT_CONFIG lookup used
config_exclusive_filename directly. By dropping to a
single magic variable, the GIT_CONFIG case now just
works.
2. Calling "git config -f foo --edit" would not respect
core.editor. This is because just before editing, we
called git_config, which would respect the
config_exclusive_filename setting, even though this
particular git_config call was not about looking in the
user's specified file, but rather about loading actual
git config, just as any other git program would.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-16 09:07:32 +01:00
|
|
|
(
|
|
|
|
cd x &&
|
2014-03-21 00:17:01 +01:00
|
|
|
git config --file=../other-config --get ein.bahn >actual &&
|
config: stop using config_exclusive_filename
The git-config command sometimes operates on the default set
of config files (either reading from all, or writing to repo
config), and sometimes operates on a specific file. In the
latter case, we set the magic global config_exclusive_filename,
and the code in config.c does the right thing.
Instead, let's have git-config use the "advanced" variants
of config.c's functions which let it specify an individual
filename (or NULL for the default). This makes the code a
lot more obvious, and fixes two small bugs:
1. A relative path specified by GIT_CONFIG=foo will look
in the wrong directory if we have to chdir as part of
repository setup. We already handle this properly for
"git config -f foo", but the GIT_CONFIG lookup used
config_exclusive_filename directly. By dropping to a
single magic variable, the GIT_CONFIG case now just
works.
2. Calling "git config -f foo --edit" would not respect
core.editor. This is because just before editing, we
called git_config, which would respect the
config_exclusive_filename setting, even though this
particular git_config call was not about looking in the
user's specified file, but rather about loading actual
git config, just as any other git program would.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-16 09:07:32 +01:00
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2006-06-20 00:51:58 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
[ein]
|
|
|
|
bahn = strasse
|
|
|
|
[anwohner]
|
|
|
|
park = ausweis
|
|
|
|
EOF
|
|
|
|
|
2014-03-21 00:17:01 +01:00
|
|
|
test_expect_success '--set in alternative file' '
|
|
|
|
git config --file=other-config anwohner.park ausweis &&
|
2011-10-12 20:29:20 +02:00
|
|
|
test_cmp expect other-config
|
|
|
|
'
|
2006-06-20 00:51:58 +02:00
|
|
|
|
2006-12-16 15:14:14 +01:00
|
|
|
cat > .git/config << EOF
|
|
|
|
# Hallo
|
|
|
|
#Bello
|
|
|
|
[branch "eins"]
|
|
|
|
x = 1
|
|
|
|
[branch.eins]
|
|
|
|
y = 1
|
|
|
|
[branch "1 234 blabl/a"]
|
|
|
|
weird
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename section' '
|
|
|
|
git config --rename-section branch.eins branch.zwei
|
|
|
|
'
|
2006-12-16 15:14:14 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
# Hallo
|
|
|
|
#Bello
|
|
|
|
[branch "zwei"]
|
|
|
|
x = 1
|
|
|
|
[branch "zwei"]
|
|
|
|
y = 1
|
|
|
|
[branch "1 234 blabl/a"]
|
|
|
|
weird
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename succeeded' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2006-12-16 15:14:14 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename non-existing section' '
|
2008-07-12 17:47:52 +02:00
|
|
|
test_must_fail git config --rename-section \
|
|
|
|
branch."world domination" branch.drei
|
2008-02-01 10:50:53 +01:00
|
|
|
'
|
2006-12-16 15:14:14 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename succeeded' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2006-12-16 15:14:14 +01:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename another section' '
|
|
|
|
git config --rename-section branch."1 234 blabl/a" branch.drei
|
|
|
|
'
|
2006-12-16 15:14:14 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
# Hallo
|
|
|
|
#Bello
|
|
|
|
[branch "zwei"]
|
|
|
|
x = 1
|
|
|
|
[branch "zwei"]
|
|
|
|
y = 1
|
|
|
|
[branch "drei"]
|
|
|
|
weird
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename succeeded' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2009-07-24 23:21:44 +02:00
|
|
|
|
|
|
|
cat >> .git/config << EOF
|
|
|
|
[branch "vier"] z = 1
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename a section with a var on the same line' '
|
|
|
|
git config --rename-section branch.vier branch.zwei
|
|
|
|
'
|
2009-07-24 23:21:44 +02:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
# Hallo
|
|
|
|
#Bello
|
|
|
|
[branch "zwei"]
|
|
|
|
x = 1
|
|
|
|
[branch "zwei"]
|
|
|
|
y = 1
|
|
|
|
[branch "drei"]
|
|
|
|
weird
|
|
|
|
[branch "zwei"]
|
|
|
|
z = 1
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'rename succeeded' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2006-12-16 15:14:14 +01:00
|
|
|
|
2012-04-26 03:47:14 +02:00
|
|
|
test_expect_success 'renaming empty section name is rejected' '
|
|
|
|
test_must_fail git config --rename-section branch.zwei ""
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'renaming to bogus section is rejected' '
|
|
|
|
test_must_fail git config --rename-section branch.zwei "bogus name"
|
|
|
|
'
|
|
|
|
|
2007-03-02 21:53:33 +01:00
|
|
|
cat >> .git/config << EOF
|
|
|
|
[branch "zwei"] a = 1 [branch "vier"]
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'remove section' '
|
|
|
|
git config --remove-section branch.zwei
|
|
|
|
'
|
2007-03-02 21:53:33 +01:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
# Hallo
|
|
|
|
#Bello
|
|
|
|
[branch "drei"]
|
|
|
|
weird
|
|
|
|
EOF
|
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'section was removed properly' '
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2007-03-02 21:53:33 +01:00
|
|
|
|
2007-05-13 09:12:52 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
[gitcvs]
|
|
|
|
enabled = true
|
|
|
|
dbname = %Ggitcvs2.%a.%m.sqlite
|
|
|
|
[gitcvs "ext"]
|
|
|
|
dbname = %Ggitcvs1.%a.%m.sqlite
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'section ending' '
|
2011-10-19 09:37:06 +02:00
|
|
|
rm -f .git/config &&
|
2007-07-03 07:52:14 +02:00
|
|
|
git config gitcvs.enabled true &&
|
|
|
|
git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
|
|
|
|
git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
|
2011-10-12 20:29:20 +02:00
|
|
|
test_cmp expect .git/config
|
2007-05-13 09:12:52 +02:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2006-12-31 04:13:05 +01:00
|
|
|
test_expect_success numbers '
|
2007-07-03 07:52:14 +02:00
|
|
|
git config kilo.gram 1k &&
|
|
|
|
git config mega.ton 1m &&
|
2012-10-23 20:59:26 +02:00
|
|
|
echo 1024 >expect &&
|
|
|
|
echo 1048576 >>expect &&
|
|
|
|
git config --int --get kilo.gram >actual &&
|
|
|
|
git config --int --get mega.ton >>actual &&
|
|
|
|
test_cmp expect actual
|
2006-12-31 04:13:05 +01:00
|
|
|
'
|
|
|
|
|
git-config: always treat --int as 64-bit internally
When you run "git config --int", the maximum size of integer
you get depends on how git was compiled, and what it
considers to be an "int".
This is almost useful, because your scripts calling "git
config" will behave similarly to git internally. But relying
on this is dubious; you have to actually know how git treats
each value internally (e.g., int versus unsigned long),
which is not documented and is subject to change. And even
if you know it is "unsigned long", we do not have a
git-config option to match that behavior.
Furthermore, you may simply be asking git to store a value
on your behalf (e.g., configuration for a hook). In that
case, the relevant range check has nothing at all to do with
git, but rather with whatever scripting tools you are using
(and git has no way of knowing what the appropriate range is
there).
Not only is the range check useless, but it is actively
harmful, as there is no way at all for scripts to look
at config variables with large values. For instance, one
cannot reliably get the value of pack.packSizeLimit via
git-config. On an LP64 system, git happily uses a 64-bit
"unsigned long" internally to represent the value, but the
script cannot read any value over 2G.
Ideally, the "--int" option would simply represent an
arbitrarily large integer. For practical purposes, however,
a 64-bit integer is large enough, and is much easier to
implement (and if somebody overflows it, we will still
notice the problem, and not simply return garbage).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-09-08 10:40:02 +02:00
|
|
|
test_expect_success '--int is at least 64 bits' '
|
|
|
|
git config giga.watts 121g &&
|
|
|
|
echo 129922760704 >expect &&
|
|
|
|
git config --int --get giga.watts >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2007-12-25 08:18:05 +01:00
|
|
|
test_expect_success 'invalid unit' '
|
|
|
|
git config aninvalid.unit "1auto" &&
|
2012-10-23 20:59:26 +02:00
|
|
|
echo 1auto >expect &&
|
|
|
|
git config aninvalid.unit >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_must_fail git config --int --get aninvalid.unit 2>actual &&
|
2016-03-23 11:55:07 +01:00
|
|
|
test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
|
2007-12-25 08:18:05 +01:00
|
|
|
'
|
|
|
|
|
2017-06-14 13:35:46 +02:00
|
|
|
test_expect_success 'line number is reported correctly' '
|
|
|
|
printf "[bool]\n\tvar\n" >invalid &&
|
|
|
|
test_must_fail git config -f invalid --path bool.var 2>actual &&
|
|
|
|
test_i18ngrep "line 2" actual
|
|
|
|
'
|
|
|
|
|
2016-02-19 10:16:01 +01:00
|
|
|
test_expect_success 'invalid stdin config' '
|
|
|
|
echo "[broken" | test_must_fail git config --list --file - >output 2>&1 &&
|
2016-03-23 11:55:07 +01:00
|
|
|
test_i18ngrep "bad config line 1 in standard input" output
|
2016-02-19 10:16:01 +01:00
|
|
|
'
|
|
|
|
|
2007-05-21 00:12:57 +02:00
|
|
|
cat > expect << EOF
|
|
|
|
true
|
|
|
|
false
|
|
|
|
true
|
|
|
|
false
|
|
|
|
true
|
|
|
|
false
|
|
|
|
true
|
|
|
|
false
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success bool '
|
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
git config bool.true1 01 &&
|
|
|
|
git config bool.true2 -1 &&
|
|
|
|
git config bool.true3 YeS &&
|
|
|
|
git config bool.true4 true &&
|
|
|
|
git config bool.false1 000 &&
|
|
|
|
git config bool.false2 "" &&
|
|
|
|
git config bool.false3 nO &&
|
|
|
|
git config bool.false4 FALSE &&
|
2007-05-21 00:12:57 +02:00
|
|
|
rm -f result &&
|
|
|
|
for i in 1 2 3 4
|
|
|
|
do
|
2007-07-03 07:52:14 +02:00
|
|
|
git config --bool --get bool.true$i >>result
|
|
|
|
git config --bool --get bool.false$i >>result
|
2007-05-21 00:12:57 +02:00
|
|
|
done &&
|
2012-10-23 20:59:26 +02:00
|
|
|
test_cmp expect result'
|
2007-05-21 00:12:57 +02:00
|
|
|
|
2008-02-01 10:50:53 +01:00
|
|
|
test_expect_success 'invalid bool (--get)' '
|
2007-05-21 00:12:57 +02:00
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
git config bool.nobool foobar &&
|
2008-07-12 17:47:52 +02:00
|
|
|
test_must_fail git config --bool --get bool.nobool'
|
2007-05-21 00:12:57 +02:00
|
|
|
|
2008-02-01 10:50:53 +01:00
|
|
|
test_expect_success 'invalid bool (set)' '
|
2007-06-25 16:00:24 +02:00
|
|
|
|
2008-07-12 17:47:52 +02:00
|
|
|
test_must_fail git config --bool bool.nobool foobar'
|
2007-06-25 16:00:24 +02:00
|
|
|
|
|
|
|
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' '
|
|
|
|
|
2011-10-19 09:37:06 +02:00
|
|
|
rm -f .git/config &&
|
2007-07-03 07:52:14 +02:00
|
|
|
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 &&
|
2012-10-23 20:59:26 +02:00
|
|
|
test_cmp expect .git/config'
|
2007-06-25 16:00:24 +02:00
|
|
|
|
|
|
|
cat > expect <<\EOF
|
|
|
|
[int]
|
|
|
|
val1 = 1
|
|
|
|
val2 = -1
|
|
|
|
val3 = 5242880
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'set --int' '
|
|
|
|
|
2011-10-19 09:37:06 +02:00
|
|
|
rm -f .git/config &&
|
2007-07-03 07:52:14 +02:00
|
|
|
git config --int int.val1 01 &&
|
|
|
|
git config --int int.val2 -1 &&
|
|
|
|
git config --int int.val3 5m &&
|
2012-10-23 20:59:26 +02:00
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2007-06-25 16:00:24 +02:00
|
|
|
|
2012-10-23 20:59:26 +02:00
|
|
|
test_expect_success 'get --bool-or-int' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
[bool]
|
|
|
|
true1
|
2008-04-13 21:11:11 +02:00
|
|
|
true2 = true
|
2012-10-23 20:59:26 +02:00
|
|
|
false = false
|
|
|
|
[int]
|
2008-04-13 21:11:11 +02:00
|
|
|
int1 = 0
|
|
|
|
int2 = 1
|
|
|
|
int3 = -1
|
2012-10-23 20:59:26 +02:00
|
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
true
|
|
|
|
true
|
|
|
|
false
|
|
|
|
0
|
|
|
|
1
|
|
|
|
-1
|
|
|
|
EOF
|
|
|
|
{
|
|
|
|
git config --bool-or-int bool.true1 &&
|
|
|
|
git config --bool-or-int bool.true2 &&
|
|
|
|
git config --bool-or-int bool.false &&
|
|
|
|
git config --bool-or-int int.int1 &&
|
|
|
|
git config --bool-or-int int.int2 &&
|
|
|
|
git config --bool-or-int int.int3
|
|
|
|
} >actual &&
|
|
|
|
test_cmp expect actual
|
2008-04-13 21:11:11 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
cat >expect <<\EOF
|
|
|
|
[bool]
|
|
|
|
true1 = true
|
|
|
|
false1 = false
|
|
|
|
true2 = true
|
|
|
|
false2 = false
|
|
|
|
[int]
|
|
|
|
int1 = 0
|
|
|
|
int2 = 1
|
|
|
|
int3 = -1
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'set --bool-or-int' '
|
2011-10-19 09:37:06 +02:00
|
|
|
rm -f .git/config &&
|
2008-04-13 21:11:11 +02:00
|
|
|
git config --bool-or-int bool.true1 true &&
|
|
|
|
git config --bool-or-int bool.false1 false &&
|
|
|
|
git config --bool-or-int bool.true2 yes &&
|
|
|
|
git config --bool-or-int bool.false2 no &&
|
|
|
|
git config --bool-or-int int.int1 0 &&
|
|
|
|
git config --bool-or-int int.int2 1 &&
|
|
|
|
git config --bool-or-int int.int3 -1 &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
|
|
|
|
2009-12-30 17:51:53 +01:00
|
|
|
cat >expect <<\EOF
|
|
|
|
[path]
|
|
|
|
home = ~/
|
|
|
|
normal = /dev/null
|
|
|
|
trailingtilde = foo~
|
|
|
|
EOF
|
|
|
|
|
2014-07-22 00:09:27 +02:00
|
|
|
test_expect_success !MINGW 'set --path' '
|
2011-10-19 09:37:06 +02:00
|
|
|
rm -f .git/config &&
|
2009-12-30 17:51:53 +01:00
|
|
|
git config --path path.home "~/" &&
|
|
|
|
git config --path path.normal "/dev/null" &&
|
|
|
|
git config --path path.trailingtilde "foo~" &&
|
|
|
|
test_cmp expect .git/config'
|
|
|
|
|
2014-07-22 00:09:27 +02:00
|
|
|
if test_have_prereq !MINGW && test "${HOME+set}"
|
2010-07-26 17:06:51 +02:00
|
|
|
then
|
|
|
|
test_set_prereq HOMEVAR
|
|
|
|
fi
|
|
|
|
|
2009-12-30 17:51:53 +01:00
|
|
|
cat >expect <<EOF
|
|
|
|
$HOME/
|
|
|
|
/dev/null
|
|
|
|
foo~
|
|
|
|
EOF
|
|
|
|
|
2010-07-26 17:06:51 +02:00
|
|
|
test_expect_success HOMEVAR 'get --path' '
|
2009-12-30 17:51:53 +01:00
|
|
|
git config --get --path path.home > result &&
|
|
|
|
git config --get --path path.normal >> result &&
|
|
|
|
git config --get --path path.trailingtilde >> result &&
|
|
|
|
test_cmp expect result
|
|
|
|
'
|
|
|
|
|
2010-07-26 17:06:51 +02:00
|
|
|
cat >expect <<\EOF
|
|
|
|
/dev/null
|
|
|
|
foo~
|
|
|
|
EOF
|
|
|
|
|
2014-07-22 00:09:27 +02:00
|
|
|
test_expect_success !MINGW 'get --path copes with unset $HOME' '
|
2010-07-26 17:06:51 +02:00
|
|
|
(
|
|
|
|
unset HOME;
|
|
|
|
test_must_fail git config --get --path path.home \
|
|
|
|
>result 2>msg &&
|
|
|
|
git config --get --path path.normal >>result &&
|
|
|
|
git config --get --path path.trailingtilde >>result
|
|
|
|
) &&
|
2016-06-17 22:21:07 +02:00
|
|
|
test_i18ngrep "[Ff]ailed to expand.*~/" msg &&
|
2010-07-26 17:06:51 +02:00
|
|
|
test_cmp expect result
|
|
|
|
'
|
|
|
|
|
2012-11-15 19:10:01 +01:00
|
|
|
test_expect_success 'get --path barfs on boolean variable' '
|
|
|
|
echo "[path]bool" >.git/config &&
|
|
|
|
test_must_fail git config --get --path path.bool
|
|
|
|
'
|
|
|
|
|
2017-11-18 03:27:27 +01:00
|
|
|
test_expect_success 'get --expiry-date' '
|
|
|
|
rel="3.weeks.5.days.00:00" &&
|
|
|
|
rel_out="$rel ->" &&
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
[date]
|
|
|
|
valid1 = "3.weeks.5.days 00:00"
|
|
|
|
valid2 = "Fri Jun 4 15:46:55 2010"
|
|
|
|
valid3 = "2017/11/11 11:11:11PM"
|
|
|
|
valid4 = "2017/11/10 09:08:07 PM"
|
|
|
|
valid5 = "never"
|
|
|
|
invalid1 = "abc"
|
|
|
|
EOF
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(test-date timestamp $rel)
|
|
|
|
1275666415
|
|
|
|
1510441871
|
|
|
|
1510348087
|
|
|
|
0
|
|
|
|
EOF
|
|
|
|
{
|
|
|
|
echo "$rel_out $(git config --expiry-date date.valid1)"
|
|
|
|
git config --expiry-date date.valid2 &&
|
|
|
|
git config --expiry-date date.valid3 &&
|
|
|
|
git config --expiry-date date.valid4 &&
|
|
|
|
git config --expiry-date date.valid5
|
|
|
|
} >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_must_fail git config --expiry-date date.invalid1
|
|
|
|
'
|
|
|
|
|
2007-01-09 06:27:41 +01:00
|
|
|
cat > expect << EOF
|
|
|
|
[quote]
|
|
|
|
leading = " test"
|
|
|
|
ending = "test "
|
|
|
|
semicolon = "test;test"
|
|
|
|
hash = "test#test"
|
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'quoting' '
|
2011-10-19 09:37:06 +02:00
|
|
|
rm -f .git/config &&
|
2011-10-12 20:29:20 +02:00
|
|
|
git config quote.leading " test" &&
|
|
|
|
git config quote.ending "test " &&
|
|
|
|
git config quote.semicolon "test;test" &&
|
|
|
|
git config quote.hash "test#test" &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
2007-01-09 06:27:41 +01:00
|
|
|
|
2008-02-01 10:50:53 +01:00
|
|
|
test_expect_success 'key with newline' '
|
2008-07-12 17:47:52 +02:00
|
|
|
test_must_fail git config "key.with
|
2008-02-01 10:50:53 +01:00
|
|
|
newline" 123'
|
2007-01-20 02:25:37 +01:00
|
|
|
|
2007-01-29 01:16:53 +01:00
|
|
|
test_expect_success 'value with newline' 'git config key.sub value.with\\\
|
2007-01-20 02:25:37 +01:00
|
|
|
newline'
|
|
|
|
|
2007-01-23 13:37:25 +01:00
|
|
|
cat > .git/config <<\EOF
|
|
|
|
[section]
|
|
|
|
; comment \
|
|
|
|
continued = cont\
|
|
|
|
inued
|
|
|
|
noncont = not continued ; \
|
|
|
|
quotecont = "cont;\
|
|
|
|
inued"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat > expect <<\EOF
|
|
|
|
section.continued=continued
|
|
|
|
section.noncont=not continued
|
|
|
|
section.quotecont=cont;inued
|
|
|
|
EOF
|
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success 'value continued on next line' '
|
|
|
|
git config --list > result &&
|
2012-10-23 20:59:26 +02:00
|
|
|
test_cmp result expect
|
2011-10-12 20:29:20 +02:00
|
|
|
'
|
2007-01-23 13:37:25 +01:00
|
|
|
|
2007-06-25 16:03:55 +02:00
|
|
|
cat > .git/config <<\EOF
|
|
|
|
[section "sub=section"]
|
|
|
|
val1 = foo=bar
|
|
|
|
val2 = foo\nbar
|
|
|
|
val3 = \n\n
|
|
|
|
val4 =
|
|
|
|
val5
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat > expect <<\EOF
|
2007-06-27 14:40:41 +02:00
|
|
|
section.sub=section.val1
|
|
|
|
foo=barQsection.sub=section.val2
|
|
|
|
foo
|
|
|
|
barQsection.sub=section.val3
|
2007-06-25 16:03:55 +02:00
|
|
|
|
|
|
|
|
2007-06-27 14:40:41 +02:00
|
|
|
Qsection.sub=section.val4
|
|
|
|
Qsection.sub=section.val5Q
|
2007-06-25 16:03:55 +02:00
|
|
|
EOF
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success '--null --list' '
|
2016-02-17 09:57:46 +01:00
|
|
|
git config --null --list >result.raw &&
|
|
|
|
nul_to_q <result.raw >result &&
|
2011-10-12 20:29:20 +02:00
|
|
|
echo >>result &&
|
|
|
|
test_cmp expect result
|
|
|
|
'
|
2007-06-25 16:03:55 +02:00
|
|
|
|
2011-10-12 20:29:20 +02:00
|
|
|
test_expect_success '--null --get-regexp' '
|
2016-02-17 09:57:46 +01:00
|
|
|
git config --null --get-regexp "val[0-9]" >result.raw &&
|
|
|
|
nul_to_q <result.raw >result &&
|
2011-10-12 20:29:20 +02:00
|
|
|
echo >>result &&
|
|
|
|
test_cmp expect result
|
|
|
|
'
|
2007-06-25 16:03:55 +02:00
|
|
|
|
2009-07-30 13:41:57 +02:00
|
|
|
test_expect_success 'inner whitespace kept verbatim' '
|
|
|
|
git config section.val "foo bar" &&
|
2012-10-23 20:59:26 +02:00
|
|
|
echo "foo bar" >expect &&
|
|
|
|
git config section.val >actual &&
|
|
|
|
test_cmp expect actual
|
2009-07-30 13:41:57 +02:00
|
|
|
'
|
|
|
|
|
2009-03-04 22:38:24 +01:00
|
|
|
test_expect_success SYMLINKS 'symlinked configuration' '
|
2007-07-27 07:13:12 +02:00
|
|
|
ln -s notyet myconfig &&
|
2014-03-21 00:17:01 +01:00
|
|
|
git config --file=myconfig test.frotz nitfol &&
|
2007-07-27 07:13:12 +02:00
|
|
|
test -h myconfig &&
|
|
|
|
test -f notyet &&
|
2014-03-21 00:17:01 +01:00
|
|
|
test "z$(git config --file=notyet test.frotz)" = znitfol &&
|
|
|
|
git config --file=myconfig test.xyzzy rezrov &&
|
2007-07-27 07:13:12 +02:00
|
|
|
test -h myconfig &&
|
|
|
|
test -f notyet &&
|
2012-10-23 20:59:26 +02:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
nitfol
|
|
|
|
rezrov
|
|
|
|
EOF
|
|
|
|
{
|
2014-03-21 00:17:01 +01:00
|
|
|
git config --file=notyet test.frotz &&
|
|
|
|
git config --file=notyet test.xyzzy
|
2012-10-23 20:59:26 +02:00
|
|
|
} >actual &&
|
|
|
|
test_cmp expect actual
|
2007-07-27 07:13:12 +02:00
|
|
|
'
|
|
|
|
|
2010-10-21 16:45:44 +02:00
|
|
|
test_expect_success 'nonexistent configuration' '
|
2014-03-21 00:15:54 +01:00
|
|
|
test_must_fail git config --file=doesnotexist --list &&
|
|
|
|
test_must_fail git config --file=doesnotexist test.xyzzy
|
2010-10-21 16:45:44 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
|
|
|
|
ln -s doesnotexist linktonada &&
|
|
|
|
ln -s linktonada linktolinktonada &&
|
2014-03-21 00:15:54 +01:00
|
|
|
test_must_fail git config --file=linktonada --list &&
|
|
|
|
test_must_fail git config --file=linktolinktonada --list
|
2010-10-21 16:45:44 +02:00
|
|
|
'
|
|
|
|
|
2008-09-22 17:06:41 +02:00
|
|
|
test_expect_success 'check split_cmdline return' "
|
|
|
|
git config alias.split-cmdline-fix 'echo \"' &&
|
|
|
|
test_must_fail git split-cmdline-fix &&
|
|
|
|
echo foo > foo &&
|
|
|
|
git add foo &&
|
|
|
|
git commit -m 'initial commit' &&
|
|
|
|
git config branch.master.mergeoptions 'echo \"' &&
|
|
|
|
test_must_fail git merge master
|
2012-10-23 20:59:26 +02:00
|
|
|
"
|
2008-09-22 17:06:41 +02:00
|
|
|
|
2010-03-26 23:53:57 +01:00
|
|
|
test_expect_success 'git -c "key=value" support' '
|
2012-10-23 20:59:26 +02:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
value
|
|
|
|
value
|
|
|
|
true
|
|
|
|
EOF
|
|
|
|
{
|
|
|
|
git -c core.name=value config core.name &&
|
|
|
|
git -c foo.CamelCase=value config foo.camelcase &&
|
|
|
|
git -c foo.flag config --bool foo.flag
|
|
|
|
} >actual &&
|
|
|
|
test_cmp expect actual &&
|
2011-01-30 20:40:41 +01:00
|
|
|
test_must_fail git -c name=value config core.name
|
|
|
|
'
|
|
|
|
|
2014-08-05 00:40:19 +02:00
|
|
|
# We just need a type-specifier here that cares about the
|
|
|
|
# distinction internally between a NULL boolean and a real
|
|
|
|
# string (because most of git's internal parsers do care).
|
|
|
|
# Using "--path" works, but we do not otherwise care about
|
|
|
|
# its semantics.
|
|
|
|
test_expect_success 'git -c can represent empty string' '
|
|
|
|
echo >expect &&
|
|
|
|
git -c foo.empty= config --path foo.empty >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2011-01-30 20:40:41 +01:00
|
|
|
test_expect_success 'key sanity-checking' '
|
|
|
|
test_must_fail git config foo=bar &&
|
|
|
|
test_must_fail git config foo=.bar &&
|
|
|
|
test_must_fail git config foo.ba=r &&
|
|
|
|
test_must_fail git config foo.1bar &&
|
|
|
|
test_must_fail git config foo."ba
|
|
|
|
z".bar &&
|
2011-02-01 08:13:47 +01:00
|
|
|
test_must_fail git config . false &&
|
|
|
|
test_must_fail git config .foo false &&
|
|
|
|
test_must_fail git config foo. false &&
|
|
|
|
test_must_fail git config .foo. false &&
|
2011-01-30 20:40:41 +01:00
|
|
|
git config foo.bar true &&
|
|
|
|
git config foo."ba =z".bar false
|
2010-03-26 23:53:57 +01:00
|
|
|
'
|
|
|
|
|
2011-05-25 00:50:35 +02:00
|
|
|
test_expect_success 'git -c works with aliases of builtins' '
|
2011-05-25 00:49:55 +02:00
|
|
|
git config alias.checkconfig "-c foo.check=bar config foo.check" &&
|
|
|
|
echo bar >expect &&
|
|
|
|
git checkconfig >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-07-14 10:39:38 +02:00
|
|
|
test_expect_success 'aliases can be CamelCased' '
|
2017-07-14 10:39:29 +02:00
|
|
|
test_config alias.CamelCased "rev-parse HEAD" &&
|
|
|
|
git CamelCased >out &&
|
|
|
|
git rev-parse HEAD >expect &&
|
|
|
|
test_cmp expect out
|
|
|
|
'
|
|
|
|
|
2011-06-09 17:51:36 +02:00
|
|
|
test_expect_success 'git -c does not split values on equals' '
|
|
|
|
echo "value with = in it" >expect &&
|
|
|
|
git -c core.foo="value with = in it" config core.foo >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2011-06-09 17:52:32 +02:00
|
|
|
test_expect_success 'git -c dies on bogus config' '
|
|
|
|
test_must_fail git -c core.bare=foo rev-parse
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'git -c complains about empty key' '
|
|
|
|
test_must_fail git -c "=foo" rev-parse
|
|
|
|
'
|
|
|
|
|
2011-06-09 17:52:43 +02:00
|
|
|
test_expect_success 'git -c complains about empty key and value' '
|
|
|
|
test_must_fail git -c "" rev-parse
|
|
|
|
'
|
|
|
|
|
git_config_push_parameter: handle empty GIT_CONFIG_PARAMETERS
The "git -c var=value" option stuffs the config value into
$GIT_CONFIG_PARAMETERS, so that sub-processes can see it.
When the config is later read via git_config() or similar,
we parse it back out of that variable. The parsing end is a
little bit picky; it assumes that each entry was generated
with sq_quote_buf(), and that there is no extraneous
whitespace.
On the generating end, we are careful to append to an
existing $GIT_CONFIG_PARAMETERS variable if it exists.
However, our test for "should we add a space separator" is
too liberal: it will add one even if the environment
variable exists but is empty. As a result, you might end up
with:
GIT_CONFIG_PARAMETERS=" 'core.foo=bar'"
which the parser will choke on.
This was hard to trigger in older versions of git, since we
only set the variable when we had something to put into it
(though you could certainly trigger it manually). But since
14111fc (git: submodule honor -c credential.* from command
line, 2016-02-29), the submodule code will unconditionally
put the $GIT_CONFIG_PARAMETERS variable into the environment
of any operation in the submodule, whether it is empty or
not. So any of those operations which themselves use "git
-c" will generate the unparseable value and fail.
We can easily fix it by catching this case on the generating
side. While we're adding a test, let's also check that
multiple layers of "git -c" work, which was previously not
tested at all.
Reported-by: Shin Fan <shinfan@google.com>
Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Tested-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-03-22 20:50:51 +01:00
|
|
|
test_expect_success 'multiple git -c appends config' '
|
|
|
|
test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
x.one 1
|
|
|
|
x.two 2
|
|
|
|
EOF
|
|
|
|
git -c x.one=1 x >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-02-24 00:04:40 +01:00
|
|
|
test_expect_success 'last one wins: two level vars' '
|
|
|
|
|
|
|
|
# sec.var and sec.VAR are the same variable, as the first
|
|
|
|
# and the last level of a configuration variable name is
|
|
|
|
# case insensitive.
|
|
|
|
|
|
|
|
echo VAL >expect &&
|
|
|
|
|
|
|
|
git -c sec.var=val -c sec.VAR=VAL config --get sec.var >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
git -c SEC.var=val -c sec.var=VAL config --get sec.var >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
git -c sec.var=val -c sec.VAR=VAL config --get SEC.var >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
git -c SEC.var=val -c sec.var=VAL config --get sec.VAR >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'last one wins: three level vars' '
|
|
|
|
|
|
|
|
# v.a.r and v.A.r are not the same variable, as the middle
|
|
|
|
# level of a three-level configuration variable name is
|
|
|
|
# case sensitive.
|
|
|
|
|
|
|
|
echo val >expect &&
|
|
|
|
git -c v.a.r=val -c v.A.r=VAL config --get v.a.r >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
git -c v.a.r=val -c v.A.r=VAL config --get V.a.R >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# v.a.r and V.a.R are the same variable, as the first
|
|
|
|
# and the last level of a configuration variable name is
|
|
|
|
# case insensitive.
|
|
|
|
|
|
|
|
echo VAL >expect &&
|
|
|
|
git -c v.a.r=val -c v.a.R=VAL config --get v.a.r >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
git -c v.a.r=val -c V.a.r=VAL config --get v.a.r >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
git -c v.a.r=val -c v.a.R=VAL config --get V.a.R >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
git -c v.a.r=val -c V.a.r=VAL config --get V.a.R >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
for VAR in a .a a. a.0b a."b c". a."b c".0d
|
|
|
|
do
|
|
|
|
test_expect_success "git -c $VAR=VAL rejects invalid '$VAR'" '
|
|
|
|
test_must_fail git -c "$VAR=VAL" config -l
|
|
|
|
'
|
|
|
|
done
|
|
|
|
|
|
|
|
for VAR in a.b a."b c".d
|
|
|
|
do
|
|
|
|
test_expect_success "git -c $VAR=VAL works with valid '$VAR'" '
|
|
|
|
echo VAL >expect &&
|
|
|
|
git -c "$VAR=VAL" config --get "$VAR" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
done
|
|
|
|
|
git_config_push_parameter: handle empty GIT_CONFIG_PARAMETERS
The "git -c var=value" option stuffs the config value into
$GIT_CONFIG_PARAMETERS, so that sub-processes can see it.
When the config is later read via git_config() or similar,
we parse it back out of that variable. The parsing end is a
little bit picky; it assumes that each entry was generated
with sq_quote_buf(), and that there is no extraneous
whitespace.
On the generating end, we are careful to append to an
existing $GIT_CONFIG_PARAMETERS variable if it exists.
However, our test for "should we add a space separator" is
too liberal: it will add one even if the environment
variable exists but is empty. As a result, you might end up
with:
GIT_CONFIG_PARAMETERS=" 'core.foo=bar'"
which the parser will choke on.
This was hard to trigger in older versions of git, since we
only set the variable when we had something to put into it
(though you could certainly trigger it manually). But since
14111fc (git: submodule honor -c credential.* from command
line, 2016-02-29), the submodule code will unconditionally
put the $GIT_CONFIG_PARAMETERS variable into the environment
of any operation in the submodule, whether it is empty or
not. So any of those operations which themselves use "git
-c" will generate the unparseable value and fail.
We can easily fix it by catching this case on the generating
side. While we're adding a test, let's also check that
multiple layers of "git -c" work, which was previously not
tested at all.
Reported-by: Shin Fan <shinfan@google.com>
Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Tested-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-03-22 20:50:51 +01:00
|
|
|
test_expect_success 'git -c is not confused by empty environment' '
|
|
|
|
GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
|
|
|
|
'
|
|
|
|
|
config: stop using config_exclusive_filename
The git-config command sometimes operates on the default set
of config files (either reading from all, or writing to repo
config), and sometimes operates on a specific file. In the
latter case, we set the magic global config_exclusive_filename,
and the code in config.c does the right thing.
Instead, let's have git-config use the "advanced" variants
of config.c's functions which let it specify an individual
filename (or NULL for the default). This makes the code a
lot more obvious, and fixes two small bugs:
1. A relative path specified by GIT_CONFIG=foo will look
in the wrong directory if we have to chdir as part of
repository setup. We already handle this properly for
"git config -f foo", but the GIT_CONFIG lookup used
config_exclusive_filename directly. By dropping to a
single magic variable, the GIT_CONFIG case now just
works.
2. Calling "git config -f foo --edit" would not respect
core.editor. This is because just before editing, we
called git_config, which would respect the
config_exclusive_filename setting, even though this
particular git_config call was not about looking in the
user's specified file, but rather about loading actual
git config, just as any other git program would.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-16 09:07:32 +01:00
|
|
|
test_expect_success 'git config --edit works' '
|
|
|
|
git config -f tmp test.value no &&
|
|
|
|
echo test.value=yes >expect &&
|
|
|
|
GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
|
|
|
|
git config -f tmp --list >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'git config --edit respects core.editor' '
|
|
|
|
git config -f tmp test.value no &&
|
|
|
|
echo test.value=yes >expect &&
|
|
|
|
test_config core.editor "echo [test]value=yes >" &&
|
|
|
|
git config -f tmp --edit &&
|
|
|
|
git config -f tmp --list >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2012-03-09 22:57:54 +01:00
|
|
|
# malformed configuration files
|
|
|
|
test_expect_success 'barf on syntax error' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
# broken section line
|
|
|
|
[section]
|
|
|
|
key garbage
|
|
|
|
EOF
|
|
|
|
test_must_fail git config --get section.key >actual 2>error &&
|
2016-06-17 22:21:07 +02:00
|
|
|
test_i18ngrep " line 3 " error
|
2012-03-09 22:57:54 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'barf on incomplete section header' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
# broken section line
|
|
|
|
[section
|
|
|
|
key = value
|
|
|
|
EOF
|
|
|
|
test_must_fail git config --get section.key >actual 2>error &&
|
2016-06-17 22:21:07 +02:00
|
|
|
test_i18ngrep " line 2 " error
|
2012-03-09 22:57:54 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'barf on incomplete string' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
# broken section line
|
|
|
|
[section]
|
|
|
|
key = "value string
|
|
|
|
EOF
|
|
|
|
test_must_fail git config --get section.key >actual 2>error &&
|
2016-06-17 22:21:07 +02:00
|
|
|
test_i18ngrep " line 3 " error
|
2012-03-09 22:57:54 +01:00
|
|
|
'
|
|
|
|
|
2013-07-31 20:14:59 +02:00
|
|
|
test_expect_success 'urlmatch' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
[http]
|
|
|
|
sslVerify
|
|
|
|
[http "https://weak.example.com"]
|
|
|
|
sslVerify = false
|
|
|
|
cookieFile = /tmp/cookie.txt
|
|
|
|
EOF
|
|
|
|
|
2016-02-28 12:54:35 +01:00
|
|
|
test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
|
|
|
|
test_must_be_empty actual &&
|
|
|
|
|
2013-07-31 20:14:59 +02:00
|
|
|
echo true >expect &&
|
|
|
|
git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo false >expect &&
|
|
|
|
git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
{
|
|
|
|
echo http.cookiefile /tmp/cookie.txt &&
|
|
|
|
echo http.sslverify false
|
|
|
|
} >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://weak.example.com >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-01-31 10:01:46 +01:00
|
|
|
test_expect_success 'urlmatch favors more specific URLs' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
[http "https://example.com/"]
|
|
|
|
cookieFile = /tmp/root.txt
|
|
|
|
[http "https://example.com/subdirectory"]
|
|
|
|
cookieFile = /tmp/subdirectory.txt
|
|
|
|
[http "https://user@example.com/"]
|
|
|
|
cookieFile = /tmp/user.txt
|
|
|
|
[http "https://averylonguser@example.com/"]
|
|
|
|
cookieFile = /tmp/averylonguser.txt
|
2017-01-31 10:01:47 +01:00
|
|
|
[http "https://preceding.example.com"]
|
|
|
|
cookieFile = /tmp/preceding.txt
|
|
|
|
[http "https://*.example.com"]
|
|
|
|
cookieFile = /tmp/wildcard.txt
|
|
|
|
[http "https://*.example.com/wildcardwithsubdomain"]
|
|
|
|
cookieFile = /tmp/wildcardwithsubdomain.txt
|
|
|
|
[http "https://trailing.example.com"]
|
|
|
|
cookieFile = /tmp/trailing.txt
|
|
|
|
[http "https://user@*.example.com/"]
|
|
|
|
cookieFile = /tmp/wildcardwithuser.txt
|
|
|
|
[http "https://sub.example.com/"]
|
|
|
|
cookieFile = /tmp/sub.txt
|
2017-01-31 10:01:46 +01:00
|
|
|
EOF
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/root.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/subdirectory.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/subdirectory.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/user.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://user@example.com/ >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/subdirectory.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
|
2017-01-31 10:01:47 +01:00
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/preceding.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://preceding.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/wildcard.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/sub.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/trailing.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://trailing.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.cookiefile /tmp/sub.txt >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'urlmatch with wildcard' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
[http]
|
|
|
|
sslVerify
|
|
|
|
[http "https://*.example.com"]
|
|
|
|
sslVerify = false
|
|
|
|
cookieFile = /tmp/cookie.txt
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
|
|
|
|
test_must_be_empty actual &&
|
|
|
|
|
|
|
|
echo true >expect &&
|
|
|
|
git config --bool --get-urlmatch http.SSLverify https://example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo true >expect &&
|
|
|
|
git config --bool --get-urlmatch http.SSLverify https://good-example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo true >expect &&
|
|
|
|
git config --bool --get-urlmatch http.sslverify https://deep.nested.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo false >expect &&
|
|
|
|
git config --bool --get-urlmatch http.sslverify https://good.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
{
|
|
|
|
echo http.cookiefile /tmp/cookie.txt &&
|
|
|
|
echo http.sslverify false
|
|
|
|
} >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://good.example.com >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
echo http.sslverify >expect &&
|
|
|
|
git config --get-urlmatch HTTP https://more.example.com.au >actual &&
|
2017-01-31 10:01:46 +01:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
t1300: document some aesthetic failures of the config editor
The config-editing code used by "git config var value" is
built around the regular config callback parser, whose only
triggerable item is an actual key. As a result, it does not
know anything about section headers, which can result in
unnecessarily ugly output:
1. When we delete the last key in a section, we should be
able to delete the section header.
2. When we add a key into a section, we should be able to
reuse the same section header, even if that section did
not have any keys in it already.
Unfortunately, fixing these is not trivial with the current
code. It would involve the config parser recording and
passing back information on each item it finds, including
headers, keys, and even comments (or even better, generating
an actual in-memory parse-tree).
Since these behaviors do not cause any functional problems
(i.e., the resulting config parses as expected, it is just
uglier than one would like), fixing them can wait until
somebody feels like substantially refactoring the parsing
code. In the meantime, let's document them as known issues
with some tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-03-29 20:51:55 +01:00
|
|
|
# good section hygiene
|
|
|
|
test_expect_failure 'unsetting the last key in a section removes header' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
# some generic comment on the configuration file itself
|
|
|
|
# a comment specific to this "section" section.
|
|
|
|
[section]
|
|
|
|
# some intervening lines
|
|
|
|
# that should also be dropped
|
|
|
|
|
|
|
|
key = value
|
|
|
|
# please be careful when you update the above variable
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
# some generic comment on the configuration file itself
|
|
|
|
EOF
|
|
|
|
|
|
|
|
git config --unset section.key &&
|
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_failure 'adding a key into an empty section reuses header' '
|
|
|
|
cat >.git/config <<-\EOF &&
|
|
|
|
[section]
|
|
|
|
EOF
|
|
|
|
|
|
|
|
q_to_tab >expect <<-\EOF &&
|
|
|
|
[section]
|
|
|
|
Qkey = value
|
|
|
|
EOF
|
|
|
|
|
2015-03-20 11:06:44 +01:00
|
|
|
git config section.key value &&
|
t1300: document some aesthetic failures of the config editor
The config-editing code used by "git config var value" is
built around the regular config callback parser, whose only
triggerable item is an actual key. As a result, it does not
know anything about section headers, which can result in
unnecessarily ugly output:
1. When we delete the last key in a section, we should be
able to delete the section header.
2. When we add a key into a section, we should be able to
reuse the same section header, even if that section did
not have any keys in it already.
Unfortunately, fixing these is not trivial with the current
code. It would involve the config parser recording and
passing back information on each item it finds, including
headers, keys, and even comments (or even better, generating
an actual in-memory parse-tree).
Since these behaviors do not cause any functional problems
(i.e., the resulting config parses as expected, it is just
uglier than one would like), fixing them can wait until
somebody feels like substantially refactoring the parsing
code. In the meantime, let's document them as known issues
with some tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-03-29 20:51:55 +01:00
|
|
|
test_cmp expect .git/config
|
|
|
|
'
|
|
|
|
|
2014-05-06 02:17:14 +02:00
|
|
|
test_expect_success POSIXPERM,PERL 'preserves existing permissions' '
|
|
|
|
chmod 0600 .git/config &&
|
|
|
|
git config imap.pass Hunter2 &&
|
|
|
|
perl -e \
|
|
|
|
"die q(badset) if ((stat(q(.git/config)))[2] & 07777) != 0600" &&
|
|
|
|
git config --rename-section imap pop &&
|
|
|
|
perl -e \
|
|
|
|
"die q(badrename) if ((stat(q(.git/config)))[2] & 07777) != 0600"
|
|
|
|
'
|
|
|
|
|
2016-03-23 11:55:13 +01:00
|
|
|
! test_have_prereq MINGW ||
|
|
|
|
HOME="$(pwd)" # convert to Windows path
|
|
|
|
|
2016-02-19 10:16:02 +01:00
|
|
|
test_expect_success 'set up --show-origin tests' '
|
|
|
|
INCLUDE_DIR="$HOME/include" &&
|
|
|
|
mkdir -p "$INCLUDE_DIR" &&
|
|
|
|
cat >"$INCLUDE_DIR"/absolute.include <<-\EOF &&
|
|
|
|
[user]
|
|
|
|
absolute = include
|
|
|
|
EOF
|
|
|
|
cat >"$INCLUDE_DIR"/relative.include <<-\EOF &&
|
|
|
|
[user]
|
|
|
|
relative = include
|
|
|
|
EOF
|
|
|
|
cat >"$HOME"/.gitconfig <<-EOF &&
|
|
|
|
[user]
|
|
|
|
global = true
|
|
|
|
override = global
|
|
|
|
[include]
|
|
|
|
path = "$INCLUDE_DIR/absolute.include"
|
|
|
|
EOF
|
|
|
|
cat >.git/config <<-\EOF
|
|
|
|
[user]
|
|
|
|
local = true
|
|
|
|
override = local
|
|
|
|
[include]
|
|
|
|
path = ../include/relative.include
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin with --list' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
file:$HOME/.gitconfig user.global=true
|
|
|
|
file:$HOME/.gitconfig user.override=global
|
|
|
|
file:$HOME/.gitconfig include.path=$INCLUDE_DIR/absolute.include
|
|
|
|
file:$INCLUDE_DIR/absolute.include user.absolute=include
|
|
|
|
file:.git/config user.local=true
|
|
|
|
file:.git/config user.override=local
|
|
|
|
file:.git/config include.path=../include/relative.include
|
|
|
|
file:.git/../include/relative.include user.relative=include
|
|
|
|
command line: user.cmdline=true
|
|
|
|
EOF
|
|
|
|
git -c user.cmdline=true config --list --show-origin >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin with --list --null' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
file:$HOME/.gitconfigQuser.global
|
|
|
|
trueQfile:$HOME/.gitconfigQuser.override
|
|
|
|
globalQfile:$HOME/.gitconfigQinclude.path
|
|
|
|
$INCLUDE_DIR/absolute.includeQfile:$INCLUDE_DIR/absolute.includeQuser.absolute
|
|
|
|
includeQfile:.git/configQuser.local
|
|
|
|
trueQfile:.git/configQuser.override
|
|
|
|
localQfile:.git/configQinclude.path
|
|
|
|
../include/relative.includeQfile:.git/../include/relative.includeQuser.relative
|
|
|
|
includeQcommand line:Quser.cmdline
|
|
|
|
trueQ
|
|
|
|
EOF
|
|
|
|
git -c user.cmdline=true config --null --list --show-origin >output.raw &&
|
|
|
|
nul_to_q <output.raw >output &&
|
|
|
|
# The here-doc above adds a newline that the --null output would not
|
|
|
|
# include. Add it here to make the two comparable.
|
|
|
|
echo >>output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin with single file' '
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
file:.git/config user.local=true
|
|
|
|
file:.git/config user.override=local
|
|
|
|
file:.git/config include.path=../include/relative.include
|
|
|
|
EOF
|
|
|
|
git config --local --list --show-origin >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin with --get-regexp' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
file:$HOME/.gitconfig user.global true
|
|
|
|
file:.git/config user.local true
|
|
|
|
EOF
|
|
|
|
git config --show-origin --get-regexp "user\.[g|l].*" >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin getting a single key' '
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
file:.git/config local
|
|
|
|
EOF
|
|
|
|
git config --show-origin user.override >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'set up custom config file' '
|
|
|
|
CUSTOM_CONFIG_FILE="file\" (dq) and spaces.conf" &&
|
|
|
|
cat >"$CUSTOM_CONFIG_FILE" <<-\EOF
|
|
|
|
[user]
|
|
|
|
custom = true
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2016-03-23 11:55:13 +01:00
|
|
|
test_expect_success !MINGW '--show-origin escape special file name characters' '
|
2016-02-19 10:16:02 +01:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
file:"file\" (dq) and spaces.conf" user.custom=true
|
|
|
|
EOF
|
|
|
|
git config --file "$CUSTOM_CONFIG_FILE" --show-origin --list >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin stdin' '
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
standard input: user.custom=true
|
|
|
|
EOF
|
|
|
|
git config --file - --show-origin --list <"$CUSTOM_CONFIG_FILE" >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--show-origin stdin with file include' '
|
|
|
|
cat >"$INCLUDE_DIR"/stdin.include <<-EOF &&
|
|
|
|
[user]
|
|
|
|
stdin = include
|
|
|
|
EOF
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
file:$INCLUDE_DIR/stdin.include include
|
|
|
|
EOF
|
|
|
|
echo "[include]path=\"$INCLUDE_DIR\"/stdin.include" \
|
|
|
|
| git config --show-origin --includes --file - user.stdin >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
2016-03-23 11:55:13 +01:00
|
|
|
test_expect_success !MINGW '--show-origin blob' '
|
2016-02-19 10:16:02 +01:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
blob:a9d9f9e555b5c6f07cbe09d3f06fe3df11e09c08 user.custom=true
|
|
|
|
EOF
|
|
|
|
blob=$(git hash-object -w "$CUSTOM_CONFIG_FILE") &&
|
|
|
|
git config --blob=$blob --show-origin --list >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
2016-03-23 11:55:13 +01:00
|
|
|
test_expect_success !MINGW '--show-origin blob ref' '
|
2016-02-19 10:16:02 +01:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
blob:"master:file\" (dq) and spaces.conf" user.custom=true
|
|
|
|
EOF
|
|
|
|
git add "$CUSTOM_CONFIG_FILE" &&
|
|
|
|
git commit -m "new config file" &&
|
|
|
|
git config --blob=master:"$CUSTOM_CONFIG_FILE" --show-origin --list >output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
|
|
|
|
2017-05-13 05:29:31 +02:00
|
|
|
test_expect_success '--local requires a repo' '
|
2017-05-13 05:29:18 +02:00
|
|
|
# we expect 128 to ensure that we do not simply
|
|
|
|
# fail to find anything and return code "1"
|
|
|
|
test_expect_code 128 nongit git config --local foo.bar
|
|
|
|
'
|
|
|
|
|
2005-11-17 22:50:08 +01:00
|
|
|
test_done
|