t1300-config.sh 38.7 KB
Newer Older
1 2 3 4 5
#!/bin/sh
#
# Copyright (c) 2005 Johannes Schindelin
#

6
test_description='Test git config in different settings'
7 8 9

. ./test-lib.sh

10 11 12
test_expect_success 'clear default config' '
	rm -f .git/config
'
13 14 15 16 17

cat > expect << EOF
[core]
	penguin = little blue
EOF
18 19 20 21
test_expect_success 'initial' '
	git config core.penguin "little blue" &&
	test_cmp expect .git/config
'
22 23 24 25 26 27

cat > expect << EOF
[core]
	penguin = little blue
	Movie = BadPhysics
EOF
28 29 30 31
test_expect_success 'mixed case' '
	git config Core.Movie BadPhysics &&
	test_cmp expect .git/config
'
32 33 34 35 36 37 38 39

cat > expect << EOF
[core]
	penguin = little blue
	Movie = BadPhysics
[Cores]
	WhatEver = Second
EOF
40
test_expect_success 'similar section' '
R
Ramkumar Ramachandra 已提交
41
	git config Cores.WhatEver Second &&
42 43
	test_cmp expect .git/config
'
44 45 46 47 48 49 50 51 52

cat > expect << EOF
[core]
	penguin = little blue
	Movie = BadPhysics
	UPPERCASE = true
[Cores]
	WhatEver = Second
EOF
53 54 55 56
test_expect_success 'uppercase section' '
	git config CORE.UPPERCASE true &&
	test_cmp expect .git/config
'
57

J
Jeff King 已提交
58 59 60
test_expect_success 'replace with non-match' '
	git config core.penguin kingpin !blue
'
61

J
Jeff King 已提交
62 63 64
test_expect_success 'replace with non-match (actually matching)' '
	git config core.penguin "very blue" !kingpin
'
65 66 67 68 69 70 71 72 73 74 75

cat > expect << EOF
[core]
	penguin = very blue
	Movie = BadPhysics
	UPPERCASE = true
	penguin = kingpin
[Cores]
	WhatEver = Second
EOF

76
test_expect_success 'non-match result' 'test_cmp expect .git/config'
77

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
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
'
104

105 106 107 108 109 110
cat > .git/config <<\EOF
[alpha]
bar = foo
[beta]
baz = multiple \
lines
111
foo = bar
112 113
EOF

J
Jeff King 已提交
114 115 116
test_expect_success 'unset with cont. lines' '
	git config --unset beta.baz
'
117 118 119 120 121

cat > expect <<\EOF
[alpha]
bar = foo
[beta]
122
foo = bar
123 124
EOF

125
test_expect_success 'unset with cont. lines is correct' 'test_cmp expect .git/config'
126

127 128 129 130 131 132 133
cat > .git/config << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
		haha   ="beta" # last silly comment
134 135
haha = hello
	haha = bello
136 137 138
[nextSection] noNewline = ouch
EOF

139 140
cp .git/config .git/config2

J
Jeff King 已提交
141 142 143
test_expect_success 'multiple unset' '
	git config --unset-all beta.haha
'
144 145 146 147 148 149 150 151 152 153

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
[nextSection] noNewline = ouch
EOF

J
Jeff King 已提交
154 155 156
test_expect_success 'multiple unset is correct' '
	test_cmp expect .git/config
'
157

158 159 160 161 162 163 164 165
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
166

J
Jeff King 已提交
167 168 169
test_expect_success '--replace-all' '
	git config --replace-all beta.haha gamma
'
170 171 172 173 174 175 176 177 178 179 180

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
	haha = gamma
[nextSection] noNewline = ouch
EOF

J
Jeff King 已提交
181 182 183
test_expect_success 'all replaced' '
	test_cmp expect .git/config
'
184 185 186 187 188 189 190 191 192 193

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
	haha = alpha
[nextSection] noNewline = ouch
EOF
194 195 196 197
test_expect_success 'really mean test' '
	git config beta.haha alpha &&
	test_cmp expect .git/config
'
198 199 200 201 202 203 204 205 206 207 208

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
	haha = alpha
[nextSection]
	nonewline = wow
EOF
209 210 211 212
test_expect_success 'really really mean test' '
	git config nextsection.nonewline wow &&
	test_cmp expect .git/config
'
213

J
Jeff King 已提交
214 215 216 217 218
test_expect_success 'get value' '
	echo alpha >expect &&
	git config beta.haha >actual &&
	test_cmp expect actual
'
219 220 221 222 223 224 225 226 227 228

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
[nextSection]
	nonewline = wow
EOF
229 230 231 232
test_expect_success 'unset' '
	git config --unset beta.haha &&
	test_cmp expect .git/config
'
233 234 235 236 237 238 239 240 241 242 243

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
[nextSection]
	nonewline = wow
	NoNewLine = wow2 for me
EOF
244 245 246 247
test_expect_success 'multivar' '
	git config nextsection.NoNewLine "wow2 for me" "for me$" &&
	test_cmp expect .git/config
'
248

J
Jeff King 已提交
249 250 251
test_expect_success 'non-match' '
	git config --get nextsection.nonewline !for
'
252

J
Jeff King 已提交
253 254 255 256 257
test_expect_success 'non-match value' '
	echo wow >expect &&
	git config --get nextsection.nonewline !for >actual &&
	test_cmp expect actual
'
258

259 260 261 262
test_expect_success 'multi-valued get returns final one' '
	echo "wow2 for me" >expect &&
	git config --get nextsection.nonewline >actual &&
	test_cmp expect actual
J
Junio C Hamano 已提交
263
'
264

265 266 267 268 269 270 271
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
J
Jeff King 已提交
272
'
273

274 275 276 277 278 279 280 281 282 283
cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
[nextSection]
	nonewline = wow3
	NoNewLine = wow2 for me
EOF
284 285 286 287
test_expect_success 'multivar replace' '
	git config nextsection.nonewline "wow3" "wow$" &&
	test_cmp expect .git/config
'
288

J
Junio C Hamano 已提交
289
test_expect_success 'ambiguous unset' '
290
	test_must_fail git config --unset nextsection.nonewline
J
Junio C Hamano 已提交
291
'
292

J
Junio C Hamano 已提交
293
test_expect_success 'invalid unset' '
294
	test_must_fail git config --unset somesection.nonewline
J
Junio C Hamano 已提交
295
'
296 297 298 299 300 301 302 303 304 305 306

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
[nextSection]
	NoNewLine = wow2 for me
EOF

307 308 309 310
test_expect_success 'multivar unset' '
	git config --unset nextsection.nonewline "wow3$" &&
	test_cmp expect .git/config
'
311

312
test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
313

314
test_expect_success 'correct key' 'git config 123456.a123 987'
315

J
Jeff King 已提交
316 317 318
test_expect_success 'hierarchical section' '
	git config Version.1.2.3eX.Alpha beta
'
319 320 321 322 323 324 325 326 327 328 329

cat > expect << EOF
[beta] ; silly comment # another comment
noIndent= sillyValue ; 'nother silly comment

# empty line
		; comment
[nextSection]
	NoNewLine = wow2 for me
[123456]
	a123 = 987
L
Linus Torvalds 已提交
330 331
[Version "1.2.3eX"]
	Alpha = beta
332 333
EOF

J
Jeff King 已提交
334 335 336
test_expect_success 'hierarchical section value' '
	test_cmp expect .git/config
'
337

338 339 340 341
cat > expect << EOF
beta.noindent=sillyValue
nextsection.nonewline=wow2 for me
123456.a123=987
J
Junio C Hamano 已提交
342
version.1.2.3eX.alpha=beta
343 344
EOF

J
Jeff King 已提交
345 346 347 348
test_expect_success 'working --list' '
	git config --list > output &&
	test_cmp expect output
'
349 350 351 352 353 354 355 356
cat > expect << EOF
EOF

test_expect_success '--list without repo produces empty output' '
	git --git-dir=nonexistent config --list >output &&
	test_cmp expect output
'

357 358 359 360 361 362 363 364 365 366 367 368
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
'

369 370 371 372 373
cat > expect << EOF
beta.noindent sillyValue
nextsection.nonewline wow2 for me
EOF

J
Jeff King 已提交
374 375 376 377
test_expect_success '--get-regexp' '
	git config --get-regexp in >output &&
	test_cmp expect output
'
378

379 380 381 382 383 384 385 386 387 388
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
'

389 390 391 392 393
cat > expect << EOF
wow2 for me
wow4 for you
EOF

394 395 396 397 398
test_expect_success '--add' '
	git config --add nextsection.nonewline "wow4 for you" &&
	git config --get-all nextsection.nonewline > output &&
	test_cmp expect output
'
399

400 401 402
cat > .git/config << EOF
[novalue]
	variable
403 404
[emptyvalue]
	variable =
405 406
EOF

J
Jeff King 已提交
407 408 409
test_expect_success 'get variable with no value' '
	git config --get novalue.variable ^$
'
410

J
Jeff King 已提交
411 412 413
test_expect_success 'get variable with empty value' '
	git config --get emptyvalue.variable ^$
'
414

415 416
echo novalue.variable > expect

J
Jeff King 已提交
417 418 419 420
test_expect_success 'get-regexp variable with no value' '
	git config --get-regexp novalue > output &&
	test_cmp expect output
'
421

422 423
echo 'novalue.variable true' > expect

J
Jeff King 已提交
424 425 426 427
test_expect_success 'get-regexp --bool variable with no value' '
	git config --bool --get-regexp novalue > output &&
	test_cmp expect output
'
428

429 430
echo 'emptyvalue.variable ' > expect

J
Jeff King 已提交
431 432 433 434
test_expect_success 'get-regexp variable with empty value' '
	git config --get-regexp emptyvalue > output &&
	test_cmp expect output
'
435 436 437

echo true > expect

J
Jeff King 已提交
438 439 440 441
test_expect_success 'get bool variable with no value' '
	git config --bool novalue.variable > output &&
	test_cmp expect output
'
442 443 444

echo false > expect

J
Jeff King 已提交
445 446 447 448
test_expect_success 'get bool variable with empty value' '
	git config --bool emptyvalue.variable > output &&
	test_cmp expect output
'
449

450 451
test_expect_success 'no arguments, but no crash' '
	test_must_fail git config >output 2>&1 &&
452
	test_i18ngrep usage output
453
'
454

455 456 457 458 459 460 461 462 463 464 465 466
cat > .git/config << EOF
[a.b]
	c = d
EOF

cat > expect << EOF
[a.b]
	c = d
[a]
	x = y
EOF

467 468 469 470
test_expect_success 'new section is partial match of another' '
	git config a.x y &&
	test_cmp expect .git/config
'
471 472 473 474 475 476 477 478 479 480 481

cat > expect << EOF
[a.b]
	c = d
[a]
	x = y
	b = c
[b]
	x = y
EOF

482 483 484 485 486
test_expect_success 'new variable inserts into proper section' '
	git config b.x y &&
	git config a.b c &&
	test_cmp expect .git/config
'
487

488
test_expect_success 'alternative --file (non-existing file should fail)' '
J
Jeff King 已提交
489 490
	test_must_fail git config --file non-existing-config -l
'
A
Alex Riesen 已提交
491

492 493 494 495 496 497 498 499 500
cat > other-config << EOF
[ein]
	bahn = strasse
EOF

cat > expect << EOF
ein.bahn=strasse
EOF

501
test_expect_success 'alternative GIT_CONFIG' '
502
	GIT_CONFIG=other-config git config --list >output &&
503 504
	test_cmp expect output
'
505

J
Jeff King 已提交
506
test_expect_success 'alternative GIT_CONFIG (--file)' '
507
	git config --file other-config --list >output &&
J
Jeff King 已提交
508 509
	test_cmp expect output
'
A
Alex Riesen 已提交
510

511 512 513 514 515 516 517 518 519 520 521 522 523
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
'

524 525 526 527
test_expect_success 'refer config from subdirectory' '
	mkdir x &&
	(
		cd x &&
J
Jeff King 已提交
528
		echo strasse >expect &&
529 530 531 532 533 534
		git config --get --file ../other-config ein.bahn >actual &&
		test_cmp expect actual
	)

'

535
test_expect_success 'refer config from subdirectory via --file' '
536 537
	(
		cd x &&
538
		git config --file=../other-config --get ein.bahn >actual &&
539 540 541 542
		test_cmp expect actual
	)
'

543 544 545 546 547 548 549
cat > expect << EOF
[ein]
	bahn = strasse
[anwohner]
	park = ausweis
EOF

550 551
test_expect_success '--set in alternative file' '
	git config --file=other-config anwohner.park ausweis &&
552 553
	test_cmp expect other-config
'
554

555 556 557 558 559 560 561 562 563 564 565
cat > .git/config << EOF
# Hallo
	#Bello
[branch "eins"]
	x = 1
[branch.eins]
	y = 1
	[branch "1 234 blabl/a"]
weird
EOF

J
Jeff King 已提交
566 567 568
test_expect_success 'rename section' '
	git config --rename-section branch.eins branch.zwei
'
569 570 571 572 573 574 575 576 577 578 579 580

cat > expect << EOF
# Hallo
	#Bello
[branch "zwei"]
	x = 1
[branch "zwei"]
	y = 1
	[branch "1 234 blabl/a"]
weird
EOF

J
Jeff King 已提交
581 582 583
test_expect_success 'rename succeeded' '
	test_cmp expect .git/config
'
584

J
Jeff King 已提交
585
test_expect_success 'rename non-existing section' '
586 587
	test_must_fail git config --rename-section \
		branch."world domination" branch.drei
J
Junio C Hamano 已提交
588
'
589

J
Jeff King 已提交
590 591 592
test_expect_success 'rename succeeded' '
	test_cmp expect .git/config
'
593

J
Jeff King 已提交
594 595 596
test_expect_success 'rename another section' '
	git config --rename-section branch."1 234 blabl/a" branch.drei
'
597 598 599 600 601 602 603 604 605 606 607 608

cat > expect << EOF
# Hallo
	#Bello
[branch "zwei"]
	x = 1
[branch "zwei"]
	y = 1
[branch "drei"]
weird
EOF

J
Jeff King 已提交
609 610 611
test_expect_success 'rename succeeded' '
	test_cmp expect .git/config
'
612 613 614 615 616

cat >> .git/config << EOF
[branch "vier"] z = 1
EOF

J
Jeff King 已提交
617 618 619
test_expect_success 'rename a section with a var on the same line' '
	git config --rename-section branch.vier branch.zwei
'
620 621 622 623 624 625 626 627 628 629 630 631 632 633

cat > expect << EOF
# Hallo
	#Bello
[branch "zwei"]
	x = 1
[branch "zwei"]
	y = 1
[branch "drei"]
weird
[branch "zwei"]
	z = 1
EOF

J
Jeff King 已提交
634 635 636
test_expect_success 'rename succeeded' '
	test_cmp expect .git/config
'
637

638 639 640 641 642 643 644 645
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"
'

646 647 648 649
cat >> .git/config << EOF
  [branch "zwei"] a = 1 [branch "vier"]
EOF

J
Jeff King 已提交
650 651 652
test_expect_success 'remove section' '
	git config --remove-section branch.zwei
'
653 654 655 656 657 658 659 660

cat > expect << EOF
# Hallo
	#Bello
[branch "drei"]
weird
EOF

J
Jeff King 已提交
661 662 663
test_expect_success 'section was removed properly' '
	test_cmp expect .git/config
'
664

665 666 667 668 669 670 671 672 673
cat > expect << EOF
[gitcvs]
	enabled = true
	dbname = %Ggitcvs2.%a.%m.sqlite
[gitcvs "ext"]
	dbname = %Ggitcvs1.%a.%m.sqlite
EOF

test_expect_success 'section ending' '
674
	rm -f .git/config &&
675 676 677
	git config gitcvs.enabled true &&
	git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
	git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
678
	test_cmp expect .git/config
679 680 681

'

682
test_expect_success numbers '
683 684
	git config kilo.gram 1k &&
	git config mega.ton 1m &&
J
Jeff King 已提交
685 686 687 688 689
	echo 1024 >expect &&
	echo 1048576 >>expect &&
	git config --int --get kilo.gram >actual &&
	git config --int --get mega.ton >>actual &&
	test_cmp expect actual
690 691
'

692 693 694 695 696 697 698
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
'

699 700
test_expect_success 'invalid unit' '
	git config aninvalid.unit "1auto" &&
J
Jeff King 已提交
701 702 703 704
	echo 1auto >expect &&
	git config aninvalid.unit >actual &&
	test_cmp expect actual &&
	test_must_fail git config --int --get aninvalid.unit 2>actual &&
705
	test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
706 707
'

708 709 710 711 712 713
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
'

714 715
test_expect_success 'invalid stdin config' '
	echo "[broken" | test_must_fail git config --list --file - >output 2>&1 &&
716
	test_i18ngrep "bad config line 1 in standard input" output
717 718
'

719 720 721 722 723 724 725 726 727 728 729 730 731
cat > expect << EOF
true
false
true
false
true
false
true
false
EOF

test_expect_success bool '

732 733 734 735 736 737 738 739
	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 &&
740 741 742
	rm -f result &&
	for i in 1 2 3 4
	do
743 744
	    git config --bool --get bool.true$i >>result
	    git config --bool --get bool.false$i >>result
745
        done &&
J
Jeff King 已提交
746
	test_cmp expect result'
747

J
Junio C Hamano 已提交
748
test_expect_success 'invalid bool (--get)' '
749

750
	git config bool.nobool foobar &&
751
	test_must_fail git config --bool --get bool.nobool'
752

J
Junio C Hamano 已提交
753
test_expect_success 'invalid bool (set)' '
754

755
	test_must_fail git config --bool bool.nobool foobar'
756 757 758 759 760 761 762 763 764 765 766 767 768 769 770

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' '

771
	rm -f .git/config &&
772 773 774 775 776 777 778 779
	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 &&
J
Jeff King 已提交
780
	test_cmp expect .git/config'
781 782 783 784 785 786 787 788 789 790

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

test_expect_success 'set --int' '

791
	rm -f .git/config &&
792 793 794
	git config --int int.val1 01 &&
	git config --int int.val2 -1 &&
	git config --int int.val3 5m &&
J
Jeff King 已提交
795 796
	test_cmp expect .git/config
'
797

J
Jeff King 已提交
798 799 800 801
test_expect_success 'get --bool-or-int' '
	cat >.git/config <<-\EOF &&
	[bool]
	true1
J
Junio C Hamano 已提交
802
	true2 = true
J
Jeff King 已提交
803 804
	false = false
	[int]
J
Junio C Hamano 已提交
805 806 807
	int1 = 0
	int2 = 1
	int3 = -1
J
Jeff King 已提交
808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
	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
J
Junio C Hamano 已提交
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840
'

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' '
841
	rm -f .git/config &&
J
Junio C Hamano 已提交
842 843 844 845 846 847 848 849 850 851
	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
'

852 853 854 855 856 857 858
cat >expect <<\EOF
[path]
	home = ~/
	normal = /dev/null
	trailingtilde = foo~
EOF

859
test_expect_success !MINGW 'set --path' '
860
	rm -f .git/config &&
861 862 863 864 865
	git config --path path.home "~/" &&
	git config --path path.normal "/dev/null" &&
	git config --path path.trailingtilde "foo~" &&
	test_cmp expect .git/config'

866
if test_have_prereq !MINGW && test "${HOME+set}"
867 868 869 870
then
	test_set_prereq HOMEVAR
fi

871 872 873 874 875 876
cat >expect <<EOF
$HOME/
/dev/null
foo~
EOF

877
test_expect_success HOMEVAR 'get --path' '
878 879 880 881 882 883
	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
'

884 885 886 887 888
cat >expect <<\EOF
/dev/null
foo~
EOF

889
test_expect_success !MINGW 'get --path copes with unset $HOME' '
890 891 892 893 894 895 896
	(
		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
	) &&
897
	test_i18ngrep "[Ff]ailed to expand.*~/" msg &&
898 899 900
	test_cmp expect result
'

901 902 903 904 905
test_expect_success 'get --path barfs on boolean variable' '
	echo "[path]bool" >.git/config &&
	test_must_fail git config --get --path path.bool
'

H
Haaris Mehmood 已提交
906 907 908 909 910 911 912 913 914 915 916 917 918
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 &&
919
	$(test-tool date timestamp $rel)
H
Haaris Mehmood 已提交
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
	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
'

936 937 938 939 940 941 942
cat > expect << EOF
[quote]
	leading = " test"
	ending = "test "
	semicolon = "test;test"
	hash = "test#test"
EOF
943
test_expect_success 'quoting' '
944
	rm -f .git/config &&
945 946 947 948 949 950
	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
'
951

J
Junio C Hamano 已提交
952
test_expect_success 'key with newline' '
953
	test_must_fail git config "key.with
J
Junio C Hamano 已提交
954
newline" 123'
955

956
test_expect_success 'value with newline' 'git config key.sub value.with\\\
957 958
newline'

959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974
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

975 976
test_expect_success 'value continued on next line' '
	git config --list > result &&
J
Jeff King 已提交
977
	test_cmp result expect
978
'
979

980 981 982 983 984 985 986 987 988 989
cat > .git/config <<\EOF
[section "sub=section"]
	val1 = foo=bar
	val2 = foo\nbar
	val3 = \n\n
	val4 =
	val5
EOF

cat > expect <<\EOF
A
Alex Riesen 已提交
990 991 992 993
section.sub=section.val1
foo=barQsection.sub=section.val2
foo
barQsection.sub=section.val3
994 995


A
Alex Riesen 已提交
996 997
Qsection.sub=section.val4
Qsection.sub=section.val5Q
998
EOF
999
test_expect_success '--null --list' '
1000 1001
	git config --null --list >result.raw &&
	nul_to_q <result.raw >result &&
1002 1003 1004
	echo >>result &&
	test_cmp expect result
'
1005

1006
test_expect_success '--null --get-regexp' '
1007 1008
	git config --null --get-regexp "val[0-9]" >result.raw &&
	nul_to_q <result.raw >result &&
1009 1010 1011
	echo >>result &&
	test_cmp expect result
'
1012

1013 1014
test_expect_success 'inner whitespace kept verbatim' '
	git config section.val "foo 	  bar" &&
J
Jeff King 已提交
1015 1016 1017
	echo "foo 	  bar" >expect &&
	git config section.val >actual &&
	test_cmp expect actual
1018 1019
'

1020
test_expect_success SYMLINKS 'symlinked configuration' '
1021
	ln -s notyet myconfig &&
1022
	git config --file=myconfig test.frotz nitfol &&
1023 1024
	test -h myconfig &&
	test -f notyet &&
1025 1026
	test "z$(git config --file=notyet test.frotz)" = znitfol &&
	git config --file=myconfig test.xyzzy rezrov &&
1027 1028
	test -h myconfig &&
	test -f notyet &&
J
Jeff King 已提交
1029 1030 1031 1032 1033
	cat >expect <<-\EOF &&
	nitfol
	rezrov
	EOF
	{
1034 1035
		git config --file=notyet test.frotz &&
		git config --file=notyet test.xyzzy
J
Jeff King 已提交
1036 1037
	} >actual &&
	test_cmp expect actual
1038 1039
'

1040
test_expect_success 'nonexistent configuration' '
1041 1042
	test_must_fail git config --file=doesnotexist --list &&
	test_must_fail git config --file=doesnotexist test.xyzzy
1043 1044 1045 1046 1047
'

test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
	ln -s doesnotexist linktonada &&
	ln -s linktonada linktolinktonada &&
1048 1049
	test_must_fail git config --file=linktonada --list &&
	test_must_fail git config --file=linktolinktonada --list
1050 1051
'

1052 1053 1054 1055 1056 1057 1058 1059
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
J
Jeff King 已提交
1060
"
1061

1062
test_expect_success 'git -c "key=value" support' '
J
Jeff King 已提交
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
	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 &&
1074 1075 1076
	test_must_fail git -c name=value config core.name
'

1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
# 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
'

1088 1089 1090 1091 1092 1093 1094
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 &&
1095 1096 1097 1098
	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 &&
1099 1100
	git config foo.bar true &&
	git config foo."ba =z".bar false
1101 1102
'

1103
test_expect_success 'git -c works with aliases of builtins' '
1104 1105 1106 1107 1108 1109
	git config alias.checkconfig "-c foo.check=bar config foo.check" &&
	echo bar >expect &&
	git checkconfig >actual &&
	test_cmp expect actual
'

1110
test_expect_success 'aliases can be CamelCased' '
1111 1112 1113 1114 1115 1116
	test_config alias.CamelCased "rev-parse HEAD" &&
	git CamelCased >out &&
	git rev-parse HEAD >expect &&
	test_cmp expect out
'

1117 1118 1119 1120 1121 1122
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
'

1123 1124 1125 1126 1127 1128 1129 1130
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
'

1131 1132 1133 1134
test_expect_success 'git -c complains about empty key and value' '
	test_must_fail git -c "" rev-parse
'

1135 1136 1137 1138 1139 1140 1141 1142 1143 1144
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
'

1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
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

1207 1208 1209 1210
test_expect_success 'git -c is not confused by empty environment' '
	GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
'

1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
sq="'"
test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
	cat >expect <<-\EOF &&
	env.one one
	env.two two
	EOF
	GIT_CONFIG_PARAMETERS="${sq}env.one=one${sq} ${sq}env.two=two${sq}" \
		git config --get-regexp "env.*" >actual &&
	test_cmp expect actual &&

	cat >expect <<-EOF &&
	env.one one${sq}
	env.two two
	EOF
	GIT_CONFIG_PARAMETERS="${sq}env.one=one${sq}\\$sq$sq$sq ${sq}env.two=two${sq}" \
		git config --get-regexp "env.*" >actual &&
	test_cmp expect actual &&

	test_must_fail env \
		GIT_CONFIG_PARAMETERS="${sq}env.one=one${sq}\\$sq ${sq}env.two=two${sq}" \
		git config --get-regexp "env.*"
'

1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
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
'

1251 1252 1253 1254 1255 1256 1257 1258
# 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 &&
1259
	test_i18ngrep " line 3 " error
1260 1261 1262 1263 1264 1265 1266 1267 1268
'

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 &&
1269
	test_i18ngrep " line 2 " error
1270 1271 1272 1273 1274 1275 1276 1277 1278
'

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 &&
1279
	test_i18ngrep " line 3 " error
1280 1281
'

1282 1283 1284 1285 1286 1287 1288 1289 1290
test_expect_success 'urlmatch' '
	cat >.git/config <<-\EOF &&
	[http]
		sslVerify
	[http "https://weak.example.com"]
		sslVerify = false
		cookieFile = /tmp/cookie.txt
	EOF

1291 1292 1293
	test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
	test_must_be_empty actual &&

1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309
	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
'

1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
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
1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331
	[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
1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351
	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 &&
1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411
	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 &&
1412 1413 1414
	test_cmp expect actual
'

1415
# good section hygiene
1416
test_expect_success '--unset last key removes section (except if commented)' '
1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
	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
1430 1431 1432 1433 1434 1435
	# a comment specific to this "section" section.
	[section]
	# some intervening lines
	# that should also be dropped

	# please be careful when you update the above variable
1436 1437 1438
	EOF

	git config --unset section.key &&
1439 1440 1441 1442 1443 1444 1445 1446 1447 1448
	test_cmp expect .git/config &&

	cat >.git/config <<-\EOF &&
	[section]
	key = value
	[next-section]
	EOF

	cat >expect <<-\EOF &&
	[next-section]
1449 1450 1451
	EOF

	git config --unset section.key &&
1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
	test_cmp expect .git/config &&

	q_to_tab >.git/config <<-\EOF &&
	[one]
	Qkey = "multiline \
	QQ# with comment"
	[two]
	key = true
	EOF
	git config --unset two.key &&
	! grep two .git/config &&

	q_to_tab >.git/config <<-\EOF &&
	[one]
	Qkey = "multiline \
	QQ# with comment"
	[one]
	key = true
	EOF
	git config --unset-all one.key &&
	test_line_count = 0 .git/config &&

	q_to_tab >.git/config <<-\EOF &&
	[one]
	Qkey = true
	Q# a comment not at the start
	[two]
	Qkey = true
	EOF
	git config --unset two.key &&
	grep two .git/config &&

	q_to_tab >.git/config <<-\EOF &&
	[one]
	Qkey = not [two "subsection"]
	[two "subsection"]
	[two "subsection"]
	Qkey = true
	[TWO "subsection"]
	[one]
	EOF
	git config --unset two.subsection.key &&
	test "not [two subsection]" = "$(git config one.key)" &&
	test_line_count = 3 .git/config
1496 1497
'

1498
test_expect_success '--unset-all removes section if empty & uncommented' '
1499 1500 1501 1502 1503 1504 1505 1506
	cat >.git/config <<-\EOF &&
	[section]
	key = value1
	key = value2
	EOF

	git config --unset-all section.key &&
	test_line_count = 0 .git/config
1507 1508
'

1509
test_expect_success 'adding a key into an empty section reuses header' '
1510 1511 1512 1513 1514 1515 1516 1517 1518
	cat >.git/config <<-\EOF &&
	[section]
	EOF

	q_to_tab >expect <<-\EOF &&
	[section]
	Qkey = value
	EOF

J
Jeff King 已提交
1519
	git config section.key value &&
1520 1521 1522
	test_cmp expect .git/config
'

1523 1524 1525 1526 1527 1528 1529 1530 1531 1532
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"
'

1533 1534 1535
! test_have_prereq MINGW ||
HOME="$(pwd)" # convert to Windows path

1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
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
'

1635
test_expect_success !MINGW '--show-origin escape special file name characters' '
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
	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
'

1664
test_expect_success !MINGW '--show-origin blob' '
1665
	blob=$(git hash-object -w "$CUSTOM_CONFIG_FILE") &&
1666 1667 1668
	cat >expect <<-EOF &&
		blob:$blob	user.custom=true
	EOF
1669 1670 1671 1672
	git config --blob=$blob --show-origin --list >output &&
	test_cmp expect output
'

1673
test_expect_success !MINGW '--show-origin blob ref' '
1674 1675 1676 1677 1678 1679 1680 1681 1682
	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
'

1683
test_expect_success '--local requires a repo' '
1684 1685 1686 1687 1688
	# 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
'

1689
test_expect_success '--replace-all does not invent newlines' '
1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
	q_to_tab >.git/config <<-\EOF &&
	[abc]key
	QkeepSection
	[xyz]
	Qkey = 1
	[abc]
	Qkey = a
	EOF
	q_to_tab >expect <<-\EOF &&
	[abc]
	QkeepSection
	[xyz]
	Qkey = 1
	[abc]
	Qkey = b
	EOF
	git config --replace-all abc.key b &&
	test_cmp .git/config expect
'

1710
test_done