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

# This script is a replacement for /usr/bin/env that adds Fuchsia-specific
# information and provides access to prebuilt tools in the source tree.
#
# This is not a subcommand of `fx` because multiple pieces of project
# infrastructure run outside of the build and need access to in-tree prebuilts.

set -e

# Filter out invalid FUCHSIA_DIR settings.
if [[ -n "${FUCHSIA_DIR}" ]]; then
  if [[ ! -d "${FUCHSIA_DIR}" ]]; then
    unset FUCHSIA_DIR
  elif [[ "${FUCHSIA_DIR#/}" == "${FUCHSIA_DIR}" ]]; then
    unset FUCHSIA_DIR
  else
    PWD="$(pwd)"
    if [[ "${PWD#${FUCHSIA_DIR}}" = "${PWD}" ]]; then
      # FUCHSIA_DIR does not contain the current directory
      unset FUCHSIA_DIR
    fi
  fi
fi

function find_tree_root {
  local parent="$1"
  if [[ ! -d "$parent" ]]; then
    return 1
  fi
  while [[ ! -d "${parent}/.jiri_root" ]]; do
    parent="$(dirname "${parent}")"
    if [[ "$parent" == "/" ]]; then
      return 1
    fi
  done
  echo "$parent"
}

# Mimic `fx` behavior to set up a consistent root and get prebuilt paths.
#
# We walk the parent directories looking for .jiri_root rather than using
# BASH_SOURCE so that we find the fuchsia_dir enclosing the current working
# directory instead of the one containing this file in case the user has
# multiple source trees and is picking up this file from another one.
#
# NOTE: The FUCHSIA_DIR environment variable is ignored here because it
# could point to a different Fuchsia checkout in some developer setups.
#
# This logic is replicated in //scripts/fx, //scripts/hermetic_env,
# //scripts/zsh_completion/_fx, and //src/developer/ffx/scripts. For
# consistency, copy any changes here to those files as well.
if ! fuchsia_dir="$(find_tree_root "$(pwd)")"; then
  echo >&2 "ERROR: Cannot find the Platform Source Tree in a parent of the current directory: $(pwd)"
  exit 1
fi

script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"

if [[ "${script_dir}" != "${fuchsia_dir}"* ]]; then
  echo >&2 "ERROR: You are executing fx from outside of the current source tree"
  echo >&2 "ERROR: This is not supported as fx does not have a stable internal API"
  echo >&2
  echo >&2 "    'hermetic-env' was executed from: ${BASH_SOURCE[0]}"
  echo >&2 "    'fuchsia directory' resolved to: ${fuchsia_dir}"
  echo >&2
  echo >&2 "To run a command in the current Fuchsia directory, run fx from:"
  echo >&2 "  ${fuchsia_dir}/scripts/hermetic-env"
  echo >&2 "Or, if you use fx-env.sh, source fx-env from the current fuchsia dir:"
  echo >&2 "  source ${fuchsia_dir}/scripts/fx-env.sh"
  echo >&2 "To change your current environment, update your 'PATH':"
  echo >&2 "  source ${fuchsia_dir}/scripts/fx-env.sh && fx-update-path"
  exit 1
fi

export FUCHSIA_DIR="${fuchsia_dir}"
declare -r platform_sh="${fuchsia_dir}/tools/devshell/lib/platform.sh"
source "${platform_sh}" || exit $?

if [[ "${PATH#${PREBUILT_ALL_PATHS}}" == "${PATH}" ]]; then
  # Prebuilts have not been added to the path
  if [[ x"${FUCHSIA_HERMETIC_TOOLS}" == xy ]]; then
    readonly newpath="${PREBUILT_ALL_PATHS}:${FUCHSIA_DIR}/tools/system"
  else
    readonly newpath="${PREBUILT_ALL_PATHS}:${PATH}"
  fi
else
  readonly newpath="${PATH}"
fi

export PATH="${newpath}"

# Always populate FUCHSIA_BUILD_DIR_FROM_FX.
if [[ -z "${FUCHSIA_BUILD_DIR_FROM_FX}" && -f "${FUCHSIA_DIR}/.fx-build-dir" ]]; then
  export FUCHSIA_BUILD_DIR_FROM_FX=$(cd ${FUCHSIA_DIR} && realpath $(cat .fx-build-dir))
fi

# Forward the args to the system `env`.
exec /usr/bin/env -i \
  "FUCHSIA_DIR=${fuchsia_dir}" \
  "TERM=${TERM}" \
  "PATH=${newpath}" \
  "HOME=${HOME}" \
  "USER=${USER}" \
  "FUCHSIA_HERMETIC_TOOLS=${FUCHSIA_HERMETIC_TOOLS}" \
  "FUCHSIA_NODENAME=${FUCHSIA_NODENAME}" \
  "FUCHSIA_NODENAME_IS_FROM_FILE=${FUCHSIA_NODENAME_IS_FROM_FILE}" \
  "FUCHSIA_TEST_FETCH_REMOTE=${FUCHSIA_TEST_FETCH_REMOTE}" \
  ${FUCHSIA_BAZEL_DISK_CACHE+"FUCHSIA_BAZEL_DISK_CACHE=${FUCHSIA_BAZEL_DISK_CACHE}"} \
  ${FUCHSIA_BUILD_DIR_FROM_FX+"FUCHSIA_BUILD_DIR_FROM_FX=${FUCHSIA_BUILD_DIR_FROM_FX}"} \
  ${FUCHSIA_DEBUG_BAZEL_SANDBOX+"FUCHSIA_DEBUG_BAZEL_SANDBOX=${FUCHSIA_DEBUG_BAZEL_SANDBOX}"} \
  ${FX_BUILD_RBE_STATS+"FX_BUILD_RBE_STATS=${FX_BUILD_RBE_STATS}"} \
  ${NINJA_STATUS+"NINJA_STATUS=${NINJA_STATUS}"} \
  ${NINJA_STATUS_MAX_COMMANDS+"NINJA_STATUS_MAX_COMMANDS=${NINJA_STATUS_MAX_COMMANDS}"} \
  ${NINJA_STATUS_REFRESH_MILLIS+"NINJA_STATUS_REFRESH_MILLIS=${NINJA_STATUS_REFRESH_MILLIS}"} \
  ${NINJA_PERSISTENT_MODE+"NINJA_PERSISTENT_MODE=${NINJA_PERSISTENT_MODE}"} \
  ${NINJA_PERSISTENT_LOG_FILE+"NINJA_PERSISTENT_LOG_FILE=${NINJA_PERSISTENT_LOG_FILE}"} \
  ${NINJA_PERSISTENT_TIMEOUT_SECONDS+"NINJA_PERSISTENT_TIMEOUT_SECONDS=${NINJA_PERSISTENT_TIMEOUT_SECONDS}"} \
  ${GOMA_DISABLED+"GOMA_DISABLED=${GOMA_DISABLED}"} \
  ${TMPDIR+"TMPDIR=${TMPDIR}"} \
  ${SSH_AUTH_SOCK+"SSH_AUTH_SOCK=${SSH_AUTH_SOCK}"} \
  ${FUCHSIA_FX_ITERATIVE+"FUCHSIA_FX_ITERATIVE=${FUCHSIA_FX_ITERATIVE}"} \
  ${FUCHSIA_FX_TEST_RUN+"FUCHSIA_FX_TEST_RUN=${FUCHSIA_FX_TEST_RUN}"} \
  ${FUCHSIA_FX_MULTI_RUN+"FUCHSIA_FX_MULTI_RUN=${FUCHSIA_FX_MULTI_RUN}"} \
  ${FUCHSIA_FX_INVOKER+"FUCHSIA_FX_INVOKER=${FUCHSIA_FX_INVOKER}"} \
  ${XDG_DATA_HOME+"XDG_DATA_HOME=${XDG_DATA_HOME}"} \
  "$@"
