# Copyright (C) 2016 The Android Open Source Project
#
# 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.

sh_bang_template = (" && ".join([
    "echo '#!/bin/bash -e' > $@",
    "echo \"# this script should run from the root of your workspace.\" >> $@",
    "echo \"\" >> $@",
    "echo 'if [[ \"$$VERBOSE\" ]]; then set -x ; fi' >> $@",
    "echo \"\" >> $@",
    "echo %s >> $@",
    "echo \"\" >> $@",
    "echo 'python $$OUTPUT_BASE/%s' >> $@",
]))

def maven_package(
    version,
    group,
    repository = None,
    url = None,
    jar = {},
    src = {},
    doc = {}):

  build_cmd = ['bazel', 'build']
  mvn_cmd = [
    '$(location @com_googlesource_gerrit_bazlets//tools/maven:mvn.py)',
    '-v', version,
    '-g', group,
    '-r', '.',
  ]
  api_cmd = mvn_cmd[:]
  api_targets = []
  for type,d in [('jar', jar), ('java-source', src), ('javadoc', doc)]:
    for a,t in sorted(d.items()):
      api_cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
      api_targets.append(t)

  native.genrule(
    name = 'gen_api_install',
    cmd = sh_bang_template % (
      ' '.join(build_cmd + api_targets),
      ' '.join(api_cmd + ['-a', 'install'])),
    srcs = api_targets + ["@com_googlesource_gerrit_bazlets//tools/maven:mvn.py"],
    outs = ['api_install.sh'],
    executable = True,
    testonly = 1,
  )

  if repository and url:
    native.genrule(
      name = 'gen_api_deploy',
      cmd = sh_bang_template % (
        ' '.join(build_cmd + api_targets),
        ' '.join(api_cmd + ['-a', 'deploy',
                            '--repository', repository,
                            '--url', url])),
      srcs = api_targets + ["@com_googlesource_gerrit_bazlets//tools/maven:mvn.py"],
      outs = ['api_deploy.sh'],
      executable = True,
      testonly = 1,
    )
