Edgewall Software

root/trunk/contrib/trac-pre-commit-hook

Revision 7440, 1.9 KB (checked in by jonas, 4 months ago)

Merged r7438, r7439 from 0.11-stable.

  • Property svn:eol-style set to native
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Author: Jonas Borgström <jonas@edgewall.com>
5#
6# This script will enforce the following policy:
7#
8#  "A checkin must reference an open ticket."
9#
10# This script should be invoked from the subversion pre-commit hook like this:
11#
12#  REPOS="$1"
13#  TXN="$2"
14#  TRAC_ENV="/somewhere/trac/project/"
15#  LOG=`/usr/bin/svnlook log -t "$TXN" "$REPOS"`
16#  /usr/bin/python /some/path/trac-pre-commit-hook "$TRAC_ENV" "$LOG" || exit 1
17#
18import os
19import re
20import sys
21
22if not 'PYTHON_EGG_CACHE' in os.environ:
23    os.environ['PYTHON_EGG_CACHE'] = os.path.join(sys.argv[1], '.egg-cache') 
24
25from trac.env import open_environment
26
27def main():
28    if len(sys.argv) != 3:
29        print >> sys.stderr, 'Usage: %s <trac_project> <log_message>' % sys.argv[0]
30        sys.exit(1)
31
32    env_path = sys.argv[1]
33    log = sys.argv[2]
34
35    tickets = []
36    for tmp in re.findall('(?:close|closed|closes|fix|fixed|fixes|addresses|references|refs|re|see)'
37                          '.?(#[0-9]+(?:(?:[, &]+| *and *)#[0-9]+)*)', log.lower()):
38        tickets += re.findall('#([0-9]+)', tmp)
39   
40    # At least one ticket has to be mentioned in the log message
41    if tickets == []:
42        print >> sys.stderr, 'At least one open ticket must be mentioned ' \
43              'in the log message.'
44        sys.exit(1)
45
46    env = open_environment(env_path)
47    db = env.get_db_cnx()
48
49    cursor = db.cursor()
50    cursor.execute("SELECT COUNT(id) FROM ticket WHERE "
51                   "status <> 'closed' AND id IN (%s)" % ','.join(tickets))
52    row = cursor.fetchone()
53    # At least one of the tickets mentioned in the log messages has to
54    # be open
55    if not row or row[0] < 1:
56        print >> sys.stderr, 'At least one open ticket must be mentioned ' \
57              'in the log message.'
58        sys.exit(1)
59    else:
60        sys.exit(0)
61
62if __name__ == '__main__':
63    main()
64
65
Note: See TracBrowser for help on using the browser.