ed75c5caffaea7c84d937d6be4b038d846f28775
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Johannes Schindelin
   4#
   5
   6test_description='Test git config in different settings'
   7
   8. ./test-lib.sh
   9
  10test_expect_success 'clear default config' '
  11        rm -f .git/config
  12'
  13
  14cat > expect << EOF
  15[core]
  16        penguin = little blue
  17EOF
  18test_expect_success 'initial' '
  19        git config core.penguin "little blue" &&
  20        test_cmp expect .git/config
  21'
  22
  23cat > expect << EOF
  24[core]
  25        penguin = little blue
  26        Movie = BadPhysics
  27EOF
  28test_expect_success 'mixed case' '
  29        git config Core.Movie BadPhysics &&
  30        test_cmp expect .git/config
  31'
  32
  33cat > expect << EOF
  34[core]
  35        penguin = little blue
  36        Movie = BadPhysics
  37[Cores]
  38        WhatEver = Second
  39EOF
  40test_expect_success 'similar section' '
  41        git config Cores.WhatEver Second &&
  42        test_cmp expect .git/config
  43'
  44
  45cat > expect << EOF
  46[core]
  47        penguin = little blue
  48        Movie = BadPhysics
  49        UPPERCASE = true
  50[Cores]
  51        WhatEver = Second
  52EOF
  53test_expect_success 'uppercase section' '
  54        git config CORE.UPPERCASE true &&
  55        test_cmp expect .git/config
  56'
  57
  58test_expect_success 'replace with non-match' '
  59        git config core.penguin kingpin !blue
  60'
  61
  62test_expect_success 'replace with non-match (actually matching)' '
  63        git config core.penguin "very blue" !kingpin
  64'
  65
  66cat > expect << EOF
  67[core]
  68        penguin = very blue
  69        Movie = BadPhysics
  70        UPPERCASE = true
  71        penguin = kingpin
  72[Cores]
  73        WhatEver = Second
  74EOF
  75
  76test_expect_success 'non-match result' 'test_cmp expect .git/config'
  77
  78test_expect_success 'find mixed-case key by canonical name' '
  79        echo Second >expect &&
  80        git config cores.whatever >actual &&
  81        test_cmp expect actual
  82'
  83
  84test_expect_success 'find mixed-case key by non-canonical name' '
  85        echo Second >expect &&
  86        git config CoReS.WhAtEvEr >actual &&
  87        test_cmp expect actual
  88'
  89
  90test_expect_success 'subsections are not canonicalized by git-config' '
  91        cat >>.git/config <<-\EOF &&
  92        [section.SubSection]
  93        key = one
  94        [section "SubSection"]
  95        key = two
  96        EOF
  97        echo one >expect &&
  98        git config section.subsection.key >actual &&
  99        test_cmp expect actual &&
 100        echo two >expect &&
 101        git config section.SubSection.key >actual &&
 102        test_cmp expect actual
 103'
 104
 105cat > .git/config <<\EOF
 106[alpha]
 107bar = foo
 108[beta]
 109baz = multiple \
 110lines
 111EOF
 112
 113test_expect_success 'unset with cont. lines' '
 114        git config --unset beta.baz
 115'
 116
 117cat > expect <<\EOF
 118[alpha]
 119bar = foo
 120[beta]
 121EOF
 122
 123test_expect_success 'unset with cont. lines is correct' 'test_cmp expect .git/config'
 124
 125cat > .git/config << EOF
 126[beta] ; silly comment # another comment
 127noIndent= sillyValue ; 'nother silly comment
 128
 129# empty line
 130                ; comment
 131                haha   ="beta" # last silly comment
 132haha = hello
 133        haha = bello
 134[nextSection] noNewline = ouch
 135EOF
 136
 137cp .git/config .git/config2
 138
 139test_expect_success 'multiple unset' '
 140        git config --unset-all beta.haha
 141'
 142
 143cat > expect << EOF
 144[beta] ; silly comment # another comment
 145noIndent= sillyValue ; 'nother silly comment
 146
 147# empty line
 148                ; comment
 149[nextSection] noNewline = ouch
 150EOF
 151
 152test_expect_success 'multiple unset is correct' '
 153        test_cmp expect .git/config
 154'
 155
 156cp .git/config2 .git/config
 157
 158test_expect_success '--replace-all missing value' '
 159        test_must_fail git config --replace-all beta.haha &&
 160        test_cmp .git/config2 .git/config
 161'
 162
 163rm .git/config2
 164
 165test_expect_success '--replace-all' '
 166        git config --replace-all beta.haha gamma
 167'
 168
 169cat > expect << EOF
 170[beta] ; silly comment # another comment
 171noIndent= sillyValue ; 'nother silly comment
 172
 173# empty line
 174                ; comment
 175        haha = gamma
 176[nextSection] noNewline = ouch
 177EOF
 178
 179test_expect_success 'all replaced' '
 180        test_cmp expect .git/config
 181'
 182
 183cat > expect << EOF
 184[beta] ; silly comment # another comment
 185noIndent= sillyValue ; 'nother silly comment
 186
 187# empty line
 188                ; comment
 189        haha = alpha
 190[nextSection] noNewline = ouch
 191EOF
 192test_expect_success 'really mean test' '
 193        git config beta.haha alpha &&
 194        test_cmp expect .git/config
 195'
 196
 197cat > expect << EOF
 198[beta] ; silly comment # another comment
 199noIndent= sillyValue ; 'nother silly comment
 200
 201# empty line
 202                ; comment
 203        haha = alpha
 204[nextSection]
 205        nonewline = wow
 206EOF
 207test_expect_success 'really really mean test' '
 208        git config nextsection.nonewline wow &&
 209        test_cmp expect .git/config
 210'
 211
 212test_expect_success 'get value' '
 213        echo alpha >expect &&
 214        git config beta.haha >actual &&
 215        test_cmp expect actual
 216'
 217
 218cat > expect << EOF
 219[beta] ; silly comment # another comment
 220noIndent= sillyValue ; 'nother silly comment
 221
 222# empty line
 223                ; comment
 224[nextSection]
 225        nonewline = wow
 226EOF
 227test_expect_success 'unset' '
 228        git config --unset beta.haha &&
 229        test_cmp expect .git/config
 230'
 231
 232cat > expect << EOF
 233[beta] ; silly comment # another comment
 234noIndent= sillyValue ; 'nother silly comment
 235
 236# empty line
 237                ; comment
 238[nextSection]
 239        nonewline = wow
 240        NoNewLine = wow2 for me
 241EOF
 242test_expect_success 'multivar' '
 243        git config nextsection.NoNewLine "wow2 for me" "for me$" &&
 244        test_cmp expect .git/config
 245'
 246
 247test_expect_success 'non-match' '
 248        git config --get nextsection.nonewline !for
 249'
 250
 251test_expect_success 'non-match value' '
 252        echo wow >expect &&
 253        git config --get nextsection.nonewline !for >actual &&
 254        test_cmp expect actual
 255'
 256
 257test_expect_success 'ambiguous get' '
 258        test_must_fail git config --get nextsection.nonewline
 259'
 260
 261test_expect_success 'get multivar' '
 262        git config --get-all nextsection.nonewline
 263'
 264
 265cat > expect << EOF
 266[beta] ; silly comment # another comment
 267noIndent= sillyValue ; 'nother silly comment
 268
 269# empty line
 270                ; comment
 271[nextSection]
 272        nonewline = wow3
 273        NoNewLine = wow2 for me
 274EOF
 275test_expect_success 'multivar replace' '
 276        git config nextsection.nonewline "wow3" "wow$" &&
 277        test_cmp expect .git/config
 278'
 279
 280test_expect_success 'ambiguous unset' '
 281        test_must_fail git config --unset nextsection.nonewline
 282'
 283
 284test_expect_success 'invalid unset' '
 285        test_must_fail git config --unset somesection.nonewline
 286'
 287
 288cat > expect << EOF
 289[beta] ; silly comment # another comment
 290noIndent= sillyValue ; 'nother silly comment
 291
 292# empty line
 293                ; comment
 294[nextSection]
 295        NoNewLine = wow2 for me
 296EOF
 297
 298test_expect_success 'multivar unset' '
 299        git config --unset nextsection.nonewline "wow3$" &&
 300        test_cmp expect .git/config
 301'
 302
 303test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
 304
 305test_expect_success 'correct key' 'git config 123456.a123 987'
 306
 307test_expect_success 'hierarchical section' '
 308        git config Version.1.2.3eX.Alpha beta
 309'
 310
 311cat > expect << EOF
 312[beta] ; silly comment # another comment
 313noIndent= sillyValue ; 'nother silly comment
 314
 315# empty line
 316                ; comment
 317[nextSection]
 318        NoNewLine = wow2 for me
 319[123456]
 320        a123 = 987
 321[Version "1.2.3eX"]
 322        Alpha = beta
 323EOF
 324
 325test_expect_success 'hierarchical section value' '
 326        test_cmp expect .git/config
 327'
 328
 329cat > expect << EOF
 330beta.noindent=sillyValue
 331nextsection.nonewline=wow2 for me
 332123456.a123=987
 333version.1.2.3eX.alpha=beta
 334EOF
 335
 336test_expect_success 'working --list' '
 337        git config --list > output &&
 338        test_cmp expect output
 339'
 340cat > expect << EOF
 341EOF
 342
 343test_expect_success '--list without repo produces empty output' '
 344        git --git-dir=nonexistent config --list >output &&
 345        test_cmp expect output
 346'
 347
 348cat > expect << EOF
 349beta.noindent sillyValue
 350nextsection.nonewline wow2 for me
 351EOF
 352
 353test_expect_success '--get-regexp' '
 354        git config --get-regexp in >output &&
 355        test_cmp expect output
 356'
 357
 358cat > expect << EOF
 359wow2 for me
 360wow4 for you
 361EOF
 362
 363test_expect_success '--add' '
 364        git config --add nextsection.nonewline "wow4 for you" &&
 365        git config --get-all nextsection.nonewline > output &&
 366        test_cmp expect output
 367'
 368
 369cat > .git/config << EOF
 370[novalue]
 371        variable
 372[emptyvalue]
 373        variable =
 374EOF
 375
 376test_expect_success 'get variable with no value' '
 377        git config --get novalue.variable ^$
 378'
 379
 380test_expect_success 'get variable with empty value' '
 381        git config --get emptyvalue.variable ^$
 382'
 383
 384echo novalue.variable > expect
 385
 386test_expect_success 'get-regexp variable with no value' '
 387        git config --get-regexp novalue > output &&
 388        test_cmp expect output
 389'
 390
 391echo 'novalue.variable true' > expect
 392
 393test_expect_success 'get-regexp --bool variable with no value' '
 394        git config --bool --get-regexp novalue > output &&
 395        test_cmp expect output
 396'
 397
 398echo 'emptyvalue.variable ' > expect
 399
 400test_expect_success 'get-regexp variable with empty value' '
 401        git config --get-regexp emptyvalue > output &&
 402        test_cmp expect output
 403'
 404
 405echo true > expect
 406
 407test_expect_success 'get bool variable with no value' '
 408        git config --bool novalue.variable > output &&
 409        test_cmp expect output
 410'
 411
 412echo false > expect
 413
 414test_expect_success 'get bool variable with empty value' '
 415        git config --bool emptyvalue.variable > output &&
 416        test_cmp expect output
 417'
 418
 419test_expect_success 'no arguments, but no crash' '
 420        test_must_fail git config >output 2>&1 &&
 421        test_i18ngrep usage output
 422'
 423
 424cat > .git/config << EOF
 425[a.b]
 426        c = d
 427EOF
 428
 429cat > expect << EOF
 430[a.b]
 431        c = d
 432[a]
 433        x = y
 434EOF
 435
 436test_expect_success 'new section is partial match of another' '
 437        git config a.x y &&
 438        test_cmp expect .git/config
 439'
 440
 441cat > expect << EOF
 442[a.b]
 443        c = d
 444[a]
 445        x = y
 446        b = c
 447[b]
 448        x = y
 449EOF
 450
 451test_expect_success 'new variable inserts into proper section' '
 452        git config b.x y &&
 453        git config a.b c &&
 454        test_cmp expect .git/config
 455'
 456
 457test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' '
 458        test_must_fail git config --file non-existing-config -l
 459'
 460
 461cat > other-config << EOF
 462[ein]
 463        bahn = strasse
 464EOF
 465
 466cat > expect << EOF
 467ein.bahn=strasse
 468EOF
 469
 470test_expect_success 'alternative GIT_CONFIG' '
 471        GIT_CONFIG=other-config git config -l >output &&
 472        test_cmp expect output
 473'
 474
 475test_expect_success 'alternative GIT_CONFIG (--file)' '
 476        git config --file other-config -l > output &&
 477        test_cmp expect output
 478'
 479
 480test_expect_success 'refer config from subdirectory' '
 481        mkdir x &&
 482        (
 483                cd x &&
 484                echo strasse >expect &&
 485                git config --get --file ../other-config ein.bahn >actual &&
 486                test_cmp expect actual
 487        )
 488
 489'
 490
 491test_expect_success 'refer config from subdirectory via GIT_CONFIG' '
 492        (
 493                cd x &&
 494                GIT_CONFIG=../other-config git config --get ein.bahn >actual &&
 495                test_cmp expect actual
 496        )
 497'
 498
 499cat > expect << EOF
 500[ein]
 501        bahn = strasse
 502[anwohner]
 503        park = ausweis
 504EOF
 505
 506test_expect_success '--set in alternative GIT_CONFIG' '
 507        GIT_CONFIG=other-config git config anwohner.park ausweis &&
 508        test_cmp expect other-config
 509'
 510
 511cat > .git/config << EOF
 512# Hallo
 513        #Bello
 514[branch "eins"]
 515        x = 1
 516[branch.eins]
 517        y = 1
 518        [branch "1 234 blabl/a"]
 519weird
 520EOF
 521
 522test_expect_success 'rename section' '
 523        git config --rename-section branch.eins branch.zwei
 524'
 525
 526cat > expect << EOF
 527# Hallo
 528        #Bello
 529[branch "zwei"]
 530        x = 1
 531[branch "zwei"]
 532        y = 1
 533        [branch "1 234 blabl/a"]
 534weird
 535EOF
 536
 537test_expect_success 'rename succeeded' '
 538        test_cmp expect .git/config
 539'
 540
 541test_expect_success 'rename non-existing section' '
 542        test_must_fail git config --rename-section \
 543                branch."world domination" branch.drei
 544'
 545
 546test_expect_success 'rename succeeded' '
 547        test_cmp expect .git/config
 548'
 549
 550test_expect_success 'rename another section' '
 551        git config --rename-section branch."1 234 blabl/a" branch.drei
 552'
 553
 554cat > expect << EOF
 555# Hallo
 556        #Bello
 557[branch "zwei"]
 558        x = 1
 559[branch "zwei"]
 560        y = 1
 561[branch "drei"]
 562weird
 563EOF
 564
 565test_expect_success 'rename succeeded' '
 566        test_cmp expect .git/config
 567'
 568
 569cat >> .git/config << EOF
 570[branch "vier"] z = 1
 571EOF
 572
 573test_expect_success 'rename a section with a var on the same line' '
 574        git config --rename-section branch.vier branch.zwei
 575'
 576
 577cat > expect << EOF
 578# Hallo
 579        #Bello
 580[branch "zwei"]
 581        x = 1
 582[branch "zwei"]
 583        y = 1
 584[branch "drei"]
 585weird
 586[branch "zwei"]
 587        z = 1
 588EOF
 589
 590test_expect_success 'rename succeeded' '
 591        test_cmp expect .git/config
 592'
 593
 594test_expect_success 'renaming empty section name is rejected' '
 595        test_must_fail git config --rename-section branch.zwei ""
 596'
 597
 598test_expect_success 'renaming to bogus section is rejected' '
 599        test_must_fail git config --rename-section branch.zwei "bogus name"
 600'
 601
 602cat >> .git/config << EOF
 603  [branch "zwei"] a = 1 [branch "vier"]
 604EOF
 605
 606test_expect_success 'remove section' '
 607        git config --remove-section branch.zwei
 608'
 609
 610cat > expect << EOF
 611# Hallo
 612        #Bello
 613[branch "drei"]
 614weird
 615EOF
 616
 617test_expect_success 'section was removed properly' '
 618        test_cmp expect .git/config
 619'
 620
 621cat > expect << EOF
 622[gitcvs]
 623        enabled = true
 624        dbname = %Ggitcvs2.%a.%m.sqlite
 625[gitcvs "ext"]
 626        dbname = %Ggitcvs1.%a.%m.sqlite
 627EOF
 628
 629test_expect_success 'section ending' '
 630        rm -f .git/config &&
 631        git config gitcvs.enabled true &&
 632        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 633        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 634        test_cmp expect .git/config
 635
 636'
 637
 638test_expect_success numbers '
 639        git config kilo.gram 1k &&
 640        git config mega.ton 1m &&
 641        echo 1024 >expect &&
 642        echo 1048576 >>expect &&
 643        git config --int --get kilo.gram >actual &&
 644        git config --int --get mega.ton >>actual &&
 645        test_cmp expect actual
 646'
 647
 648test_expect_success 'invalid unit' '
 649        git config aninvalid.unit "1auto" &&
 650        echo 1auto >expect &&
 651        git config aninvalid.unit >actual &&
 652        test_cmp expect actual &&
 653        cat > expect <<-\EOF
 654        fatal: bad config value for '\''aninvalid.unit'\'' in .git/config
 655        EOF
 656        test_must_fail git config --int --get aninvalid.unit 2>actual &&
 657        test_cmp actual expect
 658'
 659
 660cat > expect << EOF
 661true
 662false
 663true
 664false
 665true
 666false
 667true
 668false
 669EOF
 670
 671test_expect_success bool '
 672
 673        git config bool.true1 01 &&
 674        git config bool.true2 -1 &&
 675        git config bool.true3 YeS &&
 676        git config bool.true4 true &&
 677        git config bool.false1 000 &&
 678        git config bool.false2 "" &&
 679        git config bool.false3 nO &&
 680        git config bool.false4 FALSE &&
 681        rm -f result &&
 682        for i in 1 2 3 4
 683        do
 684            git config --bool --get bool.true$i >>result
 685            git config --bool --get bool.false$i >>result
 686        done &&
 687        test_cmp expect result'
 688
 689test_expect_success 'invalid bool (--get)' '
 690
 691        git config bool.nobool foobar &&
 692        test_must_fail git config --bool --get bool.nobool'
 693
 694test_expect_success 'invalid bool (set)' '
 695
 696        test_must_fail git config --bool bool.nobool foobar'
 697
 698cat > expect <<\EOF
 699[bool]
 700        true1 = true
 701        true2 = true
 702        true3 = true
 703        true4 = true
 704        false1 = false
 705        false2 = false
 706        false3 = false
 707        false4 = false
 708EOF
 709
 710test_expect_success 'set --bool' '
 711
 712        rm -f .git/config &&
 713        git config --bool bool.true1 01 &&
 714        git config --bool bool.true2 -1 &&
 715        git config --bool bool.true3 YeS &&
 716        git config --bool bool.true4 true &&
 717        git config --bool bool.false1 000 &&
 718        git config --bool bool.false2 "" &&
 719        git config --bool bool.false3 nO &&
 720        git config --bool bool.false4 FALSE &&
 721        test_cmp expect .git/config'
 722
 723cat > expect <<\EOF
 724[int]
 725        val1 = 1
 726        val2 = -1
 727        val3 = 5242880
 728EOF
 729
 730test_expect_success 'set --int' '
 731
 732        rm -f .git/config &&
 733        git config --int int.val1 01 &&
 734        git config --int int.val2 -1 &&
 735        git config --int int.val3 5m &&
 736        test_cmp expect .git/config
 737'
 738
 739test_expect_success 'get --bool-or-int' '
 740        cat >.git/config <<-\EOF &&
 741        [bool]
 742        true1
 743        true2 = true
 744        false = false
 745        [int]
 746        int1 = 0
 747        int2 = 1
 748        int3 = -1
 749        EOF
 750        cat >expect <<-\EOF &&
 751        true
 752        true
 753        false
 754        0
 755        1
 756        -1
 757        EOF
 758        {
 759                git config --bool-or-int bool.true1 &&
 760                git config --bool-or-int bool.true2 &&
 761                git config --bool-or-int bool.false &&
 762                git config --bool-or-int int.int1 &&
 763                git config --bool-or-int int.int2 &&
 764                git config --bool-or-int int.int3
 765        } >actual &&
 766        test_cmp expect actual
 767'
 768
 769cat >expect <<\EOF
 770[bool]
 771        true1 = true
 772        false1 = false
 773        true2 = true
 774        false2 = false
 775[int]
 776        int1 = 0
 777        int2 = 1
 778        int3 = -1
 779EOF
 780
 781test_expect_success 'set --bool-or-int' '
 782        rm -f .git/config &&
 783        git config --bool-or-int bool.true1 true &&
 784        git config --bool-or-int bool.false1 false &&
 785        git config --bool-or-int bool.true2 yes &&
 786        git config --bool-or-int bool.false2 no &&
 787        git config --bool-or-int int.int1 0 &&
 788        git config --bool-or-int int.int2 1 &&
 789        git config --bool-or-int int.int3 -1 &&
 790        test_cmp expect .git/config
 791'
 792
 793cat >expect <<\EOF
 794[path]
 795        home = ~/
 796        normal = /dev/null
 797        trailingtilde = foo~
 798EOF
 799
 800test_expect_success NOT_MINGW 'set --path' '
 801        rm -f .git/config &&
 802        git config --path path.home "~/" &&
 803        git config --path path.normal "/dev/null" &&
 804        git config --path path.trailingtilde "foo~" &&
 805        test_cmp expect .git/config'
 806
 807if test_have_prereq NOT_MINGW && test "${HOME+set}"
 808then
 809        test_set_prereq HOMEVAR
 810fi
 811
 812cat >expect <<EOF
 813$HOME/
 814/dev/null
 815foo~
 816EOF
 817
 818test_expect_success HOMEVAR 'get --path' '
 819        git config --get --path path.home > result &&
 820        git config --get --path path.normal >> result &&
 821        git config --get --path path.trailingtilde >> result &&
 822        test_cmp expect result
 823'
 824
 825cat >expect <<\EOF
 826/dev/null
 827foo~
 828EOF
 829
 830test_expect_success NOT_MINGW 'get --path copes with unset $HOME' '
 831        (
 832                unset HOME;
 833                test_must_fail git config --get --path path.home \
 834                        >result 2>msg &&
 835                git config --get --path path.normal >>result &&
 836                git config --get --path path.trailingtilde >>result
 837        ) &&
 838        grep "[Ff]ailed to expand.*~/" msg &&
 839        test_cmp expect result
 840'
 841
 842cat > expect << EOF
 843[quote]
 844        leading = " test"
 845        ending = "test "
 846        semicolon = "test;test"
 847        hash = "test#test"
 848EOF
 849test_expect_success 'quoting' '
 850        rm -f .git/config &&
 851        git config quote.leading " test" &&
 852        git config quote.ending "test " &&
 853        git config quote.semicolon "test;test" &&
 854        git config quote.hash "test#test" &&
 855        test_cmp expect .git/config
 856'
 857
 858test_expect_success 'key with newline' '
 859        test_must_fail git config "key.with
 860newline" 123'
 861
 862test_expect_success 'value with newline' 'git config key.sub value.with\\\
 863newline'
 864
 865cat > .git/config <<\EOF
 866[section]
 867        ; comment \
 868        continued = cont\
 869inued
 870        noncont   = not continued ; \
 871        quotecont = "cont;\
 872inued"
 873EOF
 874
 875cat > expect <<\EOF
 876section.continued=continued
 877section.noncont=not continued
 878section.quotecont=cont;inued
 879EOF
 880
 881test_expect_success 'value continued on next line' '
 882        git config --list > result &&
 883        test_cmp result expect
 884'
 885
 886cat > .git/config <<\EOF
 887[section "sub=section"]
 888        val1 = foo=bar
 889        val2 = foo\nbar
 890        val3 = \n\n
 891        val4 =
 892        val5
 893EOF
 894
 895cat > expect <<\EOF
 896section.sub=section.val1
 897foo=barQsection.sub=section.val2
 898foo
 899barQsection.sub=section.val3
 900
 901
 902Qsection.sub=section.val4
 903Qsection.sub=section.val5Q
 904EOF
 905test_expect_success '--null --list' '
 906        git config --null --list | nul_to_q >result &&
 907        echo >>result &&
 908        test_cmp expect result
 909'
 910
 911test_expect_success '--null --get-regexp' '
 912        git config --null --get-regexp "val[0-9]" | nul_to_q >result &&
 913        echo >>result &&
 914        test_cmp expect result
 915'
 916
 917test_expect_success 'inner whitespace kept verbatim' '
 918        git config section.val "foo       bar" &&
 919        echo "foo         bar" >expect &&
 920        git config section.val >actual &&
 921        test_cmp expect actual
 922'
 923
 924test_expect_success SYMLINKS 'symlinked configuration' '
 925        ln -s notyet myconfig &&
 926        GIT_CONFIG=myconfig git config test.frotz nitfol &&
 927        test -h myconfig &&
 928        test -f notyet &&
 929        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 930        GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
 931        test -h myconfig &&
 932        test -f notyet &&
 933        cat >expect <<-\EOF &&
 934        nitfol
 935        rezrov
 936        EOF
 937        {
 938                GIT_CONFIG=notyet git config test.frotz &&
 939                GIT_CONFIG=notyet git config test.xyzzy
 940        } >actual &&
 941        test_cmp expect actual
 942'
 943
 944test_expect_success 'nonexistent configuration' '
 945        (
 946                GIT_CONFIG=doesnotexist &&
 947                export GIT_CONFIG &&
 948                test_must_fail git config --list &&
 949                test_must_fail git config test.xyzzy
 950        )
 951'
 952
 953test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
 954        ln -s doesnotexist linktonada &&
 955        ln -s linktonada linktolinktonada &&
 956        (
 957                GIT_CONFIG=linktonada &&
 958                export GIT_CONFIG &&
 959                test_must_fail git config --list &&
 960                GIT_CONFIG=linktolinktonada &&
 961                test_must_fail git config --list
 962        )
 963'
 964
 965test_expect_success 'check split_cmdline return' "
 966        git config alias.split-cmdline-fix 'echo \"' &&
 967        test_must_fail git split-cmdline-fix &&
 968        echo foo > foo &&
 969        git add foo &&
 970        git commit -m 'initial commit' &&
 971        git config branch.master.mergeoptions 'echo \"' &&
 972        test_must_fail git merge master
 973"
 974
 975test_expect_success 'git -c "key=value" support' '
 976        cat >expect <<-\EOF &&
 977        value
 978        value
 979        true
 980        EOF
 981        {
 982                git -c core.name=value config core.name &&
 983                git -c foo.CamelCase=value config foo.camelcase &&
 984                git -c foo.flag config --bool foo.flag
 985        } >actual &&
 986        test_cmp expect actual &&
 987        test_must_fail git -c name=value config core.name
 988'
 989
 990test_expect_success 'key sanity-checking' '
 991        test_must_fail git config foo=bar &&
 992        test_must_fail git config foo=.bar &&
 993        test_must_fail git config foo.ba=r &&
 994        test_must_fail git config foo.1bar &&
 995        test_must_fail git config foo."ba
 996                                z".bar &&
 997        test_must_fail git config . false &&
 998        test_must_fail git config .foo false &&
 999        test_must_fail git config foo. false &&
1000        test_must_fail git config .foo. false &&
1001        git config foo.bar true &&
1002        git config foo."ba =z".bar false
1003'
1004
1005test_expect_success 'git -c works with aliases of builtins' '
1006        git config alias.checkconfig "-c foo.check=bar config foo.check" &&
1007        echo bar >expect &&
1008        git checkconfig >actual &&
1009        test_cmp expect actual
1010'
1011
1012test_expect_success 'git -c does not split values on equals' '
1013        echo "value with = in it" >expect &&
1014        git -c core.foo="value with = in it" config core.foo >actual &&
1015        test_cmp expect actual
1016'
1017
1018test_expect_success 'git -c dies on bogus config' '
1019        test_must_fail git -c core.bare=foo rev-parse
1020'
1021
1022test_expect_success 'git -c complains about empty key' '
1023        test_must_fail git -c "=foo" rev-parse
1024'
1025
1026test_expect_success 'git -c complains about empty key and value' '
1027        test_must_fail git -c "" rev-parse
1028'
1029
1030test_expect_success 'git config --edit works' '
1031        git config -f tmp test.value no &&
1032        echo test.value=yes >expect &&
1033        GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
1034        git config -f tmp --list >actual &&
1035        test_cmp expect actual
1036'
1037
1038test_expect_success 'git config --edit respects core.editor' '
1039        git config -f tmp test.value no &&
1040        echo test.value=yes >expect &&
1041        test_config core.editor "echo [test]value=yes >" &&
1042        git config -f tmp --edit &&
1043        git config -f tmp --list >actual &&
1044        test_cmp expect actual
1045'
1046
1047# malformed configuration files
1048test_expect_success 'barf on syntax error' '
1049        cat >.git/config <<-\EOF &&
1050        # broken section line
1051        [section]
1052        key garbage
1053        EOF
1054        test_must_fail git config --get section.key >actual 2>error &&
1055        grep " line 3 " error
1056'
1057
1058test_expect_success 'barf on incomplete section header' '
1059        cat >.git/config <<-\EOF &&
1060        # broken section line
1061        [section
1062        key = value
1063        EOF
1064        test_must_fail git config --get section.key >actual 2>error &&
1065        grep " line 2 " error
1066'
1067
1068test_expect_success 'barf on incomplete string' '
1069        cat >.git/config <<-\EOF &&
1070        # broken section line
1071        [section]
1072        key = "value string
1073        EOF
1074        test_must_fail git config --get section.key >actual 2>error &&
1075        grep " line 3 " error
1076'
1077
1078test_done