(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=[]) (= 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=[('SCRIPT_DIR', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub 0]]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS SCRIPT_DIR]}] bindings=[]) (= scope= flags=2 words=[] bindings=[('DIRDIFFER', {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /dirdiffer.sh]]})]) (= scope= flags=2 words=[] bindings=[('PKG_DMG', {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /pkg-dmg]]})]) (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_cleanup_mount_points]}] 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_mount_points bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]]} {[LIT_CHARS 0]}}) (List (= scope= flags=0 words=[{[LIT_CHARS mount_point]}] bindings=[]) (For mount_point [{[DQ [VarSub g_cleanup_mount_points bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}]) (AndOr OP_OR_IF (Com {[LIT_CHARS hdiutil]} {[LIT_CHARS detach]} {[DQ [VarSub mount_point]]} {[LIT_CHARS -force]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) (Com {[LIT_CHARS true]}) ) ) ) ) (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 mount_dmg [] (List (= scope= flags=0 words=[] bindings=[('dmg', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('mount_point', {[DQ [VarSub 2]]})]) (If (Pipeline! (Com {[LIT_CHARS hdiutil]} {[LIT_CHARS attach]} {[DQ [VarSub 1]]} {[LIT_CHARS -mountpoint]} {[DQ [VarSub 2]]} {[LIT_CHARS -nobrowse]} {[LIT_CHARS -owners]} {[LIT_CHARS off]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) ) (Com {[LIT_CHARS return]} {[VarSub ?]}) ) ) ) (FunctionDef make_patch_fs [] (List (= scope= flags=0 words=[] bindings=[('product_name', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('old_fs', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_fs', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('patch_fs', {[DQ [VarSub 4]]})]) (= scope= flags=2 words=[] bindings=[('APP_NAME', {[DQ [VarSub product_name][LIT_CHARS .app]]})]) (= scope= flags=2 words=[] bindings=[('APP_NAME_RE', {[DQ [VarSub product_name][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS .app]]})]) (= scope= flags=2 words=[] bindings=[('APP_PLIST', {[DQ [LIT_CHARS Contents/Info]]})]) (= scope= flags=2 words=[] bindings=[('APP_VERSION_KEY', {[DQ [LIT_CHARS CFBundleShortVersionString]]})]) (= scope= flags=2 words=[] bindings=[('APP_BUNDLEID_KEY', {[DQ [LIT_CHARS CFBundleIdentifier]]})]) (= scope= flags=2 words=[] bindings=[('KS_VERSION_KEY', {[DQ [LIT_CHARS KSVersion]]})]) (= scope= flags=2 words=[] bindings=[('KS_PRODUCT_KEY', {[DQ [LIT_CHARS KSProductID]]})]) (= scope= flags=2 words=[] bindings=[('KS_CHANNEL_KEY', {[DQ [LIT_CHARS KSChannelID]]})]) (= scope= flags=2 words=[] bindings=[('VERSIONS_DIR', {[DQ [LIT_CHARS Contents/Versions]]})]) (= scope= flags=2 words=[] bindings=[('BUILD_RE', {[DQ [LIT_CHARS "^[0-9]+"][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS ".[0-9]+"][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS ".([0-9]+)"][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS ".[0-9]+"][\ LIT_ESCAPED_CHAR "\\$"]]})]) (= scope= flags=2 words=[] bindings=[('MIN_BUILD', {[LIT_CHARS 434]})]) (= scope= flags=0 words=[] bindings=[('product_url', {[DQ [LIT_CHARS "http://www.google.com/chrome/"]]})]) (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub product_name]]} {[DQ [LIT_CHARS "Google Chrome Canary"]]}}) (= scope= flags=0 words=[] bindings=[('product_url', {[DQ [LIT_CHARS "http://tools.google.com/dlpage/chromesxs"]]})]) ) (= scope= flags=0 words=[] bindings=[('old_app_path', {[DQ [VarSub old_fs][LIT_CHARS /][VarSub APP_NAME]]})]) (= scope= flags=0 words=[] bindings=[('old_app_plist', {[DQ [VarSub old_app_path][LIT_CHARS /][VarSub APP_PLIST]]})]) (= scope= flags=0 words=[{[LIT_CHARS old_app_version]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('old_app_version', {[DQ [ComSub (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub old_app_plist]]} {[DQ [VarSub APP_VERSION_KEY]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not read old app version"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) ) (If (Pipeline! (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub old_app_version]]} {[VarSub BUILD_RE]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "old app version not of expected format"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) ) (= scope= flags=0 words=[] bindings=[('old_app_version_build', {[DQ [VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}})]]})]) (= scope= flags=0 words=[{[LIT_CHARS old_app_bundleid]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('old_app_bundleid', {[DQ [ComSub (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub old_app_plist]]} {[DQ [VarSub APP_BUNDLEID_KEY]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not read old app bundle ID"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) ) (= scope= flags=0 words=[] bindings=[('old_ks_plist', {[DQ [VarSub old_app_plist]]})]) (= scope= flags=0 words=[{[LIT_CHARS old_ks_version]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('old_ks_version', {[DQ [ComSub (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub old_ks_plist]]} {[DQ [VarSub KS_VERSION_KEY]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not read old Keystone version"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) ) (= scope= flags=0 words=[] bindings=[('new_app_path', {[DQ [VarSub new_fs][LIT_CHARS /][VarSub APP_NAME]]})]) (= scope= flags=0 words=[] bindings=[('new_app_plist', {[DQ [VarSub new_app_path][LIT_CHARS /][VarSub APP_PLIST]]})]) (= scope= flags=0 words=[{[LIT_CHARS new_app_version]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('new_app_version', {[DQ [ComSub (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub new_app_plist]]} {[DQ [VarSub APP_VERSION_KEY]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not read new app version"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) ) (If (Pipeline! (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub new_app_version]]} {[VarSub BUILD_RE]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "new app version not of expected format"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) ) (= scope= flags=0 words=[] bindings=[('new_app_version_build', {[DQ [VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}})]]})]) (= scope= flags=0 words=[] bindings=[('new_ks_plist', {[DQ [VarSub new_app_plist]]})]) (= scope= flags=0 words=[{[LIT_CHARS new_ks_version]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('new_ks_version', {[DQ [ComSub (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub new_ks_plist]]} {[DQ [VarSub KS_VERSION_KEY]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not read new Keystone version"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS new_ks_product]}] bindings=[]) (If (Pipeline! (= scope= flags=0 words=[] bindings=[('new_ks_product', {[DQ [ComSub (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub new_app_plist]]} {[DQ [VarSub KS_PRODUCT_KEY]]})]]})]) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not read new Keystone product ID"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) ) (If (AndOr OP_OR_IF (DBracket {B2 BINARY_INT_LT {[VarSub old_app_version_build]} {[VarSub MIN_BUILD]}}) (DBracket {B2 BINARY_INT_LT {[VarSub new_app_version_build]} {[VarSub MIN_BUILD]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "old and new versions must be build "][VarSub MIN_BUILD][LIT_CHARS " or newer"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 12]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS new_ks_channel]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('new_ks_channel', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub new_app_plist]]} {[DQ [VarSub KS_CHANNEL_KEY]]}) (Com {[LIT_CHARS true]}) )]]})]) (= scope= flags=0 words=[{[LIT_CHARS name_extra]}] bindings=[]) (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub new_ks_channel]]} {[DQ [LIT_CHARS beta]]}}) (= scope= flags=0 words=[] bindings=[('name_extra', {[DQ [LIT_CHARS " Beta"]]})]) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub new_ks_channel]]} {[DQ [LIT_CHARS dev]]}}) (= scope= flags=0 words=[] bindings=[('name_extra', {[DQ [LIT_CHARS " Dev"]]})]) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub new_ks_channel]]} {[DQ [LIT_CHARS canary]]}}) (= scope= flags=0 words=[] bindings=[('name_extra', {[SQ ]})]) (DBracket {B1 UNARY_STRING_n {[DQ [VarSub new_ks_channel]]}}) (= scope= flags=0 words=[] bindings=[('name_extra', {[DQ [LIT_CHARS " "][VarSub new_ks_channel]]})]) ) (= scope= flags=0 words=[] bindings=[('old_versioned_dir', {[DQ [VarSub old_app_path][LIT_CHARS /][VarSub VERSIONS_DIR][LIT_CHARS /][VarSub old_app_version]]})]) (= scope= flags=0 words=[] bindings=[('new_versioned_dir', {[DQ [VarSub new_app_path][LIT_CHARS /][VarSub VERSIONS_DIR][LIT_CHARS /][VarSub new_app_version]]})]) (If (Pipeline! (Com {[LIT_CHARS cp]} {[LIT_CHARS -p]} {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /keystone_install.sh]]} {[DQ [VarSub patch_fs][LIT_CHARS /.keystone_install]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not copy .keystone_install"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) (= scope= flags=0 words=[] bindings=[('patch_dotpatch_dir', {[DQ [VarSub patch_fs][LIT_CHARS /.patch]]})]) (If (Pipeline! (Com {[LIT_CHARS mkdir]} {[DQ [VarSub patch_dotpatch_dir]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not mkdir patch_dotpatch_dir"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) (If (Pipeline! (Com {[LIT_CHARS cp]} {[LIT_CHARS -p]} {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /dirpatcher.sh]]} {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /goobspatch]]} {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /liblzma_decompress.dylib]]} {[DQ [VarSub SCRIPT_DIR][LIT_CHARS /xzdec]]} {[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not copy patching tools"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) (If (AndOr OP_OR_IF (Pipeline! (Com {[LIT_CHARS echo]} {[DQ [VarSub new_ks_product]]} < (FilenameRedirectNode filename={[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /ks_product]]} "> 1), > ) ) (AndOr OP_OR_IF (Pipeline! (Com {[LIT_CHARS echo]} {[DQ [VarSub old_app_version]]} < (FilenameRedirectNode filename={[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /old_app_version]]} "> 1), > ) ) (AndOr OP_OR_IF (Pipeline! (Com {[LIT_CHARS echo]} {[DQ [VarSub new_app_version]]} < (FilenameRedirectNode filename={[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /new_app_version]]} "> 1), > ) ) (AndOr OP_OR_IF (Pipeline! (Com {[LIT_CHARS echo]} {[DQ [VarSub old_ks_version]]} < (FilenameRedirectNode filename={[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /old_ks_version]]} "> 1), > ) ) (Pipeline! (Com {[LIT_CHARS echo]} {[DQ [VarSub new_ks_version]]} < (FilenameRedirectNode filename={[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /new_ks_version]]} "> 1), > ) ) ) ) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not write patch product or version information"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) (= scope= flags=0 words=[] bindings=[('patch_ks_channel_file', {[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /ks_channel]]})]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub new_ks_channel]]}}) (If (Pipeline! (Com {[LIT_CHARS echo]} {[DQ [VarSub new_ks_channel]]} < (FilenameRedirectNode filename={[DQ [VarSub patch_ks_channel_file]]} "> 1), > ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not write Keystone channel information"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) (ElseTrue) (If (Pipeline! (Com {[LIT_CHARS touch]} {[DQ [VarSub patch_ks_channel_file]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not write empty Keystone channel information"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) ) (= scope= flags=0 words=[] bindings=[('new_app_version_extra', {[DQ [VarSub new_app_version][VarSub name_extra]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[DQ [VarSub patch_fs][LIT_CHARS /README.txt]]} "> 1), (HereDocRedirectNode here_end='__EOF__' do_expansion=True body_word={[DQ [LIT_CHARS "This disk image contains a differential updater that can update\n"][VarSub product_name][LIT_CHARS " from version "][VarSub old_app_version][LIT_CHARS " to "][VarSub new_app_version_extra][LIT_CHARS ".\n"][LIT_CHARS "\n"][LIT_CHARS "This image is part of the auto-update system and is not independently\n"][LIT_CHARS "useful.\n"][LIT_CHARS "\n"][LIT_CHARS "To install "][VarSub product_name][LIT_CHARS ", please visit\n"][LIT_CHARS "<"][VarSub product_url][LIT_CHARS ">.\n"]]} 0), > ) (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not write README.txt"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) ) (= scope= flags=0 words=[] bindings=[('patch_versioned_dir', {[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /version_][VarSub old_app_version][LIT_CHARS _][VarSub new_app_version][LIT_CHARS .dirpatch]]})]) (If (Pipeline! (Com {[DQ [VarSub DIRDIFFER]]} {[DQ [VarSub old_versioned_dir]]} {[DQ [VarSub new_versioned_dir]]} {[DQ [VarSub patch_versioned_dir]]}) ) (List (= scope= flags=0 words=[] bindings=[('status', {[VarSub ?]})]) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not create a dirpatch for the versioned directory"]]}) (Com {[LIT_CHARS exit]} {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub status]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 20]}}}]}) ) ) (= scope= flags=1 words=[] bindings=[('DIRDIFFER_EXCLUDE', {[DQ [LIT_CHARS /][VarSub APP_NAME_RE][LIT_CHARS /Contents/Versions/]]})]) (= scope= flags=1 words=[] bindings=[('DIRDIFFER_NO_DIFF', {[DQ [LIT_CHARS /][VarSub APP_NAME_RE][LIT_CHARS /Contents/][LIT_CHARS "(CodeResources|Info"][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS ".plist|MacOS/"][VarSub product_name][LIT_CHARS "|_CodeSignature/.*)"][LIT_OTHER "$"]]})]) (= scope= flags=0 words=[] bindings=[('patch_app_dir', {[DQ [VarSub patch_dotpatch_dir][LIT_CHARS /application.dirpatch]]})]) (If (Pipeline! (Com {[DQ [VarSub DIRDIFFER]]} {[DQ [VarSub old_app_path]]} {[DQ [VarSub new_app_path]]} {[DQ [VarSub patch_app_dir]]}) ) (List (= scope= flags=0 words=[] bindings=[('status', {[VarSub ?]})]) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not create a dirpatch for the application directory"]]}) (Com {[LIT_CHARS exit]} {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub status]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 40]}}}]}) ) ) (Com {[LIT_CHARS unset]} {[LIT_CHARS DIRDIFFER_EXCLUDE]} {[LIT_CHARS DIRDIFFER_NO_DIFF]}) (Com {[LIT_CHARS echo]} {[DQ [VarSub product_name][LIT_CHARS " "][VarSub old_app_version][LIT_CHARS -][VarSub new_app_version_extra][LIT_CHARS " Update"]]}) ) ) (FunctionDef package_patch_dmg [] (List (= scope= flags=0 words=[] bindings=[('patch_fs', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('patch_dmg', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('volume_name', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('temp_dir', {[DQ [VarSub 4]]})]) (If (Pipeline! (Com {[DQ [VarSub PKG_DMG]]} {[LIT_CHARS --verbosity]} {[LIT_CHARS 0]} {[LIT_CHARS --source]} {[DQ [VarSub patch_fs]]} {[LIT_CHARS --target]} {[DQ [VarSub patch_dmg]]} {[LIT_CHARS --tempdir]} {[DQ [VarSub temp_dir]]} {[LIT_CHARS --format]} {[LIT_CHARS UDZO]} {[LIT_CHARS --volname]} {[DQ [VarSub volume_name]]} {[LIT_CHARS --config]} {[DQ [LIT_CHARS "openfolder_bless=0"]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "disk image creation failed"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 9]}) ) ) ) ) (FunctionDef make_patch_dmg [] (List (= scope= flags=0 words=[] bindings=[('product_name', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('old_dmg', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('new_dmg', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('patch_dmg', {[DQ [VarSub 4]]})]) (= scope= flags=0 words=[{[LIT_CHARS temp_dir]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('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 temp_dir]]}]})]) (= scope= flags=0 words=[] bindings=[('old_mount_point', {[DQ [VarSub temp_dir][LIT_CHARS /old]]})]) (= scope= flags=0 words=[] bindings=[('g_cleanup_mount_points+', {[Array {[DQ [VarSub old_mount_point]]}]})]) (If (Pipeline! (Com {[LIT_CHARS mount_dmg]} {[DQ [VarSub old_dmg]]} {[DQ [VarSub old_mount_point]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not mount old_dmg "][VarSub old_dmg]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) ) (= scope= flags=0 words=[] bindings=[('new_mount_point', {[DQ [VarSub temp_dir][LIT_CHARS /new]]})]) (= scope= flags=0 words=[] bindings=[('g_cleanup_mount_points+', {[Array {[DQ [VarSub new_mount_point]]}]})]) (If (Pipeline! (Com {[LIT_CHARS mount_dmg]} {[DQ [VarSub new_dmg]]} {[DQ [VarSub new_mount_point]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not mount new_dmg "][VarSub new_dmg]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 7]}) ) ) (= scope= flags=0 words=[] bindings=[('patch_fs', {[DQ [VarSub temp_dir][LIT_CHARS /patch]]})]) (If (Pipeline! (Com {[LIT_CHARS mkdir]} {[DQ [VarSub patch_fs]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "could not mkdir patch_fs "][VarSub patch_fs]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS volume_name]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('volume_name', {[DQ [ComSub (Com {[LIT_CHARS make_patch_fs]} {[DQ [VarSub product_name]]} {[DQ [VarSub old_mount_point]]} {[DQ [VarSub new_mount_point]]} {[DQ [VarSub patch_fs]]})]]})]) (Com {[LIT_CHARS hdiutil]} {[LIT_CHARS detach]} {[DQ [VarSub new_mount_point]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS unset]} {[LIT_CHARS g_cleanup_mount_points] [LIT_OTHER "["] [VarSub g_cleanup_mount_points bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]] [LIT_OTHER "]"]}) (Com {[LIT_CHARS hdiutil]} {[LIT_CHARS detach]} {[DQ [VarSub old_mount_point]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS unset]} {[LIT_CHARS g_cleanup_mount_points] [LIT_OTHER "["] [VarSub g_cleanup_mount_points bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]] [LIT_OTHER "]"]}) (Com {[LIT_CHARS package_patch_dmg]} {[DQ [VarSub patch_fs]]} {[DQ [VarSub patch_dmg]]} {[DQ [VarSub volume_name]]} {[DQ [VarSub temp_dir]]}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub 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 "]"]}) ) ) (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 usage [] (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "usage: "][VarSub ME][LIT_CHARS " product_name old_dmg new_dmg patch_dmg"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) (FunctionDef main [] (List (= scope= flags=0 words=[{[LIT_CHARS product_name]}, {[LIT_CHARS old_dmg]}, {[LIT_CHARS new_dmg]}, {[LIT_CHARS patch_dmg]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('product_name', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('old_dmg', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 2]]})]]})]) (= scope= flags=0 words=[] bindings=[('new_dmg', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 3]]})]]})]) (= scope= flags=0 words=[] bindings=[('patch_dmg', {[DQ [ComSub (Com {[LIT_CHARS shell_safe_path]} {[DQ [VarSub 4]]})]]})]) (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_f {[DQ [VarSub old_dmg]]}}) ) (Pipeline! (DBracket {B1 UNARY_FILE_f {[DQ [VarSub new_dmg]]}}) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "old_dmg and new_dmg must exist and be files"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 3]}) ) ) (If (DBracket {B1 UNARY_FILE_e {[DQ [VarSub patch_dmg]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch_dmg must not exist"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 4]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS patch_dmg_parent]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('patch_dmg_parent', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub patch_dmg]]})]]})]) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_dmg_parent]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch_dmg parent directory must exist and be a directory"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 5]}) ) ) (Com {[LIT_CHARS make_patch_dmg]} {[DQ [VarSub product_name]]} {[DQ [VarSub old_dmg]]} {[DQ [VarSub new_dmg]]} {[DQ [VarSub patch_dmg]]}) (Com {[LIT_CHARS trap]} {[LIT_CHARS -]} {[LIT_CHARS EXIT]}) ) ) (If (DBracket {B2 BINARY_INT_NE {[VarSub #]} {[LIT_CHARS 4]}}) (List (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS main]} {[DQ [VarSub @]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) )