1+ @ echo off
2+ REM Usage:
3+ REM _pytest.bat urls.txt
4+ REM _pytest.bat https://host/a.tar.gz https://host/b.tgz
5+ REM From ChatGPT
6+
7+ setlocal EnableExtensions EnableDelayedExpansion
8+
9+ REM ---- temp workspace under %TEMP% ----
10+ set " TMPROOT = %TEMP% \remote_tests_%RANDOM%%RANDOM% "
11+ md " %TMPROOT% " || (echo Failed to create TMPROOT & exit /b 1)
12+
13+ REM ---- resolve args -> URL list file ----
14+ if " %~2 " == " " (
15+ if exist " %~1 " (
16+ set " URLS_FILE = %~f1 "
17+ ) else (
18+ set " URLS_FILE = %TMPROOT% \urls.txt"
19+ > " %URLS_FILE% " echo %~1
20+ )
21+ ) else (
22+ set " URLS_FILE = %TMPROOT% \urls.txt"
23+ (for %%U in (%* ) do @ echo %%~U ) > " %URLS_FILE% "
24+ )
25+
26+ pushd " %TMPROOT% " > nul || (echo Failed to enter TMPROOT & exit /b 1)
27+
28+ set /a i = 0
29+ set /a overall_ec = 0
30+
31+ REM read URL file line-by-line; hand off each line to a subroutine
32+ for /f " usebackq delims=" %%L in (" %URLS_FILE% " ) do call :process_one " %%L "
33+
34+ popd > nul
35+ rmdir /s /q " %TMPROOT% " > nul 2 >& 1
36+ exit /b %overall_ec%
37+
38+ REM ===================== subroutine =====================
39+ :process_one
40+ setlocal EnableExtensions EnableDelayedExpansion
41+
42+ REM grab the raw line and trim leading spaces
43+ set " url = %~1 "
44+ if " %url% " == " " (endlocal & goto :eof)
45+ :trim
46+ if not " %url:~0 ,1 % " == " " goto :trim_done
47+ set " url = %url:~1 % "
48+ goto trim
49+ :trim_done
50+
51+ REM skip comments
52+ if " %url:~0 ,1 % " == " #" (endlocal & goto :eof)
53+
54+ REM ----- do the work for this URL -----
55+ endlocal & set /a i += 1 & set " URL = %url% "
56+ echo(
57+ echo ==> [%i% ]
58+
59+ set " PKGDIR = %TMPROOT% \pkg_%i% "
60+ md " %PKGDIR% "
61+ pushd " %PKGDIR% " > nul || goto :after
62+
63+ REM download archive into PKGDIR
64+ curl -L --fail -o " archive.tar.gz" " %URL% "
65+ if errorlevel 1 (
66+ echo curl failed
67+ set /a overall_ec = 1
68+ popd > nul & goto :after
69+ )
70+
71+ REM extract (try gzip flags, then plain)
72+ tar -xzf " archive.tar.gz" > nul 2 >& 1
73+ if errorlevel 1 tar -xf " archive.tar.gz" > nul 2 >& 1
74+ if errorlevel 1 (
75+ echo tar extract failed
76+ set /a overall_ec = 1
77+ popd > nul & goto :after
78+ )
79+
80+ REM get first entry (try -tzf, then -tf)
81+ set " FIRST = "
82+ for /f " delims=" %%F in ('tar -tzf " archive.tar.gz" 2^ > nul ') do set " FIRST = %%F " & goto got_first
83+ for /f " delims=" %%F in ('tar -tf " archive.tar.gz" 2^ > nul ') do set " FIRST = %%F " & goto got_first
84+ :got_first
85+
86+ REM choose project root (top dir if present)
87+ set " PROJROOT = %CD% "
88+ if defined FIRST for /f " tokens=1 delims=/" %%T in (" %FIRST% " ) do if exist " .\%%T \" set " PROJROOT = %CD% \%%T "
89+
90+ REM mirror original: drop src\ if present
91+ if exist " %PROJROOT% \src\" rmdir /s /q " %PROJROOT% \src" > nul 2 >& 1
92+
93+ REM run pytest from repo root (with tests on PYTHONPATH if exists)
94+ pushd " %PROJROOT% " > nul
95+ echo Running pytest in: " %CD% "
96+ set " OLD_PYTHONPATH = %PYTHONPATH% "
97+ if exist " tests\" (
98+ if defined OLD_PYTHONPATH (
99+ set " PYTHONPATH = %CD% ;tests;%OLD_PYTHONPATH% "
100+ ) else (
101+ set " PYTHONPATH = %CD% ;tests"
102+ )
103+ ) else (
104+ if defined OLD_PYTHONPATH (
105+ set " PYTHONPATH = %CD% ;%OLD_PYTHONPATH% "
106+ ) else (
107+ set " PYTHONPATH = %CD% "
108+ )
109+ )
110+ pytest
111+ if errorlevel 1 set /a overall_ec = 1
112+ set " PYTHONPATH = %OLD_PYTHONPATH% "
113+ popd > nul
114+
115+ popd > nul
116+ :after
117+ rmdir /s /q " %PKGDIR% " > nul 2 >& 1
118+ goto :eof
0 commit comments