#!/bin/bash
# Copyright 2018 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.

### build Fuchsia and push to device

## usage: fx build-push [ninja option,...] [--device|-d device] [target,...]
##
## Build ALL targets. After building all the targets, push the ones that were
## supplied to this command. If no targets were specified push all of them.
## The packages are pushed to the device specified. If no device is supplied
## explictly this will push to the single connected device. If multiple devices
## are connected and no device is specified, pushing will fail.

# XXX TODO(US-415): after US-415 is closed, this command can pass a specific
# build target to ninja rather than running the default build target.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read

function main {
  local args=()
  local push=1
  local targets=()
  local device_args=()
  while (($#)); do
    case "$1" in
      -C|-f|-j|-k|-l|-t|-w)
        args+=("$1")
        shift
        args+=("$1")
        ;;
      -n|-v)
        args+=("$1")
        ;;
      --device)
        shift
        device_args+=("-d" "$1")
        ;;
      --no-push)
        push=0
        ;;
      -d)
        shift
        if [[ "$1" == *"-"* ]]; then
          device_args+=("-d" "$1")
        else
          args+=("-d" $1)
        fi
        ;;
      *)
        targets+=("$1")
    esac
    shift
  done

  fx-command-run build "${args[@]}"

  if [[ "${push}" -eq 0 ]]; then
    return
  fi

  if [[ "${#targets[@]}" -eq 0 ]]; then
    echo "No packages names provided, all packages will be pushed."
    echo "Consider using \"fx build && fx ota\" for better performance when"
    echo "pushing all packages."
    # give a window for that to sink in
    sleep 1
  fi

  if [[ -z "$(pgrep amber-srv)" ]]; then
    echo
    echo "WARNING: It looks like amber-srv is not running."
    echo "WARNING: You probably need to start \"fx serve\""
    echo
  fi

  fx-command-run push-package-no-publish "${device_args[@]}" "${targets[@]}"
}


main "$@"
# See kill_background_jobs trap for cleanup of backgrounded processes.
