annotate examples/trac/contrib/bugzilla2trac.py @ 92:01d36818bb3d trunk

More performance improvements... this time for whitespace normalization and template loops.
author cmlenz
date Thu, 20 Jul 2006 23:06:36 +0000
parents 93b4dcbafd7b
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 #!/usr/bin/env python
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 Import a Bugzilla items into a Trac database.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 Requires: Trac 0.9b1 from http://trac.edgewall.com/
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 Python 2.3 from http://www.python.org/
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 MySQL >= 3.23 from http://www.mysql.org/
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 Thanks: Mark Rowe <mrowe@bluewire.net.nz>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 for original TracDatabase class
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 Copyright 2004, Dmitry Yusupov <dmitry_yus@yahoo.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 Many enhancements, Bill Soudan <bill@soudan.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 Other enhancements, Florent Guillaume <fg@nuxeo.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 Reworked, Jeroen Ruigrok van der Werven <asmodai@tendra.org>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 $Id$
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 ###
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 ### Conversion Settings -- edit these before running if desired
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 ###
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 # Bugzilla version. You can find this in Bugzilla's globals.pl file.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 # Currently, the following bugzilla versions are known to work:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 # 2.11 (2110), 2.16.5 (2165), 2.18.3 (2183), 2.19.1 (2191)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 # If you run this script on a version not listed here and it is successful,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 # please report it to the Trac mailing list and drop a note to
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 # asmodai@tendra.org so we can update the list.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 BZ_VERSION = 2180
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 # MySQL connection parameters for the Bugzilla database. These can also
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 # be specified on the command line.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 BZ_DB = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 BZ_HOST = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 BZ_USER = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 BZ_PASSWORD = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 # Path to the Trac environment.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 TRAC_ENV = "/usr/local/trac"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 # If true, all existing Trac tickets and attachments will be removed
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 # prior to import.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 TRAC_CLEAN = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 # Enclose imported ticket description and comments in a {{{ }}}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 # preformat block? This formats the text in a fixed-point font.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 PREFORMAT_COMMENTS = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 # Replace bug numbers in comments with #xyz
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 REPLACE_BUG_NO = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 # Severities
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 SEVERITIES = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 ("blocker", "1"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 ("critical", "2"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 ("major", "3"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 ("normal", "4"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 ("minor", "5"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 ("trivial", "6")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 ]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 # Priorities
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 # If using the default Bugzilla priorities of P1 - P5, do not change anything
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 # here.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 # If you have other priorities defined please change the P1 - P5 mapping to
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 # the order you want. You can also collapse multiple priorities on bugzilla's
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 # side into the same priority on Trac's side, simply adjust PRIORITIES_MAP.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 PRIORITIES = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 ("highest", "1"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 ("high", "2"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 ("normal", "3"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 ("low", "4"),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 ("lowest", "5")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 ]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 # Bugzilla: Trac
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 # NOTE: Use lowercase.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 PRIORITIES_MAP = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 "p1": "highest",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 "p2": "high",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 "p3": "normal",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 "p4": "low",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 "p5": "lowest"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 # By default, all bugs are imported from Bugzilla. If you add a list
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 # of products here, only bugs from those products will be imported.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 PRODUCTS = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 # These Bugzilla products will be ignored during import.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 IGNORE_PRODUCTS = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 # These milestones are ignored
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 IGNORE_MILESTONES = ["---"]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 # These logins are converted to these user ids
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 LOGIN_MAP = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 #'some.user@example.com': 'someuser',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 # These emails are removed from CC list
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 IGNORE_CC = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 #'loser@example.com',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 ]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 # The 'component' field in Trac can come either from the Product or
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 # or from the Component field of Bugzilla. COMPONENTS_FROM_PRODUCTS
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 # switches the behavior.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 # If COMPONENTS_FROM_PRODUCTS is True:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 # - Bugzilla Product -> Trac Component
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 # - Bugzilla Component -> Trac Keyword
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 # IF COMPONENTS_FROM_PRODUCTS is False:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 # - Bugzilla Product -> Trac Keyword
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 # - Bugzilla Component -> Trac Component
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 COMPONENTS_FROM_PRODUCTS = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 # If COMPONENTS_FROM_PRODUCTS is True, the default owner for each
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 # Trac component is inferred from a default Bugzilla component.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 DEFAULT_COMPONENTS = ["default", "misc", "main"]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 # This mapping can assign keywords in the ticket entry to represent
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 # products or components (depending on COMPONENTS_FROM_PRODUCTS).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 # The keyword will be ignored if empty.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 KEYWORDS_MAPPING = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 #'Bugzilla_product_or_component': 'Keyword',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 "default": "",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 "misc": "",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 # If this is True, products or components are all set as keywords
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 # even if not mentionned in KEYWORDS_MAPPING.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 MAP_ALL_KEYWORDS = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 # Bug comments that should not be imported. Each entry in list should
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 # be a regular expression.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 IGNORE_COMMENTS = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 "^Created an attachment \(id="
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 ]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 ###########################################################################
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 ### You probably don't need to change any configuration past this line. ###
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 ###########################################################################
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 # Bugzilla status to Trac status translation map.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 # NOTE: bug activity is translated as well, which may cause bug
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 # activity to be deleted (e.g. resolved -> closed in Bugzilla
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 # would translate into closed -> closed in Trac, so we just ignore the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 # change).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 # There is some special magic for open in the code: if there is no
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 # Bugzilla owner, open is mapped to 'new' instead.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 STATUS_TRANSLATE = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 "unconfirmed": "new",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 "open": "assigned",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 "resolved": "closed",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 "verified": "closed",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 "released": "closed"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 # Translate Bugzilla statuses into Trac keywords. This provides a way
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 # to retain the Bugzilla statuses in Trac. e.g. when a bug is marked
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 # 'verified' in Bugzilla it will be assigned a VERIFIED keyword.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 STATUS_KEYWORDS = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 "verified": "VERIFIED",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 "released": "RELEASED"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 # Some fields in Bugzilla do not have equivalents in Trac. Changes in
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 # fields listed here will not be imported into the ticket change history,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 # otherwise you'd see changes for fields that don't exist in Trac.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 IGNORED_ACTIVITY_FIELDS = ["everconfirmed"]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 # Regular expression and its replacement
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 BUG_NO_RE = re.compile(r"\b(bug #?)([0-9])")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 BUG_NO_REPL = r"#\2"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 ###
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 ### Script begins here
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 ###
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 import os
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 import sys
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 import string
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 import StringIO
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 import MySQLdb
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 import MySQLdb.cursors
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 from trac.env import Environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 except:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 from trac.Environment import Environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 from trac.attachment import Attachment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 if not hasattr(sys, 'setdefaultencoding'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 reload(sys)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 sys.setdefaultencoding('latin1')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 # simulated Attachment class for trac.add
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 #class Attachment:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 # def __init__(self, name, data):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 # self.filename = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 # self.file = StringIO.StringIO(data.tostring())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 # simple field translation mapping. if string not in
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 # mapping, just return string, otherwise return value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 class FieldTranslator(dict):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 def __getitem__(self, item):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 if not dict.has_key(self, item):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 return item
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220 return dict.__getitem__(self, item)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 statusXlator = FieldTranslator(STATUS_TRANSLATE)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 class TracDatabase(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 def __init__(self, path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 self.env = Environment(path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 self._db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 self._db.autocommit = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 self.loginNameCache = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 self.fieldNameCache = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 def db(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 return self._db
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 def hasTickets(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 c.execute("SELECT count(*) FROM Ticket")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 return int(c.fetchall()[0][0]) > 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 def assertNoTickets(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 if self.hasTickets():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 raise Exception("Will not modify database with existing tickets!")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 def setSeverityList(self, s):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 """Remove all severities, set them to `s`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 self.assertNoTickets()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 c.execute("DELETE FROM enum WHERE type='severity'")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250 for value, i in s:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 print " inserting severity '%s' - '%s'" % (value, i)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 c.execute("""INSERT INTO enum (type, name, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 VALUES (%s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 ("severity", value.encode('utf-8'), i))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257 def setPriorityList(self, s):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 """Remove all priorities, set them to `s`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 self.assertNoTickets()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 c.execute("DELETE FROM enum WHERE type='priority'")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 for value, i in s:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 print " inserting priority '%s' - '%s'" % (value, i)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 c.execute("""INSERT INTO enum (type, name, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 VALUES (%s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267 ("priority", value.encode('utf-8'), i))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271 def setComponentList(self, l, key):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272 """Remove all components, set them to `l`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273 self.assertNoTickets()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 c.execute("DELETE FROM component")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 for comp in l:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278 print " inserting component '%s', owner '%s'" % \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 (comp[key], comp['owner'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280 c.execute("INSERT INTO component (name, owner) VALUES (%s, %s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281 (comp[key].encode('utf-8'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282 comp['owner'].encode('utf-8')))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 def setVersionList(self, v, key):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 """Remove all versions, set them to `v`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287 self.assertNoTickets()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 c.execute("DELETE FROM version")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291 for vers in v:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292 print " inserting version '%s'" % (vers[key])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 c.execute("INSERT INTO version (name) VALUES (%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294 (vers[key].encode('utf-8'),))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 def setMilestoneList(self, m, key):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 """Remove all milestones, set them to `m`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299 self.assertNoTickets()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 c.execute("DELETE FROM milestone")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303 for ms in m:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304 milestone = ms[key]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305 print " inserting milestone '%s'" % (milestone)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
306 c.execute("INSERT INTO milestone (name) VALUES (%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
307 (milestone.encode('utf-8'),))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
308 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
309
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
310 def addTicket(self, id, time, changetime, component, severity, priority,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
311 owner, reporter, cc, version, milestone, status, resolution,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
312 summary, description, keywords):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
313 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
314
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
315 desc = description.encode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
316 type = "defect"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
317
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
318 if severity.lower() == "enhancement":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
319 severity = "minor"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
320 type = "enhancement"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
321
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
322 if PREFORMAT_COMMENTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
323 desc = '{{{\n%s\n}}}' % desc
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
324
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
325 if REPLACE_BUG_NO:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
326 if BUG_NO_RE.search(desc):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
327 desc = re.sub(BUG_NO_RE, BUG_NO_REPL, desc)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
328
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
329 if PRIORITIES_MAP.has_key(priority):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
330 priority = PRIORITIES_MAP[priority]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
331
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
332 print " inserting ticket %s -- %s" % (id, summary)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
333
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
334 c.execute("""INSERT INTO ticket (id, type, time, changetime, component,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
335 severity, priority, owner, reporter,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
336 cc, version, milestone, status,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
337 resolution, summary, description,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
338 keywords)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
339 VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
340 %s, %s, %s, %s, %s, %s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
341 (id, type.encode('utf-8'), time.strftime('%s'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
342 changetime.strftime('%s'), component.encode('utf-8'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
343 severity.encode('utf-8'), priority.encode('utf-8'), owner,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
344 reporter, cc, version, milestone.encode('utf-8'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
345 status.lower(), resolution, summary.encode('utf-8'), desc,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
346 keywords))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
347
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
348 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
349 return self.db().get_last_id(c, 'ticket')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
350
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
351 def addTicketComment(self, ticket, time, author, value):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
352 comment = value.encode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
353
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
354 if PREFORMAT_COMMENTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
355 comment = '{{{\n%s\n}}}' % comment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
356
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
357 if REPLACE_BUG_NO:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
358 if BUG_NO_RE.search(comment):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
359 comment = re.sub(BUG_NO_RE, BUG_NO_REPL, comment)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
360
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
361 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
362 c.execute("""INSERT INTO ticket_change (ticket, time, author, field,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
363 oldvalue, newvalue)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
364 VALUES (%s, %s, %s, %s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
365 (ticket, time.strftime('%s'), author, 'comment', '', comment))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
366 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
367
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
368 def addTicketChange(self, ticket, time, author, field, oldvalue, newvalue):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
369 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
370
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
371 if field == "owner":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
372 if LOGIN_MAP.has_key(oldvalue):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
373 oldvalue = LOGIN_MAP[oldvalue]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
374 if LOGIN_MAP.has_key(newvalue):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
375 newvalue = LOGIN_MAP[newvalue]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
376
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
377 if field == "priority":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
378 if PRIORITIES_MAP.has_key(oldvalue.lower()):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
379 oldvalue = PRIORITIES_MAP[oldvalue.lower()]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
380 if PRIORITIES_MAP.has_key(newvalue.lower()):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
381 newvalue = PRIORITIES_MAP[newvalue.lower()]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
382
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
383 # Doesn't make sense if we go from highest -> highest, for example.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
384 if oldvalue == newvalue:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
385 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
386
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
387 c.execute("""INSERT INTO ticket_change (ticket, time, author, field,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
388 oldvalue, newvalue)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
389 VALUES (%s, %s, %s, %s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
390 (ticket, time.strftime('%s'), author, field,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
391 oldvalue.encode('utf-8'), newvalue.encode('utf-8')))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
392 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
393
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
394 def addAttachment(self, author, a):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
395 description = a['description'].encode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
396 id = a['bug_id']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
397 filename = a['filename'].encode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
398 filedata = StringIO.StringIO(a['thedata'].tostring())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
399 filesize = len(filedata.getvalue())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
400 time = a['creation_ts']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
401 print " ->inserting attachment '%s' for ticket %s -- %s" % \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
402 (filename, id, description)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
403
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
404 attachment = Attachment(self.env, 'ticket', id)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
405 attachment.author = author
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
406 attachment.description = description
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
407 attachment.insert(filename, filedata, filesize, time.strftime('%s'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
408 del attachment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
409
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
410 def getLoginName(self, cursor, userid):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
411 if userid not in self.loginNameCache:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
412 cursor.execute("SELECT * FROM profiles WHERE userid = %s", (userid))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
413 loginName = cursor.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
414
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
415 if loginName:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
416 loginName = loginName[0]['login_name']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
417 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
418 print """WARNING: unknown bugzilla userid %d, recording as
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
419 anonymous""" % (userid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
420 loginName = "anonymous"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
421
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
422 loginName = LOGIN_MAP.get(loginName, loginName)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
423
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
424 self.loginNameCache[userid] = loginName
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
425
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
426 return self.loginNameCache[userid]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
427
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
428 def getFieldName(self, cursor, fieldid):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
429 if fieldid not in self.fieldNameCache:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
430 cursor.execute("SELECT * FROM fielddefs WHERE fieldid = %s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
431 (fieldid))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
432 fieldName = cursor.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
433
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
434 if fieldName:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
435 fieldName = fieldName[0]['name'].lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
436 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
437 print "WARNING: unknown bugzilla fieldid %d, \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
438 recording as unknown" % (userid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
439 fieldName = "unknown"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
440
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
441 self.fieldNameCache[fieldid] = fieldName
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
442
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
443 return self.fieldNameCache[fieldid]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
444
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
445 def makeWhereClause(fieldName, values, negative=False):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
446 if not values:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
447 return ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
448 if negative:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
449 connector, op = ' AND ', '!='
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
450 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
451 connector, op = ' OR ', '='
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
452 clause = connector.join(["%s %s '%s'" % (fieldName, op, value) for value in values])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
453 return ' ' + clause
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
454
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
455 def convert(_db, _host, _user, _password, _env, _force):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
456 activityFields = FieldTranslator()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
457
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
458 # account for older versions of bugzilla
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
459 print "Using Bugzilla v%s schema." % BZ_VERSION
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
460 if BZ_VERSION == 2110:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
461 activityFields['removed'] = "oldvalue"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
462 activityFields['added'] = "newvalue"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
463
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
464 # init Bugzilla environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
465 print "Bugzilla MySQL('%s':'%s':'%s':'%s'): connecting..." % \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
466 (_db, _host, _user, ("*" * len(_password)))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
467 mysql_con = MySQLdb.connect(host=_host,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
468 user=_user, passwd=_password, db=_db, compress=1,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
469 cursorclass=MySQLdb.cursors.DictCursor)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
470 mysql_cur = mysql_con.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
471
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
472 # init Trac environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
473 print "Trac SQLite('%s'): connecting..." % (_env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
474 trac = TracDatabase(_env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
475
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
476 # force mode...
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
477 if _force == 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
478 print "\nCleaning all tickets..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
479 c = trac.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
480 c.execute("DELETE FROM ticket_change")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
481 trac.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
482
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
483 c.execute("DELETE FROM ticket")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
484 trac.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
485
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
486 c.execute("DELETE FROM attachment")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
487 attachments_dir = os.path.join(os.path.normpath(trac.env.path),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
488 "attachments")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
489 # Straight from the Python documentation.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
490 for root, dirs, files in os.walk(attachments_dir, topdown=False):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
491 for name in files:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
492 os.remove(os.path.join(root, name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
493 for name in dirs:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
494 os.rmdir(os.path.join(root, name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
495 if not os.stat(attachments_dir):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
496 os.mkdir(attachments_dir)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
497 trac.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
498 print "All tickets cleaned..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
499
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
500
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
501 print "\n0. Filtering products..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
502 mysql_cur.execute("SELECT name FROM products")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
503 products = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
504 for line in mysql_cur.fetchall():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
505 product = line['name']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
506 if PRODUCTS and product not in PRODUCTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
507 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
508 if product in IGNORE_PRODUCTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
509 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
510 products.append(product)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
511 PRODUCTS[:] = products
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
512 print " Using products", " ".join(PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
513
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
514 print "\n1. Import severities..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
515 trac.setSeverityList(SEVERITIES)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
516
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
517 print "\n2. Import components..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
518 if not COMPONENTS_FROM_PRODUCTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
519 if BZ_VERSION >= 2180:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
520 sql = """SELECT DISTINCT c.name AS name, c.initialowner AS owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
521 FROM components AS c, products AS p
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
522 WHERE c.product_id = p.id AND"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
523 sql += makeWhereClause('p.name', PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
524 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
525 sql = "SELECT value AS name, initialowner AS owner FROM components"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
526 sql += " WHERE" + makeWhereClause('program', PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
527 mysql_cur.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
528 components = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
529 for component in components:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
530 component['owner'] = trac.getLoginName(mysql_cur,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
531 component['owner'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
532 trac.setComponentList(components, 'name')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
533 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
534 sql = """SELECT program AS product, value AS comp, initialowner AS owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
535 FROM components"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
536 sql += " WHERE" + makeWhereClause('program', PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
537 mysql_cur.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
538 lines = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
539 all_components = {} # product -> components
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
540 all_owners = {} # product, component -> owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
541 for line in lines:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
542 product = line['product']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
543 comp = line['comp']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
544 owner = line['owner']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
545 all_components.setdefault(product, []).append(comp)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
546 all_owners[(product, comp)] = owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
547 component_list = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
548 for product, components in all_components.items():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
549 # find best default owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
550 default = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
551 for comp in DEFAULT_COMPONENTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
552 if comp in components:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
553 default = comp
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
554 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
555 if default is None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
556 default = components[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
557 owner = all_owners[(product, default)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
558 owner_name = trac.getLoginName(mysql_cur, owner)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
559 component_list.append({'product': product, 'owner': owner_name})
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
560 trac.setComponentList(component_list, 'product')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
561
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
562 print "\n3. Import priorities..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
563 trac.setPriorityList(PRIORITIES)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
564
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
565 print "\n4. Import versions..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
566 if BZ_VERSION >= 2180:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
567 sql = """SELECT DISTINCTROW versions.value AS value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
568 FROM products, versions"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
569 sql += " WHERE" + makeWhereClause('products.name', PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
570 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
571 sql = "SELECT DISTINCTROW value FROM versions"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
572 sql += " WHERE" + makeWhereClause('program', PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
573 mysql_cur.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
574 versions = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
575 trac.setVersionList(versions, 'value')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
576
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
577 print "\n5. Import milestones..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
578 sql = "SELECT DISTINCT value FROM milestones"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
579 sql += " WHERE" + makeWhereClause('value', IGNORE_MILESTONES, negative=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
580 mysql_cur.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
581 milestones = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
582 trac.setMilestoneList(milestones, 'value')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
583
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
584 print "\n6. Retrieving bugs..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
585 sql = """SELECT DISTINCT b.*, c.name AS component, p.name AS product
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
586 FROM bugs AS b, components AS c, products AS p """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
587 sql += " WHERE (" + makeWhereClause('p.name', PRODUCTS)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
588 sql += ") AND b.product_id = p.id"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
589 sql += " AND b.component_id = c.id"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
590 sql += " ORDER BY b.bug_id"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
591 mysql_cur.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
592 bugs = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
593
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
594
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
595 print "\n7. Import bugs and bug activity..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
596 for bug in bugs:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
597 bugid = bug['bug_id']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
598
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
599 ticket = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
600 keywords = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
601 ticket['id'] = bugid
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
602 ticket['time'] = bug['creation_ts']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
603 ticket['changetime'] = bug['delta_ts']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
604 if COMPONENTS_FROM_PRODUCTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
605 ticket['component'] = bug['product']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
606 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
607 ticket['component'] = bug['component']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
608 ticket['severity'] = bug['bug_severity']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
609 ticket['priority'] = bug['priority'].lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
610
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
611 ticket['owner'] = trac.getLoginName(mysql_cur, bug['assigned_to'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
612 ticket['reporter'] = trac.getLoginName(mysql_cur, bug['reporter'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
613
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
614 mysql_cur.execute("SELECT * FROM cc WHERE bug_id = %s", bugid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
615 cc_records = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
616 cc_list = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
617 for cc in cc_records:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
618 cc_list.append(trac.getLoginName(mysql_cur, cc['who']))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
619 cc_list = [cc for cc in cc_list if '@' in cc and cc not in IGNORE_CC]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
620 ticket['cc'] = string.join(cc_list, ', ')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
621
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
622 ticket['version'] = bug['version']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
623
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
624 target_milestone = bug['target_milestone']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
625 if target_milestone in IGNORE_MILESTONES:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
626 target_milestone = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
627 ticket['milestone'] = target_milestone
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
628
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
629 bug_status = bug['bug_status'].lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
630 ticket['status'] = statusXlator[bug_status]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
631 ticket['resolution'] = bug['resolution'].lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
632
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
633 # a bit of extra work to do open tickets
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
634 if bug_status == 'open':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
635 if owner != '':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
636 ticket['status'] = 'assigned'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
637 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
638 ticket['status'] = 'new'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
639
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
640 ticket['summary'] = bug['short_desc']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
641
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
642 mysql_cur.execute("SELECT * FROM longdescs WHERE bug_id = %s" % bugid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
643 longdescs = list(mysql_cur.fetchall())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
644
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
645 # check for empty 'longdescs[0]' field...
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
646 if len(longdescs) == 0:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
647 ticket['description'] = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
648 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
649 ticket['description'] = longdescs[0]['thetext']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
650 del longdescs[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
651
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
652 for desc in longdescs:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
653 ignore = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
654 for comment in IGNORE_COMMENTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
655 if re.match(comment, desc['thetext']):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
656 ignore = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
657
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
658 if ignore:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
659 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
660
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
661 trac.addTicketComment(ticket=bugid,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
662 time = desc['bug_when'],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
663 author=trac.getLoginName(mysql_cur, desc['who']),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
664 value = desc['thetext'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
665
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
666 mysql_cur.execute("""SELECT * FROM bugs_activity WHERE bug_id = %s
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
667 ORDER BY bug_when""" % bugid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
668 bugs_activity = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
669 resolution = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
670 ticketChanges = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
671 keywords = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
672 for activity in bugs_activity:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
673 field_name = trac.getFieldName(mysql_cur, activity['fieldid']).lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
674
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
675 removed = activity[activityFields['removed']]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
676 added = activity[activityFields['added']]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
677
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
678 # statuses and resolutions are in lowercase in trac
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
679 if field_name == "resolution" or field_name == "bug_status":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
680 removed = removed.lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
681 added = added.lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
682
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
683 # remember most recent resolution, we need this later
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
684 if field_name == "resolution":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
685 resolution = added.lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
686
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
687 add_keywords = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
688 remove_keywords = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
689
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
690 # convert bugzilla field names...
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
691 if field_name == "bug_severity":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
692 field_name = "severity"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
693 elif field_name == "assigned_to":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
694 field_name = "owner"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
695 elif field_name == "bug_status":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
696 field_name = "status"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
697 if removed in STATUS_KEYWORDS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
698 remove_keywords.append(STATUS_KEYWORDS[removed])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
699 if added in STATUS_KEYWORDS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
700 add_keywords.append(STATUS_KEYWORDS[added])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
701 added = statusXlator[added]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
702 removed = statusXlator[removed]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
703 elif field_name == "short_desc":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
704 field_name = "summary"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
705 elif field_name == "product" and COMPONENTS_FROM_PRODUCTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
706 field_name = "component"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
707 elif ((field_name == "product" and not COMPONENTS_FROM_PRODUCTS) or
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
708 (field_name == "component" and COMPONENTS_FROM_PRODUCTS)):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
709 if MAP_ALL_KEYWORDS or removed in KEYWORDS_MAPPING:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
710 kw = KEYWORDS_MAPPING.get(removed, removed)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
711 if kw:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
712 remove_keywords.append(kw)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
713 if MAP_ALL_KEYWORDS or added in KEYWORDS_MAPPING:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
714 kw = KEYWORDS_MAPPING.get(added, added)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
715 if kw:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
716 add_keywords.append(kw)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
717 if field_name == "component":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
718 # just keep the keyword change
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
719 added = removed = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
720 elif field_name == "target_milestone":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
721 field_name = "milestone"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
722 if added in IGNORE_MILESTONES:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
723 added = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
724 if removed in IGNORE_MILESTONES:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
725 removed = ""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
726
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
727 ticketChange = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
728 ticketChange['ticket'] = bugid
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
729 ticketChange['time'] = activity['bug_when']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
730 ticketChange['author'] = trac.getLoginName(mysql_cur,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
731 activity['who'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
732 ticketChange['field'] = field_name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
733 ticketChange['oldvalue'] = removed
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
734 ticketChange['newvalue'] = added
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
735
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
736 if add_keywords or remove_keywords:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
737 # ensure removed ones are in old
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
738 old_keywords = keywords + [kw for kw in remove_keywords if kw
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
739 not in keywords]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
740 # remove from new
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
741 keywords = [kw for kw in keywords if kw not in remove_keywords]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
742 # add to new
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
743 keywords += [kw for kw in add_keywords if kw not in keywords]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
744 if old_keywords != keywords:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
745 ticketChangeKw = ticketChange.copy()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
746 ticketChangeKw['field'] = "keywords"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
747 ticketChangeKw['oldvalue'] = ' '.join(old_keywords)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
748 ticketChangeKw['newvalue'] = ' '.join(keywords)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
749 ticketChanges.append(ticketChangeKw)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
750
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
751 if field_name in IGNORED_ACTIVITY_FIELDS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
752 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
753
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
754 # Skip changes that have no effect (think translation!).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
755 if added == removed:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
756 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
757
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
758 # Bugzilla splits large summary changes into two records.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
759 for oldChange in ticketChanges:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
760 if (field_name == "summary"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
761 and oldChange['field'] == ticketChange['field']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
762 and oldChange['time'] == ticketChange['time']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
763 and oldChange['author'] == ticketChange['author']):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
764 oldChange['oldvalue'] += " " + ticketChange['oldvalue']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
765 oldChange['newvalue'] += " " + ticketChange['newvalue']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
766 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
767 # cc sometime appear in different activities with same time
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
768 if (field_name == "cc" \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
769 and oldChange['time'] == ticketChange['time']):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
770 oldChange['newvalue'] += ", " + ticketChange['newvalue']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
771 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
772 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
773 ticketChanges.append (ticketChange)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
774
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
775 for ticketChange in ticketChanges:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
776 trac.addTicketChange (**ticketChange)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
777
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
778 # For some reason, bugzilla v2.11 seems to clear the resolution
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
779 # when you mark a bug as closed. Let's remember it and restore
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
780 # it if the ticket is closed but there's no resolution.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
781 if not ticket['resolution'] and ticket['status'] == "closed":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
782 ticket['resolution'] = resolution
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
783
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
784 bug_status = bug['bug_status']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
785 if bug_status in STATUS_KEYWORDS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
786 kw = STATUS_KEYWORDS[bug_status]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
787 if kw not in keywords:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
788 keywords.append(kw)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
789
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
790 product = bug['product']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
791 if product in KEYWORDS_MAPPING and not COMPONENTS_FROM_PRODUCTS:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
792 kw = KEYWORDS_MAPPING.get(product, product)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
793 if kw and kw not in keywords:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
794 keywords.append(kw)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
795
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
796 component = bug['component']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
797 if (COMPONENTS_FROM_PRODUCTS and \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
798 (MAP_ALL_KEYWORDS or component in KEYWORDS_MAPPING)):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
799 kw = KEYWORDS_MAPPING.get(component, component)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
800 if kw and kw not in keywords:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
801 keywords.append(kw)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
802
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
803 ticket['keywords'] = string.join(keywords)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
804 ticketid = trac.addTicket(**ticket)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
805
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
806 mysql_cur.execute("SELECT * FROM attachments WHERE bug_id = %s" % bugid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
807 attachments = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
808 for a in attachments:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
809 author = trac.getLoginName(mysql_cur, a['submitter_id'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
810 trac.addAttachment(author, a)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
811
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
812 print "\n8. Importing users and passwords..."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
813 if BZ_VERSION >= 2180:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
814 mysql_cur.execute("SELECT login_name, cryptpassword FROM profiles")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
815 users = mysql_cur.fetchall()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
816 htpasswd = file("htpasswd", 'w')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
817 for user in users:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
818 if LOGIN_MAP.has_key(user['login_name']):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
819 login = LOGIN_MAP[user['login_name']]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
820 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
821 login = user['login_name']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
822 htpasswd.write(login + ":" + user['cryptpassword'] + "\n")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
823
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
824 htpasswd.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
825 print " Bugzilla users converted to htpasswd format, see 'htpasswd'."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
826
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
827 print "\nAll tickets converted."
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
828
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
829 def log(msg):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
830 print "DEBUG: %s" % (msg)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
831
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
832 def usage():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
833 print """bugzilla2trac - Imports a bug database from Bugzilla into Trac.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
834
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
835 Usage: bugzilla2trac.py [options]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
836
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
837 Available Options:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
838 --db <MySQL dbname> - Bugzilla's database name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
839 --tracenv /path/to/trac/env - Full path to Trac db environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
840 -h | --host <MySQL hostname> - Bugzilla's DNS host name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
841 -u | --user <MySQL username> - Effective Bugzilla's database user
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
842 -p | --passwd <MySQL password> - Bugzilla's user password
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
843 -c | --clean - Remove current Trac tickets before
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
844 importing
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
845 --help | help - This help info
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
846
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
847 Additional configuration options can be defined directly in the script.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
848 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
849 sys.exit(0)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
850
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
851 def main():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
852 global BZ_DB, BZ_HOST, BZ_USER, BZ_PASSWORD, TRAC_ENV, TRAC_CLEAN
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
853 if len (sys.argv) > 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
854 if sys.argv[1] in ['--help','help'] or len(sys.argv) < 4:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
855 usage()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
856 iter = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
857 while iter < len(sys.argv):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
858 if sys.argv[iter] in ['--db'] and iter+1 < len(sys.argv):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
859 BZ_DB = sys.argv[iter+1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
860 iter = iter + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
861 elif sys.argv[iter] in ['-h', '--host'] and iter+1 < len(sys.argv):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
862 BZ_HOST = sys.argv[iter+1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
863 iter = iter + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
864 elif sys.argv[iter] in ['-u', '--user'] and iter+1 < len(sys.argv):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
865 BZ_USER = sys.argv[iter+1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
866 iter = iter + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
867 elif sys.argv[iter] in ['-p', '--passwd'] and iter+1 < len(sys.argv):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
868 BZ_PASSWORD = sys.argv[iter+1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
869 iter = iter + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
870 elif sys.argv[iter] in ['--tracenv'] and iter+1 < len(sys.argv):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
871 TRAC_ENV = sys.argv[iter+1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
872 iter = iter + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
873 elif sys.argv[iter] in ['-c', '--clean']:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
874 TRAC_CLEAN = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
875 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
876 print "Error: unknown parameter: " + sys.argv[iter]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
877 sys.exit(0)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
878 iter = iter + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
879
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
880 convert(BZ_DB, BZ_HOST, BZ_USER, BZ_PASSWORD, TRAC_ENV, TRAC_CLEAN)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
881
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
882 if __name__ == '__main__':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
883 main()
Copyright (C) 2012-2017 Edgewall Software