t / t1300-repo-config.shon commit t5516: remove ambiguity test (1) (3ef6a1f)
   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
 121mv .git/config2 .git/config
 122
 123test_expect_success '--replace-all' \
 124        'git config --replace-all beta.haha gamma'
 125
 126cat > expect << EOF
 127[beta] ; silly comment # another comment
 128noIndent= sillyValue ; 'nother silly comment
 129
 130# empty line
 131                ; comment
 132        haha = gamma
 133[nextSection] noNewline = ouch
 134EOF
 135
 136test_expect_success 'all replaced' 'cmp .git/config expect'
 137
 138git config beta.haha alpha
 139
 140cat > expect << EOF
 141[beta] ; silly comment # another comment
 142noIndent= sillyValue ; 'nother silly comment
 143
 144# empty line
 145                ; comment
 146        haha = alpha
 147[nextSection] noNewline = ouch
 148EOF
 149
 150test_expect_success 'really mean test' 'cmp .git/config expect'
 151
 152git config nextsection.nonewline wow
 153
 154cat > expect << EOF
 155[beta] ; silly comment # another comment
 156noIndent= sillyValue ; 'nother silly comment
 157
 158# empty line
 159                ; comment
 160        haha = alpha
 161[nextSection]
 162        nonewline = wow
 163EOF
 164
 165test_expect_success 'really really mean test' 'cmp .git/config expect'
 166
 167test_expect_success 'get value' 'test alpha = $(git config beta.haha)'
 168git config --unset beta.haha
 169
 170cat > expect << EOF
 171[beta] ; silly comment # another comment
 172noIndent= sillyValue ; 'nother silly comment
 173
 174# empty line
 175                ; comment
 176[nextSection]
 177        nonewline = wow
 178EOF
 179
 180test_expect_success 'unset' 'cmp .git/config expect'
 181
 182git config nextsection.NoNewLine "wow2 for me" "for me$"
 183
 184cat > expect << EOF
 185[beta] ; silly comment # another comment
 186noIndent= sillyValue ; 'nother silly comment
 187
 188# empty line
 189                ; comment
 190[nextSection]
 191        nonewline = wow
 192        NoNewLine = wow2 for me
 193EOF
 194
 195test_expect_success 'multivar' 'cmp .git/config expect'
 196
 197test_expect_success 'non-match' \
 198        'git config --get nextsection.nonewline !for'
 199
 200test_expect_success 'non-match value' \
 201        'test wow = $(git config --get nextsection.nonewline !for)'
 202
 203test_expect_failure 'ambiguous get' \
 204        'git config --get nextsection.nonewline'
 205
 206test_expect_success 'get multivar' \
 207        'git config --get-all nextsection.nonewline'
 208
 209git config nextsection.nonewline "wow3" "wow$"
 210
 211cat > expect << EOF
 212[beta] ; silly comment # another comment
 213noIndent= sillyValue ; 'nother silly comment
 214
 215# empty line
 216                ; comment
 217[nextSection]
 218        nonewline = wow3
 219        NoNewLine = wow2 for me
 220EOF
 221
 222test_expect_success 'multivar replace' 'cmp .git/config expect'
 223
 224test_expect_failure 'ambiguous value' 'git config nextsection.nonewline'
 225
 226test_expect_failure 'ambiguous unset' \
 227        'git config --unset nextsection.nonewline'
 228
 229test_expect_failure 'invalid unset' \
 230        'git config --unset somesection.nonewline'
 231
 232git config --unset nextsection.nonewline "wow3$"
 233
 234cat > expect << EOF
 235[beta] ; silly comment # another comment
 236noIndent= sillyValue ; 'nother silly comment
 237
 238# empty line
 239                ; comment
 240[nextSection]
 241        NoNewLine = wow2 for me
 242EOF
 243
 244test_expect_success 'multivar unset' 'cmp .git/config expect'
 245
 246test_expect_failure 'invalid key' 'git config inval.2key blabla'
 247
 248test_expect_success 'correct key' 'git config 123456.a123 987'
 249
 250test_expect_success 'hierarchical section' \
 251        'git config Version.1.2.3eX.Alpha beta'
 252
 253cat > expect << EOF
 254[beta] ; silly comment # another comment
 255noIndent= sillyValue ; 'nother silly comment
 256
 257# empty line
 258                ; comment
 259[nextSection]
 260        NoNewLine = wow2 for me
 261[123456]
 262        a123 = 987
 263[Version "1.2.3eX"]
 264        Alpha = beta
 265EOF
 266
 267test_expect_success 'hierarchical section value' 'cmp .git/config expect'
 268
 269cat > expect << EOF
 270beta.noindent=sillyValue
 271nextsection.nonewline=wow2 for me
 272123456.a123=987
 273version.1.2.3eX.alpha=beta
 274EOF
 275
 276test_expect_success 'working --list' \
 277        'git config --list > output && cmp output expect'
 278
 279cat > expect << EOF
 280beta.noindent sillyValue
 281nextsection.nonewline wow2 for me
 282EOF
 283
 284test_expect_success '--get-regexp' \
 285        'git config --get-regexp in > output && cmp output expect'
 286
 287git config --add nextsection.nonewline "wow4 for you"
 288
 289cat > expect << EOF
 290wow2 for me
 291wow4 for you
 292EOF
 293
 294test_expect_success '--add' \
 295        'git config --get-all nextsection.nonewline > output && cmp output expect'
 296
 297cat > .git/config << EOF
 298[novalue]
 299        variable
 300[emptyvalue]
 301        variable =
 302EOF
 303
 304test_expect_success 'get variable with no value' \
 305        'git config --get novalue.variable ^$'
 306
 307test_expect_success 'get variable with empty value' \
 308        'git config --get emptyvalue.variable ^$'
 309
 310echo novalue.variable > expect
 311
 312test_expect_success 'get-regexp variable with no value' \
 313        'git config --get-regexp novalue > output &&
 314         cmp output expect'
 315
 316echo 'emptyvalue.variable ' > expect
 317
 318test_expect_success 'get-regexp variable with empty value' \
 319        'git config --get-regexp emptyvalue > output &&
 320         cmp output expect'
 321
 322echo true > expect
 323
 324test_expect_success 'get bool variable with no value' \
 325        'git config --bool novalue.variable > output &&
 326         cmp output expect'
 327
 328echo false > expect
 329
 330test_expect_success 'get bool variable with empty value' \
 331        'git config --bool emptyvalue.variable > output &&
 332         cmp output expect'
 333
 334git config > output 2>&1
 335
 336test_expect_success 'no arguments, but no crash' \
 337        "test $? = 129 && grep usage output"
 338
 339cat > .git/config << EOF
 340[a.b]
 341        c = d
 342EOF
 343
 344git config a.x y
 345
 346cat > expect << EOF
 347[a.b]
 348        c = d
 349[a]
 350        x = y
 351EOF
 352
 353test_expect_success 'new section is partial match of another' 'cmp .git/config expect'
 354
 355git config b.x y
 356git config a.b c
 357
 358cat > expect << EOF
 359[a.b]
 360        c = d
 361[a]
 362        x = y
 363        b = c
 364[b]
 365        x = y
 366EOF
 367
 368test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
 369
 370test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' \
 371        'git config --file non-existing-config -l; test $? != 0'
 372
 373cat > other-config << EOF
 374[ein]
 375        bahn = strasse
 376EOF
 377
 378cat > expect << EOF
 379ein.bahn=strasse
 380EOF
 381
 382GIT_CONFIG=other-config git config -l > output
 383
 384test_expect_success 'alternative GIT_CONFIG' 'cmp output expect'
 385
 386test_expect_success 'alternative GIT_CONFIG (--file)' \
 387        'git config --file other-config -l > output && cmp output expect'
 388
 389GIT_CONFIG=other-config git config anwohner.park ausweis
 390
 391cat > expect << EOF
 392[ein]
 393        bahn = strasse
 394[anwohner]
 395        park = ausweis
 396EOF
 397
 398test_expect_success '--set in alternative GIT_CONFIG' 'cmp other-config expect'
 399
 400cat > .git/config << EOF
 401# Hallo
 402        #Bello
 403[branch "eins"]
 404        x = 1
 405[branch.eins]
 406        y = 1
 407        [branch "1 234 blabl/a"]
 408weird
 409EOF
 410
 411test_expect_success "rename section" \
 412        "git config --rename-section branch.eins branch.zwei"
 413
 414cat > expect << EOF
 415# Hallo
 416        #Bello
 417[branch "zwei"]
 418        x = 1
 419[branch "zwei"]
 420        y = 1
 421        [branch "1 234 blabl/a"]
 422weird
 423EOF
 424
 425test_expect_success "rename succeeded" "git diff expect .git/config"
 426
 427test_expect_failure "rename non-existing section" \
 428        'git config --rename-section branch."world domination" branch.drei'
 429
 430test_expect_success "rename succeeded" "git diff expect .git/config"
 431
 432test_expect_success "rename another section" \
 433        'git config --rename-section branch."1 234 blabl/a" branch.drei'
 434
 435cat > expect << EOF
 436# Hallo
 437        #Bello
 438[branch "zwei"]
 439        x = 1
 440[branch "zwei"]
 441        y = 1
 442[branch "drei"]
 443weird
 444EOF
 445
 446test_expect_success "rename succeeded" "git diff expect .git/config"
 447
 448cat >> .git/config << EOF
 449  [branch "zwei"] a = 1 [branch "vier"]
 450EOF
 451
 452test_expect_success "remove section" "git config --remove-section branch.zwei"
 453
 454cat > expect << EOF
 455# Hallo
 456        #Bello
 457[branch "drei"]
 458weird
 459EOF
 460
 461test_expect_success "section was removed properly" \
 462        "git diff -u expect .git/config"
 463
 464rm .git/config
 465
 466cat > expect << EOF
 467[gitcvs]
 468        enabled = true
 469        dbname = %Ggitcvs2.%a.%m.sqlite
 470[gitcvs "ext"]
 471        dbname = %Ggitcvs1.%a.%m.sqlite
 472EOF
 473
 474test_expect_success 'section ending' '
 475
 476        git config gitcvs.enabled true &&
 477        git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 478        git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 479        cmp .git/config expect
 480
 481'
 482
 483test_expect_success numbers '
 484
 485        git config kilo.gram 1k &&
 486        git config mega.ton 1m &&
 487        k=$(git config --int --get kilo.gram) &&
 488        test z1024 = "z$k" &&
 489        m=$(git config --int --get mega.ton) &&
 490        test z1048576 = "z$m"
 491'
 492
 493cat > expect <<EOF
 494fatal: bad config value for 'aninvalid.unit' in .git/config
 495EOF
 496
 497test_expect_success 'invalid unit' '
 498
 499        git config aninvalid.unit "1auto" &&
 500        s=$(git config aninvalid.unit) &&
 501        test "z1auto" = "z$s" &&
 502        if git config --int --get aninvalid.unit 2>actual
 503        then
 504                echo config should have failed
 505                false
 506        fi &&
 507        cmp actual expect
 508'
 509
 510cat > expect << EOF
 511true
 512false
 513true
 514false
 515true
 516false
 517true
 518false
 519EOF
 520
 521test_expect_success bool '
 522
 523        git config bool.true1 01 &&
 524        git config bool.true2 -1 &&
 525        git config bool.true3 YeS &&
 526        git config bool.true4 true &&
 527        git config bool.false1 000 &&
 528        git config bool.false2 "" &&
 529        git config bool.false3 nO &&
 530        git config bool.false4 FALSE &&
 531        rm -f result &&
 532        for i in 1 2 3 4
 533        do
 534            git config --bool --get bool.true$i >>result
 535            git config --bool --get bool.false$i >>result
 536        done &&
 537        cmp expect result'
 538
 539test_expect_failure 'invalid bool (--get)' '
 540
 541        git config bool.nobool foobar &&
 542        git config --bool --get bool.nobool'
 543
 544test_expect_failure 'invalid bool (set)' '
 545
 546        git config --bool bool.nobool foobar'
 547
 548rm .git/config
 549
 550cat > expect <<\EOF
 551[bool]
 552        true1 = true
 553        true2 = true
 554        true3 = true
 555        true4 = true
 556        false1 = false
 557        false2 = false
 558        false3 = false
 559        false4 = false
 560EOF
 561
 562test_expect_success 'set --bool' '
 563
 564        git config --bool bool.true1 01 &&
 565        git config --bool bool.true2 -1 &&
 566        git config --bool bool.true3 YeS &&
 567        git config --bool bool.true4 true &&
 568        git config --bool bool.false1 000 &&
 569        git config --bool bool.false2 "" &&
 570        git config --bool bool.false3 nO &&
 571        git config --bool bool.false4 FALSE &&
 572        cmp expect .git/config'
 573
 574rm .git/config
 575
 576cat > expect <<\EOF
 577[int]
 578        val1 = 1
 579        val2 = -1
 580        val3 = 5242880
 581EOF
 582
 583test_expect_success 'set --int' '
 584
 585        git config --int int.val1 01 &&
 586        git config --int int.val2 -1 &&
 587        git config --int int.val3 5m &&
 588        cmp expect .git/config'
 589
 590rm .git/config
 591
 592git config quote.leading " test"
 593git config quote.ending "test "
 594git config quote.semicolon "test;test"
 595git config quote.hash "test#test"
 596
 597cat > expect << EOF
 598[quote]
 599        leading = " test"
 600        ending = "test "
 601        semicolon = "test;test"
 602        hash = "test#test"
 603EOF
 604
 605test_expect_success 'quoting' 'cmp .git/config expect'
 606
 607test_expect_failure 'key with newline' 'git config key.with\\\
 608newline 123'
 609
 610test_expect_success 'value with newline' 'git config key.sub value.with\\\
 611newline'
 612
 613cat > .git/config <<\EOF
 614[section]
 615        ; comment \
 616        continued = cont\
 617inued
 618        noncont   = not continued ; \
 619        quotecont = "cont;\
 620inued"
 621EOF
 622
 623cat > expect <<\EOF
 624section.continued=continued
 625section.noncont=not continued
 626section.quotecont=cont;inued
 627EOF
 628
 629git config --list > result
 630
 631test_expect_success 'value continued on next line' 'cmp result expect'
 632
 633cat > .git/config <<\EOF
 634[section "sub=section"]
 635        val1 = foo=bar
 636        val2 = foo\nbar
 637        val3 = \n\n
 638        val4 =
 639        val5
 640EOF
 641
 642cat > expect <<\EOF
 643section.sub=section.val1
 644foo=barQsection.sub=section.val2
 645foo
 646barQsection.sub=section.val3
 647
 648
 649Qsection.sub=section.val4
 650Qsection.sub=section.val5Q
 651EOF
 652
 653git config --null --list | tr '\000' 'Q' > result
 654echo >>result
 655
 656test_expect_success '--null --list' 'cmp result expect'
 657
 658git config --null --get-regexp 'val[0-9]' | tr '\000' 'Q' > result
 659echo >>result
 660
 661test_expect_success '--null --get-regexp' 'cmp result expect'
 662
 663test_expect_success 'symlinked configuration' '
 664
 665        ln -s notyet myconfig &&
 666        GIT_CONFIG=myconfig git config test.frotz nitfol &&
 667        test -h myconfig &&
 668        test -f notyet &&
 669        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 670        GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
 671        test -h myconfig &&
 672        test -f notyet &&
 673        test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
 674        test "z$(GIT_CONFIG=notyet git config test.xyzzy)" = zrezrov
 675
 676'
 677
 678test_done