Modify

Opened 9 years ago

Closed 9 years ago

Last modified 8 years ago

#105 closed enhancement (invalid)

Include changeset summaries in tickets

Reported by: billbrasky66@… Owned by: anybody
Priority: normal Component: Request-a-Hack
Severity: normal Keywords:
Cc: Trac Release:

Description

It would be nice to automagically include changeset summaries in tickets. So, if you commit to svn with something like:
Ticket #2: Fixed bug in preprocessor that was causing NPE the changeset summary would get posted as a comment in the ticket (or at least linked). This is helpful on large projects where you want quick access to what diffs were required to fix a bug.

We did this in the past with a subversion hook that posted into a bugzilla database:
(code compliments of Luke Francl look at recursion dot org)

#! /usr/bin/python

# Update Bugzilla when a commit message includes a bug number.

import sys
import os
import re
import MySQLdb
import time



# MySQL connection configuration
db_host="deathstar"
db_user="bugs"
db_password="bugs"
db_name="bugs"

# Regex taken from ViewCVS .92 with bug linking patch.
# match BUG followed by up to three non digit caracters followed by 
# three or more digits.
bug_re = re.compile( "[Bb][Uu][Gg]\D{1,3}(\d{3,})", re.DOTALL )

# map Subversion names to bugzilla login 
name_map = { 'jason' : 'jcwik', 'kurt': 'kmehlhof' }

# full path to svnlook
svnlook = "/usr/bin/svnlook"

def get_message( revision, repository_path ) :
    command = svnlook + " log -r " + revision + " " + repository_path

    pipe = os.popen( command )

    log_message = pipe.read()

    pipe.close()

    print( log_message )

    return log_message


def get_bugs( log_message ) :

    bugs = []

    for match in bug_re.finditer( log_message ) :
        bug_number = match.group( 1 )

        print( "Found bug number: " + bug_number )

        if ( bugs.count( bug_number ) == 0 ) :
           bugs.append( bug_number )

    return bugs


def get_userid( revision_number, repository_path ) :
    command = svnlook + " author -r " + revision_number + " " + repository_path

    pipe = os.popen( command )

    author = pipe.read().strip()

    pipe.close()

    if ( author == None or author == "" ) :
       raise Exception( "No author for " + revision_number + " in " + repository_path )

    if ( name_map.has_key( author ) ) :
       author = name_map[ author ]

    query = "select userid from profiles where login_name = '" + author + "'"

    print query

    connection = MySQLdb.connect( host=db_host, user=db_user, passwd=db_password, db=db_name )

    cursor = connection.cursor()

    if ( cursor.execute( query ) ) :

       row = cursor.fetchone()

       return row[0]


def get_changed_files( revision_number, repository_path ) :

    command = svnlook + " changed -r " + revision_number + " " + repository_path

    pipe = os.popen( command ) 

    changed_files = pipe.read()

    pipe.close()

    return changed_files


def add_comment( userid, bug_number, message ) : 

    insert = "insert into longdescs values( %s, %s, now(), %s )" 
    connection = MySQLdb.connect( host=db_host, user=db_user, passwd=db_password, db=db_name )

    cursor = connection.cursor()

    cursor.execute( insert, ( bug_number, userid, message ) )

    cursor.close()

    connection.close()


if __name__ == '__main__' :
   if ( len( sys.argv ) != 3 ) :
      print """Usage: update-bugzilla.py repository_path revision_number"""

      sys.exit()


   repository_path = sys.argv[ 1 ]
   revision_number = sys.argv[ 2 ]

   log_message = get_message( revision_number, repository_path )

   bugs = get_bugs( log_message )

   userid = get_userid( revision_number, repository_path )

   if userid == None : 
      sys.exit()

   changed_files = get_changed_files( revision_number, repository_path )

   message = log_message + "\n\n" + "Revision: " + revision_number + "\n" + "Changes: \n\n"
   message += changed_files

   print( repr( bugs ) )

   print( "UserID: " + str( userid ) )

   for bug_number in bugs:
      add_comment( userid, bug_number, message )

Attachments (0)

Change History (1)

comment:1 Changed 9 years ago by athomas

  • Resolution set to invalid
  • Status changed from new to closed

This is already included in Trac.

Add Comment

Modify Ticket

Action
as closed .
as The resolution will be set. Next status will be 'closed'.
to The owner will be changed from anybody. Next status will be 'closed'.
The resolution will be deleted. Next status will be 'reopened'.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.