blob: 730b092476fe39d73ae021103c34dfc5804f157c [file] [log] [blame]
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Module that generates CL for cherry-picked commit."""
import subprocess
import os
import logging
from cvelib import common, logutils
LOGGER = logutils.setuplogging(loglvl=logging.DEBUG, name='CLGenerator')
class CLGeneratorException(Exception):
"""Exception class for clgenerator."""
def create_cls(bug_id, kernels):
"""Generates CLs for given kernels."""
cl_map = {}
for kern in kernels:
LOGGER.debug(f'Generating CL for {kern}')
branch = common.get_cherry_pick_branch(bug_id, kern)
kernel_path = os.path.join(os.getenv('CHROMIUMOS_KERNEL'), kern)
common.do_checkout(kern, branch, kernel_path)
# Generates CL.
push_cmd = get_git_push_cmd(kern)
output = do_push(push_cmd, kern, kernel_path)
cl_map[kern] = parse_cls_output(output)
return cl_map
def get_git_push_cmd(kernel):
"""Generates push command to chromeos branch."""
branch = common.get_cros_branch(kernel)
return f'git push cros HEAD:refs/for/{branch}'
def do_push(push_cmd, kernel, kernel_path):
"""Pushes to branch."""
try:
output = subprocess.check_output(push_cmd.split(' '), stderr=subprocess.STDOUT,
cwd=kernel_path, encoding='utf-8')
except subprocess.CalledProcessError:
raise CLGeneratorException(f'{kernel} repository needs to be refreshed before pushing.')
return output
def parse_cls_output(push_msg):
"""Returns CL links from push output."""
cl_link = []
msg = push_msg.splitlines()
for line in msg:
if 'remote: https://chromium-review' in line:
link = line.split()[1]
cl_link.append(link)
return cl_link