| Index: scripts/master/cros_try_job_git.py
|
| diff --git a/scripts/master/cros_try_job_git.py b/scripts/master/cros_try_job_git.py
|
| index 998d0ed1172cc08ce6a545fa1357759150a035a1..965112fcab71b26d417424a82eb71491be0e359d 100644
|
| --- a/scripts/master/cros_try_job_git.py
|
| +++ b/scripts/master/cros_try_job_git.py
|
| @@ -2,6 +2,7 @@
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| +import base64
|
| import json
|
| import os
|
| import re
|
| @@ -25,6 +26,8 @@ from twisted.internet import defer, reactor, utils
|
| from twisted.mail.smtp import SMTPSenderFactory
|
| from twisted.python import log
|
|
|
| +from common.twisted_util.response import StringResponse
|
| +from master import gitiles_poller
|
| from master.try_job_base import BadJobfile
|
|
|
|
|
| @@ -32,15 +35,6 @@ class InvalidEtcBuild(BadJobfile):
|
| pass
|
|
|
|
|
| -def get_file_contents(poller, branch, file_path):
|
| - """Returns a Deferred to returns the file's content."""
|
| - return utils.getProcessOutput(
|
| - poller.gitbin,
|
| - ['show', 'origin/%s:%s' % (branch, file_path)],
|
| - path=poller.workdir,
|
| - )
|
| -
|
| -
|
| def translate_v1_to_v2(parsed_job):
|
| """Translate tryjob desc from V1 to V2."""
|
| parsed_job.setdefault('extra_args', []).append('--remote-trybot')
|
| @@ -76,6 +70,10 @@ class CrOSTryJobGit(TryBase):
|
| # - The build name doesn't contain spaces (to spill into extra args).
|
| ETC_TARGET_RE = re.compile(r'^[a-zA-Z][\w-]+\w$')
|
|
|
| + # Template path URL component to retrieve the Base64 contents of a file from
|
| + # Gitiles.
|
| + _GITILES_PATH_TMPL = '%(repo)s/+/%(revision)s/%(path)s?format=text'
|
| +
|
| @classmethod
|
| def updateJobDesc(cls, parsed_job):
|
| """Ensure job description is in the format we expect."""
|
| @@ -199,11 +197,9 @@ class CrOSTryJobGit(TryBase):
|
| buildroot = '/b/cbuild/external_master'
|
| props.setProperty('buildroot', buildroot, self._PROPERTY_SOURCE)
|
|
|
| - props.setProperty('extra_args', options.get('extra_args', []),
|
| - self._PROPERTY_SOURCE)
|
| props.setProperty('slaves_request', options.get('slaves_request', []),
|
| self._PROPERTY_SOURCE)
|
| - props.setProperty('chromeos_config', config, self._PROPERTY_SOURCE)
|
| + props.setProperty('cbb_config', config, self._PROPERTY_SOURCE)
|
|
|
| return props
|
|
|
| @@ -251,31 +247,25 @@ see<br>this message please contact chromeos-build@google.com.<br>
|
| StringIO(m.as_string()), result)
|
| reactor.connectTCP(self.smtp_host, 25, sender_factory)
|
|
|
| - @defer.deferredGenerator
|
| + @defer.inlineCallbacks
|
| def gotChange(self, change, important):
|
| """Process the received data and send the queue buildset."""
|
| - # Implicitly skips over non-files like directories.
|
| - if len(change.files) != 1:
|
| - # We only accept changes with 1 diff file.
|
| - raise BadJobfile(
|
| - 'Try job with too many files %s' % (','.join(change.files)))
|
| -
|
| # Find poller that this change came from.
|
| for poller in self.pollers:
|
| - if poller.repourl == change.repository:
|
| + if not isinstance(poller, gitiles_poller.GitilesPoller):
|
| + continue
|
| + if poller.repo_url == change.repository:
|
| break
|
| else:
|
| raise BadJobfile(
|
| 'Received tryjob from unsupported repository %s' % change.repository)
|
|
|
| # pylint: disable=W0631
|
| - wfd = defer.waitForDeferred(
|
| - get_file_contents(poller, change.branch, change.files[0]))
|
| - yield wfd
|
| + file_contents = yield self.loadGitilesChangeFile(poller, change)
|
|
|
| - parsed = None
|
| + parsed = {}
|
| try:
|
| - parsed = self.load_job(wfd.getResult())
|
| + parsed = self.load_job(file_contents)
|
| self.validate_job(parsed)
|
| self.updateJobDesc(parsed)
|
| except BadJobfile as e:
|
| @@ -289,11 +279,27 @@ see<br>this message please contact chromeos-build@google.com.<br>
|
| raise
|
|
|
| # The sourcestamp/buildsets created will be merge-able.
|
| - d = self.master.db.sourcestamps.addSourceStamp(
|
| + ssid = yield self.master.db.sourcestamps.addSourceStamp(
|
| branch=change.branch,
|
| revision=change.revision,
|
| project=change.project,
|
| repository=change.repository,
|
| changeids=[change.number])
|
| - d.addCallback(self.create_buildset, parsed)
|
| - d.addErrback(log.err, "Failed to queue a try job!")
|
| + yield self.create_buildset(ssid, parsed)
|
| +
|
| + @defer.inlineCallbacks
|
| + def loadGitilesChangeFile(self, poller, change):
|
| + if len(change.files) != 1:
|
| + # We only accept changes with 1 diff file.
|
| + raise BadJobfile(
|
| + 'Try job with too many files %s' % (','.join(change.files)))
|
| +
|
| + # Load the contents of the modified file.
|
| + path = self._GITILES_PATH_TMPL % {
|
| + 'repo': poller.repo_path,
|
| + 'revision': change.revision,
|
| + 'path': change.files[0],
|
| + }
|
| + contents_b64 = yield poller.agent.request('GET', path, retry=5,
|
| + protocol=StringResponse.Get)
|
| + defer.returnValue(base64.b64decode(contents_b64))
|
|
|