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
 357nextsection.nonewline
 358123456.a123
 359version.1.2.3eX.alpha
 360EOF
 361test_expect_success '--name-only --list' '
 363        git config --name-only --list >output &&
 364        test_cmp expect output
 365'
 366cat > expect << EOF
 368beta.noindent sillyValue
 369nextsection.nonewline wow2 for me
 370EOF
 371test_expect_success '--get-regexp' '
 373        git config --get-regexp in >output &&
 374        test_cmp expect output
 375'
 376cat > expect << EOF
 378beta.noindent
 379nextsection.nonewline
 380EOF
 381test_expect_success '--name-only --get-regexp' '
 383        git config --name-only --get-regexp in >output &&
 384        test_cmp expect output
 385'
 386cat > expect << EOF
 388wow2 for me
 389wow4 for you
 390EOF
 391test_expect_success '--add' '
 393        git config --add nextsection.nonewline "wow4 for you" &&
 394        git config --get-all nextsection.nonewline > output &&
 395        test_cmp expect output
 396'
 397cat > .git/config << EOF
 399[novalue]
 400        variable
 401[emptyvalue]
 402        variable =
 403EOF
 404test_expect_success 'get variable with no value' '
 406        git config --get novalue.variable ^$
 407'
 408test_expect_success 'get variable with empty value' '
 410        git config --get emptyvalue.variable ^$
 411'
 412echo novalue.variable > expect
 414test_expect_success 'get-regexp variable with no value' '
 416        git config --get-regexp novalue > output &&
 417        test_cmp expect output
 418'
 419echo 'novalue.variable true' > expect
 421test_expect_success 'get-regexp --bool variable with no value' '
 423        git config --bool --get-regexp novalue > output &&
 424        test_cmp expect output
 425'
 426echo 'emptyvalue.variable ' > expect
 428test_expect_success 'get-regexp variable with empty value' '
 430        git config --get-regexp emptyvalue > output &&
 431        test_cmp expect output
 432'
 433echo true > expect
 435test_expect_success 'get bool variable with no value' '
 437        git config --bool novalue.variable > output &&
 438        test_cmp expect output
 439'
 440echo false > expect
 442test_expect_success 'get bool variable with empty value' '
 444        git config --bool emptyvalue.variable > output &&
 445        test_cmp expect output
 446'
 447test_expect_success 'no arguments, but no crash' '
 449        test_must_fail git config >output 2>&1 &&
 450        test_i18ngrep usage output
 451'
 452cat > .git/config << EOF
 454[a.b]
 455        c = d
 456EOF
 457cat > expect << EOF
 459[a.b]
 460        c = d
 461[a]
 462        x = y
 463EOF
 464test_expect_success 'new section is partial match of another' '
 466        git config a.x y &&
 467        test_cmp expect .git/config
 468'
 469cat > expect << EOF
 471[a.b]
 472        c = d
 473[a]
 474        x = y
 475        b = c
 476[b]
 477        x = y
 478EOF
 479test_expect_success 'new variable inserts into proper section' '
 481        git config b.x y &&
 482        git config a.b c &&
 483        test_cmp expect .git/config
 484'
 485test_expect_success 'alternative --file (non-existing file should fail)' '
 487        test_must_fail git config --file non-existing-config -l
 488'
 489cat > other-config << EOF
 491[ein]
 492        bahn = strasse
 493EOF
 494cat > expect << EOF
 496ein.bahn=strasse
 497EOF
 498test_expect_success 'alternative GIT_CONFIG' '
 500        GIT_CONFIG=other-config git config --list >output &&
 501        test_cmp expect output
 502'
 503test_expect_success 'alternative GIT_CONFIG (--file)' '
 505        git config --file other-config --list >output &&
 506        test_cmp expect output
 507'
 508test_expect_success 'alternative GIT_CONFIG (--file=-)' '
 510        git config --file - --list <other-config >output &&
 511        test_cmp expect output
 512'
 513test_expect_success 'setting a value in stdin is an error' '
 515        test_must_fail git config --file - some.value foo
 516'
 517test_expect_success 'editing stdin is an error' '
 519        test_must_fail git config --file - --edit
 520'
 521test_expect_success 'refer config from subdirectory' '
 523        mkdir x &&
 524        (
 525                cd x &&
 526                echo strasse >expect &&
 527                git config --get --file ../other-config ein.bahn >actual &&
 528                test_cmp expect actual
 529        )
 530'
 532test_expect_success 'refer config from subdirectory via --file' '
 534        (
 535                cd x &&
 536                git config --file=../other-config --get ein.bahn >actual &&
 537                test_cmp expect actual
 538        )
 539'
 540cat > expect << EOF
 542[ein]
 543        bahn = strasse
 544[anwohner]
 545        park = ausweis
 546EOF
 547test_expect_success '--set in alternative file' '
 549        git config --file=other-config anwohner.park ausweis &&
 550        test_cmp expect other-config
 551'
 552cat > .git/config << EOF
 554# Hallo
 555        #Bello
 556[branch "eins"]
 557        x = 1
 558[branch.eins]
 559        y = 1
 560        [branch "1 234 blabl/a"]
 561weird
 562EOF
 563test_expect_success 'rename section' '
 565        git config --rename-section branch.eins branch.zwei
 566'
 567cat > expect << EOF
 569# Hallo
 570        #Bello
 571[branch "zwei"]
 572        x = 1
 573[branch "zwei"]
 574        y = 1
 575        [branch "1 234 blabl/a"]
 576weird
 577EOF
 578test_expect_success 'rename succeeded' '
 580        test_cmp expect .git/config
 581'
 582test_expect_success 'rename non-existing section' '
 584        test_must_fail git config --rename-section \
 585                branch."world domination" branch.drei
 586'
 587test_expect_success 'rename succeeded' '
 589        test_cmp expect .git/config
 590'
 591test_expect_success 'rename another section' '
 593        git config --rename-section branch."1 234 blabl/a" branch.drei
 594'
 595cat > expect << EOF
 597# Hallo
 598        #Bello
 599[branch "zwei"]
 600        x = 1
 601[branch "zwei"]
 602        y = 1
 603[branch "drei"]
 604weird
 605EOF
 606test_expect_success 'rename succeeded' '
 608        test_cmp expect .git/config
 609'
 610cat >> .git/config << EOF
 612[branch "vier"] z = 1
 613EOF
 614test_expect_success 'rename a section with a var on the same line' '
 616        git config --rename-section branch.vier branch.zwei
 617'
 618cat > expect << EOF
 620# Hallo
 621        #Bello
 622[branch "zwei"]
 623        x = 1
 624[branch "zwei"]
 625        y = 1
 626[branch "drei"]
 627weird
 628[branch "zwei"]
 629        z = 1
 630EOF
 631test_expect_success 'rename succeeded' '
 633        test_cmp expect .git/config
 634'
 635test_expect_success 'renaming empty section name is rejected' '
 637        test_must_fail git config --rename-section branch.zwei ""
 638'
 639test_expect_success 'renaming to bogus section is rejected' '
 641        test_must_fail git config --rename-section branch.zwei "bogus name"
 642'
 643cat >> .git/config << EOF
 645  [branch "zwei"] a = 1 [branch "vier"]
 646EOF
 647test_expect_success 'remove section' '
 649        git config --remove-section branch.zwei
 650'
 651cat > expect << EOF
 653# Hallo
 654        #Bello
 655[branch "drei"]
 656weird
 657EOF
 658test_expect_success 'section was removed properly' '
 660        test_cmp expect .git/config
 661'
 662cat > expect << EOF
 664[gitcvs]
 665        enabled = true
 666        dbname = %Ggitcvs2.%a.%m.sqlite
 667[gitcvs "ext"]
 668        dbname = %Ggitcvs1.%a.%m.sqlite
 669EOF
 670test_expect_success 'section ending' '
 672        rm -f .git/config &&
 673        git config gitcvs.enabled true &&
 674        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 675        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 676        test_cmp expect .git/config
 677'
 679test_expect_success numbers '
 681        git config kilo.gram 1k &&
 682        git config mega.ton 1m &&
 683        echo 1024 >expect &&
 684        echo 1048576 >>expect &&
 685        git config --int --get kilo.gram >actual &&
 686        git config --int --get mega.ton >>actual &&
 687        test_cmp expect actual
 688'
 689test_expect_success '--int is at least 64 bits' '
 691        git config giga.watts 121g &&
 692        echo 129922760704 >expect &&
 693        git config --int --get giga.watts >actual &&
 694        test_cmp expect actual
 695'
 696test_expect_success 'invalid unit' '
 698        git config aninvalid.unit "1auto" &&
 699        echo 1auto >expect &&
 700        git config aninvalid.unit >actual &&
 701        test_cmp expect actual &&
 702        cat >expect <<-\EOF &&
 703        fatal: bad numeric config value '\''1auto'\'' for '\''aninvalid.unit'\'' in .git/config: invalid unit
 704        EOF
 705        test_must_fail git config --int --get aninvalid.unit 2>actual &&
 706        test_i18ncmp expect actual
 707'
 708cat > expect << EOF
 710true
 711false
 712true
 713false
 714true
 715false
 716true
 717false
 718EOF
 719test_expect_success bool '
 721        git config bool.true1 01 &&
 723        git config bool.true2 -1 &&
 724        git config bool.true3 YeS &&
 725        git config bool.true4 true &&
 726        git config bool.false1 000 &&
 727        git config bool.false2 "" &&
 728        git config bool.false3 nO &&
 729        git config bool.false4 FALSE &&
 730        rm -f result &&
 731        for i in 1 2 3 4
 732        do
 733            git config --bool --get bool.true$i >>result
 734            git config --bool --get bool.false$i >>result
 735        done &&
 736        test_cmp expect result'
 737test_expect_success 'invalid bool (--get)' '
 739        git config bool.nobool foobar &&
 741        test_must_fail git config --bool --get bool.nobool'
 742test_expect_success 'invalid bool (set)' '
 744        test_must_fail git config --bool bool.nobool foobar'
 746cat > expect <<\EOF
 748[bool]
 749        true1 = true
 750        true2 = true
 751        true3 = true
 752        true4 = true
 753        false1 = false
 754        false2 = false
 755        false3 = false
 756        false4 = false
 757EOF
 758test_expect_success 'set --bool' '
 760        rm -f .git/config &&
 762        git config --bool bool.true1 01 &&
 763        git config --bool bool.true2 -1 &&
 764        git config --bool bool.true3 YeS &&
 765        git config --bool bool.true4 true &&
 766        git config --bool bool.false1 000 &&
 767        git config --bool bool.false2 "" &&
 768        git config --bool bool.false3 nO &&
 769        git config --bool bool.false4 FALSE &&
 770        test_cmp expect .git/config'
 771cat > expect <<\EOF
 773[int]
 774        val1 = 1
 775        val2 = -1
 776        val3 = 5242880
 777EOF
 778test_expect_success 'set --int' '
 780        rm -f .git/config &&
 782        git config --int int.val1 01 &&
 783        git config --int int.val2 -1 &&
 784        git config --int int.val3 5m &&
 785        test_cmp expect .git/config
 786'
 787test_expect_success 'get --bool-or-int' '
 789        cat >.git/config <<-\EOF &&
 790        [bool]
 791        true1
 792        true2 = true
 793        false = false
 794        [int]
 795        int1 = 0
 796        int2 = 1
 797        int3 = -1
 798        EOF
 799        cat >expect <<-\EOF &&
 800        true
 801        true
 802        false
 803        0
 804        1
 805        -1
 806        EOF
 807        {
 808                git config --bool-or-int bool.true1 &&
 809                git config --bool-or-int bool.true2 &&
 810                git config --bool-or-int bool.false &&
 811                git config --bool-or-int int.int1 &&
 812                git config --bool-or-int int.int2 &&
 813                git config --bool-or-int int.int3
 814        } >actual &&
 815        test_cmp expect actual
 816'
 817cat >expect <<\EOF
 819[bool]
 820        true1 = true
 821        false1 = false
 822        true2 = true
 823        false2 = false
 824[int]
 825        int1 = 0
 826        int2 = 1
 827        int3 = -1
 828EOF
 829test_expect_success 'set --bool-or-int' '
 831        rm -f .git/config &&
 832        git config --bool-or-int bool.true1 true &&
 833        git config --bool-or-int bool.false1 false &&
 834        git config --bool-or-int bool.true2 yes &&
 835        git config --bool-or-int bool.false2 no &&
 836        git config --bool-or-int int.int1 0 &&
 837        git config --bool-or-int int.int2 1 &&
 838        git config --bool-or-int int.int3 -1 &&
 839        test_cmp expect .git/config
 840'
 841cat >expect <<\EOF
 843[path]
 844        home = ~/
 845        normal = /dev/null
 846        trailingtilde = foo~
 847EOF
 848test_expect_success !MINGW 'set --path' '
 850        rm -f .git/config &&
 851        git config --path path.home "~/" &&
 852        git config --path path.normal "/dev/null" &&
 853        git config --path path.trailingtilde "foo~" &&
 854        test_cmp expect .git/config'
 855if test_have_prereq !MINGW && test "${HOME+set}"
 857then
 858        test_set_prereq HOMEVAR
 859fi
 860cat >expect <<EOF
 862$HOME/
 863/dev/null
 864foo~
 865EOF
 866test_expect_success HOMEVAR 'get --path' '
 868        git config --get --path path.home > result &&
 869        git config --get --path path.normal >> result &&
 870        git config --get --path path.trailingtilde >> result &&
 871        test_cmp expect result
 872'
 873cat >expect <<\EOF
 875/dev/null
 876foo~
 877EOF
 878test_expect_success !MINGW 'get --path copes with unset $HOME' '
 880        (
 881                unset HOME;
 882                test_must_fail git config --get --path path.home \
 883                        >result 2>msg &&
 884                git config --get --path path.normal >>result &&
 885                git config --get --path path.trailingtilde >>result
 886        ) &&
 887        grep "[Ff]ailed to expand.*~/" msg &&
 888        test_cmp expect result
 889'
 890test_expect_success 'get --path barfs on boolean variable' '
 892        echo "[path]bool" >.git/config &&
 893        test_must_fail git config --get --path path.bool
 894'
 895cat > expect << EOF
 897[quote]
 898        leading = " test"
 899        ending = "test "
 900        semicolon = "test;test"
 901        hash = "test#test"
 902EOF
 903test_expect_success 'quoting' '
 904        rm -f .git/config &&
 905        git config quote.leading " test" &&
 906        git config quote.ending "test " &&
 907        git config quote.semicolon "test;test" &&
 908        git config quote.hash "test#test" &&
 909        test_cmp expect .git/config
 910'
 911test_expect_success 'key with newline' '
 913        test_must_fail git config "key.with
 914newline" 123'
 915test_expect_success 'value with newline' 'git config key.sub value.with\\\
 917newline'
 918cat > .git/config <<\EOF
 920[section]
 921        ; comment \
 922        continued = cont\
 923inued
 924        noncont   = not continued ; \
 925        quotecont = "cont;\
 926inued"
 927EOF
 928cat > expect <<\EOF
 930section.continued=continued
 931section.noncont=not continued
 932section.quotecont=cont;inued
 933EOF
 934test_expect_success 'value continued on next line' '
 936        git config --list > result &&
 937        test_cmp result expect
 938'
 939cat > .git/config <<\EOF
 941[section "sub=section"]
 942        val1 = foo=bar
 943        val2 = foo\nbar
 944        val3 = \n\n
 945        val4 =
 946        val5
 947EOF
 948cat > expect <<\EOF
 950section.sub=section.val1
 951foo=barQsection.sub=section.val2
 952foo
 953barQsection.sub=section.val3
 954Qsection.sub=section.val4
 957Qsection.sub=section.val5Q
 958EOF
 959test_expect_success '--null --list' '
 960        git config --null --list | nul_to_q >result &&
 961        echo >>result &&
 962        test_cmp expect result
 963'
 964test_expect_success '--null --get-regexp' '
 966        git config --null --get-regexp "val[0-9]" | nul_to_q >result &&
 967        echo >>result &&
 968        test_cmp expect result
 969'
 970test_expect_success 'inner whitespace kept verbatim' '
 972        git config section.val "foo       bar" &&
 973        echo "foo         bar" >expect &&
 974        git config section.val >actual &&
 975        test_cmp expect actual
 976'
 977test_expect_success SYMLINKS 'symlinked configuration' '
 979        ln -s notyet myconfig &&
 980        git config --file=myconfig test.frotz nitfol &&
 981        test -h myconfig &&
 982        test -f notyet &&
 983        test "z$(git config --file=notyet test.frotz)" = znitfol &&
 984        git config --file=myconfig test.xyzzy rezrov &&
 985        test -h myconfig &&
 986        test -f notyet &&
 987        cat >expect <<-\EOF &&
 988        nitfol
 989        rezrov
 990        EOF
 991        {
 992                git config --file=notyet test.frotz &&
 993                git config --file=notyet test.xyzzy
 994        } >actual &&
 995        test_cmp expect actual
 996'
 997test_expect_success 'nonexistent configuration' '
 999        test_must_fail git config --file=doesnotexist --list &&
1000        test_must_fail git config --file=doesnotexist test.xyzzy
1001'
1002test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
1004        ln -s doesnotexist linktonada &&
1005        ln -s linktonada linktolinktonada &&
1006        test_must_fail git config --file=linktonada --list &&
1007        test_must_fail git config --file=linktolinktonada --list
1008'
1009test_expect_success 'check split_cmdline return' "
1011        git config alias.split-cmdline-fix 'echo \"' &&
1012        test_must_fail git split-cmdline-fix &&
1013        echo foo > foo &&
1014        git add foo &&
1015        git commit -m 'initial commit' &&
1016        git config branch.master.mergeoptions 'echo \"' &&
1017        test_must_fail git merge master
1018"
1019test_expect_success 'git -c "key=value" support' '
1021        cat >expect <<-\EOF &&
1022        value
1023        value
1024        true
1025        EOF
1026        {
1027                git -c core.name=value config core.name &&
1028                git -c foo.CamelCase=value config foo.camelcase &&
1029                git -c foo.flag config --bool foo.flag
1030        } >actual &&
1031        test_cmp expect actual &&
1032        test_must_fail git -c name=value config core.name
1033'
1034# We just need a type-specifier here that cares about the
1036# distinction internally between a NULL boolean and a real
1037# string (because most of git's internal parsers do care).
1038# Using "--path" works, but we do not otherwise care about
1039# its semantics.
1040test_expect_success 'git -c can represent empty string' '
1041        echo >expect &&
1042        git -c foo.empty= config --path foo.empty >actual &&
1043        test_cmp expect actual
1044'
1045test_expect_success 'key sanity-checking' '
1047        test_must_fail git config foo=bar &&
1048        test_must_fail git config foo=.bar &&
1049        test_must_fail git config foo.ba=r &&
1050        test_must_fail git config foo.1bar &&
1051        test_must_fail git config foo."ba
1052                                z".bar &&
1053        test_must_fail git config . false &&
1054        test_must_fail git config .foo false &&
1055        test_must_fail git config foo. false &&
1056        test_must_fail git config .foo. false &&
1057        git config foo.bar true &&
1058        git config foo."ba =z".bar false
1059'
1060test_expect_success 'git -c works with aliases of builtins' '
1062        git config alias.checkconfig "-c foo.check=bar config foo.check" &&
1063        echo bar >expect &&
1064        git checkconfig >actual &&
1065        test_cmp expect actual
1066'
1067test_expect_success 'git -c does not split values on equals' '
1069        echo "value with = in it" >expect &&
1070        git -c core.foo="value with = in it" config core.foo >actual &&
1071        test_cmp expect actual
1072'
1073test_expect_success 'git -c dies on bogus config' '
1075        test_must_fail git -c core.bare=foo rev-parse
1076'
1077test_expect_success 'git -c complains about empty key' '
1079        test_must_fail git -c "=foo" rev-parse
1080'
1081test_expect_success 'git -c complains about empty key and value' '
1083        test_must_fail git -c "" rev-parse
1084'
1085test_expect_success 'git config --edit works' '
1087        git config -f tmp test.value no &&
1088        echo test.value=yes >expect &&
1089        GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
1090        git config -f tmp --list >actual &&
1091        test_cmp expect actual
1092'
1093test_expect_success 'git config --edit respects core.editor' '
1095        git config -f tmp test.value no &&
1096        echo test.value=yes >expect &&
1097        test_config core.editor "echo [test]value=yes >" &&
1098        git config -f tmp --edit &&
1099        git config -f tmp --list >actual &&
1100        test_cmp expect actual
1101'
1102# malformed configuration files
1104test_expect_success 'barf on syntax error' '
1105        cat >.git/config <<-\EOF &&
1106        # broken section line
1107        [section]
1108        key garbage
1109        EOF
1110        test_must_fail git config --get section.key >actual 2>error &&
1111        grep " line 3 " error
1112'
1113test_expect_success 'barf on incomplete section header' '
1115        cat >.git/config <<-\EOF &&
1116        # broken section line
1117        [section
1118        key = value
1119        EOF
1120        test_must_fail git config --get section.key >actual 2>error &&
1121        grep " line 2 " error
1122'
1123test_expect_success 'barf on incomplete string' '
1125        cat >.git/config <<-\EOF &&
1126        # broken section line
1127        [section]
1128        key = "value string
1129        EOF
1130        test_must_fail git config --get section.key >actual 2>error &&
1131        grep " line 3 " error
1132'
1133test_expect_success 'urlmatch' '
1135        cat >.git/config <<-\EOF &&
1136        [http]
1137                sslVerify
1138        [http "https://weak.example.com"]
1139                sslVerify = false
1140                cookieFile = /tmp/cookie.txt
1141        EOF
1142        echo true >expect &&
1144        git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
1145        test_cmp expect actual &&
1146        echo false >expect &&
1148        git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
1149        test_cmp expect actual &&
1150        {
1152                echo http.cookiefile /tmp/cookie.txt &&
1153                echo http.sslverify false
1154        } >expect &&
1155        git config --get-urlmatch HTTP https://weak.example.com >actual &&
1156        test_cmp expect actual
1157'
1158# good section hygiene
1160test_expect_failure 'unsetting the last key in a section removes header' '
1161        cat >.git/config <<-\EOF &&
1162        # some generic comment on the configuration file itself
1163        # a comment specific to this "section" section.
1164        [section]
1165        # some intervening lines
1166        # that should also be dropped
1167        key = value
1169        # please be careful when you update the above variable
1170        EOF
1171        cat >expect <<-\EOF &&
1173        # some generic comment on the configuration file itself
1174        EOF
1175        git config --unset section.key &&
1177        test_cmp expect .git/config
1178'
1179test_expect_failure 'adding a key into an empty section reuses header' '
1181        cat >.git/config <<-\EOF &&
1182        [section]
1183        EOF
1184        q_to_tab >expect <<-\EOF &&
1186        [section]
1187        Qkey = value
1188        EOF
1189        git config section.key value &&
1191        test_cmp expect .git/config
1192'
1193test_expect_success POSIXPERM,PERL 'preserves existing permissions' '
1195        chmod 0600 .git/config &&
1196        git config imap.pass Hunter2 &&
1197        perl -e \
1198          "die q(badset) if ((stat(q(.git/config)))[2] & 07777) != 0600" &&
1199        git config --rename-section imap pop &&
1200        perl -e \
1201          "die q(badrename) if ((stat(q(.git/config)))[2] & 07777) != 0600"
1202'
1203test_done