# Copyright 2016 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.
"""Rule for importing the docker binary for tests (experimental)."""

def _impl(ctx):
  docker = ctx.which("docker")
  if docker == None:
    # We cannot find docker, we won't be able to run tests depending
    # on it, silently ignoring.
    ctx.file("BUILD",
             "\n".join([
                 "filegroup(",
                 "    name = 'docker',",
                 "    visibility = ['//visibility:public'],",
                 ")"
                 ]))
  else:
    exports = []
    for k in ctx.os.environ:
      # DOCKER* environment variable are used by the docker client
      # to know how to talk to the docker daemon.
      if k.startswith("DOCKER"):
        exports.append("export %s='%s'" % (k, ctx.os.environ[k]))
    ctx.symlink(docker, "docker-bin")
    ctx.file("docker.sh", "\n".join([
        "#!/bin/bash",
        "\n".join(exports),
"""BIN="$0"
while [ -L "${BIN}" ]; do
  BIN="$(readlink "${BIN}")"
done
exec "${BIN%%.sh}-bin" "$@"
"""]))
    ctx.file("BUILD", "\n".join([
        "sh_binary(",
        "    name = 'docker',",
        "    srcs = ['docker.sh'],",
        "    data = [':docker-bin'],",
        "    visibility = ['//visibility:public'],",
        ")"]))

docker_repository_ = repository_rule(_impl)

def docker_repository():
  """Declare a @docker repository that provide a docker binary."""
  docker_repository_(name = "docker")
