(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: 'check that read-tree rejects confusing paths' span_id: 6 ) ) } spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create base tree' span_id:17))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) (Token id:Id.Lit_Chars val:'\techo content >file &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:23) (Token id:Id.Lit_Chars val:'\tgit commit -m base &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tblob=$(git rev-parse HEAD:file) &&\n' span_id:25) (Token id:Id.Lit_Chars val:'\ttree=$(git rev-parse HEAD^{tree})\n' span_id:26) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'enable core.protectHFS for rejection tests' span_id:33))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:37) (Token id:Id.Lit_Chars val:'\tgit config core.protectHFS true\n' span_id:38) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'enable core.protectNTFS for rejection tests' span_id:45))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:49) (Token id:Id.Lit_Chars val:'\tgit config core.protectNTFS true\n' span_id:50) ) } ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:54) cond: [ (command.Sentence child: (C {(read)} {(path)} {(pretty)}) terminator: (Token id:Id.Op_Semi val:';' span_id:61) ) ] body: (command.DoGroup children: [ (C {(Id.Lit_Other ':')} { (braced_var_sub token: (Token id:Id.VSub_Name val:pretty span_id:69) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonEquals arg_word: {($ Id.VSub_DollarName '$path')} ) ) } ) (command.Case to_match: {(DQ ($ Id.VSub_DollarName '$path'))} arms: [ (case_arm pat_list: [{(Id.Lit_Star '*') (SPACE)}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:path) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: (Token id:Id.VSub_Name val:path span_id:92) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(SPACE)}) ) (' ') ) } spids: [89] ) ] ) ] spids: [84 86 100 -1] ) ] ) (C {(test_expect_success)} {(DQ ('reject ') ($ Id.VSub_DollarName '$pretty') (' at end of path'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) (Token id: Id.Lit_Chars val: '\t\tprintf "100644 blob %s\\t%s" "$blob" "$path" >tree &&\n' span_id: 116 ) (Token id:Id.Lit_Chars val:'\t\tbogus=$(git mktree <tree) &&\n' span_id:117) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git read-tree $bogus\n' span_id: 118 ) (Token id:Id.Lit_Chars val:'\t' span_id:119) ) } ) (C {(test_expect_success)} {(DQ ('reject ') ($ Id.VSub_DollarName '$pretty') (' as subtree'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:133) (Token id: Id.Lit_Chars val: '\t\tprintf "040000 tree %s\\t%s" "$tree" "$path" >tree &&\n' span_id: 134 ) (Token id:Id.Lit_Chars val:'\t\tbogus=$(git mktree <tree) &&\n' span_id:135) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git read-tree $bogus\n' span_id: 136 ) (Token id:Id.Lit_Chars val:'\t' span_id:137) ) } ) ] ) redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:142) fd: -1 here_begin: {(EOF)} here_end_span_id: 177 stdin_parts: [ ('.\n') ('..\n') ('.git\n') ('.GIT\n') (${ Id.VSub_Name u200c) ('.Git {u200c}.Git\n') (.gI) (${ Id.VSub_Name u200c) ('T .gI{u200c}T\n') (.GiT) (${ Id.VSub_Name u200c) (' .GiT{u200c}\n') ('git~1\n') ('.git.SPACE .git.{space}\n') (.) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:166) ) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:167) ) (.GIT) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:169) ) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:170) ) ('foobar backslashes\n') (.git) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:173) ) (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:174) ) ('foobar backslashes2\n') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'utf-8 paths allowed with core.protectHFS off' span_id:182))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:186) (Token id: Id.Lit_Chars val: '\ttest_when_finished "git read-tree HEAD" &&\n' span_id: 187 ) (Token id:Id.Lit_Chars val:'\ttest_config core.protectHFS false &&\n' span_id:188) (Token id: Id.Lit_Chars val: '\tprintf "100644 blob %s\\t%s" "$blob" ".gi${u200c}t" >tree &&\n' span_id: 189 ) (Token id:Id.Lit_Chars val:'\tok=$(git mktree <tree) &&\n' span_id:190) (Token id:Id.Lit_Chars val:'\tgit read-tree $ok\n' span_id:191) ) } ) (C {(test_done)}) ] )