feb743019cae6e0060b132578d0b3fd9643217b0
   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 value' '
 281        test_must_fail git config nextsection.nonewline
 282'
 283
 284test_expect_success 'ambiguous unset' '
 285        test_must_fail git config --unset nextsection.nonewline
 286'
 287
 288test_expect_success 'invalid unset' '
 289        test_must_fail git config --unset somesection.nonewline
 290'
 291
 292cat > expect << EOF
 293[beta] ; silly comment # another comment
 294noIndent= sillyValue ; 'nother silly comment
 295
 296# empty line
 297                ; comment
 298[nextSection]
 299        NoNewLine = wow2 for me
 300EOF
 301
 302test_expect_success 'multivar unset' '
 303        git config --unset nextsection.nonewline "wow3$" &&
 304        test_cmp expect .git/config
 305'
 306
 307test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
 308
 309test_expect_success 'correct key' 'git config 123456.a123 987'
 310
 311test_expect_success 'hierarchical section' '
 312        git config Version.1.2.3eX.Alpha beta
 313'
 314
 315cat > expect << EOF
 316[beta] ; silly comment # another comment
 317noIndent= sillyValue ; 'nother silly comment
 318
 319# empty line
 320                ; comment
 321[nextSection]
 322        NoNewLine = wow2 for me
 323[123456]
 324        a123 = 987
 325[Version "1.2.3eX"]
 326        Alpha = beta
 327EOF
 328
 329test_expect_success 'hierarchical section value' '
 330        test_cmp expect .git/config
 331'
 332
 333cat > expect << EOF
 334beta.noindent=sillyValue
 335nextsection.nonewline=wow2 for me
 336123456.a123=987
 337version.1.2.3eX.alpha=beta
 338EOF
 339
 340test_expect_success 'working --list' '
 341        git config --list > output &&
 342        test_cmp expect output
 343'
 344cat > expect << EOF
 345EOF
 346
 347test_expect_success '--list without repo produces empty output' '
 348        git --git-dir=nonexistent config --list >output &&
 349        test_cmp expect output
 350'
 351
 352cat > expect << EOF
 353beta.noindent sillyValue
 354nextsection.nonewline wow2 for me
 355EOF
 356
 357test_expect_success '--get-regexp' '
 358        git config --get-regexp in >output &&
 359        test_cmp expect output
 360'
 361
 362cat > expect << EOF
 363wow2 for me
 364wow4 for you
 365EOF
 366
 367test_expect_success '--add' '
 368        git config --add nextsection.nonewline "wow4 for you" &&
 369        git config --get-all nextsection.nonewline > output &&
 370        test_cmp expect output
 371'
 372
 373cat > .git/config << EOF
 374[novalue]
 375        variable
 376[emptyvalue]
 377        variable =
 378EOF
 379
 380test_expect_success 'get variable with no value' '
 381        git config --get novalue.variable ^$
 382'
 383
 384test_expect_success 'get variable with empty value' '
 385        git config --get emptyvalue.variable ^$
 386'
 387
 388echo novalue.variable > expect
 389
 390test_expect_success 'get-regexp variable with no value' '
 391        git config --get-regexp novalue > output &&
 392        test_cmp expect output
 393'
 394
 395echo 'novalue.variable true' > expect
 396
 397test_expect_success 'get-regexp --bool variable with no value' '
 398        git config --bool --get-regexp novalue > output &&
 399        test_cmp expect output
 400'
 401
 402echo 'emptyvalue.variable ' > expect
 403
 404test_expect_success 'get-regexp variable with empty value' '
 405        git config --get-regexp emptyvalue > output &&
 406        test_cmp expect output
 407'
 408
 409echo true > expect
 410
 411test_expect_success 'get bool variable with no value' '
 412        git config --bool novalue.variable > output &&
 413        test_cmp expect output
 414'
 415
 416echo false > expect
 417
 418test_expect_success 'get bool variable with empty value' '
 419        git config --bool emptyvalue.variable > output &&
 420        test_cmp expect output
 421'
 422
 423test_expect_success 'no arguments, but no crash' '
 424        test_must_fail git config >output 2>&1 &&
 425        test_i18ngrep usage output
 426'
 427
 428cat > .git/config << EOF
 429[a.b]
 430        c = d
 431EOF
 432
 433cat > expect << EOF
 434[a.b]
 435        c = d
 436[a]
 437        x = y
 438EOF
 439
 440test_expect_success 'new section is partial match of another' '
 441        git config a.x y &&
 442        test_cmp expect .git/config
 443'
 444
 445cat > expect << EOF
 446[a.b]
 447        c = d
 448[a]
 449        x = y
 450        b = c
 451[b]
 452        x = y
 453EOF
 454
 455test_expect_success 'new variable inserts into proper section' '
 456        git config b.x y &&
 457        git config a.b c &&
 458        test_cmp expect .git/config
 459'
 460
 461test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' '
 462        test_must_fail git config --file non-existing-config -l
 463'
 464
 465cat > other-config << EOF
 466[ein]
 467        bahn = strasse
 468EOF
 469
 470cat > expect << EOF
 471ein.bahn=strasse
 472EOF
 473
 474test_expect_success 'alternative GIT_CONFIG' '
 475        GIT_CONFIG=other-config git config -l >output &&
 476        test_cmp expect output
 477'
 478
 479test_expect_success 'alternative GIT_CONFIG (--file)' '
 480        git config --file other-config -l > output &&
 481        test_cmp expect output
 482'
 483
 484test_expect_success 'refer config from subdirectory' '
 485        mkdir x &&
 486        (
 487                cd x &&
 488                echo strasse >expect &&
 489                git config --get --file ../other-config ein.bahn >actual &&
 490                test_cmp expect actual
 491        )
 492
 493'
 494
 495test_expect_success 'refer config from subdirectory via GIT_CONFIG' '
 496        (
 497                cd x &&
 498                GIT_CONFIG=../other-config git config --get ein.bahn >actual &&
 499                test_cmp expect actual
 500        )
 501'
 502
 503cat > expect << EOF
 504[ein]
 505        bahn = strasse
 506[anwohner]
 507        park = ausweis
 508EOF
 509
 510test_expect_success '--set in alternative GIT_CONFIG' '
 511        GIT_CONFIG=other-config git config anwohner.park ausweis &&
 512        test_cmp expect other-config
 513'
 514
 515cat > .git/config << EOF
 516# Hallo
 517        #Bello
 518[branch "eins"]
 519        x = 1
 520[branch.eins]
 521        y = 1
 522        [branch "1 234 blabl/a"]
 523weird
 524EOF
 525
 526test_expect_success 'rename section' '
 527        git config --rename-section branch.eins branch.zwei
 528'
 529
 530cat > expect << EOF
 531# Hallo
 532        #Bello
 533[branch "zwei"]
 534        x = 1
 535[branch "zwei"]
 536        y = 1
 537        [branch "1 234 blabl/a"]
 538weird
 539EOF
 540
 541test_expect_success 'rename succeeded' '
 542        test_cmp expect .git/config
 543'
 544
 545test_expect_success 'rename non-existing section' '
 546        test_must_fail git config --rename-section \
 547                branch."world domination" branch.drei
 548'
 549
 550test_expect_success 'rename succeeded' '
 551        test_cmp expect .git/config
 552'
 553
 554test_expect_success 'rename another section' '
 555        git config --rename-section branch."1 234 blabl/a" branch.drei
 556'
 557
 558cat > expect << EOF
 559# Hallo
 560        #Bello
 561[branch "zwei"]
 562        x = 1
 563[branch "zwei"]
 564        y = 1
 565[branch "drei"]
 566weird
 567EOF
 568
 569test_expect_success 'rename succeeded' '
 570        test_cmp expect .git/config
 571'
 572
 573cat >> .git/config << EOF
 574[branch "vier"] z = 1
 575EOF
 576
 577test_expect_success 'rename a section with a var on the same line' '
 578        git config --rename-section branch.vier branch.zwei
 579'
 580
 581cat > expect << EOF
 582# Hallo
 583        #Bello
 584[branch "zwei"]
 585        x = 1
 586[branch "zwei"]
 587        y = 1
 588[branch "drei"]
 589weird
 590[branch "zwei"]
 591        z = 1
 592EOF
 593
 594test_expect_success 'rename succeeded' '
 595        test_cmp expect .git/config
 596'
 597
 598test_expect_success 'renaming empty section name is rejected' '
 599        test_must_fail git config --rename-section branch.zwei ""
 600'
 601
 602test_expect_success 'renaming to bogus section is rejected' '
 603        test_must_fail git config --rename-section branch.zwei "bogus name"
 604'
 605
 606cat >> .git/config << EOF
 607  [branch "zwei"] a = 1 [branch "vier"]
 608EOF
 609
 610test_expect_success 'remove section' '
 611        git config --remove-section branch.zwei
 612'
 613
 614cat > expect << EOF
 615# Hallo
 616        #Bello
 617[branch "drei"]
 618weird
 619EOF
 620
 621test_expect_success 'section was removed properly' '
 622        test_cmp expect .git/config
 623'
 624
 625cat > expect << EOF
 626[gitcvs]
 627        enabled = true
 628        dbname = %Ggitcvs2.%a.%m.sqlite
 629[gitcvs "ext"]
 630        dbname = %Ggitcvs1.%a.%m.sqlite
 631EOF
 632
 633test_expect_success 'section ending' '
 634        rm -f .git/config &&
 635        git config gitcvs.enabled true &&
 636        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 637        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 638        test_cmp expect .git/config
 639
 640'
 641
 642test_expect_success numbers '
 643        git config kilo.gram 1k &&
 644        git config mega.ton 1m &&
 645        echo 1024 >expect &&
 646        echo 1048576 >>expect &&
 647        git config --int --get kilo.gram >actual &&
 648        git config --int --get mega.ton >>actual &&
 649        test_cmp expect actual
 650'
 651
 652test_expect_success 'invalid unit' '
 653        git config aninvalid.unit "1auto" &&
 654        echo 1auto >expect &&
 655        git config aninvalid.unit >actual &&
 656        test_cmp expect actual &&
 657        cat > expect <<-\EOF
 658        fatal: bad config value for '\''aninvalid.unit'\'' in .git/config
 659        EOF
 660        test_must_fail git config --int --get aninvalid.unit 2>actual &&
 661        test_cmp actual expect
 662'
 663
 664cat > expect << EOF
 665true
 666false
 667true
 668false
 669true
 670false
 671true
 672false
 673EOF
 674
 675test_expect_success bool '
 676
 677        git config bool.true1 01 &&
 678        git config bool.true2 -1 &&
 679        git config bool.true3 YeS &&
 680        git config bool.true4 true &&
 681        git config bool.false1 000 &&
 682        git config bool.false2 "" &&
 683        git config bool.false3 nO &&
 684        git config bool.false4 FALSE &&
 685        rm -f result &&
 686        for i in 1 2 3 4
 687        do
 688            git config --bool --get bool.true$i >>result
 689            git config --bool --get bool.false$i >>result
 690        done &&
 691        test_cmp expect result'
 692
 693test_expect_success 'invalid bool (--get)' '
 694
 695        git config bool.nobool foobar &&
 696        test_must_fail git config --bool --get bool.nobool'
 697
 698test_expect_success 'invalid bool (set)' '
 699
 700        test_must_fail git config --bool bool.nobool foobar'
 701
 702cat > expect <<\EOF
 703[bool]
 704        true1 = true
 705        true2 = true
 706        true3 = true
 707        true4 = true
 708        false1 = false
 709        false2 = false
 710        false3 = false
 711        false4 = false
 712EOF
 713
 714test_expect_success 'set --bool' '
 715
 716        rm -f .git/config &&
 717        git config --bool bool.true1 01 &&
 718        git config --bool bool.true2 -1 &&
 719        git config --bool bool.true3 YeS &&
 720        git config --bool bool.true4 true &&
 721        git config --bool bool.false1 000 &&
 722        git config --bool bool.false2 "" &&
 723        git config --bool bool.false3 nO &&
 724        git config --bool bool.false4 FALSE &&
 725        test_cmp expect .git/config'
 726
 727cat > expect <<\EOF
 728[int]
 729        val1 = 1
 730        val2 = -1
 731        val3 = 5242880
 732EOF
 733
 734test_expect_success 'set --int' '
 735
 736        rm -f .git/config &&
 737        git config --int int.val1 01 &&
 738        git config --int int.val2 -1 &&
 739        git config --int int.val3 5m &&
 740        test_cmp expect .git/config
 741'
 742
 743test_expect_success 'get --bool-or-int' '
 744        cat >.git/config <<-\EOF &&
 745        [bool]
 746        true1
 747        true2 = true
 748        false = false
 749        [int]
 750        int1 = 0
 751        int2 = 1
 752        int3 = -1
 753        EOF
 754        cat >expect <<-\EOF &&
 755        true
 756        true
 757        false
 758        0
 759        1
 760        -1
 761        EOF
 762        {
 763                git config --bool-or-int bool.true1 &&
 764                git config --bool-or-int bool.true2 &&
 765                git config --bool-or-int bool.false &&
 766                git config --bool-or-int int.int1 &&
 767                git config --bool-or-int int.int2 &&
 768                git config --bool-or-int int.int3
 769        } >actual &&
 770        test_cmp expect actual
 771'
 772
 773cat >expect <<\EOF
 774[bool]
 775        true1 = true
 776        false1 = false
 777        true2 = true
 778        false2 = false
 779[int]
 780        int1 = 0
 781        int2 = 1
 782        int3 = -1
 783EOF
 784
 785test_expect_success 'set --bool-or-int' '
 786        rm -f .git/config &&
 787        git config --bool-or-int bool.true1 true &&
 788        git config --bool-or-int bool.false1 false &&
 789        git config --bool-or-int bool.true2 yes &&
 790        git config --bool-or-int bool.false2 no &&
 791        git config --bool-or-int int.int1 0 &&
 792        git config --bool-or-int int.int2 1 &&
 793        git config --bool-or-int int.int3 -1 &&
 794        test_cmp expect .git/config
 795'
 796
 797cat >expect <<\EOF
 798[path]
 799        home = ~/
 800        normal = /dev/null
 801        trailingtilde = foo~
 802EOF
 803
 804test_expect_success NOT_MINGW 'set --path' '
 805        rm -f .git/config &&
 806        git config --path path.home "~/" &&
 807        git config --path path.normal "/dev/null" &&
 808        git config --path path.trailingtilde "foo~" &&
 809        test_cmp expect .git/config'
 810
 811if test_have_prereq NOT_MINGW && test "${HOME+set}"
 812then
 813        test_set_prereq HOMEVAR
 814fi
 815
 816cat >expect <<EOF
 817$HOME/
 818/dev/null
 819foo~
 820EOF
 821
 822test_expect_success HOMEVAR 'get --path' '
 823        git config --get --path path.home > result &&
 824        git config --get --path path.normal >> result &&
 825        git config --get --path path.trailingtilde >> result &&
 826        test_cmp expect result
 827'
 828
 829cat >expect <<\EOF
 830/dev/null
 831foo~
 832EOF
 833
 834test_expect_success NOT_MINGW 'get --path copes with unset $HOME' '
 835        (
 836                unset HOME;
 837                test_must_fail git config --get --path path.home \
 838                        >result 2>msg &&
 839                git config --get --path path.normal >>result &&
 840                git config --get --path path.trailingtilde >>result
 841        ) &&
 842        grep "[Ff]ailed to expand.*~/" msg &&
 843        test_cmp expect result
 844'
 845
 846cat > expect << EOF
 847[quote]
 848        leading = " test"
 849        ending = "test "
 850        semicolon = "test;test"
 851        hash = "test#test"
 852EOF
 853test_expect_success 'quoting' '
 854        rm -f .git/config &&
 855        git config quote.leading " test" &&
 856        git config quote.ending "test " &&
 857        git config quote.semicolon "test;test" &&
 858        git config quote.hash "test#test" &&
 859        test_cmp expect .git/config
 860'
 861
 862test_expect_success 'key with newline' '
 863        test_must_fail git config "key.with
 864newline" 123'
 865
 866test_expect_success 'value with newline' 'git config key.sub value.with\\\
 867newline'
 868
 869cat > .git/config <<\EOF
 870[section]
 871        ; comment \
 872        continued = cont\
 873inued
 874        noncont   = not continued ; \
 875        quotecont = "cont;\
 876inued"
 877EOF
 878
 879cat > expect <<\EOF
 880section.continued=continued
 881section.noncont=not continued
 882section.quotecont=cont;inued
 883EOF
 884
 885test_expect_success 'value continued on next line' '
 886        git config --list > result &&
 887        test_cmp result expect
 888'
 889
 890cat > .git/config <<\EOF
 891[section "sub=section"]
 892        val1 = foo=bar
 893        val2 = foo\nbar
 894        val3 = \n\n
 895        val4 =
 896        val5
 897EOF
 898
 899cat > expect <<\EOF
 900section.sub=section.val1
 901foo=barQsection.sub=section.val2
 902foo
 903barQsection.sub=section.val3
 904
 905
 906Qsection.sub=section.val4
 907Qsection.sub=section.val5Q
 908EOF
 909test_expect_success '--null --list' '
 910        git config --null --list | nul_to_q >result &&
 911        echo >>result &&
 912        test_cmp expect result
 913'
 914
 915test_expect_success '--null --get-regexp' '
 916        git config --null --get-regexp "val[0-9]" | nul_to_q >result &&
 917        echo >>result &&
 918        test_cmp expect result
 919'
 920
 921test_expect_success 'inner whitespace kept verbatim' '
 922        git config section.val "foo       bar" &&
 923        echo "foo         bar" >expect &&
 924        git config section.val >actual &&
 925        test_cmp expect actual
 926'
 927
 928test_expect_success SYMLINKS 'symlinked configuration' '
 929        ln -s notyet myconfig &&
 930        GIT_CONFIG=myconfig git config test.frotz nitfol &&
 931        test -h myconfig &&
 932        test -f notyet &&
 933        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 934        GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
 935        test -h myconfig &&
 936        test -f notyet &&
 937        cat >expect <<-\EOF &&
 938        nitfol
 939        rezrov
 940        EOF
 941        {
 942                GIT_CONFIG=notyet git config test.frotz &&
 943                GIT_CONFIG=notyet git config test.xyzzy
 944        } >actual &&
 945        test_cmp expect actual
 946'
 947
 948test_expect_success 'nonexistent configuration' '
 949        (
 950                GIT_CONFIG=doesnotexist &&
 951                export GIT_CONFIG &&
 952                test_must_fail git config --list &&
 953                test_must_fail git config test.xyzzy
 954        )
 955'
 956
 957test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
 958        ln -s doesnotexist linktonada &&
 959        ln -s linktonada linktolinktonada &&
 960        (
 961                GIT_CONFIG=linktonada &&
 962                export GIT_CONFIG &&
 963                test_must_fail git config --list &&
 964                GIT_CONFIG=linktolinktonada &&
 965                test_must_fail git config --list
 966        )
 967'
 968
 969test_expect_success 'check split_cmdline return' "
 970        git config alias.split-cmdline-fix 'echo \"' &&
 971        test_must_fail git split-cmdline-fix &&
 972        echo foo > foo &&
 973        git add foo &&
 974        git commit -m 'initial commit' &&
 975        git config branch.master.mergeoptions 'echo \"' &&
 976        test_must_fail git merge master
 977"
 978
 979test_expect_success 'git -c "key=value" support' '
 980        cat >expect <<-\EOF &&
 981        value
 982        value
 983        true
 984        EOF
 985        {
 986                git -c core.name=value config core.name &&
 987                git -c foo.CamelCase=value config foo.camelcase &&
 988                git -c foo.flag config --bool foo.flag
 989        } >actual &&
 990        test_cmp expect actual &&
 991        test_must_fail git -c name=value config core.name
 992'
 993
 994test_expect_success 'key sanity-checking' '
 995        test_must_fail git config foo=bar &&
 996        test_must_fail git config foo=.bar &&
 997        test_must_fail git config foo.ba=r &&
 998        test_must_fail git config foo.1bar &&
 999        test_must_fail git config foo."ba
1000                                z".bar &&
1001        test_must_fail git config . false &&
1002        test_must_fail git config .foo false &&
1003        test_must_fail git config foo. false &&
1004        test_must_fail git config .foo. false &&
1005        git config foo.bar true &&
1006        git config foo."ba =z".bar false
1007'
1008
1009test_expect_success 'git -c works with aliases of builtins' '
1010        git config alias.checkconfig "-c foo.check=bar config foo.check" &&
1011        echo bar >expect &&
1012        git checkconfig >actual &&
1013        test_cmp expect actual
1014'
1015
1016test_expect_success 'git -c does not split values on equals' '
1017        echo "value with = in it" >expect &&
1018        git -c core.foo="value with = in it" config core.foo >actual &&
1019        test_cmp expect actual
1020'
1021
1022test_expect_success 'git -c dies on bogus config' '
1023        test_must_fail git -c core.bare=foo rev-parse
1024'
1025
1026test_expect_success 'git -c complains about empty key' '
1027        test_must_fail git -c "=foo" rev-parse
1028'
1029
1030test_expect_success 'git -c complains about empty key and value' '
1031        test_must_fail git -c "" rev-parse
1032'
1033
1034test_expect_success 'git config --edit works' '
1035        git config -f tmp test.value no &&
1036        echo test.value=yes >expect &&
1037        GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
1038        git config -f tmp --list >actual &&
1039        test_cmp expect actual
1040'
1041
1042test_expect_success 'git config --edit respects core.editor' '
1043        git config -f tmp test.value no &&
1044        echo test.value=yes >expect &&
1045        test_config core.editor "echo [test]value=yes >" &&
1046        git config -f tmp --edit &&
1047        git config -f tmp --list >actual &&
1048        test_cmp expect actual
1049'
1050
1051# malformed configuration files
1052test_expect_success 'barf on syntax error' '
1053        cat >.git/config <<-\EOF &&
1054        # broken section line
1055        [section]
1056        key garbage
1057        EOF
1058        test_must_fail git config --get section.key >actual 2>error &&
1059        grep " line 3 " error
1060'
1061
1062test_expect_success 'barf on incomplete section header' '
1063        cat >.git/config <<-\EOF &&
1064        # broken section line
1065        [section
1066        key = value
1067        EOF
1068        test_must_fail git config --get section.key >actual 2>error &&
1069        grep " line 2 " error
1070'
1071
1072test_expect_success 'barf on incomplete string' '
1073        cat >.git/config <<-\EOF &&
1074        # broken section line
1075        [section]
1076        key = "value string
1077        EOF
1078        test_must_fail git config --get section.key >actual 2>error &&
1079        grep " line 3 " error
1080'
1081
1082test_done