SVNのpre-revprop-changeフックとは何ですか。どのように作成しますか?
質問
リポジトリブラウザでログコメントを編集したいのですが、リポジトリにpre-revprop-changeフックが存在しないというエラーメッセージを受け取りました。恐ろしい名前を持っていることに加えて、pre-revprop-changeフックとは何ですか?どのように作成しますか?
解決
基本的には、バージョン管理外のプロパティがリポジトリで変更される前に起動されるスクリプトであるため、リポジトリで何が起こっているかをより正確に管理できます。
/ hooksサブディレクトリにあるさまざまなフック用のSVN distribにテンプレートがあります(* .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
など)
編集済み:(lindesに感謝)
- その後、スクリプトを編集して、許可する編集の種類に対して
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:log
およびsvn:date
)。
svn:needs-lock
および svn:mime-type
)、
リポジトリ revisions に設定されているバージョン管理されたプロパティには履歴があり、リポジトリへの読み取り/書き込みアクセス権を持つ一般ユーザーが操作できます。一方、バージョン管理されていないプロパティには履歴がなく、主にメンテナンス目的に使用されます。たとえば、リビジョンをコミットすると、コミットのUTC時間で svn:date
が、ユーザー名と svn:log で
svn:author
がすぐに取得されますcode>コミットログメッセージ(指定した場合)。
既に指定したように、 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 {フックスクリプトの名前は、解読すればそれほど怖くはありません。リビジョンプロパティ変更前のフックです。要するに、 の目的pre-revprop-change
フックスクリプトは、バージョン管理されていない(リビジョン)プロパティの変更を制御し、通知を送信します(たとえば、リビジョンプロパティが変更されたときにメールを送信します)。
Subversionには2種類のプロパティがあります:
ファイルおよびディレクトリに設定できるバージョン管理されたプロパティ(例: svn:needs-lock
および svn:mime-type
)、
リポジトリ revisions に設定されている- バージョン管理されていない(リビジョン)プロパティ(例:
svn:log
および svn:date
)。
バージョン管理されたプロパティには履歴があり、リポジトリへの読み取り/書き込みアクセス権を持つ一般ユーザーが操作できます。一方、バージョン管理されていないプロパティには履歴がなく、主にメンテナンス目的に使用されます。たとえば、リビジョンをコミットすると、コミットのUTC時間で svn:date
が、ユーザー名と svn:log で svn:author
がすぐに取得されますcode>コミットログメッセージ(指定した場合)。
既に指定したように、 pre-revprop-change
フックスクリプトの目的は、リビジョンプロパティの変更を制御することです。リポジトリにアクセスできる全員がすべてのリビジョンプロパティを変更できるようにしたくないため、デフォルトではリビジョンプロパティの変更は禁止されています。ユーザーがプロパティを変更できるようにするには、 pre-revprop-change
フックを作成する必要があります。
最も単純なフックには、 exit 0
という1行だけを含めることができます。これにより、認証されたユーザーはリビジョンプロパティを変更でき、実際の環境では使用できません。 Windowsでは、バッチスクリプトまたはPowerShellベースのスクリプトを使用して、 pre-revprop-change
フック内にいくつかのロジックを実装できます。
このPowerShellスクリプトでは、 svn:log
プロパティのみを変更し、空のログメッセージを拒否できます。
IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )
exit 1
goto :eof
:label1
exit 0
このバッチスクリプトでは、「svnmgr」のみが許可されます。リビジョンのプロパティを変更するユーザー:
<*>.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」のみが許可されます。リビジョンのプロパティを変更するユーザー:
<*>PCユーザーの場合: .bat拡張子は、Windows Serverのマシン上で使用すると機能しませんでした。 Django Reinhardtが示唆したようにVisualSvnを使用し、.cmd拡張子を持つフックを作成しました。