t / t1300-repo-config.shon commit t3700-add: fix dependence on stdout and stderr buffering (c1e02b2)
   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 -f .git/config && rm .git/config
  11
  12git config core.penguin "little blue"
  13
  14cat > expect << EOF
  15[core]
  16        penguin = little blue
  17EOF
  18
  19test_expect_success 'initial' 'cmp .git/config expect'
  20
  21git config Core.Movie BadPhysics
  22
  23cat > expect << EOF
  24[core]
  25        penguin = little blue
  26        Movie = BadPhysics
  27EOF
  28
  29test_expect_success 'mixed case' 'cmp .git/config expect'
  30
  31git config Cores.WhatEver Second
  32
  33cat > expect << EOF
  34[core]
  35        penguin = little blue
  36        Movie = BadPhysics
  37[Cores]
  38        WhatEver = Second
  39EOF
  40
  41test_expect_success 'similar section' 'cmp .git/config expect'
  42
  43git config CORE.UPPERCASE true
  44
  45cat > expect << EOF
  46[core]
  47        penguin = little blue
  48        Movie = BadPhysics
  49        UPPERCASE = true
  50[Cores]
  51        WhatEver = Second
  52EOF
  53
  54test_expect_success 'similar section' 'cmp .git/config expect'
  55
  56test_expect_success 'replace with non-match' \
  57        'git config core.penguin kingpin !blue'
  58
  59test_expect_success 'replace with non-match (actually matching)' \
  60        'git config core.penguin "very blue" !kingpin'
  61
  62cat > expect << EOF
  63[core]
  64        penguin = very blue
  65        Movie = BadPhysics
  66        UPPERCASE = true
  67        penguin = kingpin
  68[Cores]
  69        WhatEver = Second
  70EOF
  71
  72test_expect_success 'non-match result' 'cmp .git/config expect'
  73
  74cat > .git/config <<\EOF
  75[alpha]
  76bar = foo
  77[beta]
  78baz = multiple \
  79lines
  80EOF
  81
  82test_expect_success 'unset with cont. lines' \
  83        'git config --unset beta.baz'
  84
  85cat > expect <<\EOF
  86[alpha]
  87bar = foo
  88[beta]
  89EOF
  90
  91test_expect_success 'unset with cont. lines is correct' 'cmp .git/config expect'
  92
  93cat > .git/config << EOF
  94[beta] ; silly comment # another comment
  95noIndent= sillyValue ; 'nother silly comment
  96
  97# empty line
  98                ; comment
  99                haha   ="beta" # last silly comment
 100haha = hello
 101        haha = bello
 102[nextSection] noNewline = ouch
 103EOF
 104
 105cp .git/config .git/config2
 106
 107test_expect_success 'multiple unset' \
 108        'git config --unset-all beta.haha'
 109
 110cat > expect << EOF
 111[beta] ; silly comment # another comment
 112noIndent= sillyValue ; 'nother silly comment
 113
 114# empty line
 115                ; comment
 116[nextSection] noNewline = ouch
 117EOF
 118
 119test_expect_success 'multiple unset is correct' 'cmp .git/config expect'
 120
 121cp .git/config2 .git/config
 122
 123test_expect_success '--replace-all missing value' '
 124        test_must_fail git config --replace-all beta.haha &&
 125        test_cmp .git/config2 .git/config
 126'
 127
 128rm .git/config2
 129
 130test_expect_success '--replace-all' \
 131        'git config --replace-all beta.haha gamma'
 132
 133cat > expect << EOF
 134[beta] ; silly comment # another comment
 135noIndent= sillyValue ; 'nother silly comment
 136
 137# empty line
 138                ; comment
 139        haha = gamma
 140[nextSection] noNewline = ouch
 141EOF
 142
 143test_expect_success 'all replaced' 'cmp .git/config expect'
 144
 145git config beta.haha alpha
 146
 147cat > expect << EOF
 148[beta] ; silly comment # another comment
 149noIndent= sillyValue ; 'nother silly comment
 150
 151# empty line
 152                ; comment
 153        haha = alpha
 154[nextSection] noNewline = ouch
 155EOF
 156
 157test_expect_success 'really mean test' 'cmp .git/config expect'
 158
 159git config nextsection.nonewline wow
 160
 161cat > expect << EOF
 162[beta] ; silly comment # another comment
 163noIndent= sillyValue ; 'nother silly comment
 164
 165# empty line
 166                ; comment
 167        haha = alpha
 168[nextSection]
 169        nonewline = wow
 170EOF
 171
 172test_expect_success 'really really mean test' 'cmp .git/config expect'
 173
 174test_expect_success 'get value' 'test alpha = $(git config beta.haha)'
 175git config --unset beta.haha
 176
 177cat > expect << EOF
 178[beta] ; silly comment # another comment
 179noIndent= sillyValue ; 'nother silly comment
 180
 181# empty line
 182                ; comment
 183[nextSection]
 184        nonewline = wow
 185EOF
 186
 187test_expect_success 'unset' 'cmp .git/config expect'
 188
 189git config nextsection.NoNewLine "wow2 for me" "for me$"
 190
 191cat > expect << EOF
 192[beta] ; silly comment # another comment
 193noIndent= sillyValue ; 'nother silly comment
 194
 195# empty line
 196                ; comment
 197[nextSection]
 198        nonewline = wow
 199        NoNewLine = wow2 for me
 200EOF
 201
 202test_expect_success 'multivar' 'cmp .git/config expect'
 203
 204test_expect_success 'non-match' \
 205        'git config --get nextsection.nonewline !for'
 206
 207test_expect_success 'non-match value' \
 208        'test wow = $(git config --get nextsection.nonewline !for)'
 209
 210test_expect_success 'ambiguous get' '
 211        test_must_fail git config --get nextsection.nonewline
 212'
 213
 214test_expect_success 'get multivar' \
 215        'git config --get-all nextsection.nonewline'
 216
 217git config nextsection.nonewline "wow3" "wow$"
 218
 219cat > expect << EOF
 220[beta] ; silly comment # another comment
 221noIndent= sillyValue ; 'nother silly comment
 222
 223# empty line
 224                ; comment
 225[nextSection]
 226        nonewline = wow3
 227        NoNewLine = wow2 for me
 228EOF
 229
 230test_expect_success 'multivar replace' 'cmp .git/config expect'
 231
 232test_expect_success 'ambiguous value' '
 233        test_must_fail git config nextsection.nonewline
 234'
 235
 236test_expect_success 'ambiguous unset' '
 237        test_must_fail git config --unset nextsection.nonewline
 238'
 239
 240test_expect_success 'invalid unset' '
 241        test_must_fail git config --unset somesection.nonewline
 242'
 243
 244git config --unset nextsection.nonewline "wow3$"
 245
 246cat > expect << EOF
 247[beta] ; silly comment # another comment
 248noIndent= sillyValue ; 'nother silly comment
 249
 250# empty line
 251                ; comment
 252[nextSection]
 253        NoNewLine = wow2 for me
 254EOF
 255
 256test_expect_success 'multivar unset' 'cmp .git/config expect'
 257
 258test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
 259
 260test_expect_success 'correct key' 'git config 123456.a123 987'
 261
 262test_expect_success 'hierarchical section' \
 263        'git config Version.1.2.3eX.Alpha beta'
 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 = wow2 for me
 273[123456]
 274        a123 = 987
 275[Version "1.2.3eX"]
 276        Alpha = beta
 277EOF
 278
 279test_expect_success 'hierarchical section value' 'cmp .git/config expect'
 280
 281cat > expect << EOF
 282beta.noindent=sillyValue
 283nextsection.nonewline=wow2 for me
 284123456.a123=987
 285version.1.2.3eX.alpha=beta
 286EOF
 287
 288test_expect_success 'working --list' \
 289        'git config --list > output && cmp output expect'
 290
 291cat > expect << EOF
 292beta.noindent sillyValue
 293nextsection.nonewline wow2 for me
 294EOF
 295
 296test_expect_success '--get-regexp' \
 297        'git config --get-regexp in > output && cmp output expect'
 298
 299git config --add nextsection.nonewline "wow4 for you"
 300
 301cat > expect << EOF
 302wow2 for me
 303wow4 for you
 304EOF
 305
 306test_expect_success '--add' \
 307        'git config --get-all nextsection.nonewline > output && cmp output expect'
 308
 309cat > .git/config << EOF
 310[novalue]
 311        variable
 312[emptyvalue]
 313        variable =
 314EOF
 315
 316test_expect_success 'get variable with no value' \
 317        'git config --get novalue.variable ^$'
 318
 319test_expect_success 'get variable with empty value' \
 320        'git config --get emptyvalue.variable ^$'
 321
 322echo novalue.variable > expect
 323
 324test_expect_success 'get-regexp variable with no value' \
 325        'git config --get-regexp novalue > output &&
 326         cmp output expect'
 327
 328echo 'emptyvalue.variable ' > expect
 329
 330test_expect_success 'get-regexp variable with empty value' \
 331        'git config --get-regexp emptyvalue > output &&
 332         cmp output expect'
 333
 334echo true > expect
 335
 336test_expect_success 'get bool variable with no value' \
 337        'git config --bool novalue.variable > output &&
 338         cmp output expect'
 339
 340echo false > expect
 341
 342test_expect_success 'get bool variable with empty value' \
 343        'git config --bool emptyvalue.variable > output &&
 344         cmp output expect'
 345
 346test_expect_success 'no arguments, but no crash' '
 347        test_must_fail git config >output 2>&1 &&
 348        grep usage output
 349'
 350
 351cat > .git/config << EOF
 352[a.b]
 353        c = d
 354EOF
 355
 356git config a.x y
 357
 358cat > expect << EOF
 359[a.b]
 360        c = d
 361[a]
 362        x = y
 363EOF
 364
 365test_expect_success 'new section is partial match of another' 'cmp .git/config expect'
 366
 367git config b.x y
 368git config a.b c
 369
 370cat > expect << EOF
 371[a.b]
 372        c = d
 373[a]
 374        x = y
 375        b = c
 376[b]
 377        x = y
 378EOF
 379
 380test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
 381
 382test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' \
 383        'test_must_fail git config --file non-existing-config -l'
 384
 385cat > other-config << EOF
 386[ein]
 387        bahn = strasse
 388EOF
 389
 390cat > expect << EOF
 391ein.bahn=strasse
 392EOF
 393
 394GIT_CONFIG=other-config git config -l > output
 395
 396test_expect_success 'alternative GIT_CONFIG' 'cmp output expect'
 397
 398test_expect_success 'alternative GIT_CONFIG (--file)' \
 399        'git config --file other-config -l > output && cmp output expect'
 400
 401test_expect_success 'refer config from subdirectory' '
 402        mkdir x &&
 403        (
 404                cd x &&
 405                echo strasse >expect
 406                git config --get --file ../other-config ein.bahn >actual &&
 407                test_cmp expect actual
 408        )
 409
 410'
 411
 412GIT_CONFIG=other-config git config anwohner.park ausweis
 413
 414cat > expect << EOF
 415[ein]
 416        bahn = strasse
 417[anwohner]
 418        park = ausweis
 419EOF
 420
 421test_expect_success '--set in alternative GIT_CONFIG' 'cmp other-config expect'
 422
 423cat > .git/config << EOF
 424# Hallo
 425        #Bello
 426[branch "eins"]
 427        x = 1
 428[branch.eins]
 429        y = 1
 430        [branch "1 234 blabl/a"]
 431weird
 432EOF
 433
 434test_expect_success "rename section" \
 435        "git config --rename-section branch.eins branch.zwei"
 436
 437cat > expect << EOF
 438# Hallo
 439        #Bello
 440[branch "zwei"]
 441        x = 1
 442[branch "zwei"]
 443        y = 1
 444        [branch "1 234 blabl/a"]
 445weird
 446EOF
 447
 448test_expect_success "rename succeeded" "test_cmp expect .git/config"
 449
 450test_expect_success "rename non-existing section" '
 451        test_must_fail git config --rename-section \
 452                branch."world domination" branch.drei
 453'
 454
 455test_expect_success "rename succeeded" "test_cmp expect .git/config"
 456
 457test_expect_success "rename another section" \
 458        'git config --rename-section branch."1 234 blabl/a" branch.drei'
 459
 460cat > expect << EOF
 461# Hallo
 462        #Bello
 463[branch "zwei"]
 464        x = 1
 465[branch "zwei"]
 466        y = 1
 467[branch "drei"]
 468weird
 469EOF
 470
 471test_expect_success "rename succeeded" "test_cmp expect .git/config"
 472
 473cat >> .git/config << EOF
 474[branch "vier"] z = 1
 475EOF
 476
 477test_expect_success "rename a section with a var on the same line" \
 478        'git config --rename-section branch.vier branch.zwei'
 479
 480cat > expect << EOF
 481# Hallo
 482        #Bello
 483[branch "zwei"]
 484        x = 1
 485[branch "zwei"]
 486        y = 1
 487[branch "drei"]
 488weird
 489[branch "zwei"]
 490        z = 1
 491EOF
 492
 493test_expect_success "rename succeeded" "test_cmp expect .git/config"
 494
 495cat >> .git/config << EOF
 496  [branch "zwei"] a = 1 [branch "vier"]
 497EOF
 498
 499test_expect_success "remove section" "git config --remove-section branch.zwei"
 500
 501cat > expect << EOF
 502# Hallo
 503        #Bello
 504[branch "drei"]
 505weird
 506EOF
 507
 508test_expect_success "section was removed properly" \
 509        "test_cmp expect .git/config"
 510
 511rm .git/config
 512
 513cat > expect << EOF
 514[gitcvs]
 515        enabled = true
 516        dbname = %Ggitcvs2.%a.%m.sqlite
 517[gitcvs "ext"]
 518        dbname = %Ggitcvs1.%a.%m.sqlite
 519EOF
 520
 521test_expect_success 'section ending' '
 522
 523        git config gitcvs.enabled true &&
 524        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 525        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 526        cmp .git/config expect
 527
 528'
 529
 530test_expect_success numbers '
 531
 532        git config kilo.gram 1k &&
 533        git config mega.ton 1m &&
 534        k=$(git config --int --get kilo.gram) &&
 535        test z1024 = "z$k" &&
 536        m=$(git config --int --get mega.ton) &&
 537        test z1048576 = "z$m"
 538'
 539
 540cat > expect <<EOF
 541fatal: bad config value for 'aninvalid.unit' in .git/config
 542EOF
 543
 544test_expect_success 'invalid unit' '
 545
 546        git config aninvalid.unit "1auto" &&
 547        s=$(git config aninvalid.unit) &&
 548        test "z1auto" = "z$s" &&
 549        if git config --int --get aninvalid.unit 2>actual
 550        then
 551                echo config should have failed
 552                false
 553        fi &&
 554        cmp actual expect
 555'
 556
 557cat > expect << EOF
 558true
 559false
 560true
 561false
 562true
 563false
 564true
 565false
 566EOF
 567
 568test_expect_success bool '
 569
 570        git config bool.true1 01 &&
 571        git config bool.true2 -1 &&
 572        git config bool.true3 YeS &&
 573        git config bool.true4 true &&
 574        git config bool.false1 000 &&
 575        git config bool.false2 "" &&
 576        git config bool.false3 nO &&
 577        git config bool.false4 FALSE &&
 578        rm -f result &&
 579        for i in 1 2 3 4
 580        do
 581            git config --bool --get bool.true$i >>result
 582            git config --bool --get bool.false$i >>result
 583        done &&
 584        cmp expect result'
 585
 586test_expect_success 'invalid bool (--get)' '
 587
 588        git config bool.nobool foobar &&
 589        test_must_fail git config --bool --get bool.nobool'
 590
 591test_expect_success 'invalid bool (set)' '
 592
 593        test_must_fail git config --bool bool.nobool foobar'
 594
 595rm .git/config
 596
 597cat > expect <<\EOF
 598[bool]
 599        true1 = true
 600        true2 = true
 601        true3 = true
 602        true4 = true
 603        false1 = false
 604        false2 = false
 605        false3 = false
 606        false4 = false
 607EOF
 608
 609test_expect_success 'set --bool' '
 610
 611        git config --bool bool.true1 01 &&
 612        git config --bool bool.true2 -1 &&
 613        git config --bool bool.true3 YeS &&
 614        git config --bool bool.true4 true &&
 615        git config --bool bool.false1 000 &&
 616        git config --bool bool.false2 "" &&
 617        git config --bool bool.false3 nO &&
 618        git config --bool bool.false4 FALSE &&
 619        cmp expect .git/config'
 620
 621rm .git/config
 622
 623cat > expect <<\EOF
 624[int]
 625        val1 = 1
 626        val2 = -1
 627        val3 = 5242880
 628EOF
 629
 630test_expect_success 'set --int' '
 631
 632        git config --int int.val1 01 &&
 633        git config --int int.val2 -1 &&
 634        git config --int int.val3 5m &&
 635        cmp expect .git/config'
 636
 637rm .git/config
 638
 639cat >expect <<\EOF
 640[bool]
 641        true1 = true
 642        true2 = true
 643        false1 = false
 644        false2 = false
 645[int]
 646        int1 = 0
 647        int2 = 1
 648        int3 = -1
 649EOF
 650
 651test_expect_success 'get --bool-or-int' '
 652        (
 653                echo "[bool]"
 654                echo true1
 655                echo true2 = true
 656                echo false = false
 657                echo "[int]"
 658                echo int1 = 0
 659                echo int2 = 1
 660                echo int3 = -1
 661        ) >>.git/config &&
 662        test $(git config --bool-or-int bool.true1) = true &&
 663        test $(git config --bool-or-int bool.true2) = true &&
 664        test $(git config --bool-or-int bool.false) = false &&
 665        test $(git config --bool-or-int int.int1) = 0 &&
 666        test $(git config --bool-or-int int.int2) = 1 &&
 667        test $(git config --bool-or-int int.int3) = -1
 668
 669'
 670
 671rm .git/config
 672cat >expect <<\EOF
 673[bool]
 674        true1 = true
 675        false1 = false
 676        true2 = true
 677        false2 = false
 678[int]
 679        int1 = 0
 680        int2 = 1
 681        int3 = -1
 682EOF
 683
 684test_expect_success 'set --bool-or-int' '
 685        git config --bool-or-int bool.true1 true &&
 686        git config --bool-or-int bool.false1 false &&
 687        git config --bool-or-int bool.true2 yes &&
 688        git config --bool-or-int bool.false2 no &&
 689        git config --bool-or-int int.int1 0 &&
 690        git config --bool-or-int int.int2 1 &&
 691        git config --bool-or-int int.int3 -1 &&
 692        test_cmp expect .git/config
 693'
 694
 695rm .git/config
 696
 697cat >expect <<\EOF
 698[path]
 699        home = ~/
 700        normal = /dev/null
 701        trailingtilde = foo~
 702EOF
 703
 704test_expect_success 'set --path' '
 705        git config --path path.home "~/" &&
 706        git config --path path.normal "/dev/null" &&
 707        git config --path path.trailingtilde "foo~" &&
 708        test_cmp expect .git/config'
 709
 710cat >expect <<EOF
 711$HOME/
 712/dev/null
 713foo~
 714EOF
 715
 716test_expect_success 'get --path' '
 717        git config --get --path path.home > result &&
 718        git config --get --path path.normal >> result &&
 719        git config --get --path path.trailingtilde >> result &&
 720        test_cmp expect result
 721'
 722
 723rm .git/config
 724
 725git config quote.leading " test"
 726git config quote.ending "test "
 727git config quote.semicolon "test;test"
 728git config quote.hash "test#test"
 729
 730cat > expect << EOF
 731[quote]
 732        leading = " test"
 733        ending = "test "
 734        semicolon = "test;test"
 735        hash = "test#test"
 736EOF
 737
 738test_expect_success 'quoting' 'cmp .git/config expect'
 739
 740test_expect_success 'key with newline' '
 741        test_must_fail git config "key.with
 742newline" 123'
 743
 744test_expect_success 'value with newline' 'git config key.sub value.with\\\
 745newline'
 746
 747cat > .git/config <<\EOF
 748[section]
 749        ; comment \
 750        continued = cont\
 751inued
 752        noncont   = not continued ; \
 753        quotecont = "cont;\
 754inued"
 755EOF
 756
 757cat > expect <<\EOF
 758section.continued=continued
 759section.noncont=not continued
 760section.quotecont=cont;inued
 761EOF
 762
 763git config --list > result
 764
 765test_expect_success 'value continued on next line' 'cmp result expect'
 766
 767cat > .git/config <<\EOF
 768[section "sub=section"]
 769        val1 = foo=bar
 770        val2 = foo\nbar
 771        val3 = \n\n
 772        val4 =
 773        val5
 774EOF
 775
 776cat > expect <<\EOF
 777section.sub=section.val1
 778foo=barQsection.sub=section.val2
 779foo
 780barQsection.sub=section.val3
 781
 782
 783Qsection.sub=section.val4
 784Qsection.sub=section.val5Q
 785EOF
 786
 787git config --null --list | perl -pe 'y/\000/Q/' > result
 788echo >>result
 789
 790test_expect_success '--null --list' 'cmp result expect'
 791
 792git config --null --get-regexp 'val[0-9]' | perl -pe 'y/\000/Q/' > result
 793echo >>result
 794
 795test_expect_success '--null --get-regexp' 'cmp result expect'
 796
 797test_expect_success 'inner whitespace kept verbatim' '
 798        git config section.val "foo       bar" &&
 799        test "z$(git config section.val)" = "zfoo         bar"
 800'
 801
 802test_expect_success SYMLINKS 'symlinked configuration' '
 803
 804        ln -s notyet myconfig &&
 805        GIT_CONFIG=myconfig git config test.frotz nitfol &&
 806        test -h myconfig &&
 807        test -f notyet &&
 808        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 809        GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
 810        test -h myconfig &&
 811        test -f notyet &&
 812        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 813        test "z$(GIT_CONFIG=notyet git config test.xyzzy)" = zrezrov
 814
 815'
 816
 817test_expect_success 'check split_cmdline return' "
 818        git config alias.split-cmdline-fix 'echo \"' &&
 819        test_must_fail git split-cmdline-fix &&
 820        echo foo > foo &&
 821        git add foo &&
 822        git commit -m 'initial commit' &&
 823        git config branch.master.mergeoptions 'echo \"' &&
 824        test_must_fail git merge master
 825        "
 826
 827test_expect_success 'git -c "key=value" support' '
 828        test "z$(git -c name=value config name)" = zvalue &&
 829        test "z$(git -c core.name=value config core.name)" = zvalue &&
 830        test "z$(git -c CamelCase=value config camelcase)" = zvalue &&
 831        test "z$(git -c flag config --bool flag)" = ztrue &&
 832        test_must_fail git -c core.name=value config name
 833'
 834
 835test_done