Skip to content

Instantly share code, notes, and snippets.

@h-mochizuki
Last active October 22, 2021 04:29
Show Gist options
  • Save h-mochizuki/a40421b4d10140e454f01c051be7926c to your computer and use it in GitHub Desktop.
Save h-mochizuki/a40421b4d10140e454f01c051be7926c to your computer and use it in GitHub Desktop.
SVNのコミット内容を順番に、ひとつずつマージしていくバッチ
@echo off
setlocal EnableDelayedExpansion
pushd "%~dp0" & set "SCRIPT_BASE=%CD%"
echo =================================================
echo 作業ブランチに特定リビジョンからマージします
echo =================================================
echo 作業を中断する場合は Ctrl+c をクリックしてください
ping -n 3 localhost>nul
rem -------------------------
rem クライアント・定数定義
rem -------------------------
rem 事前にマージ先の対象ブランチをチェックアウトしてください
set "WORKSPACE=myproject"
rem マージ元のSVNリポジトリURLを指定してください
set "FROM_URL=http://localhost/svn/yourproject/trunk"
:application_validate
echo;
echo [%DATE% %TIME:~0,-3%]Info: svnコマンドが使用可能かチェックします
where svn>nul 2>nul
if errorlevel 1 (
echo [%DATE% %TIME:~0,-3%]Error: svnコマンドが使用できません >&2
echo [%DATE% %TIME:~0,-3%]Error: svnクライアントをインストールしてください >&2
exit /b 1
)
:static_validate
echo;
echo [%DATE% %TIME:~0,-3%]Info: 定数内容をチェックします
if not exist %WORKSPACE% echo [%DATE% %TIME:~0,-3%]Error: 作業フォルダが見つかりません: %WORKSPACE% >&2 & exit /b 1
pushd "%WORKSPACE%"
echo ----------------------------------------------------------
echo [%DATE% %TIME:~0,-3%]Info: 作業フォルダ: %WORKSPACE%
svn info
echo ----------------------------------------------------------
echo [%DATE% %TIME:~0,-3%]Info: マージ元SVNリポジトリURL: %FROM_URL%
svn info %FROM_URL%
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: マージ元SVNリポジトリに接続できませんでした >&2 & exit /b 2
echo ----------------------------------------------------------
set "REV_TO=HEAD"
for /f "usebackq tokens=1,2" %%a in (`svn info %FROM_URL%`) do (
echo %%a|findstr /r "^リビジョン" >nul
if not errorlevel 1 (
set "MAX_REV=%%b"
) else (
echo %%a|findstr /r "^revision" >nul
if not errorlevel 1 set "MAX_REV=%%b"
)
)
if "x%MAX_REV%"=="x" echo [%DATE% %TIME:~0,-3%]Error: マージ元SVNリポジトリに接続できませんでした >&2 & exit /b 2
rem -------------------------
rem 入力値チェック
rem -------------------------
:input_validate
echo;
echo [%DATE% %TIME:~0,-3%]Info: 引数内容をチェックします
set "REV_FROM="
set "PARAM=%~1" & shift
if "x%PARAM%"=="x" (
echo [%DATE% %TIME:~0,-3%]Error: 開始リビジョン番号、もしくはリビジョンの範囲^(FROM[:TO]^)を指定してください >&2
exit /b 3
)
echo "%PARAM%" | findstr /c:":">nul
if errorlevel 1 (
echo %PARAM%| findstr /r "^[1-9][0-9]*$">nul
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: 引数には数値を入れてください & exit /b 2
if "%PARAM%" gtr "%MAX_REV%" (
echo [%DATE% %TIME:~0,-3%]Error: 現在のHEADリビジョン番号が %MAX_REV% です >&2
echo [%DATE% %TIME:~0,-3%]Error: それ以下の数値を入力するか、リビジョンの範囲^(FROM[:TO]^)を指定してください >&2
exit /b 3
)
set "REV_FROM=%PARAM%"
) else (
for /f "tokens=1,2 delims=:" %%a in ( "%PARAM%" ) do (
set "REV_FROM=%%a"
set "REV_TO=%%b"
echo %%a| findstr /r "^[1-9][0-9]*$">nul
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: 引数には数値を入れてください & exit /b 2
)
if not "x!REV_TO!"=="xHEAD" (
if "!REV_FROM!" gtr "!REV_TO!" (
echo [%DATE% %TIME:~0,-3%]Error: リビジョン開始番号^(!REV_FROM!^)より小さな数字がリビジョン終了番号に指定されています >&2
echo [%DATE% %TIME:~0,-3%]Error: 終了番号に !REV_FROM! 以上の数値を入力するか、HEADと入れることで最後のリビジョンまでマージできます >&2
exit /b 3
)
)
)
echo [%DATE% %TIME:~0,-3%]Info: マージ対象範囲は [%REV_FROM%]-[%REV_TO%] です
rem -------------------------
rem マージ対象範囲取得
rem -------------------------
:get_histories
echo;
echo [%DATE% %TIME:~0,-3%]Info: 対象範囲コミットログを取得します
echo %REV_FROM%:%REV_TO%>%SCRIPT_BASE%\.last_merege
del %SCRIPT_BASE%\.merge_revisions>nul 2>nul
set "REV="
set "COMMENT="
for /f "usebackq tokens=* delims=" %%l in (`svn log -r %REV_FROM%:%REV_TO% %FROM_URL%^| findstr /v /c:"-----"`) do (
echo "%%~l" | findstr /c:" | " | findstr /r "r[1-9][0-9]*">nul
if not errorlevel 1 (
if not "x!REV!"=="x" (
echo !REV! !COMMENT!>>%SCRIPT_BASE%\.merge_revisions
)
for /f "tokens=1,* delims=| " %%a in ( "%%l" ) do (
set "REV=%%a"
set "REV=!REV:r=!"
set "COMMENT="
)
) else (
set "COMMENT=%%l"
)
)
if "x!REV!"=="x" echo マージ対象範囲の取得に失敗しました >&2 & exit /b 4
echo !REV! !COMMENT!>>%SCRIPT_BASE%\.merge_revisions
echo [%DATE% %TIME:~0,-3%]Info: 対象範囲コミットログの取得が終わりました
echo ----------------------------------------------------------
type %SCRIPT_BASE%\.merge_revisions
echo ----------------------------------------------------------
rem -------------------------
rem 作業フォルダ初期化
rem -------------------------
:init_workspace
echo;
echo [%DATE% %TIME:~0,-3%]Info: マージのため、作業フォルダを初期化します
echo [%DATE% %TIME:~0,-3%]Info: [Revert]現在の作業領域にある更新内容を差戻します
svn revert -R .
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: 差戻し処理に失敗しました^(%~1^)>&2 & exit /b 5
echo [%DATE% %TIME:~0,-3%]Info: [Update]作業領域を最新内容に更新します
svn update
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: 更新処理に失敗しました^(%~1^)>&2 & exit /b 5
rem -------------------------
rem マージ処理実行
rem -------------------------
:merge_list
echo;
echo [%DATE% %TIME:~0,-3%]Info: 対象範囲コミットログを順番にマージします
for /f "tokens=1,*" %%a in ( %SCRIPT_BASE%\.merge_revisions ) do (
if "x!FROM!"=="x" set /a "FROM=%%a-1"
echo %%a:%REV_TO%>%SCRIPT_BASE%\.last_merege
call :merge "!FROM!:%%a" "%%b"
if errorlevel 1 (
echo [%DATE% %TIME:~0,-3%]Error: マージ処理中にエラーが発生しました >&2
echo [%DATE% %TIME:~0,-3%]Error: 再実行する場合は、引数に %%a:%REV_TO% を指定してください >&2
exit /b 9
)
set "FROM=%%a"
)
echo [%DATE% %TIME:~0,-3%]Info: 全マージが完了しました
exit /b
rem ---------------------------------------------------------------------------
rem 1件ごとのマージ処理を実施します
:merge
set "REV=%~1"
set "COMMENT=%~2"
echo [%DATE% %TIME:~0,-3%]Info: [Merge]マージ対象: %REV%: "%COMMENT%"
svn merge --accept "theirs-conflict" -r %~1 %FROM_URL%
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: コミット内容のマージに失敗しました^(%~1^)>&2 & exit /b 9
rem マージ内容をコミットします
:commit
if "x%COMMENT%"=="x" (
echo [%DATE% %TIME:~0,-3%]Info: [Commit]]マージ対象: %REV%
svn commit
) else (
echo [%DATE% %TIME:~0,-3%]Info: [Commit]マージ対象: %REV%: "%COMMENT%"
svn commit -m "%COMMENT%"
)
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: コミットに失敗しました^(%~1^)>&2 & exit /b 9
svn update
if errorlevel 1 echo [%DATE% %TIME:~0,-3%]Error: コミット後の更新に失敗しました^(%~1^)>&2 & exit /b 9
@h-mochizuki
Copy link
Author

1件ずつマージするのがしんどいので作った

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment