(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'Test wacky input to git config' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: setup body: (command.BraceGroup children: [ (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(printf)} {(DQ ('[section]') (Id.Lit_Other '\\') (n))}) (C {(printf)} {(DQ (' key = foo'))}) ] ) ] ) redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:43) fd: -1 arg_word: {(.git/config)} ) ] ) ] ) ) (command.ShFunction name: check body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_Number '$2'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:68) fd: -1 arg_word: {(expected)} ) ] ) (command.Simple words: [{(git)} {(config)} {(--get)} {(DQ ($ Id.VSub_Number '$1'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:82) fd: -1 arg_word: {(actual)} ) (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:85) fd: 2 arg_word: {(1)} ) ] ) (C {(test_cmp)} {(actual)} {(expected)}) ] ) ) (command.ShFunction name: check_regex body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_Number '$3'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:117) fd: -1 arg_word: {(expected)} ) ] ) (command.Simple words: [ {(git)} {(config)} {(--get)} {(DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:135) fd: -1 arg_word: {(actual)} ) (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:138) fd: 2 arg_word: {(1)} ) ] ) (C {(test_cmp)} {(actual)} {(expected)}) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'modify same key' span_id:154))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tgit config section.key bar &&\n' span_id:160) (Token id:Id.Lit_Chars val:'\tcheck section.key bar\n' span_id:161) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add key in same section' span_id:168))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:172) (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\tgit config section.other bar &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\tcheck section.key foo &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\tcheck section.other bar\n' span_id:176) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add key in different section' span_id:183))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\tgit config section2.key bar &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\tcheck section.key foo &&\n' span_id:190) (Token id:Id.Lit_Chars val:'\tcheck section2.key bar\n' span_id:191) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SECTION) op: assign_op.Equal rhs: { (DQ (test.q) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:198) ) (s) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\\\' span_id:200)) ("sq'sp e.key") ) } spids: [195] ) ] ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'make sure git config escapes section names properly' span_id: 207 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:211) (Token id:Id.Lit_Chars val:'\tgit config "$SECTION" bar &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\tcheck "$SECTION" bar\n' span_id:213) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:LONG_VALUE) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:218) command_list: (command.CommandList children: [(C {(printf)} {(DQ ('x%01021dx a'))} {(7)})] ) ) } spids: [217] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'do not crash on special long config line' span_id:231))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) (Token id:Id.Lit_Chars val:'\tsetup &&\n' span_id:236) (Token id:Id.Lit_Chars val:'\tgit config section.key "$LONG_VALUE" &&\n' span_id:237) (Token id:Id.Lit_Chars val:'\tcheck section.key "$LONG_VALUE"\n' span_id:238) ) } ) (command.ShFunction name: setup_many body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {(setup)}) (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_DGreat val:'>>' span_id:264) fd: -1 arg_word: {(.git/config)} ) ] ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:284) fd: -1 arg_word: {(5to1)} ) (redir.HereDoc op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:287) fd: -1 here_begin: { (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:288) ) (OF) } here_end_span_id: 298 stdin_parts: [ (' key = foo\n') (' key = foo\n') (' key = foo\n') (' key = foo\n') (' key = foo\n') ] ) ] ) (command.Simple words: [{(cat)} {(5to1)} {(5to1)} {(5to1)} {(5to1)} {(5to1)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:312) fd: -1 arg_word: {(5to2)} ) ] ) (command.Simple words: [{(cat)} {(5to2)} {(5to2)} {(5to2)} {(5to2)} {(5to2)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:333) fd: -1 arg_word: {(5to3)} ) ] ) (command.Simple words: [{(cat)} {(5to3)} {(5to3)} {(5to3)} {(5to3)} {(5to3)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:354) fd: -1 arg_word: {(5to4)} ) ] ) (command.Simple words: [{(cat)} {(5to4)} {(5to4)} {(5to4)} {(5to4)} {(5to4)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_DGreat val:'>>' span_id:375) fd: -1 arg_word: {(.git/config)} ) ] ) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'get many entries' span_id:387))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:391) (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:392) (Token id:Id.Lit_Chars val:'\tgit config --get-all section.key >actual &&\n' span_id:393) (Token id:Id.Lit_Chars val:'\ttest_line_count = 3126 actual\n' span_id:394) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'get many entries by regex' span_id:401))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:405) (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:406) (Token id:Id.Lit_Chars val:'\tgit config --get-regexp "sec.*ke." >actual &&\n' span_id:407) (Token id:Id.Lit_Chars val:'\ttest_line_count = 3126 actual\n' span_id:408) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add and replace one of many entries' span_id:415))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:419) (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\tgit config --add section.key bar &&\n' span_id:421) (Token id: Id.Lit_Chars val: '\tcheck_regex section.key "b.*r" bar &&\n' span_id: 422 ) (Token id:Id.Lit_Chars val:'\tgit config section.key beer "b.*r" &&\n' span_id:423) (Token id:Id.Lit_Chars val:'\tcheck_regex section.key "b.*r" beer\n' span_id:424) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'replace many entries' span_id:431))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:435) (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\tgit config --replace-all section.key bar &&\n' span_id:437) (Token id:Id.Lit_Chars val:'\tcheck section.key bar\n' span_id:438) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unset many entries' span_id:445))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:449) (Token id:Id.Lit_Chars val:'\tsetup_many &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\tgit config --unset-all section.key &&\n' span_id:451) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config section.key\n' span_id: 452 ) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: '--add appends new value after existing empty value' span_id: 459 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:463) (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:464) (Token id:Id.Lit_Chars val:'\n' span_id:465) (Token id:Id.Lit_Chars val:'\n' span_id:466) (Token id:Id.Lit_Chars val:'\tfool\n' span_id:467) (Token id:Id.Lit_Chars val:'\troll\n' span_id:468) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:469) (Token id:Id.Lit_Chars val:'\tcp .git/config .git/config.old &&\n' span_id:470) (Token id:Id.Lit_Chars val:'\ttest_when_finished "mv .git/config.old .git/config" &&\n' span_id:471) (Token id:Id.Lit_Chars val:'\tcat >.git/config <<-\\EOF &&\n' span_id:472) (Token id:Id.Lit_Chars val:'\t[foo]\n' span_id:473) (Token id:Id.Lit_Chars val:'\t\tbaz\n' span_id:474) (Token id:Id.Lit_Chars val:'\t\tbaz =\n' span_id:475) (Token id:Id.Lit_Chars val:'\t\tbaz = fool\n' span_id:476) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:477) (Token id:Id.Lit_Chars val:'\tgit config --add foo.baz roll &&\n' span_id:478) (Token id:Id.Lit_Chars val:'\tgit config --get-all foo.baz >output &&\n' span_id:479) (Token id:Id.Lit_Chars val:'\ttest_cmp expect output\n' span_id:480) ) } ) (C {(test_done)}) ] )