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

VERSION="1.2.0"
SCRIPT=$(basename -- "${0}")
set -e

export LC_ALL=C

if [[ ! -e /etc/cros_chroot_version ]]; then
  echo "This script must be run inside the chroot."
  exit 1
fi

if ! hash gen_config 2>/dev/null; then
  echo "gen_config is not on your PATH."
  echo "Run the following before continuing:"
  echo "echo 'export PATH=\$PATH:~/trunk/src/config/bin' >> ~/.bashrc && source ~/.bashrc"
  exit 1
fi

if [[ "$#" -lt 2 ]]; then
  echo "Usage: ${SCRIPT} base_name variant_name [bug_number]"
  echo "e.g. ${SCRIPT} puff wyvern b:158269582"
  echo "Updates the config.star to add a default _FW_BUILD_CONFIG"
  exit 1
fi

# shellcheck source=check_standalone.sh
# shellcheck disable=SC1091
source "${BASH_SOURCE%/*}/check_standalone.sh"

# shellcheck source=check_pending_changes.sh
# shellcheck disable=SC1091
source "${BASH_SOURCE%/*}/check_pending_changes.sh"

# This is the name of the base board.
# ${var,,} converts to all lowercase.
BASE="${1,,}"
# This is the name of the variant that we are enabling _FW_BUILD_CONFIG for.
VARIANT="${2,,}"
# We need all uppercase version, too, so ${var^^}
VARIANT_UPPER="${VARIANT^^}"

# Assign BUG= text, or "None" if that parameter wasn't specified.
BUG="${3:-None}"

# The config.star file will be located here
cd "${HOME}/trunk/src/project/${BASE}/${VARIANT}"

# If there are pending changes, exit the script (unless overridden)
check_pending_changes "$(pwd)"

# Start a branch. Use YMD timestamp to avoid collisions.
DATE=$(date +%Y%m%d)
BRANCH="create_${VARIANT}_${DATE}"
repo start "${BRANCH}" . "${NEW_VARIANT_WIP:+--head}"
# ${parameter:+word}" substitutes "word" if $parameter is set to a non-null
# value, or substitutes null if $parameter is null or unset.

cleanup() {
  # If there is an error after the `repo start`, then restore modified files
  # to clean up. `git restore --staged` will remove files added to a commit,
  # and `git restore` will restore the file to its unmodified state. Then
  # `repo abandon` the new branch.
  git restore --staged config.star
  git restore config.star
  git restore --staged generated/config.jsonproto
  git restore generated/config.jsonproto
  git restore --staged sw_build_config/platform/chromeos-config/generated/project-config.json
  git restore sw_build_config/platform/chromeos-config/generated/project-config.json
  repo abandon "$1" .
}
trap 'cleanup "${BRANCH}"' ERR

# Change the _FW_BUILD_CONFIG from None to _${VARIANT_UPPER}.
sed -i -e "s/_FW_BUILD_CONFIG = None/_FW_BUILD_CONFIG = program.firmware_build_config(_${VARIANT_UPPER})/" config.star

# Regenerate the config.
./config.star

# Add modified files.
git add config.star
git add generated/config.jsonproto
git add sw_build_config/platform/chromeos-config/generated/project-config.json

# Now commit the files.
git commit -m "${VARIANT}: enable default firmware build

Add a default _FW_BUILD_CONFIG.

(Auto-Generated by ${SCRIPT} version ${VERSION}).

BUG=${BUG}
TEST=Verify the ${VARIANT} firmware builds"

check_standalone "$(pwd)" "${BRANCH}"
