48
57
launchpad = Launchpad.get_token_and_login("lp-integration", EDGE_SERVICE_ROOT, cachedir)
49
58
launchpad.credentials.save(open(credfile,"w",0600))
51
Blueprint=Connector.ConnectBlueprint()
52
Blueprint.authentication="cookie.txt"
54
#Loading PostgreSQL settings from the site config (assuming we are in /scripts from the site root)
55
config=open("../sites/default/settings.php")
56
for line in config.readlines():
57
if re.match('\$db_url',line):
58
db=line.replace("\n","")
59
db=re.split('.*= \'(.*)://(.*):(.*)@(.*)/(.*)\';.*', db)
62
db=pgdb.connect(user=db[2],password=db[3],host=db[4],database=db[5])
62
db=pgdb.connect(user=db_user,password=db_password,host=db_host,database=db_database)
65
sys.exit("Failed to connect to the DB")
65
sys.exit("Failed to connect to the DB")
68
"Returns an array of bugnumber for the give SQL queries"
72
for item in cursor.fetchall():
74
itemlist.append(item[0])
76
#Now generate a list of distinct bugs
68
"Returns an array of bugnumber for the given SQL queries"
72
for item in cursor.fetchall():
83
77
def updateBug(bugnumber):
84
"Get LP information about bugnumber, tag if a tag is specified and update the DB"
86
bugnumber=int(bugnumber)
88
bug=launchpad.bugs[bugnumber]
90
if verbose >= 1: print "Unable to open bug "+str(bugnumber)
97
mainbug=bug.duplicate_of.id
98
bug=launchpad.bugs[mainbug]
102
if isinstance(mainbug, int) and isinstance(bugnumber, int):
103
bug_bugnumber=str(mainbug)
104
bug_originalbug=str(bugnumber)
106
#Tags are only used by the QA-Tracker (yet)
108
cursor.execute("SELECT qawebsite_module_setting.value FROM qatracker_result LEFT JOIN qatracker_bug ON qatracker_bug.resultid=qatracker_result.id LEFT JOIN qatracker_build ON qatracker_build.id=qatracker_result.buildid LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid LEFT JOIN qawebsite_module_setting ON qawebsite_module_setting.siteid=qatracker_milestone.siteid WHERE qawebsite_module_setting.option='bug_tag' AND qawebsite_module_setting.option!='' AND qatracker_bug.bugnumber='"+str(bugnumber)+"'")
109
for tagtext in cursor.fetchall():
110
if tagtext[0] != "" and tagtext[0] not in bug.tags:
112
bug.tags.append(str(tagtext[0]))
114
if verbose >= 2: print "Tag \""+str(tagtext[0])+"\" added to bug "+str(bugnumber)
116
if tag == 0 and verbose >= 2: print "Tag \""+str(tagtext[0])+"\" would have been added to bug "+str(bugnumber)
118
if verbose >= 2: print "Unable to tag, either unable to get the tag from the DB (probably not using qatracker) or python-launchpadlib failed to tag the bug"
121
bug_title=pgdb._quote(bug.title)
126
# 2009-10-01 - just use the first Ubuntu bug task found for lack of a better idea
127
task_links = [task.self_link for task in bug.bug_tasks]
128
task_links.sort(reverse=True)
130
for task_link in task_links:
131
if 'ubuntu/+source' in task_link:
132
task = launchpad.load(task_link)
133
bug_product = task.bug_target_display_name
134
bug_product=pgdb._quote(bug_product)
135
bug_status=pgdb._quote(task.status)
136
bug_importance=pgdb._quote(task.importance)
139
bug_assignee=pgdb._quote(task.assignee.display_name)
141
bug_assignee=pgdb._quote(task.assignee.name)
143
bug_assignee=pgdb._quote("None")
145
elif 'ubuntu/+bug' in task_link:
146
task = launchpad.load(task_link)
147
bug_product = task.bug_target_display_name
148
bug_product=pgdb._quote(bug_product)
149
bug_status=pgdb._quote(task.status)
150
bug_importance=pgdb._quote(task.importance)
153
bug_assignee=pgdb._quote(task.assignee.display_name)
155
bug_assignee=pgdb._quote(task.assignee.name)
157
bug_assignee=pgdb._quote("None")
159
if len(bug.messages) > 0:
160
bug_comments=str(len(bug.messages))
164
# this used to be direct subscribers only but this doesn't exist in
165
# python-launchpadlib
166
if len(bug.subscriptions) > 0:
167
bug_subscribers=str(len(bug.subscriptions))
171
bug_duplicates=str(len(bug.duplicates))
174
if verbose >= 1: print "Object is not bug "+str(bugnumber)
177
if verbose >= 1: print "Error while parsing bug "+str(bugnumber)
181
cursor.execute("SELECT originalbug FROM qawebsite_launchpad_bug WHERE originalbug='"+bug_originalbug+"'")
182
if len(cursor.fetchall()) == 0:
183
cursor.execute("INSERT INTO qawebsite_launchpad_bug (bugnumber, originalbug, title, product, status, importance, assignee, mentoring, commentscount, subscriberscount, duplicatescount) VALUES ("+bug_bugnumber+","+bug_originalbug+","+bug_title+","+bug_product+","+bug_status+","+bug_importance+","+bug_assignee+","+bug_mentoring+","+bug_comments+","+bug_subscribers+","+bug_duplicates+")")
185
cursor.execute("UPDATE qawebsite_launchpad_bug SET lastchange=now() WHERE originalbug='"+bug_originalbug+"' AND status!="+bug_status)
186
cursor.execute("UPDATE qawebsite_launchpad_bug SET bugnumber="+bug_bugnumber+", title="+bug_title+", product="+bug_product+", status="+bug_status+", importance="+bug_importance+", assignee="+bug_assignee+", mentoring="+bug_mentoring+", commentscount="+bug_comments+", subscriberscount="+bug_subscribers+", duplicatescount="+bug_duplicates+" WHERE originalbug='"+bug_originalbug+"'")
188
if verbose >= 3: print "Bug "+str(bugnumber)+" successfully updated"
190
if verbose >= 1: print "DB failed for bug "+str(bugnumber)
193
def updateSpec(specurl):
194
"Get LP information about specurl and update the DB"
197
spec=Blueprint(specurl)
199
if verbose >= 1: print "Unable to open the specification : "+specurl
204
spec_url=pgdb._quote(specurl)
207
spec_title=pgdb._quote(spec.title)
212
spec_product=pgdb._quote(spec.product)
214
spec_product="'None'"
217
spec_priority=pgdb._quote(spec.priority)
219
spec_priority="'Unknown'"
222
spec_definition=pgdb._quote(spec.definition)
224
spec_definition="'Unknown'"
226
if spec.implementation:
227
spec_implementation=pgdb._quote(spec.implementation)
229
spec_implementation="'Unknown'"
231
#In some case a user may not have a realname set on LP (realname doesn't exist)
233
spec_assignee=pgdb._quote(spec.assignee.realname)
235
spec_assignee=pgdb._quote(spec.assignee)
236
if spec_assignee == "'unknown'":
239
if len(spec.get_mentors()) >= 1:
245
if verbose >= 1: print "Error while parsing spec "+specurl
249
cursor.execute("SELECT blueprinturl FROM qawebsite_launchpad_blueprint WHERE blueprinturl="+spec_url+"")
250
if len(cursor.fetchall()) == 0:
251
cursor.execute("INSERT INTO qawebsite_launchpad_blueprint (blueprinturl, title, product, priority, definition, implementation, assignee, mentoring) VALUES ("+spec_url+","+spec_title+","+spec_product+","+spec_priority+","+spec_definition+","+spec_implementation+","+spec_assignee+","+spec_mentoring+")")
253
cursor.execute("UPDATE qawebsite_launchpad_blueprint SET lastchange=now() WHERE blueprinturl="+spec_url+" AND (definition!="+spec_definition+" OR implementation!="+spec_implementation+")")
254
cursor.execute("UPDATE qawebsite_launchpad_blueprint SET title="+spec_title+", product="+spec_product+", priority="+spec_priority+", definition="+spec_definition+", implementation="+spec_implementation+", assignee="+spec_assignee+", mentoring="+spec_mentoring+" WHERE blueprinturl="+spec_url)
256
if verbose >= 3: print "Spec "+specurl+" successfully updated"
258
if verbose >= 1: print "DB failed for spec "+specurl
261
#Arrays containing the SQL queries to execute
78
"Get LP information about bugnumber, tag if a tag is specified and update the DB"
80
bugnumber=int(bugnumber)
82
bug=launchpad.bugs[bugnumber]
84
if verbose >= 1: print "bug #"+str(bugnumber)+": HTTP error"
87
if verbose >= 1: print "bug #"+str(bugnumber)+": Unknown bug"
89
except KeyboardInterrupt:
90
sys.exit("KeyboardInterrupt caught.")
92
if verbose >= 1: print "bug #"+str(bugnumber)+": Unhandled error when opening bug"
100
mainbug=bug.duplicate_of.id
101
bug=launchpad.bugs[mainbug]
105
if isinstance(mainbug, int) and isinstance(bugnumber, int):
106
bug_bugnumber=str(mainbug)
107
bug_originalbug=str(bugnumber)
110
bug_title=pgdb._quote(bug.title)
114
# 2009-10-01 - just use the first Ubuntu bug task found for lack of a better idea
115
task_links = [task.self_link for task in bug.bug_tasks]
116
task_links.sort(reverse=True)
118
for task_link in task_links:
119
task = launchpad.load(task_link)
120
bug_product = task.bug_target_display_name
121
bug_product=pgdb._quote(bug_product)
122
bug_status=pgdb._quote(task.status)
123
bug_importance=pgdb._quote(task.importance)
126
bug_assignee=pgdb._quote(task.assignee.display_name)
128
bug_assignee=pgdb._quote(task.assignee.name)
130
bug_assignee=pgdb._quote("None")
132
# FIXME: LP returns 500 for some bugs, workaround that for now.
134
if len(bug.messages) > 0:
135
bug_comments=str(len(bug.messages))
141
# this used to be direct subscribers only but this doesn't exist in
142
# python-launchpadlib
143
if len(bug.subscriptions) > 0:
144
bug_subscribers=str(len(bug.subscriptions))
147
bug_duplicates=str(len(bug.duplicates))
149
# If wanted, tag the bug
152
cursor.execute("SELECT DISTINCT qawebsite_module_setting.value FROM qatracker_result LEFT JOIN qatracker_bug ON qatracker_bug.resultid=qatracker_result.id LEFT JOIN qatracker_build ON qatracker_build.id=qatracker_result.buildid LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid LEFT JOIN qawebsite_module_setting ON qawebsite_module_setting.siteid=qatracker_milestone.siteid WHERE qawebsite_module_setting.option='bug_tag' AND qawebsite_module_setting.option!='' AND qatracker_bug.bugnumber='"+str(bugnumber)+"'")
153
tags=cursor.fetchall()
155
if tagtext[0] != "" and tagtext[0] not in bug.tags:
157
taglist.append(unicode(str(tagtext[0])))
160
if verbose >= 2: print "bug #"+str(bugnumber)+": Added \""+str(tagtext[0])+"\" tag"
161
except KeyboardInterrupt:
162
sys.exit("KeyboardInterrupt caught.")
164
if verbose >= 1: print "bug #"+str(bugnumber)+": Unable to add \""+str(tagtext[0])+"\" tag"
166
# Bug mentoring no longer exists, set to disable by default.
169
if verbose >= 1: print "bug #"+str(bugnumber)+": Invalid bug object"
172
except KeyboardInterrupt:
173
sys.exit("KeyboardInterrupt caught.")
175
if verbose >= 1: print "bug #"+str(bugnumber)+": HTTP error"
178
if verbose >= 1: print "bug #"+str(bugnumber)+": Error opening bug"
182
cursor.execute("SELECT originalbug FROM qawebsite_launchpad_bug WHERE originalbug='"+bug_originalbug+"'")
183
if len(cursor.fetchall()) == 0:
184
cursor.execute("INSERT INTO qawebsite_launchpad_bug (bugnumber, originalbug, title, product, status, importance, assignee, mentoring, commentscount, subscriberscount, duplicatescount) VALUES ("+bug_bugnumber+","+bug_originalbug+","+bug_title+","+bug_product+","+bug_status+","+bug_importance+","+bug_assignee+","+bug_mentoring+","+bug_comments+","+bug_subscribers+","+bug_duplicates+")")
186
cursor.execute("UPDATE qawebsite_launchpad_bug SET lastchange=now() WHERE originalbug='"+bug_originalbug+"' AND status!="+bug_status)
187
cursor.execute("UPDATE qawebsite_launchpad_bug SET bugnumber="+bug_bugnumber+", title="+bug_title+", product="+bug_product+", status="+bug_status+", importance="+bug_importance+", assignee="+bug_assignee+", mentoring="+bug_mentoring+", commentscount="+bug_comments+", subscriberscount="+bug_subscribers+", duplicatescount="+bug_duplicates+" WHERE originalbug='"+bug_originalbug+"'")
189
if verbose >= 3: print "bug #"+str(bugnumber)+": Successfully updated"
190
except KeyboardInterrupt:
191
sys.exit("KeyboardInterrupt caught.")
193
if verbose >= 1: print "bug #"+str(bugnumber)+": DB faillure"
196
# Arrays containing the SQL queries to execute
269
#Check if we have the right qawebsite_launchpad_bug table
271
cursor.execute("SELECT bugnumber,originalbug,title,product,status,importance,assignee,mentoring,commentscount,subscriberscount,duplicatescount FROM qawebsite_launchpad_bug")
273
sys.exit("table qawebsite_launchpad_bug missing")
275
#Check what are the installed modules
277
cursor.execute("SELECT bugnumber FROM qatracker_bug")
278
bug_new.append("SELECT DISTINCT bugnumber FROM qatracker_bug WHERE bugnumber NOT IN (SELECT originalbug FROM qawebsite_launchpad_bug)")
279
bug_current.append("SELECT DISTINCT qatracker_bug.bugnumber FROM qatracker_result LEFT JOIN qatracker_build ON qatracker_result.buildid=qatracker_build.id LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid LEFT JOIN qatracker_bug ON qatracker_bug.resultid=qatracker_result.id WHERE qatracker_milestone.status!=2")
280
bug_archive.append("SELECT DISTINCT qatracker_bug.bugnumber FROM qatracker_result LEFT JOIN qatracker_build ON qatracker_result.buildid=qatracker_build.id LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid LEFT JOIN qatracker_bug ON qatracker_bug.resultid=qatracker_result.id WHERE qatracker_milestone.status=2")
282
if verbose >= 1: print "Module qatracker not found"
285
cursor.execute("SELECT bugid FROM qapoll_choice")
286
bug_new.append("SELECT DISTINCT bugid FROM qapoll_choice WHERE bugid NOT IN (SELECT originalbug FROM qawebsite_launchpad_bug)")
287
bug_current.append("SELECT DISTINCT bugid FROM qapoll_choice WHERE bugid IN (SELECT originalbug FROM qawebsite_launchpad_bug) AND status != '-2'")
288
bug_archive.append("SELECT DISTINCT bugid FROM qapoll_choice WHERE bugid IN (SELECT originalbug FROM qawebsite_launchpad_bug) AND status = '-2'")
289
spec_new.append("SELECT DISTINCT specid FROM qapoll_choice WHERE specid NOT IN (SELECT blueprinturl FROM qawebsite_launchpad_blueprint) AND specid IS NOT NULL")
290
spec_current.append("SELECT DISTINCT specid FROM qapoll_choice WHERE specid IN (SELECT blueprinturl FROM qawebsite_launchpad_blueprint) AND specid IS NOT NULL")
292
if verbose >= 1: print "Module qapoll not found"
294
#Generate a set of bug to parse
201
# Check if we have the right qawebsite_launchpad_bug table
203
cursor.execute("SELECT bugnumber,originalbug,title,product,status,importance,assignee,mentoring,commentscount,subscriberscount,duplicatescount FROM qawebsite_launchpad_bug")
205
sys.exit("table qawebsite_launchpad_bug missing")
207
# Check what are the installed modules
209
cursor.execute("SELECT bugnumber FROM qatracker_bug")
210
bug_new.append("SELECT DISTINCT bugnumber FROM qatracker_bug WHERE bugnumber NOT IN (SELECT originalbug FROM qawebsite_launchpad_bug)")
211
bug_current.append("SELECT DISTINCT qatracker_bug.bugnumber FROM qatracker_result LEFT JOIN qatracker_build ON qatracker_result.buildid=qatracker_build.id LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid LEFT JOIN qatracker_bug ON qatracker_bug.resultid=qatracker_result.id WHERE qatracker_milestone.status!=2")
212
bug_archive.append("SELECT DISTINCT qatracker_bug.bugnumber FROM qatracker_result LEFT JOIN qatracker_build ON qatracker_result.buildid=qatracker_build.id LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid LEFT JOIN qatracker_bug ON qatracker_bug.resultid=qatracker_result.id WHERE qatracker_milestone.status=2")
213
except KeyboardInterrupt:
214
sys.exit("KeyboardInterrupt caught.")
217
if verbose >= 1: print "Module qatracker not found"
219
# Generate a set of bug to parse
295
220
if len(sys.argv) == 2:
296
if sys.argv[1] == "update-new":
297
if verbose >= 3: print "Selecting new items"
298
bugs=getItems(bug_new)
299
specs=getItems(spec_new)
300
elif sys.argv[1] == "update-current":
301
if verbose >= 3: print "Selecting currently shown items"
302
bugs=getItems(bug_current)
303
specs=getItems(spec_current)
304
elif sys.argv[1] == "update-archive":
305
if verbose >= 3: print "Selecting archived items"
306
bugs=getItems(bug_archive)
307
specs=getItems(spec_archive)
309
sys.exit("Unknown action \""+sys.argv[1]+"\"")
221
if sys.argv[1] == "update-new":
222
if verbose >= 3: print "Selecting new items"
223
bugs=getItems(bug_new)
224
elif sys.argv[1] == "update-current":
225
if verbose >= 3: print "Selecting currently shown items"
226
bugs=getItems(bug_current)
227
elif sys.argv[1] == "update-archive":
228
if verbose >= 3: print "Selecting archived items"
229
bugs=getItems(bug_archive)
231
sys.exit("Unknown action \""+sys.argv[1]+"\"")
311
sys.exit("Syntax: "+sys.argv[0]+" <action>")
233
sys.exit("Syntax: "+sys.argv[0]+" <action>")
313
235
#Now parsing bugs
321
239
#Close DB connection
324
os.remove("/tmp/lp-integration.lock")
244
os.remove("/tmp/lp-integration.lock")