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
 292EOF
 293test_expect_success '--list without repo produces empty output' '
 295        git --git-dir=nonexistent config --list >output &&
 296        test_cmp expect output
 297'
 298cat > expect << EOF
 300beta.noindent sillyValue
 301nextsection.nonewline wow2 for me
 302EOF
 303test_expect_success '--get-regexp' \
 305        'git config --get-regexp in > output && cmp output expect'
 306git config --add nextsection.nonewline "wow4 for you"
 308cat > expect << EOF
 310wow2 for me
 311wow4 for you
 312EOF
 313test_expect_success '--add' \
 315        'git config --get-all nextsection.nonewline > output && cmp output expect'
 316cat > .git/config << EOF
 318[novalue]
 319        variable
 320[emptyvalue]
 321        variable =
 322EOF
 323test_expect_success 'get variable with no value' \
 325        'git config --get novalue.variable ^$'
 326test_expect_success 'get variable with empty value' \
 328        'git config --get emptyvalue.variable ^$'
 329echo novalue.variable > expect
 331test_expect_success 'get-regexp variable with no value' \
 333        'git config --get-regexp novalue > output &&
 334         cmp output expect'
 335echo 'emptyvalue.variable ' > expect
 337test_expect_success 'get-regexp variable with empty value' \
 339        'git config --get-regexp emptyvalue > output &&
 340         cmp output expect'
 341echo true > expect
 343test_expect_success 'get bool variable with no value' \
 345        'git config --bool novalue.variable > output &&
 346         cmp output expect'
 347echo false > expect
 349test_expect_success 'get bool variable with empty value' \
 351        'git config --bool emptyvalue.variable > output &&
 352         cmp output expect'
 353test_expect_success 'no arguments, but no crash' '
 355        test_must_fail git config >output 2>&1 &&
 356        grep usage output
 357'
 358cat > .git/config << EOF
 360[a.b]
 361        c = d
 362EOF
 363git config a.x y
 365cat > expect << EOF
 367[a.b]
 368        c = d
 369[a]
 370        x = y
 371EOF
 372test_expect_success 'new section is partial match of another' 'cmp .git/config expect'
 374git config b.x y
 376git config a.b c
 377cat > expect << EOF
 379[a.b]
 380        c = d
 381[a]
 382        x = y
 383        b = c
 384[b]
 385        x = y
 386EOF
 387test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
 389test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' \
 391        'test_must_fail git config --file non-existing-config -l'
 392cat > other-config << EOF
 394[ein]
 395        bahn = strasse
 396EOF
 397cat > expect << EOF
 399ein.bahn=strasse
 400EOF
 401GIT_CONFIG=other-config git config -l > output
 403test_expect_success 'alternative GIT_CONFIG' 'cmp output expect'
 405test_expect_success 'alternative GIT_CONFIG (--file)' \
 407        'git config --file other-config -l > output && cmp output expect'
 408test_expect_success 'refer config from subdirectory' '
 410        mkdir x &&
 411        (
 412                cd x &&
 413                echo strasse >expect
 414                git config --get --file ../other-config ein.bahn >actual &&
 415                test_cmp expect actual
 416        )
 417'
 419GIT_CONFIG=other-config git config anwohner.park ausweis
 421cat > expect << EOF
 423[ein]
 424        bahn = strasse
 425[anwohner]
 426        park = ausweis
 427EOF
 428test_expect_success '--set in alternative GIT_CONFIG' 'cmp other-config expect'
 430cat > .git/config << EOF
 432# Hallo
 433        #Bello
 434[branch "eins"]
 435        x = 1
 436[branch.eins]
 437        y = 1
 438        [branch "1 234 blabl/a"]
 439weird
 440EOF
 441test_expect_success "rename section" \
 443        "git config --rename-section branch.eins branch.zwei"
 444cat > expect << EOF
 446# Hallo
 447        #Bello
 448[branch "zwei"]
 449        x = 1
 450[branch "zwei"]
 451        y = 1
 452        [branch "1 234 blabl/a"]
 453weird
 454EOF
 455test_expect_success "rename succeeded" "test_cmp expect .git/config"
 457test_expect_success "rename non-existing section" '
 459        test_must_fail git config --rename-section \
 460                branch."world domination" branch.drei
 461'
 462test_expect_success "rename succeeded" "test_cmp expect .git/config"
 464test_expect_success "rename another section" \
 466        'git config --rename-section branch."1 234 blabl/a" branch.drei'
 467cat > expect << EOF
 469# Hallo
 470        #Bello
 471[branch "zwei"]
 472        x = 1
 473[branch "zwei"]
 474        y = 1
 475[branch "drei"]
 476weird
 477EOF
 478test_expect_success "rename succeeded" "test_cmp expect .git/config"
 480cat >> .git/config << EOF
 482[branch "vier"] z = 1
 483EOF
 484test_expect_success "rename a section with a var on the same line" \
 486        'git config --rename-section branch.vier branch.zwei'
 487cat > expect << EOF
 489# Hallo
 490        #Bello
 491[branch "zwei"]
 492        x = 1
 493[branch "zwei"]
 494        y = 1
 495[branch "drei"]
 496weird
 497[branch "zwei"]
 498        z = 1
 499EOF
 500test_expect_success "rename succeeded" "test_cmp expect .git/config"
 502cat >> .git/config << EOF
 504  [branch "zwei"] a = 1 [branch "vier"]
 505EOF
 506test_expect_success "remove section" "git config --remove-section branch.zwei"
 508cat > expect << EOF
 510# Hallo
 511        #Bello
 512[branch "drei"]
 513weird
 514EOF
 515test_expect_success "section was removed properly" \
 517        "test_cmp expect .git/config"
 518rm .git/config
 520cat > expect << EOF
 522[gitcvs]
 523        enabled = true
 524        dbname = %Ggitcvs2.%a.%m.sqlite
 525[gitcvs "ext"]
 526        dbname = %Ggitcvs1.%a.%m.sqlite
 527EOF
 528test_expect_success 'section ending' '
 530        git config gitcvs.enabled true &&
 532        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 533        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 534        cmp .git/config expect
 535'
 537test_expect_success numbers '
 539        git config kilo.gram 1k &&
 541        git config mega.ton 1m &&
 542        k=$(git config --int --get kilo.gram) &&
 543        test z1024 = "z$k" &&
 544        m=$(git config --int --get mega.ton) &&
 545        test z1048576 = "z$m"
 546'
 547cat > expect <<EOF
 549fatal: bad config value for 'aninvalid.unit' in .git/config
 550EOF
 551test_expect_success 'invalid unit' '
 553        git config aninvalid.unit "1auto" &&
 555        s=$(git config aninvalid.unit) &&
 556        test "z1auto" = "z$s" &&
 557        if git config --int --get aninvalid.unit 2>actual
 558        then
 559                echo config should have failed
 560                false
 561        fi &&
 562        cmp actual expect
 563'
 564cat > expect << EOF
 566true
 567false
 568true
 569false
 570true
 571false
 572true
 573false
 574EOF
 575test_expect_success bool '
 577        git config bool.true1 01 &&
 579        git config bool.true2 -1 &&
 580        git config bool.true3 YeS &&
 581        git config bool.true4 true &&
 582        git config bool.false1 000 &&
 583        git config bool.false2 "" &&
 584        git config bool.false3 nO &&
 585        git config bool.false4 FALSE &&
 586        rm -f result &&
 587        for i in 1 2 3 4
 588        do
 589            git config --bool --get bool.true$i >>result
 590            git config --bool --get bool.false$i >>result
 591        done &&
 592        cmp expect result'
 593test_expect_success 'invalid bool (--get)' '
 595        git config bool.nobool foobar &&
 597        test_must_fail git config --bool --get bool.nobool'
 598test_expect_success 'invalid bool (set)' '
 600        test_must_fail git config --bool bool.nobool foobar'
 602rm .git/config
 604cat > expect <<\EOF
 606[bool]
 607        true1 = true
 608        true2 = true
 609        true3 = true
 610        true4 = true
 611        false1 = false
 612        false2 = false
 613        false3 = false
 614        false4 = false
 615EOF
 616test_expect_success 'set --bool' '
 618        git config --bool bool.true1 01 &&
 620        git config --bool bool.true2 -1 &&
 621        git config --bool bool.true3 YeS &&
 622        git config --bool bool.true4 true &&
 623        git config --bool bool.false1 000 &&
 624        git config --bool bool.false2 "" &&
 625        git config --bool bool.false3 nO &&
 626        git config --bool bool.false4 FALSE &&
 627        cmp expect .git/config'
 628rm .git/config
 630cat > expect <<\EOF
 632[int]
 633        val1 = 1
 634        val2 = -1
 635        val3 = 5242880
 636EOF
 637test_expect_success 'set --int' '
 639        git config --int int.val1 01 &&
 641        git config --int int.val2 -1 &&
 642        git config --int int.val3 5m &&
 643        cmp expect .git/config'
 644rm .git/config
 646cat >expect <<\EOF
 648[bool]
 649        true1 = true
 650        true2 = true
 651        false1 = false
 652        false2 = false
 653[int]
 654        int1 = 0
 655        int2 = 1
 656        int3 = -1
 657EOF
 658test_expect_success 'get --bool-or-int' '
 660        (
 661                echo "[bool]"
 662                echo true1
 663                echo true2 = true
 664                echo false = false
 665                echo "[int]"
 666                echo int1 = 0
 667                echo int2 = 1
 668                echo int3 = -1
 669        ) >>.git/config &&
 670        test $(git config --bool-or-int bool.true1) = true &&
 671        test $(git config --bool-or-int bool.true2) = true &&
 672        test $(git config --bool-or-int bool.false) = false &&
 673        test $(git config --bool-or-int int.int1) = 0 &&
 674        test $(git config --bool-or-int int.int2) = 1 &&
 675        test $(git config --bool-or-int int.int3) = -1
 676'
 678rm .git/config
 680cat >expect <<\EOF
 681[bool]
 682        true1 = true
 683        false1 = false
 684        true2 = true
 685        false2 = false
 686[int]
 687        int1 = 0
 688        int2 = 1
 689        int3 = -1
 690EOF
 691test_expect_success 'set --bool-or-int' '
 693        git config --bool-or-int bool.true1 true &&
 694        git config --bool-or-int bool.false1 false &&
 695        git config --bool-or-int bool.true2 yes &&
 696        git config --bool-or-int bool.false2 no &&
 697        git config --bool-or-int int.int1 0 &&
 698        git config --bool-or-int int.int2 1 &&
 699        git config --bool-or-int int.int3 -1 &&
 700        test_cmp expect .git/config
 701'
 702rm .git/config
 704cat >expect <<\EOF
 706[path]
 707        home = ~/
 708        normal = /dev/null
 709        trailingtilde = foo~
 710EOF
 711test_expect_success NOT_MINGW 'set --path' '
 713        git config --path path.home "~/" &&
 714        git config --path path.normal "/dev/null" &&
 715        git config --path path.trailingtilde "foo~" &&
 716        test_cmp expect .git/config'
 717if test_have_prereq NOT_MINGW && test "${HOME+set}"
 719then
 720        test_set_prereq HOMEVAR
 721fi
 722cat >expect <<EOF
 724$HOME/
 725/dev/null
 726foo~
 727EOF
 728test_expect_success HOMEVAR 'get --path' '
 730        git config --get --path path.home > result &&
 731        git config --get --path path.normal >> result &&
 732        git config --get --path path.trailingtilde >> result &&
 733        test_cmp expect result
 734'
 735cat >expect <<\EOF
 737/dev/null
 738foo~
 739EOF
 740test_expect_success NOT_MINGW 'get --path copes with unset $HOME' '
 742        (
 743                unset HOME;
 744                test_must_fail git config --get --path path.home \
 745                        >result 2>msg &&
 746                git config --get --path path.normal >>result &&
 747                git config --get --path path.trailingtilde >>result
 748        ) &&
 749        grep "[Ff]ailed to expand.*~/" msg &&
 750        test_cmp expect result
 751'
 752rm .git/config
 754git config quote.leading " test"
 756git config quote.ending "test "
 757git config quote.semicolon "test;test"
 758git config quote.hash "test#test"
 759cat > expect << EOF
 761[quote]
 762        leading = " test"
 763        ending = "test "
 764        semicolon = "test;test"
 765        hash = "test#test"
 766EOF
 767test_expect_success 'quoting' 'cmp .git/config expect'
 769test_expect_success 'key with newline' '
 771        test_must_fail git config "key.with
 772newline" 123'
 773test_expect_success 'value with newline' 'git config key.sub value.with\\\
 775newline'
 776cat > .git/config <<\EOF
 778[section]
 779        ; comment \
 780        continued = cont\
 781inued
 782        noncont   = not continued ; \
 783        quotecont = "cont;\
 784inued"
 785EOF
 786cat > expect <<\EOF
 788section.continued=continued
 789section.noncont=not continued
 790section.quotecont=cont;inued
 791EOF
 792git config --list > result
 794test_expect_success 'value continued on next line' 'cmp result expect'
 796cat > .git/config <<\EOF
 798[section "sub=section"]
 799        val1 = foo=bar
 800        val2 = foo\nbar
 801        val3 = \n\n
 802        val4 =
 803        val5
 804EOF
 805cat > expect <<\EOF
 807section.sub=section.val1
 808foo=barQsection.sub=section.val2
 809foo
 810barQsection.sub=section.val3
 811Qsection.sub=section.val4
 814Qsection.sub=section.val5Q
 815EOF
 816git config --null --list | perl -pe 'y/\000/Q/' > result
 818echo >>result
 819test_expect_success '--null --list' 'cmp result expect'
 821git config --null --get-regexp 'val[0-9]' | perl -pe 'y/\000/Q/' > result
 823echo >>result
 824test_expect_success '--null --get-regexp' 'cmp result expect'
 826test_expect_success 'inner whitespace kept verbatim' '
 828        git config section.val "foo       bar" &&
 829        test "z$(git config section.val)" = "zfoo         bar"
 830'
 831test_expect_success SYMLINKS 'symlinked configuration' '
 833        ln -s notyet myconfig &&
 835        GIT_CONFIG=myconfig git config test.frotz nitfol &&
 836        test -h myconfig &&
 837        test -f notyet &&
 838        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 839        GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
 840        test -h myconfig &&
 841        test -f notyet &&
 842        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 843        test "z$(GIT_CONFIG=notyet git config test.xyzzy)" = zrezrov
 844'
 846test_expect_success 'nonexistent configuration' '
 848        (
 849                GIT_CONFIG=doesnotexist &&
 850                export GIT_CONFIG &&
 851                test_must_fail git config --list &&
 852                test_must_fail git config test.xyzzy
 853        )
 854'
 855test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
 857        ln -s doesnotexist linktonada &&
 858        ln -s linktonada linktolinktonada &&
 859        (
 860                GIT_CONFIG=linktonada &&
 861                export GIT_CONFIG &&
 862                test_must_fail git config --list &&
 863                GIT_CONFIG=linktolinktonada &&
 864                test_must_fail git config --list
 865        )
 866'
 867test_expect_success 'check split_cmdline return' "
 869        git config alias.split-cmdline-fix 'echo \"' &&
 870        test_must_fail git split-cmdline-fix &&
 871        echo foo > foo &&
 872        git add foo &&
 873        git commit -m 'initial commit' &&
 874        git config branch.master.mergeoptions 'echo \"' &&
 875        test_must_fail git merge master
 876        "
 877test_expect_success 'git -c "key=value" support' '
 879        test "z$(git -c name=value config name)" = zvalue &&
 880        test "z$(git -c core.name=value config core.name)" = zvalue &&
 881        test "z$(git -c CamelCase=value config camelcase)" = zvalue &&
 882        test "z$(git -c flag config --bool flag)" = ztrue &&
 883        test_must_fail git -c core.name=value config name
 884'
 885test_done