#!/usr/bin/python

from argparse import ArgumentParser
from os import environ, makedirs, path, symlink
from sys import exit, stderr
from subprocess import check_output, Popen

def call(cmd, cwd = None):
  p = Popen(cmd, cwd = cwd)
  p.communicate()
  if p.returncode != 0:
    exit(p.returncode)

parser = ArgumentParser()
parser.add_argument('-o')
parser.add_argument('--lib', nargs='*')
parser.add_argument('--pgmlib', nargs='*')
parser.add_argument('--war', nargs='*')
args = parser.parse_args()

war = environ['TMP']
root = war[0:war.index('buck-out/')]
libdir = path.join(war, 'WEB-INF', 'lib')
pgmdir = path.join(war, 'WEB-INF', 'pgm-lib')
jars = set()

if args.lib:
  makedirs(libdir)
  cp = check_output(['buck', 'audit', 'classpath'] + args.lib)
  for j in cp.strip().split('\n'):
    jars.add(j)
    if j.startswith('buck-out/gen/gerrit-'):
      n = j.split('/')[2] + '-' + path.basename(j)
    else:
      n = path.basename(j)
    symlink(
      path.join(root, j),
      path.join(libdir, n))

if args.pgmlib:
  makedirs(pgmdir)
  cp = check_output(['buck', 'audit', 'classpath'] + args.pgmlib)
  for j in cp.strip().split('\n'):
    if j in jars:
      continue
    if j.startswith('buck-out/gen/gerrit-'):
      n = j.split('/')[2] + '-' + path.basename(j)
    else:
      n = path.basename(j)
    symlink(
      path.join(root, j),
      path.join(pgmdir, n))

if args.war:
  for s in args.war:
    call(['unzip', '-q', '-d', war, s])

call(['zip', '-9qr', args.o, '.'], cwd = war)
