#!/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.

#### CATEGORY=Software delivery
### build Fuchsia and push to device

## usage: fx run [--no-build|[NINJA OPTION,...]] [--no-pkg-check] [--no-kill] [--no-restart-session] TARGET [ARG,...]
##
## Build ALL targets.
## Execute 'fx shell killall TARGET'.
## Execute 'fx shell run TARGET [ARGS].
##
##   --no-build               do not execute a build
##   --no-pkg-check           do not check for a package server
##   --no-kill                do not kill all instances of matching components
##   --no-restart-session     do not perform a sessionctl restart_session
##
## NINJA OPTION
## The following ninja options are passed to the build if invoked:
##   -C, -f, -j, -k, -l, -t, -w.
## See fx ninja --help for more information on these flags.
##
## TARGET is any form that 'run' on the target device accepts, as such it may
## be a package url, or a non-ambiguous short-form.
## Example:
##   $ fx set core.x64 --with //examples/rolldice
##   $ fx serve
##   $ fx run fuchsia-pkg://fuchsia.com/rolldice#meta/rolldice.cmx
## ARG is passed to target without interpretation. All arguments after TARGET
## are passed to TARGET.

set -e

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

function main {
  local ninja_args=()
  local targets=()
  local build=true
  local pkg_check=true
  local kill_components=true
  local restart_session=true
  while (($#)); do
    case "$1" in
      --no-build)
        build=false
        ;;
      --no-pkg-check)
        pkg_check=false
        ;;
      --no-kill)
        kill_components=false
        ;;
      --no-restart-session)
        restart_session=false
        ;;
      -C|-f|-j|-k|-l|-t|-w)
        ninja_args+=("$1")
        shift
        ninja_args+=("$1")
        ;;
      -n|-v)
        ninja_args+=("$1")
        ;;
      *)
        target+=("$1")
        shift
        break
    esac
    shift
  done

  if $build; then
    fx-command-run build "${ninja_args[@]}"
  fi

  if $pkg_check; then
    check-for-package-server || return 1
  fi

  if $restart_session; then
    if ! fx-command-run shell sessionctl restart_session; then
      fx-warn "Restarting session failed"
    fi
  fi

  local r=0
  # As running components are typically named after their cmx, the
  # basename here avoids the case where a user has provided a full
  # URL such as `fx run
  # fuchsia-pkg://fuchsia.com/rolldice#meta/rolldice.cmx`. This
  # strategy could be improved if implemented in a more featureful
  # environment.
  if $kill_components; then
    echo >&2 Stopping "${target} with killall $(basename "${target}") ..."
    fx-command-run shell killall "$(basename "${target}")" || true
  fi
  echo >&2 Running "${target} with run "${target}" ..."
  fx-command-run shell run "${target}" "$@"
  ((r += $?))
  return r
}

main "$@"
