Spaces:
Running
Running
| @echo off | |
| setlocal EnableExtensions EnableDelayedExpansion | |
| set "SPACE_REPO=https://huggingface.co/spaces/kmkarakaya/dergitarama" | |
| set "COMMIT_MESSAGE=Deploy Murat Karakaya Akademi Dergi Tarama to HF Space" | |
| set "SOURCE_DIR=%~dp0" | |
| set "WORK_DIR=" | |
| set "TEMP_WORK_DIR_CREATED=0" | |
| set "DRY_RUN=0" | |
| set "SKIP_DOCKER_CHECK=0" | |
| set "GIT_XET_PATH=C:\Program Files\Git-Xet" | |
| set "DOCKER_TAG=murat-karakaya-akademi-dergi-tarama-hf-preflight" | |
| set "DOCKER_CONTAINER=murat-karakaya-akademi-dergi-tarama-hf-preflight-container" | |
| set "DOCKER_TEST_PORT=8870" | |
| if "%SOURCE_DIR:~-1%"=="\" set "SOURCE_DIR=%SOURCE_DIR:~0,-1%" | |
| if exist "%GIT_XET_PATH%\git-xet.exe" set "PATH=%GIT_XET_PATH%;%PATH%" | |
| set "POSITIONAL_INDEX=0" | |
| :parse_args | |
| if "%~1"=="" goto :args_done | |
| if /I "%~1"=="/help" goto :help | |
| if /I "%~1"=="-h" goto :help | |
| if /I "%~1"=="--help" goto :help | |
| if /I "%~1"=="/dry-run" ( | |
| set "DRY_RUN=1" | |
| shift | |
| goto :parse_args | |
| ) | |
| if /I "%~1"=="/skip-docker-check" ( | |
| set "SKIP_DOCKER_CHECK=1" | |
| shift | |
| goto :parse_args | |
| ) | |
| set /a POSITIONAL_INDEX+=1 | |
| if %POSITIONAL_INDEX%==1 set "SPACE_REPO=%~1" | |
| if %POSITIONAL_INDEX%==2 set "COMMIT_MESSAGE=%~1" | |
| shift | |
| goto :parse_args | |
| :args_done | |
| echo [1/7] Checking required tools and files... | |
| where git >nul 2>nul || ( | |
| echo ERROR: git not found in PATH. | |
| exit /b 1 | |
| ) | |
| where robocopy >nul 2>nul || ( | |
| echo ERROR: robocopy not found in PATH. | |
| exit /b 1 | |
| ) | |
| git xet --version >nul 2>nul || ( | |
| echo ERROR: git-xet is not installed. | |
| echo. | |
| echo Hugging Face rejected the Excel files because binary files must be pushed through Xet storage. | |
| echo Install it on Windows with one of these options: | |
| echo winget install git-xet | |
| echo or install the MSI from the git-xet Windows release page | |
| echo. | |
| echo Then run: | |
| echo "C:\Program Files\Git-Xet\git-xet.exe" install | |
| echo. | |
| echo After that, rerun this script. | |
| exit /b 1 | |
| ) | |
| for %%F in ("Dockerfile" "README.md" "requirements.txt" "app.py" "journal_engine.py" "ubyt.xlsx" "Elsevier.xlsx" "Wiley.xlsx") do ( | |
| if not exist "%SOURCE_DIR%\%%~F" ( | |
| echo ERROR: Required file missing: %SOURCE_DIR%\%%~F | |
| exit /b 1 | |
| ) | |
| ) | |
| for %%F in ("static\index.html" "static\app.js" "static\styles.css") do ( | |
| if not exist "%SOURCE_DIR%\%%~F" ( | |
| echo ERROR: Required file missing: %SOURCE_DIR%\%%~F | |
| exit /b 1 | |
| ) | |
| ) | |
| findstr /B /C:"sdk: docker" "%SOURCE_DIR%\README.md" >nul || ( | |
| echo ERROR: README.md is missing `sdk: docker` in the YAML frontmatter. | |
| exit /b 1 | |
| ) | |
| findstr /B /C:"app_port: 7860" "%SOURCE_DIR%\README.md" >nul || ( | |
| echo ERROR: README.md is missing `app_port: 7860` in the YAML frontmatter. | |
| exit /b 1 | |
| ) | |
| echo Source repo : %SOURCE_DIR% | |
| echo HF Space : %SPACE_REPO% | |
| echo Commit msg : %COMMIT_MESSAGE% | |
| if "%DRY_RUN%"=="1" ( | |
| echo. | |
| echo Dry run enabled. No files will be copied or pushed. | |
| exit /b 0 | |
| ) | |
| echo. | |
| echo [2/7] Validating Docker build... | |
| if "%SKIP_DOCKER_CHECK%"=="1" ( | |
| echo Docker preflight skipped by request. | |
| ) else ( | |
| where docker >nul 2>nul || ( | |
| echo ERROR: docker not found in PATH. Use /skip-docker-check to bypass this preflight. | |
| exit /b 1 | |
| ) | |
| where powershell >nul 2>nul || ( | |
| echo ERROR: powershell not found in PATH. Use /skip-docker-check to bypass this preflight. | |
| exit /b 1 | |
| ) | |
| docker rm -f %DOCKER_CONTAINER% >nul 2>nul | |
| docker build -t %DOCKER_TAG% "%SOURCE_DIR%" || ( | |
| echo ERROR: docker build failed. Aborting push. | |
| exit /b 1 | |
| ) | |
| docker run -d --rm --name %DOCKER_CONTAINER% -p %DOCKER_TEST_PORT%:7860 %DOCKER_TAG% >nul || ( | |
| echo ERROR: docker container failed to start. Aborting push. | |
| docker image rm %DOCKER_TAG% >nul 2>nul | |
| exit /b 1 | |
| ) | |
| powershell -NoProfile -Command "$deadline=(Get-Date).AddSeconds(30); $ok=$false; while((Get-Date) -lt $deadline){ try { $response=Invoke-RestMethod -Uri 'http://127.0.0.1:%DOCKER_TEST_PORT%/health' -TimeoutSec 3; if ($response.status -eq 'ok') { $ok=$true; break } } catch {}; Start-Sleep -Milliseconds 500 }; if(-not $ok){ exit 1 }" || ( | |
| echo ERROR: docker container started but /health did not return status ok. | |
| echo --- container logs --- | |
| docker logs %DOCKER_CONTAINER% | |
| docker rm -f %DOCKER_CONTAINER% >nul 2>nul | |
| docker image rm %DOCKER_TAG% >nul 2>nul | |
| exit /b 1 | |
| ) | |
| docker rm -f %DOCKER_CONTAINER% >nul 2>nul | |
| docker image rm %DOCKER_TAG% >nul 2>nul | |
| ) | |
| echo. | |
| echo [3/7] Preparing temporary HF Space clone... | |
| set "WORK_DIR=%TEMP%\hf-space-%RANDOM%%RANDOM%" | |
| set "TEMP_WORK_DIR_CREATED=1" | |
| echo Temporary dir: %WORK_DIR% | |
| git clone "%SPACE_REPO%" "%WORK_DIR%" || goto :fail_cleanup | |
| git -C "%WORK_DIR%" fetch origin || goto :fail_cleanup | |
| git -C "%WORK_DIR%" checkout main || goto :fail_cleanup | |
| git -C "%WORK_DIR%" reset --hard origin/main || goto :fail_cleanup | |
| git -C "%WORK_DIR%" clean -fd || goto :fail_cleanup | |
| echo. | |
| echo [4/7] Syncing files to Space working tree... | |
| robocopy "%SOURCE_DIR%" "%WORK_DIR%" /MIR /XD .git .venv __pycache__ .pytest_cache .mypy_cache .vscode node_modules /XF "~$*.xlsx" | |
| set "ROBOCOPY_EXIT=%ERRORLEVEL%" | |
| if %ROBOCOPY_EXIT% GEQ 8 ( | |
| echo ERROR: robocopy failed with exit code %ROBOCOPY_EXIT%. | |
| goto :robocopy_fail | |
| ) | |
| del /Q "%WORK_DIR%\~$*.xlsx" 2>nul | |
| echo. | |
| echo [5/7] Checking for changes... | |
| pushd "%WORK_DIR%" || exit /b 1 | |
| set "HAS_CHANGES=0" | |
| for /f "delims=" %%I in ('git status --porcelain') do ( | |
| set "HAS_CHANGES=1" | |
| goto :changes_found | |
| ) | |
| :changes_found | |
| if "%HAS_CHANGES%"=="0" ( | |
| echo No changes detected. Nothing to commit. | |
| popd | |
| goto :success_cleanup | |
| ) | |
| echo. | |
| echo [6/7] Creating commit... | |
| git add . || ( | |
| popd | |
| goto :fail_cleanup | |
| ) | |
| git diff --cached --quiet && ( | |
| echo No staged changes detected after sync. Nothing to commit. | |
| popd | |
| goto :success_cleanup | |
| ) | |
| git commit -m "%COMMIT_MESSAGE%" || ( | |
| echo ERROR: git commit failed. | |
| popd | |
| goto :fail_cleanup | |
| ) | |
| echo. | |
| echo [7/7] Pushing to Hugging Face Space... | |
| git push origin HEAD || ( | |
| echo ERROR: git push failed. | |
| popd | |
| goto :fail_cleanup | |
| ) | |
| popd | |
| call :cleanup_work_dir | |
| echo. | |
| echo Done. Check build logs at: | |
| echo %SPACE_REPO% | |
| exit /b 0 | |
| :robocopy_fail | |
| call :cleanup_work_dir | |
| exit /b %ROBOCOPY_EXIT% | |
| :fail_cleanup | |
| call :cleanup_work_dir | |
| exit /b 1 | |
| :success_cleanup | |
| call :cleanup_work_dir | |
| exit /b 0 | |
| :cleanup_work_dir | |
| if "%TEMP_WORK_DIR_CREATED%"=="1" if defined WORK_DIR if exist "%WORK_DIR%" rmdir /S /Q "%WORK_DIR%" 2>nul | |
| exit /b 0 | |
| :help | |
| echo Usage: | |
| echo push_hf_space.bat [/dry-run] [/skip-docker-check] [space_repo] [commit_message] | |
| echo. | |
| echo Examples: | |
| echo push_hf_space.bat | |
| echo push_hf_space.bat /dry-run | |
| echo push_hf_space.bat /skip-docker-check | |
| echo push_hf_space.bat https://huggingface.co/spaces/kmkarakaya/dergitarama "Deploy latest app" | |
| exit /b 0 |