1#!/bin/sh
   2#
   3# Copyright (c) 2005 Johannes Schindelin
   4#
   5test_description='Test git config in different settings'
   7. ./test-lib.sh
   9test -f .git/config && rm .git/config
  11git config core.penguin "little blue"
  13cat > expect << EOF
  15[core]
  16        penguin = little blue
  17EOF
  18test_expect_success 'initial' 'cmp .git/config expect'
  20git config Core.Movie BadPhysics
  22cat > expect << EOF
  24[core]
  25        penguin = little blue
  26        Movie = BadPhysics
  27EOF
  28test_expect_success 'mixed case' 'cmp .git/config expect'
  30git config Cores.WhatEver Second
  32cat > expect << EOF
  34[core]
  35        penguin = little blue
  36        Movie = BadPhysics
  37[Cores]
  38        WhatEver = Second
  39EOF
  40test_expect_success 'similar section' 'cmp .git/config expect'
  42git config CORE.UPPERCASE true
  44cat > expect << EOF
  46[core]
  47        penguin = little blue
  48        Movie = BadPhysics
  49        UPPERCASE = true
  50[Cores]
  51        WhatEver = Second
  52EOF
  53test_expect_success 'similar section' 'cmp .git/config expect'
  55test_expect_success 'replace with non-match' \
  57        'git config core.penguin kingpin !blue'
  58test_expect_success 'replace with non-match (actually matching)' \
  60        'git config core.penguin "very blue" !kingpin'
  61cat > expect << EOF
  63[core]
  64        penguin = very blue
  65        Movie = BadPhysics
  66        UPPERCASE = true
  67        penguin = kingpin
  68[Cores]
  69        WhatEver = Second
  70EOF
  71test_expect_success 'non-match result' 'cmp .git/config expect'
  73cat > .git/config <<\EOF
  75[alpha]
  76bar = foo
  77[beta]
  78baz = multiple \
  79lines
  80EOF
  81test_expect_success 'unset with cont. lines' \
  83        'git config --unset beta.baz'
  84cat > expect <<\EOF
  86[alpha]
  87bar = foo
  88[beta]
  89EOF
  90test_expect_success 'unset with cont. lines is correct' 'cmp .git/config expect'
  92cat > .git/config << EOF
  94[beta] ; silly comment # another comment
  95noIndent= sillyValue ; 'nother silly comment
  96# empty line
  98                ; comment
  99                haha   ="beta" # last silly comment
 100haha = hello
 101        haha = bello
 102[nextSection] noNewline = ouch
 103EOF
 104cp .git/config .git/config2
 106test_expect_success 'multiple unset' \
 108        'git config --unset-all beta.haha'
 109cat > expect << EOF
 111[beta] ; silly comment # another comment
 112noIndent= sillyValue ; 'nother silly comment
 113# empty line
 115                ; comment
 116[nextSection] noNewline = ouch
 117EOF
 118test_expect_success 'multiple unset is correct' 'cmp .git/config expect'
 120cp .git/config2 .git/config
 122test_expect_success '--replace-all missing value' '
 124        test_must_fail git config --replace-all beta.haha &&
 125        test_cmp .git/config2 .git/config
 126'
 127rm .git/config2
 129test_expect_success '--replace-all' \
 131        'git config --replace-all beta.haha gamma'
 132cat > expect << EOF
 134[beta] ; silly comment # another comment
 135noIndent= sillyValue ; 'nother silly comment
 136# empty line
 138                ; comment
 139        haha = gamma
 140[nextSection] noNewline = ouch
 141EOF
 142test_expect_success 'all replaced' 'cmp .git/config expect'
 144git config beta.haha alpha
 146cat > expect << EOF
 148[beta] ; silly comment # another comment
 149noIndent= sillyValue ; 'nother silly comment
 150# empty line
 152                ; comment
 153        haha = alpha
 154[nextSection] noNewline = ouch
 155EOF
 156test_expect_success 'really mean test' 'cmp .git/config expect'
 158git config nextsection.nonewline wow
 160cat > expect << EOF
 162[beta] ; silly comment # another comment
 163noIndent= sillyValue ; 'nother silly comment
 164# empty line
 166                ; comment
 167        haha = alpha
 168[nextSection]
 169        nonewline = wow
 170EOF
 171test_expect_success 'really really mean test' 'cmp .git/config expect'
 173test_expect_success 'get value' 'test alpha = $(git config beta.haha)'
 175git config --unset beta.haha
 176cat > expect << EOF
 178[beta] ; silly comment # another comment
 179noIndent= sillyValue ; 'nother silly comment
 180# empty line
 182                ; comment
 183[nextSection]
 184        nonewline = wow
 185EOF
 186test_expect_success 'unset' 'cmp .git/config expect'
 188git config nextsection.NoNewLine "wow2 for me" "for me$"
 190cat > expect << EOF
 192[beta] ; silly comment # another comment
 193noIndent= sillyValue ; 'nother silly comment
 194# empty line
 196                ; comment
 197[nextSection]
 198        nonewline = wow
 199        NoNewLine = wow2 for me
 200EOF
 201test_expect_success 'multivar' 'cmp .git/config expect'
 203test_expect_success 'non-match' \
 205        'git config --get nextsection.nonewline !for'
 206test_expect_success 'non-match value' \
 208        'test wow = $(git config --get nextsection.nonewline !for)'
 209test_expect_success 'ambiguous get' '
 211        test_must_fail git config --get nextsection.nonewline
 212'
 213test_expect_success 'get multivar' \
 215        'git config --get-all nextsection.nonewline'
 216git config nextsection.nonewline "wow3" "wow$"
 218cat > expect << EOF
 220[beta] ; silly comment # another comment
 221noIndent= sillyValue ; 'nother silly comment
 222# empty line
 224                ; comment
 225[nextSection]
 226        nonewline = wow3
 227        NoNewLine = wow2 for me
 228EOF
 229test_expect_success 'multivar replace' 'cmp .git/config expect'
 231test_expect_success 'ambiguous value' '
 233        test_must_fail git config nextsection.nonewline
 234'
 235test_expect_success 'ambiguous unset' '
 237        test_must_fail git config --unset nextsection.nonewline
 238'
 239test_expect_success 'invalid unset' '
 241        test_must_fail git config --unset somesection.nonewline
 242'
 243git config --unset nextsection.nonewline "wow3$"
 245cat > expect << EOF
 247[beta] ; silly comment # another comment
 248noIndent= sillyValue ; 'nother silly comment
 249# empty line
 251                ; comment
 252[nextSection]
 253        NoNewLine = wow2 for me
 254EOF
 255test_expect_success 'multivar unset' 'cmp .git/config expect'
 257test_expect_success 'invalid key' 'test_must_fail git config inval.2key blabla'
 259test_expect_success 'correct key' 'git config 123456.a123 987'
 261test_expect_success 'hierarchical section' \
 263        'git config Version.1.2.3eX.Alpha beta'
 264cat > expect << EOF
 266[beta] ; silly comment # another comment
 267noIndent= sillyValue ; 'nother silly comment
 268# 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
 278test_expect_success 'hierarchical section value' 'cmp .git/config expect'
 280cat > expect << EOF
 282beta.noindent=sillyValue
 283nextsection.nonewline=wow2 for me
 284123456.a123=987
 285version.1.2.3eX.alpha=beta
 286EOF
 287test_expect_success 'working --list' \
 289        'git config --list > output && cmp output expect'
 290cat > expect << EOF
 292beta.noindent sillyValue
 293nextsection.nonewline wow2 for me
 294EOF
 295test_expect_success '--get-regexp' \
 297        'git config --get-regexp in > output && cmp output expect'
 298git config --add nextsection.nonewline "wow4 for you"
 300cat > expect << EOF
 302wow2 for me
 303wow4 for you
 304EOF
 305test_expect_success '--add' \
 307        'git config --get-all nextsection.nonewline > output && cmp output expect'
 308cat > .git/config << EOF
 310[novalue]
 311        variable
 312[emptyvalue]
 313        variable =
 314EOF
 315test_expect_success 'get variable with no value' \
 317        'git config --get novalue.variable ^$'
 318test_expect_success 'get variable with empty value' \
 320        'git config --get emptyvalue.variable ^$'
 321echo novalue.variable > expect
 323test_expect_success 'get-regexp variable with no value' \
 325        'git config --get-regexp novalue > output &&
 326         cmp output expect'
 327echo 'emptyvalue.variable ' > expect
 329test_expect_success 'get-regexp variable with empty value' \
 331        'git config --get-regexp emptyvalue > output &&
 332         cmp output expect'
 333echo true > expect
 335test_expect_success 'get bool variable with no value' \
 337        'git config --bool novalue.variable > output &&
 338         cmp output expect'
 339echo false > expect
 341test_expect_success 'get bool variable with empty value' \
 343        'git config --bool emptyvalue.variable > output &&
 344         cmp output expect'
 345test_expect_success 'no arguments, but no crash' '
 347        test_must_fail git config >output 2>&1 &&
 348        grep usage output
 349'
 350cat > .git/config << EOF
 352[a.b]
 353        c = d
 354EOF
 355git config a.x y
 357cat > expect << EOF
 359[a.b]
 360        c = d
 361[a]
 362        x = y
 363EOF
 364test_expect_success 'new section is partial match of another' 'cmp .git/config expect'
 366git config b.x y
 368git config a.b c
 369cat > expect << EOF
 371[a.b]
 372        c = d
 373[a]
 374        x = y
 375        b = c
 376[b]
 377        x = y
 378EOF
 379test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
 381test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' \
 383        'test_must_fail git config --file non-existing-config -l'
 384cat > other-config << EOF
 386[ein]
 387        bahn = strasse
 388EOF
 389cat > expect << EOF
 391ein.bahn=strasse
 392EOF
 393GIT_CONFIG=other-config git config -l > output
 395test_expect_success 'alternative GIT_CONFIG' 'cmp output expect'
 397test_expect_success 'alternative GIT_CONFIG (--file)' \
 399        'git config --file other-config -l > output && cmp output expect'
 400GIT_CONFIG=other-config git config anwohner.park ausweis
 402cat > expect << EOF
 404[ein]
 405        bahn = strasse
 406[anwohner]
 407        park = ausweis
 408EOF
 409test_expect_success '--set in alternative GIT_CONFIG' 'cmp other-config expect'
 411cat > .git/config << EOF
 413# Hallo
 414        #Bello
 415[branch "eins"]
 416        x = 1
 417[branch.eins]
 418        y = 1
 419        [branch "1 234 blabl/a"]
 420weird
 421EOF
 422test_expect_success "rename section" \
 424        "git config --rename-section branch.eins branch.zwei"
 425cat > expect << EOF
 427# Hallo
 428        #Bello
 429[branch "zwei"]
 430        x = 1
 431[branch "zwei"]
 432        y = 1
 433        [branch "1 234 blabl/a"]
 434weird
 435EOF
 436test_expect_success "rename succeeded" "test_cmp expect .git/config"
 438test_expect_success "rename non-existing section" '
 440        test_must_fail git config --rename-section \
 441                branch."world domination" branch.drei
 442'
 443test_expect_success "rename succeeded" "test_cmp expect .git/config"
 445test_expect_success "rename another section" \
 447        'git config --rename-section branch."1 234 blabl/a" branch.drei'
 448cat > expect << EOF
 450# Hallo
 451        #Bello
 452[branch "zwei"]
 453        x = 1
 454[branch "zwei"]
 455        y = 1
 456[branch "drei"]
 457weird
 458EOF
 459test_expect_success "rename succeeded" "test_cmp expect .git/config"
 461cat >> .git/config << EOF
 463[branch "vier"] z = 1
 464EOF
 465test_expect_success "rename a section with a var on the same line" \
 467        'git config --rename-section branch.vier branch.zwei'
 468cat > expect << EOF
 470# Hallo
 471        #Bello
 472[branch "zwei"]
 473        x = 1
 474[branch "zwei"]
 475        y = 1
 476[branch "drei"]
 477weird
 478[branch "zwei"]
 479        z = 1
 480EOF
 481test_expect_success "rename succeeded" "test_cmp expect .git/config"
 483cat >> .git/config << EOF
 485  [branch "zwei"] a = 1 [branch "vier"]
 486EOF
 487test_expect_success "remove section" "git config --remove-section branch.zwei"
 489cat > expect << EOF
 491# Hallo
 492        #Bello
 493[branch "drei"]
 494weird
 495EOF
 496test_expect_success "section was removed properly" \
 498        "test_cmp expect .git/config"
 499rm .git/config
 501cat > expect << EOF
 503[gitcvs]
 504        enabled = true
 505        dbname = %Ggitcvs2.%a.%m.sqlite
 506[gitcvs "ext"]
 507        dbname = %Ggitcvs1.%a.%m.sqlite
 508EOF
 509test_expect_success 'section ending' '
 511        git config gitcvs.enabled true &&
 513        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 514        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 515        cmp .git/config expect
 516'
 518test_expect_success numbers '
 520        git config kilo.gram 1k &&
 522        git config mega.ton 1m &&
 523        k=$(git config --int --get kilo.gram) &&
 524        test z1024 = "z$k" &&
 525        m=$(git config --int --get mega.ton) &&
 526        test z1048576 = "z$m"
 527'
 528cat > expect <<EOF
 530fatal: bad config value for 'aninvalid.unit' in .git/config
 531EOF
 532test_expect_success 'invalid unit' '
 534        git config aninvalid.unit "1auto" &&
 536        s=$(git config aninvalid.unit) &&
 537        test "z1auto" = "z$s" &&
 538        if git config --int --get aninvalid.unit 2>actual
 539        then
 540                echo config should have failed
 541                false
 542        fi &&
 543        cmp actual expect
 544'
 545cat > expect << EOF
 547true
 548false
 549true
 550false
 551true
 552false
 553true
 554false
 555EOF
 556test_expect_success bool '
 558        git config bool.true1 01 &&
 560        git config bool.true2 -1 &&
 561        git config bool.true3 YeS &&
 562        git config bool.true4 true &&
 563        git config bool.false1 000 &&
 564        git config bool.false2 "" &&
 565        git config bool.false3 nO &&
 566        git config bool.false4 FALSE &&
 567        rm -f result &&
 568        for i in 1 2 3 4
 569        do
 570            git config --bool --get bool.true$i >>result
 571            git config --bool --get bool.false$i >>result
 572        done &&
 573        cmp expect result'
 574test_expect_success 'invalid bool (--get)' '
 576        git config bool.nobool foobar &&
 578        test_must_fail git config --bool --get bool.nobool'
 579test_expect_success 'invalid bool (set)' '
 581        test_must_fail git config --bool bool.nobool foobar'
 583rm .git/config
 585cat > expect <<\EOF
 587[bool]
 588        true1 = true
 589        true2 = true
 590        true3 = true
 591        true4 = true
 592        false1 = false
 593        false2 = false
 594        false3 = false
 595        false4 = false
 596EOF
 597test_expect_success 'set --bool' '
 599        git config --bool bool.true1 01 &&
 601        git config --bool bool.true2 -1 &&
 602        git config --bool bool.true3 YeS &&
 603        git config --bool bool.true4 true &&
 604        git config --bool bool.false1 000 &&
 605        git config --bool bool.false2 "" &&
 606        git config --bool bool.false3 nO &&
 607        git config --bool bool.false4 FALSE &&
 608        cmp expect .git/config'
 609rm .git/config
 611cat > expect <<\EOF
 613[int]
 614        val1 = 1
 615        val2 = -1
 616        val3 = 5242880
 617EOF
 618test_expect_success 'set --int' '
 620        git config --int int.val1 01 &&
 622        git config --int int.val2 -1 &&
 623        git config --int int.val3 5m &&
 624        cmp expect .git/config'
 625rm .git/config
 627cat >expect <<\EOF
 629[bool]
 630        true1 = true
 631        true2 = true
 632        false1 = false
 633        false2 = false
 634[int]
 635        int1 = 0
 636        int2 = 1
 637        int3 = -1
 638EOF
 639test_expect_success 'get --bool-or-int' '
 641        (
 642                echo "[bool]"
 643                echo true1
 644                echo true2 = true
 645                echo false = false
 646                echo "[int]"
 647                echo int1 = 0
 648                echo int2 = 1
 649                echo int3 = -1
 650        ) >>.git/config &&
 651        test $(git config --bool-or-int bool.true1) = true &&
 652        test $(git config --bool-or-int bool.true2) = true &&
 653        test $(git config --bool-or-int bool.false) = false &&
 654        test $(git config --bool-or-int int.int1) = 0 &&
 655        test $(git config --bool-or-int int.int2) = 1 &&
 656        test $(git config --bool-or-int int.int3) = -1
 657'
 659rm .git/config
 661cat >expect <<\EOF
 662[bool]
 663        true1 = true
 664        false1 = false
 665        true2 = true
 666        false2 = false
 667[int]
 668        int1 = 0
 669        int2 = 1
 670        int3 = -1
 671EOF
 672test_expect_success 'set --bool-or-int' '
 674        git config --bool-or-int bool.true1 true &&
 675        git config --bool-or-int bool.false1 false &&
 676        git config --bool-or-int bool.true2 yes &&
 677        git config --bool-or-int bool.false2 no &&
 678        git config --bool-or-int int.int1 0 &&
 679        git config --bool-or-int int.int2 1 &&
 680        git config --bool-or-int int.int3 -1 &&
 681        test_cmp expect .git/config
 682'
 683rm .git/config
 685git config quote.leading " test"
 687git config quote.ending "test "
 688git config quote.semicolon "test;test"
 689git config quote.hash "test#test"
 690cat > expect << EOF
 692[quote]
 693        leading = " test"
 694        ending = "test "
 695        semicolon = "test;test"
 696        hash = "test#test"
 697EOF
 698test_expect_success 'quoting' 'cmp .git/config expect'
 700test_expect_success 'key with newline' '
 702        test_must_fail git config "key.with
 703newline" 123'
 704test_expect_success 'value with newline' 'git config key.sub value.with\\\
 706newline'
 707cat > .git/config <<\EOF
 709[section]
 710        ; comment \
 711        continued = cont\
 712inued
 713        noncont   = not continued ; \
 714        quotecont = "cont;\
 715inued"
 716EOF
 717cat > expect <<\EOF
 719section.continued=continued
 720section.noncont=not continued
 721section.quotecont=cont;inued
 722EOF
 723git config --list > result
 725test_expect_success 'value continued on next line' 'cmp result expect'
 727cat > .git/config <<\EOF
 729[section "sub=section"]
 730        val1 = foo=bar
 731        val2 = foo\nbar
 732        val3 = \n\n
 733        val4 =
 734        val5
 735EOF
 736cat > expect <<\EOF
 738section.sub=section.val1
 739foo=barQsection.sub=section.val2
 740foo
 741barQsection.sub=section.val3
 742Qsection.sub=section.val4
 745Qsection.sub=section.val5Q
 746EOF
 747git config --null --list | perl -pe 'y/\000/Q/' > result
 749echo >>result
 750test_expect_success '--null --list' 'cmp result expect'
 752git config --null --get-regexp 'val[0-9]' | perl -pe 'y/\000/Q/' > result
 754echo >>result
 755test_expect_success '--null --get-regexp' 'cmp result expect'
 757test_expect_success 'inner whitespace kept verbatim' '
 759        git config section.val "foo       bar" &&
 760        test "z$(git config section.val)" = "zfoo         bar"
 761'
 762test_expect_success SYMLINKS 'symlinked configuration' '
 764        ln -s notyet myconfig &&
 766        GIT_CONFIG=myconfig git config test.frotz nitfol &&
 767        test -h myconfig &&
 768        test -f notyet &&
 769        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 770        GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
 771        test -h myconfig &&
 772        test -f notyet &&
 773        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 774        test "z$(GIT_CONFIG=notyet git config test.xyzzy)" = zrezrov
 775'
 777test_expect_success 'check split_cmdline return' "
 779        git config alias.split-cmdline-fix 'echo \"' &&
 780        test_must_fail git split-cmdline-fix &&
 781        echo foo > foo &&
 782        git add foo &&
 783        git commit -m 'initial commit' &&
 784        git config branch.master.mergeoptions 'echo \"' &&
 785        test_must_fail git merge master
 786        "
 787test_done