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

# Loads script libraries.
SCRIPT_ROOT=$(dirname "$(readlink -f "$0")")
. "${SCRIPT_ROOT}/common.sh" || exit 1

FLAGS_HELP="
Command to rebuild firmware after a config change.

After you make a change to the firmware version in the master configuration,
run this script to test it. It will rebuild the master configuration, update
the Manifest and build the new firmware. You can then submit your CL to update
the master configuration, safe in the knowledge that you have tested it.

Usage:
   cros_update_firmware <board>

where <board> is the board whose firmware needs updating (e.g. 'coral').
"

# Script must be run inside the chroot.
restart_in_chroot_if_needed "$@"

# Flags
DEFINE_string board "${DEFAULT_BOARD}" "Which board the firmware is for" b

# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
switch_to_strict_mode

start_workon() {
  local board="$1"
  local pkg item
  if [[ -z "$2" ]]; then
    echo "Empty package.  Skipping..."
    return 1
  fi
  pkg=$(cros_workon --board="${board}" info "$2" | cut -d ' ' -f 1)
  shift 2
  for item in "$@"; do
    if [[ "${pkg}" == "${item}" ]]; then
      echo "Already workon ${pkg}.  Skipping..."
      return 1
    fi
  done
  cros_workon --board="${board}" start "${pkg}"
  return $?
}

stop_workon() {
  cros_workon --board="$1" stop "$2"
}

update_firmware() {
  local board="$1"
  local base ebuild srcuris cfg_bsp_pkg cfg_bsp_baseboard_pkg
  local current_workon_pkg_list start_pkg result i

  set -e

  # query the current working package
  mapfile -t current_workon_pkg_list < <(cros_workon --board="${board}" list)

  # check if chromeos-config-bsp is a virtual package
  cfg_bsp_pkg="chromeos-config-bsp"
  equery-"${board}" w chromeos-base/chromeos-config-bsp > /dev/null 2>&1 \
    || cfg_bsp_pkg="chromeos-config-bsp-${board}-private"
  # check if chromeos-config-bsp-baseboard is in use
  cfg_bsp_baseboard_pkg="chromeos-config-bsp-baseboard"
  equery-"${board}" w chromeos-base/chromeos-config-bsp-baseboard \
    > /dev/null 2>&1 || cfg_bsp_baseboard_pkg=

  start_pkg=("${cfg_bsp_pkg}")
  start_pkg+=("chromeos-firmware-${board}")
  start_pkg+=("${cfg_bsp_baseboard_pkg}")

  for i in "${!start_pkg[@]}"; do
    result[i]=0
    start_workon "${board}" "${start_pkg[i]}" "${current_workon_pkg_list[@]}" \
       || result[i]=$?
  done

  base="${GCLIENT_ROOT}/src/private-overlays/overlay-${board}-private/chromeos-base"
  ebuild="${base}/chromeos-firmware-${board}/chromeos-firmware-${board}-9999.ebuild"
  srcuris="${base}/chromeos-firmware-${board}/files/srcuris"
  yaml_config="/build/${board}/usr/share/chromeos-config/yaml/config.yaml"

  "emerge-${board}" ${cfg_bsp_baseboard_pkg} "${cfg_bsp_pkg}" chromeos-config
  if [[ -e "${yaml_config}" ]]; then
    cros_config_host -c "${yaml_config}" get-firmware-uris > "${srcuris}"
  else
    cros_config_host -c "/build/${board}/usr/share/chromeos-config/config.dtb" \
      get-firmware-uris > "${srcuris}"
  fi
  touch "${ebuild}"
  "ebuild-${board}" "${ebuild}" manifest
  "emerge-${board}" "chromeos-firmware-${board}"

  for i in "${!result[@]}"; do
    if [[ "${result[i]}" -eq "0" ]]; then
      stop_workon "${board}" "${start_pkg[i]}"
    fi
  done
}

main() {
  if [[ -z "${FLAGS_board}" ]]; then
    die_notrace "-b or --board required."
  fi

  update_firmware "${FLAGS_board}"
}

main "$@"
