#!/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
##   $ fx serve-updates
##   $ fx run fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world-dart.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 "$@"
