Wie implementiere ich das Post Commit Haken mit Trac & SVN in einer Windows-Umgebung?

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich bin in einer Windows-Umgebung mit Trac / SVN läuft und ich möchte verpflichtet sich das Repository Trac zu integrieren und die Fehler zu schließen, die in der SVN Kommentar festgestellt wurden.

Ich weiß, dass es einige Post commit Haken, das zu tun, aber es gibt nicht viele Informationen darüber, wie es auf Windows zu tun.

Wer es erfolgreich getan? Und was die Schritte waren Sie es folgen achive?

Hier ist der Haken ich in SVN anstelle setzen müssen, aber ich bin mir nicht ganz sicher, wie dies in der Windows-Umgebung zu tun.

Trac Beitrag commit

War es hilfreich?

Lösung 2

In Ordnung, jetzt, wo ich einige Zeit habe meine Erfahrungen zu schreiben, nachdem diese alle aus, und dank Craig Bezifferung für mich auf dem richtigen Weg zu bekommen. Hier ist, was Sie tun müssen (zumindest mit SVN v1.4 und Trac v0.10.3):

  1. Suchen Sie Ihre SVN-Repository, dass Sie die Post Commit Haken für aktivieren möchten.
  2. innerhalb der SVN-Repository gibt es ein Verzeichnis Haken genannt, das ist, wo Sie den Pfosten commit platzieren werden.
  3. Erstellen Sie eine Datei post-commit.bat (dies ist die Batch-Datei wird automatisch von SVN Post begehen genannt).
  4. Fügen Sie folgenden Code in der post-commit.bat-Datei (dies wird Ihr Beitrag begehen cmd-Datei vorbei in den Parametern aufrufen, die SVN automatisch passiert% 1 das Repository,% 2 ist die Revision, die begangen wurde.

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

  1. Erstellen Sie nun die trac-post-commit-hook.cmd Datei wie folgt:
  

@ECHO OFF
::
:: Trac   post-commit-Hook-Skript für   Windows-
::
:: Beitrag von   markus, von cboos modifiziert.
::   Verbrauch:
::
:: 1) Legen Sie die   folgende Zeile in Ihrem Post commit.bat   Skript
::
:: Aufruf   % ~ Dp0 \ trac-post-commit-hook.cmd% 1   % 2
::
:: 2) Überprüfen Sie die ‚Modify   Pfade Abschnitt weiter unten, sollten Sie festlegen   mindestens TRAC_ENV
::   -------------------------------------------------- --------
:: ändern Pfade hier:
:: -   dies ein muss
SET eingestellt werden   TRAC_ENV = C: \ trac \ MySpecialProject
  
:: - gesetzt, wenn Python nicht in der ist   Systempfad
:: SET   PYTHON_PATH =
:: - auf die   Ordner mit trac / falls vorhanden   in einem Nicht-Standard-Standort
:: SET   TRAC_PATH =
::   -------------------------------------------------- --------
:: nicht ausführen Haken wenn trac   Umwelt existiert nicht
IF NOT   EXIST% TRAC_ENV% GOTO: EOF
  set PATH =% PYTHON_PATH%;% PATH%
eingestellt   PYTHONPATH =% TRAC_PATH%;% PYTHONPATH%
  
SET REV =% 2
:: THE GET   Autor und Lognachricht
für / F   %% A in ( 'svnlook Autor -r% REV%% 1')   tun Satz AUTOR = %% A
für / F   "Delims ==" %% B in ( 'svnlook log -r   % REV%% 1' ) stelle LOG = %% B
::   ANRUF des Python-Skript
Python   "% ~ Dp0 \ trac-post-commit-hook" -p   "% TRAC_ENV%" -r "% REV%" -u "% AUTOR%"   -m "% LOG%"

Die wichtigsten Teile sind hier Ihre TRAC_ENV einstellen, welche ist der Pfad zu dem Repository root (SET TRAC_ENV = C: \ trac \ MySpecialProject)

Die nächste Majorly Wichtig in diesem Skript ist folgendes zu tun:

  

:: DER AUTOR bekommen und die LOG   MESSAGE
für / F %% A in ( 'svnlook   Autor -r% REV%% 1' ) konfiguriert   AUTHOR = %% A
für / F "delims ==" %% B   in ( '%%% 1 REV svnlook log -r') stelle   LOG = %% B

Wenn Sie in der Skriptdatei siehe oben Ich bin mit svnlook (das ist ein Kommandozeilenprogramm mit SVN), um die Log-Nachricht zu erhalten und den Autor, dass die in das Repository gemacht.

Dann wird die nächste Zeile des Skripts Aufruf tatsächlich den Python-Code das Schließen der Tickets durchzuführen und die Log-Nachricht zu analysieren. Ich hatte dies zu ändern, in der Log-Nachricht zu übergeben und den Autor (die die Benutzernamen ich in Trac verwenden, um die Benutzernamen in SVN übereinstimmen, so dass war einfach).

  

rufen Sie das Python-Skript
Python   "% ~ Dp0 \ trac-post-commit-hook" -p   "% TRAC_ENV%" -r "% REV%" -u "% AUTOR%"   -m "% LOG%"

Die obige Zeile im Skript wird den Python-Skript geht in der Trac-Umgebung, die Revision, die Person, die der Commit gemacht, und ihr Kommentar.

Hier ist der Python-Skript, das ich verwenden. Eine Sache, die ich zum regulären Skript zusätzlich habe, die wir verwenden, um ein benutzerdefiniertes Feld (fixed_in_ver), die durch unser QA-Team verwendet wird, zu sagen, ob das Update ihnen Validierung sind in der Version von Code ist, dass sie in QS-Prüfung sind. So modifizierte ich den Code in PythonSkript zu aktualisieren, das Feld auf dem Ticket. Sie können diesen Code entfernen, wie Sie es nicht brauchen, aber es ist ein gutes Beispiel dafür, was Sie tun können benutzerdefinierte Felder in Trac zu aktualisieren, wenn Sie auch das tun wollen.

Das habe ich durch umfassen die Benutzer optional in ihrem Kommentar so etwas wie:

  

(Version 2.1.2223.0)

Ich benutze dann die gleiche Technik, die der Python-Skript mit regulären Ausdrücken verwendet die Informationen, um aus. Es war nicht so schlimm.

Wie auch immer, hier ist der Python-Skript, das ich verwenden, Hoffentlich ist dies ein gutes Tutorial auf genau das, was ich getan habe, um es in der Windows-Welt zu arbeiten, so dass Sie alles in Ihrem eigenen Geschäft nutzen können ...

Wenn Sie nicht mit meinem zusätzlichen Code beschäftigen mögen das benutzerdefinierte Feld zu aktualisieren, erhalten den Basis-Skript von diesem Ort, wie durch Craig oben ( Script Von Edge )

#!/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()

Andere Tipps

Benjamin Antwort liegt in der Nähe, aber unter Windows müssen Sie die Hook-Skript-Dateien eine ausführbare Erweiterung geben, wie .bat oder .cmd. Ich benutze .cmd. Sie können die Schablonen Scripts, die Unix-Shell-Skripten, Shell-Skripte und wandeln sie in .bat / .cmd Syntax.

Aber die Frage zu beantworten mit Trac zu integrieren, gehen Sie folgendermaßen vor.

  1. Stellen Sie sicher, dass python.exe auf dem Systempfad befindet. Das macht das Leben einfacher.

  2. Erstellen Post commit.cmd in \ Haken Ordner. Dies ist der eigentliche Hook-Skript, dass Subversion auf dem post-commit Ereignisse ausgeführt wird.

    @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. Erstellen trac-post-commit.cmd in \ Haken Ordner:

    @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. Erstellen trac-post-commit-resolve-ticket-ref.py in \ Ordner hakt. Ich benutzte selben Skript von Edge , nur umbenannt ich es besser seinen Zweck zu klären.

Nach commit Haken in der „Haken“ Verzeichnis leben, wo immer Sie das Repository auf der Server-Seite leben haben. Ich weiß nicht, wo Sie sie in Ihrer Umgebung haben, so ist dies nur ein Beispiel

z. (Fenster):

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

z. (Llinux / Unix):

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

Eine Sache, werde ich „Code Monkey Antwort ist PERFECT“ hinzufügen - ist vorsichtig davon zu sein (mein Fehler)

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

Ich hatte nicht die Nicht-Systempfade gesetzt und dauerte eine Weile, das Offensichtliche zu sehen: D

Just passen sicher niemand sonst den gleichen Fehler macht! Dank Code Monkey! 1000000000 Punkte: D

Zuerst wird ein großer Dank an Code Monkey!

Allerdings ist es wichtig, das richtige Python-Skript erhalten je nach trac-Version. Um die entsprechende Version zu bekommen, SVN überprüfen Sie den Ordner:

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

Dabei steht xxx entspricht die trac-Version Sie verwenden, zum Beispiel: 0,11

Sonst bekommen Sie ein post-commit Fehler, der wie folgt aussieht:

Commit fehlgeschlagen (Details folgen): MERGE von '/ svn / project / trunk / web / Verzeichnis /': 200 OK

Für alle Windows-Benutzer, der will neuesten trac installieren (0.11.5): Folgen Sie den Anweisungen auf Trac Website mit dem Namen TracOnWindows.

Herunterladen 32bit 1.5 Python selbst wenn Sie Windows-64-Bit haben.    . Anmerkung: Ich sah irgendwo Anweisungen, wie trac kompilieren nativ auf 64-Bit-System arbeiten

Wenn Sie alle installieren, die erforderlich ist, geht in dem Repository Ordner. Es gibt Ordner Haken. Im Innern Dateien setzen genannten Code Monkey, aber nicht erstellen „trac-post-commit-resolve-ticket-ref.py“ wie er es tat. Lassen Sie sich beraten von Quant Analyst und tun, wie er sagte:

.

"Es ist jedoch wichtig, den richtigen Python-Skript je nach trac-Version zu erhalten, um die entsprechende Version zu erhalten, überprüfen Sie SVN, um den Ordner aus: http://svn.edgewall.com/repos/trac/branches/ xxx -stable / contrib wobei xxx entspricht die trac-Version Sie verwenden, zum Beispiel: 0.11"

Von dort downoad Datei "trac-post-commit-hook" und legen Sie sie in Haken Ordner.

Bearbeiten dieser Zeilen in trac-post-commit.cmd

  

SET PYTHON_PATH = "Pfad zum Python-Installationsordner"

     

SET TRAC_ENV = "Pfad zum Ordner, in dem   hat tracd initenv "

Denken Sie daran, nicht zuletzt \ !!!

Ich habe Zitate aus dem letzten Zeile -r „% REV%“ entfernt -r% REV% sein, aber ich weiß nicht, ob dies erforderlich ist. Dies wird nicht funktionieren jetzt (zumindest auf meinem Win 2008 Server), weil Haken fehl (Commit gehen ok). Das hat mit Berechtigungen zu tun. Standardmäßig werden die Berechtigungen eingeschränkt, und wir brauchen Python oder SVN oder trac ermöglichen (was auch immer, ich weiß nicht) trac Informationen zu ändern. So gehen Sie zu Ihrem trac Ordner, Projektordner, db Ordner mit der rechten trac.db klicken und Eigenschaften wählen. Gehen Sie auf die Registerkarte Sicherheit und Bearbeitungsrechte jeder volle Kontrolle zu ermöglichen. Dies ist nicht so sicher, aber ich verschwendete die ganzen Tag auf dieser Sicherheits Angelegenheit und ich möchte nicht, eine andere nur verschwenden, für die finden Benutzer sollten Sie Berechtigungen ermöglichen.

Hope, das hilft ....

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top