Last active
October 22, 2021 04:29
-
-
Save h-mochizuki/a40421b4d10140e454f01c051be7926c to your computer and use it in GitHub Desktop.
SVNのコミット内容を順番に、ひとつずつマージしていくバッチ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
1件ずつマージするのがしんどいので作った