Comment implémenter le crochet post-engagement avec Trac & amp; SVN dans un environnement Windows?

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

  •  01-07-2019
  •  | 
  •  

Question

J'exécute dans un environnement Windows avec Trac / SVN et je souhaite m'engager dans le référentiel à s'intégrer à Trac et à fermer les bogues signalés dans le commentaire SVN.

Je sais qu'il existe des points d'ancrage post-commit pour le faire, mais il n'y a pas beaucoup d'informations sur la façon de le faire sous Windows.

Quelqu'un l'a fait avec succès? Et quelles ont été les étapes que vous avez suivies pour y parvenir?

Voici le crochet que je dois mettre en place dans SVN, mais je ne sais pas exactement comment procéder dans l'environnement Windows.

Crochet d'engagement de Trac Post

Était-ce utile?

La solution 2

D'accord, maintenant que j'ai le temps de publier mon expérience après avoir compris tout cela, et merci à Craig de m'avoir mis sur la bonne voie. Voici ce que vous devez faire (au moins avec SVN v1.4 et Trac v0.10.3):

  1. Localisez le référentiel SVN pour lequel vous souhaitez activer le crochet de validation post-validation.
  2. dans le référentiel SVN, vous trouverez un répertoire appelé hooks, dans lequel vous allez placer le hook post-commit.
  3. créez un fichier post-commit.bat (il s'agit du fichier de commandes appelé automatiquement par SVN post commit).
  4. Placez le code suivant dans le fichier post-commit.bat (cela appellera votre fichier cmd post commit) en transmettant les paramètres que SVN transmet automatiquement% 1 est le référentiel,% 2 est la révision qui a été validée.

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

  1. Créez maintenant le fichier trac-post-commit-hook.cmd comme suit:
  

@ECHO OFF
::
:: Trac   script post-commit-hook pour   Windows
::
:: Contribution de   markus, modifié par cboos.

::   Utilisation:
::
:: 1) Insérez le   ligne suivante dans votre post-commit.bat   script
::
:: call   % ~ dp0 \ trac-post-commit-hook.cmd% 1   % 2
::
:: 2) Cochez la case 'Modifier   section des chemins ci-dessous, assurez-vous de définir   au moins TRAC_ENV


::   -------------------------------------------------- --------
:: Modifiez les chemins ici:

:: -   celui-ci doit être configuré pour SET   TRAC_ENV = C: \ trac \ MySpecialProject
  
:: - définir si Python n'est pas dans le   chemin du système
:: SET   PYTHON_PATH =

:: - mis à la   dossier contenant trac / si installé   dans un emplacement non standard
:: SET   TRAC_PATH =
::   -------------------------------------------------- --------

:: N'exécutez pas hook si trac   l'environnement n'existe pas
SI PAS   EXIST% TRAC_ENV% GOTO: EOF

  set PATH =% PYTHON_PATH%;% PATH%
set   PYTHONPATH =% TRAC_PATH%;% PYTHONPATH%
  
SET REV =% 2

:: OBTENIR LA   AUTEUR ET LE MESSAGE DU JOURNAL
pour / F   %% A in ('auteur svnlook -r% REV%% 1')   définir AUTEUR = %% A
pour / F   " delims == " %% B in ('svnlook log -r   % REV%% 1 ') définit LOG = %% B

::   APPELER LE SCRIPT PYTHON
Python   "% ~ dp0 \ trac-post-commit-hook " -p   "% TRAC_ENV% " -r "% REV% " -u "% AUTHOR% "   -m "% LOG%"

Les parties les plus importantes ici consistent à définir votre TRAC_ENV, qui est le chemin d'accès à la racine du référentiel (SET TRAC_ENV = C: \ trac \ MySpecialProject)

La prochaine chose importante dans ce script est de procéder comme suit:

  

:: OBTENIR L'AUTEUR ET LE JOURNAL   MESSAGE
pour / F %% A in ('svnlook   author -r% REV%% 1 ') défini   AUTEUR = %% A
pour / F "delims ==" %% B   dans ('svnlook log -r% REV%% 1') défini   LOG = %% B

si vous voyez dans le fichier de script ci-dessus, j'utilise svnlook (un utilitaire de ligne de commande avec SVN) pour obtenir le message LOG et l'auteur qui a effectué la validation dans le référentiel.

Ensuite, la ligne suivante du script appelle le code Python pour effectuer la fermeture des tickets et analyser le message du journal. J'ai dû modifier cela pour transmettre le message du journal et l'auteur (les noms d'utilisateur que j'utilise dans Trac correspondent aux noms d'utilisateur en SVN, ce qui était facile).

  

APPELER LE SCRIPT DE PYTHON
Python   "% ~ dp0 \ trac-post-commit-hook " -p   "% TRAC_ENV% " -r "% REV% " -u "% AUTHOR% "   -m "% LOG%"

La ligne ci-dessus dans le script transmettra au script python l'environnement Trac, la révision, la personne qui a effectué la validation et leur commentaire.

Voici le script Python que j'ai utilisé. En plus du script standard, j’ai utilisé un champ personnalisé (fixed_in_ver) qui est utilisé par notre équipe d’assurance qualité pour indiquer si le correctif qu’elles valident se trouve dans la version du code qu’elles testent dans le système d’assurance qualité. J'ai donc modifié le code dans le script python pour mettre à jour ce champ sur le ticket. Vous pouvez supprimer ce code car vous n'en aurez pas besoin, mais c'est un bon exemple de ce que vous pouvez faire pour mettre à jour des champs personnalisés dans Trac si vous souhaitez également le faire.

J'ai fait cela en faisant en sorte que les utilisateurs incluent éventuellement dans leur commentaire quelque chose comme:

  

(version 2.1.2223.0)

J'utilise ensuite la même technique que le script python utilise des expressions régulières pour extraire les informations. Ce n'était pas si mal.

Quoi qu’il en soit, voici le script python que j’ai utilisé. Espérons que c’est un bon tutoriel sur ce que j’ai fait pour que cela fonctionne dans le monde Windows, afin que vous puissiez tous en tirer parti dans votre propre boutique ...

Si vous ne souhaitez pas utiliser mon code supplémentaire pour la mise à jour du champ personnalisé, récupérez le script de base à partir de cet emplacement, comme indiqué par Craig ci-dessus ( Script à partir 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()

Autres conseils

La réponse de Benjamin est proche, mais sous Windows, vous devez attribuer aux fichiers de script de raccordement une extension exécutable, telle que .bat ou .cmd. J'utilise .cmd. Vous pouvez utiliser les modèles de scripts, qui sont des scripts de shell unix, des scripts de shell et les convertir en syntaxe .bat / .cmd.

Mais pour répondre à la question de l'intégration à Trac, procédez comme suit.

  1. Assurez-vous que Python.exe est sur le chemin du système. Cela vous facilitera la vie.

  2. Créez post-commit.cmd dans le dossier \ hooks. C’est le script de raccordement réel que Subversion exécutera lors de l’événement 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. Créez trac-post-commit.cmd dans le dossier \ 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. Créez trac-post-commit-resolve-ticket-ref.py dans le dossier \ hooks. J'ai utilisé le même script depuis EdgeWall , seulement je l'ai renommé pour mieux préciser son objectif.

Les hooks de post-commit résident dans les "hooks". répertoire où vous avez toujours le référentiel vivant côté serveur. Je ne sais pas où vous les avez dans votre environnement, donc ce n’est qu’un exemple

par exemple. (fenêtres):

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

par exemple. (llinux / unix):

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

Une chose que j'ajouterai: "La réponse de Code Monkey est parfaite" - est de se méfier de cela (mon erreur)

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

Je n'avais pas défini les chemins non-système et il m'a fallu un certain temps pour voir l'évidence: D

Faites en sorte que personne ne commette la même erreur! Merci Code Monkey! 1000000000 points: D

D'abord, merci à Code Monkey!

Cependant, il est important d’obtenir le bon script python en fonction de la version de votre trac. Pour obtenir la version appropriée, SVN consultez le dossier:

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

xxx correspond à la version de trac que vous utilisez, par exemple: 0.11

Sinon, vous obtiendrez une erreur de post-validation ressemblant à ceci:

validation a échoué (les détails suivent): FUSION de '/ svn / project / trunk / web / directory /': 200 OK

Pour tous les utilisateurs Windows souhaitant installer la dernière version de trac (0.11.5): Suivez les instructions sur le site de Trac nommé TracOnWindows.

Téléchargez Python 32 bits 1.5 même si vous utilisez Windows 64 bits.    Remarque: j’ai vu quelque part des instructions pour compiler Trac afin qu’il fonctionne en mode natif sur un système 64 bits.

Lorsque vous installez tout ce qui est nécessaire, accédez au dossier du référentiel. Il y a des crochets de dossier. À l'intérieur, les fichiers Code Monkey sont mentionnés, mais ne créent pas "trac-post-commit-resolve-ticket-ref.ref", comme il l'a fait. Suivez les conseils de Quant Analyst et faites comme il a dit:

"Cependant, il est important d'obtenir le bon script python en fonction de votre version de trac. Pour obtenir la version appropriée, SVN consulte le dossier: http://svn.edgewall.com/repos/trac/branches/ xxx -stable / contrib où xxx correspond à la version de trac que vous utilisez, par exemple: 0,11 "

À partir de là, le fichier de téléchargement " trac-post-commit-hook " et le mettre dans le dossier des crochets.

Modifiez ces lignes dans trac-post-commit.cmd

  

SET PYTHON_PATH = " Chemin d'accès au dossier d'installation de python "

     

SET TRAC_ENV = " Chemin du dossier dans lequel vous avez   n’a-t-il pas été initié?

N'oubliez pas le dernier \ !!!

J'ai supprimé les guillemets de la dernière ligne -r "% REV% " être -r% REV% mais je ne sais pas si cela est nécessaire. Cela ne fonctionnera pas maintenant (du moins sur mon serveur Win 2008), car le raccordement échouera (la validation sera ok). Cela a à voir avec les autorisations. Par défaut, les autorisations sont limitées et nous devons autoriser python ou svn ou trac (quoi que je ne sache pas) de modifier les informations de traçage. Allez donc dans votre dossier trac, votre dossier projet, votre dossier db, cliquez avec le bouton droit de la souris sur trac.db et choisissez Propriétés. Accédez à l'onglet Sécurité et modifiez les autorisations pour permettre à tout le monde un contrôle total. Ce n’est pas très sûr, mais j’ai perdu toute la journée à propos de cette question de sécurité et je ne veux pas en perdre un autre pour trouver pour quel utilisateur vous devez activer les autorisations.

J'espère que cela vous aidera ....

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top