Como faço para implementar o gancho cartão Commit com Trac & SVN em um ambiente Windows?

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu estou correndo em um ambiente de janelas com Trac / SVN e eu quero commit no repositório para integrar a Trac e fechar os erros que foram anotados no SVN comentário.

Eu sei que há alguns post commit ganchos para fazer isso, mas não há muita informação sobre como fazê-lo no Windows.

Qualquer um feito isso com sucesso? E quais foram as etapas seguidas para achive-lo?

Aqui está o gancho eu preciso para colocar no lugar no SVN, mas eu não sei exatamente como fazer isso no ambiente do Windows.

Trac Publicar commit gancho

Foi útil?

Solução 2

Tudo bem, agora que eu tenho algum tempo para postar minha experiência depois de descobrir isso tudo para fora, e graças a Craig por me no caminho certo. Aqui está o que você precisa fazer (pelo menos com SVN v1.4 e v0.10.3 Trac):

  1. Localize seu repositório SVN que você deseja ativar o Post commit gancho para.
  2. dentro do repositório SVN há um diretório chamado ganchos, este é o lugar onde você vai estar colocando o post commit gancho.
  3. criar um arquivo de pós-commit.bat (este é o arquivo em lotes que é chamado automaticamente pelo SVN pós commit).
  4. Coloque o seguinte código dentro do arquivo pós-commit.bat (isto irá chamar seu post cometer arquivo cmd passando os parâmetros que SVN passa automaticamente% 1 é o repositório,% 2 é a revisão que foi cometido.

% ~ DP0 \ trac-post-commit-hook.cmd% 1% 2

  1. Agora crie o arquivo trac-post-commit-hook.cmd da seguinte forma:

@ECHO OFF
:: Etiqueta :: Trac post-commit-hook roteiro Janelas
:: Etiqueta :: Contribuição de Markus, modificado por cboos.
:: Uso:
:: Etiqueta :: 1) Insira o seguinte linha em seu pós-commit.bat roteiro
:: Etiqueta :: chamada % ~ DP0 \ trac-post-commit-hook.cmd% 1 % 2 | :: Etiqueta :: 2) Verifique o 'Modificar seção caminhos a seguir, certifique-se de conjunto pelo menos TRAC_ENV
:: -------------------------------------------------- --------
:: Modificar caminhos aqui:
:: - este deve ser definido
SET TRAC_ENV = C: \ trac \ MySpecialProject
Etiqueta :: - definido se Python não está no caminho do sistema
:: SET PYTHON_PATH =
:: - conjunto com o pasta contendo trac / se instalado em um não-padrão de localização
:: SET TRAC_PATH =
:: -------------------------------------------------- --------
:: não executar gancho se trac ambiente não existe
SE NÃO Existe% TRAC_ENV% GOTO: EOF
set PATH =% PYTHON_PATH%;% PATH%
set PYTHONPATH =% TRAC_PATH%;% PYTHONPATH%

SET REV =% 2
:: Começar o Autor e do registo de mensagens
for / F %% A em ( 'svnlook autor -r% REV% 1%') fazer AUTOR set = %% A Compra de / F "delims ==" %% B em ( '-r log svnlook % REV%% 1' ) não definir LOG = %% B
:: CHAMADA DO Script Python
Python "% ~ DP0 \ trac-post-commit-hook" -p "% TRAC_ENV%" -r "% REV%" u "% AUTOR%" -m "% LOG%"

As partes mais importantes aqui são para definir o seu TRAC_ENV que é o caminho para a raiz do repositório (SET TRAC_ENV = C: \ trac \ MySpecialProject)

A coisa seguinte MAJORLY importante neste roteiro é fazer o seguinte:

:: Começar o autor eo LOG MENSAGEM Compra de / F %% A em ( 'svnlook autor -r% REV%% 1' ) fazer set AUTOR = %% A Compra de / F "delims ==" %% B em ( 'log svnlook -r% REV%% 1') do conjunto LOG = %% B

Se você vê no arquivo script acima estou usando svnlook (que é um utilitário de linha de comando com SVN) para obter a mensagem LOG e o autor que fez a comprometer com o repositório.

Em seguida, a próxima linha do script é realmente chamando o código Python para realizar o fechamento dos bilhetes e analisar a mensagem de log. Eu tive que modificar isso para passar a mensagem de Log e o autor (que os nomes de usuário que eu uso no Trac coincidir com os nomes de usuário no SVN para que foi fácil).

CHAMADA DO Script Python
Python "% ~ DP0 \ trac-post-commit-hook" -p "% TRAC_ENV%" -r "% REV%" u "% AUTOR%" -m "% LOG%"

A linha acima no script vai passar para o script python do Trac Ambiente, a revisão, a pessoa que fez a cometer, e seu comentário.

Aqui está o script Python que eu usei. Uma coisa que eu fiz adicional para o script regular é que usamos um campo personalizado (fixed_in_ver), que é usado por nossa equipe QA dizer se a correção que está validando está na versão do código que está testando em QA. Então, eu modifiquei o código no pythonscript para atualizar esse campo no bilhete. Você pode remover esse código como você não vai precisar dele, mas é um bom exemplo do que você pode fazer para campos atualização personalizadas no Trac se você também quer fazer isso.

Eu fiz isso por ter os usuários incluem opcionalmente em seu comentário algo como:

(versão 2.1.2223.0)

Eu, então, usar a mesma técnica que utiliza o script Python com expressões regulares para obter as informações. Não foi tão ruim.

De qualquer forma, aqui está o script python que eu usei, Esperemos que este é um bom tutorial sobre exatamente o que eu fiz para obtê-lo para o trabalho no mundo Windows para que todos possam aproveitar esta em sua própria loja ...

Se você não quer lidar com o meu código adicional para atualizar o campo personalizado, obter a base do script a partir desta localização como mencionado por Craig acima ( roteiro 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()

Outras dicas

A resposta de Benjamin está perto, mas no Windows, você precisa dar o script de gancho arquivos uma extensão executável, como .bat ou .cmd. Eu uso .cmd. Você pode levar os manuscritos de modelo, que são scripts shell unix, shell scripts e convertê-los para .bat / .cmd sintaxe.

Mas, para responder à questão da integração com Trac, siga estes passos.

  1. Certifique-se que python.exe está no caminho do sistema. Isso vai tornar sua vida mais fácil.

  2. Criar pós-commit.cmd em ganchos pasta \. Este é o script de gancho real que Subversion será executado no 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. Criar trac-post-commit.cmd em \ ganchos pasta:

    @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. Criar trac-post-commit-resolve-ticket-ref.py em ganchos pasta \. Eu costumava o mesmo script de Edgewall , só que eu renomeou para esclarecer melhor o seu propósito.

Post cometer ganchos viver no diretório "ganchos" onde quer que você tem a vida repositório no lado do servidor. Eu não sei onde você tê-los em seu ambiente, de modo que este é apenas um exemplo

por exemplo. (Windows):

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

por exemplo. (Llinux / unix):

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

Uma coisa que eu vou acrescentar "Resposta do Código do macaco é perfeito" - é ter cuidado com isso (o meu erro)

:: 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**

Eu não tinha definido os caminhos sem sistema e me levou um tempo para ver o óbvio: D

Apenas coincidir com certeza ninguém mais faz o mesmo erro! Graças Macaco Código! 1000000000 pontos: D

Em primeiro lugar um grande obrigado a Macaco Código!

No entanto, é importante para obter o script python direita dependendo da sua versão trac. Para obter a versão apropriada, SVN consulte a pasta:

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

que xxx corresponde à versão trac você estiver usando, por exemplo: 0,11

Caso contrário, você vai ter um pós-cometer erro semelhante a esta:

Commit falhou (detalhes a seguir): MERGE de '/ svn / project / trunk / web / directory /': 200 OK

Para todos os usuários do Windows que pretende instalar mais novo trac (0.11.5): Siga as instruções no site chamado TracOnWindows do Trac.

Fazer download de 32 bits 1.5 Python Mesmo se você tem 64 bits do Windows. nota:. instruções em algum lugar eu vi como compilar trac para trabalhar nativamente no sistema de 64 bits

Quando você instala tudo que é necessário ir para a pasta do repositório. Há ganchos pasta. Dentro dele colocar arquivos Code Monkey mencionado, mas não criar "trac-post-commit-resolve-ticket-ref.py" como ele fez. Tome o conselho de Quant Analyst e fazer como ele disse:

.

"No entanto, é importante para obter o script python direita dependendo da sua versão trac Para obter a versão apropriada, SVN consulte a pasta: http://svn.edgewall.com/repos/trac/branches/ xxx -stable / Contr onde corresponde XXX para a versão trac você estiver usando, por exemplo: 0.11"

De lá arquivo downoad "trac-post-commit-hook" e colocá-lo na pasta de ganchos.

Editar estas linhas em trac-post-commit.cmd

SET PYTHON_PATH = "Caminho para pasta de instalação python"

SET TRAC_ENV = "Caminho para a pasta onde você fez tracd initenv "

Lembre-se há última \ !!!

Eu removi citações de última linha -r "% REV%" para ser -r% REV% mas eu não sei se isso é necessário. Isso não vai funcionar agora (pelo menos no meu win server 2008), porque gancho irá falhar (commit irá ok). Isto tem a ver com permissões. Por padrão permissões são restritas e precisamos permitir python ou svn ou trac (o que eu não sei) para alterar informações trac. Então, vá para a pasta trac, pasta do projeto, pasta db, clique trac.db direito e escolha Propriedades. Ir para as permissões separador de segurança e de edição para permitir que todos controle total. Isso não é tão seguro, mas eu desperdiçado durante todo o dia sobre esta matéria de segurança e eu não quero desperdiçar outro apenas para encontrar para qual usuário você deve habilitar permissões.

Espero que isso ajude ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top