You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.2 KiB

#!/usr/bin/python3
# Copyright (C) 2016 Canonical Ltd.
# Author: Steve Langasek <steve.langasek@canonical.com>
# 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 <http://www.gnu.org/licenses/>.
import re
import sys
import subprocess
class KernelWorkflowError(Exception):
"""An exception occurred with the state of the workflow bug"""
def get_name_and_version_from_bug(bug):
title_re = re.compile(
r'^([a-z]+\/)?(?P<package>[a-z0-9.-]+): '
+ '(?P<version>[0-9.-]+[0-9a-z.~-]*)'
+ ' -proposed tracker$')
match = title_re.search(bug.title)
if not match:
print("Ignoring bug %s, not a kernel SRU tracking bug" % bug.id)
return (None, None)
package = match.group('package')
version = match.group('version')
# FIXME: check that the package version is correct for the suite
return (package, version)
def process_sru_bug(lp, bugnum, task_callback, source_callback, context=None):
"""Process the indicated bug and call the provided helper functions
as needed
"""
package_re = re.compile(
(r'^%subuntu/(?P<release>[0-9a-z.-]+)/'
+ '\+source/(?P<package>[a-z0-9.-]+)$') % str(lp._root_uri))
workflow_re = re.compile(
r'^%skernel-sru-workflow/(?P<subtask>.*)' % str(lp._root_uri))
prep_re = re.compile(r'prepare-package(?P<subpackage>.*)')
packages = []
source_name = None
proposed_task = None
updates_task = None
security_task = None
bug = lp.bugs[int(bugnum)]
package, version = get_name_and_version_from_bug(bug)
if not package or not version:
return
task_results = {}
for task in bug.bug_tasks:
# If a task is set to invalid, we do not care about it
if task.status == 'Invalid':
continue
# FIXME: ok not exactly what we want, we probably want a hash?
task_results.update(task_callback(lp, bugnum, task, context))
task_match = workflow_re.search(str(task.target))
if task_match:
subtask = task_match.group('subtask')
# FIXME: consolidate subtask / prep_match here
prep_match = prep_re.search(subtask)
if prep_match:
packages.append(prep_match.group('subpackage'))
pkg_match = package_re.search(str(task.target))
if pkg_match:
if source_name:
print("Too many source packages, %s and %s, ignoring bug %s"
% (source_name, pkg_match.group('package'), bugnum))
continue
source_name = pkg_match.group('package')
release = pkg_match.group('release')
continue
if not source_name:
print("No source package to act on, skipping bug %s" % bugnum)
return
if source_name != package:
print("Cannot determine base package for %s, %s vs. %s"
% (bugnum, source_name, package))
if context['skipnamecheck']:
return
if not packages:
print("No packages in the prepare list, don't know what to do")
return
if not '' in packages:
print("No kernel package in prepare list, only meta packages. "
"Continue? [yN] ", end="")
sys.stdout.flush()
response = sys.stdin.readline()
if not response.strip().lower().startswith('y'):
return
full_packages = []
for pkg in packages:
if pkg == '-lbm':
pkg = '-backports-modules-3.2.0'
elif pkg == '-lrm':
pkg = '-restricted-modules'
real_package = re.sub(r'^linux', 'linux' + pkg, package)
full_packages.append(real_package)
source_callback(lp, bugnum, task_results, full_packages, release, context)