#!/usr/bin/env '%interpreter%'

import os
import tempfile
import shutil
import signal
import sys
import subprocess
import zipfile

PYTHON_BINARY = '%interpreter%'
MAIN_FILE = '%main%'
PYTHON_PATH = 'PYTHONPATH'

# Don't imply 'import site' on initialization
PYTHON_ARG = '-S'

def Main():
  args = sys.argv[1:]

  runfiles_path = tempfile.mkdtemp(prefix="Soong.python_")
  try:
    zf = zipfile.ZipFile(os.path.dirname(__file__))
    zf.extractall(runfiles_path)
    zf.close()

    new_python_path = runfiles_path
    old_python_path = os.environ.get(PYTHON_PATH)

    if old_python_path:
      os.environ.update({PYTHON_PATH: new_python_path + ":" + old_python_path})
    else:
      os.environ.update({PYTHON_PATH: new_python_path})

    # Now look for main python source file.
    main_filepath = os.path.join(runfiles_path, MAIN_FILE)
    assert os.path.exists(main_filepath), \
           'Cannot exec() %r: file not found.' % main_filepath
    assert os.access(main_filepath, os.R_OK), \
           'Cannot exec() %r: file not readable.' % main_filepath

    args = [PYTHON_BINARY, PYTHON_ARG, main_filepath] + args

    sys.stdout.flush()
    # close_fds=False so that you can run binaries with files provided on the command line:
    # my_python_app --file <(echo foo)
    p = subprocess.Popen(args, close_fds=False)

    def handler(sig, frame):
      p.send_signal(sig)

    # Redirect SIGINT and SIGTERM to subprocess
    signal.signal(signal.SIGINT, handler)
    signal.signal(signal.SIGTERM, handler)

    p.wait()

    sys.exit(p.returncode)
  finally:
    shutil.rmtree(runfiles_path, ignore_errors=True)

if __name__ == '__main__':
  Main()
