1#!/bin/sh
   2#
   3# Copyright (c) 2005 Johannes Schindelin
   4#
   5test_description='Test git config in different settings'
   7. ./test-lib.sh
   9test_expect_success 'clear default config' '
  11        rm -f .git/config
  12'
  13cat > 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'
  22cat > 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'
  32cat > 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'
  44cat > 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'
  57test_expect_success 'replace with non-match' '
  59        git config core.penguin kingpin !blue
  60'
  61test_expect_success 'replace with non-match (actually matching)' '
  63        git config core.penguin "very blue" !kingpin
  64'
  65cat > expect << EOF
  67[core]
  68        penguin = very blue
  69        Movie = BadPhysics
  70        UPPERCASE = true
  71        penguin = kingpin
  72[Cores]
  73        WhatEver = Second
  74EOF
  75test_expect_success 'non-match result' 'test_cmp expect .git/config'
  77test_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'
  83test_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'
  89test_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'
 104cat > .git/config <<\EOF
 106[alpha]
 107bar = foo
 108[beta]
 109baz = multiple \
 110lines
 111EOF
 112test_expect_success 'unset with cont. lines' '
 114        git config --unset beta.baz
 115'
 116cat > expect <<\EOF
 118[alpha]
 119bar = foo
 120[beta]
 121EOF
 122test_expect_success 'unset with cont. lines is correct' 'test_cmp expect .git/config'
 124cat > .git/config << EOF
 126[beta] ; silly comment # another comment
 127noIndent= sillyValue ; 'nother silly comment
 128# empty line
 130                ; comment
 131                haha   ="beta" # last silly comment
 132haha = hello
 133        haha = bello
 134[nextSection] noNewline = ouch
 135EOF
 136cp .git/config .git/config2
 138test_expect_success 'multiple unset' '
 140        git config --unset-all beta.haha
 141'
 142cat > expect << EOF
 144[beta] ; silly comment # another comment
 145noIndent= sillyValue ; 'nother silly comment
 146# empty line
 148                ; comment
 149[nextSection] noNewline = ouch
 150EOF
 151test_expect_success 'multiple unset is correct' '
 153        test_cmp expect .git/config
 154'
 155cp .git/config2 .git/config
 157test_expect_success '--replace-all missing value' '
 159        test_must_fail git config --replace-all beta.haha &&
 160        test_cmp .git/config2 .git/config
 161'
 162rm .git/config2
 164test_expect_success '--replace-all' '
 166        git config --replace-all beta.haha gamma
 167'
 168cat > expect << EOF
 170[beta] ; silly comment # another comment
 171noIndent= sillyValue ; 'nother silly comment
 172# empty line
 174                ; comment
 175        haha = gamma
 176[nextSection] noNewline = ouch
 177EOF
 178test_expect_success 'all replaced' '
 180        test_cmp expect .git/config
 181'
 182cat > expect << EOF
 184[beta] ; silly comment # another comment
 185noIndent= sillyValue ; 'nother silly comment
 186# 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'
 196cat > expect << EOF
 198[beta] ; silly comment # another comment
 199noIndent= sillyValue ; 'nother silly comment
 200# 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'
 211test_expect_success 'get value' '
 213        echo alpha >expect &&
 214        git config beta.haha >actual &&
 215        test_cmp expect actual
 216'
 217cat > expect << EOF
 219[beta] ; silly comment # another comment
 220noIndent= sillyValue ; 'nother silly comment
 221# 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'
 231cat > expect << EOF
 233[beta] ; silly comment # another comment
 234noIndent= sillyValue ; 'nother silly comment
 235# 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'
 246test_expect_success 'non-match' '
 248        git config --get nextsection.nonewline !for
 249'
 250test_expect_success 'non-match value' '
 252        echo wow >expect &&
 253        git config --get nextsection.nonewline !for >actual &&
 254        test_cmp expect actual
 255'
 256test_expect_success 'multi-valued get returns final one' '
 258        echo "wow2 for me" >expect &&
 259        git config --get nextsection.nonewline >actual &&
 260        test_cmp expect actual
 261'
 262test_expect_success 'multi-valued get-all returns all' '
 264        cat >expect <<-\EOF &&
 265        wow
 266        wow2 for me
 267        EOF
 268        git config --get-all nextsection.nonewline >actual &&
 269        test_cmp expect actual
 270'
 271cat > expect << EOF
 273[beta] ; silly comment # another comment
 274noIndent= sillyValue ; 'nother silly comment
 275# empty line
 277                ; comment
 278[nextSection]
 279        nonewline = wow3
 280        NoNewLine = wow2 for me
 281EOF
 282test_expect_success 'multivar replace' '
 283        git config nextsection.nonewline "wow3" "wow$" &&
 284        test_cmp expect .git/config
 285'
 286test_expect_success 'ambiguous unset' '
 288        test_must_fail git config --unset nextsection.nonewline
 289'
 290test_expect_success 'invalid unset' '
 292        test_must_fail git config --unset somesection.nonewline
 293'
 294cat > expect << EOF
 296[beta] ; silly comment # another comment
 297noIndent= sillyValue ; 'nother silly comment
 298# empty line
 300                ; comment
 301[nextSection]
 302        NoNewLine = wow2 for me
 303EOF
 304test_expect_success 'multivar unset' '
 306        git config --unset nextsection.nonewline "wow3$" &&
 307        test_cmp expect .git/config
 308'
 309test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
 311test_expect_success 'correct key' 'git config 123456.a123 987'
 313test_expect_success 'hierarchical section' '
 315        git config Version.1.2.3eX.Alpha beta
 316'
 317cat > expect << EOF
 319[beta] ; silly comment # another comment
 320noIndent= sillyValue ; 'nother silly comment
 321# empty line
 323                ; comment
 324[nextSection]
 325        NoNewLine = wow2 for me
 326[123456]
 327        a123 = 987
 328[Version "1.2.3eX"]
 329        Alpha = beta
 330EOF
 331test_expect_success 'hierarchical section value' '
 333        test_cmp expect .git/config
 334'
 335cat > expect << EOF
 337beta.noindent=sillyValue
 338nextsection.nonewline=wow2 for me
 339123456.a123=987
 340version.1.2.3eX.alpha=beta
 341EOF
 342test_expect_success 'working --list' '
 344        git config --list > output &&
 345        test_cmp expect output
 346'
 347cat > expect << EOF
 348EOF
 349test_expect_success '--list without repo produces empty output' '
 351        git --git-dir=nonexistent config --list >output &&
 352        test_cmp expect output
 353'
 354cat > expect << EOF
 356beta.noindent sillyValue
 357nextsection.nonewline wow2 for me
 358EOF
 359test_expect_success '--get-regexp' '
 361        git config --get-regexp in >output &&
 362        test_cmp expect output
 363'
 364cat > expect << EOF
 366wow2 for me
 367wow4 for you
 368EOF
 369test_expect_success '--add' '
 371        git config --add nextsection.nonewline "wow4 for you" &&
 372        git config --get-all nextsection.nonewline > output &&
 373        test_cmp expect output
 374'
 375cat > .git/config << EOF
 377[novalue]
 378        variable
 379[emptyvalue]
 380        variable =
 381EOF
 382test_expect_success 'get variable with no value' '
 384        git config --get novalue.variable ^$
 385'
 386test_expect_success 'get variable with empty value' '
 388        git config --get emptyvalue.variable ^$
 389'
 390echo novalue.variable > expect
 392test_expect_success 'get-regexp variable with no value' '
 394        git config --get-regexp novalue > output &&
 395        test_cmp expect output
 396'
 397echo 'novalue.variable true' > expect
 399test_expect_success 'get-regexp --bool variable with no value' '
 401        git config --bool --get-regexp novalue > output &&
 402        test_cmp expect output
 403'
 404echo 'emptyvalue.variable ' > expect
 406test_expect_success 'get-regexp variable with empty value' '
 408        git config --get-regexp emptyvalue > output &&
 409        test_cmp expect output
 410'
 411echo true > expect
 413test_expect_success 'get bool variable with no value' '
 415        git config --bool novalue.variable > output &&
 416        test_cmp expect output
 417'
 418echo false > expect
 420test_expect_success 'get bool variable with empty value' '
 422        git config --bool emptyvalue.variable > output &&
 423        test_cmp expect output
 424'
 425test_expect_success 'no arguments, but no crash' '
 427        test_must_fail git config >output 2>&1 &&
 428        test_i18ngrep usage output
 429'
 430cat > .git/config << EOF
 432[a.b]
 433        c = d
 434EOF
 435cat > expect << EOF
 437[a.b]
 438        c = d
 439[a]
 440        x = y
 441EOF
 442test_expect_success 'new section is partial match of another' '
 444        git config a.x y &&
 445        test_cmp expect .git/config
 446'
 447cat > expect << EOF
 449[a.b]
 450        c = d
 451[a]
 452        x = y
 453        b = c
 454[b]
 455        x = y
 456EOF
 457test_expect_success 'new variable inserts into proper section' '
 459        git config b.x y &&
 460        git config a.b c &&
 461        test_cmp expect .git/config
 462'
 463test_expect_success 'alternative --file (non-existing file should fail)' '
 465        test_must_fail git config --file non-existing-config -l
 466'
 467cat > other-config << EOF
 469[ein]
 470        bahn = strasse
 471EOF
 472cat > expect << EOF
 474ein.bahn=strasse
 475EOF
 476test_expect_success 'alternative GIT_CONFIG' '
 478        GIT_CONFIG=other-config git config --list >output &&
 479        test_cmp expect output
 480'
 481test_expect_success 'alternative GIT_CONFIG (--file)' '
 483        git config --file other-config --list >output &&
 484        test_cmp expect output
 485'
 486test_expect_success 'alternative GIT_CONFIG (--file=-)' '
 488        git config --file - --list <other-config >output &&
 489        test_cmp expect output
 490'
 491test_expect_success 'setting a value in stdin is an error' '
 493        test_must_fail git config --file - some.value foo
 494'
 495test_expect_success 'editing stdin is an error' '
 497        test_must_fail git config --file - --edit
 498'
 499test_expect_success 'refer config from subdirectory' '
 501        mkdir x &&
 502        (
 503                cd x &&
 504                echo strasse >expect &&
 505                git config --get --file ../other-config ein.bahn >actual &&
 506                test_cmp expect actual
 507        )
 508'
 510test_expect_success 'refer config from subdirectory via --file' '
 512        (
 513                cd x &&
 514                git config --file=../other-config --get ein.bahn >actual &&
 515                test_cmp expect actual
 516        )
 517'
 518cat > expect << EOF
 520[ein]
 521        bahn = strasse
 522[anwohner]
 523        park = ausweis
 524EOF
 525test_expect_success '--set in alternative file' '
 527        git config --file=other-config anwohner.park ausweis &&
 528        test_cmp expect other-config
 529'
 530cat > .git/config << EOF
 532# Hallo
 533        #Bello
 534[branch "eins"]
 535        x = 1
 536[branch.eins]
 537        y = 1
 538        [branch "1 234 blabl/a"]
 539weird
 540EOF
 541test_expect_success 'rename section' '
 543        git config --rename-section branch.eins branch.zwei
 544'
 545cat > expect << EOF
 547# Hallo
 548        #Bello
 549[branch "zwei"]
 550        x = 1
 551[branch "zwei"]
 552        y = 1
 553        [branch "1 234 blabl/a"]
 554weird
 555EOF
 556test_expect_success 'rename succeeded' '
 558        test_cmp expect .git/config
 559'
 560test_expect_success 'rename non-existing section' '
 562        test_must_fail git config --rename-section \
 563                branch."world domination" branch.drei
 564'
 565test_expect_success 'rename succeeded' '
 567        test_cmp expect .git/config
 568'
 569test_expect_success 'rename another section' '
 571        git config --rename-section branch."1 234 blabl/a" branch.drei
 572'
 573cat > expect << EOF
 575# Hallo
 576        #Bello
 577[branch "zwei"]
 578        x = 1
 579[branch "zwei"]
 580        y = 1
 581[branch "drei"]
 582weird
 583EOF
 584test_expect_success 'rename succeeded' '
 586        test_cmp expect .git/config
 587'
 588cat >> .git/config << EOF
 590[branch "vier"] z = 1
 591EOF
 592test_expect_success 'rename a section with a var on the same line' '
 594        git config --rename-section branch.vier branch.zwei
 595'
 596cat > expect << EOF
 598# Hallo
 599        #Bello
 600[branch "zwei"]
 601        x = 1
 602[branch "zwei"]
 603        y = 1
 604[branch "drei"]
 605weird
 606[branch "zwei"]
 607        z = 1
 608EOF
 609test_expect_success 'rename succeeded' '
 611        test_cmp expect .git/config
 612'
 613test_expect_success 'renaming empty section name is rejected' '
 615        test_must_fail git config --rename-section branch.zwei ""
 616'
 617test_expect_success 'renaming to bogus section is rejected' '
 619        test_must_fail git config --rename-section branch.zwei "bogus name"
 620'
 621cat >> .git/config << EOF
 623  [branch "zwei"] a = 1 [branch "vier"]
 624EOF
 625test_expect_success 'remove section' '
 627        git config --remove-section branch.zwei
 628'
 629cat > expect << EOF
 631# Hallo
 632        #Bello
 633[branch "drei"]
 634weird
 635EOF
 636test_expect_success 'section was removed properly' '
 638        test_cmp expect .git/config
 639'
 640cat > expect << EOF
 642[gitcvs]
 643        enabled = true
 644        dbname = %Ggitcvs2.%a.%m.sqlite
 645[gitcvs "ext"]
 646        dbname = %Ggitcvs1.%a.%m.sqlite
 647EOF
 648test_expect_success 'section ending' '
 650        rm -f .git/config &&
 651        git config gitcvs.enabled true &&
 652        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 653        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 654        test_cmp expect .git/config
 655'
 657test_expect_success numbers '
 659        git config kilo.gram 1k &&
 660        git config mega.ton 1m &&
 661        echo 1024 >expect &&
 662        echo 1048576 >>expect &&
 663        git config --int --get kilo.gram >actual &&
 664        git config --int --get mega.ton >>actual &&
 665        test_cmp expect actual
 666'
 667test_expect_success '--int is at least 64 bits' '
 669        git config giga.watts 121g &&
 670        echo 129922760704 >expect &&
 671        git config --int --get giga.watts >actual &&
 672        test_cmp expect actual
 673'
 674test_expect_success 'invalid unit' '
 676        git config aninvalid.unit "1auto" &&
 677        echo 1auto >expect &&
 678        git config aninvalid.unit >actual &&
 679        test_cmp expect actual &&
 680        cat >expect <<-\EOF
 681        fatal: bad numeric config value '\''1auto'\'' for '\''aninvalid.unit'\'' in .git/config: invalid unit
 682        EOF
 683        test_must_fail git config --int --get aninvalid.unit 2>actual &&
 684        test_i18ncmp expect actual
 685'
 686cat > expect << EOF
 688true
 689false
 690true
 691false
 692true
 693false
 694true
 695false
 696EOF
 697test_expect_success bool '
 699        git config bool.true1 01 &&
 701        git config bool.true2 -1 &&
 702        git config bool.true3 YeS &&
 703        git config bool.true4 true &&
 704        git config bool.false1 000 &&
 705        git config bool.false2 "" &&
 706        git config bool.false3 nO &&
 707        git config bool.false4 FALSE &&
 708        rm -f result &&
 709        for i in 1 2 3 4
 710        do
 711            git config --bool --get bool.true$i >>result
 712            git config --bool --get bool.false$i >>result
 713        done &&
 714        test_cmp expect result'
 715test_expect_success 'invalid bool (--get)' '
 717        git config bool.nobool foobar &&
 719        test_must_fail git config --bool --get bool.nobool'
 720test_expect_success 'invalid bool (set)' '
 722        test_must_fail git config --bool bool.nobool foobar'
 724cat > expect <<\EOF
 726[bool]
 727        true1 = true
 728        true2 = true
 729        true3 = true
 730        true4 = true
 731        false1 = false
 732        false2 = false
 733        false3 = false
 734        false4 = false
 735EOF
 736test_expect_success 'set --bool' '
 738        rm -f .git/config &&
 740        git config --bool bool.true1 01 &&
 741        git config --bool bool.true2 -1 &&
 742        git config --bool bool.true3 YeS &&
 743        git config --bool bool.true4 true &&
 744        git config --bool bool.false1 000 &&
 745        git config --bool bool.false2 "" &&
 746        git config --bool bool.false3 nO &&
 747        git config --bool bool.false4 FALSE &&
 748        test_cmp expect .git/config'
 749cat > expect <<\EOF
 751[int]
 752        val1 = 1
 753        val2 = -1
 754        val3 = 5242880
 755EOF
 756test_expect_success 'set --int' '
 758        rm -f .git/config &&
 760        git config --int int.val1 01 &&
 761        git config --int int.val2 -1 &&
 762        git config --int int.val3 5m &&
 763        test_cmp expect .git/config
 764'
 765test_expect_success 'get --bool-or-int' '
 767        cat >.git/config <<-\EOF &&
 768        [bool]
 769        true1
 770        true2 = true
 771        false = false
 772        [int]
 773        int1 = 0
 774        int2 = 1
 775        int3 = -1
 776        EOF
 777        cat >expect <<-\EOF &&
 778        true
 779        true
 780        false
 781        0
 782        1
 783        -1
 784        EOF
 785        {
 786                git config --bool-or-int bool.true1 &&
 787                git config --bool-or-int bool.true2 &&
 788                git config --bool-or-int bool.false &&
 789                git config --bool-or-int int.int1 &&
 790                git config --bool-or-int int.int2 &&
 791                git config --bool-or-int int.int3
 792        } >actual &&
 793        test_cmp expect actual
 794'
 795cat >expect <<\EOF
 797[bool]
 798        true1 = true
 799        false1 = false
 800        true2 = true
 801        false2 = false
 802[int]
 803        int1 = 0
 804        int2 = 1
 805        int3 = -1
 806EOF
 807test_expect_success 'set --bool-or-int' '
 809        rm -f .git/config &&
 810        git config --bool-or-int bool.true1 true &&
 811        git config --bool-or-int bool.false1 false &&
 812        git config --bool-or-int bool.true2 yes &&
 813        git config --bool-or-int bool.false2 no &&
 814        git config --bool-or-int int.int1 0 &&
 815        git config --bool-or-int int.int2 1 &&
 816        git config --bool-or-int int.int3 -1 &&
 817        test_cmp expect .git/config
 818'
 819cat >expect <<\EOF
 821[path]
 822        home = ~/
 823        normal = /dev/null
 824        trailingtilde = foo~
 825EOF
 826test_expect_success NOT_MINGW 'set --path' '
 828        rm -f .git/config &&
 829        git config --path path.home "~/" &&
 830        git config --path path.normal "/dev/null" &&
 831        git config --path path.trailingtilde "foo~" &&
 832        test_cmp expect .git/config'
 833if test_have_prereq NOT_MINGW && test "${HOME+set}"
 835then
 836        test_set_prereq HOMEVAR
 837fi
 838cat >expect <<EOF
 840$HOME/
 841/dev/null
 842foo~
 843EOF
 844test_expect_success HOMEVAR 'get --path' '
 846        git config --get --path path.home > result &&
 847        git config --get --path path.normal >> result &&
 848        git config --get --path path.trailingtilde >> result &&
 849        test_cmp expect result
 850'
 851cat >expect <<\EOF
 853/dev/null
 854foo~
 855EOF
 856test_expect_success NOT_MINGW 'get --path copes with unset $HOME' '
 858        (
 859                unset HOME;
 860                test_must_fail git config --get --path path.home \
 861                        >result 2>msg &&
 862                git config --get --path path.normal >>result &&
 863                git config --get --path path.trailingtilde >>result
 864        ) &&
 865        grep "[Ff]ailed to expand.*~/" msg &&
 866        test_cmp expect result
 867'
 868test_expect_success 'get --path barfs on boolean variable' '
 870        echo "[path]bool" >.git/config &&
 871        test_must_fail git config --get --path path.bool
 872'
 873cat > expect << EOF
 875[quote]
 876        leading = " test"
 877        ending = "test "
 878        semicolon = "test;test"
 879        hash = "test#test"
 880EOF
 881test_expect_success 'quoting' '
 882        rm -f .git/config &&
 883        git config quote.leading " test" &&
 884        git config quote.ending "test " &&
 885        git config quote.semicolon "test;test" &&
 886        git config quote.hash "test#test" &&
 887        test_cmp expect .git/config
 888'
 889test_expect_success 'key with newline' '
 891        test_must_fail git config "key.with
 892newline" 123'
 893test_expect_success 'value with newline' 'git config key.sub value.with\\\
 895newline'
 896cat > .git/config <<\EOF
 898[section]
 899        ; comment \
 900        continued = cont\
 901inued
 902        noncont   = not continued ; \
 903        quotecont = "cont;\
 904inued"
 905EOF
 906cat > expect <<\EOF
 908section.continued=continued
 909section.noncont=not continued
 910section.quotecont=cont;inued
 911EOF
 912test_expect_success 'value continued on next line' '
 914        git config --list > result &&
 915        test_cmp result expect
 916'
 917cat > .git/config <<\EOF
 919[section "sub=section"]
 920        val1 = foo=bar
 921        val2 = foo\nbar
 922        val3 = \n\n
 923        val4 =
 924        val5
 925EOF
 926cat > expect <<\EOF
 928section.sub=section.val1
 929foo=barQsection.sub=section.val2
 930foo
 931barQsection.sub=section.val3
 932Qsection.sub=section.val4
 935Qsection.sub=section.val5Q
 936EOF
 937test_expect_success '--null --list' '
 938        git config --null --list | nul_to_q >result &&
 939        echo >>result &&
 940        test_cmp expect result
 941'
 942test_expect_success '--null --get-regexp' '
 944        git config --null --get-regexp "val[0-9]" | nul_to_q >result &&
 945        echo >>result &&
 946        test_cmp expect result
 947'
 948test_expect_success 'inner whitespace kept verbatim' '
 950        git config section.val "foo       bar" &&
 951        echo "foo         bar" >expect &&
 952        git config section.val >actual &&
 953        test_cmp expect actual
 954'
 955test_expect_success SYMLINKS 'symlinked configuration' '
 957        ln -s notyet myconfig &&
 958        git config --file=myconfig test.frotz nitfol &&
 959        test -h myconfig &&
 960        test -f notyet &&
 961        test "z$(git config --file=notyet test.frotz)" = znitfol &&
 962        git config --file=myconfig test.xyzzy rezrov &&
 963        test -h myconfig &&
 964        test -f notyet &&
 965        cat >expect <<-\EOF &&
 966        nitfol
 967        rezrov
 968        EOF
 969        {
 970                git config --file=notyet test.frotz &&
 971                git config --file=notyet test.xyzzy
 972        } >actual &&
 973        test_cmp expect actual
 974'
 975test_expect_success 'nonexistent configuration' '
 977        test_must_fail git config --file=doesnotexist --list &&
 978        test_must_fail git config --file=doesnotexist test.xyzzy
 979'
 980test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
 982        ln -s doesnotexist linktonada &&
 983        ln -s linktonada linktolinktonada &&
 984        test_must_fail git config --file=linktonada --list &&
 985        test_must_fail git config --file=linktolinktonada --list
 986'
 987test_expect_success 'check split_cmdline return' "
 989        git config alias.split-cmdline-fix 'echo \"' &&
 990        test_must_fail git split-cmdline-fix &&
 991        echo foo > foo &&
 992        git add foo &&
 993        git commit -m 'initial commit' &&
 994        git config branch.master.mergeoptions 'echo \"' &&
 995        test_must_fail git merge master
 996"
 997test_expect_success 'git -c "key=value" support' '
 999        cat >expect <<-\EOF &&
1000        value
1001        value
1002        true
1003        EOF
1004        {
1005                git -c core.name=value config core.name &&
1006                git -c foo.CamelCase=value config foo.camelcase &&
1007                git -c foo.flag config --bool foo.flag
1008        } >actual &&
1009        test_cmp expect actual &&
1010        test_must_fail git -c name=value config core.name
1011'
1012test_expect_success 'key sanity-checking' '
1014        test_must_fail git config foo=bar &&
1015        test_must_fail git config foo=.bar &&
1016        test_must_fail git config foo.ba=r &&
1017        test_must_fail git config foo.1bar &&
1018        test_must_fail git config foo."ba
1019                                z".bar &&
1020        test_must_fail git config . false &&
1021        test_must_fail git config .foo false &&
1022        test_must_fail git config foo. false &&
1023        test_must_fail git config .foo. false &&
1024        git config foo.bar true &&
1025        git config foo."ba =z".bar false
1026'
1027test_expect_success 'git -c works with aliases of builtins' '
1029        git config alias.checkconfig "-c foo.check=bar config foo.check" &&
1030        echo bar >expect &&
1031        git checkconfig >actual &&
1032        test_cmp expect actual
1033'
1034test_expect_success 'git -c does not split values on equals' '
1036        echo "value with = in it" >expect &&
1037        git -c core.foo="value with = in it" config core.foo >actual &&
1038        test_cmp expect actual
1039'
1040test_expect_success 'git -c dies on bogus config' '
1042        test_must_fail git -c core.bare=foo rev-parse
1043'
1044test_expect_success 'git -c complains about empty key' '
1046        test_must_fail git -c "=foo" rev-parse
1047'
1048test_expect_success 'git -c complains about empty key and value' '
1050        test_must_fail git -c "" rev-parse
1051'
1052test_expect_success 'git config --edit works' '
1054        git config -f tmp test.value no &&
1055        echo test.value=yes >expect &&
1056        GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
1057        git config -f tmp --list >actual &&
1058        test_cmp expect actual
1059'
1060test_expect_success 'git config --edit respects core.editor' '
1062        git config -f tmp test.value no &&
1063        echo test.value=yes >expect &&
1064        test_config core.editor "echo [test]value=yes >" &&
1065        git config -f tmp --edit &&
1066        git config -f tmp --list >actual &&
1067        test_cmp expect actual
1068'
1069# malformed configuration files
1071test_expect_success 'barf on syntax error' '
1072        cat >.git/config <<-\EOF &&
1073        # broken section line
1074        [section]
1075        key garbage
1076        EOF
1077        test_must_fail git config --get section.key >actual 2>error &&
1078        grep " line 3 " error
1079'
1080test_expect_success 'barf on incomplete section header' '
1082        cat >.git/config <<-\EOF &&
1083        # broken section line
1084        [section
1085        key = value
1086        EOF
1087        test_must_fail git config --get section.key >actual 2>error &&
1088        grep " line 2 " error
1089'
1090test_expect_success 'barf on incomplete string' '
1092        cat >.git/config <<-\EOF &&
1093        # broken section line
1094        [section]
1095        key = "value string
1096        EOF
1097        test_must_fail git config --get section.key >actual 2>error &&
1098        grep " line 3 " error
1099'
1100test_expect_success 'urlmatch' '
1102        cat >.git/config <<-\EOF &&
1103        [http]
1104                sslVerify
1105        [http "https://weak.example.com"]
1106                sslVerify = false
1107                cookieFile = /tmp/cookie.txt
1108        EOF
1109        echo true >expect &&
1111        git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
1112        test_cmp expect actual &&
1113        echo false >expect &&
1115        git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
1116        test_cmp expect actual &&
1117        {
1119                echo http.cookiefile /tmp/cookie.txt &&
1120                echo http.sslverify false
1121        } >expect &&
1122        git config --get-urlmatch HTTP https://weak.example.com >actual &&
1123        test_cmp expect actual
1124'
1125# good section hygiene
1127test_expect_failure 'unsetting the last key in a section removes header' '
1128        cat >.git/config <<-\EOF &&
1129        # some generic comment on the configuration file itself
1130        # a comment specific to this "section" section.
1131        [section]
1132        # some intervening lines
1133        # that should also be dropped
1134        key = value
1136        # please be careful when you update the above variable
1137        EOF
1138        cat >expect <<-\EOF &&
1140        # some generic comment on the configuration file itself
1141        EOF
1142        git config --unset section.key &&
1144        test_cmp expect .git/config
1145'
1146test_expect_failure 'adding a key into an empty section reuses header' '
1148        cat >.git/config <<-\EOF &&
1149        [section]
1150        EOF
1151        q_to_tab >expect <<-\EOF &&
1153        [section]
1154        Qkey = value
1155        EOF
1156        git config section.key value
1158        test_cmp expect .git/config
1159'
1160test_done