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

def maven_package(
    version,
    repository = None,
    url = None,
    jar = {},
    src = {}):
  cmd = ['$(exe //tools/maven:mvn)', '-v', version, '-o', '$OUT']
  dep = []

  for type,d in [('jar', jar), ('java-source', src)]:
    for a,t in d.iteritems():
      cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
      dep.append(t)

  genrule(
    name = 'install',
    cmd = ' '.join(cmd + ['-a', 'install']),
    deps = dep + ['//tools/maven:mvn'],
    out = 'install.info',
  )

  if repository and url:
    genrule(
      name = 'deploy',
      cmd = ' '.join(cmd + [
        '-a', 'deploy',
        '--repository', repository,
        '--url', url]),
      deps = dep + ['//tools/maven:mvn'],
      out = 'deploy.info',
    )
