# Copyright 2018 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Configure the shell toolchain on the local machine."""

def _is_windows(repository_ctx):
  """Returns true if the host OS is Windows."""
  return repository_ctx.os.name.startswith("windows")

def _sh_config_impl(repository_ctx):
  """sh_config rule implementation.

  Detects the path of the shell interpreter on the local machine and
  stores it in a sh_toolchain rule.

  Args:
    repository_ctx: the repository rule context object
  """
  sh_path = repository_ctx.os.environ.get("BAZEL_SH")
  if not sh_path:
    if _is_windows(repository_ctx):
      sh_path = repository_ctx.which("bash.exe")
      if sh_path:
        # When the Windows Subsystem for Linux is installed there's a
        # bash.exe under %WINDIR%\system32\bash.exe that launches Ubuntu
        # Bash which cannot run native Windows programs so it's not what
        # we want.
        windir = repository_ctx.os.environ.get("WINDIR")
        if windir and sh_path.startswith(windir):
          sh_path = None
    else:
      sh_path = repository_ctx.which("bash")
      if not sh_path:
        sh_path = repository_ctx.which("sh")

  if not sh_path:
    sh_path = ""

  if sh_path and _is_windows(repository_ctx):
    sh_path = sh_path.replace("\\", "/")

  repository_ctx.file("BUILD", """
load("@bazel_tools//tools/sh:sh_toolchain.bzl", "sh_toolchain")

sh_toolchain(
    name = "local_sh",
    path = "{sh_path}",
    visibility = ["//visibility:public"],
)

toolchain(
    name = "local_sh_toolchain",
    toolchain = ":local_sh",
    toolchain_type = "@bazel_tools//tools/sh:toolchain_type",
)
""".format(sh_path = sh_path))

sh_config = repository_rule(
    environ = [
        "WINDIR",
        "PATH",
    ],
    local = True,
    implementation = _sh_config_impl,
)

def sh_configure():
  """Detect the local shell interpreter and register its toolchain."""
  sh_config(name = "local_config_sh")
  native.register_toolchains("@local_config_sh//:local_sh_toolchain")
