#!/usr/bin/env python
# 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.

from __future__ import print_function
from optparse import OptionParser
from os import path, environ
from subprocess import check_output, CalledProcessError
from sys import stderr

opts = OptionParser()
opts.add_option('--repository', help='maven repository id')
opts.add_option('--url', help='maven repository url')
opts.add_option('-o')
opts.add_option('-a', help='action (valid actions are: install,deploy)')
opts.add_option('-v', help='gerrit version')
opts.add_option('-s', action='append', help='triplet of artifactId:type:path')

args, ctx = opts.parse_args()
if not args.v:
    print('version is empty', file=stderr)
    exit(1)

root = path.abspath(__file__)
while not path.exists(path.join(root, 'WORKSPACE')):
    root = path.dirname(root)

if 'install' == args.a:
    cmd = [
        'mvn',
        'install:install-file',
        '-Dversion=%s' % args.v,
    ]
elif 'deploy' == args.a:
    cmd = [
        'mvn',
        'gpg:sign-and-deploy-file',
        '-DrepositoryId=%s' % args.repository,
        '-Durl=%s' % args.url,
    ]
else:
    print("unknown action -a %s" % args.a, file=stderr)
    exit(1)

for spec in args.s:
    artifact, packaging_type, src = spec.split(':')
    exe = cmd + [
        '-DpomFile=%s' % path.join(root, 'tools', 'maven',
                                   '%s_pom.xml' % artifact),
        '-Dpackaging=%s' % packaging_type,
        '-Dfile=%s' % src,
    ]
    try:
        if environ.get('VERBOSE'):
            print(' '.join(exe), file=stderr)
        check_output(exe)
    except Exception as e:
        print('%s command failed: %s\n%s' % (args.a, ' '.join(exe), e),
              file=stderr)
        if environ.get('VERBOSE') and isinstance(e, CalledProcessError):
            print('Command output\n%s' % e.output, file=stderr)
        exit(1)


out = stderr
if args.o:
    out = open(args.o, 'w')

with out as fd:
    if args.repository:
        print('Repository: %s' % args.repository, file=fd)
    if args.url:
        print('URL: %s' % args.url, file=fd)
    print('Version: %s' % args.v, file=fd)
