xref: /aosp_15_r20/external/google-breakpad/android/common-functions.sh (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle# Copyright 2012 Google LLC
2*9712c20fSFrederick Mayle#
3*9712c20fSFrederick Mayle# Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle# modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle# met:
6*9712c20fSFrederick Mayle#
7*9712c20fSFrederick Mayle#     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle# notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle#     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle# copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle# in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle# distribution.
13*9712c20fSFrederick Mayle#     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle# contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle# this software without specific prior written permission.
16*9712c20fSFrederick Mayle#
17*9712c20fSFrederick Mayle# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle
29*9712c20fSFrederick Mayle# Collection of common shell functions for 'run-checks.sh' et 'test-shell.sh'
30*9712c20fSFrederick Mayle
31*9712c20fSFrederick Mayle# All internal variables and functions use an underscore as a prefix
32*9712c20fSFrederick Mayle# (e.g. _VERBOSE, _ALL_CLEANUPS, etc..).
33*9712c20fSFrederick Mayle
34*9712c20fSFrederick Mayle# Sanitize the environment
35*9712c20fSFrederick Mayleexport LANG=C
36*9712c20fSFrederick Mayleexport LC_ALL=C
37*9712c20fSFrederick Mayle
38*9712c20fSFrederick Mayleif [ "$BASH_VERSION" ]; then
39*9712c20fSFrederick Mayle  set -o posix
40*9712c20fSFrederick Maylefi
41*9712c20fSFrederick Mayle
42*9712c20fSFrederick Mayle# Utility functions
43*9712c20fSFrederick Mayle
44*9712c20fSFrederick Mayle_ALL_CLEANUPS=
45*9712c20fSFrederick Mayle
46*9712c20fSFrederick Mayle# Register a function to be called when the script exits, even in case of
47*9712c20fSFrederick Mayle# Ctrl-C, logout, etc.
48*9712c20fSFrederick Mayle# $1: function name.
49*9712c20fSFrederick Mayleatexit () {
50*9712c20fSFrederick Mayle  if [ -z "$_ALL_CLEANUPS" ]; then
51*9712c20fSFrederick Mayle    _ALL_CLEANUPS=$1
52*9712c20fSFrederick Mayle    # Ensure a clean exit when the script is:
53*9712c20fSFrederick Mayle    #  - Exiting normally (EXIT)
54*9712c20fSFrederick Mayle    #  - Interrupted by Ctrl-C (INT)
55*9712c20fSFrederick Mayle    #  - Interrupted by log out (HUP)
56*9712c20fSFrederick Mayle    #  - Being asked to quit nicely (TERM)
57*9712c20fSFrederick Mayle    #  - Being asked to quit and dump core (QUIT)
58*9712c20fSFrederick Mayle    trap "_exit_cleanups \$?" EXIT INT HUP QUIT TERM
59*9712c20fSFrederick Mayle  else
60*9712c20fSFrederick Mayle    _ALL_CLEANUPS="$_ALL_CLEANUPS $1"
61*9712c20fSFrederick Mayle  fi
62*9712c20fSFrederick Mayle}
63*9712c20fSFrederick Mayle
64*9712c20fSFrederick Mayle# Called on exit if at least one function was registered with atexit
65*9712c20fSFrederick Mayle# $1: final exit status code
66*9712c20fSFrederick Mayle_exit_cleanups () {
67*9712c20fSFrederick Mayle  local CLEANUP CLEANUPS
68*9712c20fSFrederick Mayle  # Ignore calls to atexit during cleanups
69*9712c20fSFrederick Mayle  CLEANUPS=$_ALL_CLEANUPS
70*9712c20fSFrederick Mayle  _ALL_CLEANUPS=
71*9712c20fSFrederick Mayle  for CLEANUP in $CLEANUPS; do
72*9712c20fSFrederick Mayle    ($CLEANUP)
73*9712c20fSFrederick Mayle  done
74*9712c20fSFrederick Mayle  exit "$@"
75*9712c20fSFrederick Mayle}
76*9712c20fSFrederick Mayle
77*9712c20fSFrederick Mayle
78*9712c20fSFrederick Mayle
79*9712c20fSFrederick Mayle
80*9712c20fSFrederick Mayle# Dump a panic message then exit.
81*9712c20fSFrederick Mayle# $1+: message
82*9712c20fSFrederick Maylepanic () {
83*9712c20fSFrederick Mayle  echo "ERROR: $@" >&2
84*9712c20fSFrederick Mayle  exit 1
85*9712c20fSFrederick Mayle}
86*9712c20fSFrederick Mayle
87*9712c20fSFrederick Mayle# If the previous command failed, dump a panic message then exit.
88*9712c20fSFrederick Mayle# $1+: message.
89*9712c20fSFrederick Maylefail_panic () {
90*9712c20fSFrederick Mayle  if [ $? != 0 ]; then
91*9712c20fSFrederick Mayle    panic "$@"
92*9712c20fSFrederick Mayle  fi;
93*9712c20fSFrederick Mayle}
94*9712c20fSFrederick Mayle
95*9712c20fSFrederick Mayle_VERBOSE=0
96*9712c20fSFrederick Mayle
97*9712c20fSFrederick Mayle# Increase verbosity for dump/log/run/run2 functions
98*9712c20fSFrederick Mayleincrease_verbosity () {
99*9712c20fSFrederick Mayle  _VERBOSE=$(( $_VERBOSE + 1 ))
100*9712c20fSFrederick Mayle}
101*9712c20fSFrederick Mayle
102*9712c20fSFrederick Mayle# Decrease verbosity
103*9712c20fSFrederick Mayledecrease_verbosity () {
104*9712c20fSFrederick Mayle  _VERBOSE=$(( $_VERBOSE - 1 ))
105*9712c20fSFrederick Mayle}
106*9712c20fSFrederick Mayle
107*9712c20fSFrederick Mayle# Returns success iff verbosity level is higher than a specific value
108*9712c20fSFrederick Mayle# $1: verbosity level
109*9712c20fSFrederick Mayleverbosity_is_higher_than () {
110*9712c20fSFrederick Mayle  [ "$_VERBOSE" -gt "$1" ]
111*9712c20fSFrederick Mayle}
112*9712c20fSFrederick Mayle
113*9712c20fSFrederick Mayle# Returns success iff verbosity level is lower than a specific value
114*9712c20fSFrederick Mayle# $1: verbosity level
115*9712c20fSFrederick Mayleverbosity_is_lower_than () {
116*9712c20fSFrederick Mayle  [ "$_VERBOSE" -le "$1" ]
117*9712c20fSFrederick Mayle}
118*9712c20fSFrederick Mayle
119*9712c20fSFrederick Mayle# Dump message to stdout, unless verbosity is < 0, i.e. --quiet was called
120*9712c20fSFrederick Mayle# $1+: message
121*9712c20fSFrederick Mayledump () {
122*9712c20fSFrederick Mayle  if [ "$_VERBOSE" -ge 0 ]; then
123*9712c20fSFrederick Mayle    printf "%s\n" "$*"
124*9712c20fSFrederick Mayle  fi
125*9712c20fSFrederick Mayle}
126*9712c20fSFrederick Mayle
127*9712c20fSFrederick Mayle# If --verbose was used, dump a message to stdout.
128*9712c20fSFrederick Mayle# $1+: message
129*9712c20fSFrederick Maylelog () {
130*9712c20fSFrederick Mayle  if [ "$_VERBOSE" -ge 1 ]; then
131*9712c20fSFrederick Mayle    printf "%s\n" "$*"
132*9712c20fSFrederick Mayle  fi
133*9712c20fSFrederick Mayle}
134*9712c20fSFrederick Mayle
135*9712c20fSFrederick Mayle_RUN_LOG=
136*9712c20fSFrederick Mayle
137*9712c20fSFrederick Mayle# Set a run log file that can be used to collect the output of commands that
138*9712c20fSFrederick Mayle# are not displayed.
139*9712c20fSFrederick Mayleset_run_log () {
140*9712c20fSFrederick Mayle  _RUN_LOG=$1
141*9712c20fSFrederick Mayle}
142*9712c20fSFrederick Mayle
143*9712c20fSFrederick Mayle# Run a command. Output depends on $_VERBOSE:
144*9712c20fSFrederick Mayle#   $_VERBOSE <= 0:  Run command, store output into the run log
145*9712c20fSFrederick Mayle#   $_VERBOSE >= 1:  Dump command, run it, output goest to stdout
146*9712c20fSFrederick Mayle# Note: Ideally, the command's output would go to the run log for $_VERBOSE >= 1
147*9712c20fSFrederick Mayle#       but the 'tee' tool doesn't preserve the status code of its input pipe
148*9712c20fSFrederick Mayle#       in case of error.
149*9712c20fSFrederick Maylerun () {
150*9712c20fSFrederick Mayle  local LOGILE
151*9712c20fSFrederick Mayle  if [ "$_RUN_LOG" ]; then
152*9712c20fSFrederick Mayle    LOGFILE=$_RUN_LOG
153*9712c20fSFrederick Mayle  else
154*9712c20fSFrederick Mayle    LOGFILE=/dev/null
155*9712c20fSFrederick Mayle  fi
156*9712c20fSFrederick Mayle
157*9712c20fSFrederick Mayle  if [ "$_VERBOSE" -ge 1 ]; then
158*9712c20fSFrederick Mayle    echo "COMMAND: $@"
159*9712c20fSFrederick Mayle    "$@"
160*9712c20fSFrederick Mayle  else
161*9712c20fSFrederick Mayle    "$@" >>$LOGFILE 2>&1
162*9712c20fSFrederick Mayle  fi
163*9712c20fSFrederick Mayle}
164*9712c20fSFrederick Mayle
165*9712c20fSFrederick Mayle# Same as run(), but only dump command output for $_VERBOSE >= 2
166*9712c20fSFrederick Maylerun2 () {
167*9712c20fSFrederick Mayle  local LOGILE
168*9712c20fSFrederick Mayle  if [ "$_RUN_LOG" ]; then
169*9712c20fSFrederick Mayle    LOGFILE=$_RUN_LOG
170*9712c20fSFrederick Mayle  else
171*9712c20fSFrederick Mayle    LOGFILE=/dev/null
172*9712c20fSFrederick Mayle  fi
173*9712c20fSFrederick Mayle
174*9712c20fSFrederick Mayle  if [ "$_VERBOSE" -ge 1 ]; then
175*9712c20fSFrederick Mayle    echo "COMMAND: $@"
176*9712c20fSFrederick Mayle  fi
177*9712c20fSFrederick Mayle  if [ "$_VERBOSE" -ge 2 ]; then
178*9712c20fSFrederick Mayle    "$@"
179*9712c20fSFrederick Mayle  else
180*9712c20fSFrederick Mayle    "$@" >>$LOGFILE 2>&1
181*9712c20fSFrederick Mayle  fi
182*9712c20fSFrederick Mayle}
183*9712c20fSFrederick Mayle
184*9712c20fSFrederick Mayle# Extract number of cores to speed up the builds
185*9712c20fSFrederick Mayle# Out: number of CPU cores
186*9712c20fSFrederick Mayleget_core_count () {
187*9712c20fSFrederick Mayle  case $(uname -s) in
188*9712c20fSFrederick Mayle    Linux)
189*9712c20fSFrederick Mayle      grep -c -e '^processor' /proc/cpuinfo
190*9712c20fSFrederick Mayle      ;;
191*9712c20fSFrederick Mayle    Darwin)
192*9712c20fSFrederick Mayle      sysctl -n hw.ncpu
193*9712c20fSFrederick Mayle      ;;
194*9712c20fSFrederick Mayle    CYGWIN*|*_NT-*)
195*9712c20fSFrederick Mayle      echo $NUMBER_OF_PROCESSORS
196*9712c20fSFrederick Mayle      ;;
197*9712c20fSFrederick Mayle    *)
198*9712c20fSFrederick Mayle      echo 1
199*9712c20fSFrederick Mayle      ;;
200*9712c20fSFrederick Mayle  esac
201*9712c20fSFrederick Mayle}
202*9712c20fSFrederick Mayle
203*9712c20fSFrederick Mayle
204*9712c20fSFrederick Mayle# Check for the Android ADB program.
205*9712c20fSFrederick Mayle#
206*9712c20fSFrederick Mayle# On success, return nothing, but updates internal variables so later calls to
207*9712c20fSFrederick Mayle# adb_shell, adb_push, etc.. will work. You can get the path to the ADB program
208*9712c20fSFrederick Mayle# with adb_get_program if needed.
209*9712c20fSFrederick Mayle#
210*9712c20fSFrederick Mayle# On failure, returns 1, and updates the internal adb error message, which can
211*9712c20fSFrederick Mayle# be retrieved with adb_get_error.
212*9712c20fSFrederick Mayle#
213*9712c20fSFrederick Mayle# $1: optional ADB program path.
214*9712c20fSFrederick Mayle# Return: success or failure.
215*9712c20fSFrederick Mayle_ADB=
216*9712c20fSFrederick Mayle_ADB_STATUS=
217*9712c20fSFrederick Mayle_ADB_ERROR=
218*9712c20fSFrederick Mayle
219*9712c20fSFrederick Mayleadb_check () {
220*9712c20fSFrederick Mayle  # First, try to find the executable in the path, or the SDK install dir.
221*9712c20fSFrederick Mayle  _ADB=$1
222*9712c20fSFrederick Mayle  if [ -z "$_ADB" ]; then
223*9712c20fSFrederick Mayle    _ADB=$(which adb 2>/dev/null)
224*9712c20fSFrederick Mayle    if [ -z "$_ADB" -a "$ANDROID_SDK_ROOT" ]; then
225*9712c20fSFrederick Mayle      _ADB=$ANDROID_SDK_ROOT/platform-tools/adb
226*9712c20fSFrederick Mayle      if [ ! -f "$_ADB" ]; then
227*9712c20fSFrederick Mayle        _ADB=
228*9712c20fSFrederick Mayle      fi
229*9712c20fSFrederick Mayle    fi
230*9712c20fSFrederick Mayle    if [ -z "$_ADB" ]; then
231*9712c20fSFrederick Mayle      _ADB_STATUS=1
232*9712c20fSFrederick Mayle      _ADB_ERROR="The Android 'adb' tool is not in your path."
233*9712c20fSFrederick Mayle      return 1
234*9712c20fSFrederick Mayle    fi
235*9712c20fSFrederick Mayle  fi
236*9712c20fSFrederick Mayle
237*9712c20fSFrederick Mayle  log "Found ADB program: $_ADB"
238*9712c20fSFrederick Mayle
239*9712c20fSFrederick Mayle  # Check that it works correctly
240*9712c20fSFrederick Mayle  local ADB_VERSION
241*9712c20fSFrederick Mayle  ADB_VERSION=$("$_ADB" version 2>/dev/null)
242*9712c20fSFrederick Mayle  case $ADB_VERSION in
243*9712c20fSFrederick Mayle    "Android Debug Bridge "*) # Pass
244*9712c20fSFrederick Mayle      log "Found ADB version: $ADB_VERSION"
245*9712c20fSFrederick Mayle      ;;
246*9712c20fSFrederick Mayle    *) # Fail
247*9712c20fSFrederick Mayle      _ADB_ERROR="Your ADB binary reports a bad version ($ADB_VERSION): $_ADB"
248*9712c20fSFrederick Mayle      _ADB_STATUS=1
249*9712c20fSFrederick Mayle      return 1
250*9712c20fSFrederick Mayle  esac
251*9712c20fSFrederick Mayle
252*9712c20fSFrederick Mayle  _ADB_STATUS=0
253*9712c20fSFrederick Mayle  return 0
254*9712c20fSFrederick Mayle}
255*9712c20fSFrederick Mayle
256*9712c20fSFrederick Mayle
257*9712c20fSFrederick Mayle# Return the path to the Android ADB program, if correctly detected.
258*9712c20fSFrederick Mayle# On failure, return the empty string.
259*9712c20fSFrederick Mayle# Out: ADB program path (or empty on failure)
260*9712c20fSFrederick Mayle# Return: success or failure.
261*9712c20fSFrederick Mayleadb_get_program () {
262*9712c20fSFrederick Mayle  # Return cached value as soon as possible.
263*9712c20fSFrederick Mayle  if [ -z "$_ADB_STATUS" ]; then
264*9712c20fSFrederick Mayle    adb_check $1
265*9712c20fSFrederick Mayle  fi
266*9712c20fSFrederick Mayle  echo "$_ADB"
267*9712c20fSFrederick Mayle  return $_ADB_STATUS
268*9712c20fSFrederick Mayle}
269*9712c20fSFrederick Mayle
270*9712c20fSFrederick Mayle# Return the error corresponding to the last ADB function failure.
271*9712c20fSFrederick Mayleadb_get_error () {
272*9712c20fSFrederick Mayle  echo "$_ADB_ERROR"
273*9712c20fSFrederick Mayle}
274*9712c20fSFrederick Mayle
275*9712c20fSFrederick Mayle# Check that there is one device connected through ADB.
276*9712c20fSFrederick Mayle# In case of failure, use adb_get_error to know why this failed.
277*9712c20fSFrederick Mayle# $1: Optional adb program path
278*9712c20fSFrederick Mayle# Return: success or failure.
279*9712c20fSFrederick Mayle_ADB_DEVICE=
280*9712c20fSFrederick Mayle_ADB_DEVICE_STATUS=
281*9712c20fSFrederick Mayleadb_check_device () {
282*9712c20fSFrederick Mayle  if [ "$_ADB_DEVICE_STATUS" ]; then
283*9712c20fSFrederick Mayle    return $_ADB_DEVICE_STATUS
284*9712c20fSFrederick Mayle  fi
285*9712c20fSFrederick Mayle
286*9712c20fSFrederick Mayle  # Check for ADB.
287*9712c20fSFrederick Mayle  if ! adb_check $1; then
288*9712c20fSFrederick Mayle    _ADB_DEVICE_STATUS=$_ADB_STATUS
289*9712c20fSFrederick Mayle    return 1
290*9712c20fSFrederick Mayle  fi
291*9712c20fSFrederick Mayle
292*9712c20fSFrederick Mayle  local ADB_DEVICES NUM_DEVICES FINGERPRINT
293*9712c20fSFrederick Mayle
294*9712c20fSFrederick Mayle  # Count the number of connected devices.
295*9712c20fSFrederick Mayle  ADB_DEVICES=$("$_ADB" devices 2>/dev/null | awk '$2 == "device" { print $1; }')
296*9712c20fSFrederick Mayle  NUM_DEVICES=$(echo "$ADB_DEVICES" | wc -l)
297*9712c20fSFrederick Mayle  case $NUM_DEVICES in
298*9712c20fSFrederick Mayle    0)
299*9712c20fSFrederick Mayle      _ADB_ERROR="No Android device connected. Please connect one to your machine."
300*9712c20fSFrederick Mayle      _ADB_DEVICE_STATUS=1
301*9712c20fSFrederick Mayle      return 1
302*9712c20fSFrederick Mayle      ;;
303*9712c20fSFrederick Mayle    1) # Pass
304*9712c20fSFrederick Mayle      # Ensure the same device will be called in later adb_shell calls.
305*9712c20fSFrederick Mayle      export ANDROID_SERIAL=$ADB_DEVICES
306*9712c20fSFrederick Mayle      ;;
307*9712c20fSFrederick Mayle    *) # 2 or more devices.
308*9712c20fSFrederick Mayle      if [ "$ANDROID_SERIAL" ]; then
309*9712c20fSFrederick Mayle        ADB_DEVICES=$ANDROID_SERIAL
310*9712c20fSFrederick Mayle        NUM_DEVICES=1
311*9712c20fSFrederick Mayle      else
312*9712c20fSFrederick Mayle        _ADB_ERROR="More than one Android device connected. \
313*9712c20fSFrederick MaylePlease define ANDROID_SERIAL in your environment"
314*9712c20fSFrederick Mayle        _ADB_DEVICE_STATUS=1
315*9712c20fSFrederick Mayle        return 1
316*9712c20fSFrederick Mayle      fi
317*9712c20fSFrederick Mayle      ;;
318*9712c20fSFrederick Mayle  esac
319*9712c20fSFrederick Mayle
320*9712c20fSFrederick Mayle  _ADB_DEVICE_STATUS=0
321*9712c20fSFrederick Mayle  _ADB_DEVICE=$ADB_DEVICES
322*9712c20fSFrederick Mayle
323*9712c20fSFrederick Mayle  FINGERPRINT=$(adb_shell getprop ro.build.fingerprint)
324*9712c20fSFrederick Mayle  log "Using ADB device: $ANDROID_SERIAL ($FINGERPRINT)"
325*9712c20fSFrederick Mayle  return 0
326*9712c20fSFrederick Mayle}
327*9712c20fSFrederick Mayle
328*9712c20fSFrederick Mayle# The 'adb shell' command is pretty hopeless, try to make sense of it by:
329*9712c20fSFrederick Mayle#   1/ Removing trailing \r from line endings.
330*9712c20fSFrederick Mayle#   2/ Ensuring the function returns the command's status code.
331*9712c20fSFrederick Mayle#
332*9712c20fSFrederick Mayle# $1+: Command
333*9712c20fSFrederick Mayle# Out: command output (stdout + stderr combined)
334*9712c20fSFrederick Mayle# Return: command exit status
335*9712c20fSFrederick Mayleadb_shell () {
336*9712c20fSFrederick Mayle  local RET ADB_LOG
337*9712c20fSFrederick Mayle  # Check for ADB device.
338*9712c20fSFrederick Mayle  adb_check_device || return 1
339*9712c20fSFrederick Mayle  ADB_LOG=$(mktemp "${TMPDIR:-/tmp}/adb-XXXXXXXX")
340*9712c20fSFrederick Mayle  "$_ADB" shell "$@" ";" echo \$? > "$ADB_LOG" 2>&1
341*9712c20fSFrederick Mayle  sed -i -e 's![[:cntrl:]]!!g' "$ADB_LOG"  # Remove \r.
342*9712c20fSFrederick Mayle  RET=$(sed -e '$!d' "$ADB_LOG")           # Last line contains status code.
343*9712c20fSFrederick Mayle  sed -e '$d' "$ADB_LOG"                   # Print everything except last line.
344*9712c20fSFrederick Mayle  rm -f "$ADB_LOG"
345*9712c20fSFrederick Mayle  return $RET
346*9712c20fSFrederick Mayle}
347*9712c20fSFrederick Mayle
348*9712c20fSFrederick Mayle# Push a file to a device.
349*9712c20fSFrederick Mayle# $1: source file path
350*9712c20fSFrederick Mayle# $2: device target file path
351*9712c20fSFrederick Mayle# Return: success or failure.
352*9712c20fSFrederick Mayleadb_push () {
353*9712c20fSFrederick Mayle  adb_check_device || return 1
354*9712c20fSFrederick Mayle  run "$_ADB" push "$1" "$2"
355*9712c20fSFrederick Mayle}
356*9712c20fSFrederick Mayle
357*9712c20fSFrederick Mayle# Pull a file from a device
358*9712c20fSFrederick Mayle# $1: device file path
359*9712c20fSFrederick Mayle# $2: target host file path
360*9712c20fSFrederick Mayle# Return: success or failure.
361*9712c20fSFrederick Mayleadb_pull () {
362*9712c20fSFrederick Mayle  adb_check_device || return 1
363*9712c20fSFrederick Mayle  run "$_ADB" pull "$1" "$2"
364*9712c20fSFrederick Mayle}
365*9712c20fSFrederick Mayle
366*9712c20fSFrederick Mayle# Same as adb_push, but will panic if the operations didn't succeed.
367*9712c20fSFrederick Mayleadb_install () {
368*9712c20fSFrederick Mayle  adb_push "$@"
369*9712c20fSFrederick Mayle  fail_panic "Failed to install $1 to the Android device at $2"
370*9712c20fSFrederick Mayle}
371*9712c20fSFrederick Mayle
372