(List (FunctionDef adb_all [] (List (If (DBracket {B2 BINARY_STRING_EQUAL {[VarSub #]} {[LIT_CHARS 0]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Usage: adb_all . Quoting is optional."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Example: adb_all install Chrome.apk"]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (= scope= flags=0 words=[] bindings=[('DEVICES', {[ComSub (Com {[LIT_CHARS adb_get_devices]} {[LIT_CHARS -b]})]})]) (= scope= flags=0 words=[] bindings=[('NUM_DEVICES', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub DEVICES]}) (Com {[LIT_CHARS wc]} {[LIT_CHARS -w]}) )]})]) (If (DParen {A2 AS_OP_GREAT {A Atom NODE_ARITH_WORD {[VarSub NUM_DEVICES]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Looping over "][VarSub NUM_DEVICES][LIT_CHARS " devices"]]}) ) (Com {[LIT_CHARS _adb_multi]} {[DQ [VarSub DEVICES]]} {[DQ [VarSub *]]}) ) ) (FunctionDef adb_device_loop [] (List (If (DBracket {B2 BINARY_STRING_EQUAL {[VarSub #]} {[LIT_CHARS 0]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Intended for more complex one-liners that cannot be done with"]]} {[DQ [LIT_CHARS adb_all.]]}) (Com {[LIT_CHARS echo]} {[SQ ]} {[SQ ]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (= scope= flags=0 words=[] bindings=[('DEVICES', {[ComSub (Com {[LIT_CHARS adb_get_devices]})]})]) (If (DBracket {B1 UNARY_STRING_z {[VarSub DEVICES]}}) (Com {[LIT_CHARS return]}) ) (For DEVICE [{[VarSub DEVICES]}]) (List (= scope= flags=0 words=[] bindings=[('DEV_TYPE', {[ComSub (Pipeline (Com {[LIT_CHARS adb]} {[LIT_CHARS -s]} {[VarSub DEVICE]} {[LIT_CHARS shell]} {[LIT_CHARS getprop]} {[LIT_CHARS ro.product.device]}) (Com {[LIT_CHARS sed]} {[SQ ]}) )]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Running on "][VarSub DEVICE][LIT_CHARS " ("][VarSub DEV_TYPE][LIT_CHARS ")"]]}) (Com {[LIT_CHARS eval]} {[DQ [VarSub *]]} more_env=[('ANDROID_SERIAL', {[VarSub DEVICE]})] ) ) ) ) ) (FunctionDef wipe_all_devices [] (List (If (DBracket {B? LOGICAL_BINARY_OR {B1 UNARY_STRING_z {[ComSub (Com {[LIT_CHARS which]} {[LIT_CHARS adb]})]}} {B1 UNARY_STRING_z {[ComSub (Com {[LIT_CHARS which]} {[LIT_CHARS fastboot]})]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "aborting: adb and fastboot not in path"]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (Pipeline! (Com {[ComSub (Pipeline (Com {[LIT_CHARS groups]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[SQ ]}) )]}) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "If fastboot fails, run: 'sudo adduser "][ComSub (Com {[LIT_CHARS whoami]})][LIT_CHARS " plugdev'"]]}) ) (= scope= flags=0 words=[] bindings=[('DEVICES', {[ComSub (Com {[LIT_CHARS adb_get_devices]} {[LIT_CHARS -b]})]})]) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[VarSub 1]} {[SQ ]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "This will ERASE ALL DATA from "][ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub DEVICES]}) (Com {[LIT_CHARS wc]} {[LIT_CHARS -w]}) )][LIT_CHARS " device."]]}) (Com {[LIT_CHARS read]} {[LIT_CHARS -p]} {[DQ [LIT_CHARS "Hit enter to continue"]]}) ) ) (Com {[LIT_CHARS _adb_multi]} {[DQ [VarSub DEVICES]]} {[DQ [LIT_CHARS "reboot bootloader"]]}) (Subshell (List (For DEVICE [{[VarSub DEVICES]}]) (Fork (Com {[LIT_CHARS fastboot_erase]} {[VarSub DEVICE]}) ) ) (Com {[LIT_CHARS wait]}) ) ) (For DEVICE [{[VarSub DEVICES]}]) (Com {[LIT_CHARS fastboot]} {[LIT_CHARS -s]} {[VarSub DEVICE]} {[LIT_CHARS reboot]}) ) ) ) (FunctionDef fastboot_erase [] (List (If (DBracket {B1 UNARY_STRING_n {[VarSub 1]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Wiping "][VarSub 1]]}) (= scope= flags=0 words=[] bindings=[('SERIAL', {[DQ [LIT_CHARS "-s "][VarSub 1]]})]) ) (ElseTrue) (List (If (Com {[LIT_OTHER "["]} {[LIT_CHARS -z]} {[ComSub (Com {[LIT_CHARS fastboot]} {[LIT_CHARS devices]})]} {[LIT_OTHER "]"]}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "No devices in fastboot, aborting."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Check out wipe_all_devices to see if sufficient"]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "You can put a device in fastboot using adb reboot bootloader"]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (= scope= flags=0 words=[] bindings=[('SERIAL', {[DQ ]})]) ) ) (Com {[LIT_CHARS fastboot]} {[VarSub SERIAL]} {[LIT_CHARS erase]} {[LIT_CHARS cache]}) (Com {[LIT_CHARS fastboot]} {[VarSub SERIAL]} {[LIT_CHARS erase]} {[LIT_CHARS userdata]}) ) ) (FunctionDef adb_get_devices [] (List (= scope= flags=0 words=[] bindings=[('DEVICES', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS adb]} {[LIT_CHARS devices]}) (Com {[LIT_CHARS grep]} {[SQ ]}) )]]})]) (If (DBracket {B? LOGICAL_BINARY_AND {B1 UNARY_STRING_z {[VarSub DEVICES]}} {B2 BINARY_STRING_EQUAL {[VarSub 1]} {[SQ ]}}}) (List (Com {[LIT_CHARS echo]} {[SQ ]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (= scope= flags=0 words=[] bindings=[('DEVICES', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS adb]} {[LIT_CHARS wait-for-device]} {[LIT_CHARS devices]}) (Com {[LIT_CHARS grep]} {[SQ ]}) )]]})]) ) ) (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub DEVICES]]}) (Com {[LIT_CHARS awk]} {[LIT_CHARS -vORS] [LIT_OTHER "="] [SQ ]} {[SQ ]}) (Com {[LIT_CHARS sed]} {[SQ ]}) ) ) ) (FunctionDef _adb_multi [] (List (= scope= flags=0 words=[] bindings=[('DEVICES', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('ADB_ARGS', {[VarSub 2]})]) (Subshell (List (For DEVICE [{[VarSub DEVICES]}]) (Fork (Com {[LIT_CHARS adb]} {[LIT_CHARS -s]} {[VarSub DEVICE]} {[VarSub ADB_ARGS]}) ) ) (Com {[LIT_CHARS wait]}) ) ) ) ) )