web-dev-qa-db-ja.com

SVNのpre-revprop-changeフックとは何ですか。どのように作成しますか?

リポジトリブラウザでログコメントを編集したいのですが、リポジトリにpre-revprop-changeフックが存在しないというエラーメッセージを受け取りました。恐ろしい名前を持つことに加えて、pre-revprop-changeフックとは何ですか?また、どのように作成しますか?

162
Manu

基本的に、バージョン管理外のプロパティがリポジトリで変更される前に起動されるスクリプトであるため、リポジトリで何が起こっているかをより正確に管理できます。

SVN distribには、さまざまなフック用のテンプレートがあり、/ hooksサブディレクトリにあります(* .tmplは、OSに応じて編集し、名前を変更してアクティブにする必要があります)。

51
PW.

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
206
patmortech

Linuxでログコメントの編集を許可するには、

  • リポジトリのhooksディレクトリでpre-revprop-change.tmplファイルを見つけます
  • ファイルを同じディレクトリにコピーし、pre-revprop-changeに名前を変更します
  • ファイルに実行権限を付与します(サーバーユーザーの場合、www-dataなど)

編集:(リンデスのおかげで)

  • その後、スクリプトを編集して、許可する編集の種類に対して0の終了値を返す必要がある場合があります。
15
Alois Heimer

ここには、多くの一般的なフック Subversionフックの一般的なタイプ を含むスタックオーバーフローの質問へのリンクがあります。これには、Windowsのpre-revprop-changeフックの元のソースがここにクロスポストされています。

時間が経つにつれて改善される可能性があるため、そこを参照する必要があります。

11

ありがとう#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
6
yasin

フックスクリプトの名前は、解読すればそれほど怖いものではありません。リビジョンプロパティ変更前のフックです。つまり、 pre-revprop-change フックスクリプトの目的は、バージョン管理されていない(リビジョン)プロパティの変更を制御し、通知を送信することです(たとえば、リビジョンプロパティが変更されたときに電子メールを送信する)。

Subversionには2種類のプロパティがあります。

  • ファイルとディレクトリに設定できるバージョン付きプロパティ(例:svn:needs-lockおよびsvn:mime-type)、
  • リポジトリrevisionsに設定されているバージョン管理されていない(リビジョン)プロパティ(svn:logsvn: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
4
bahrep

PCユーザーの場合:Windows Serverのマシンで使用した場合、.bat拡張子は機能しませんでした。 Django Reinhardtが提案したようにVisualSvnを使用し、.cmd拡張子を持つフックを作成しました。

2
noti