(command.CommandList children: [ (C {<test_tristate>} {<GIT_TEST_GIT_DAEMON>}) (command.If arms: [ (if_arm cond: [ (C {<test>} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_GIT_DAEMON'))} {<Id.Lit_Equals '='>} {<false>} ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:skip_all) op: assign_op.Equal rhs: {(DQ <'git-daemon testing disabled (unset GIT_TEST_GIT_DAEMON to enable)'>)} spids: [71] ) ] ) (C {<test_done>}) ] spids: [56 68] ) ] ) (command.If arms: [ (if_arm cond: [(C {<test_have_prereq>} {<Id.KW_Bang '!'> <PIPE>})] action: [ (C {<test_skip_or_die>} {($ Id.VSub_DollarName '$GIT_TEST_GIT_DAEMON')} {(DQ <'file system does not support FIFOs'>)} ) ] spids: [82 89] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:LIB_GIT_DAEMON_PORT) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name LIB_GIT_DAEMON_PORT> suffix_op: (suffix_op.Unary op_id: Id.VTest_Hyphen arg_word: { (braced_var_sub token: <Id.VSub_Name this_test> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{<t>}) ) } ) ) } spids: [103] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_DAEMON_PID) op: assign_op.Equal rhs: (word.Empty) spids: [115] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_DAEMON_DOCUMENT_ROOT_PATH) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$PWD')) <'/repo'>} spids: [117] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_DAEMON_URL) op: assign_op.Equal rhs: {<git> <Id.Lit_Colon ':'> <'//127.0.0.1'> <Id.Lit_Colon ':'> ($ Id.VSub_DollarName '$LIB_GIT_DAEMON_PORT') } spids: [123] ) ] ) (command.ShFunction name: start_git_daemon body: (BraceGroup children: [ (command.If arms: [ (if_arm cond: [(C {<test>} {<-n>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_PID'))})] action: [(C {<error>} {(DQ <'start_git_daemon already called'>)})] spids: [138 149] ) ] ) (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_DOCUMENT_ROOT_PATH'))}) (C {<trap>} {(SQ <'code=$?; stop_git_daemon; (exit $code); die'>)} {<EXIT>}) (command.Simple words: [{<say>} {(DQ <'Starting git daemon ...'>)}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<3>})] do_fork: T ) (C {<mkfifo>} {<git_daemon_output>}) (command.Sentence child: (command.Simple words: [ {<git>} {<daemon>} {<--listen> <Id.Lit_Equals '='> <127.0.0.1>} {<--port> <Id.Lit_Equals '='> (DQ ($ Id.VSub_DollarName '$LIB_GIT_DAEMON_PORT'))} {<--reuseaddr>} {<--verbose>} {<--base-path> <Id.Lit_Equals '='> (DQ ($ Id.VSub_DollarName '$GIT_DAEMON_DOCUMENT_ROOT_PATH')) } {(DQ ($ Id.VSub_At '$@'))} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_DOCUMENT_ROOT_PATH'))} ] redirects: [ (redir op: <Id.Redir_GreatAnd '>&'> loc: (redir_loc.Fd fd:1) arg: {<3>} ) (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<git_daemon_output>} ) ] do_fork: T ) terminator: <Id.Op_Amp _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_DAEMON_PID) op: assign_op.Equal rhs: {($ Id.VSub_Bang '$!')} spids: [247] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (BraceGroup children: [ (command.Simple words: [{<read>} {<line>}] redirects: [(redir op:<Id.Redir_LessAnd '<&'> loc:(redir_loc.Fd fd:0) arg:{<7>})] do_fork: T ) (command.Simple words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$line'))}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<4>})] do_fork: T ) (command.Sentence child: (command.Simple words: [{<cat>}] redirects: [ (redir op: <Id.Redir_LessAnd '<&'> loc: (redir_loc.Fd fd:0) arg: {<7>} ) (redir op: <Id.Redir_GreatAnd '>&'> loc: (redir_loc.Fd fd:1) arg: {<4>} ) ] do_fork: T ) terminator: <Id.Op_Amp _> ) ] redirects: [ (redir op: <Id.Redir_Less '7<'> loc: (redir_loc.Fd fd:7) arg: {<git_daemon_output>} ) ] ) (command.If arms: [ (if_arm cond: [ (C {<test>} {<x> (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<expr>} {(DQ ($ Id.VSub_DollarName '$line'))} {<Id.Lit_Colon ':'>} { (DQ <Id.Lit_Other '\\'> <'[[0-9]*'> <Id.Lit_Other '\\'> <'] '> <Id.Lit_Other '\\'> <'(.*'> <Id.Lit_Other '\\'> <')'> ) } ) ) ) } {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<x> (DQ <'Ready to rumble'>)} ) ] action: [ (C {<kill>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_PID'))}) (C {<wait>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_PID'))}) (C {<trap>} {(SQ <die>)} {<EXIT>}) (C {<test_skip_or_die>} {($ Id.VSub_DollarName '$GIT_TEST_GIT_DAEMON')} {(DQ <'git daemon failed to start'>)} ) ] spids: [296 333] ) ] ) ] ) ] ) ) (command.ShFunction name: stop_git_daemon body: (BraceGroup children: [ (command.If arms: [ (if_arm cond: [(C {<test>} {<-z>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_PID'))})] action: [(command.ControlFlow token:<Id.ControlFlow_Return return>)] spids: [382 393] ) ] ) (C {<trap>} {(SQ <die>)} {<EXIT>}) (command.Simple words: [{<say>} {(DQ <'Stopping git daemon ...'>)}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<3>})] do_fork: T ) (C {<kill>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_PID'))}) (command.Simple words: [{<wait>} {(DQ ($ Id.VSub_DollarName '$GIT_DAEMON_PID'))}] redirects: [ (redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<3>}) (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<4>}) ] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ret) op: assign_op.Equal rhs: {($ Id.VSub_QMark '$?')} spids: [447] ) ] ) (command.If arms: [ (if_arm cond: [(C {<test_match_signal>} {<15>} {($ Id.VSub_QMark '$?')})] action: [ (C {<error>} {(DQ <'git daemon exited with status: '> ($ Id.VSub_DollarName '$ret'))} ) ] spids: [451 460] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_DAEMON_PID) op: assign_op.Equal rhs: (word.Empty) spids: [474] ) ] ) (C {<rm>} {<-f>} {<git_daemon_output>}) ] ) ) ] )