"""V8.24 isolated regression with per-batch deadline and raw logs.""" import argparse,datetime,json,subprocess,sys,time from pathlib import Path ROOT=Path(__file__).resolve().parents[1] def main(): ap=argparse.ArgumentParser();ap.add_argument('--timeout',type=int,default=50);ap.add_argument('--group-size',type=int,default=3);args=ap.parse_args() all_files=sorted((ROOT/'tests').glob('test_*.py')) groups=[all_files[i:i+args.group_size] for i in range(0,len(all_files),args.group_size)] dest=ROOT/'reports/v825-regression';dest.mkdir(parents=True,exist_ok=True) outcomes=[] for index,files in enumerate(groups,1): start=time.monotonic();command=[sys.executable,'-m','pytest','-q',*[str(f.relative_to(ROOT)) for f in files]] try: proc=subprocess.run(command,cwd=ROOT,capture_output=True,text=True,timeout=args.timeout) code=proc.returncode;output=proc.stdout+'\n'+proc.stderr;status='passed' if code==0 else 'failed' except subprocess.TimeoutExpired as e: output=(e.stdout or b'').decode(errors='replace') if isinstance(e.stdout,bytes) else (e.stdout or '') output+='\nTIMEOUT exceeded';status='timeout' elapsed=round(time.monotonic()-start,2) (dest/f'batch-{index:02}.log').write_text(output,encoding='utf-8') outcomes.append({'batch':index,'files':[f.name for f in files],'status':status,'seconds':elapsed,'summary':output[-350:]}) print(f'[{index:02}/{len(groups)}] {status.upper()} {elapsed:.1f}s: '+', '.join(f.name for f in files),flush=True) result={'version':'8.25.0-dev.1','generated_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'groups':outcomes,'all_passed':all(x['status']=='passed' for x in outcomes)} (dest/'result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8') print('RESULT:',result['all_passed'],sum(x['status']=='passed' for x in outcomes),len(groups),flush=True) return 0 if result['all_passed'] else 1 if __name__=='__main__':raise SystemExit(main())