#!/usr/bin/python3 # Copyright (C) 2017 Canonical Ltd. # Author: Brian Murray # Author: Lukasz 'sil2100' Zemczak # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """Portions of SRU-related code that is re-used by various SRU tools.""" import re def process_bug(launchpad, sourcepkg, version, release, num): bug_target_re = re.compile( r'/ubuntu/(?:(?P[^/]+)/)?\+source/(?P[^/]+)$') bug = launchpad.bugs[num] sourcepkg_match = False distroseries_match = False for task in bug.bug_tasks: # Ugly; we have to do URL-parsing to figure this out. # /ubuntu/+source/foo can be fed to launchpad.load() to get a # distribution_source_package, but /ubuntu/hardy/+source/foo can't. match = bug_target_re.search(task.target.self_link) if (not match or (sourcepkg and match.group('source') != sourcepkg)): print("Ignoring task %s in bug %s" % (task.web_link, num)) continue sourcepkg_match = True if match.group('suite') == release: if task.status in ("Invalid", "Won't Fix", "Fix Released"): print("Matching task was set to %s before accepting the SRU, " "please double-check if this bug is still liable for " "fixing. Switching to Fix Committed." % task.status) task.status = "Fix Committed" task.lp_save() print("Success: task %s in bug %s" % (task.web_link, num)) distroseries_match = True if sourcepkg_match and not distroseries_match: # add a release task lp_url = launchpad._root_uri series_task_url = '%subuntu/%s/+source/%s' % \ (lp_url, release, sourcepkg) sourcepkg_target = launchpad.load(series_task_url) new_task = bug.addTask(target=sourcepkg_target) new_task.status = "Fix Committed" new_task.lp_save() print("LP: #%s added task for %s %s" % (num, sourcepkg, release)) if not sourcepkg_match: # warn that the bug has no source package tasks print("LP: #%s has no %s tasks!" % (num, sourcepkg)) # XXX: it might be useful if the package signer/sponsor was # subscribed to the bug report bug.subscribe(person=launchpad.people['ubuntu-sru']) bug.subscribe(person=launchpad.people['sru-verification']) # there may be something else to sponsor so just warn subscribers = [sub.person for sub in bug.subscriptions] if launchpad.people['ubuntu-sponsors'] in subscribers: print('ubuntu-sponsors is still subscribed to LP: #%s. ' 'Is there anything left to sponsor?' % num) if not sourcepkg or 'linux' not in sourcepkg: block_proposed_series = 'block-proposed-%s' % release if block_proposed_series in bug.tags: print('The %s tag is still set on bug LP: #%s. ' 'Should the package continue to be blocked in proposed? ' 'Please investigate and adjust the tags accordingly.' % (block_proposed_series, num)) # this dance is needed due to # https://bugs.launchpad.net/launchpadlib/+bug/254901 btags = bug.tags for t in ('verification-failed', 'verification-failed-%s' % release, 'verification-done', 'verification-done-%s' % release): if t in btags: tags = btags tags.remove(t) bug.tags = tags if 'verification-needed' not in btags: btags.append('verification-needed') bug.tags = btags needed_tag = 'verification-needed-%s' % release if needed_tag not in btags: btags.append(needed_tag) bug.tags = btags bug.lp_save() text = ('Hello %s, or anyone else affected,\n\n' % re.split(r'[,\s]', bug.owner.display_name)[0]) if sourcepkg: text += 'Accepted %s into ' % sourcepkg else: text += 'Accepted into ' if sourcepkg and release: text += ('%s-proposed. The package will build now and be available at ' 'https://launchpad.net/ubuntu/+source/%s/%s in a few hours, ' 'and then in the -proposed repository.\n\n' % ( release, sourcepkg, version)) else: text += ('%s-proposed. The package will build now and be available in ' 'a few hours in the -proposed repository.\n\n' % ( release)) text += ('Please help us by testing this new package. ') if sourcepkg == 'casper': text += ('To properly test it you will need to obtain and boot ' 'a daily build of a Live CD for %s.' % (release)) else: text += ('See https://wiki.ubuntu.com/Testing/EnableProposed for ' 'documentation on how to enable and use -proposed.') text += (' Your feedback will aid us getting this update out to other ' 'Ubuntu users.\n\nIf this package fixes the bug for you, ' 'please add a comment to this bug, mentioning the version of the ' 'package you tested, what testing has been performed on the ' 'package and change the tag from ' 'verification-needed-%s to verification-done-%s. ' 'If it does not fix the bug for you, please add a comment ' 'stating that, and change the tag to verification-failed-%s. ' 'In either case, without details of your testing we will not ' 'be able to proceed.\n\nFurther information regarding the ' 'verification process can be found at ' 'https://wiki.ubuntu.com/QATeam/PerformingSRUVerification . ' 'Thank you in advance for helping!\n\n' 'N.B. The updated package will be released to -updates after ' 'the bug(s) fixed by this package have been verified and ' 'the package has been in -proposed for a minimum of 7 days.' % (release, release, release)) bug.newMessage(content=text, subject='Please test proposed package')