(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <'Test git config-set API in different settings'>)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: check_config body: (BraceGroup children: [ (AndOr children: [ (If arms: [ (if_arm cond: [(C {(test)} {(DQ ($ VSub_Number '$1'))} {(Lit_Other '=')} {(expect_code)})] action: [ (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:expect_code) op: Equal rhs: {(DQ ($ VSub_Number '$2'))} spids: [45] ) ] spids: [45] ) (AndOr children: [(C {(shift)}) (C {(shift)})] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [-1 42] ) ] else_action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:expect_code) op: Equal rhs: {(0)} spids: [62] ) ] spids: [62] ) ] spids: [59 66] ) (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:op) op: Equal rhs: {($ VSub_Number '$1')} spids: [71] ) (assign_pair lhs: (LhsName name:key) op: Equal rhs: {($ VSub_Number '$2')} spids: [74] ) ] spids: [71] ) (AndOr children: [ (C {(shift)}) (AndOr children: [ (C {(shift)}) (AndOr children: [ (If arms: [ (if_arm cond: [ (C {(test)} {($ VSub_Pound '$#')} {(KW_Bang '!') (Lit_Other '=')} {(0)} ) ] action: [ (C {(printf)} { (DQ ('%s') (EscapedLiteralPart token: <Lit_EscapedChar '\\n'> ) ) } {(DQ ($ VSub_At '$@'))} ) ] spids: [-1 100] ) ] redirects: [ (Redir op_id: Redir_Great fd: -1 arg_word: {(expect)} spids: [117] ) ] spids: [-1 115] ) (AndOr children: [ (SimpleCommand words: [ {(test_expect_code)} {($ VSub_Name '$expect_code')} {(test-config)} {(DQ ($ VSub_Name '$op'))} {(DQ ($ VSub_Name '$key'))} ] redirects: [ (Redir op_id: Redir_Great fd: -1 arg_word: {(actual)} spids: [137] ) ] ) (C {(test_cmp)} {(expect)} {(actual)}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [26] ) spids: [21 25] ) (C {(test_expect_success)} {(SQ <'setup default config'>)} { (SQ <'\n'> <'\tcat >.git/config <<-\\EOF\n'> <'\t[case]\n'> <'\t\tpenguin = very blue\n'> <'\t\tMovie = BadPhysics\n'> <'\t\tUPPERCASE = true\n'> <'\t\tMixedCase = true\n'> <'\t\tmy =\n'> <'\t\tfoo\n'> <'\t\tbaz = sam\n'> <'\t[Cores]\n'> <'\t\tWhatEver = Second\n'> <'\t\tbaz = bar\n'> <'\t[cores]\n'> <'\t\tbaz = bat\n'> <'\t[CORES]\n'> <'\t\tbaz = ball\n'> <'\t[my "Foo bAr"]\n'> <'\t\thi = mixed-case\n'> <'\t[my "FOO BAR"]\n'> <'\t\thi = upper-case\n'> <'\t[my "foo bar"]\n'> <'\t\thi = lower-case\n'> <'\t[case]\n'> <'\t\tbaz = bat\n'> <'\t\tbaz = hask\n'> <'\t[lamb]\n'> <'\t\tchop = 65\n'> <'\t\thead = none\n'> <'\t[goat]\n'> <'\t\tlegs = 4\n'> <'\t\thead = true\n'> <'\t\tskin = false\n'> <'\t\tnose = 1\n'> <'\t\thorns\n'> <'\tEOF\n'> ) } ) (C {(test_expect_success)} {(SQ <'get value for a simple key'>)} {(SQ <'\n'> <'\tcheck_config get_value case.penguin "very blue"\n'>)} ) (C {(test_expect_success)} {(SQ <'get value for a key with value as an empty string'>)} {(SQ <'\n'> <'\tcheck_config get_value case.my ""\n'>)} ) (C {(test_expect_success)} {(SQ <'get value for a key with value as NULL'>)} {(SQ <'\n'> <'\tcheck_config get_value case.foo "(NULL)"\n'>)} ) (C {(test_expect_success)} {(SQ <'upper case key'>)} { (SQ <'\n'> <'\tcheck_config get_value case.UPPERCASE "true" &&\n'> <'\tcheck_config get_value case.uppercase "true"\n'> ) } ) (C {(test_expect_success)} {(SQ <'mixed case key'>)} { (SQ <'\n'> <'\tcheck_config get_value case.MixedCase "true" &&\n'> <'\tcheck_config get_value case.MIXEDCASE "true" &&\n'> <'\tcheck_config get_value case.mixedcase "true"\n'> ) } ) (C {(test_expect_success)} {(SQ <'key and value with mixed case'>)} {(SQ <'\n'> <'\tcheck_config get_value case.Movie "BadPhysics"\n'>)} ) (C {(test_expect_success)} {(SQ <'key with case sensitive subsection'>)} { (SQ <'\n'> <'\tcheck_config get_value "my.Foo bAr.hi" "mixed-case" &&\n'> <'\tcheck_config get_value "my.FOO BAR.hi" "upper-case" &&\n'> <'\tcheck_config get_value "my.foo bar.hi" "lower-case"\n'> ) } ) (C {(test_expect_success)} {(SQ <'key with case insensitive section header'>)} { (SQ <'\n'> <'\tcheck_config get_value cores.baz "ball" &&\n'> <'\tcheck_config get_value Cores.baz "ball" &&\n'> <'\tcheck_config get_value CORES.baz "ball" &&\n'> <'\tcheck_config get_value coreS.baz "ball"\n'> ) } ) (C {(test_expect_success)} {(SQ <'key with case insensitive section header & variable'>)} { (SQ <'\n'> <'\tcheck_config get_value CORES.BAZ "ball" &&\n'> <'\tcheck_config get_value cores.baz "ball" &&\n'> <'\tcheck_config get_value cores.BaZ "ball" &&\n'> <'\tcheck_config get_value cOreS.bAz "ball"\n'> ) } ) (C {(test_expect_success)} {(SQ <'find value with misspelled key'>)} { (SQ <'\n'> < '\tcheck_config expect_code 1 get_value "my.fOo Bar.hi" "Value not found for \\"my.fOo Bar.hi\\""\n' > ) } ) (C {(test_expect_success)} {(SQ <'find value with the highest priority'>)} {(SQ <'\n'> <'\tcheck_config get_value case.baz "hask"\n'>)} ) (C {(test_expect_success)} {(SQ <'find integer value for a key'>)} {(SQ <'\n'> <'\tcheck_config get_int lamb.chop 65\n'>)} ) (C {(test_expect_success)} {(SQ <'find string value for a key'>)} { (SQ <'\n'> <'\tcheck_config get_string case.baz hask &&\n'> <'\tcheck_config expect_code 1 get_string case.ba "Value not found for \\"case.ba\\""\n'> ) } ) (C {(test_expect_success)} {(SQ <'check line error when NULL string is queried'>)} { (SQ <'\n'> <'\ttest_expect_code 128 test-config get_string case.foo 2>result &&\n'> <'\ttest_i18ngrep "fatal: .*case\\.foo.*\\.git/config.*line 7" result\n'> ) } ) (C {(test_expect_success)} {(SQ <'find integer if value is non parse-able'>)} {(SQ <'\n'> <'\tcheck_config expect_code 128 get_int lamb.head\n'>)} ) (C {(test_expect_success)} {(SQ <'find bool value for the entered key'>)} { (SQ <'\n'> <'\tcheck_config get_bool goat.head 1 &&\n'> <'\tcheck_config get_bool goat.skin 0 &&\n'> <'\tcheck_config get_bool goat.nose 1 &&\n'> <'\tcheck_config get_bool goat.horns 1 &&\n'> <'\tcheck_config get_bool goat.legs 1\n'> ) } ) (C {(test_expect_success)} {(SQ <'find multiple values'>)} {(SQ <'\n'> <'\tcheck_config get_value_multi case.baz sam bat hask\n'>)} ) (C {(test_expect_success)} {(SQ <'find value from a configset'>)} { (SQ <'\n'> <'\tcat >config2 <<-\\EOF &&\n'> <'\t[case]\n'> <'\t\tbaz = lama\n'> <'\t[my]\n'> <'\t\tnew = silk\n'> <'\t[case]\n'> <'\t\tbaz = ball\n'> <'\tEOF\n'> <'\techo silk >expect &&\n'> <'\ttest-config configset_get_value my.new config2 .git/config >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(SQ <'find value with highest priority from a configset'>)} { (SQ <'\n'> <'\techo hask >expect &&\n'> <'\ttest-config configset_get_value case.baz config2 .git/config >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(SQ <'find value_list for a key from a configset'>)} { (SQ <'\n'> <'\tcat >except <<-\\EOF &&\n'> <'\tsam\n'> <'\tbat\n'> <'\thask\n'> <'\tlama\n'> <'\tball\n'> <'\tEOF\n'> <'\ttest-config configset_get_value case.baz config2 .git/config >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(SQ <'proper error on non-existent files'>)} { (SQ <'\n'> <'\techo "Error (-1) reading configuration file non-existent-file." >expect &&\n'> < '\ttest_expect_code 2 test-config configset_get_value foo.bar non-existent-file 2>actual &&\n' > <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(POSIXPERM) (Lit_Comma ',') (SANITY)} {(SQ <'proper error on non-accessible files'>)} { (SQ <'\n'> <'\tchmod -r .git/config &&\n'> <'\ttest_when_finished "chmod +r .git/config" &&\n'> <'\techo "Error (-1) reading configuration file .git/config." >expect &&\n'> <'\ttest_expect_code 2 test-config configset_get_value foo.bar .git/config 2>actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(SQ <'proper error on error in default config files'>)} { (SQ <'\n'> <'\tcp .git/config .git/config.old &&\n'> <'\ttest_when_finished "mv .git/config.old .git/config" &&\n'> <'\techo "[" >>.git/config &&\n'> <'\techo "fatal: bad config line 34 in file .git/config" >expect &&\n'> <'\ttest_expect_code 128 test-config get_value foo.bar 2>actual &&\n'> <'\ttest_i18ncmp expect actual\n'> ) } ) (C {(test_expect_success)} {(SQ <'proper error on error in custom config files'>)} { (SQ <'\n'> <'\techo "[" >>syntax-error &&\n'> <'\techo "fatal: bad config line 1 in file syntax-error" >expect &&\n'> <'\ttest_expect_code 128 test-config configset_get_value foo.bar syntax-error 2>actual &&\n'> <'\ttest_i18ncmp expect actual\n'> ) } ) (C {(test_expect_success)} {(SQ <'check line errors for malformed values'>)} { (SQ <'\n'> <'\tmv .git/config .git/config.old &&\n'> <'\ttest_when_finished "mv .git/config.old .git/config" &&\n'> <'\tcat >.git/config <<-\\EOF &&\n'> <'\t[alias]\n'> <'\t\tbr\n'> <'\tEOF\n'> <'\ttest_expect_code 128 git br 2>result &&\n'> <'\ttest_i18ngrep "fatal: .*alias\\.br.*\\.git/config.*line 2" result\n'> ) } ) (C {(test_expect_success)} {(SQ <'error on modifying repo config without repo'>)} { (SQ <'\n'> <'\tmkdir no-repo &&\n'> <'\t(\n'> <'\t\tGIT_CEILING_DIRECTORIES=$(pwd) &&\n'> <'\t\texport GIT_CEILING_DIRECTORIES &&\n'> <'\t\tcd no-repo &&\n'> <'\t\ttest_must_fail git config a.b c 2>err &&\n'> <'\t\tgrep "not in a git directory" err\n'> <'\t)\n'> ) } ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:cmdline_config) op: Equal rhs: {(DQ ("'foo.bar=from-cmdline'"))} spids: [579] ) ] spids: [579] ) (C {(test_expect_success)} {(SQ <'iteration shows correct origins'>)} { (SQ <'\n'> <'\techo "[foo]bar = from-repo" >.git/config &&\n'> <'\techo "[foo]bar = from-home" >.gitconfig &&\n'> <'\tif test_have_prereq MINGW\n'> <'\tthen\n'> <'\t\t# Use Windows path (i.e. *not* $HOME)\n'> <'\t\tHOME_GITCONFIG=$(pwd)/.gitconfig\n'> <'\telse\n'> <'\t\t# Do not get fooled by symbolic links, i.e. $HOME != $(pwd)\n'> <'\t\tHOME_GITCONFIG=$HOME/.gitconfig\n'> <'\tfi &&\n'> <'\tcat >expect <<-EOF &&\n'> <'\tkey=foo.bar\n'> <'\tvalue=from-home\n'> <'\torigin=file\n'> <'\tname=$HOME_GITCONFIG\n'> <'\tscope=global\n'> <'\n'> <'\tkey=foo.bar\n'> <'\tvalue=from-repo\n'> <'\torigin=file\n'> <'\tname=.git/config\n'> <'\tscope=repo\n'> <'\n'> <'\tkey=foo.bar\n'> <'\tvalue=from-cmdline\n'> <'\torigin=command line\n'> <'\tname=\n'> <'\tscope=cmdline\n'> <'\tEOF\n'> <'\tGIT_CONFIG_PARAMETERS=$cmdline_config test-config iterate >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_done)}) ] )