Benjamin's answer is close, but on Windows you need to give the hook script files an executable extension, such as .bat or .cmd. I use .cmd. You can take the template scripts, which are unix shell scripts, shell scripts and convert them to .bat/.cmd syntax.
But to answer the question of integrating with Trac, follow these steps.
Ensure that Python.exe is on the system path. This will make your life easier.
Create post-commit.cmd in \hooks folder. This is the actual hook script that Subversion will execute on the post-commit event.
@ECHO OFF
:: POST-COMMIT HOOK
::
:: The post-commit hook is invoked after a commit. Subversion runs
:: this hook by invoking a program (script, executable, binary, etc.)
:: named 'post-commit' (for which this file is a template) with the
:: following ordered arguments:
::
:: [1] REPOS-PATH (the path to this repository)
:: [2] REV (the number of the revision just committed)
::
:: The default working directory for the invocation is undefined, so
:: the program should set one explicitly if it cares.
::
:: Because the commit has already completed and cannot be undone,
:: the exit code of the hook program is ignored. The hook program
:: can use the 'svnlook' utility to help it examine the
:: newly-committed tree.
::
:: On a Unix system, the normal procedure is to have 'post-commit'
:: invoke other programs to do the real work, though it may do the
:: work itself too.
::
:: Note that 'post-commit' must be executable by the user(s) who will
:: invoke it (typically the user httpd runs as), and that user must
:: have filesystem-level permission to access the repository.
::
:: On a Windows system, you should name the hook program
:: 'post-commit.bat' or 'post-commit.exe',
:: but the basic idea is the same.
::
:: The hook program typically does not inherit the environment of
:: its parent process. For example, a common problem is for the
:: PATH environment variable to not be set to its usual value, so
:: that subprograms fail to launch unless invoked via absolute path.
:: If you're having unexpected problems with a hook program, the
:: culprit may be unusual (or missing) environment variables.
::
:: Here is an example hook script, for a Unix /bin/sh interpreter.
:: For more examples and pre-written hooks, see those in
:: the Subversion repository at
:: http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/ and
:: http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/
setlocal
:: Debugging setup
:: 1. Make a copy of this file.
:: 2. Enable the command below to call the copied file.
:: 3. Remove all other commands
::call %~dp0post-commit-run.cmd %* > %1/hooks/post-commit.log 2>&1
:: Call Trac post-commit hook
call %~dp0trac-post-commit.cmd %* || exit 1
endlocal
Create trac-post-commit.cmd in \hooks folder:
@ECHO OFF
::
:: Trac post-commit-hook script for Windows
::
:: Contributed by markus, modified by cboos.
:: Usage:
::
:: 1) Insert the following line in your post-commit.bat script
::
:: call %~dp0\trac-post-commit-hook.cmd %1 %2
::
:: 2) Check the 'Modify paths' section below, be sure to set at least TRAC_ENV
setlocal
:: ----------------------------------------------------------
:: Modify paths here:
:: -- this one *must* be set
SET TRAC_ENV=D:\projects\trac\membershipdnn
:: -- set if Python is not in the system path
SET PYTHON_PATH=
:: -- set to the folder containing trac/ if installed in a non-standard location
SET TRAC_PATH=
:: ----------------------------------------------------------
:: Do not execute hook if trac environment does not exist
IF NOT EXIST %TRAC_ENV% GOTO :EOF
set PATH=%PYTHON_PATH%;%PATH%
set PYTHONPATH=%TRAC_PATH%;%PYTHONPATH%
SET REV=%2
:: Resolve ticket references (fixes, closes, refs, etc.)
Python "%~dp0trac-post-commit-resolve-ticket-ref.py" -p "%TRAC_ENV%" -r "%REV%"
endlocal
Create trac-post-commit-resolve-ticket-ref.py in \hooks folder. I used the same script from EdgeWall, only I renamed it to better clarify its purpose.
You might want to check this answer to see if it helps you solve your problem:
If that doesn't help, you should try logging to a file. Since it works fine when you use SVN, but fails for Trac, it's probably some config error. Once you can actually view the error message, it will be easier to fix. For starters try changing to:
Python "%~dp0\trac-post-commit-hook" -p "%TRAC_ENV%" -r "%REV%" 2>&1 1>>c:\temp\trachook.log
in your cmd file. This should send both stdout and stderr messages to the \temp\trachook.log file.
EDIT: Sorry, missed the error message you posted already. Looks like it's not getting the right options.project
and it might be set to None when it should be set from TRAC_ENV
from the -p
option.
Are you sure you're running it with that option after you rename it to .py and run it? If so, try changing that file and logging the value of options.project
after the arguments have been parsed. Try to track down why it's not being set.
EDIT: By the way, the error line:
File "trac-post-commit-hook.py", line 104, in <module>
os.environ{'PYTHON_EGG_CACHE'] = os.path.join(options.project, '.egg-cache')
I don't see a reference to this in the link to the post-commit-hook. Did you add this? Or is the link wrong? Also, there's a syntax error in that line: the curly brace '{' should be a square brace '['. But I think the error actually happens before that, in the os.path.join (options.project is None). Try putting a line before that one:
print 'options.project is set to: ', options.project
and see what the output is.
Best Answer
First question -- the post you reference (not yours), mentions issuing the comment "#1 fixed.", which I think will fail. If you're using that syntax as well, have you tried "Fixed #1.", which is the correct order for the regex which parses comments?
If it's not that simple, I've got no direct experience with the default script -- I use the one associated with the Timing and Estimation plugin -- but, I'd start by swiping some code from the T&E plugin:
with appropriate modifications for your environment; then insert some logging.
The only problem I've ever run into was an update to the T&E script which lost case-insensitivity, long ago resolved. That doesn't look like an issue with the base script, though.