(List (= scope= flags=0 words=[] bindings=[('TEST_NO_CREATE_REPO', {[LIT_CHARS NoThanks]})]) (= scope= flags=0 words=[] bindings=[('RETRY_TIMEOUT', {[LIT_CHARS 60]})]) (= scope= flags=0 words=[] bindings=[('P4D_TIMEOUT', {[LIT_CHARS 300]})]) (Com {[LIT_CHARS .]} {[LIT_CHARS ./test-lib.sh]}) (If (Pipeline! (Com {[LIT_CHARS test_have_prereq]} {[LIT_CHARS PYTHON]}) ) (List (= scope= flags=0 words=[] bindings=[('skip_all', {[SQ ]})]) (Com {[LIT_CHARS test_done]}) ) ) (AndOr OP_OR_IF (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS p4]} {[LIT_CHARS -h]}) (Com {[LIT_CHARS p4d]} {[LIT_CHARS -h]}) ) ) (List (= scope= flags=0 words=[] bindings=[('skip_all', {[SQ ]})]) (Com {[LIT_CHARS test_done]}) ) ) (FunctionDef native_path [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('path', {[DQ [VarSub 1]]})]) (AndOr OP_AND_IF (If (AndOr OP_AND_IF (Com {[LIT_CHARS test_have_prereq]} {[LIT_CHARS CYGWIN]}) (Pipeline! (Com {[LIT_CHARS p4]} {[LIT_CHARS -V]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[LIT_CHARS CYGWIN]}) ) ) (= scope= flags=0 words=[] bindings=[('path', {[ComSub (Com {[LIT_CHARS cygpath]} {[LIT_CHARS --windows]} {[DQ [VarSub path]]})]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('path', {[ComSub (Com {[LIT_CHARS test-path-utils]} {[LIT_CHARS real_path]} {[DQ [VarSub path]]})]})]) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub path]]}) ) ) ) (FunctionDef time_in_seconds [] (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[LIT_CHARS /]}) (Com {[DQ [VarSub PYTHON_PATH]]} {[LIT_CHARS -c]} {[SQ ]}) ) ) ) (= scope= flags=0 words=[] bindings=[('testid', {[VarSub this_test transform_ops=[VS_UNARY_POUND {[LIT_CHARS t]}]]})]) (= scope= flags=0 words=[] bindings=[('git_p4_test_start', {[LIT_CHARS 9800]})]) (= scope= flags=0 words=[] bindings=[('P4DPORT', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 10669]}} {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub testid]}} {A Atom NODE_ARITH_WORD {[VarSub git_p4_test_start]}}}}]})]) (= scope= flags=0 words=[] bindings=[('P4PORT', {[LIT_CHARS localhost] [LIT_OTHER ":"] [VarSub P4DPORT]})]) (= scope= flags=0 words=[] bindings=[('P4CLIENT', {[LIT_CHARS client]})]) (= scope= flags=0 words=[] bindings=[('P4USER', {[LIT_CHARS author]})]) (= scope= flags=0 words=[] bindings=[('P4EDITOR', {[LIT_CHARS true]})]) (Com {[LIT_CHARS unset]} {[LIT_CHARS P4CHARSET]}) (= scope= flags=1 words=[{[LIT_CHARS P4PORT]}, {[LIT_CHARS P4CLIENT]}, {[LIT_CHARS P4USER]}, {[LIT_CHARS P4EDITOR]}, {[LIT_CHARS P4CHARSET]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('db', {[DQ [VarSub TRASH_DIRECTORY][LIT_CHARS /db]]})]) (= scope= flags=0 words=[] bindings=[('cli', {[DQ [VarSub TRASH_DIRECTORY][LIT_CHARS /cli]]})]) (= scope= flags=0 words=[] bindings=[('git', {[DQ [VarSub TRASH_DIRECTORY][LIT_CHARS /git]]})]) (= scope= flags=0 words=[] bindings=[('pidfile', {[DQ [VarSub TRASH_DIRECTORY][LIT_CHARS /p4d.pid]]})]) (FunctionDef cleanup [] (If (Com {[LIT_CHARS test]} {[LIT_CHARS -f]} {[DQ [VarSub pidfile]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS kill]} {[LIT_CHARS -9]} {[ComSub (Com {[LIT_CHARS cat]} {[DQ [VarSub pidfile]]})]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 255]}) ) ) ) (Com {[LIT_CHARS trap]} {[LIT_CHARS cleanup]} {[LIT_CHARS EXIT]}) (= scope= flags=0 words=[] bindings=[('TMPDIR', {[DQ [VarSub TRASH_DIRECTORY]]})]) (= scope= flags=1 words=[{[LIT_CHARS TMPDIR]}] bindings=[]) (FunctionDef start_p4d [] (List (AndOr OP_AND_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub db]]} {[DQ [VarSub cli]]} {[DQ [VarSub git]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub pidfile]]}) (AndOr OP_AND_IF (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub db]]}) (List (Fork (Com {[LIT_CHARS p4d]} {[LIT_CHARS -q]} {[LIT_CHARS -p]} {[VarSub P4DPORT]} {[DQ [VarSub @]]}) ) (Com {[LIT_CHARS echo]} {[VarSub !]} < (FilenameRedirectNode filename={[DQ [VarSub pidfile]]} "> 1), > ) ) ) ) (= scope= flags=0 words=[] bindings=[('i', {[VarSub P4D_START_PATIENCE test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS 300]}]})]) ) ) ) (= scope= flags=0 words=[] bindings=[('pid', {[ComSub (Com {[LIT_CHARS cat]} {[DQ [VarSub pidfile]]})]})]) (= scope= flags=0 words=[] bindings=[('timeout', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[ComSub (Com {[LIT_CHARS time_in_seconds]})]}} {A Atom NODE_ARITH_WORD {[VarSub P4D_TIMEOUT]}}}]})]) (Fork (While (Com {[LIT_CHARS true]}) (List (If (Com {[LIT_CHARS test]} {[ComSub (Com {[LIT_CHARS time_in_seconds]})]} {[LIT_CHARS -gt]} {[VarSub timeout]}) (List (Com {[LIT_CHARS kill]} {[LIT_CHARS -9]} {[VarSub pid]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]}) ) ) (Com {[LIT_CHARS sleep]} {[LIT_CHARS 1]}) ) ) ) (= scope= flags=0 words=[] bindings=[('watchdog_pid', {[VarSub !]})]) (= scope= flags=0 words=[] bindings=[('ready', {[SQ ]})]) (While (Com {[LIT_CHARS test]} {[VarSub i]} {[LIT_CHARS -gt]} {[LIT_CHARS 0]}) (List (If (Com {[LIT_CHARS p4]} {[LIT_CHARS info]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) (List (= scope= flags=0 words=[] bindings=[('ready', {[LIT_CHARS true]})]) (Com {[LIT_CHARS break]}) ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS kill]} {[LIT_CHARS -0]} {[VarSub pid]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS break]}) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS waiting]} {[LIT_CHARS for]} {[LIT_CHARS p4d]} {[LIT_CHARS to]} {[LIT_CHARS start]}) (Com {[LIT_CHARS sleep]} {[LIT_CHARS 1]}) (= scope= flags=0 words=[] bindings=[('i', {[ArithSub {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) ) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub ready]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (Com {[LIT_CHARS p4_add_user]} {[LIT_CHARS author]}) (AndOr OP_AND_IF (Com {[LIT_CHARS client_view]} {[DQ [LIT_CHARS "//depot/... //client/..."]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) ) (FunctionDef p4_add_user [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('name', {[VarSub 1]})]) (Com {[LIT_CHARS p4]} {[LIT_CHARS user]} {[LIT_CHARS -f]} {[LIT_CHARS -i]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "User: "][VarSub name][LIT_CHARS "\n"][LIT_CHARS "Email: "][VarSub name][LIT_CHARS "@example.com\n"][LIT_CHARS "FullName: Dr. "][VarSub name][LIT_CHARS "\n"]]} 0), > ) ) ) (FunctionDef p4_add_job [] (Com {[LIT_CHARS p4]} {[LIT_CHARS job]} {[LIT_CHARS -f]} {[LIT_CHARS -i]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "Job: "][VarSub 1][LIT_CHARS "\n"][LIT_CHARS "Status: open\n"][LIT_CHARS "User: dummy\n"][LIT_CHARS "Description:\n"]]} 0), > ) ) (FunctionDef retry_until_success [] (List (= scope= flags=0 words=[] bindings=[('timeout', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[ComSub (Com {[LIT_CHARS time_in_seconds]})]}} {A Atom NODE_ARITH_WORD {[VarSub RETRY_TIMEOUT]}}}]})]) (While (AndOr OP_OR_IF (Com {[DQ [VarSub @]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS test]} {[ComSub (Com {[LIT_CHARS time_in_seconds]})]} {[LIT_CHARS -gt]} {[VarSub timeout]}) ) (Com {[LIT_CHARS sleep]} {[LIT_CHARS 1]}) ) ) ) (FunctionDef retry_until_fail [] (List (= scope= flags=0 words=[] bindings=[('timeout', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[ComSub (Com {[LIT_CHARS time_in_seconds]})]}} {A Atom NODE_ARITH_WORD {[VarSub RETRY_TIMEOUT]}}}]})]) (While (AndOr OP_OR_IF (Pipeline! (Com {[DQ [VarSub @]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) (Com {[LIT_CHARS test]} {[ComSub (Com {[LIT_CHARS time_in_seconds]})]} {[LIT_CHARS -gt]} {[VarSub timeout]}) ) (Com {[LIT_CHARS sleep]} {[LIT_CHARS 1]}) ) ) ) (FunctionDef kill_p4d [] (List (= scope= flags=0 words=[] bindings=[('pid', {[ComSub (Com {[LIT_CHARS cat]} {[DQ [VarSub pidfile]]})]})]) (Com {[LIT_CHARS retry_until_fail]} {[LIT_CHARS kill]} {[VarSub pid]}) (Com {[LIT_CHARS retry_until_fail]} {[LIT_CHARS kill]} {[LIT_CHARS -9]} {[VarSub pid]}) (AndOr OP_AND_IF (Com {[LIT_CHARS test_must_fail]} {[LIT_CHARS kill]} {[VarSub pid]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) (AndOr OP_AND_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub db]]} {[DQ [VarSub cli]]} {[DQ [VarSub pidfile]]}) (Com {[LIT_CHARS retry_until_fail]} {[LIT_CHARS kill]} {[LIT_CHARS -9]} {[VarSub watchdog_pid]}) ) ) ) ) (FunctionDef cleanup_git [] (List (Com {[LIT_CHARS retry_until_success]} {[LIT_CHARS rm]} {[LIT_CHARS -r]} {[DQ [VarSub git]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS test_must_fail]} {[LIT_CHARS test]} {[LIT_CHARS -d]} {[DQ [VarSub git]]}) (Com {[LIT_CHARS retry_until_success]} {[LIT_CHARS mkdir]} {[DQ [VarSub git]]}) ) ) ) (FunctionDef marshal_dump [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('what', {[VarSub 1]})]) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('line', {[VarSub 2 test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS 1]}]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[DQ [VarSub TRASH_DIRECTORY][LIT_CHARS /marshal-dump.py]]} "> 1), (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "import marshal\n"][LIT_CHARS "import sys\n"][LIT_CHARS "instream = getattr(sys.stdin, 'buffer', sys.stdin)\n"][LIT_CHARS "for i in range("][VarSub line][LIT_CHARS "):\n"][LIT_CHARS " d = marshal.load(instream)\n"][LIT_CHARS "print(d[b'"][VarSub what][LIT_CHARS "'].decode('utf-8'))\n"]]} 0), > ) (Com {[DQ [VarSub PYTHON_PATH]]} {[DQ [VarSub TRASH_DIRECTORY][LIT_CHARS /marshal-dump.py]]}) ) ) ) ) (FunctionDef client_view [] (Pipeline (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS cat]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "Client: "][VarSub P4CLIENT][LIT_CHARS "\n"][LIT_CHARS "Description: "][VarSub P4CLIENT][LIT_CHARS "\n"][LIT_CHARS "Root: "][VarSub cli][LIT_CHARS "\n"][LIT_CHARS "AltRoots: "][ComSub (Com {[LIT_CHARS native_path]} {[DQ [VarSub cli]]})][LIT_CHARS "\n"][LIT_CHARS "LineEnd: unix\n"][LIT_CHARS "View:\n"]]} 0), > ) (Com {[LIT_CHARS printf]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][LIT_CHARS "%s"][\ LIT_ESCAPED_CHAR "\\n"]]} {[DQ [VarSub @]]}) ) ) (Com {[LIT_CHARS p4]} {[LIT_CHARS client]} {[LIT_CHARS -i]}) ) ) (FunctionDef is_cli_file_writeable [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('file', {[DQ [VarSub 1]]})]) (If (AndOr OP_AND_IF (Com {[LIT_CHARS test_have_prereq]} {[LIT_CHARS CYGWIN]}) (Pipeline (Com {[LIT_CHARS p4]} {[LIT_CHARS -V]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[LIT_CHARS CYGWIN]}) ) ) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('stat', {[ComSub (Com {[LIT_CHARS stat]} {[LIT_CHARS --format] [LIT_OTHER "="] [LIT_OTHER "%"] [LIT_CHARS a]} {[DQ [VarSub file]]})]})]) (Com {[LIT_CHARS test]} {[VarSub stat]} {[LIT_OTHER "="]} {[LIT_CHARS 644]}) ) (ElseTrue) (Com {[LIT_CHARS test]} {[LIT_CHARS -w]} {[DQ [VarSub file]]}) ) ) ) )