#!/usr/bin/env python # Copyright (C) 2015 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 argparse import ArgumentParser from json import loads from os import environ, path, remove from subprocess import check_call, check_output, Popen, PIPE from sys import stderr from tempfile import mkstemp def locations(): d = Popen('buck audit dependencies api'.split(), stdin=None, stdout=PIPE, stderr=PIPE) t = Popen('xargs buck targets --show_output'.split(), stdin=d.stdout, stdout=PIPE, stderr=PIPE) out = t.communicate()[0] d.wait() targets = [] outs = [] for e in out.strip().split('\n'): t, o = e.split() targets.append(t) outs.append(o) return dict(zip(targets, outs)) parser = ArgumentParser() parser.add_argument('-n', '--dryrun', action='store_true') parser.add_argument('-v', '--verbose', action='store_true') subparsers = parser.add_subparsers(help='action', dest='action') subparsers.add_parser('deploy', help='Deploy to Maven (remote)') subparsers.add_parser('install', help='Install to Maven (local)') args = parser.parse_args() root = path.abspath(__file__) while not path.exists(path.join(root, '.buckconfig')): root = path.dirname(root) if not args.dryrun: check_call('buck build api'.split()) target = check_output(('buck targets --json api_%s' % args.action).split()) s = loads(target)[0]['cmd'] fd, tempfile = mkstemp() s = s.replace('$(exe //tools/maven:mvn)', path.join(root, 'tools/maven/mvn.py')) s = s.replace('-o $OUT', '-o %s' % tempfile) locations = locations() while '$(location' in s: start = s.index('$(location') end = s.index(')', start) target = s[start+11:end] s = s.replace(s[start:end+1], locations[target]) try: if args.verbose or args.dryrun or environ.get('VERBOSE'): print(s, file=stderr) if not args.dryrun: check_call(s.split()) finally: remove(tempfile)