#!/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
### run bootserver for paving

## usage: fx pave [--build|--no-build] [-1|--keep-running] [extra bootserver arguments]
##
##   --build | --no-build     build (or not) the images required to pave.
##   -1 | --keep-running      perform a single pave and exit or keep the bootserver
##                            running after the first paving
##   extra bootserver args    arguments passed directly to bootserver
##
## Start a bootserver for paving a device, optionally performing a build of the
## system images before.
##
## Defaults are defined by the "incremental" feature:
##    'fx --enable=incremental pave'  defaults to "--build" and "-1"
##    'fx --disable=incremental pave'  defaults to "--no-build" and "--keep-running"
##
## For bootserver specific arguments, use 'fx pave --help'

set -e

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

function main {
  local single_run=false
  local build=false
  if is_feature_enabled "incremental"; then
    # In incremental workflows, these defaults have changed.
    # Keep old behavior if incremental is not enabled.
    single_run=true
    build=true
  fi
  local pave_args=()
  local help=false
  while (( $# )); do
    case "$1" in
      --help)
        help=true
        ;;
      --no-build)
        build=false
        ;;
      --build)
        build=true
        ;;
      --keep-running)
        single_run=false
        ;;
      -1)
        single_run=true
        ;;
      *)
        pave_args+=("$1")
        ;;
    esac
    shift
  done

  if $help; then
    if ! $build; then
      # bootserver options cannot be shown if depedencies cannot be built, so
      # if --no-build flag is used, just show the simple help.
      fx-command-help
      exit 0
    fi
    fx-command-help 2>&1 | grep -v "fx pave --help" >&2
    fx-info
    fx-info "Building and executing 'pave.sh --help' to show bootserver specific options."
    fx-info "Press Ctrl+C to interrupt."
    fx-info
    pave_args=(--help)

  else
    if $single_run; then
      pave_args+=( "-1" )
    fi

    name="$(get-device-name)" || exit $?
    if [[ -n "$name" ]]; then
      pave_args+=("-n" "${name}")
    fi

    if ! fx-is-bringup; then
      authkeys_path="$(get-ssh-authkeys)" || {
        fx-error "Cannot continue without a valid authorized keys file."
        exit 1
      }
      pave_args+=(--authorized-keys "${authkeys_path}")
    fi
  fi

  if $build; then
    local artifacts=($(fx-command-run list-build-artifacts pave)) || exit $?
    fx-info "Building/refreshing targets ${artifacts[@]}"
    fx-command-run build "${artifacts[@]}"
  fi

  exec "${FUCHSIA_BUILD_DIR}/pave.sh" "${pave_args[@]}"
}

main "$@"

