| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from recipe_engine import recipe_api |
| |
| import re |
| |
| |
| class CrrevApi(recipe_api.RecipeApi): |
| """Recipe module for making requests to crrev.com.""" |
| |
| def __call__(self, step_name, request_path, request_params=None, attempts=3, |
| **kwargs): |
| step_result = self.m.build.python( |
| step_name, |
| self.resource('crrev_client.py'), |
| [ |
| request_path, |
| '--params-file', self.m.json.input(request_params or {}), |
| '--attempts', str(attempts), |
| ], |
| show_path=False, # Can't dump path, since we use STDOUT. |
| stdout=self.m.json.output(), |
| **kwargs) |
| return step_result.stdout |
| |
| def to_commit_hash( |
| self, commit_position, project='chromium', repo='chromium/src', |
| attempts=3, step_name=None, **kwargs): |
| """Fetches the corresponding commit hash for a commit position.""" |
| branch, number = self.m.commit_position.parse(commit_position) |
| params = { |
| 'numbering_type': 'COMMIT_POSITION', |
| 'numbering_identifier': branch, |
| 'number': number, |
| 'project': project, |
| 'repo': repo, |
| } |
| step_name = step_name or 'crrev get commit hash for ' + commit_position |
| try: |
| result = self(step_name, 'get_numbering', params, attempts, **kwargs) |
| return result['git_sha'] |
| except (self.m.step.StepFailure, KeyError): |
| raise self.m.step.StepFailure('Could not resolve ' + commit_position) |
| |
| def to_commit_position(self, commit_hash, attempts=3, step_name=None): |
| """Fetches a commit position string given a commit hash.""" |
| if not re.match(r'^[0-9a-zA-Z]{40}$', commit_hash): |
| raise ValueError('Not a full 40-digit SHA1 hash (%s)' % commit_hash) |
| step_name = step_name or 'crrev get commit position for ' + commit_hash |
| try: |
| result = self(step_name, 'commit_path/' + commit_hash, attempts=attempts) |
| numberings = result['numberings'] |
| except (self.m.step.StepFailure, KeyError): |
| raise self.m.step.StepFailure('Could not resolve ' + commit_hash) |
| for numbering in numberings: |
| if numbering['numbering_type'] == 'COMMIT_POSITION': |
| branch = numbering['numbering_identifier'] |
| number = numbering['number'] |
| return self.m.commit_position.construct(branch, number) |
| raise self.m.step.StepFailure('No commit position for ' + commit_hash) |