(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"check that read-tree rejects confusing paths">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"create base tree">)} { (SQ <"\n"> <"\techo content >file &&\n"> <"\tgit add file &&\n"> <"\tgit commit -m base &&\n"> <"\tblob=$(git rev-parse HEAD:file) &&\n"> <"\ttree=$(git rev-parse HEAD^{tree})\n"> ) } ) (C {(test_expect_success)} {(SQ <"enable core.protectHFS for rejection tests">)} {(SQ <"\n"> <"\tgit config core.protectHFS true\n">)} ) (C {(test_expect_success)} {(SQ <"enable core.protectNTFS for rejection tests">)} {(SQ <"\n"> <"\tgit config core.protectNTFS true\n">)} ) (While cond: [(Sentence child:(C {(read)} {(path)} {(pretty)}) terminator:<Op_Semi ";">)] body: (DoGroup children: [ (C {(Lit_Other ":")} { (BracedVarSub token: <VSub_Name pretty> suffix_op: (StringUnary op_id:VTest_ColonEquals arg_word:{($ VSub_Name "$path")}) spids: [68 72] ) } ) (Case to_match: {(DQ ($ VSub_Name "$path"))} arms: [ (case_arm pat_list: [{(Lit_Other "*") (SPACE)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:path) op: Equal rhs: { (DQ (BracedVarSub token: <VSub_Name path> suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(SPACE)}) spids: [91 95] ) (" ") ) } spids: [89] ) ] spids: [89] ) ] spids: [84 86 100 -1] ) ] spids: [75 81 103] ) (C {(test_expect_success)} {(DQ ("reject ") ($ VSub_Name "$pretty") (" at end of path"))} { (SQ <"\n"> <"\t\tprintf \"100644 blob %s\\t%s\" \"$blob\" \"$path\" >tree &&\n"> <"\t\tbogus=$(git mktree <tree) &&\n"> <"\t\ttest_must_fail git read-tree $bogus\n"> <"\t"> ) } ) (C {(test_expect_success)} {(DQ ("reject ") ($ VSub_Name "$pretty") (" as subtree"))} { (SQ <"\n"> <"\t\tprintf \"040000 tree %s\\t%s\" \"$tree\" \"$path\" >tree &&\n"> <"\t\tbogus=$(git mktree <tree) &&\n"> <"\t\ttest_must_fail git read-tree $bogus\n"> <"\t"> ) } ) ] spids: [63 140] ) redirects: [ (HereDoc op_id: Redir_DLessDash fd: -1 body: { (DQ (".\n") ("..\n") (".git\n") (".GIT\n") (${ VSub_Name u200c) (".Git {u200c}.Git\n") (.gI) (${ VSub_Name u200c) ("T .gI{u200c}T\n") (.GiT) (${ VSub_Name u200c) (" .GiT{u200c}\n") ("git~1\n") (".git.SPACE .git.{space}\n") (.) (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) (.GIT) (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) ("foobar backslashes\n") (.git) (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) ("foobar backslashes2\n") ) } do_expansion: True here_end: EOF was_filled: True spids: [142] ) ] ) (C {(test_expect_success)} {(SQ <"utf-8 paths allowed with core.protectHFS off">)} { (SQ <"\n"> <"\ttest_when_finished \"git read-tree HEAD\" &&\n"> <"\ttest_config core.protectHFS false &&\n"> <"\tprintf \"100644 blob %s\\t%s\" \"$blob\" \".gi${u200c}t\" >tree &&\n"> <"\tok=$(git mktree <tree) &&\n"> <"\tgit read-tree $ok\n"> ) } ) (C {(test_done)}) ] )