tags:

views:

1824

answers:

8

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:

  1. The name of the hook
  2. What the script does
  3. The actual script

NOTE: I suspect posting an epic script will not be useful.

+1  A: 

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
Greg Dean
lol thanks for the edit. I was really struggling with the markdown
Greg Dean
+3  A: 

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
Greg Dean
+1  A: 

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

tarn
cool- have you used it?
Greg Dean
No, I was very keen to get use it at my previous job to deal with some problems we had managing configuration files in source control, but it never got high enough on my TODO list. I'd personally probably be more interested in using perl scripts these days.
tarn
+1  A: 

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.

hectorsosajr
+2  A: 

Prevent edits to revision props other than svn::log

  1. pre-revprop-change.bat
  2. 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
M4N
+1  A: 

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

NickMon
A: 

Could anybody tell me how to do a pre-commit hook that runs jslint for every .js file that is modified and blocks if jslint reports errors?

the modifications can be retrieved with SVNlook changed %repository% --transaction %transaction%

the script can be run by cscript D:\svn\jslint\webjslint.js < XXmodifiedfileXX.js

but I cannot find out how combine the 2.

greetings,

Coen

Coen
+4  A: 

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
Portman