Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SVN hooks for Windows

People also ask

What are SVN hooks?

A hook script is a program triggered by some repository event, such as the creation of a new revision or the modification of an unversioned property. Each hook is handed enough information to tell what that event is, what target(s) it's operating on, and the username of the person who triggered the event.

What is post commit hook in SVN?

The post-commit hook is run after the transaction is committed and a new revision is created. Most people use this hook to send out descriptive emails about the commit or to notify some other tool (such as an issue tracker) that a commit has happened. Some configurations also use this hook to trigger backup processes.


Prevent commits with empty comments

  1. pre-commit
  2. 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

  1. pre-revprop-change.bat
  2. 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

  1. The name of the hook = post-commit
  2. 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

  1. The name of the hook = pre-commit
  2. 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.