Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index 51593f20ec52fc0a99f65b70b859fcd1fa01a807..66bb76831aa3c1608b5b06b7585353be41579cb4 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -427,7 +427,6 @@ def _trigger_try_jobs(auth_config, changelist, buckets, options, |
# _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( |
@@ -437,7 +436,14 @@ def _trigger_try_jobs(auth_config, changelist, buckets, options, |
hostname=codereview_host, |
issue=changelist.GetIssue(), |
patch=patchset) |
+ |
+ shared_parameters_properties = changelist.GetTryjobProperties(patchset) |
+ shared_parameters_properties['category'] = category |
+ if options.clobber: |
+ shared_parameters_properties['clobber'] = True |
extra_properties = _get_properties_from_options(options) |
+ if extra_properties: |
+ shared_parameters_properties.update(extra_properties) |
batch_req_body = {'builds': []} |
print_text = [] |
@@ -455,23 +461,12 @@ def _trigger_try_jobs(auth_config, changelist, buckets, options, |
'author': {'email': owner_email}, |
'revision': options.revision, |
}], |
- 'properties': { |
- 'category': category, |
- 'issue': changelist.GetIssue(), |
- 'patch_project': project, |
- 'patch_storage': 'rietveld', |
- 'patchset': patchset, |
- 'rietveld': codereview_url, |
- }, |
+ 'properties': shared_parameters_properties.copy(), |
} |
if 'presubmit' in builder.lower(): |
parameters['properties']['dry_run'] = 'true' |
if tests: |
parameters['properties']['testfilter'] = tests |
- if extra_properties: |
- parameters['properties'].update(extra_properties) |
- if options.clobber: |
- parameters['properties']['clobber'] = True |
tags = [ |
'builder:%s' % builder, |
@@ -1691,12 +1686,6 @@ class Changelist(object): |
"""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() |
@@ -1707,6 +1696,10 @@ class Changelist(object): |
"""Returns reason (str) if unable trigger tryjobs on this CL or None.""" |
return self._codereview_impl.CannotTriggerTryJobReason() |
+ def GetTryjobProperties(self, patchset=None): |
+ """Returns dictionary of properties to launch tryjob.""" |
+ return self._codereview_impl.GetTryjobProperties(patchset=patchset) |
+ |
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 |
@@ -1839,7 +1832,7 @@ class _ChangelistCodereviewBase(object): |
def GetIssueOwner(self): |
raise NotImplementedError() |
- def GetIssueProject(self): |
+ def GetTryjobProperties(self, patchset=None): |
raise NotImplementedError() |
@@ -1920,15 +1913,23 @@ class _RietveldChangelistImpl(_ChangelistCodereviewBase): |
return 'CL %s is private' % self.GetIssue() |
return None |
+ def GetTryjobProperties(self, patchset=None): |
+ """Returns dictionary of properties to launch tryjob.""" |
+ project = (self.GetIssueProperties() or {}).get('project') |
+ return { |
+ 'issue': self.GetIssue(), |
+ 'patch_project': project, |
+ 'patch_storage': 'rietveld', |
+ 'patchset': patchset or self.GetPatchset(), |
+ 'rietveld': self.GetCodereviewServer(), |
+ } |
+ |
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) |
@@ -2868,16 +2869,38 @@ class _GerritChangelistImpl(_ChangelistCodereviewBase): |
labels={'Commit-Queue': vote_map[new_state]}) |
def CannotTriggerTryJobReason(self): |
- # TODO(tandrii): implement for Gerrit. |
- raise NotImplementedError() |
+ try: |
+ data = self._GetChangeDetail() |
+ except GerritIssueNotExists: |
+ return 'Gerrit doesn\'t know about your issue %s' % self.GetIssue() |
- def GetIssueOwner(self): |
- # TODO(tandrii): implement for Gerrit. |
- raise NotImplementedError() |
+ if data['status'] in ('ABANDONED', 'MERGED'): |
+ return 'CL %s is closed' % self.GetIssue() |
- def GetIssueProject(self): |
- # TODO(tandrii): implement for Gerrit. |
- raise NotImplementedError() |
+ def GetTryjobProperties(self, patchset=None): |
+ """Returns dictionary of properties to launch tryjob.""" |
+ data = self._GetChangeDetail(['ALL_REVISIONS']) |
+ patchset = int(patchset or self.GetPatchset()) |
+ assert patchset |
+ revision_data = None # Pylint wants it to be defined. |
+ for revision_data in data['revisions'].itervalues(): |
+ if int(revision_data['_number']) == patchset: |
+ break |
+ else: |
+ raise Exception('Patchset %d is not known in Gerrit issue %d' % |
+ (patchset, self.GetIssue())) |
+ return { |
+ 'patch_issue': self.GetIssue(), |
+ 'patch_set': patchset or self.GetPatchset(), |
+ 'patch_project': data['project'], |
+ 'patch_storage': 'gerrit', |
+ 'patch_ref': revision_data['fetch']['http']['ref'], |
+ 'patch_repository_url': revision_data['fetch']['http']['url'], |
+ 'patch_gerrit_url': self.GetCodereviewServer(), |
+ } |
+ |
+ def GetIssueOwner(self): |
+ return self._GetChangeDetail(['DETAILED_ACCOUNTS'])['owner']['email'] |
_CODEREVIEW_IMPLEMENTATIONS = { |
@@ -4828,12 +4851,6 @@ def CMDtry(parser, args): |
if not cl.GetIssue(): |
parser.error('Need to upload first') |
- if cl.IsGerrit(): |
- parser.error( |
- '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') |
- |
error_message = cl.CannotTriggerTryJobReason() |
if error_message: |
parser.error('Can\'t trigger try jobs: %s' % error_message) |