(command.CommandList children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:TEST_NO_CREATE_REPO spids:[24]) op: Equal rhs: {(NoThanks)} spids: [24] ) ] spids: [24] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:RETRY_TIMEOUT spids:[34]) op: Equal rhs: {(60)} spids: [34] ) ] spids: [34] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:P4D_TIMEOUT spids:[44]) op: Equal rhs: {(300)} spids: [44] ) ] spids: [44] ) (C {(.)} {(./test-lib.sh)}) (command.If arms: [ (if_arm cond: [(command.Pipeline children:[(C {(test_have_prereq)} {(PYTHON)})] negated:T)] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:skip_all spids:[64]) op: Equal rhs: {(SQ <'skipping git p4 tests; python not available'>)} spids: [64] ) ] spids: [64] ) (C {(test_done)}) ] spids: [16777215 61] ) ] spids: [16777215 72] ) (command.AndOr ops: [Op_DPipe] children: [ (command.Subshell child: (command.AndOr ops:[Op_DAmp] children:[(C {(p4)} {(-h)}) (C {(p4d)} {(-h)})]) redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)}) (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)}) ] spids: [74 86] ) (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:skip_all spids:[99]) op: Equal rhs: {(SQ <'skipping git p4 tests; no p4 or p4d'>)} spids: [99] ) ] spids: [99] ) (C {(test_done)}) ] spids: [96] ) ] ) (command.FuncDef name: native_path body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:path spids:[139]) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [139] ) ] spids: [139] ) (command.If arms: [ (if_arm cond: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(test_have_prereq)} {(CYGWIN)}) (command.Pipeline children: [(C {(p4)} {(-V)}) (C {(grep)} {(-q)} {(CYGWIN)})] negated: T ) ] ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:path spids:[173]) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [ (C {(cygpath)} {(--windows)} {(DQ ($ VSub_Name '$path'))}) ] ) left_token: <Left_CommandSub '$('> spids: [174 182] ) } spids: [173] ) ] spids: [173] ) ] spids: [16777215 170] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:path spids:[188]) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [ (C {(test-path-utils)} {(real_path)} {(DQ ($ VSub_Name '$path'))}) ] ) left_token: <Left_CommandSub '$('> spids: [189 197] ) } spids: [188] ) ] spids: [188] ) ] spids: [185 200] ) (C {(echo)} {(DQ ($ VSub_Name '$path'))}) ] ) ] spids: [136] ) spids: [131 135] ) (command.FuncDef name: time_in_seconds body: (command.BraceGroup children: [ (command.Subshell child: (command.AndOr ops: [Op_DAmp] children: [ (C {(cd)} {(/)}) (C {(DQ ($ VSub_Name '$PYTHON_PATH'))} {(-c)} {(SQ <'import time; print(int(time.time()))'>)} ) ] ) spids: [237 253] ) ] spids: [234] ) spids: [229 233] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:testid spids:[273]) op: Equal rhs: { (word_part.BracedVarSub token: <VSub_Name this_test> suffix_op: (suffix_op.StringUnary op_id:VOp1_Pound arg_word:{(t)}) spids: [274 278] ) } spids: [273] ) ] spids: [273] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:git_p4_test_start spids:[280]) op: Equal rhs: {(9800)} spids: [280] ) ] spids: [280] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:P4DPORT spids:[283]) op: Equal rhs: { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Plus left: (arith_expr.ArithWord w:{(Lit_Digits 10669)}) right: (arith_expr.ArithBinary op_id: Arith_Minus left: (arith_expr.ArithWord w:{($ VSub_Name '$testid')}) right: (arith_expr.ArithWord w:{($ VSub_Name '$git_p4_test_start')}) ) ) spids: [284 297] ) } spids: [283] ) ] spids: [283] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:P4PORT spids:[300]) op: Equal rhs: {(localhost) (Lit_Other ':') ($ VSub_Name '$P4DPORT')} spids: [300] ) ] spids: [300] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:P4CLIENT spids:[305]) op: Equal rhs: {(client)} spids: [305] ) ] spids: [305] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:P4USER spids:[308]) op: Equal rhs: {(author)} spids: [308] ) ] spids: [308] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:P4EDITOR spids:[311]) op: Equal rhs: {(true)} spids: [311] ) ] spids: [311] ) (C {(unset)} {(P4CHARSET)}) (C {(export)} {(P4PORT)} {(P4CLIENT)} {(P4USER)} {(P4EDITOR)} {(P4CHARSET)}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:db spids:[331]) op: Equal rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/db))} spids: [331] ) ] spids: [331] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:cli spids:[337]) op: Equal rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/cli))} spids: [337] ) ] spids: [337] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:git spids:[343]) op: Equal rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/git))} spids: [343] ) ] spids: [343] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:pidfile spids:[349]) op: Equal rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/p4d.pid))} spids: [349] ) ] spids: [349] ) (command.FuncDef name: cleanup body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [(C {(test)} {(-f)} {(DQ ($ VSub_Name '$pidfile'))})] action: [ (command.AndOr ops: [Op_DAmp] children: [ (command.SimpleCommand words: [ {(kill)} {(-9)} { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(cat)} {(DQ ($ VSub_Name '$pidfile'))})] ) left_token: <Left_CommandSub '$('> spids: [385 391] ) } ] redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})] ) (command.ControlFlow token: <ControlFlow_Exit exit> arg_word: {(255)} ) ] ) ] spids: [16777215 378] ) ] spids: [16777215 403] ) ] spids: [364] ) spids: [359 363] ) (C {(trap)} {(cleanup)} {(EXIT)}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:TMPDIR spids:[423]) op: Equal rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY'))} spids: [423] ) ] spids: [423] ) (C {(export)} {(TMPDIR)}) (command.FuncDef name: start_p4d body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp] children: [ (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$db'))} {(DQ ($ VSub_Name '$cli'))} {(DQ ($ VSub_Name '$git'))} ) (C {(rm)} {(-f)} {(DQ ($ VSub_Name '$pidfile'))}) (command.Subshell child: (command.AndOr ops: [Op_DAmp] children: [ (C {(cd)} {(DQ ($ VSub_Name '$db'))}) (command.BraceGroup children: [ (command.Sentence child: (C {(p4d)} {(-q)} {(-p)} {($ VSub_Name '$P4DPORT')} {(DQ ($ VSub_At '$@'))}) terminator: <Op_Amp '&'> ) (command.SimpleCommand words: [{(echo)} {($ VSub_Bang '$!')}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(DQ ($ VSub_Name '$pidfile'))} ) ] ) ] spids: [483] ) ] ) spids: [471 514] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:i spids:[540]) op: Equal rhs: { (word_part.BracedVarSub token: <VSub_Name P4D_START_PATIENCE> suffix_op: (suffix_op.StringUnary op_id:VTest_ColonHyphen arg_word:{(300)}) spids: [541 545] ) } spids: [540] ) ] spids: [540] ) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:pid spids:[548]) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(cat)} {(DQ ($ VSub_Name '$pidfile'))})] ) left_token: <Left_CommandSub '$('> spids: [549 555] ) } spids: [548] ) ] spids: [548] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:timeout spids:[559]) op: Equal rhs: { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Plus left: (arith_expr.ArithWord w: { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(time_in_seconds)})] ) left_token: <Left_CommandSub '$('> spids: [561 563] ) } ) right: (arith_expr.ArithWord w:{($ VSub_Name '$P4D_TIMEOUT')}) ) spids: [560 569] ) } spids: [559] ) ] spids: [559] ) (command.Sentence child: (command.WhileUntil keyword: <KW_While while> cond: [(C {(true)})] body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: [ (C {(test)} { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(time_in_seconds)})] ) left_token: <Left_CommandSub '$('> spids: [584 586] ) } {(-gt)} {($ VSub_Name '$timeout')} ) ] action: [ (C {(kill)} {(-9)} {($ VSub_Name '$pid')}) (command.ControlFlow token: <ControlFlow_Exit exit> arg_word: {(1)} ) ] spids: [16777215 593] ) ] spids: [16777215 608] ) (C {(sleep)} {(1)}) ] spids: [577 616] ) ) terminator: <Op_Amp '&'> ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:watchdog_pid spids:[621]) op: Equal rhs: {($ VSub_Bang '$!')} spids: [621] ) ] spids: [621] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:ready spids:[626]) op: Equal rhs: (word.EmptyWord) spids: [626] ) ] spids: [626] ) (command.WhileUntil keyword: <KW_While while> cond: [(C {(test)} {($ VSub_Name '$i')} {(-gt)} {(0)})] body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: [ (command.SimpleCommand words: [{(p4)} {(info)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(/dev/null)} ) (redir.Redir op: <Redir_GreatAnd '2>&'> fd: 2 arg_word: {(1)} ) ] ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:ready spids:[663]) op: Equal rhs: {(true)} spids: [663] ) ] spids: [663] ) (command.ControlFlow token: <ControlFlow_Break break> ) ] spids: [16777215 660] ) ] spids: [16777215 670] ) (command.AndOr ops: [Op_DPipe] children: [ (command.SimpleCommand words: [{(kill)} {(-0)} {($ VSub_Name '$pid')}] redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})] ) (command.ControlFlow token:<ControlFlow_Break break>) ] ) (C {(echo)} {(waiting)} {(KW_For for)} {(p4d)} {(to)} {(start)}) (C {(sleep)} {(1)}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:i spids:[709]) op: Equal rhs: { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Minus left: (arith_expr.ArithWord w:{($ VSub_Name '$i')}) right: (arith_expr.ArithWord w:{(Lit_Digits 1)}) ) spids: [710 719] ) } spids: [709] ) ] spids: [709] ) ] spids: [640 722] ) ) (command.If arms: [ (if_arm cond: [(C {(test)} {(-z)} {(DQ ($ VSub_Name '$ready'))})] action: [(command.ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})] spids: [16777215 737] ) ] spids: [16777215 749] ) (C {(p4_add_user)} {(author)}) (command.AndOr ops: [Op_DAmp] children: [ (C {(client_view)} {(DQ ('//depot/... //client/...'))}) (command.ControlFlow token:<ControlFlow_Return return> arg_word:{(0)}) ] ) ] spids: [438] ) spids: [433 437] ) (command.FuncDef name: p4_add_user body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp] children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:name spids:[792]) op: Equal rhs: {($ VSub_Number '$1')} spids: [792] ) ] spids: [792] ) (command.SimpleCommand words: [{(p4)} {(user)} {(-f)} {(-i)}] redirects: [ (redir.HereDoc op: <Redir_DLessDash '<<-'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 819 stdin_parts: [ ('User: ') ($ VSub_Name '$name') ('\n') ('Email: ') ($ VSub_Name '$name') ('@example.com\n') ('FullName: Dr. ') ($ VSub_Name '$name') ('\n') ] ) ] ) ] ) ] spids: [789] ) spids: [784 788] ) (command.FuncDef name: p4_add_job body: (command.BraceGroup children: [ (command.SimpleCommand words: [{(p4)} {(job)} {(-f)} {(-i)}] redirects: [ (redir.HereDoc op: <Redir_DLessDash '<<-'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 849 stdin_parts: [ ('Job: ') ($ VSub_Number '$1') ('\n') ('Status: open\n') ('User: dummy\n') ('Description:\n') ] ) ] ) ] spids: [828] ) spids: [823 827] ) (command.FuncDef name: retry_until_success body: (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:timeout spids:[861]) op: Equal rhs: { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Plus left: (arith_expr.ArithWord w: { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(time_in_seconds)})] ) left_token: <Left_CommandSub '$('> spids: [863 865] ) } ) right: (arith_expr.ArithWord w:{($ VSub_Name '$RETRY_TIMEOUT')}) ) spids: [862 871] ) } spids: [861] ) ] spids: [861] ) (command.WhileUntil keyword: <KW_Until until> cond: [ (command.AndOr ops: [Op_DPipe] children: [ (command.SimpleCommand words: [{(DQ ($ VSub_At '$@'))}] redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})] ) (C {(test)} { (word_part.CommandSubPart command_list: (command.CommandList children:[(C {(time_in_seconds)})]) left_token: <Left_CommandSub '$('> spids: [887 889] ) } {(-gt)} {($ VSub_Name '$timeout')} ) ] ) ] body: (command.DoGroup children:[(C {(sleep)} {(1)})] spids:[896 904]) ) ] spids: [858] ) spids: [853 857] ) (command.FuncDef name: retry_until_fail body: (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:timeout spids:[917]) op: Equal rhs: { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Plus left: (arith_expr.ArithWord w: { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(time_in_seconds)})] ) left_token: <Left_CommandSub '$('> spids: [919 921] ) } ) right: (arith_expr.ArithWord w:{($ VSub_Name '$RETRY_TIMEOUT')}) ) spids: [918 927] ) } spids: [917] ) ] spids: [917] ) (command.WhileUntil keyword: <KW_Until until> cond: [ (command.AndOr ops: [Op_DPipe] children: [ (command.Pipeline children: [ (command.SimpleCommand words: [{(DQ ($ VSub_At '$@'))}] redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})] ) ] negated: T ) (C {(test)} { (word_part.CommandSubPart command_list: (command.CommandList children:[(C {(time_in_seconds)})]) left_token: <Left_CommandSub '$('> spids: [945 947] ) } {(-gt)} {($ VSub_Name '$timeout')} ) ] ) ] body: (command.DoGroup children:[(C {(sleep)} {(1)})] spids:[954 962]) ) ] spids: [914] ) spids: [909 913] ) (command.FuncDef name: kill_p4d body: (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:pid spids:[975]) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(cat)} {(DQ ($ VSub_Name '$pidfile'))})] ) left_token: <Left_CommandSub '$('> spids: [976 982] ) } spids: [975] ) ] spids: [975] ) (C {(retry_until_fail)} {(kill)} {($ VSub_Name '$pid')}) (C {(retry_until_fail)} {(kill)} {(-9)} {($ VSub_Name '$pid')}) (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (command.SimpleCommand words: [{(test_must_fail)} {(kill)} {($ VSub_Name '$pid')}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(/dev/null)} ) (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)}) ] ) (C {(rm)} {(-rf)} {(DQ ($ VSub_Name '$db'))} {(DQ ($ VSub_Name '$cli'))} {(DQ ($ VSub_Name '$pidfile'))} ) (C {(retry_until_fail)} {(kill)} {(-9)} {($ VSub_Name '$watchdog_pid')}) ] ) ] spids: [972] ) spids: [967 971] ) (command.FuncDef name: cleanup_git body: (command.BraceGroup children: [ (C {(retry_until_success)} {(rm)} {(-r)} {(DQ ($ VSub_Name '$git'))}) (command.AndOr ops: [Op_DAmp] children: [ (C {(test_must_fail)} {(test)} {(-d)} {(DQ ($ VSub_Name '$git'))}) (C {(retry_until_success)} {(mkdir)} {(DQ ($ VSub_Name '$git'))}) ] ) ] spids: [1055] ) spids: [1050 1054] ) (command.FuncDef name: marshal_dump body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp] children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:what spids:[1101]) op: Equal rhs: {($ VSub_Number '$1')} spids: [1101] ) ] spids: [1101] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:line spids:[1107]) op: Equal rhs: { (word_part.BracedVarSub token: <VSub_Number 2> suffix_op: (suffix_op.StringUnary op_id:VTest_ColonHyphen arg_word:{(1)}) spids: [1108 1112] ) } spids: [1107] ) ] spids: [1107] ) (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/marshal-dump.py))} ) (redir.HereDoc op: <Redir_DLessDash '<<-'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 1141 stdin_parts: [ ('import marshal\n') ('import sys\n') ("instream = getattr(sys.stdin, 'buffer', sys.stdin)\n") ('for i in range(') ($ VSub_Name '$line') ('):\n') (' d = marshal.load(instream)\n') ("print(d[b'") ($ VSub_Name '$what') ("'].decode('utf-8'))\n") ] ) ] ) (C {(DQ ($ VSub_Name '$PYTHON_PATH'))} {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/marshal-dump.py))} ) ] ) ] spids: [1098] ) spids: [1093 1097] ) (command.FuncDef name: client_view body: (command.BraceGroup children: [ (command.Pipeline children: [ (command.Subshell child: (command.AndOr ops: [Op_DAmp] children: [ (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.HereDoc op: <Redir_DLessDash '<<-'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 1203 stdin_parts: [ ('Client: ') ($ VSub_Name '$P4CLIENT') ('\n') ('Description: ') ($ VSub_Name '$P4CLIENT') ('\n') ('Root: ') ($ VSub_Name '$cli') ('\n') ('AltRoots: ') (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(native_path)} {(DQ ($ VSub_Name '$cli'))})] ) left_token: <Left_CommandSub '$('> spids: [1192 1198] ) ('\n') ('LineEnd: unix\n') ('View:\n') ] ) ] ) (C {(printf)} {(DQ (Lit_Other '\\') ('t%s') (Lit_Other '\\') (n))} {(DQ ($ VSub_At '$@'))} ) ] ) spids: [1172 1219] ) (C {(p4)} {(client)} {(-i)}) ] negated: F ) ] spids: [1169] ) spids: [1164 1168] ) (command.FuncDef name: is_cli_file_writeable body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp] children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:file spids:[1248]) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [1248] ) ] spids: [1248] ) (command.If arms: [ (if_arm cond: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(test_have_prereq)} {(CYGWIN)}) (command.Pipeline children: [(C {(p4)} {(-V)}) (C {(grep)} {(-q)} {(CYGWIN)})] negated: F ) ] ) ] action: [ (command.AndOr ops: [Op_DAmp] children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:stat spids:[1280]) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [ (C {(stat)} {(--format) (Lit_Other '=') (Lit_Other '%') (a)} {(DQ ($ VSub_Name '$file'))} ) ] ) left_token: <Left_CommandSub '$('> spids: [1281 1292] ) } spids: [1280] ) ] spids: [1280] ) (C {(test)} {($ VSub_Name '$stat')} {(Lit_Other '=')} {(644)}) ] ) ] spids: [16777215 1277] ) ] else_action: [(C {(test)} {(-w)} {(DQ ($ VSub_Name '$file'))})] spids: [1306 1318] ) ] ) ] spids: [1237] ) spids: [1232 1236] ) ] )