| @echo off |
| setlocal EnableDelayedExpansion |
| |
| set BUILDIFIER_SHORT_PATH={BUILDIFIER_SHORT_PATH} |
| set EXTRA_ARGS={ARGS} |
| set WORKSPACE={WORKSPACE} |
| |
| REM When --enable_runfiles, we should be able to locate buildifier directly through symlink. |
| set buildifier_path=%BUILDIFIER_SHORT_PATH:/=\% |
| for %%I in (%buildifier_path%) do ( |
| set "buildifier_path=%%~fI" |
| ) |
| |
| set manifest_path=MANIFEST |
| if not exist %manifest_path% ( |
| set manifest_path=..\MANIFEST |
| ) |
| if not exist %manifest_path% ( |
| echo a MANIFEST file cannot be found |
| exit /b 1 |
| ) |
| |
| REM find the workspace directory in manifest. |
| REM No good way in bat to read path of a symlink's target |
| set workspace_dir= |
| for /F "tokens=2 delims= " %%F IN ('findstr /l /c:"WORKSPACE" %manifest_path%') DO ( |
| set "workspace_dir=%%~dpF" |
| ) |
| |
| REM If the buildifier isn't immediately available via short_path from |
| REM current directory, then parse the MANIFEST file to find buildifier. |
| if not exist !buildifier_path! ( |
| for /F "tokens=2 delims= " %%F IN ('findstr /l /c:"buildifier.exe" %manifest_path%') DO ( |
| set "buildifier_path=%%F" |
| ) |
| ) |
| |
| if not exist !buildifier_path! ( |
| echo Failed to find buildifier at !buildifier_path! |
| exit /b 1 |
| ) |
| |
| if defined BUILD_WORKSPACE_DIRECTORY ( |
| rem either a build, or a run/build inside a test |
| echo cd %BUILD_WORKSPACE_DIRECTORY% |
| cd %BUILD_WORKSPACE_DIRECTORY% |
| ) else if defined TEST_WORKSPACE ( |
| if defined workspace_dir ( |
| echo cd: %workspace_dir% |
| cd %workspace_dir% |
| ) else ( |
| REM this path doesn't seem required in bazel 7.2; manifest is always present |
| echo set follow_links=1 |
| set follow_links=1 |
| ) |
| ) else ( |
| echo Failed to find workspace to check |
| ) |
| |
| call :collectFiles . |
| |
| if !files_to_analyze! == "" ( |
| echo Failed to find files to analyze |
| exit /b 1 |
| ) |
| echo !buildifier_path! %EXTRA_ARGS% !files_to_analyze! |
| !buildifier_path! %EXTRA_ARGS% !files_to_analyze! |
| |
| exit /b !ERRORLEVEL! |
| |
| REM Utility function to collect all wanted files. |
| REM Exclude patterns are not supported by `dir.exe`. |
| :collectFiles |
| REM First, files. Include symlinked files when traversing runfiles. |
| pushd %~1 |
| REM echo collecting in %cd% |
| set file_attributes=-d-l-h |
| if defined follow_links set file_attributes=-d-h |
| FOR /F %%f IN ('dir /b/a:!file_attributes! *.bzl *.sky *.bazel *.BUILD BUILD BUILD.*.oss WORKSPACE WORKSPACE.bzlmod WORKSPACE.oss WORKSPACE.*.oss 2^>nul') DO ( |
| set FILE=%~1\%%f |
| REM remove .\ prefix |
| set FILE=!FILE:.\=! |
| REM echo Found %~1\%%f adding !FILE! |
| set files_to_analyze=!files_to_analyze! !FILE! |
| ) |
| popd |
| |
| REM Next, directories. |
| REM |
| REM Interestingly, turning on the exclude hidden files option (-h) excludes the |
| REM `.git` directory but not other directories starting with a `.` like |
| REM `.github` or `.bcr`. I don't know why it works this way, but hey it works. |
| if defined follow_links ( |
| FOR /F %%d IN ('dir /b/a:d-h %~1 2^>nul') DO ( |
| call :collectFiles "%~1\%%d" |
| ) |
| ) else ( |
| FOR /F %%d IN ('dir /b/a:d-l-h %~1 2^>nul') DO ( |
| call :collectFiles "%~1\%%d" |
| ) |
| ) |