¿Cómo implementar el Post Cometer Gancho con Trac & SVN en un Entorno de Windows?

StackOverflow https://stackoverflow.com/questions/84178

  •  01-07-2019
  •  | 
  •  

Pregunta

Estoy ejecutando en un entorno de windows con Trac / SVN y quiero que se compromete a que el repositorio para integrar a Trac y cerca de los errores que se observaron en el SVN Comentario.

Sé que hay algunos post cometer ganchos para hacer eso, pero no hay mucha información acerca de cómo hacerlo en windows.

Nadie realizado con éxito?Y ¿cuáles fueron los pasos que siguió para lograr esto?

Aquí está el gancho que tengo que poner en el lugar en el SVN, pero no estoy exactamente seguro de cómo hacer esto en el entorno de Windows.

Trac Post Cometer Gancho

¿Fue útil?

Solución 2

Bien, ahora que tengo un poco de tiempo para publicar mi experiencia después de descubrir todo esto, y gracias a Craig para llegar a mí en la pista de la derecha.Aquí es lo que usted necesita hacer (al menos con SVN v1.4 y Tráco de v0.10.3):

  1. Busque su repositorio SVN que desea habilitar el Post Cometer Gancho para.
  2. dentro del repositorio SVN hay un directorio llamado ganchos, aquí es donde vas a colocar el post cometer gancho.
  3. crear un archivo de post-commit.bat (este es el archivo de proceso por lotes que es llamado automáticamente por SVN post commit).
  4. Coloque el código siguiente en el interior de la post-commit.archivo bat ( esto llamará a tu post cometer archivo cmd que pasa en los parámetros que SVN automáticamente pasa %1 es el repositorio, %2, es la revisión a la que fue cometido.

%~dp0 rac-post-commit-gancho.cmd %1 %2

  1. Ahora crear el trac-post-commit-gancho.archivo cmd como sigue:

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

::Uso:
::
::1) Inserte el siguiente línea en el post-commit.bat secuencia de comandos
::
::llame %~dp0 rac-post-commit-gancho.cmd %1 %2
::
::2) clic en el botón " Modificar caminos' en la sección a continuación, asegúrese de establecer al menos TRAC_ENV


:: ----------------------------------------------------------
::Modifique las rutas aquí:

::-- este debe se establece
CONJUNTO TRAC_ENV=C: rac\MySpecialProject

::-- establecer si Python no es en el ruta de acceso del sistema
::CONJUNTO PYTHON_PATH=

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

::No ejecutar gancho si trac no existe entorno
SI NO EXISTE %TRAC_ENV% GOTO :EOF

set PATH=%PYTHON_PATH%;%PATH%
conjunto PYTHONPATH=%TRAC_PATH%;%PYTHONPATH%

CONJUNTO REV=%2

::OBTENER LA EL AUTOR Y EL MENSAJE DE REGISTRO
para /F %%A in ('svnlook autor -r %REV% %1') no establece AUTOR=%%A
para /F "delims==" %%B en ('svnlook de registro -r %REV% %1') establecido LOG=%%B

::LLAME A LA SECUENCIA DE COMANDOS DE PYTHON
Python "%~dp0 rac-post-commit-gancho" -p "%TRAC_ENV%" -r "%REV%" -u "%AUTOR%" -m "%REGISTRO%"

Las partes más importantes aquí son para establecer su TRAC_ENV que es la ruta de acceso a la raíz del repositorio (CONJUNTO de TRAC_ENV=C: rac\MySpecialProject)

El próximo MAYORMENTE IMPORTANTE en este script es hacer lo siguiente:

::CONSIGUE EL AUTOR Y EL REGISTRO DE MENSAJE
for /F %%a in ('svnlook autor -r %REV% %1') establecido AUTOR=%%A
for /F "delims==" %%B en ('svnlook de registro -r %REV% %1') establecido LOG=%%B

si usted ve en el archivo de script de arriba, yo estoy usando svnlook (que es una utilidad de línea de comandos con SVN) para obtener el mensaje de REGISTRO, y el autor que hace el commit en el repositorio.

A continuación, la siguiente línea de la secuencia de comandos es en realidad, se llama el código en Python para realizar el cierre de las entradas y analizar el mensaje de registro.He tenido que modificar esto para pasar el mensaje de Registro y el autor, que los nombres de usuario que uso en el Tráco coincidir con los nombres de usuario en el SVN, así que fue fácil).

LLAME A LA SECUENCIA DE COMANDOS DE PYTHON
Python "%~dp0 rac-post-commit-gancho" -p "%TRAC_ENV%" -r "%REV%" -u "%AUTOR%" -m "%REGISTRO%"

La línea anterior en la secuencia de comandos de pasar a la secuencia de comandos de python el Tráco medio Ambiente, la revisión, la persona que hace el commit, y su comentario.

Aquí está la secuencia de comandos de Python que he utilizado.Una cosa que me hizo adicional a la escritura regular es que el uso de un campo personalizado (fixed_in_ver) que es utilizada por nuestro equipo de control de calidad para saber si la corrección se está validando en la versión de código que están las pruebas de control de calidad.Así que, he modificado el código de la secuencia de comandos de python para actualizar ese campo en el billete.Usted puede quitar ese código, ya que no lo necesita, pero es un buen ejemplo de lo que usted puede hacer para actualizar los campos personalizados en el Trac si usted también quiere hacer eso.

Lo hice por tener los usuarios opcionalmente incluir en su comentario algo como:

(versión 2.1.2223.0)

Yo, a continuación, utilizar la misma técnica que la secuencia de comandos de python utiliza con expresiones regulares para obtener la información.No estaba muy mal.

De todos modos, aquí está la secuencia de comandos de python que he usado, Esperemos que este es un buen tutorial sobre exactamente lo que hice para llegar a trabajar en el mundo de windows para que todos ustedes puedan aprovechar de tu propia tienda...

Si usted no quiere tratar con mi código adicional para actualizar el campo personalizado, obtener la base de la secuencia de comandos de esta ubicación, como lo menciona Craig anteriormente (Secuencia De Comandos De 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()

Otros consejos

Benjamin respuesta es estrecha, pero en Windows se necesita para dar el gancho de archivos de secuencia de comandos de un archivo ejecutable de extensión, tales como .bat o .cmd.Yo uso .cmd.Usted puede tomar la plantilla de secuencias de comandos, que son unix, shell scripts, scripts de shell y convertirlos .bat/.cmd sintaxis.

Pero la respuesta a la cuestión de la integración con Trac, siga estos pasos.

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

  2. Crear post-commit.cmd en \ganchos de la carpeta.Este es el script gancho de que la Subversión se va a ejecutar en el post-commit evento.

    @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 trac-post-commit.cmd en \ganchos de la carpeta:

    @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. Crear trac-post-commit-resolve-ticket-ref.py en \ganchos de la carpeta.He utilizado el mismo guión de EdgeWall, solo yo le cambió el nombre para aclarar mejor su propósito.

Post cometer los ganchos de vivir en el "gancho" del directorio donde tienes el repositorio que viven en el lado del servidor.No sé de donde usted los tiene en su entorno, así que esto es sólo un ejemplo

por ejemplo,(windows):

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

por ejemplo,(llinux/unix):

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

Una cosa te voy a agregar "Código del Mono Respuesta es PERFECTO" - es tener cuidado con esta (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 me había fijado el No-Sistema de caminos y me tomó un tiempo para ver lo obvio :D

A la altura de seguro que nadie más hace el mismo error!Gracias Código De Mono!!!1000000000 puntos :D

Primero un gran agradecimiento al Código de Mono!!!

Sin embargo, es importante para obtener el derecho de la secuencia de comandos de python dependiendo de su trac versión.Para obtener la versión adecuada, SVN retirar la carpeta:

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

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

De lo contrario, obtendrás un post-commit de error similar a este:

cometer error (detalle):COMBINACIÓN de '/svn/proyecto/trunk/web/directorio/':200 OK

Para todos los usuarios de Windows que desea instalar más reciente trac (0.11.5):Siga las instrucciones que aparecen en Trac del sitio denominado TracOnWindows.

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

Al instalar todo lo que se requiere ir a la carpeta del repositorio.No hay carpeta de ganchos.Dentro de ella poner los archivos de Código de Mono mencionado, pero no crear "trac-post-commit-resolve-ticket-ref.py" como él lo hizo.Tome el consejo de Quant Analista y hacer como él dijo:

"Sin embargo, es importante para obtener el derecho de la secuencia de comandos de python dependiendo de su trac versión.Para obtener la versión adecuada, SVN retirar la carpeta:http://svn.edgewall.com/repos/trac/branches/xxx-estable/contrib donde xxx corresponde a la trac versión que estás usando, por ejemplo:0.11"

Desde allí downoad archivo "trac-post-commit-hook" y lo puso en los ganchos de la carpeta.

Editar estas líneas en el trac-post-commit.cmd

CONJUNTO de PYTHON_PATH="Ruta de acceso de instalación de python carpeta"

CONJUNTO de TRAC_ENV="Ruta a la carpeta donde se hizo tracd initenv"

Recuerde que no hay pasado \ !!!

Me han quitado las cotizaciones de la última línea -r "%REV%" a -r %REV%, pero no sé si esto es necesario.Esto no va a funcionar ahora ( al menos en mi win 2008 server ), debido a que el gancho se producirá ( commit va a ir bien).Esto tiene que ver con los permisos.Por defecto, los permisos son limitados y tenemos que permitir que python o svn o trac ( lo que no sé ) para cambiar la información de tráco.Así que ir a su trac carpeta,carpeta de proyecto,db carpeta, haga clic en trac.db y elija propiedades.Ir a la pestaña de seguridad y permisos de edición para permitir el control completo de todos.Esto no es tan seguro, pero he perdido todo el día en esta cuestión de seguridad y yo no quiero perder a otro para encontrar sólo para el que el usuario debe habilitar los permisos.

Espero que esto ayude....

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top