# 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']

  mvn_cmd = ['$(exe //tools/maven:mvn)', '-v', version]
  api_cmd = mvn_cmd[:]
  api_targets = [ '//tools/maven:mvn' ]
  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 = [ '//tools/maven:mvn' ]
  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,
    )
