#!/bin/bash
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Device management
### copy a file to/from a target device

## usage: fx cp [-r] [--to-target|--to-host] SRC... DST
##
## Copies a file from the host to the target device, or vice versa.
##
## -r: recursively copy directories
## --to-target: copy file SRC from host to DST on the target
## --to-host: copy file SRC from target to DST on the host
##
## The default is to copy files to the target.


source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?

set -e

recurse=false
to_target=true
# Process all the args except the last two.
while (( "$#" > 2 )); do
  case "$1" in
  -r)
    recurse=true
    shift
    ;;
  --to-target)
    to_target=true
    shift
    ;;
  --to-host)
    to_target=false
    shift
    ;;
  --help)
    fx-command-help
    exit 1
  esac
done

if [[ $# -lt 2 ]]; then
  fx-command-help
  exit 1
fi

args=( "$@" )
nargs=${#args[@]}
dst=${args[$nargs-1]}
srcs=( "${args[@]:0:$nargs-1}" )
host="$(get-fuchsia-device-addr)"

sftp_args=()
sftp_command_args=()

if [[ "${recurse}" = "true" ]]; then
  sftp_command_args+=( "-r" )
fi

port="$(get-fuchsia-device-port)"
if [[ -n "${port}" ]]; then
  sftp_args+=( "-P" "${port}" )
fi

sftp_args+=(
  "-q"
  "-b" "-"
  "[${host}]"
)

if [[ "${to_target}" = "true" ]]; then
  (
  for src in "${srcs[@]}"; do
    echo "put ${sftp_command_args} \"${src}\" \"${dst}\""
  done
  ) | fx-command-run sftp "${sftp_args[@]}" > /dev/null
else
  (
  for src in "${srcs[@]}"; do
    echo "get ${sftp_command_args} \"${src}\" \"${dst}\""
  done
  ) | fx-command-run sftp "${sftp_args[@]}" > /dev/null
fi
