from common import *
import hashlib
import shutil
import signal
import tarfile
import time
assert not (R/'build.json').exists() and not (R/'build-started.json').exists()
paths=['tools/rtsp_test.py','tools/rtsp_test_prepare.py','native/frame_metadata/rtp_time.hpp',
       'tests/test_rtsp_prepare.py','tests/test_metadata_demo_limits.py']
hashes={f:g.sha(REPO/f) for f in paths}
digest=hashlib.sha256(json.dumps(hashes,sort_keys=True).encode()).hexdigest()
tag='contextra-analytics:rtsp-compat-cb2a990-'+digest[:8]
assert subprocess.run(['docker','image','inspect',tag],capture_output=True).returncode != 0
snap=R/'snapshot';snap.mkdir(mode=0o700)
process=subprocess.Popen(['git','-C',str(REPO),'archive',HEAD],stdout=subprocess.PIPE)
with tarfile.open(fileobj=process.stdout,mode='r|') as archive:archive.extractall(snap,filter='data')
assert process.wait()==0
for f in paths:shutil.copyfile(REPO/f,snap/f)
save('source.json',dict(head=HEAD,hashes=hashes,tag=tag))
root=json.loads((R/'plan.json').read_text())['docker_root'];free=lambda:shutil.disk_usage(root).free
assert free()>15*1024**3
save('build-started.json',dict(tag=tag))
l=json.loads((R/'ledger.json').read_text());l['build']=1;save('ledger.json',l)
start=time.monotonic();aborted=False
with (R/'build.log').open('x') as log:
    proc=subprocess.Popen(['docker','build','-f','docker/Dockerfile','--target','app','-t',tag,'.'],cwd=snap,
        env=dict(os.environ,DOCKER_BUILDKIT='1'),stdout=log,stderr=log,start_new_session=True)
    while proc.poll() is None:
        if time.monotonic()-start>1200 or free()<15*1024**3:
            aborted=True;os.killpg(proc.pid,signal.SIGTERM)
            try:proc.wait(10)
            except subprocess.TimeoutExpired:os.killpg(proc.pid,signal.SIGKILL)
            break
        time.sleep(1)
    code=proc.wait()
result=dict(tag=tag,code=code,aborted=aborted,elapsed_seconds=time.monotonic()-start)
if code==0:result['image_id']=json.loads(g.sh(['docker','image','inspect',tag]))[0]['Id']
save('build.json',result);print(json.dumps(result));assert code==0 and not aborted
