(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=[('DIRPATCHER', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub 0]]})][LIT_CHARS /dirpatcher.sh]]})]) (= scope= flags=2 words=[{[LIT_CHARS DIRPATCHER]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('GOOBSDIFF', {[DQ [ComSub (Com {[LIT_CHARS find_tool]} {[LIT_CHARS goobsdiff]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS GOOBSDIFF]}] bindings=[]) (= scope= flags=2 words=[] bindings=[('BZIP2', {[DQ [LIT_CHARS bzip2]]})]) (= scope= flags=2 words=[] bindings=[('GZIP', {[DQ [LIT_CHARS gzip]]})]) (= scope= flags=0 words=[] bindings=[('XZ', {[DQ [ComSub (Com {[LIT_CHARS find_tool]} {[LIT_CHARS xz]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS XZ]}] 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 ]})]) (Com {[LIT_OTHER ":"]} {[VarSub DIRDIFFER_EXCLUDE test_op=VS_TEST_COLON_EQUALS {}]}) (Com {[LIT_OTHER ":"]} {[VarSub DIRDIFFER_NO_DIFF test_op=VS_TEST_COLON_EQUALS {}]}) (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]}, {[LIT_CHARS g_verify_exclude]}] 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=[('new_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_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 new_file]]})]]})]) (If (Pipeline! (Com {[LIT_CHARS chmod]} {[LIT_CHARS -h]} {[DQ [VarSub mode]]} {[DQ [VarSub patch_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 17]}) ) (If (Pipeline! (DBracket {B1 UNARY_FILE_L {[DQ [VarSub patch_file]]}}) ) (If (Pipeline! (Com {[LIT_CHARS touch]} {[LIT_CHARS -r]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 18]}) ) ) ) ) (FunctionDef file_size [] (List (= scope= flags=0 words=[] bindings=[('file', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS stat]} {[LIT_CHARS -f]} {[LIT_OTHER "%"] [LIT_CHARS z]} {[DQ [VarSub file]]}) ) ) (FunctionDef make_patch_file [] (List (= scope= flags=0 words=[] bindings=[('old_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('uncompressed_file', {[DQ [VarSub patch_file][VarSub PLAIN_SUFFIX]]})]) (If (Pipeline! (Com {[LIT_CHARS cp]} {[DQ [VarSub new_file]]} {[DQ [VarSub uncompressed_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) (= scope= flags=0 words=[{[LIT_CHARS uncompressed_size]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('uncompressed_size', {[DQ [ComSub (Com {[LIT_CHARS file_size]} {[DQ [VarSub new_file]]})]]})]) (= scope= flags=0 words=[] bindings=[('keep_file', {[DQ [VarSub uncompressed_file]]})]) (= scope= flags=0 words=[] bindings=[('keep_size', {[DQ [VarSub uncompressed_size]]})]) (= scope= flags=0 words=[] bindings=[('bz2_file', {[DQ [VarSub patch_file][VarSub BZ2_SUFFIX]]})]) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub bz2_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub bz2_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (If (Pipeline! (Com {[DQ [VarSub BZIP2]]} {[LIT_CHARS -9c]} < (FilenameRedirectNode filename={[DQ [VarSub new_file]]} 0), (FilenameRedirectNode filename={[DQ [VarSub bz2_file]]} "> 1), > ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't compress "][VarSub new_file][LIT_CHARS " to "][VarSub bz2_file][LIT_CHARS " with "][VarSub BZIP2]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 12]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS bz2_size]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('bz2_size', {[DQ [ComSub (Com {[LIT_CHARS file_size]} {[DQ [VarSub bz2_file]]})]]})]) (If (DBracket {B2 BINARY_INT_GE {[DQ [VarSub bz2_size]]} {[DQ [VarSub keep_size]]}}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub bz2_file]]}) (ElseTrue) (List (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub keep_file]]}) (= scope= flags=0 words=[] bindings=[('keep_file', {[DQ [VarSub bz2_file]]})]) (= scope= flags=0 words=[] bindings=[('keep_size', {[DQ [VarSub bz2_size]]})]) ) ) (= scope= flags=0 words=[] bindings=[('gz_file', {[DQ [VarSub patch_file][VarSub GZ_SUFFIX]]})]) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub gz_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub gz_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (If (Pipeline! (Com {[DQ [VarSub GZIP]]} {[LIT_CHARS -9cn]} < (FilenameRedirectNode filename={[DQ [VarSub new_file]]} 0), (FilenameRedirectNode filename={[DQ [VarSub gz_file]]} "> 1), > ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't compress "][VarSub new_file][LIT_CHARS " to "][VarSub gz_file][LIT_CHARS " with "][VarSub GZIP]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS gz_size]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('gz_size', {[DQ [ComSub (Com {[LIT_CHARS file_size]} {[DQ [VarSub gz_file]]})]]})]) (If (DBracket {B2 BINARY_INT_GE {[DQ [VarSub gz_size]]} {[DQ [VarSub keep_size]]}}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub gz_file]]}) (ElseTrue) (List (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub keep_file]]}) (= scope= flags=0 words=[] bindings=[('keep_file', {[DQ [VarSub gz_file]]})]) (= scope= flags=0 words=[] bindings=[('keep_size', {[DQ [VarSub gz_size]]})]) ) ) (= scope= flags=0 words=[] bindings=[('xz_flags', {[Array {[DQ [LIT_CHARS -c]]}]})]) (= scope= flags=0 words=[{[LIT_CHARS file_output]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('file_output', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS file]} {[DQ [VarSub new_file]]}) (Com {[LIT_CHARS true]}) )]]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub file_output]]} {[LIT_CHARS Mach-O]}}) (= scope= flags=0 words=[] bindings=[('xz_flags+', {[Array {[DQ [LIT_CHARS --x86]]}]})]) ) (= scope= flags=0 words=[] bindings=[('xz_flags+', {[Array {[DQ [LIT_CHARS "--lzma2=preset=9e"]]}]})]) (= scope= flags=0 words=[] bindings=[('xz_file', {[DQ [VarSub patch_file][VarSub XZ_SUFFIX]]})]) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub xz_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub xz_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (If (Pipeline! (Com {[DQ [VarSub XZ]]} {[DQ [VarSub xz_flags bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]} < (FilenameRedirectNode filename={[DQ [VarSub new_file]]} 0), (FilenameRedirectNode filename={[DQ [VarSub xz_file]]} "> 1), > ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't compress "][VarSub new_file][LIT_CHARS " to "][VarSub xz_file][LIT_CHARS " with "][VarSub XZ]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 14]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS xz_size]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('xz_size', {[DQ [ComSub (Com {[LIT_CHARS file_size]} {[DQ [VarSub xz_file]]})]]})]) (If (DBracket {B2 BINARY_INT_GE {[DQ [VarSub xz_size]]} {[DQ [VarSub keep_size]]}}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub xz_file]]}) (ElseTrue) (List (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub keep_file]]}) (= scope= flags=0 words=[] bindings=[('keep_file', {[DQ [VarSub xz_file]]})]) (= scope= flags=0 words=[] bindings=[('keep_size', {[DQ [VarSub xz_size]]})]) ) ) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_FILE_f {[DQ [VarSub old_file]]}}) (AndOr OP_AND_IF (Pipeline! (DBracket {B1 UNARY_FILE_L {[DQ [VarSub old_file]]}}) ) (Pipeline! (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub new_file]]} {[VarSub DIRDIFFER_NO_DIFF]}}) ) ) ) (List (= scope= flags=0 words=[] bindings=[('gbs_file', {[DQ [VarSub patch_file][VarSub GBS_SUFFIX]]})]) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub gbs_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub gbs_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (If (Pipeline! (Com {[DQ [VarSub GOOBSDIFF]]} {[DQ [VarSub old_file]]} {[DQ [VarSub new_file]]} {[DQ [VarSub gbs_file]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't create "][VarSub gbs_file][LIT_CHARS " by comparing "][VarSub old_file][LIT_CHARS " to "][VarSub new_file]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 15]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS gbs_size]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('gbs_size', {[DQ [ComSub (Com {[LIT_CHARS file_size]} {[DQ [VarSub gbs_file]]})]]})]) (If (DBracket {B2 BINARY_INT_GE {[DQ [VarSub gbs_size]]} {[DQ [VarSub keep_size]]}}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub gbs_file]]}) (ElseTrue) (List (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub keep_file]]}) (= scope= flags=0 words=[] bindings=[('keep_file', {[DQ [VarSub gbs_file]]})]) (= scope= flags=0 words=[] bindings=[('keep_size', {[DQ [VarSub gbs_size]]})]) ) ) ) ) (Com {[LIT_CHARS copy_mode_and_time]} {[DQ [VarSub new_file]]} {[DQ [VarSub keep_file]]}) ) ) (FunctionDef make_patch_symlink [] (List (= scope= flags=0 words=[] bindings=[('new_file', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_file', {[DQ [VarSub 2]]})]) (If (Pipeline! (Com {[LIT_CHARS rsync]} {[LIT_CHARS -lt]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) (Com {[LIT_CHARS copy_mode_and_time]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) ) ) (FunctionDef make_patch_dir [] (List (= scope= flags=0 words=[] bindings=[('old_dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('new_dir', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir', {[DQ [VarSub 3]]})]) (If (Pipeline! (Com {[LIT_CHARS mkdir]} {[DQ [VarSub patch_dir]]}) ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 7]}) ) (= scope= flags=0 words=[{[LIT_CHARS new_file]}] bindings=[]) (For new_file [{[DQ [VarSub new_dir][LIT_CHARS /]] [LIT_OTHER "*"]}]) (List (= scope= flags=0 words=[] bindings=[('file', {[DQ [VarSub new_file transform_ops=[Slice {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub new_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=[('patch_file', {[DQ [VarSub patch_dir][LIT_CHARS /][VarSub file]]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub new_file]]} {[VarSub DIRDIFFER_EXCLUDE]}}) (List (= scope= flags=0 words=[] bindings=[('g_verify_exclude+', {[Array {[DQ [VarSub new_file]]}]})]) (Com {[LIT_CHARS continue]}) ) ) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub patch_file]]}}) (List (Com {[LIT_CHARS err]} {[DQ [VarSub patch_file][LIT_CHARS " already exists"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (If (DBracket {B1 UNARY_FILE_L {[DQ [VarSub new_file]]}}) (Com {[LIT_CHARS make_patch_symlink]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) (DBracket {B1 UNARY_FILE_d {[DQ [VarSub new_file]]}}) (Com {[LIT_CHARS make_patch_dir]} {[DQ [VarSub old_file]]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) (DBracket {B! {B1 UNARY_FILE_f {[DQ [VarSub new_file]]}}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "can't handle irregular file "][VarSub new_file]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 9]}) ) (ElseTrue) (Com {[LIT_CHARS make_patch_file]} {[DQ [VarSub old_file]]} {[DQ [VarSub new_file]]} {[DQ [VarSub patch_file]]}) ) ) ) (Com {[LIT_CHARS copy_mode_and_time]} {[DQ [VarSub new_dir]]} {[DQ [VarSub patch_dir]]}) ) ) (FunctionDef verify_patch_dir [] (List (= scope= flags=0 words=[] bindings=[('old_dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('new_dir', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[{[LIT_CHARS verify_temp_dir]}, {[LIT_CHARS verify_dir]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('verify_temp_dir', {[DQ [ComSub (Com {[LIT_CHARS mktemp]} {[LIT_CHARS -d]} {[LIT_CHARS -t]} {[DQ [VarSub ME]]})]]})]) (= scope= flags=0 words=[] bindings=[('g_cleanup+', {[Array {[DQ [VarSub verify_temp_dir]]}]})]) (= scope= flags=0 words=[] bindings=[('verify_dir', {[DQ [VarSub verify_temp_dir][LIT_CHARS /patched]]})]) (If (Pipeline! (Com {[DQ [VarSub DIRPATCHER]]} {[DQ [VarSub old_dir]]} {[DQ [VarSub patch_dir]]} {[DQ [VarSub verify_dir]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch application for verification failed"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 16]}) ) ) (= scope= flags=0 words=[] bindings=[('rsync_command', {[Array {[LIT_CHARS rsync]} {[LIT_CHARS -clprt]} {[LIT_CHARS --delete]} {[LIT_CHARS --out-format] [LIT_OTHER "="] [LIT_OTHER "%"] [LIT_CHARS n]} {[DQ [VarSub new_dir][LIT_CHARS /]]} {[DQ [VarSub verify_dir]]}]})]) (If (DBracket {B2 BINARY_INT_GT {[VarSub g_verify_exclude bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]} {[LIT_CHARS 0]}}) (List (= scope= flags=0 words=[{[LIT_CHARS exclude]}] bindings=[]) (For exclude [{[DQ [VarSub g_verify_exclude bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}]) (= scope= flags=0 words=[] bindings=[('rsync_command+', {[Array {[DQ [LIT_CHARS --exclude]]} {[DQ [VarSub exclude transform_ops=[Slice {A Atom NODE_ARITH_WORD {[VarSub new_dir transform_ops=[(#len)]]}} None]]]}]})]) ) ) ) (= scope= flags=0 words=[{[LIT_CHARS rsync_output]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('rsync_output', {[DQ [ComSub (Com {[DQ [VarSub rsync_command bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "rsync for verification failed"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 16]}) ) ) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub verify_temp_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 "]"]}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub rsync_output]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "verification failed"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 16]}) ) ) ) ) (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 new_dir patch_dir"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) (FunctionDef main [] (List (= scope= flags=0 words=[{[LIT_CHARS old_dir]}, {[LIT_CHARS new_dir]}, {[LIT_CHARS patch_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=[('new_dir', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 2]]})]]})]) (= scope= flags=0 words=[] bindings=[('patch_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 new_dir]]}}) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "old_dir and new_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 patch_dir]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch_dir must not exist"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 4]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS patch_dir_parent]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('patch_dir_parent', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub patch_dir]]})]]})]) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_dir_parent]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch_dir parent directory must exist and be a directory"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 5]}) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub DIRDIFFER_EXCLUDE]]}}) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ ]} {[VarSub DIRDIFFER_EXCLUDE]}}) (Com {[LIT_CHARS true]}) (DBracket {B2 BINARY_INT_EQ {[VarSub ?]} {[LIT_CHARS 2]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "DIRDIFFER_EXCLUDE contains an invalid regular expression"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 19]}) ) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub DIRDIFFER_NO_DIFF]]}}) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ ]} {[VarSub DIRDIFFER_NO_DIFF]}}) (Com {[LIT_CHARS true]}) (DBracket {B2 BINARY_INT_EQ {[VarSub ?]} {[LIT_CHARS 2]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "DIRDIFFER_NO_DIFF contains an invalid regular expression"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 19]}) ) ) ) (= scope= flags=0 words=[{[LIT_CHARS old_dir_phys]}, {[LIT_CHARS new_dir_phys]}, {[LIT_CHARS patch_dir_parent_phys]}, {[LIT_CHARS patch_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=[('new_dir_phys', {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub new_dir]]}) (Com {[LIT_CHARS pwd]} {[LIT_CHARS -P]}) )]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir_parent_phys', {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub patch_dir_parent]]}) (Com {[LIT_CHARS pwd]} {[LIT_CHARS -P]}) )]]})]) (= scope= flags=0 words=[] bindings=[('patch_dir_phys', {[DQ [VarSub patch_dir_parent_phys][LIT_CHARS /][ComSub (Com {[LIT_CHARS basename]} {[DQ [VarSub patch_dir]]})]]})]) (If (AndOr OP_OR_IF (Com {[LIT_CHARS dirs_contained]} {[DQ [VarSub old_dir_phys]]} {[DQ [VarSub new_dir_phys]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS dirs_contained]} {[DQ [VarSub old_dir_phys]]} {[DQ [VarSub patch_dir_phys]]}) (Com {[LIT_CHARS dirs_contained]} {[DQ [VarSub new_dir_phys]]} {[DQ [VarSub patch_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]}) ) ) (Com {[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 "]"] [LIT_OTHER "="] [DQ [VarSub patch_dir]]}) (Com {[LIT_CHARS make_patch_dir]} {[DQ [VarSub old_dir]]} {[DQ [VarSub new_dir]]} {[DQ [VarSub patch_dir]]}) (Com {[LIT_CHARS verify_patch_dir]} {[DQ [VarSub old_dir]]} {[DQ [VarSub new_dir]]} {[DQ [VarSub patch_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 ?]}) )