(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:'bisect can handle submodules' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-submodule-update.sh)}) (command.ShFunction name: git_bisect 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 Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp ] children: [ (command.Simple words: [{(git)} {(status)} {(-su)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:36) fd: -1 arg_word: {(expect)} ) ] ) (command.Simple words: [{(ls)} {(-1pR)} {(Id.Lit_Star '*')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_DGreat val:'>>' span_id:48) fd: -1 arg_word: {(expect)} ) ] ) (C {(tar)} {(cf)} {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/tmp.tar))} {(Id.Lit_Star '*')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GOOD) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:69) command_list: (command.CommandList children: [(C {(git)} {(rev-parse)} {(--verify)} {(HEAD)})] ) ) } spids: [68] ) ] ) (C {(git)} {(checkout)} {(DQ ($ Id.VSub_Number '$1'))}) (command.Simple words: [{(echo)} {(DQ (foo))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:99) fd: -1 arg_word: {(bar)} ) ] ) (C {(git)} {(add)} {(bar)}) (C {(git)} {(commit)} {(-m)} {(DQ ('bisect bad'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:BAD) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:128) command_list: (command.CommandList children: [(C {(git)} {(rev-parse)} {(--verify)} {(HEAD)})] ) ) } spids: [127] ) ] ) (C {(git)} {(reset)} {(--hard)} {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^')}) (C {(git)} {(submodule)} {(update)}) (C {(git)} {(bisect)} {(start)}) (C {(git)} {(bisect)} {(good)} {($ Id.VSub_DollarName '$GOOD')}) (C {(rm)} {(-rf)} {(Id.Lit_Star '*')}) (C {(tar)} {(xf)} {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/tmp.tar))}) (command.Simple words: [{(git)} {(status)} {(-su)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:210) fd: -1 arg_word: {(actual)} ) ] ) (command.Simple words: [{(ls)} {(-1pR)} {(Id.Lit_Star '*')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_DGreat val:'>>' span_id:222) fd: -1 arg_word: {(actual)} ) ] ) (C {(test_cmp)} {(expect)} {(actual)}) (C {(git)} {(bisect)} {(bad)} {($ Id.VSub_DollarName '$BAD')}) ] ) ] ) ) (C {(test_submodule_switch)} {(DQ (git_bisect))}) (C {(test_done)}) ] )