I did a little googling and found that there isn't really a resource of SVN hooks for Windows. So I figured I'd start a wiki here to centralize it.
If you contribute, please be sure to indicate:
- The name of the hook
- What the script does
- The actual script
NOTE: I suspect posting an epic script will not be useful.
Prevent commits with empty comments
- pre-commit
- prevents commits with empty comment
Source:
"c:\Program Files\Subversion\bin\svnlook.exe" log -t %2 %1 | FindStr [a-zA-Z0-9]
IF %ERRORLEVEL% EQU 0 GOTO OK
echo "Commit Comments are Required" >&2
exit 1
:OK
exit 0
Prevents edits to revision props other than svn::log
- pre-revprop-change.bat
- Prevents edits to revision properties other than svn::log
@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
* UPDATE: This no longer works, as Twitter has deprecated username/password authentication in favor of OAuth. *
Publishes commit info to Twitter
- The name of the hook = post-commit
- What the script does = publishes the revision, author, and commit message to Twitter
Usage notes:
- Replace twitterUsername and twitterPassword with your actual Twitter
- This is tested against VisualSVN, and the only way I could get it to work was by dumping everything into a hard-coded path, c:\hook\post-commit. You can change that to any path that VisualSVN has read/write access to.
- Requires Wget to be installed. Installer can be downloaded here
- Comments and improvements welcome. This is my first SVN hook on Windows and my GAWD was it a pain.
The actual script
echo status= > c:\hook\post-commit\msg.txt
echo Rev#%2 by >> c:\hook\post-commit\msg.txt
"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %2 %1 >> c:\hook\post-commit\msg.txt
"%VISUALSVN_SERVER%\bin\svnlook.exe" log -r %2 %1 >> c:\hook\post-commit\msg.txt
"c:\Program Files (x86)\GnuWin32\bin\wget.exe" --user=twitterUsername --password=twitterPassword --post-file=c:\hook\post-commit\msg.txt --append-output=c:\hook\post-commit\log.txt --output-document=c:\hook\post-commit\download.txt --delete-after http://twitter.com/statuses/update.xml
Checks for common "lazy" commit messages
- The name of the hook = pre-commit
- What the script does = Check for blank line or '.' line. Also check a file of words not allowed to be the sole comment.
The actual script
rem Make sure that the log message contains some text.
set REPOS=%1
set TXN=%2
"C:\Program Files\Subversion\bin\SVNlook.exe" log -t %TXN% %REPOS% | FindStr [a-zA-Z0-9]
IF %ERRORLEVEL% EQU 0 GOTO OK
echo Your commit has been blocked because you didn't provide a log message 1>&2
echo Please write a log message describing the purpose of your changes and 1>&2
echo then try committing again. -- Thank you 1>&2
exit 1
:OK
rem Check if comment is in list of reserved words to not be used..
"C:\Program Files\Subversion\bin\SVNlook.exe" log -t %TXN% %REPOS% >comment
setlocal enabledelayedexpansion
Set SEPARATOR=
set COMMENT=
for /f "delims=" %%a in (comment) do (
set currentline=%%a
set COMMENT=!COMMENT!%SEPARATOR%!currentline!
)
FIND "%COMMENT%" "C:\Program Files\Subversion\excludedwords.txt">Null
If %ERRORLEVEL% EQU 1 goto OK2
:Fail
echo Your commit has been blocked because the single word comment you provided is not allowed 1>&2
echo Line is -%COMMENT%- 1>&2
echo Please write a proper log message describing the purpose of your changes and 1>&2
echo then try committing again. -- Thank you 1>&2
exit 1
:OK2
rem Check that the author of this commit has the rights to perform
rem the commit on the files and directories being modified.
rem commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
rem All checks passed, so allow the commit.
exit 0
Sample Excluded words file: Updated updated updated. Updated. Fix fix Fix. fix. .. . ... . . . . sorted sorted. Sorted Sorted.
etc etc etc etc
I like to use subHooker, which is coded in java. It provides pre and post commit hook functionality.
Pre commit:
- Enforces commit message requirement, or minimal length or both (or not)
- Can enforce a RegEX expression requirements in the commit message, good for requiring a back-log or defect number (or not)
Post Commit:
- Send HTML or Plain text e-mail messages
- Both plain and html messages use a template system
- Can turn diff on or off
- Can turn change set on or off
- supports localization
- supports standardized logging.
You can find it on google code @ http://code.google.com/p/subhooker/
It's free, and yes, I am the author, I've been running subversion for a few years now, I love it a lot which is why I am contributing this back to the community.
For the .NET developers using Subversion on Windows, Phil Haack posted about CaptainHook.
CaptainHook is a simple plugin framework for writing Subversion hooks using .NET
The project is hosted at Source Forge
Prevent edits to revision props other than svn::log
- pre-revprop-change.bat
- Prevents edits to revision properties other than svn::log (alternate version)
Source:
rem Only allow log messages to be changed.
if "%4" == "svn:log" exit 0
echo Property '%4' cannot be changed >&2
exit 1
I started a repository of hooks using C#. My first hook was one to send check in notices to a RSS feed: SubversionRss I'm currently working on one post-commit hook to send check in notices to a Twitter feed.
This hook prevents commits to a specific branch
(branch-16E in this case):
setlocal
rem Subversion sends through the path to the repository and transaction id
set REPOS=%1
set TXN=%2
rem Committing to a branch is not allowed
svnlook changed -t %TXN% %REPOS% | findstr "\/branch-16E"
if %errorlevel% EQU 0 goto errb else exit 0
:errb
echo. 1>&2
echo This branch was closed. If you want to commit here contact your administrator. 1>&2
exit 1
来源:https://stackoverflow.com/questions/633614/svn-hooks-for-windows