windows svn hook trac

¿Cómo implemento el Post Commit Hook con Trac & SVN en un entorno Windows?



(6)

Me estoy ejecutando en un entorno de Windows con Trac / SVN y quiero que los commits en el repositorio se integren a Trac y cierren los errores que se anotaron en el comentario de SVN.

Sé que hay algunos ganchos de confirmación de publicación para hacer eso, pero no hay mucha información sobre cómo hacerlo en Windows.

¿Alguien lo hizo con éxito? ¿Y cuáles fueron los pasos que siguió para lograrlo?

Aquí está el gancho que necesito poner en marcha en SVN, pero no estoy exactamente seguro de cómo hacerlo en el entorno de Windows.

Trac Post Commit Hook


Los enganches Post commit live en el directorio "hooks" donde quiera que tengas el repositorio viviendo en el lado del servidor. No sé dónde los tienes en tu entorno, así que esto es solo un ejemplo

por ejemplo, (ventanas):

C:/Subversion/repositories/repo1/hooks/post-commit

ej. (llinux / unix):

/usr/local/subversion/repositories/repo1/hooks/post-commit


Bien, ahora que tengo algo de tiempo para publicar mi experiencia después de resolver todo esto, y gracias a Craig por ponerme en el camino correcto. Esto es lo que debe hacer (al menos con SVN v1.4 y Trac v0.10.3):

  1. Localice su repositorio SVN para el que desea habilitar el enganche PostCommit.
  2. dentro del repositorio SVN hay un directorio llamado hooks, aquí es donde colocarás el enlace post commit.
  3. crea un archivo post-commit.bat (este es el archivo por lotes que se llama automáticamente por la confirmación de la publicación SVN).
  4. Coloque el siguiente código dentro del archivo post-commit.bat (esto llamará a su archivo commit commit cmd pasando los parámetros que SVN automáticamente pasa% 1 es el repositorio,% 2 es la revisión que se confirmó.

% ~ dp0 / trac-post-commit-hook.cmd% 1% 2

  1. Ahora crea el archivo trac-post-commit-hook.cmd de la siguiente manera:

@ECHO OFF
::
:: Script Trac post-commit-hook para Windows
::
:: Contribuido por markus, modificado por cboos.

:: Uso:
::
:: 1) Inserta la siguiente línea en tu script post-commit.bat
::
:: call% ~ dp0 / trac-post-commit-hook.cmd% 1% 2
::
:: 2) Compruebe la sección ''Modificar rutas'' a continuación, asegúrese de establecer al menos TRAC_ENV


:: ------------------------------------------------ ----------
:: Modificar rutas aquí:

:: - este debe ser establecido
SET TRAC_ENV = C: / trac / MySpecialProject

:: - establecer si Python no está en la ruta del sistema
:: SET PYTHON_PATH =

:: - configurado en la carpeta que contiene trac / si está instalado en una ubicación no estándar
:: SET TRAC_PATH =
:: ------------------------------------------------ ----------

:: No ejecute hook si el entorno de trac no existe
SI NO EXISTE% TRAC_ENV% GOTO: EOF

establecer PATH =% PYTHON_PATH%;% PATH%
establecer PYTHONPATH =% TRAC_PATH%;% PYTHONPATH%

SET REV =% 2

:: OBTENER EL AUTOR Y EL MENSAJE DE REGISTRO
for / F %% A in (''svnlook author -r% REV%% 1'') establece AUTHOR = %% A
para / F "delims ==" %% B in (''svnlook log -r% REV%% 1'') establece set LOG = %% B

:: LLAMAR LA GUIÓN DE PYTHON
Python "% ~ dp0 / trac-post-commit-hook" -p "% TRAC_ENV%" -r "% REV%" -u "% AUTHOR%" -m "% LOG%"

Las partes más importantes aquí son establecer su TRAC_ENV que es la ruta a la raíz del repositorio (SET TRAC_ENV = C: / trac / MySpecialProject)

La siguiente COSA PRINCIPALMENTE IMPORTANTE en este script es hacer lo siguiente:

:: OBTENER EL AUTOR Y EL MENSAJE DE REGISTRO
for / F %% A in (''svnlook author -r% REV%% 1'') establece AUTHOR = %% A
para / F "delims ==" %% B in (''svnlook log -r% REV%% 1'') establece set LOG = %% B

si ves en el archivo de script de arriba, estoy usando svnlook (que es una utilidad de línea de comandos con SVN) para obtener el mensaje de LOG y el autor que hizo la confirmación al repositorio.

Luego, la siguiente línea del script llama al código Python para realizar el cierre de los tickets y analizar el mensaje de registro. Tuve que modificar esto para pasar el mensaje de registro y el autor (que los nombres de usuario que uso en Trac coinciden con los nombres de usuario en SVN, así que fue fácil).

LLAME AL GUIÓN PYTHON
Python "% ~ dp0 / trac-post-commit-hook" -p "% TRAC_ENV%" -r "% REV%" -u "% AUTHOR%" -m "% LOG%"

La línea anterior en el script pasará al script python el entorno de Trac, la revisión, la persona que realizó la confirmación y su comentario.

Aquí está la secuencia de comandos de Python que utilicé. Una cosa que hice adicional al guión habitual es que utilizamos un campo personalizado (fixed_in_ver) que nuestro equipo de control de calidad usa para decirnos si el arreglo que están validando está en la versión del código que están probando en QA. Entonces, modifiqué el código en el script python para actualizar ese campo en el ticket. Puede eliminar ese código ya que no lo necesitará, pero es un buen ejemplo de lo que puede hacer para actualizar campos personalizados en Trac si también desea hacerlo.

Lo hice haciendo que los usuarios incluyeran opcionalmente en su comentario algo así como:

(versión 2.1.2223.0)

Luego utilizo la misma técnica que el script de python utiliza con expresiones regulares para obtener la información. No fue tan malo.

De todos modos, aquí está el script de Python que utilicé. Espero que este sea un buen tutorial sobre exactamente lo que hice para que funcione en el mundo de las ventanas para que todos puedan aprovechar esto en su propia tienda ...

Si no quiere ocuparse de mi código adicional para actualizar el campo personalizado, obtenga el script base desde esta ubicación, como menciona Craig anteriormente ( Script From Edgewall )

#!/usr/bin/env python # trac-post-commit-hook # ---------------------------------------------------------------------------- # Copyright (c) 2004 Stephen Hansen # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. # ---------------------------------------------------------------------------- # This Subversion post-commit hook script is meant to interface to the # Trac (http://www.edgewall.com/products/trac/) issue tracking/wiki/etc # system. # # It should be called from the ''post-commit'' script in Subversion, such as # via: # # REPOS="$1" # REV="$2" # LOG=`/usr/bin/svnlook log -r $REV $REPOS` # AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS` # TRAC_ENV=''/somewhere/trac/project/'' # TRAC_URL=''http://trac.mysite.com/project/'' # # /usr/bin/python /usr/local/src/trac/contrib/trac-post-commit-hook / # -p "$TRAC_ENV" / # -r "$REV" / # -u "$AUTHOR" / # -m "$LOG" / # -s "$TRAC_URL" # # It searches commit messages for text in the form of: # command #1 # command #1, #2 # command #1 & #2 # command #1 and #2 # # You can have more then one command in a message. The following commands # are supported. There is more then one spelling for each command, to make # this as user-friendly as possible. # # closes, fixes # The specified issue numbers are closed with the contents of this # commit message being added to it. # references, refs, addresses, re # The specified issue numbers are left in their current status, but # the contents of this commit message are added to their notes. # # A fairly complicated example of what you can do is with a commit message # of: # # Changed blah and foo to do this or that. Fixes #10 and #12, and refs #12. # # This will close #10 and #12, and add a note to #12. import re import os import sys import time from trac.env import open_environment from trac.ticket.notification import TicketNotifyEmail from trac.ticket import Ticket from trac.ticket.web_ui import TicketModule # TODO: move grouped_changelog_entries to model.py from trac.util.text import to_unicode from trac.web.href import Href try: from optparse import OptionParser except ImportError: try: from optik import OptionParser except ImportError: raise ImportError, ''Requires Python 2.3 or the Optik option parsing library.'' parser = OptionParser() parser.add_option(''-e'', ''--require-envelope'', dest=''env'', default='''', help=''Require commands to be enclosed in an envelope. If -e[], '' ''then commands must be in the form of [closes #4]. Must '' ''be two characters.'') parser.add_option(''-p'', ''--project'', dest=''project'', help=''Path to the Trac project.'') parser.add_option(''-r'', ''--revision'', dest=''rev'', help=''Repository revision number.'') parser.add_option(''-u'', ''--user'', dest=''user'', help=''The user who is responsible for this action'') parser.add_option(''-m'', ''--msg'', dest=''msg'', help=''The log message to search.'') parser.add_option(''-c'', ''--encoding'', dest=''encoding'', help=''The encoding used by the log message.'') parser.add_option(''-s'', ''--siteurl'', dest=''url'', help=''The base URL to the project/'s trac website (to which '' ''/ticket/## is appended). If this is not specified, '' ''the project URL from trac.ini will be used.'') (options, args) = parser.parse_args(sys.argv[1:]) if options.env: leftEnv = ''//' + options.env[0] rghtEnv = ''//' + options.env[1] else: leftEnv = '''' rghtEnv = '''' commandPattern = re.compile(leftEnv + r''(?P<action>[A-Za-z]*).?(?P<ticket>#[0-9]+(?:(?:[, &]*|[ ]?and[ ]?)#[0-9]+)*)'' + rghtEnv) ticketPattern = re.compile(r''#([0-9]*)'') versionPattern = re.compile(r"/(version[ ]+(?P<version>([0-9]+)/.([0-9]+)/.([0-9]+)/.([0-9]+))/)") class CommitHook: _supported_cmds = {''close'': ''_cmdClose'', ''closed'': ''_cmdClose'', ''closes'': ''_cmdClose'', ''fix'': ''_cmdClose'', ''fixed'': ''_cmdClose'', ''fixes'': ''_cmdClose'', ''addresses'': ''_cmdRefs'', ''re'': ''_cmdRefs'', ''references'': ''_cmdRefs'', ''refs'': ''_cmdRefs'', ''see'': ''_cmdRefs''} def __init__(self, project=options.project, author=options.user, rev=options.rev, msg=options.msg, url=options.url, encoding=options.encoding): msg = to_unicode(msg, encoding) self.author = author self.rev = rev self.msg = "(In [%s]) %s" % (rev, msg) self.now = int(time.time()) self.env = open_environment(project) if url is None: url = self.env.config.get(''project'', ''url'') self.env.href = Href(url) self.env.abs_href = Href(url) cmdGroups = commandPattern.findall(msg) tickets = {} for cmd, tkts in cmdGroups: funcname = CommitHook._supported_cmds.get(cmd.lower(), '''') if funcname: for tkt_id in ticketPattern.findall(tkts): func = getattr(self, funcname) tickets.setdefault(tkt_id, []).append(func) for tkt_id, cmds in tickets.iteritems(): try: db = self.env.get_db_cnx() ticket = Ticket(self.env, int(tkt_id), db) for cmd in cmds: cmd(ticket) # determine sequence number... cnum = 0 tm = TicketModule(self.env) for change in tm.grouped_changelog_entries(ticket, db): if change[''permanent'']: cnum += 1 # get the version number from the checkin... and update the ticket with it. version = versionPattern.search(msg) if version != None and version.group("version") != None: ticket[''fixed_in_ver''] = version.group("version") ticket.save_changes(self.author, self.msg, self.now, db, cnum+1) db.commit() tn = TicketNotifyEmail(self.env) tn.notify(ticket, newticket=0, modtime=self.now) except Exception, e: # import traceback # traceback.print_exc(file=sys.stderr) print>>sys.stderr, ''Unexpected error while processing ticket '' / ''ID %s: %s'' % (tkt_id, e) def _cmdClose(self, ticket): ticket[''status''] = ''closed'' ticket[''resolution''] = ''fixed'' def _cmdRefs(self, ticket): pass if __name__ == "__main__": if len(sys.argv) < 5: print "For usage: %s --help" % (sys.argv[0]) else: CommitHook()


La respuesta de Benjamin está cerca, pero en Windows necesita dar a los archivos del script hook una extensión ejecutable, como .bat o .cmd. Yo uso .cmd. Puede tomar los scripts de plantilla, que son scripts de shell de Unix, scripts de shell y convertirlos a sintaxis .bat / .cmd.

Pero para responder la pregunta de la integración con Trac, siga estos pasos.

  1. Asegúrese de que Python.exe se encuentre en la ruta del sistema. Esto hará tu vida más fácil.

  2. Crea la carpeta post-commit.cmd in / hooks. Este es el script de gancho real que Subversion ejecutará en el evento post-commit.

    @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

  3. Crear la carpeta trac-post-commit.cmd in / hooks:

    @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

  4. Cree trac-post-commit-resolve-ticket-ref.py en la carpeta / hooks. Utilicé el mismo script de EdgeWall , solo lo renombré para aclarar mejor su propósito.


Una cosa que agregaré es que "Code Monkey''s Answer is PERFECT" (la respuesta del código del mono es PERFECTA) es tener cuidado con esto (mi error)

:: Modify paths here: :: -- this one must be set SET TRAC_ENV=d:/trac/MySpecialProject :: -- set if Python is not in the system path :: SET PYTHON_PATH=**d:/python** :: -- set to the folder containing trac/ if installed in a non-standard location :: SET TRAC_PATH=**d:/python/Lib/site-packages/trac**

No había establecido las rutas fuera del sistema y me llevó un tiempo ver lo obvio: D

¡Solo asegúrese de que nadie más cometa el mismo error! Gracias Code Monkey! 1000000000 puntos: D


Primero muchas gracias a Code Monkey!

Sin embargo, es importante obtener la secuencia de comandos python correcta según su versión de trac. Para obtener la versión apropiada, SVN echa un vistazo a la carpeta:

http://svn.edgewall.com/repos/trac/branches/ xxx -stable / contrib

donde xxx corresponde a la versión de trac que está utilizando, por ejemplo: 0.11

De lo contrario, obtendrás un error posterior a la confirmación que se ve así:

commit failed (detalles a continuación): MERGE of ''/ svn / project / trunk / web / directory /'': 200 OK


Para todos los usuarios de Windows que deseen instalar el trac más reciente (0.11.5): sigan las instrucciones en el sitio de Trac llamado TracOnWindows.

Descarga 32bit 1.5 Python incluso si tienes Windows de 64 bits. nota: vi en algún lugar instrucciones sobre cómo compilar trac para trabajar de forma nativa en el sistema de 64 bits.

Cuando instala todo lo que se requiere, vaya a la carpeta del repositorio. Hay ganchos de carpeta. En su interior ponga los archivos Code Monkey mencionados, pero no cree "trac-post-commit-resolve-ticket-ref.py" como lo hizo él. Toma el consejo de Quant Analyst y haz lo que él dijo:

"Sin embargo, es importante obtener la secuencia de comandos python correcta según su versión trac. Para obtener la versión adecuada, SVN consulte la carpeta: http://svn.edgewall.com/repos/trac/branches/ xxx-stable / contrib donde xxx corresponde a la versión de trac que está utilizando, por ejemplo: 0.11 "

Desde allí descargue el archivo "trac-post-commit-hook" y póngalo en la carpeta de ganchos.

Edite estas líneas en trac-post-commit.cmd

SET PYTHON_PATH = "Ruta a la carpeta de instalación de python"

SET TRAC_ENV = "Ruta a la carpeta donde hiciste tradujo initenv"

¡¡¡Recuerda no último / !!!

He eliminado citas de la última línea -r "% REV%" para que sean -r% REV%, pero no sé si es necesario. Esto no funcionará ahora (al menos en mi servidor win 2008), ya que el enlace fallará (la confirmación se ejecutará correctamente). Esto tiene que ver con los permisos. Por defecto, los permisos están restringidos y necesitamos permitir python o svn o trac (lo que no sé) para cambiar la información del trac. Vaya a su carpeta de trac, carpeta de proyecto, carpeta de db, haga clic derecho en trac.db y elija propiedades. Vaya a la pestaña de seguridad y edite los permisos para permitirle a todos el control total. Esto no es tan seguro, pero desperdicié todo el día en este tema de seguridad y no quiero desperdiciar otro solo para encontrar para qué usuario debe habilitar los permisos.

Espero que esto ayude....