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