ruby/win32/ifchange.bat
Nobuyoshi Nakada b839989fd2 win32: Add CR to all batch files.
This reverts commit 23f9a0d655c4d405bb2397a147a1523436205486, "win32:
Strip CR from batch files", and add CR to the other batch files too.

`cmd.exe` seems to work well with LF at a glance, but sometimes `goto`
jumps to an unexpected line.  This is probably because it is looking
for the beginning of a line, assuming that all lines end with CRLF,
and as a result mistaking the `goto` operand for a label.
2026-01-26 18:17:45 +09:00

138 lines
3.2 KiB
Batchfile
Executable File

@echo off
:: usage: ifchange target temporary
@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1
:: @set PROMPT=$T:$S
for %%I in (%0) do set progname=%%~nI
set timestamp=
set keepsuffix=
set empty=
set color=auto
:optloop
set optarg=
:optnext
for %%I in (%1) do set opt=%%~I
if not "%opt:~0,2%" == "--" (
if not "%optarg%" == "" (
call set %optarg%=%%opt%%
shift
goto :optloop
)
goto :optend
)
if "%opt%" == "--" (
shift
goto :optend
)
if "%opt%" == "--timestamp" (
set timestamp=.
set optarg=timestamp
shift
goto :optnext
)
if "%opt:~0,12%" == "--timestamp=" (
set timestamp=%opt:~12%
shift
goto :optloop
)
if "%opt%" == "--keep" (
set keepsuffix=.old
set optarg=keep
shift
goto :optnext
)
if "%opt:~0,7%" == "--keep=" (
set keepsuffix=%opt:~7%
shift
goto :optloop
)
if "%opt%" == "--empty" (
set empty=yes
shift
goto :optloop
)
if "%opt%" == "--color" (
set color=always
set optarg=color
shift
goto :optnext
)
if "%opt:~0,8%" == "--color=" (
set color=%opt:~8%
shift
goto :optloop
)
if "%opt%" == "--debug" (
shift
echo on
goto :optloop
)
if "%opt%" == "--help" (
call :help
exit /b
)
echo %progname%: unknown option: %1 1>&2
exit /b 1
:optend
if "%2" == "" (
call :help 1>&2
exit /b 1
)
set dest=%1
set src=%2
set dest=%dest:/=\%
set src=%src:/=\%
if not "%src%" == "-" goto :srcfile
if not "%TMPDIR%" == "" (
set src=%TMPDIR%\ifchange%RANDOM%.tmp
) else if not "%TEMP%" == "" (
set src=%TEMP%\ifchange%RANDOM%.tmp
) else if not "%TMP%" == "" (
set src=%TMP%\ifchange%RANDOM%.tmp
) else (
set src=.\ifchange%RANDOM%.tmp
)
findstr -r -c:"^" > "%src%"
:srcfile
if exist %dest% (
if not exist %src% goto :nt_unchanged1
if not "%empty%" == "" for %%I in (%src%) do if %%~zI == 0 goto :nt_unchanged
fc.exe %dest% %src% > nul && (
:nt_unchanged
del %src%
:nt_unchanged1
for %%I in (%1) do echo %%~I unchanged
goto :nt_end
)
)
for %%I in (%1) do echo %%~I updated
del /f %dest% 2> nul
copy %src% %dest% > nul
del %src%
:nt_end
if "%timestamp%" == "" goto :end
if "%timestamp%" == "." (
for %%I in ("%dest%") do set timestamp=%%~dpI.time.%%~nxI
)
goto :end > "%timestamp%"
:help
for %%I in (
"usage: %progname% [options] target new-file"
"options:"
" --timestamp[=file] touch timestamp file. (default: prefixed with '.time')"
" under the directory of the target)"
" --keep[=suffix] keep old file with suffix. (default: '.old')"
" --empty assume unchanged if the new file is empty."
" --color[=always|auto|never] colorize output."
) do echo.%%~I
goto :eof
:end