#!/bin/bash

# Copyright (c) 2012 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.

# This script selects a profile from the overlays.

# Load common CrOS utilities.  Inside the chroot this file is installed in
# /usr/lib/crosutils.  Outside the chroot we find it relative to the scripts
# location.
common_paths="/usr/lib/crosutils $(dirname "$0")/../../../scripts"

for path in ${common_paths} ; do
  if [ -f "${path}/common.sh" ] ; then
    COMMON_SH="${path}/common.sh"
    break
  fi
done

if [ -z "${COMMON_SH}" ] ; then
  echo "common.sh not found in search path (${common_paths})"
  exit 1
fi

. "${COMMON_SH}"

# Flags
DEFINE_string board "$DEFAULT_BOARD" "The name of the board to set up."
DEFINE_string variant "" "Board variant."
DEFINE_string profile "" "The portage configuration profile to use."
DEFINE_string board_root "" "Board root where the profile should be created."

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

# Only now can we die on error.  shflags functions leak non-zero error codes,
# so will die prematurely if 'set -e' is specified before now.
set -e

if [[ -z "${FLAGS_board}" ]] && [[ -z "${FLAGS_board_root}" ]]; then
  error "--board or --board_root required."
  exit 1
fi

get_board_and_variant "${FLAGS_board}" "${FLAGS_variant}"

BOARD_ROOT="${FLAGS_board_root:-/build/${BOARD_VARIANT}}"
MAKE_PROFILE="${BOARD_ROOT}/etc/portage/make.profile"
SYSROOT_CACHE="${BOARD_ROOT}/${SYSROOT_SETTINGS_FILE}"

if [ -e "${MAKE_PROFILE}" -a ! -L "${MAKE_PROFILE}" ]; then
  error "${MAKE_PROFILE} is not a symbolic link, it should be."
  exit 1
fi

#
# Get board overlay list.
#
BOARD_OVERLAY_LIST="$(get_sysroot_config "${BOARD_ROOT}" "BOARD_OVERLAY")"

#
# Get ARCH
#
ARCH=$(get_sysroot_config "${BOARD_ROOT}" "ARCH") || exit 1

# The profile directory comes from many possible locations, the <overlay>
# values below can be any of the board overlays, public, private, primary
# or variant.  The name defaults to base, but can be set using --profile:
#  * relative profile name from --profile in <overlay>/profiles/<name>
#  * absolute profile path from --profile
#  * <overlay>/profiles/base
#
# If --profile is non-null and does not exist the script will error
# If none of the directories exist the script will error as well
PROFILES_LIST=""
PROFILES_DIR=""
PROFILE_NAME="base"

PROFILE_OVERRIDE="${FLAGS_profile:-$(get_variable "${SYSROOT_CACHE}" \
  "PROFILE_OVERRIDE")}"

if [ ! -z "${PROFILE_OVERRIDE}" ]; then  # profile specified. must exist or we fail
  if [ -d "${PROFILE_OVERRIDE}" ]; then
    # Make sure we get the full path since we'll be creating a symlink to it.
    # Relative paths won't work. http://crbug.com/567959
    PROFILES_DIR=$(realpath "${PROFILE_OVERRIDE}")
  else
    PROFILE_NAME="${PROFILE_OVERRIDE}"
  fi
fi

if [ -z "${PROFILES_DIR}" ]; then
  # Add the overlays in reverse order so that the most specific overlay is
  # searched first.
  for overlay in ${BOARD_OVERLAY_LIST}; do
    PROFILES_LIST="${overlay}/profiles/${PROFILE_NAME} ${PROFILES_LIST}"
  done

  # Search for the most specific profile.  Stop looking once we've found the
  # first one.
  for profile in ${PROFILES_LIST}; do
    if [ -d "${profile}" ]; then
      PROFILES_DIR="${profile}"
      break
    fi
  done
fi

if [ -z "${PROFILES_DIR}" ]; then
  error "Profiles directory not found, searched in (${PROFILES_LIST})"
  exit 1
fi

info "Selecting profile: ${PROFILES_DIR} for ${BOARD_ROOT}"

if [ ! -f "${PROFILES_DIR}/parent" ]; then
  warn "Portage profile directory '${PROFILES_DIR}' has no file 'parent'."
  warn "This likely means your profile directory is invalid and build_packages"
  warn "will fail"
fi

# Only run `ln` if profile doesn't exist, or has changed.
CURR_PROFILE=$(readlink "${MAKE_PROFILE}" 2>/dev/null || :)
if [[ ${CURR_PROFILE} != "${PROFILES_DIR}" ]]; then
  if [[ -n ${CURR_PROFILE} ]]; then
    # If it's changed, then warn & clean out the old link.
    msg="
You are switching profiles for a board that is already setup.  This
can cause trouble for Portage.  If you experience problems with
build_packages you may need to run:
\tsetup_board --board ${BOARD_VARIANT} --force --profile ${PROFILE_NAME}\n
Alternatively, you can correct the dependecy graph by using
'emerge-${BOARD_VARIANT} -c' or 'emerge-${BOARD_VARIANT} -C <ebuild>'
"
    warn "${msg}"
    sudo rm -f "${MAKE_PROFILE}"
  fi

  sudo ln -sf "${PROFILES_DIR}" "${MAKE_PROFILE}"
  if [[ -n "${PROFILE_OVERRIDE}" ]]; then
    set_variable "${SYSROOT_CACHE}" "PROFILE_OVERRIDE" "${PROFILE_OVERRIDE}"
  fi
fi
