リポジトリブラウザでログコメントを編集したいのですが、リポジトリにpre-revprop-changeフックが存在しないというエラーメッセージを受け取りました。恐ろしい名前を持つことに加えて、pre-revprop-changeフックとは何ですか?また、どのように作成しますか?
基本的に、バージョン管理外のプロパティがリポジトリで変更される前に起動されるスクリプトであるため、リポジトリで何が起こっているかをより正確に管理できます。
SVN distribには、さまざまなフック用のテンプレートがあり、/ hooksサブディレクトリにあります(* .tmplは、OSに応じて編集し、名前を変更してアクティブにする必要があります)。
Windowsの場合、ログメッセージの変更のみを許可する(他のプロパティは許可しない)バッチファイルの例へのリンクを次に示します。
http://ayria.livejournal.com/33438.html
基本的に以下のコードをテキストファイルにコピーし、pre-revprop-change.bat
という名前を付けて、リポジトリの\hooks
サブディレクトリに保存します。
@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5
:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME
:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION
:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY
goto :eof
:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT
:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
Linuxでログコメントの編集を許可するには、
hooks
ディレクトリでpre-revprop-change.tmpl
ファイルを見つけますpre-revprop-change
に名前を変更しますwww-data
など)編集:(リンデスのおかげで)
0
の終了値を返す必要がある場合があります。ここには、多くの一般的なフック Subversionフックの一般的なタイプ を含むスタックオーバーフローの質問へのリンクがあります。これには、Windowsのpre-revprop-change
フックの元のソースがここにクロスポストされています。
時間が経つにつれて改善される可能性があるため、そこを参照する必要があります。
ありがとう#patmortech
そして、「同じユーザーだけがコードを変更できる」コードを追加しました。
:: Only allow editing of the same user.
for /f "tokens=*" %%a in (
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do (
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER
フックスクリプトの名前は、解読すればそれほど怖いものではありません。リビジョンプロパティ変更前のフックです。つまり、 pre-revprop-change
フックスクリプトの目的は、バージョン管理されていない(リビジョン)プロパティの変更を制御し、通知を送信することです(たとえば、リビジョンプロパティが変更されたときに電子メールを送信する)。
Subversionには2種類のプロパティがあります。
svn:needs-lock
およびsvn:mime-type
)、svn:log
やsvn:date
など)。バージョン管理されたプロパティには履歴があり、リポジトリへの読み取り/書き込みアクセス権を持つ一般ユーザーが操作できます。一方、バージョン管理されていないプロパティには履歴がなく、主にメンテナンス目的に使用されます。たとえば、リビジョンをコミットすると、コミットのUTC時間でsvn:date
、ユーザー名でsvn:author
、コミットログメッセージ(指定した場合)でsvn:log
がすぐに取得されます。
既に指定したように、pre-revprop-change
フックスクリプトの目的は、リビジョンプロパティの変更を制御することです。リポジトリにアクセスできるすべての人がすべてのリビジョンプロパティを変更できるようにしたくないため、デフォルトではリビジョンプロパティの変更は禁止されています。ユーザーがプロパティを変更できるようにするには、pre-revprop-change
フックを作成する必要があります。
最も単純なフックには、exit 0
という1行だけを含めることができます。これにより、認証されたユーザーはリビジョンプロパティを変更できますが、実際の環境では使用しないでください。 Windowsでは、バッチスクリプトまたはPowerShellベースのスクリプトを使用して、pre-revprop-change
フック内にいくつかのロジックを実装できます。
このPowerShellスクリプトでは、svn:log
プロパティのみを変更し、空のログメッセージを拒否できます。
# Store hook arguments into variables with mnemonic names
$repos = $args[0]
$rev = $args[1]
$user = $args[2]
$propname = $args[3]
$action = $args[4]
# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
[Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
exit 1
}
# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
[Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
exit 2
}
# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
# Log message is empty. Show the error.
[Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
exit 3
}
exit 0
このバッチスクリプトでは、「svnmgr」ユーザーのみがリビジョンプロパティを変更できます。
IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )
exit 1
goto :eof
:label1
exit 0
PCユーザーの場合:Windows Serverのマシンで使用した場合、.bat拡張子は機能しませんでした。 Django Reinhardtが提案したようにVisualSvnを使用し、.cmd拡張子を持つフックを作成しました。