#!/usr/bin/env python
# Copyright (C) 2016 the V8 project authors. All rights reserved.
# This code is governed by the BSD license found in the LICENSE file.

from __future__ import print_function
import os, shutil, subprocess, sys

OUT_DIR = os.environ.get('OUT_DIR') or 'test'
SRC_DIR = os.environ.get('SRC_DIR') or 'src'
UPSTREAM = os.environ.get('UPSTREAM') or 'git@github.com:tc39/test262.git'
MAINTAINER = os.environ.get('MAINTAINER') or 'test262@ecma-international.org'

def shell(*args):
    sp = subprocess.Popen(list(args), stdout=subprocess.PIPE, universal_newlines=True)
    cmd_str = ' '.join(args)

    print('> ' + cmd_str)

    for line in iter(sp.stdout.readline, ''):
        sys.stdout.write(line)

    sp.communicate()

    if sp.returncode == 1:
        raise Exception('Command failed: ' + cmd_str)

targets = dict()
def target(*deps):
    def other(orig):
        def wrapped():
            print('Running target: ' + orig.__name__)

            for dep in deps:
                targets[dep]()
            return orig()
        wrapped.__name__ = orig.__name__
        targets[orig.__name__] = wrapped
        return wrapped
    return other

@target()
def build():
    shell(sys.executable, 'tools/generation/generator.py',
          'create',
          '--out', OUT_DIR,
          SRC_DIR)

@target()
def clean():
    shell(sys.executable, 'tools/generation/generator.py', 'clean', OUT_DIR)

@target('clean', 'build')
def deploy():
    shell('git', 'add', '--all', OUT_DIR)
    shell('git', 'commit', '--message', '"Re-build from source"')
    shell('git', 'push', UPSTREAM, 'main')
    shell('git', 'checkout', '-')

# Generate a deploy key for use in a continuous integration system, allowing
# for automated deployment in response to merge events.
@target()
def github_deploy_key():
    shell('ssh-keygen',
          '-t', 'rsa',
          '-b', '4096',
          '-C', MAINTAINER,
          '-f', 'github-deploy-key')

# Encrypt the deploy key so that it may be included in the repository (to be
# decrypted by the continuous integration server during automated deployment)
# This requires the "travis" Ruby gem
# Source: https://docs.travis-ci.com/user/encrypting-files/
@target('github_deploy_key')
def github_deploy_key_enc():
    shell('travis', 'login')
    shell('travis', 'encrypt-file', 'github-deploy-key')

if len(sys.argv) == 1:
    targets['build']()

for target in sys.argv[1:]:
    if not target in targets:
        sys.stderr.write('No target named: "' + target + '".\n' +
            'Available targets: ' + ', '.join(list(targets)) + '\n')
        sys.exit(1)
    targets[target]()
