t / t1300-repo-config.shon commit builtin/config: introduce `color` type specifier (63e2a0f)
   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
 357nextsection.nonewline
 358123456.a123
 359version.1.2.3eX.alpha
 360EOF
 361
 362test_expect_success '--name-only --list' '
 363        git config --name-only --list >output &&
 364        test_cmp expect output
 365'
 366
 367cat > expect << EOF
 368beta.noindent sillyValue
 369nextsection.nonewline wow2 for me
 370EOF
 371
 372test_expect_success '--get-regexp' '
 373        git config --get-regexp in >output &&
 374        test_cmp expect output
 375'
 376
 377cat > expect << EOF
 378beta.noindent
 379nextsection.nonewline
 380EOF
 381
 382test_expect_success '--name-only --get-regexp' '
 383        git config --name-only --get-regexp in >output &&
 384        test_cmp expect output
 385'
 386
 387cat > expect << EOF
 388wow2 for me
 389wow4 for you
 390EOF
 391
 392test_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'
 397
 398cat > .git/config << EOF
 399[novalue]
 400        variable
 401[emptyvalue]
 402        variable =
 403EOF
 404
 405test_expect_success 'get variable with no value' '
 406        git config --get novalue.variable ^$
 407'
 408
 409test_expect_success 'get variable with empty value' '
 410        git config --get emptyvalue.variable ^$
 411'
 412
 413echo novalue.variable > expect
 414
 415test_expect_success 'get-regexp variable with no value' '
 416        git config --get-regexp novalue > output &&
 417        test_cmp expect output
 418'
 419
 420echo 'novalue.variable true' > expect
 421
 422test_expect_success 'get-regexp --bool variable with no value' '
 423        git config --bool --get-regexp novalue > output &&
 424        test_cmp expect output
 425'
 426
 427echo 'emptyvalue.variable ' > expect
 428
 429test_expect_success 'get-regexp variable with empty value' '
 430        git config --get-regexp emptyvalue > output &&
 431        test_cmp expect output
 432'
 433
 434echo true > expect
 435
 436test_expect_success 'get bool variable with no value' '
 437        git config --bool novalue.variable > output &&
 438        test_cmp expect output
 439'
 440
 441echo false > expect
 442
 443test_expect_success 'get bool variable with empty value' '
 444        git config --bool emptyvalue.variable > output &&
 445        test_cmp expect output
 446'
 447
 448test_expect_success 'no arguments, but no crash' '
 449        test_must_fail git config >output 2>&1 &&
 450        test_i18ngrep usage output
 451'
 452
 453cat > .git/config << EOF
 454[a.b]
 455        c = d
 456EOF
 457
 458cat > expect << EOF
 459[a.b]
 460        c = d
 461[a]
 462        x = y
 463EOF
 464
 465test_expect_success 'new section is partial match of another' '
 466        git config a.x y &&
 467        test_cmp expect .git/config
 468'
 469
 470cat > expect << EOF
 471[a.b]
 472        c = d
 473[a]
 474        x = y
 475        b = c
 476[b]
 477        x = y
 478EOF
 479
 480test_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'
 485
 486test_expect_success 'alternative --file (non-existing file should fail)' '
 487        test_must_fail git config --file non-existing-config -l
 488'
 489
 490cat > other-config << EOF
 491[ein]
 492        bahn = strasse
 493EOF
 494
 495cat > expect << EOF
 496ein.bahn=strasse
 497EOF
 498
 499test_expect_success 'alternative GIT_CONFIG' '
 500        GIT_CONFIG=other-config git config --list >output &&
 501        test_cmp expect output
 502'
 503
 504test_expect_success 'alternative GIT_CONFIG (--file)' '
 505        git config --file other-config --list >output &&
 506        test_cmp expect output
 507'
 508
 509test_expect_success 'alternative GIT_CONFIG (--file=-)' '
 510        git config --file - --list <other-config >output &&
 511        test_cmp expect output
 512'
 513
 514test_expect_success 'setting a value in stdin is an error' '
 515        test_must_fail git config --file - some.value foo
 516'
 517
 518test_expect_success 'editing stdin is an error' '
 519        test_must_fail git config --file - --edit
 520'
 521
 522test_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
 531'
 532
 533test_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'
 540
 541cat > expect << EOF
 542[ein]
 543        bahn = strasse
 544[anwohner]
 545        park = ausweis
 546EOF
 547
 548test_expect_success '--set in alternative file' '
 549        git config --file=other-config anwohner.park ausweis &&
 550        test_cmp expect other-config
 551'
 552
 553cat > .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
 563
 564test_expect_success 'rename section' '
 565        git config --rename-section branch.eins branch.zwei
 566'
 567
 568cat > 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
 578
 579test_expect_success 'rename succeeded' '
 580        test_cmp expect .git/config
 581'
 582
 583test_expect_success 'rename non-existing section' '
 584        test_must_fail git config --rename-section \
 585                branch."world domination" branch.drei
 586'
 587
 588test_expect_success 'rename succeeded' '
 589        test_cmp expect .git/config
 590'
 591
 592test_expect_success 'rename another section' '
 593        git config --rename-section branch."1 234 blabl/a" branch.drei
 594'
 595
 596cat > expect << EOF
 597# Hallo
 598        #Bello
 599[branch "zwei"]
 600        x = 1
 601[branch "zwei"]
 602        y = 1
 603[branch "drei"]
 604weird
 605EOF
 606
 607test_expect_success 'rename succeeded' '
 608        test_cmp expect .git/config
 609'
 610
 611cat >> .git/config << EOF
 612[branch "vier"] z = 1
 613EOF
 614
 615test_expect_success 'rename a section with a var on the same line' '
 616        git config --rename-section branch.vier branch.zwei
 617'
 618
 619cat > 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
 631
 632test_expect_success 'rename succeeded' '
 633        test_cmp expect .git/config
 634'
 635
 636test_expect_success 'renaming empty section name is rejected' '
 637        test_must_fail git config --rename-section branch.zwei ""
 638'
 639
 640test_expect_success 'renaming to bogus section is rejected' '
 641        test_must_fail git config --rename-section branch.zwei "bogus name"
 642'
 643
 644cat >> .git/config << EOF
 645  [branch "zwei"] a = 1 [branch "vier"]
 646EOF
 647
 648test_expect_success 'remove section' '
 649        git config --remove-section branch.zwei
 650'
 651
 652cat > expect << EOF
 653# Hallo
 654        #Bello
 655[branch "drei"]
 656weird
 657EOF
 658
 659test_expect_success 'section was removed properly' '
 660        test_cmp expect .git/config
 661'
 662
 663cat > expect << EOF
 664[gitcvs]
 665        enabled = true
 666        dbname = %Ggitcvs2.%a.%m.sqlite
 667[gitcvs "ext"]
 668        dbname = %Ggitcvs1.%a.%m.sqlite
 669EOF
 670
 671test_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
 678'
 679
 680test_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'
 689
 690test_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'
 696
 697test_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        test_must_fail git config --int --get aninvalid.unit 2>actual &&
 703        test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
 704'
 705
 706test_expect_success 'line number is reported correctly' '
 707        printf "[bool]\n\tvar\n" >invalid &&
 708        test_must_fail git config -f invalid --path bool.var 2>actual &&
 709        test_i18ngrep "line 2" actual
 710'
 711
 712test_expect_success 'invalid stdin config' '
 713        echo "[broken" | test_must_fail git config --list --file - >output 2>&1 &&
 714        test_i18ngrep "bad config line 1 in standard input" output
 715'
 716
 717cat > expect << EOF
 718true
 719false
 720true
 721false
 722true
 723false
 724true
 725false
 726EOF
 727
 728test_expect_success bool '
 729
 730        git config bool.true1 01 &&
 731        git config bool.true2 -1 &&
 732        git config bool.true3 YeS &&
 733        git config bool.true4 true &&
 734        git config bool.false1 000 &&
 735        git config bool.false2 "" &&
 736        git config bool.false3 nO &&
 737        git config bool.false4 FALSE &&
 738        rm -f result &&
 739        for i in 1 2 3 4
 740        do
 741            git config --bool --get bool.true$i >>result
 742            git config --bool --get bool.false$i >>result
 743        done &&
 744        test_cmp expect result'
 745
 746test_expect_success 'invalid bool (--get)' '
 747
 748        git config bool.nobool foobar &&
 749        test_must_fail git config --bool --get bool.nobool'
 750
 751test_expect_success 'invalid bool (set)' '
 752
 753        test_must_fail git config --bool bool.nobool foobar'
 754
 755cat > expect <<\EOF
 756[bool]
 757        true1 = true
 758        true2 = true
 759        true3 = true
 760        true4 = true
 761        false1 = false
 762        false2 = false
 763        false3 = false
 764        false4 = false
 765EOF
 766
 767test_expect_success 'set --bool' '
 768
 769        rm -f .git/config &&
 770        git config --bool bool.true1 01 &&
 771        git config --bool bool.true2 -1 &&
 772        git config --bool bool.true3 YeS &&
 773        git config --bool bool.true4 true &&
 774        git config --bool bool.false1 000 &&
 775        git config --bool bool.false2 "" &&
 776        git config --bool bool.false3 nO &&
 777        git config --bool bool.false4 FALSE &&
 778        test_cmp expect .git/config'
 779
 780cat > expect <<\EOF
 781[int]
 782        val1 = 1
 783        val2 = -1
 784        val3 = 5242880
 785EOF
 786
 787test_expect_success 'set --int' '
 788
 789        rm -f .git/config &&
 790        git config --int int.val1 01 &&
 791        git config --int int.val2 -1 &&
 792        git config --int int.val3 5m &&
 793        test_cmp expect .git/config
 794'
 795
 796test_expect_success 'get --bool-or-int' '
 797        cat >.git/config <<-\EOF &&
 798        [bool]
 799        true1
 800        true2 = true
 801        false = false
 802        [int]
 803        int1 = 0
 804        int2 = 1
 805        int3 = -1
 806        EOF
 807        cat >expect <<-\EOF &&
 808        true
 809        true
 810        false
 811        0
 812        1
 813        -1
 814        EOF
 815        {
 816                git config --bool-or-int bool.true1 &&
 817                git config --bool-or-int bool.true2 &&
 818                git config --bool-or-int bool.false &&
 819                git config --bool-or-int int.int1 &&
 820                git config --bool-or-int int.int2 &&
 821                git config --bool-or-int int.int3
 822        } >actual &&
 823        test_cmp expect actual
 824'
 825
 826cat >expect <<\EOF
 827[bool]
 828        true1 = true
 829        false1 = false
 830        true2 = true
 831        false2 = false
 832[int]
 833        int1 = 0
 834        int2 = 1
 835        int3 = -1
 836EOF
 837
 838test_expect_success 'set --bool-or-int' '
 839        rm -f .git/config &&
 840        git config --bool-or-int bool.true1 true &&
 841        git config --bool-or-int bool.false1 false &&
 842        git config --bool-or-int bool.true2 yes &&
 843        git config --bool-or-int bool.false2 no &&
 844        git config --bool-or-int int.int1 0 &&
 845        git config --bool-or-int int.int2 1 &&
 846        git config --bool-or-int int.int3 -1 &&
 847        test_cmp expect .git/config
 848'
 849
 850cat >expect <<\EOF
 851[path]
 852        home = ~/
 853        normal = /dev/null
 854        trailingtilde = foo~
 855EOF
 856
 857test_expect_success !MINGW 'set --path' '
 858        rm -f .git/config &&
 859        git config --path path.home "~/" &&
 860        git config --path path.normal "/dev/null" &&
 861        git config --path path.trailingtilde "foo~" &&
 862        test_cmp expect .git/config'
 863
 864if test_have_prereq !MINGW && test "${HOME+set}"
 865then
 866        test_set_prereq HOMEVAR
 867fi
 868
 869cat >expect <<EOF
 870$HOME/
 871/dev/null
 872foo~
 873EOF
 874
 875test_expect_success HOMEVAR 'get --path' '
 876        git config --get --path path.home > result &&
 877        git config --get --path path.normal >> result &&
 878        git config --get --path path.trailingtilde >> result &&
 879        test_cmp expect result
 880'
 881
 882cat >expect <<\EOF
 883/dev/null
 884foo~
 885EOF
 886
 887test_expect_success !MINGW 'get --path copes with unset $HOME' '
 888        (
 889                unset HOME;
 890                test_must_fail git config --get --path path.home \
 891                        >result 2>msg &&
 892                git config --get --path path.normal >>result &&
 893                git config --get --path path.trailingtilde >>result
 894        ) &&
 895        test_i18ngrep "[Ff]ailed to expand.*~/" msg &&
 896        test_cmp expect result
 897'
 898
 899test_expect_success 'get --path barfs on boolean variable' '
 900        echo "[path]bool" >.git/config &&
 901        test_must_fail git config --get --path path.bool
 902'
 903
 904test_expect_success 'get --expiry-date' '
 905        rel="3.weeks.5.days.00:00" &&
 906        rel_out="$rel ->" &&
 907        cat >.git/config <<-\EOF &&
 908        [date]
 909        valid1 = "3.weeks.5.days 00:00"
 910        valid2 = "Fri Jun 4 15:46:55 2010"
 911        valid3 = "2017/11/11 11:11:11PM"
 912        valid4 = "2017/11/10 09:08:07 PM"
 913        valid5 = "never"
 914        invalid1 = "abc"
 915        EOF
 916        cat >expect <<-EOF &&
 917        $(test-date timestamp $rel)
 918        1275666415
 919        1510441871
 920        1510348087
 921        0
 922        EOF
 923        {
 924                echo "$rel_out $(git config --expiry-date date.valid1)"
 925                git config --expiry-date date.valid2 &&
 926                git config --expiry-date date.valid3 &&
 927                git config --expiry-date date.valid4 &&
 928                git config --expiry-date date.valid5
 929        } >actual &&
 930        test_cmp expect actual &&
 931        test_must_fail git config --expiry-date date.invalid1
 932'
 933
 934test_expect_success 'get --type=color' '
 935        rm .git/config &&
 936        git config foo.color "red" &&
 937        git config --get --type=color foo.color >actual.raw &&
 938        test_decode_color <actual.raw >actual &&
 939        echo "<RED>" >expect &&
 940        test_cmp expect actual
 941'
 942
 943cat >expect << EOF
 944[foo]
 945        color = red
 946EOF
 947
 948test_expect_success 'set --type=color' '
 949        rm .git/config &&
 950        git config --type=color foo.color "red" &&
 951        test_cmp expect .git/config
 952'
 953
 954test_expect_success 'get --type=color barfs on non-color' '
 955        echo "[foo]bar=not-a-color" >.git/config &&
 956        test_must_fail git config --get --type=color foo.bar
 957'
 958
 959test_expect_success 'set --type=color barfs on non-color' '
 960        test_must_fail git config --type=color foo.color "not-a-color" 2>error &&
 961        test_i18ngrep "cannot parse color" error
 962'
 963
 964cat > expect << EOF
 965[quote]
 966        leading = " test"
 967        ending = "test "
 968        semicolon = "test;test"
 969        hash = "test#test"
 970EOF
 971test_expect_success 'quoting' '
 972        rm -f .git/config &&
 973        git config quote.leading " test" &&
 974        git config quote.ending "test " &&
 975        git config quote.semicolon "test;test" &&
 976        git config quote.hash "test#test" &&
 977        test_cmp expect .git/config
 978'
 979
 980test_expect_success 'key with newline' '
 981        test_must_fail git config "key.with
 982newline" 123'
 983
 984test_expect_success 'value with newline' 'git config key.sub value.with\\\
 985newline'
 986
 987cat > .git/config <<\EOF
 988[section]
 989        ; comment \
 990        continued = cont\
 991inued
 992        noncont   = not continued ; \
 993        quotecont = "cont;\
 994inued"
 995EOF
 996
 997cat > expect <<\EOF
 998section.continued=continued
 999section.noncont=not continued
1000section.quotecont=cont;inued
1001EOF
1002
1003test_expect_success 'value continued on next line' '
1004        git config --list > result &&
1005        test_cmp result expect
1006'
1007
1008cat > .git/config <<\EOF
1009[section "sub=section"]
1010        val1 = foo=bar
1011        val2 = foo\nbar
1012        val3 = \n\n
1013        val4 =
1014        val5
1015EOF
1016
1017cat > expect <<\EOF
1018section.sub=section.val1
1019foo=barQsection.sub=section.val2
1020foo
1021barQsection.sub=section.val3
1022
1023
1024Qsection.sub=section.val4
1025Qsection.sub=section.val5Q
1026EOF
1027test_expect_success '--null --list' '
1028        git config --null --list >result.raw &&
1029        nul_to_q <result.raw >result &&
1030        echo >>result &&
1031        test_cmp expect result
1032'
1033
1034test_expect_success '--null --get-regexp' '
1035        git config --null --get-regexp "val[0-9]" >result.raw &&
1036        nul_to_q <result.raw >result &&
1037        echo >>result &&
1038        test_cmp expect result
1039'
1040
1041test_expect_success 'inner whitespace kept verbatim' '
1042        git config section.val "foo       bar" &&
1043        echo "foo         bar" >expect &&
1044        git config section.val >actual &&
1045        test_cmp expect actual
1046'
1047
1048test_expect_success SYMLINKS 'symlinked configuration' '
1049        ln -s notyet myconfig &&
1050        git config --file=myconfig test.frotz nitfol &&
1051        test -h myconfig &&
1052        test -f notyet &&
1053        test "z$(git config --file=notyet test.frotz)" = znitfol &&
1054        git config --file=myconfig test.xyzzy rezrov &&
1055        test -h myconfig &&
1056        test -f notyet &&
1057        cat >expect <<-\EOF &&
1058        nitfol
1059        rezrov
1060        EOF
1061        {
1062                git config --file=notyet test.frotz &&
1063                git config --file=notyet test.xyzzy
1064        } >actual &&
1065        test_cmp expect actual
1066'
1067
1068test_expect_success 'nonexistent configuration' '
1069        test_must_fail git config --file=doesnotexist --list &&
1070        test_must_fail git config --file=doesnotexist test.xyzzy
1071'
1072
1073test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
1074        ln -s doesnotexist linktonada &&
1075        ln -s linktonada linktolinktonada &&
1076        test_must_fail git config --file=linktonada --list &&
1077        test_must_fail git config --file=linktolinktonada --list
1078'
1079
1080test_expect_success 'check split_cmdline return' "
1081        git config alias.split-cmdline-fix 'echo \"' &&
1082        test_must_fail git split-cmdline-fix &&
1083        echo foo > foo &&
1084        git add foo &&
1085        git commit -m 'initial commit' &&
1086        git config branch.master.mergeoptions 'echo \"' &&
1087        test_must_fail git merge master
1088"
1089
1090test_expect_success 'git -c "key=value" support' '
1091        cat >expect <<-\EOF &&
1092        value
1093        value
1094        true
1095        EOF
1096        {
1097                git -c core.name=value config core.name &&
1098                git -c foo.CamelCase=value config foo.camelcase &&
1099                git -c foo.flag config --bool foo.flag
1100        } >actual &&
1101        test_cmp expect actual &&
1102        test_must_fail git -c name=value config core.name
1103'
1104
1105# We just need a type-specifier here that cares about the
1106# distinction internally between a NULL boolean and a real
1107# string (because most of git's internal parsers do care).
1108# Using "--path" works, but we do not otherwise care about
1109# its semantics.
1110test_expect_success 'git -c can represent empty string' '
1111        echo >expect &&
1112        git -c foo.empty= config --path foo.empty >actual &&
1113        test_cmp expect actual
1114'
1115
1116test_expect_success 'key sanity-checking' '
1117        test_must_fail git config foo=bar &&
1118        test_must_fail git config foo=.bar &&
1119        test_must_fail git config foo.ba=r &&
1120        test_must_fail git config foo.1bar &&
1121        test_must_fail git config foo."ba
1122                                z".bar &&
1123        test_must_fail git config . false &&
1124        test_must_fail git config .foo false &&
1125        test_must_fail git config foo. false &&
1126        test_must_fail git config .foo. false &&
1127        git config foo.bar true &&
1128        git config foo."ba =z".bar false
1129'
1130
1131test_expect_success 'git -c works with aliases of builtins' '
1132        git config alias.checkconfig "-c foo.check=bar config foo.check" &&
1133        echo bar >expect &&
1134        git checkconfig >actual &&
1135        test_cmp expect actual
1136'
1137
1138test_expect_success 'aliases can be CamelCased' '
1139        test_config alias.CamelCased "rev-parse HEAD" &&
1140        git CamelCased >out &&
1141        git rev-parse HEAD >expect &&
1142        test_cmp expect out
1143'
1144
1145test_expect_success 'git -c does not split values on equals' '
1146        echo "value with = in it" >expect &&
1147        git -c core.foo="value with = in it" config core.foo >actual &&
1148        test_cmp expect actual
1149'
1150
1151test_expect_success 'git -c dies on bogus config' '
1152        test_must_fail git -c core.bare=foo rev-parse
1153'
1154
1155test_expect_success 'git -c complains about empty key' '
1156        test_must_fail git -c "=foo" rev-parse
1157'
1158
1159test_expect_success 'git -c complains about empty key and value' '
1160        test_must_fail git -c "" rev-parse
1161'
1162
1163test_expect_success 'multiple git -c appends config' '
1164        test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
1165        cat >expect <<-\EOF &&
1166        x.one 1
1167        x.two 2
1168        EOF
1169        git -c x.one=1 x >actual &&
1170        test_cmp expect actual
1171'
1172
1173test_expect_success 'last one wins: two level vars' '
1174
1175        # sec.var and sec.VAR are the same variable, as the first
1176        # and the last level of a configuration variable name is
1177        # case insensitive.
1178
1179        echo VAL >expect &&
1180
1181        git -c sec.var=val -c sec.VAR=VAL config --get sec.var >actual &&
1182        test_cmp expect actual &&
1183        git -c SEC.var=val -c sec.var=VAL config --get sec.var >actual &&
1184        test_cmp expect actual &&
1185
1186        git -c sec.var=val -c sec.VAR=VAL config --get SEC.var >actual &&
1187        test_cmp expect actual &&
1188        git -c SEC.var=val -c sec.var=VAL config --get sec.VAR >actual &&
1189        test_cmp expect actual
1190'
1191
1192test_expect_success 'last one wins: three level vars' '
1193
1194        # v.a.r and v.A.r are not the same variable, as the middle
1195        # level of a three-level configuration variable name is
1196        # case sensitive.
1197
1198        echo val >expect &&
1199        git -c v.a.r=val -c v.A.r=VAL config --get v.a.r >actual &&
1200        test_cmp expect actual &&
1201        git -c v.a.r=val -c v.A.r=VAL config --get V.a.R >actual &&
1202        test_cmp expect actual &&
1203
1204        # v.a.r and V.a.R are the same variable, as the first
1205        # and the last level of a configuration variable name is
1206        # case insensitive.
1207
1208        echo VAL >expect &&
1209        git -c v.a.r=val -c v.a.R=VAL config --get v.a.r >actual &&
1210        test_cmp expect actual &&
1211        git -c v.a.r=val -c V.a.r=VAL config --get v.a.r >actual &&
1212        test_cmp expect actual &&
1213        git -c v.a.r=val -c v.a.R=VAL config --get V.a.R >actual &&
1214        test_cmp expect actual &&
1215        git -c v.a.r=val -c V.a.r=VAL config --get V.a.R >actual &&
1216        test_cmp expect actual
1217'
1218
1219for VAR in a .a a. a.0b a."b c". a."b c".0d
1220do
1221        test_expect_success "git -c $VAR=VAL rejects invalid '$VAR'" '
1222                test_must_fail git -c "$VAR=VAL" config -l
1223        '
1224done
1225
1226for VAR in a.b a."b c".d
1227do
1228        test_expect_success "git -c $VAR=VAL works with valid '$VAR'" '
1229                echo VAL >expect &&
1230                git -c "$VAR=VAL" config --get "$VAR" >actual &&
1231                test_cmp expect actual
1232        '
1233done
1234
1235test_expect_success 'git -c is not confused by empty environment' '
1236        GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
1237'
1238
1239sq="'"
1240test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
1241        cat >expect <<-\EOF &&
1242        env.one one
1243        env.two two
1244        EOF
1245        GIT_CONFIG_PARAMETERS="${sq}env.one=one${sq} ${sq}env.two=two${sq}" \
1246                git config --get-regexp "env.*" >actual &&
1247        test_cmp expect actual &&
1248
1249        cat >expect <<-EOF &&
1250        env.one one${sq}
1251        env.two two
1252        EOF
1253        GIT_CONFIG_PARAMETERS="${sq}env.one=one${sq}\\$sq$sq$sq ${sq}env.two=two${sq}" \
1254                git config --get-regexp "env.*" >actual &&
1255        test_cmp expect actual &&
1256
1257        test_must_fail env \
1258                GIT_CONFIG_PARAMETERS="${sq}env.one=one${sq}\\$sq ${sq}env.two=two${sq}" \
1259                git config --get-regexp "env.*"
1260'
1261
1262test_expect_success 'git config --edit works' '
1263        git config -f tmp test.value no &&
1264        echo test.value=yes >expect &&
1265        GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
1266        git config -f tmp --list >actual &&
1267        test_cmp expect actual
1268'
1269
1270test_expect_success 'git config --edit respects core.editor' '
1271        git config -f tmp test.value no &&
1272        echo test.value=yes >expect &&
1273        test_config core.editor "echo [test]value=yes >" &&
1274        git config -f tmp --edit &&
1275        git config -f tmp --list >actual &&
1276        test_cmp expect actual
1277'
1278
1279# malformed configuration files
1280test_expect_success 'barf on syntax error' '
1281        cat >.git/config <<-\EOF &&
1282        # broken section line
1283        [section]
1284        key garbage
1285        EOF
1286        test_must_fail git config --get section.key >actual 2>error &&
1287        test_i18ngrep " line 3 " error
1288'
1289
1290test_expect_success 'barf on incomplete section header' '
1291        cat >.git/config <<-\EOF &&
1292        # broken section line
1293        [section
1294        key = value
1295        EOF
1296        test_must_fail git config --get section.key >actual 2>error &&
1297        test_i18ngrep " line 2 " error
1298'
1299
1300test_expect_success 'barf on incomplete string' '
1301        cat >.git/config <<-\EOF &&
1302        # broken section line
1303        [section]
1304        key = "value string
1305        EOF
1306        test_must_fail git config --get section.key >actual 2>error &&
1307        test_i18ngrep " line 3 " error
1308'
1309
1310test_expect_success 'urlmatch' '
1311        cat >.git/config <<-\EOF &&
1312        [http]
1313                sslVerify
1314        [http "https://weak.example.com"]
1315                sslVerify = false
1316                cookieFile = /tmp/cookie.txt
1317        EOF
1318
1319        test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
1320        test_must_be_empty actual &&
1321
1322        echo true >expect &&
1323        git config --bool --get-urlmatch http.SSLverify https://good.example.com >actual &&
1324        test_cmp expect actual &&
1325
1326        echo false >expect &&
1327        git config --bool --get-urlmatch http.sslverify https://weak.example.com >actual &&
1328        test_cmp expect actual &&
1329
1330        {
1331                echo http.cookiefile /tmp/cookie.txt &&
1332                echo http.sslverify false
1333        } >expect &&
1334        git config --get-urlmatch HTTP https://weak.example.com >actual &&
1335        test_cmp expect actual
1336'
1337
1338test_expect_success 'urlmatch favors more specific URLs' '
1339        cat >.git/config <<-\EOF &&
1340        [http "https://example.com/"]
1341                cookieFile = /tmp/root.txt
1342        [http "https://example.com/subdirectory"]
1343                cookieFile = /tmp/subdirectory.txt
1344        [http "https://user@example.com/"]
1345                cookieFile = /tmp/user.txt
1346        [http "https://averylonguser@example.com/"]
1347                cookieFile = /tmp/averylonguser.txt
1348        [http "https://preceding.example.com"]
1349                cookieFile = /tmp/preceding.txt
1350        [http "https://*.example.com"]
1351                cookieFile = /tmp/wildcard.txt
1352        [http "https://*.example.com/wildcardwithsubdomain"]
1353                cookieFile = /tmp/wildcardwithsubdomain.txt
1354        [http "https://trailing.example.com"]
1355                cookieFile = /tmp/trailing.txt
1356        [http "https://user@*.example.com/"]
1357                cookieFile = /tmp/wildcardwithuser.txt
1358        [http "https://sub.example.com/"]
1359                cookieFile = /tmp/sub.txt
1360        EOF
1361
1362        echo http.cookiefile /tmp/root.txt >expect &&
1363        git config --get-urlmatch HTTP https://example.com >actual &&
1364        test_cmp expect actual &&
1365
1366        echo http.cookiefile /tmp/subdirectory.txt >expect &&
1367        git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
1368        test_cmp expect actual &&
1369
1370        echo http.cookiefile /tmp/subdirectory.txt >expect &&
1371        git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
1372        test_cmp expect actual &&
1373
1374        echo http.cookiefile /tmp/user.txt >expect &&
1375        git config --get-urlmatch HTTP https://user@example.com/ >actual &&
1376        test_cmp expect actual &&
1377
1378        echo http.cookiefile /tmp/subdirectory.txt >expect &&
1379        git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
1380        test_cmp expect actual &&
1381
1382        echo http.cookiefile /tmp/preceding.txt >expect &&
1383        git config --get-urlmatch HTTP https://preceding.example.com >actual &&
1384        test_cmp expect actual &&
1385
1386        echo http.cookiefile /tmp/wildcard.txt >expect &&
1387        git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
1388        test_cmp expect actual &&
1389
1390        echo http.cookiefile /tmp/sub.txt >expect &&
1391        git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
1392        test_cmp expect actual &&
1393
1394        echo http.cookiefile /tmp/trailing.txt >expect &&
1395        git config --get-urlmatch HTTP https://trailing.example.com >actual &&
1396        test_cmp expect actual &&
1397
1398        echo http.cookiefile /tmp/sub.txt >expect &&
1399        git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
1400        test_cmp expect actual
1401'
1402
1403test_expect_success 'urlmatch with wildcard' '
1404        cat >.git/config <<-\EOF &&
1405        [http]
1406                sslVerify
1407        [http "https://*.example.com"]
1408                sslVerify = false
1409                cookieFile = /tmp/cookie.txt
1410        EOF
1411
1412        test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
1413        test_must_be_empty actual &&
1414
1415        echo true >expect &&
1416        git config --bool --get-urlmatch http.SSLverify https://example.com >actual &&
1417        test_cmp expect actual &&
1418
1419        echo true >expect &&
1420        git config --bool --get-urlmatch http.SSLverify https://good-example.com >actual &&
1421        test_cmp expect actual &&
1422
1423        echo true >expect &&
1424        git config --bool --get-urlmatch http.sslverify https://deep.nested.example.com >actual &&
1425        test_cmp expect actual &&
1426
1427        echo false >expect &&
1428        git config --bool --get-urlmatch http.sslverify https://good.example.com >actual &&
1429        test_cmp expect actual &&
1430
1431        {
1432                echo http.cookiefile /tmp/cookie.txt &&
1433                echo http.sslverify false
1434        } >expect &&
1435        git config --get-urlmatch HTTP https://good.example.com >actual &&
1436        test_cmp expect actual &&
1437
1438        echo http.sslverify >expect &&
1439        git config --get-urlmatch HTTP https://more.example.com.au >actual &&
1440        test_cmp expect actual
1441'
1442
1443# good section hygiene
1444test_expect_failure 'unsetting the last key in a section removes header' '
1445        cat >.git/config <<-\EOF &&
1446        # some generic comment on the configuration file itself
1447        # a comment specific to this "section" section.
1448        [section]
1449        # some intervening lines
1450        # that should also be dropped
1451
1452        key = value
1453        # please be careful when you update the above variable
1454        EOF
1455
1456        cat >expect <<-\EOF &&
1457        # some generic comment on the configuration file itself
1458        EOF
1459
1460        git config --unset section.key &&
1461        test_cmp expect .git/config
1462'
1463
1464test_expect_failure 'adding a key into an empty section reuses header' '
1465        cat >.git/config <<-\EOF &&
1466        [section]
1467        EOF
1468
1469        q_to_tab >expect <<-\EOF &&
1470        [section]
1471        Qkey = value
1472        EOF
1473
1474        git config section.key value &&
1475        test_cmp expect .git/config
1476'
1477
1478test_expect_success POSIXPERM,PERL 'preserves existing permissions' '
1479        chmod 0600 .git/config &&
1480        git config imap.pass Hunter2 &&
1481        perl -e \
1482          "die q(badset) if ((stat(q(.git/config)))[2] & 07777) != 0600" &&
1483        git config --rename-section imap pop &&
1484        perl -e \
1485          "die q(badrename) if ((stat(q(.git/config)))[2] & 07777) != 0600"
1486'
1487
1488! test_have_prereq MINGW ||
1489HOME="$(pwd)" # convert to Windows path
1490
1491test_expect_success 'set up --show-origin tests' '
1492        INCLUDE_DIR="$HOME/include" &&
1493        mkdir -p "$INCLUDE_DIR" &&
1494        cat >"$INCLUDE_DIR"/absolute.include <<-\EOF &&
1495                [user]
1496                        absolute = include
1497        EOF
1498        cat >"$INCLUDE_DIR"/relative.include <<-\EOF &&
1499                [user]
1500                        relative = include
1501        EOF
1502        cat >"$HOME"/.gitconfig <<-EOF &&
1503                [user]
1504                        global = true
1505                        override = global
1506                [include]
1507                        path = "$INCLUDE_DIR/absolute.include"
1508        EOF
1509        cat >.git/config <<-\EOF
1510                [user]
1511                        local = true
1512                        override = local
1513                [include]
1514                        path = ../include/relative.include
1515        EOF
1516'
1517
1518test_expect_success '--show-origin with --list' '
1519        cat >expect <<-EOF &&
1520                file:$HOME/.gitconfig   user.global=true
1521                file:$HOME/.gitconfig   user.override=global
1522                file:$HOME/.gitconfig   include.path=$INCLUDE_DIR/absolute.include
1523                file:$INCLUDE_DIR/absolute.include      user.absolute=include
1524                file:.git/config        user.local=true
1525                file:.git/config        user.override=local
1526                file:.git/config        include.path=../include/relative.include
1527                file:.git/../include/relative.include   user.relative=include
1528                command line:   user.cmdline=true
1529        EOF
1530        git -c user.cmdline=true config --list --show-origin >output &&
1531        test_cmp expect output
1532'
1533
1534test_expect_success '--show-origin with --list --null' '
1535        cat >expect <<-EOF &&
1536                file:$HOME/.gitconfigQuser.global
1537                trueQfile:$HOME/.gitconfigQuser.override
1538                globalQfile:$HOME/.gitconfigQinclude.path
1539                $INCLUDE_DIR/absolute.includeQfile:$INCLUDE_DIR/absolute.includeQuser.absolute
1540                includeQfile:.git/configQuser.local
1541                trueQfile:.git/configQuser.override
1542                localQfile:.git/configQinclude.path
1543                ../include/relative.includeQfile:.git/../include/relative.includeQuser.relative
1544                includeQcommand line:Quser.cmdline
1545                trueQ
1546        EOF
1547        git -c user.cmdline=true config --null --list --show-origin >output.raw &&
1548        nul_to_q <output.raw >output &&
1549        # The here-doc above adds a newline that the --null output would not
1550        # include. Add it here to make the two comparable.
1551        echo >>output &&
1552        test_cmp expect output
1553'
1554
1555test_expect_success '--show-origin with single file' '
1556        cat >expect <<-\EOF &&
1557                file:.git/config        user.local=true
1558                file:.git/config        user.override=local
1559                file:.git/config        include.path=../include/relative.include
1560        EOF
1561        git config --local --list --show-origin >output &&
1562        test_cmp expect output
1563'
1564
1565test_expect_success '--show-origin with --get-regexp' '
1566        cat >expect <<-EOF &&
1567                file:$HOME/.gitconfig   user.global true
1568                file:.git/config        user.local true
1569        EOF
1570        git config --show-origin --get-regexp "user\.[g|l].*" >output &&
1571        test_cmp expect output
1572'
1573
1574test_expect_success '--show-origin getting a single key' '
1575        cat >expect <<-\EOF &&
1576                file:.git/config        local
1577        EOF
1578        git config --show-origin user.override >output &&
1579        test_cmp expect output
1580'
1581
1582test_expect_success 'set up custom config file' '
1583        CUSTOM_CONFIG_FILE="file\" (dq) and spaces.conf" &&
1584        cat >"$CUSTOM_CONFIG_FILE" <<-\EOF
1585                [user]
1586                        custom = true
1587        EOF
1588'
1589
1590test_expect_success !MINGW '--show-origin escape special file name characters' '
1591        cat >expect <<-\EOF &&
1592                file:"file\" (dq) and spaces.conf"      user.custom=true
1593        EOF
1594        git config --file "$CUSTOM_CONFIG_FILE" --show-origin --list >output &&
1595        test_cmp expect output
1596'
1597
1598test_expect_success '--show-origin stdin' '
1599        cat >expect <<-\EOF &&
1600                standard input: user.custom=true
1601        EOF
1602        git config --file - --show-origin --list <"$CUSTOM_CONFIG_FILE" >output &&
1603        test_cmp expect output
1604'
1605
1606test_expect_success '--show-origin stdin with file include' '
1607        cat >"$INCLUDE_DIR"/stdin.include <<-EOF &&
1608                [user]
1609                        stdin = include
1610        EOF
1611        cat >expect <<-EOF &&
1612                file:$INCLUDE_DIR/stdin.include include
1613        EOF
1614        echo "[include]path=\"$INCLUDE_DIR\"/stdin.include" \
1615                | git config --show-origin --includes --file - user.stdin >output &&
1616        test_cmp expect output
1617'
1618
1619test_expect_success !MINGW '--show-origin blob' '
1620        cat >expect <<-\EOF &&
1621                blob:a9d9f9e555b5c6f07cbe09d3f06fe3df11e09c08   user.custom=true
1622        EOF
1623        blob=$(git hash-object -w "$CUSTOM_CONFIG_FILE") &&
1624        git config --blob=$blob --show-origin --list >output &&
1625        test_cmp expect output
1626'
1627
1628test_expect_success !MINGW '--show-origin blob ref' '
1629        cat >expect <<-\EOF &&
1630                blob:"master:file\" (dq) and spaces.conf"       user.custom=true
1631        EOF
1632        git add "$CUSTOM_CONFIG_FILE" &&
1633        git commit -m "new config file" &&
1634        git config --blob=master:"$CUSTOM_CONFIG_FILE" --show-origin --list >output &&
1635        test_cmp expect output
1636'
1637
1638test_expect_success '--local requires a repo' '
1639        # we expect 128 to ensure that we do not simply
1640        # fail to find anything and return code "1"
1641        test_expect_code 128 nongit git config --local foo.bar
1642'
1643
1644cat >.git/config <<-\EOF &&
1645[core]
1646foo = true
1647number = 10
1648big = 1M
1649EOF
1650
1651test_expect_success 'identical modern --type specifiers are allowed' '
1652        git config --type=int --type=int core.big >actual &&
1653        echo 1048576 >expect &&
1654        test_cmp expect actual
1655'
1656
1657test_expect_success 'identical legacy --type specifiers are allowed' '
1658        git config --int --int core.big >actual &&
1659        echo 1048576 >expect &&
1660        test_cmp expect actual
1661'
1662
1663test_expect_success 'identical mixed --type specifiers are allowed' '
1664        git config --int --type=int core.big >actual &&
1665        echo 1048576 >expect &&
1666        test_cmp expect actual
1667'
1668
1669test_expect_success 'non-identical modern --type specifiers are not allowed' '
1670        test_must_fail git config --type=int --type=bool core.big 2>error &&
1671        test_i18ngrep "only one type at a time" error
1672'
1673
1674test_expect_success 'non-identical legacy --type specifiers are not allowed' '
1675        test_must_fail git config --int --bool core.big 2>error &&
1676        test_i18ngrep "only one type at a time" error
1677'
1678
1679test_expect_success 'non-identical mixed --type specifiers are not allowed' '
1680        test_must_fail git config --type=int --bool core.big 2>error &&
1681        test_i18ngrep "only one type at a time" error
1682'
1683
1684test_expect_success '--type allows valid type specifiers' '
1685        echo "true" >expect &&
1686        git config --type=bool core.foo >actual &&
1687        test_cmp expect actual
1688'
1689
1690test_expect_success '--no-type unsets type specifiers' '
1691        echo "10" >expect &&
1692        git config --type=bool --no-type core.number >actual &&
1693        test_cmp expect actual
1694'
1695
1696test_expect_success 'unset type specifiers may be reset to conflicting ones' '
1697        echo 1048576 >expect &&
1698        git config --type=bool --no-type --type=int core.big >actual &&
1699        test_cmp expect actual
1700'
1701
1702test_expect_success '--type rejects unknown specifiers' '
1703        test_must_fail git config --type=nonsense core.foo 2>error &&
1704        test_i18ngrep "unrecognized --type argument" error
1705'
1706
1707test_done