| # Copyright 2021 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| """Utility functions common to multiple recipes that don't fit elsewhere.""" |
| |
| import re |
| |
| import attr |
| from recipe_engine import recipe_api |
| |
| |
| @attr.s |
| class ChangeWithComments(object): |
| change = attr.ib() |
| comments = attr.ib() |
| |
| |
| class UtilApi(recipe_api.RecipeApi): |
| def get_change_with_comments(self): |
| input_ = self.m.buildbucket.build.input |
| change_id = str(input_.gerrit_changes[0].change) |
| change = self.m.gerrit.change_details( |
| 'change details', |
| change_id=change_id, |
| host=input_.gerrit_changes[0].host, |
| query_params=['CURRENT_COMMIT', 'CURRENT_REVISION', 'ALL_FILES'], |
| test_data=self.m.json.test_api.output( |
| { |
| 'owner': {'email': 'coder@example.com',}, |
| 'current_revision': 'a' * 40, |
| 'revisions': { |
| 'a' * 40: {'files': [], 'commit': {'message': '',},} |
| }, |
| 'revert_of': 0, |
| } |
| ), |
| ).json.output |
| |
| current_revision = change['revisions'][change['current_revision']] |
| comments = [current_revision['commit']['message']] |
| |
| comments_result = self.m.gerrit.list_change_comments( |
| "list change comments", |
| change_id, |
| test_data=self.m.json.test_api.output( |
| {'/PATCHSET_LEVEL': [{'message': ''}],} |
| ), |
| ).json.output |
| |
| for file in comments_result: |
| for comment_data in comments_result[file]: |
| comments.append(comment_data['message']) |
| |
| return ChangeWithComments(change, comments) |
| |
| def find_matching_comment(self, rx, comments): |
| """Find a comment in comments that matches regex object rx.""" |
| result = None |
| with self.m.step.nest('checking comments'): |
| for i, comment in enumerate(comments): |
| with self.m.step.nest('comment ({})'.format(i)) as pres: |
| pres.step_summary_text = comment |
| match = re.search(rx, comment) |
| if match: |
| result = match |
| break |
| |
| if result: |
| with self.m.step.nest('found'): |
| pass |
| |
| return result |