IT박스

SVN의 사전 개정판 변경 후크 란 무엇이며 어떻게 작성합니까?

itboxs 2020. 5. 31. 21:11
반응형

SVN의 사전 개정판 변경 후크 란 무엇이며 어떻게 작성합니까?


리포지토리 브라우저에서 로그 주석을 편집하고 리포지토리에 대한 pre-revprop-change 훅이 없다는 오류 메시지가 표시되었습니다. 무서운 이름 외에도 pre-revprop-change 훅은 무엇이며 어떻게 만들 수 있습니까?


기본적으로 리포지토리에서 버전없는 속성을 수정하기 전에 시작되는 스크립트이므로 리포지토리에서 발생하는 상황을보다 정확하게 관리 할 수 ​​있습니다.

/ hooks 서브 디렉토리 (OS에 따라 편집하고 이름을 바꾸고 활성화해야하는 * .tmpl)에있는 다른 후크에 대한 SVN 분배에는 템플리트가 있습니다.


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가 로그 주석의 편집을 허용하려면

  • 저장소 pre-revprop-change.tmplhooks디렉토리 에서 파일 찾으십시오.
  • 파일을 같은 디렉토리에 복사하고 이름을 바꿉니다. pre-revprop-change
  • 파일에 대한 실행 권한 부여 (예 : 서버 사용자의 경우 www-data)

편집 : (린드 덕분에)

  • 그런 다음 0허용하려는 편집 종류에 대한 종료 값을 반환하도록 스크립트를 편집해야 할 수도 있습니다 .

여기에 크로스 게시 된 Windows 용 후크 의 원래 소스를 포함하여 많은 공통 후크 공통 유형의 Subversion 후크 가있는 스택 오버플로 질문에 대한 링크가 pre-revprop-change있습니다.

You should refer there as they may get improved over time.


Thanks #patmortech

And I added your code which "only the same user can change his code".

:: 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

The name of the hook script is not so scary if you manage decipher it: it's pre revision property change hook. In short, the purpose of pre-revprop-change hook script is to control changes of unversioned (revision) properties and to send notifications (e.g. to send an email when revision property is changed).

There are 2 types of properties in Subversion:

  • versioned properties (e.g svn:needs-lock and svn:mime-type) that can be set on files and directories,
  • unversioned (revision) properties (e.g. svn:log and svn:date) that are set on repository revisions.

Versioned properties have history and can be manipulated by ordinary users who have Read / Write access to a repository. On the other hand, unversioned properties do not have any history and serve mostly maintenance purpose. For example, if you commit a revision it immediately gets svn:date with UTC time of your commit, svn:author with your username and svn:log with your commit log message (if you specified any).

As I already specified, the purpose of pre-revprop-change hook script is to control changes of revision properties. You don't want everyone who has access to a repository to be able to modify all revision properties, so changing revision properties is forbidden by default. To allow users to change properties, you have to create pre-revprop-change hook.

The simplest hook can contain just one line: exit 0. It will allow any authenticated user to change any revision property and it should not be used in real environment. On Windows, you can use batch script or PowerShell-based script to implement some logic within pre-revprop-change hook.

This PowerShell script allows to change svn:log property only and denies empty log messages.

# 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

This batch script allows only "svnmgr" user to change revision properties:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

For PC users: The .bat extension did not work for me when used on Windows Server maching. I used VisualSvn as Django Reinhardt suggested, and it created a hook with a .cmd extension.

참고URL : https://stackoverflow.com/questions/197224/what-is-a-pre-revprop-change-hook-in-svn-and-how-do-i-create-it

반응형