# Copyright 2017 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.

# The Eclipse website provides SHA-512 but Bazel only support SHA256.
# Really Bazel should start supporting all "safe" checksum (and also
# drop support for SHA-1).
SHA256_SUM={
    # TODO(dmarting): we only support 4.5.2 right now because we need to
    # download all version of eclipse to provide those checksums...
    "4.5.2": {
        "macosx-cocoa-x86_64": "755f8a75075f6310a8d0453b5766a84aca2fcc687808341b7a657259230b490f",
        "linux-gtk-x86_64": "87f82b0c13c245ee20928557dbc4435657d1e029f72d9135683c8d585c69ba8d"
    }
}

def _get_file_url(version, platform, t):
  drop = "drops"
  if int(version.split(".", 1)[0]) >= 4:
    drop = "drops4"
  short_version = version.split("-", 1)[0]
  sha256 = ""
  if short_version in SHA256_SUM:
    if platform in SHA256_SUM[short_version]:
      sha256 = SHA256_SUM[short_version][platform]

  filename = "eclipse-SDK-%s-%s.%s" % (short_version, platform, t)
  file = "/eclipse/downloads/%s/R-%s/%s" % (
      drop,
      version,
      filename)
  # This is a mirror, original base url is http://www.eclipse.org/downloads/download.php?file= 
  base_url = "https://storage.googleapis.com/bazel-mirror/download.eclipse.org"
  return (base_url + file, sha256)


def _eclipse_platform_impl(rctx):
  version = rctx.attr.version
  os_name = rctx.os.name.lower()
  if os_name.startswith("mac os"):
    platform = "macosx-cocoa-x86_64"
    t = "tar.gz"
  elif os_name.startswith("linux"):
    platform = "linux-gtk-x86_64"
    t = "tar.gz"
  else:
    fail("Cannot fetch Eclipse for platform %s" % rctx.os.name)
  url, sha256 = _get_file_url(version, platform, t)
  rctx.download_and_extract(url=url, type=t, sha256=sha256)
  rctx.file("BUILD.bazel", """
package(default_visibility = ["//visibility:public"])
filegroup(name = "platform", srcs = glob(["**"], exclude = ["BUILD.bazel", "BUILD"]))
filegroup(name = "launcher", srcs = glob(["**/plugins/org.eclipse.equinox.launcher_*.jar"]))
""")


eclipse_platform = repository_rule(
  implementation = _eclipse_platform_impl,
  attrs = {
    "version": attr.string(mandatory=True),
  }, local=False)
"""A repository for downloading the good version eclipse depending on the platform.""" 
