#!/usr/bin/env python3

import os
import re
import signal
import subprocess as sp
import sys

MAX_PARALLELISM = 16
make_flags = os.environ.get('MAKEFLAGS')

print(make_flags)

write_fd = None
job_slots = b''


def handle(signum, frame):
    del signum
    del frame
    sys.exit(0)


signal.signal(signal.SIGHUP, handle)
signal.signal(signal.SIGINT, handle)
signal.signal(signal.SIGQUIT, handle)
signal.signal(signal.SIGABRT, handle)
signal.signal(signal.SIGTERM, handle)

try:
    if make_flags is not None:
        if re.search('^[^ ]*n', make_flags) is not None:
            sys.exit(0)
        match = re.search('--jobserver-(fds|auth)=([^,]+),([^ ])+', make_flags)
        if match is not None:
            read_fd = int(match[2])
            write_fd = int(match[3])
            job_slots = os.read(read_fd, MAX_PARALLELISM - 1)
    available_cores = len(job_slots) + 1
    if available_cores > 1 and available_cores % 2 == 1:
        os.write(write_fd, job_slots[-1:])
        job_slots = job_slots[:-1]
    parallelism = max(1, available_cores // 2)
    print(f'PARALLELISM={parallelism} ./gradlew {" ".join(sys.argv[1:])}')
    os.environ['PARALLELISM'] = str(parallelism)
    del os.environ['MAKEFLAGS']
    cp = sp.run(["./gradlew", *sys.argv[1:]])
    sys.exit(cp.returncode)
finally:
    if write_fd:
        os.write(write_fd, job_slots)
