(List (Com {[LIT_CHARS set]} {[LIT_CHARS -eu]}) (= scope= flags=1 words=[] bindings=[('PATH', {[DQ [LIT_CHARS "/usr/bin:/bin:/usr/sbin:/sbin"]]})]) (Com {[LIT_CHARS unset]} {[LIT_CHARS BASH_ENV]} {[LIT_CHARS CDPATH]} {[LIT_CHARS ENV]} {[LIT_CHARS GLOBIGNORE]} {[LIT_CHARS IFS]} {[LIT_CHARS POSIXLY_CORRECT]}) (= scope= flags=1 words=[{[LIT_CHARS -n]}, {[LIT_CHARS SHELLOPTS]}] bindings=[]) (Com {[LIT_CHARS shopt]} {[LIT_CHARS -s]} {[LIT_CHARS dotglob]} {[LIT_CHARS nullglob]}) (FunctionDef find_tool [] (List (= scope= flags=0 words=[] bindings=[('tool_name', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[{[LIT_CHARS script_dir]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('script_dir', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub 0]]})]]})]) (= scope= flags=0 words=[] bindings=[('tool', {[DQ [VarSub script_dir][LIT_CHARS /][VarSub tool_name]]})]) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_FILE_f {[DQ [VarSub tool]]}}) (DBracket {B1 UNARY_FILE_x {[DQ [VarSub tool]]}}) ) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub tool]]}) (Com {[LIT_CHARS return]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS script_dir_phys]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('script_dir_phys', {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub script_dir]]}) (Com {[LIT_CHARS pwd]} {[LIT_CHARS -P]}) )]]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub script_dir_phys]]} {[LIT_OTHER "^"] [LIT_CHARS "("] [LIT_CHARS .] [LIT_OTHER "*"] [LIT_CHARS ")"] [LIT_CHARS /src/chrome/installer/mac] [LIT_OTHER "$"]}}) (List (= scope= flags=0 words=[] bindings=[('tool', {[DQ [VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}})][LIT_CHARS /src/out/Release/][VarSub tool_name]]})]) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_FILE_f {[DQ [VarSub tool]]}}) (DBracket {B1 UNARY_FILE_x {[DQ [VarSub tool]]}}) ) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub tool]]}) (Com {[LIT_CHARS return]}) ) ) (= scope= flags=0 words=[] bindings=[('tool', {[DQ [VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}})][LIT_CHARS /src/out/Debug/][VarSub tool_name]]})]) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_FILE_f {[DQ [VarSub tool]]}}) (DBracket {B1 UNARY_FILE_x {[DQ [VarSub tool]]}}) ) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub tool]]}) (Com {[LIT_CHARS return]}) ) ) ) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub tool_name]]}) ) ) (= scope= flags=0 words=[] bindings=[('ME', {[DQ [ComSub (Com {[LIT_CHARS basename]} {[DQ [VarSub 0]]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS ME]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('GOOBSPATCH', {[DQ [ComSub (Com {[LIT_CHARS find_tool]} {[LIT_CHARS goobspatch]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS GOOBSPATCH]}] bindings=[]) (= scope= flags=2 words=[] bindings=[('BUNZIP2', {[DQ [LIT_CHARS bunzip2]]})]) (= scope= flags=2 words=[] bindings=[('GUNZIP', {[DQ [LIT_CHARS gunzip]]})]) (= scope= flags=0 words=[] bindings=[('XZDEC', {[DQ [ComSub (Com {[LIT_CHARS find_tool]} {[LIT_CHARS xzdec]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS XZDEC]}] bindings=[]) (= scope= flags=2 words=[] bindings=[('GBS_SUFFIX', {[SQ ]})]) (= scope= flags=2 words=[] bindings=[('BZ2_SUFFIX', {[SQ ]})]) (= scope= flags=2 words=[] bindings=[('GZ_SUFFIX', {[SQ ]})]) (= scope= flags=2 words=[] bindings=[('XZ_SUFFIX', {[SQ ]})]) (= scope= flags=2 words=[] bindings=[('PLAIN_SUFFIX', {[SQ ]})]) (FunctionDef err [] (List (= scope= flags=0 words=[] bindings=[('error', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS echo]} {[DQ [VarSub ME][LIT_CHARS ": "][VarSub error]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) ) (= scope= flags=0 words=[{[LIT_CHARS -a]}, {[LIT_CHARS g_cleanup]}] bindings=[]) (FunctionDef cleanup [] (List (= scope= flags=0 words=[] bindings=[('status', {[VarSub ?]})]) (Com {[LIT_CHARS trap]} {[LIT_CHARS -]} {[LIT_CHARS EXIT]}) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS HUP]} {[LIT_CHARS INT]} {[LIT_CHARS QUIT]} {[LIT_CHARS TERM]}) (If (DBracket {B2 BINARY_INT_GE {[VarSub status]} {[LIT_CHARS 128]}}) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "Caught signal "][ArithSub {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub status]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 128]}}}]]}) ) (If (DBracket {B2 BINARY_INT_GT {[DQ [VarSub g_cleanup bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub g_cleanup bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}) ) (Com {[LIT_CHARS exit]} {[VarSub status]}) ) ) (FunctionDef copy_mode_and_time [] (List (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[{[LIT_CHARS mode]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('mode', {[DQ [ComSub (Com {[LIT_CHARS stat]} {[DQ [LIT_CHARS "-f%OMp%OLp"]]} {[DQ [VarSub patch_file]]})]]})]) (If (Pipeline! (Com {[LIT_CHARS chmod]} {[LIT_CHARS -h]} {[DQ [VarSub mode]]} {[DQ [VarSub new_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 16]}) ) (If (Pipeline! (DBracket {B1 UNARY_FILE_L {[DQ [VarSub new_file]]}}) ) (If (Pipeline! (Com {[LIT_CHARS touch]} {[LIT_CHARS -r]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 17]}) ) ) ) ) (FunctionDef apply_patch [] (List (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('patcher', {[DQ [VarSub 4]]})]) (If (AndOr OP_OR_IF (DBracket {B1 UNARY_FILE_L {[DQ [VarSub old_file]]}}) (Pipeline! (DBracket {B1 UNARY_FILE_f {[DQ [VarSub old_file]]}}) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "can't patch nonexistent or irregular file "][VarSub old_file]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 12]}) ) ) (If (Pipeline! (Com {[DQ [VarSub patcher]]} {[DQ [VarSub old_file]]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't create "][VarSub new_file][LIT_CHARS " by applying "][VarSub patch_file][LIT_CHARS " to "][VarSub old_file]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) ) ) (FunctionDef decompress_file [] (List (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('decompressor', {[DQ [VarSub 4]]})]) (If (Pipeline! (Com {[DQ [VarSub decompressor]]} {[LIT_CHARS -c]} < (FilenameRedirectNode filename={[DQ [VarSub patch_file]]} 0), (FilenameRedirectNode filename={[DQ [VarSub new_file]]} "> 1), > ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't decompress "][VarSub patch_file][LIT_CHARS " to "][VarSub new_file][LIT_CHARS " with "][VarSub decompressor]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 14]}) ) ) ) ) (FunctionDef copy_file [] (List (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('extra', {[DQ [VarSub 4]]})]) (If (Pipeline! (Com {[LIT_CHARS cp]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 15]}) ) ) ) (FunctionDef patch_file [] (List (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[{[LIT_CHARS operation]}, {[LIT_CHARS extra]}, {[LIT_CHARS strip_length]}] bindings=[]) (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub patch_file transform_ops=[Slice {A1 NODE_UNARY_MINUS {A Atom NODE_ARITH_WORD {[VarSub GBS_SUFFIX transform_ops=[(#len)]]}} } None]]]} {[DQ [VarSub GBS_SUFFIX]]}}) (List (= scope= flags=0 words=[] bindings=[('operation', {[DQ [LIT_CHARS apply_patch]]})]) (= scope= flags=0 words=[] bindings=[('extra', {[DQ [VarSub GOOBSPATCH]]})]) (= scope= flags=0 words=[] bindings=[('strip_length', {[VarSub GBS_SUFFIX transform_ops=[(#len)]]})]) ) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub patch_file transform_ops=[Slice {A1 NODE_UNARY_MINUS {A Atom NODE_ARITH_WORD {[VarSub BZ2_SUFFIX transform_ops=[(#len)]]}} } None]]]} {[DQ [VarSub BZ2_SUFFIX]]}}) (List (= scope= flags=0 words=[] bindings=[('operation', {[DQ [LIT_CHARS decompress_file]]})]) (= scope= flags=0 words=[] bindings=[('extra', {[DQ [VarSub BUNZIP2]]})]) (= scope= flags=0 words=[] bindings=[('strip_length', {[VarSub BZ2_SUFFIX transform_ops=[(#len)]]})]) ) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub patch_file transform_ops=[Slice {A1 NODE_UNARY_MINUS {A Atom NODE_ARITH_WORD {[VarSub GZ_SUFFIX transform_ops=[(#len)]]}} } None]]]} {[DQ [VarSub GZ_SUFFIX]]}}) (List (= scope= flags=0 words=[] bindings=[('operation', {[DQ [LIT_CHARS decompress_file]]})]) (= scope= flags=0 words=[] bindings=[('extra', {[DQ [VarSub GUNZIP]]})]) (= scope= flags=0 words=[] bindings=[('strip_length', {[VarSub GZ_SUFFIX transform_ops=[(#len)]]})]) ) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub patch_file transform_ops=[Slice {A1 NODE_UNARY_MINUS {A Atom NODE_ARITH_WORD {[VarSub XZ_SUFFIX transform_ops=[(#len)]]}} } None]]]} {[DQ [VarSub XZ_SUFFIX]]}}) (List (= scope= flags=0 words=[] bindings=[('operation', {[DQ [LIT_CHARS decompress_file]]})]) (= scope= flags=0 words=[] bindings=[('extra', {[DQ [VarSub XZDEC]]})]) (= scope= flags=0 words=[] bindings=[('strip_length', {[VarSub XZ_SUFFIX transform_ops=[(#len)]]})]) ) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub patch_file transform_ops=[Slice {A1 NODE_UNARY_MINUS {A Atom NODE_ARITH_WORD {[VarSub PLAIN_SUFFIX transform_ops=[(#len)]]}} } None]]]} {[DQ [VarSub PLAIN_SUFFIX]]}}) (List (= scope= flags=0 words=[] bindings=[('operation', {[DQ [LIT_CHARS copy_file]]})]) (= scope= flags=0 words=[] bindings=[('extra', {[DQ [LIT_CHARS patch]]})]) (= scope= flags=0 words=[] bindings=[('strip_length', {[VarSub PLAIN_SUFFIX transform_ops=[(#len)]]})]) ) (ElseTrue) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "don't know how to operate on "][VarSub patch_file]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) ) (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub old_file transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub old_file transform_ops=[(#len)]]}} {A Atom NODE_ARITH_WORD {[VarSub strip_length]}}}]]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub new_file transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub new_file transform_ops=[(#len)]]}} {A Atom NODE_ARITH_WORD {[VarSub strip_length]}}}]]]})]) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub new_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub new_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (Com {[DQ [VarSub operation]]} {[DQ [VarSub old_file]]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]} {[DQ [VarSub extra]]}) (Com {[LIT_CHARS copy_mode_and_time]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) ) ) (FunctionDef patch_symlink [] (List (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 2]]})]) (If (Pipeline! (Com {[LIT_CHARS rsync]} {[LIT_CHARS -lt]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) (Com {[LIT_CHARS copy_mode_and_time]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) ) ) (FunctionDef patch_dir [] (List (= scope= flags=0 words=[] bindings=[('old_dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_dir', {[DQ [VarSub 3]]})]) (If (Pipeline! (Com {[LIT_CHARS mkdir]} {[DQ [VarSub new_dir]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 7]}) ) (= scope= flags=0 words=[{[LIT_CHARS patch_file]}] bindings=[]) (For patch_file [{[DQ [VarSub patch_dir][LIT_CHARS /]] [LIT_OTHER "*"]}]) (List (= scope= flags=0 words=[] bindings=[('file', {[DQ [VarSub patch_file transform_ops=[Slice {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub patch_dir transform_ops=[(#len)]]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}} None]]]})]) (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub old_dir][LIT_CHARS /][VarSub file]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub new_dir][LIT_CHARS /][VarSub file]]})]) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub new_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub new_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (If (DBracket {B1 UNARY_FILE_L {[DQ [VarSub patch_file]]}}) (Com {[LIT_CHARS patch_symlink]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_file]]}}) (Com {[LIT_CHARS patch_dir]} {[DQ [VarSub old_file]]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) (Pipeline! (DBracket {B1 UNARY_FILE_f {[DQ [VarSub patch_file]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "can't handle irregular file "][VarSub patch_file]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 9]}) ) (ElseTrue) (Com {[LIT_CHARS patch_file]} {[DQ [VarSub old_file]]} {[DQ [VarSub patch_file]]} {[DQ [VarSub new_file]]}) ) ) ) (Com {[LIT_CHARS copy_mode_and_time]} {[DQ [VarSub patch_dir]]} {[DQ [VarSub new_dir]]}) ) ) (FunctionDef shell_safe_path [] (List (= scope= flags=0 words=[] bindings=[('path', {[DQ [VarSub 1]]})]) (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub path transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS -]]}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS ./][VarSub path]]}) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [VarSub path]]}) ) ) ) (FunctionDef dirs_contained [] (List (= scope= flags=0 words=[] bindings=[('dir1', {[DQ [VarSub 1][LIT_CHARS /]]})]) (= scope= flags=0 words=[] bindings=[('dir2', {[DQ [VarSub 2][LIT_CHARS /]]})]) (If (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub dir1 transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[VarSub dir2 transform_ops=[(#len)]]}}]]]} {[DQ [VarSub dir2]]}}) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub dir2 transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[VarSub dir1 transform_ops=[(#len)]]}}]]]} {[DQ [VarSub dir1]]}}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (FunctionDef usage [] (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "usage: "][VarSub ME][LIT_CHARS " old_dir patch_dir new_dir"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) (FunctionDef main [] (List (= scope= flags=0 words=[{[LIT_CHARS old_dir]}, {[LIT_CHARS patch_dir]}, {[LIT_CHARS new_dir]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('old_dir', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 1]]})]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 2]]})]]})]) (= scope= flags=0 words=[] bindings=[('new_dir', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 3]]})]]})]) (Com {[LIT_CHARS trap]} {[LIT_CHARS cleanup]} {[LIT_CHARS EXIT]} {[LIT_CHARS HUP]} {[LIT_CHARS INT]} {[LIT_CHARS QUIT]} {[LIT_CHARS TERM]}) (If (AndOr OP_OR_IF (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub old_dir]]}}) ) (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_dir]]}}) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "old_dir and patch_dir must exist and be directories"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 3]}) ) ) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub new_dir]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "new_dir must not exist"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 4]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS new_dir_parent]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('new_dir_parent', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub new_dir]]})]]})]) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub new_dir_parent]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "new_dir parent directory must exist and be a directory"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 5]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS old_dir_phys]}, {[LIT_CHARS patch_dir_phys]}, {[LIT_CHARS new_dir_parent_phys]}, {[LIT_CHARS new_dir_phys]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('old_dir_phys', {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub old_dir]]}) (Com {[LIT_CHARS pwd]} {[LIT_CHARS -P]}) )]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir_phys', {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub patch_dir]]}) (Com {[LIT_CHARS pwd]} {[LIT_CHARS -P]}) )]]})]) (= scope= flags=0 words=[] bindings=[('new_dir_parent_phys', {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub new_dir_parent]]}) (Com {[LIT_CHARS pwd]} {[LIT_CHARS -P]}) )]]})]) (= scope= flags=0 words=[] bindings=[('new_dir_phys', {[DQ [VarSub new_dir_parent_phys][LIT_CHARS /][ComSub (Com {[LIT_CHARS basename]} {[DQ [VarSub new_dir]]})]]})]) (If (AndOr OP_OR_IF (Com {[LIT_CHARS dirs_contained]} {[DQ [VarSub old_dir_phys]]} {[DQ [VarSub patch_dir_phys]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS dirs_contained]} {[DQ [VarSub old_dir_phys]]} {[DQ [VarSub new_dir_phys]]}) (Com {[LIT_CHARS dirs_contained]} {[DQ [VarSub patch_dir_phys]]} {[DQ [VarSub new_dir_phys]]}) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "directories must not contain one another"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) ) (= scope= flags=0 words=[] bindings=[('g_cleanup+', {[Array {[DQ [VarSub new_dir]]}]})]) (Com {[LIT_CHARS patch_dir]} {[DQ [VarSub old_dir]]} {[DQ [VarSub patch_dir]]} {[DQ [VarSub new_dir]]}) (Com {[LIT_CHARS unset]} {[LIT_CHARS g_cleanup] [LIT_OTHER "["] [VarSub g_cleanup bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]] [LIT_OTHER "]"]}) (Com {[LIT_CHARS trap]} {[LIT_CHARS -]} {[LIT_CHARS EXIT]}) ) ) (If (DBracket {B2 BINARY_INT_NE {[VarSub #]} {[LIT_CHARS 3]}}) (List (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS main]} {[DQ [VarSub @]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) )