# Copyright (C) 2013 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/sh -eu' > $OUT",
  'echo "# this script should run from the root of your workspace." >> $OUT',
  'echo "" >> $OUT',
  "echo 'if [[ -n \"$${VERBOSE:-}\" ]]; then set -x ; fi' >> $OUT",
  'echo "" >> $OUT',
  'echo %s >> $OUT',
  'echo "" >> $OUT',
  'echo %s >> $OUT',
  # This is supposed to be handled by executable=True, but it doesn't
  # work. Bug?
  'chmod +x $OUT' ]))

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

  build_cmd = ['buck', 'build']

  # This is not using python_binary() to avoid the baggage and bugs
  # that PEX brings along.
  mvn_cmd = ['python', 'tools/maven/mvn.py', '-v', version]
  api_cmd = mvn_cmd[:]
  api_targets = []
  for type,d in [('jar', jar), ('java-source', src), ('javadoc', doc)]:
    for a,t in sorted(d.iteritems()):
      api_cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
      api_targets.append(t)

  genrule(
    name = 'gen_api_install',
    cmd = sh_bang_template % (
      ' '.join(build_cmd + api_targets),
      ' '.join(api_cmd + ['-a', 'install'])),
    out = 'api_install.sh',
    executable = True,
  )

  if repository and url:
    genrule(
      name = 'gen_api_deploy',
      cmd = sh_bang_template % (
        ' '.join(build_cmd + api_targets),
        ' '.join(api_cmd + ['-a', 'deploy',
                            '--repository', repository,
                            '--url', url])),
      out = 'api_deploy.sh',
      executable = True,
    )

  war_cmd = mvn_cmd[:]
  war_targets = []
  for a,t in sorted(war.iteritems()):
    war_cmd.append('-s %s:war:$(location %s)' % (a,t))
    war_targets.append(t)

  genrule(
    name = 'gen_war_install',
    cmd = sh_bang_template % (' '.join(build_cmd + war_targets),
                              ' '.join(war_cmd + ['-a', 'install'])),
    out = 'war_install.sh',
    executable = True,
  )

  if repository and url:
    genrule(
      name = 'gen_war_deploy',
      cmd = sh_bang_template % (
          ' '.join(build_cmd + war_targets),
          ' '.join(war_cmd + [
        '-a', 'deploy',
        '--repository', repository,
        '--url', url])),
      out = 'war_deploy.sh',
      executable = True,
    )
