Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # -*- coding: utf-8 -*-" |
| 3 | # |
| 4 | # Copyright 2020 The Chromium OS Authors. All rights reserved. |
| 5 | # Use of this source code is governed by a BSD-style license that can be |
| 6 | # found in the LICENSE file. |
| 7 | |
| 8 | """Module containing methods interfacing with gerrit. |
| 9 | |
| 10 | i.e Create new bugfix change tickets, and reading metadata about a specific change. |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 11 | |
| 12 | Example CURL command that creates CL: |
| 13 | curl -b /home/chromeos_patches/.git-credential-cache/cookie \ |
| 14 | --header "Content-Type: application/json" \ |
| 15 | --data \ |
| 16 | '{"project":"chromiumos/third_party/kernel",\ |
| 17 | "subject":"test",\ |
| 18 | "branch":"chromeos-4.19",\ |
| 19 | "topic":"test_topic"}' https://chromium-review.googlesource.com/a/changes/ |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 20 | """ |
| 21 | |
| 22 | from __future__ import print_function |
Guenter Roeck | 9c7f67b | 2020-05-12 12:48:54 -0700 | [diff] [blame] | 23 | import logging |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 24 | import json |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 25 | import http |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 26 | import os |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 27 | import re |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 28 | import requests |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 29 | |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 30 | import common |
Hirthanan Subenderan | b186655 | 2020-03-20 14:01:14 -0700 | [diff] [blame] | 31 | import git_interface |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 32 | |
| 33 | |
| 34 | def get_auth_cookie(): |
| 35 | """Load cookies in order to authenticate requests with gerrit/googlesource.""" |
Hirthanan Subenderan | 0054454 | 2020-04-10 18:11:51 -0700 | [diff] [blame] | 36 | # This cookie should exist in order to perform GAIA authenticated requests |
| 37 | try: |
| 38 | gerrit_credentials_cookies = \ |
| 39 | http.cookiejar.MozillaCookieJar(common.GCE_GIT_COOKIE_PATH, None, None) |
| 40 | gerrit_credentials_cookies.load() |
| 41 | return gerrit_credentials_cookies |
| 42 | except FileNotFoundError: |
| 43 | try: |
| 44 | gerrit_credentials_cookies = \ |
| 45 | http.cookiejar.MozillaCookieJar(common.LOCAL_GIT_COOKIE_PATH, None, None) |
| 46 | gerrit_credentials_cookies.load() |
| 47 | return gerrit_credentials_cookies |
| 48 | except FileNotFoundError: |
Guenter Roeck | 9c7f67b | 2020-05-12 12:48:54 -0700 | [diff] [blame] | 49 | logging.error('Could not locate gitcookies file. Generate cookie file and try again') |
| 50 | logging.error('If running locally, ensure gitcookies file is located at ~/.gitcookies') |
| 51 | logging.error('Learn more by visiting go/gob-dev#testing-user-authentication') |
Hirthanan Subenderan | 0054454 | 2020-04-10 18:11:51 -0700 | [diff] [blame] | 52 | raise |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 53 | |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 54 | |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 55 | def retrieve_and_parse_endpoint(endpoint_url): |
| 56 | """Retrieves Gerrit endpoint response and removes XSSI prefix )]}'""" |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 57 | try: |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 58 | resp = requests.get(endpoint_url, cookies=get_auth_cookie()) |
| 59 | resp.raise_for_status() |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 60 | resp_json = json.loads(resp.text[5:]) |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 61 | except requests.exceptions.HTTPError as e: |
| 62 | raise type(e)('Endpoint %s should have HTTP response 200' % endpoint_url) from e |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 63 | except json.decoder.JSONDecodeError as e: |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 64 | raise ValueError('Response should contain json )]} prefix to prevent XSSI attacks') from e |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 65 | |
| 66 | return resp_json |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 67 | |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 68 | |
| 69 | def set_and_parse_endpoint(endpoint_url, payload=None): |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 70 | """POST request to gerrit endpoint with specified payload.""" |
| 71 | try: |
| 72 | resp = requests.post(endpoint_url, json=payload, cookies=get_auth_cookie()) |
| 73 | resp.raise_for_status() |
| 74 | resp_json = json.loads(resp.text[5:]) |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 75 | except json.decoder.JSONDecodeError as e: |
| 76 | raise ValueError('Response should contain json )]} prefix to prevent XSSI attacks') from e |
| 77 | |
| 78 | return resp_json |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 79 | |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 80 | |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 81 | def get_full_changeid(changeid, branch): |
| 82 | """Returns the changeid with url-encoding in project~branch~changeid format.""" |
| 83 | project = 'chromiumos%2Fthird_party%2Fkernel' |
| 84 | chromeos_branch = common.chromeos_branch(branch) |
| 85 | return '{project}~{branch}~{changeid}'.format(project=project, |
| 86 | branch=chromeos_branch, |
| 87 | changeid=changeid) |
| 88 | |
| 89 | |
| 90 | def get_reviewers(changeid, branch): |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 91 | """Retrieves list of reviewer emails from gerrit given a chromeos changeid.""" |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 92 | unique_changeid = get_full_changeid(changeid, branch) |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 93 | list_reviewers_endpoint = os.path.join(common.CHROMIUM_REVIEW_BASEURL, 'changes', |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 94 | unique_changeid, 'reviewers') |
Hirthanan Subenderan | 3f02911 | 2020-03-11 12:33:05 -0700 | [diff] [blame] | 95 | |
| 96 | resp = retrieve_and_parse_endpoint(list_reviewers_endpoint) |
| 97 | |
| 98 | try: |
| 99 | return [reviewer_resp['email'] for reviewer_resp in resp] |
| 100 | except KeyError as e: |
| 101 | raise type(e)('Gerrit API endpoint to list reviewers should contain key email') from e |
| 102 | |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 103 | |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 104 | def abandon_change(changeid, branch, reason=None): |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 105 | """Abandons a change.""" |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 106 | unique_changeid = get_full_changeid(changeid, branch) |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 107 | abandon_change_endpoint = os.path.join(common.CHROMIUM_REVIEW_BASEURL, 'changes', |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 108 | unique_changeid, 'abandon') |
Hirthanan Subenderan | d9d1b84 | 2020-04-09 12:15:14 -0700 | [diff] [blame] | 109 | |
| 110 | abandon_payload = {'message': reason} if reason else None |
| 111 | |
| 112 | try: |
| 113 | set_and_parse_endpoint(abandon_change_endpoint, abandon_payload) |
Guenter Roeck | 9c7f67b | 2020-05-12 12:48:54 -0700 | [diff] [blame] | 114 | logging.info('Abandoned changeid %s on Gerrit', changeid) |
Hirthanan Subenderan | d9d1b84 | 2020-04-09 12:15:14 -0700 | [diff] [blame] | 115 | except requests.exceptions.HTTPError as e: |
Hirthanan Subenderan | c5e6c40 | 2020-04-10 14:31:08 -0700 | [diff] [blame] | 116 | if e.response.status_code == http.HTTPStatus.CONFLICT: |
Guenter Roeck | 95f0482 | 2021-01-20 09:17:24 -0800 | [diff] [blame] | 117 | logging.info('Change %s for branch %s has already been abandoned', changeid, branch) |
Hirthanan Subenderan | d9d1b84 | 2020-04-09 12:15:14 -0700 | [diff] [blame] | 118 | else: |
| 119 | raise |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 120 | |
| 121 | |
Hirthanan Subenderan | c5e6c40 | 2020-04-10 14:31:08 -0700 | [diff] [blame] | 122 | def restore_change(changeid, branch, reason=None): |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 123 | """Restores an abandoned change.""" |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 124 | unique_changeid = get_full_changeid(changeid, branch) |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 125 | restore_change_endpoint = os.path.join(common.CHROMIUM_REVIEW_BASEURL, 'changes', |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 126 | unique_changeid, 'restore') |
Hirthanan Subenderan | c5e6c40 | 2020-04-10 14:31:08 -0700 | [diff] [blame] | 127 | |
| 128 | restore_payload = {'message': reason} if reason else None |
| 129 | |
| 130 | try: |
| 131 | set_and_parse_endpoint(restore_change_endpoint, restore_payload) |
Guenter Roeck | 9c7f67b | 2020-05-12 12:48:54 -0700 | [diff] [blame] | 132 | logging.info('Restored changeid %s on Gerrit', changeid) |
Hirthanan Subenderan | c5e6c40 | 2020-04-10 14:31:08 -0700 | [diff] [blame] | 133 | except requests.exceptions.HTTPError as e: |
| 134 | if e.response.status_code == http.HTTPStatus.CONFLICT: |
Guenter Roeck | 95f0482 | 2021-01-20 09:17:24 -0800 | [diff] [blame] | 135 | logging.info('Change %s for branch %s has already been restored', changeid, branch) |
Hirthanan Subenderan | c5e6c40 | 2020-04-10 14:31:08 -0700 | [diff] [blame] | 136 | else: |
| 137 | raise |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 138 | |
| 139 | |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 140 | def get_change(changeid, branch): |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 141 | """Retrieves ChangeInfo from gerrit using its changeid""" |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 142 | unique_changeid = get_full_changeid(changeid, branch) |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 143 | get_change_endpoint = os.path.join(common.CHROMIUM_REVIEW_BASEURL, 'changes', |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 144 | unique_changeid) |
Hirthanan Subenderan | 4036800 | 2020-03-10 15:36:48 -0700 | [diff] [blame] | 145 | return retrieve_and_parse_endpoint(get_change_endpoint) |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 146 | |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 147 | |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 148 | def set_hashtag(changeid, branch): |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 149 | """Set hashtag to be autogenerated indicating a robot generated CL.""" |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 150 | unique_changeid = get_full_changeid(changeid, branch) |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 151 | set_hashtag_endpoint = os.path.join(common.CHROMIUM_REVIEW_BASEURL, 'changes', |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 152 | unique_changeid, 'hashtags') |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 153 | hashtag_input_payload = {'add' : ['autogenerated']} |
| 154 | set_and_parse_endpoint(set_hashtag_endpoint, hashtag_input_payload) |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 155 | |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 156 | def get_status(changeid, branch): |
Hirthanan Subenderan | 30be90b | 2020-04-02 10:03:25 -0700 | [diff] [blame] | 157 | """Retrieves the latest status of a changeid by checking gerrit.""" |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 158 | change_info = get_change(changeid, branch) |
Hirthanan Subenderan | 30be90b | 2020-04-02 10:03:25 -0700 | [diff] [blame] | 159 | return change_info['status'] |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 160 | |
Hirthanan Subenderan | d6922c3 | 2020-03-23 14:17:40 -0700 | [diff] [blame] | 161 | def get_bug_test_line(chrome_sha): |
| 162 | """Retrieve BUG and TEST lines from the chrome sha.""" |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 163 | # stable fixes don't have a fixee changeid |
| 164 | bug_test_line = 'BUG=%s\nTEST=%s' |
| 165 | bug = test = None |
Hirthanan Subenderan | d6922c3 | 2020-03-23 14:17:40 -0700 | [diff] [blame] | 166 | if not chrome_sha: |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 167 | return bug_test_line % (bug, test) |
| 168 | |
Hirthanan Subenderan | d6922c3 | 2020-03-23 14:17:40 -0700 | [diff] [blame] | 169 | chrome_commit_msg = git_interface.get_chrome_commit_message(chrome_sha) |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 170 | |
| 171 | bug_matches = re.findall('^BUG=(.*)$', chrome_commit_msg, re.M) |
| 172 | test_matches = re.findall('^TEST=(.*)$', chrome_commit_msg, re.M) |
| 173 | |
Guenter Roeck | 7f094f0 | 2020-05-05 10:55:13 -0700 | [diff] [blame] | 174 | if bug_matches: |
| 175 | bug = bug_matches[-1] |
| 176 | if bug is None or bug == 'None': |
| 177 | bug = 'None (see commit %s)' % chrome_sha |
| 178 | if test_matches: |
| 179 | test = test_matches[-1] |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 180 | |
| 181 | return bug_test_line % (bug, test) |
| 182 | |
Hirthanan Subenderan | a43fd4d | 2020-03-30 13:01:45 -0700 | [diff] [blame] | 183 | |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 184 | def generate_fix_message(fixer_upstream_sha, bug_test_line): |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 185 | """Generates new commit message for a fix change. |
| 186 | |
| 187 | Use script ./contrib/from_upstream.py to generate new commit msg |
| 188 | Commit message should include essential information: |
| 189 | i.e: |
| 190 | FROMGIT, FROMLIST, ANDROID, CHROMIUM, etc. |
| 191 | commit message indiciating what is happening |
| 192 | BUG=... |
| 193 | TEST=... |
| 194 | tag for Fixes: <upstream-sha> |
| 195 | """ |
Hirthanan Subenderan | b186655 | 2020-03-20 14:01:14 -0700 | [diff] [blame] | 196 | fix_upstream_commit_msg = git_interface.get_upstream_commit_message(fixer_upstream_sha) |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 197 | |
Hirthanan Subenderan | b186655 | 2020-03-20 14:01:14 -0700 | [diff] [blame] | 198 | upstream_full_sha = git_interface.get_upstream_fullsha(fixer_upstream_sha) |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 199 | cherry_picked = '(cherry picked from commit %s)\n\n'% upstream_full_sha |
| 200 | |
| 201 | |
| 202 | commit_message = ('UPSTREAM: {fix_commit_msg}' |
| 203 | '{cherry_picked}' |
| 204 | '{bug_test_line}').format(fix_commit_msg=fix_upstream_commit_msg, |
| 205 | cherry_picked=cherry_picked, bug_test_line=bug_test_line) |
| 206 | |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 207 | return commit_message |
| 208 | |
| 209 | |
Guenter Roeck | bdf658c | 2020-12-29 09:56:04 -0800 | [diff] [blame] | 210 | def create_change(fixee_kernel_sha, fixer_upstream_sha, branch, is_chromeos, fixer_changeid=None): |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 211 | """Creates a Patch in gerrit given a ChangeInput object. |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 212 | |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 213 | Determines whether a change for a fix has already been created, |
| 214 | and avoids duplicate creations. |
| 215 | """ |
Hirthanan Subenderan | 5f94c60 | 2020-03-18 16:03:05 -0700 | [diff] [blame] | 216 | cwd = os.getcwd() |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 217 | chromeos_branch = common.chromeos_branch(branch) |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 218 | |
Guenter Roeck | bfda124 | 2020-12-29 15:24:18 -0800 | [diff] [blame] | 219 | if is_chromeos: |
| 220 | fixee_changeid = git_interface.get_commit_changeid_linux_chrome(fixee_kernel_sha) |
| 221 | chrome_kernel_sha = fixee_kernel_sha |
Hirthanan Subenderan | b2106a9 | 2020-03-19 19:12:55 -0700 | [diff] [blame] | 222 | |
Guenter Roeck | bfda124 | 2020-12-29 15:24:18 -0800 | [diff] [blame] | 223 | if not fixee_changeid: |
| 224 | # This may be a merge. Try to find its merge commit. |
| 225 | merge_sha = git_interface.get_merge_sha(chromeos_branch, fixee_kernel_sha) |
| 226 | if merge_sha: |
| 227 | chrome_kernel_sha = merge_sha |
| 228 | fixee_changeid = git_interface.get_commit_changeid_linux_chrome(merge_sha) |
| 229 | else: |
| 230 | fixee_changeid = None |
| 231 | chrome_kernel_sha = None |
Hirthanan Subenderan | d6922c3 | 2020-03-23 14:17:40 -0700 | [diff] [blame] | 232 | |
| 233 | bug_test_line = get_bug_test_line(chrome_kernel_sha) |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 234 | fix_commit_message = generate_fix_message(fixer_upstream_sha, bug_test_line) |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 235 | |
Hirthanan Subenderan | d6922c3 | 2020-03-23 14:17:40 -0700 | [diff] [blame] | 236 | # TODO(hirthanan): find relevant mailing list/reviewers |
| 237 | # For now we will assign it to a default user like Guenter? |
| 238 | # This is for stable bug fix patches that don't have a direct fixee changeid |
| 239 | # since groups of stable commits get merged as one changeid |
| 240 | reviewers = ['groeck@chromium.org'] |
| 241 | try: |
| 242 | if fixee_changeid: |
Hirthanan Subenderan | 53bf3d5 | 2020-04-08 09:56:49 -0700 | [diff] [blame] | 243 | cl_reviewers = get_reviewers(fixee_changeid, branch) |
Guenter Roeck | 81ed057 | 2020-05-13 11:33:24 -0700 | [diff] [blame] | 244 | if cl_reviewers: |
| 245 | reviewers = cl_reviewers |
Hirthanan Subenderan | d6922c3 | 2020-03-23 14:17:40 -0700 | [diff] [blame] | 246 | except requests.exceptions.HTTPError: |
Guenter Roeck | 0632c11 | 2020-05-12 12:41:41 -0700 | [diff] [blame] | 247 | # There is a Change-Id in the commit log, but Gerrit does not have a |
| 248 | # matching entry. Fall back to list of e-mails found in tags after |
| 249 | # the last "cherry picked" message. |
Guenter Roeck | 9c7f67b | 2020-05-12 12:48:54 -0700 | [diff] [blame] | 250 | logging.warning('Failed to get reviewer(s) from gerrit for Change-Id %s', fixee_changeid) |
Guenter Roeck | 0632c11 | 2020-05-12 12:41:41 -0700 | [diff] [blame] | 251 | emails = git_interface.get_tag_emails_linux_chrome(fixee_kernel_sha) |
| 252 | if emails: |
| 253 | reviewers = emails |
Hirthanan Subenderan | c44a0b3 | 2020-03-11 22:34:39 -0700 | [diff] [blame] | 254 | |
Hirthanan Subenderan | 13e1935 | 2020-04-10 16:21:08 -0700 | [diff] [blame] | 255 | try: |
| 256 | # Cherry pick changes and generate commit message indicating fix from upstream |
Guenter Roeck | 32b23dc | 2021-01-17 13:29:06 -0800 | [diff] [blame] | 257 | handler = git_interface.commitHandler(common.Kernel.linux_chrome, branch) |
| 258 | fixer_changeid = handler.cherry_pick_and_push(fixer_upstream_sha, fixer_changeid, |
| 259 | fix_commit_message, reviewers) |
Hirthanan Subenderan | 13e1935 | 2020-04-10 16:21:08 -0700 | [diff] [blame] | 260 | except ValueError: |
| 261 | # Error cherry-picking and pushing fix patch |
| 262 | return None |
Hirthanan Subenderan | b8402a1 | 2020-02-05 14:11:00 -0800 | [diff] [blame] | 263 | |
Hirthanan Subenderan | 5f94c60 | 2020-03-18 16:03:05 -0700 | [diff] [blame] | 264 | os.chdir(cwd) |
Hirthanan Subenderan | dc72160 | 2020-03-13 15:48:10 -0700 | [diff] [blame] | 265 | return fixer_changeid |