| Index: git_cl.py
|
| diff --git a/git_cl.py b/git_cl.py
|
| index 2fcde04221611aeac7bd5d8ed7b0f4efee99c7da..174d46b3be6f0fa740e246577b7278f63dbbde5a 100755
|
| --- a/git_cl.py
|
| +++ b/git_cl.py
|
| @@ -318,24 +318,34 @@ def _buildbucket_retry(operation_name, http, *args, **kwargs):
|
| assert False, 'unreachable'
|
|
|
|
|
| -def trigger_try_jobs(auth_config, changelist, options, masters, category):
|
| - rietveld_url = settings.GetDefaultServerUrl()
|
| - rietveld_host = urlparse.urlparse(rietveld_url).hostname
|
| - authenticator = auth.get_authenticator_for_host(rietveld_host, auth_config)
|
| +def _trigger_try_jobs(auth_config, changelist, masters, options,
|
| + category='git_cl_try', patchset=None):
|
| + assert changelist.GetIssue(), 'CL must be uploaded first'
|
| + codereview_url = changelist.GetCodereviewServer()
|
| + assert codereview_url, 'CL must be uploaded first'
|
| + patchset = patchset or changelist.GetMostRecentPatchset()
|
| + assert patchset, 'CL must be uploaded first'
|
| +
|
| + codereview_host = urlparse.urlparse(codereview_url).hostname
|
| + authenticator = auth.get_authenticator_for_host(codereview_host, auth_config)
|
| http = authenticator.authorize(httplib2.Http())
|
| http.force_exception_to_status_code = True
|
| - issue_props = changelist.GetIssueProperties()
|
| - issue = changelist.GetIssue()
|
| - patchset = changelist.GetMostRecentPatchset()
|
| - properties = _get_properties_from_options(options)
|
| +
|
| + # TODO(tandrii): consider caching Gerrit CL details just like
|
| + # _RietveldChangelistImpl does, then caching values in these two variables
|
| + # won't be necessary.
|
| + owner_email = changelist.GetIssueOwner()
|
| + project = changelist.GetIssueProject()
|
|
|
| buildbucket_put_url = (
|
| 'https://{hostname}/_ah/api/buildbucket/v1/builds/batch'.format(
|
| hostname=options.buildbucket_host))
|
| - buildset = 'patch/rietveld/{hostname}/{issue}/{patch}'.format(
|
| - hostname=rietveld_host,
|
| - issue=issue,
|
| + buildset = 'patch/{codereview}/{hostname}/{issue}/{patch}'.format(
|
| + codereview='gerrit' if changelist.IsGerrit() else 'rietveld',
|
| + hostname=codereview_host,
|
| + issue=changelist.GetIssue(),
|
| patch=patchset)
|
| + extra_properties = _get_properties_from_options(options)
|
|
|
| batch_req_body = {'builds': []}
|
| print_text = []
|
| @@ -348,26 +358,26 @@ def trigger_try_jobs(auth_config, changelist, options, masters, category):
|
| parameters = {
|
| 'builder_name': builder,
|
| 'changes': [{
|
| - 'author': {'email': issue_props['owner_email']},
|
| + 'author': {'email': owner_email},
|
| 'revision': options.revision,
|
| }],
|
| 'properties': {
|
| 'category': category,
|
| - 'issue': issue,
|
| + 'issue': changelist.GetIssue(),
|
| 'master': master,
|
| - 'patch_project': issue_props['project'],
|
| + 'patch_project': project,
|
| 'patch_storage': 'rietveld',
|
| 'patchset': patchset,
|
| 'reason': options.name,
|
| - 'rietveld': rietveld_url,
|
| + 'rietveld': codereview_url,
|
| },
|
| }
|
| if 'presubmit' in builder.lower():
|
| parameters['properties']['dry_run'] = 'true'
|
| if tests:
|
| parameters['properties']['testfilter'] = tests
|
| - if properties:
|
| - parameters['properties'].update(properties)
|
| + if extra_properties:
|
| + parameters['properties'].update(extra_properties)
|
| if options.clobber:
|
| parameters['properties']['clobber'] = True
|
| batch_req_body['builds'].append(
|
| @@ -1548,10 +1558,6 @@ class Changelist(object):
|
| assert self.GetIssue()
|
| return self._codereview_impl.SetCQState(new_state)
|
|
|
| - def CannotTriggerTryJobReason(self):
|
| - """Returns reason (str) if unable trigger tryjobs on this CL or None."""
|
| - return self._codereview_impl.CannotTriggerTryJobReason()
|
| -
|
| # Forward methods to codereview specific implementation.
|
|
|
| def CloseIssue(self):
|
| @@ -1563,12 +1569,26 @@ class Changelist(object):
|
| def GetCodereviewServer(self):
|
| return self._codereview_impl.GetCodereviewServer()
|
|
|
| + def GetIssueOwner(self):
|
| + """Get owner from codereview, which may differ from this checkout."""
|
| + return self._codereview_impl.GetIssueOwner()
|
| +
|
| + def GetIssueProject(self):
|
| + """Get project from codereview, which may differ from what this
|
| + checkout's codereview.settings or gerrit project URL say.
|
| + """
|
| + return self._codereview_impl.GetIssueProject()
|
| +
|
| def GetApprovingReviewers(self):
|
| return self._codereview_impl.GetApprovingReviewers()
|
|
|
| def GetMostRecentPatchset(self):
|
| return self._codereview_impl.GetMostRecentPatchset()
|
|
|
| + def CannotTriggerTryJobReason(self):
|
| + """Returns reason (str) if unable trigger tryjobs on this CL or None."""
|
| + return self._codereview_impl.CannotTriggerTryJobReason()
|
| +
|
| def __getattr__(self, attr):
|
| # This is because lots of untested code accesses Rietveld-specific stuff
|
| # directly, and it's hard to fix for sure. So, just let it work, and fix
|
| @@ -1698,6 +1718,12 @@ class _ChangelistCodereviewBase(object):
|
| """Returns reason (str) if unable trigger tryjobs on this CL or None."""
|
| raise NotImplementedError()
|
|
|
| + def GetIssueOwner(self):
|
| + raise NotImplementedError()
|
| +
|
| + def GetIssueProject(self):
|
| + raise NotImplementedError()
|
| +
|
|
|
| class _RietveldChangelistImpl(_ChangelistCodereviewBase):
|
| def __init__(self, changelist, auth_config=None, rietveld_server=None):
|
| @@ -1783,6 +1809,12 @@ class _RietveldChangelistImpl(_ChangelistCodereviewBase):
|
| def GetApprovingReviewers(self):
|
| return get_approving_reviewers(self.GetIssueProperties())
|
|
|
| + def GetIssueOwner(self):
|
| + return (self.GetIssueProperties() or {}).get('owner_email')
|
| +
|
| + def GetIssueProject(self):
|
| + return (self.GetIssueProperties() or {}).get('project')
|
| +
|
| def AddComment(self, message):
|
| return self.RpcServer().add_comment(self.GetIssue(), message)
|
|
|
| @@ -2738,6 +2770,14 @@ class _GerritChangelistImpl(_ChangelistCodereviewBase):
|
| # TODO(tandrii): implement for Gerrit.
|
| raise NotImplementedError()
|
|
|
| + def GetIssueOwner(self):
|
| + # TODO(tandrii): implement for Gerrit.
|
| + raise NotImplementedError()
|
| +
|
| + def GetIssueProject(self):
|
| + # TODO(tandrii): implement for Gerrit.
|
| + raise NotImplementedError()
|
| +
|
|
|
| _CODEREVIEW_IMPLEMENTATIONS = {
|
| 'rietveld': _RietveldChangelistImpl,
|
| @@ -4717,8 +4757,6 @@ def CMDtry(parser, args):
|
| 'Not yet supported for Gerrit (http://crbug.com/599931).\n'
|
| 'If your project has Commit Queue, dry run is a workaround:\n'
|
| ' git cl set-commit --dry-run')
|
| - # Code below assumes Rietveld issue.
|
| - # TODO(tandrii): actually implement for Gerrit http://crbug.com/599931.
|
|
|
| error_message = cl.CannotTriggerTryJobReason()
|
| if error_message:
|
| @@ -4813,27 +4851,25 @@ def CMDtry(parser, args):
|
| for builders in masters.itervalues():
|
| if any('triggered' in b for b in builders):
|
| print('ERROR You are trying to send a job to a triggered bot. This type '
|
| - 'of bot requires an\ninitial job from a parent (usually a builder).'
|
| - ' Instead send your job to the parent.\n'
|
| + 'of bot requires an initial job from a parent (usually a builder). '
|
| + 'Instead send your job to the parent.\n'
|
| 'Bot list: %s' % builders, file=sys.stderr)
|
| return 1
|
|
|
| patchset = cl.GetMostRecentPatchset()
|
| - if patchset and patchset != cl.GetPatchset():
|
| - print(
|
| - '\nWARNING Mismatch between local config and server. Did a previous '
|
| - 'upload fail?\ngit-cl try always uses latest patchset from rietveld. '
|
| - 'Continuing using\npatchset %s.\n' % patchset)
|
| + if patchset != cl.GetPatchset():
|
| + print('Warning: Codereview server has newer patchsets (%s) than most '
|
| + 'recent upload from local checkout (%s). Did a previous upload '
|
| + 'fail?\n'
|
| + 'By default, git cl try uses the latest patchset from '
|
| + 'codereview, continuing to use patchset %s.\n' %
|
| + (patchset, cl.GetPatchset(), patchset))
|
| try:
|
| - trigger_try_jobs(auth_config, cl, options, masters, 'git_cl_try')
|
| + _trigger_try_jobs(auth_config, cl, masters, options, 'git_cl_try',
|
| + patchset)
|
| except BuildbucketResponseException as ex:
|
| print('ERROR: %s' % ex)
|
| return 1
|
| - except Exception as e:
|
| - stacktrace = (''.join(traceback.format_stack()) + traceback.format_exc())
|
| - print('ERROR: Exception when trying to trigger try jobs: %s\n%s' %
|
| - (e, stacktrace))
|
| - return 1
|
| return 0
|
|
|
|
|
| @@ -4876,8 +4912,8 @@ def CMDtry_results(parser, args):
|
| print('Warning: Codereview server has newer patchsets (%s) than most '
|
| 'recent upload from local checkout (%s). Did a previous upload '
|
| 'fail?\n'
|
| - 'By default, git cl try uses latest patchset from codereview, '
|
| - 'continuing to use patchset %s.\n' %
|
| + 'By default, git cl try-results uses the latest patchset from '
|
| + 'codereview, continuing to use patchset %s.\n' %
|
| (patchset, cl.GetPatchset(), patchset))
|
| try:
|
| jobs = fetch_try_jobs(auth_config, cl, options.buildbucket_host, patchset)
|
|
|