#!/bin/bash

# This script is a wrapper for programs that may have alternate versions
# (e.g. python2, python3).  This wrapper allows the user to influence the
# selection of the program version by setting the <program name>_VERSION (e.g.
# PYTHON_VERSION, ROBOT_VERSION, etc.) environment variable.

# Users would be expected to create a link with the base name of the program
# that points to this file.

# Example:
# cd openbmc-test-automation/bin
# ln -s select_version python

# The PATH variable should contain the expanded path to
# openbmc-test-automation/bin.

# If <program name>_VERSION is blank or not set, then the program version
# will be whatever the system default program version is.  If <program
# name>_VERSION is set to a value, then that value will be appened to the name
# of the program (e.g. if PYTHON_VERSION = "3", then python3 will be used.).
# If <program name>_VERSION is set to some value that does not correspond to a
# valid program version for the given system, this program will fail.


# Make sure program_name is set.
program_name="${0##*/}"
program_uppercase_name=${program_name^^}


function get_target_program_path {
  local target_program_path_var="${1:-target_program_path}" ; shift

  # Get the full path to the "real" program and assign it to the variable
  # named in target_program_path_var.

  # Description of argument(s):
  # target_program_path_var         The name of the variable to receive the
  #                                 result.

  # Example result:

  # /usr/bin/python3

  local version_var_name
  local alternate_program_name
  local base_program_path
  local base_program_name
  local candidate
  local candidates
  local base_file_path

  # The typical use of this program would be to create a link to it like this:
  # ln -s select_version python
  # That being the case, get the name of this actual program (rather than the
  # name of the link to it).
  base_program_path=$(readlink -f "${0}")
  base_program_name=${base_program_path##*/}

  # Compose the version_var_name value (e.g. PYTHON_VERSION).
  version_var_name=${program_uppercase_name}_VERSION
  # Compose the alternate_program_name (e.g. python3).
  alternate_program_name=${program_name}${!version_var_name}

  # Now use the "type" built-in to search the PATH variable for a list of
  # target program candidates.
  candidates=$(type -ap ${alternate_program_name})

  # Example candidates:
  # /home/robot/openbmc-test-automation/bin/python
  # /usr/bin/python

  # In this example, the first candidate is actually a link to
  # /home/robot/openbmc-test-automation/bin/select_version.  As such it will
  # be rejected.

  for candidate in ${candidates}
  do
    if [ -L "${candidate}" ] ; then
      # The candidate is a link so we need to see if it's a link to this
      # program file.
      base_file_path=$(readlink "${candidate}")
      [ "${base_file_path}" == "${base_program_name}" ] && continue
    fi

    # The candidate is NOT a link so it qualifies as the desired target
    # program path.
    eval ${target_program_path_var}=\"\${candidate}\"
    return

  done

}


# Main

  get_target_program_path target_program_path

  # Compose program path var name (e.g. PYTHON_PGM_PATH).
  pgm_path_var_name=${program_uppercase_name}_PGM_PATH
  # Set and export pgm_path_var_name (e.g. PYTHON_PGM_PATH=/usr/bin/python3).
  # This value can be used by child programs for debug.
  eval export ${pgm_path_var_name}=${target_program_path}

  if [ "${1}" == "--print_only" ] ; then
    echo "${target_program_path}"
  else
    ${target_program_path} "${@}"
  fi

