diff --git a/assets/javascripts/app/controllers.coffee b/assets/javascripts/app/controllers.coffee index 175ac594..5c9a274e 100644 --- a/assets/javascripts/app/controllers.coffee +++ b/assets/javascripts/app/controllers.coffee @@ -6,7 +6,7 @@ Travis.HistoryController = Em.ArrayController.extend() Travis.JobController = Em.ObjectController.extend() Travis.LoadingController = Em.Controller.extend() -Travis.CurrentController = Travis.BuildController = Em.ObjectController.extend +Travis.BuildController = Em.ObjectController.extend classes: (-> Travis.Helpers.colorForResult(@getPath('content.result')) ).property('content.result') diff --git a/assets/javascripts/app/helpers/handlebars.coffee b/assets/javascripts/app/helpers/handlebars.coffee index 35fd235d..366ad760 100644 --- a/assets/javascripts/app/helpers/handlebars.coffee +++ b/assets/javascripts/app/helpers/handlebars.coffee @@ -1,4 +1,5 @@ require 'ext/ember/bound_helper' +require 'travis/log' safe = (string) -> new Handlebars.SafeString(string) @@ -19,9 +20,10 @@ Ember.registerBoundHelper 'formatDuration', (duration, options) -> safe Travis.Helpers.timeInWords(duration) Ember.registerBoundHelper 'formatCommit', (commit, options) -> - branch = commit.get('branch') || '' - branch = " (#{branch})" if branch - safe (commit.get('sha') || '').substr(0, 7) + branch + if commit + branch = commit.get('branch') || '' + branch = " (#{branch})" if branch + safe (commit.get('sha') || '').substr(0, 7) + branch Ember.registerBoundHelper 'formatSha', (sha, options) -> safe (sha || '').substr(0, 7) diff --git a/assets/javascripts/app/models/artifact.coffee b/assets/javascripts/app/models/artifact.coffee index de4afdc7..b978d010 100644 --- a/assets/javascripts/app/models/artifact.coffee +++ b/assets/javascripts/app/models/artifact.coffee @@ -2,12 +2,3 @@ require 'travis/model' @Travis.Artifact = Travis.Model.extend body: DS.attr('string') - -@Travis.Artifact.FIXTURES = [ - { id: 1, body: 'log 1' } - { id: 2, body: 'log 2' } - { id: 3, body: 'log 3' } - { id: 4, body: 'log 4' } - { id: 5, body: 'log 4' } -] - diff --git a/assets/javascripts/app/models/build.coffee b/assets/javascripts/app/models/build.coffee index b1c6f97e..87269b38 100644 --- a/assets/javascripts/app/models/build.coffee +++ b/assets/javascripts/app/models/build.coffee @@ -24,34 +24,18 @@ require 'travis/model' @getPath 'data.config' ).property('data.config') - isMatrix: (-> - @getPath('data.job_ids.length') > 1 + # TODO why does the hasMany association not work? + jobs: (-> + Travis.Job.findMany(@getPath('data.job_ids') || []) ).property('data.job_ids.length') - # isFailureMatrix: (-> - # @getPath('allowedFailureJobs.length') > 0 - # ).property('allowedFailureJobs.length') - - # # TODO why does the hasMany association not work? - # jobs: (-> - # Travis.Job.findMany(@getPath('data.job_ids') || []) - # ).property('data.job_ids.length') - - # requiredJobs: (-> - # @get('jobs').filter (job) -> job.get('allow_failure') != true - # ).property('jobs') - - # allowedFailureJobs: (-> - # @get('jobs').filter (job) -> job.get 'allow_failure' - # ).property('jobs') - - # configKeys: (-> - # config = @get('config') - # return [] unless config - # keys = $.keys($.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala')) - # headers = [I18n.t('build.job'), I18n.t('build.duration'), I18n.t('build.finished_at')] - # $.map(headers.concat(keys), (key) -> return $.camelize(key)) - # ).property('config') + configKeys: (-> + config = @get('config') + return [] unless config + keys = $.keys($.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala')) + headers = [I18n.t('build.job'), I18n.t('build.duration'), I18n.t('build.finished_at')] + $.map(headers.concat(keys), (key) -> return $.camelize(key)) + ).property('config') tick: -> @notifyPropertyChange 'duration' @@ -63,10 +47,3 @@ require 'travis/model' olderThanNumber: (id, build_number) -> @find(url: '/repositories/' + id + '/builds.json?bare=true&after_number=' + build_number, repository_id: id, orderBy: 'number DESC') - -@Travis.Build.FIXTURES = [ - { id: 1, repository_id: 1, commit_id: 1, job_ids: [1, 2], number: 1, event_type: 'push', config: { rvm: ['rbx', '1.9.3'] }, finished_at: '2012-06-20T00:21:20Z', duration: 35, result: 0 }, - { id: 2, repository_id: 1, commit_id: 2, job_ids: [1], number: 2, event_type: 'push' }, - { id: 3, repository_id: 2, commit_id: 3, job_ids: [2], number: 3, event_type: 'push' }, - { id: 4, repository_id: 3, commit_id: 4, job_ids: [3], number: 4, event_type: 'push' } -] diff --git a/assets/javascripts/app/models/job.coffee b/assets/javascripts/app/models/job.coffee index db6a0d5f..9761f102 100644 --- a/assets/javascripts/app/models/job.coffee +++ b/assets/javascripts/app/models/job.coffee @@ -53,11 +53,3 @@ require 'travis/model' findMany: (ids) -> Travis.store.findMany this, ids -@Travis.Job.FIXTURES = [ - { id: 1, repository_id: 1, build_id: 1, commit_id: 1, log_id: 1, number: '1.1', config: { rvm: 'rbx' }, finished_at: '2012-06-20T00:21:20Z', duration: 35, result: 0 } - { id: 2, repository_id: 1, build_id: 1, commit_id: 1, log_id: 2, number: '1.2', config: { rvm: '1.9.3' } } - { id: 3, repository_id: 1, build_id: 2, commit_id: 2, log_id: 3, number: '2.1' } - { id: 4, repository_id: 2, build_id: 3, commit_id: 3, log_id: 4, number: '3.1' } - { id: 5, repository_id: 3, build_id: 4, commit_id: 4, log_id: 5, number: '4.1' } -] - diff --git a/assets/javascripts/app/models/repository.coffee b/assets/javascripts/app/models/repository.coffee index 66bc7f55..ac8e3562 100644 --- a/assets/javascripts/app/models/repository.coffee +++ b/assets/javascripts/app/models/repository.coffee @@ -36,10 +36,10 @@ require 'travis/model' ).property('data.last_build_duration', 'last_build_started_at', 'last_build_finished_at') stats: (-> - @get('_stats') || $.get("https://api.github.com/repos/#{@get('slug')}", (data) => - @set('_stats', data) - @notifyPropertyChange 'stats' - ) && {} + # @get('_stats') || $.get("https://api.github.com/repos/#{@get('slug')}", (data) => + # @set('_stats', data) + # @notifyPropertyChange 'stats' + # ) && {} ).property('slug') select: -> diff --git a/assets/javascripts/app/routes.coffee b/assets/javascripts/app/routes.coffee index 6e82ff01..cf7174e0 100644 --- a/assets/javascripts/app/routes.coffee +++ b/assets/javascripts/app/routes.coffee @@ -33,7 +33,7 @@ require 'hax0rs' build = Travis.Build.find(repository.get('last_build_id')) router.connectRepository(repository) router.connectTabs(repository) - router.connectCurrent(build) + router.connectBuild(build) repository: Em.Route.extend route: '/:owner/:name' @@ -54,22 +54,24 @@ require 'hax0rs' connectOutlets: (router) -> repository = router.get('repository') - onceLoaded repository, => # TODO should need to wait here, right? + onceLoaded repository, -> # TODO should not need to wait here, right? build = repository.get('lastBuild') router.connectTabs(repository) - router.connectCurrent(build) + router.connectBuild(build) builds: Em.Route.extend route: '/builds' connectOutlets: (router) -> repository = router.get('repository') - router.connectBuilds(repository.get('builds')) + onceLoaded repository, => # TODO hrm, otherwise it gets builds?repository_id=null + router.connectBuilds(repository.get('builds')) build: Em.Route.extend route: '/builds/:build_id' connectOutlets: (router, build) -> + build = Travis.Build.find(build.id) unless build instanceof Travis.Build # what? router.setPath('tabsController.build', build) router.connectBuild(build) @@ -77,7 +79,8 @@ require 'hax0rs' route: '/jobs/:job_id' connectOutlets: (router, job) -> - router.setPath('tabsController.build', build) + job = Travis.Job.find(job.id) unless job instanceof Travis.Job # what? + router.setPath('tabsController.build', job.get('build')) router.setPath('tabsController.job', job) router.connectJob(job) @@ -92,9 +95,6 @@ require 'hax0rs' @setPath('tabsController.repository', repository) @get('repositoryController').connectOutlet(outletName: 'tabs', name: 'tabs') - connectCurrent: (build) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'current', context: build) - connectBuilds: (builds) -> @get('repositoryController').connectOutlet(outletName: 'tab', name: 'history', context: builds) diff --git a/assets/javascripts/app/templates/builds/list.hbs b/assets/javascripts/app/templates/builds/list.hbs index 09a6adc3..d13511cf 100644 --- a/assets/javascripts/app/templates/builds/list.hbs +++ b/assets/javascripts/app/templates/builds/list.hbs @@ -9,15 +9,19 @@ - {{#collection tagName="tbody" contentBinding="content" itemViewClass="Travis.BuildsItemView" itemClassBinding="color"}} - {{#with view.content}} - {{number}} - {{formatCommit commit}} {{commit.sha}} - {{{formatMessage commit.message short="true"}}} - {{formatDuration duration}} - {{formatTime finished_at}} - {{/with}} - {{/collection}} + + {{#each build in content}} + {{#view Travis.BuildsItemView contextBinding="build"}} + + {{number}} + {{formatCommit commit}} + {{{formatMessage commit.message short="true"}}} + {{formatDuration duration}} + {{formatTime finished_at}} + + {{/view}} + {{/each}} +

diff --git a/assets/javascripts/app/templates/builds/show.hbs b/assets/javascripts/app/templates/builds/show.hbs index 75163542..470d6565 100644 --- a/assets/javascripts/app/templates/builds/show.hbs +++ b/assets/javascripts/app/templates/builds/show.hbs @@ -1,48 +1,45 @@ -{{#if isLoaded}} -

-
-
-
{{t builds.name}}
-
{{number}}
-
{{t builds.finished_at}}
-
{{formatTime finished_at}}
-
{{t builds.duration}}
-
{{formatDuration duration}}
-
+
+
+
+
{{t builds.name}}
+
{{number}}
+
{{t builds.finished_at}}
+
{{formatTime finished_at}}
+
{{t builds.duration}}
+
{{formatDuration duration}}
+
-
-
{{t builds.commit}}
-
{{formatCommit commit}}
- {{#if commit.compareUrl}} -
{{t builds.compare}}
-
{{pathFrom commit.compareUrl}}
- {{/if}} - {{#if commit.authorName}} -
{{t builds.author}}
-
{{commit.authorName}}
- {{/if}} - {{#if commit.committerName}} -
{{t builds.committer}}
-
{{commit.committerName}}
- {{/if}} -
- -
{{t builds.message}}
-
{{{formatMessage commit.message}}}
- - {{#if isMatrix}} - {{else}} -
{{t builds.config}}
-
{{formatConfig config}}
+
+
{{t builds.commit}}
+
{{formatCommit commit}}
+ {{#if commit.compareUrl}} +
{{t builds.compare}}
+
{{pathFrom commit.compareUrl}}
{{/if}} -
- - {{#if isLoaded}} - {{#if isMatrix}} - {{view Travis.JobsView}} - {{else}} - {{view Travis.LogView}} + {{#if commit.authorName}} +
{{t builds.author}}
+
{{commit.authorName}}
{{/if}} + {{#if commit.committerName}} +
{{t builds.committer}}
+
{{commit.committerName}}
+ {{/if}} +
+ +
{{t builds.message}}
+
{{{formatMessage commit.message}}}
+ + {{#unless isMatrix}} +
{{t builds.config}}
+
{{formatConfig config}}
+ {{/unless}} +
+ + {{#if isLoaded}} + {{#if view.isMatrix}} + {{view Travis.JobsView}} + {{else}} + {{view Travis.LogView contextBinding="jobs.firstObject"}} {{/if}} -
-{{/if}} + {{/if}} + diff --git a/assets/javascripts/app/templates/jobs/list.hbs b/assets/javascripts/app/templates/jobs/list.hbs index d18e6c02..5c3dfe81 100644 --- a/assets/javascripts/app/templates/jobs/list.hbs +++ b/assets/javascripts/app/templates/jobs/list.hbs @@ -8,9 +8,9 @@ - {{#each requiredJobs}} + {{#each view.requiredJobs}} - #{{number}} + #{{number}} {{formatDuration duration}} {{formatTime finished_at}} {{#each configValues}} @@ -21,7 +21,7 @@ -{{#if isFailureMatrix}} +{{#if view.isFailureMatrix}}
{{t jobs.allowed_failures}}{{whats_this allow_failure_help}} diff --git a/assets/javascripts/app/templates/jobs/log.hbs b/assets/javascripts/app/templates/jobs/log.hbs index 24a87c2d..60067481 100644 --- a/assets/javascripts/app/templates/jobs/log.hbs +++ b/assets/javascripts/app/templates/jobs/log.hbs @@ -1,11 +1,8 @@ -{{! ugh ... }} -{{#with jobs.firstObject}} -
{{{formatLog log.body}}}
+
{{{formatLog log.body}}}
- {{#if sponsor.name}} - - {{/if}} -{{/with}} +{{#if sponsor.name}} + +{{/if}} diff --git a/assets/javascripts/app/views.coffee b/assets/javascripts/app/views.coffee index 3fe902f9..66300d5e 100644 --- a/assets/javascripts/app/views.coffee +++ b/assets/javascripts/app/views.coffee @@ -19,15 +19,35 @@ Travis.RepositoriesItemView = Em.View.extend Travis.RepositoryView = Em.View.extend templateName: 'repositories/show' Travis.TabsView = Em.View.extend templateName: 'repositories/tabs' Travis.HistoryView = Em.View.extend templateName: 'builds/list' +Travis.LoadingView = Em.View.extend templateName: 'loading' Travis.BuildsItemView = Em.View.extend classes: (-> Travis.Helpers.colorForResult(@getPath('content.result')) ).property('content.result') -Travis.CurrentView = Travis.BuildView = Em.View.extend templateName: 'builds/show' -Travis.LoadingView = Em.View.extend templateName: 'loading' -Travis.JobsView = Em.View.extend templateName: 'jobs/list' +Travis.BuildView = Em.View.extend + templateName: 'builds/show' + + isMatrix: (-> + @getPath('context.data.job_ids.length') > 1 + ).property() + +Travis.JobsView = Em.View.extend + templateName: 'jobs/list' + + isFailureMatrix: (-> + @getPath('context.allowedFailureJobs.length') > 0 + ).property('context.allowedFailureJobs.length') + + requiredJobs: (-> + @getPath('context.jobs').filter (job) -> job.get('allow_failure') != true + ).property('context.jobs') + + allowedFailureJobs: (-> + @getPath('context.jobs').filter (job) -> job.get('allow_failure') + ).property('context.jobs') + Travis.JobView = Em.View.extend templateName: 'jobs/show' Travis.LogView = Em.View.extend templateName: 'jobs/log' diff --git a/assets/javascripts/lib/travis/data_store/rest_adapter.coffee b/assets/javascripts/lib/travis/data_store/rest_adapter.coffee index e84348d8..15ad6df6 100644 --- a/assets/javascripts/lib/travis/data_store/rest_adapter.coffee +++ b/assets/javascripts/lib/travis/data_store/rest_adapter.coffee @@ -51,7 +51,7 @@ json: 'application/vnd.travis-ci.2+json' findQuery: (store, type, query, recordArray) -> - url = '/' + type.buildURL(id) + url = '/' + type.buildURL() console.log "findQuery: #{url} (#{query})" @ajax url, 'GET', diff --git a/assets/javascripts/mocks.coffee b/assets/javascripts/mocks.coffee new file mode 100644 index 00000000..20b2841b --- /dev/null +++ b/assets/javascripts/mocks.coffee @@ -0,0 +1,81 @@ +repositories = [ + { id: 1, owner: 'travis-ci', name: 'travis-core', slug: 'travis-ci/travis-core', build_ids: [1, 2], last_build_id: 1, last_build_number: 1, last_build_result: 0 }, + { id: 2, owner: 'travis-ci', name: 'travis-assets', slug: 'travis-ci/travis-assets', build_ids: [3], last_build_id: 3, last_build_number: 3}, + { id: 3, owner: 'travis-ci', name: 'travis-hub', slug: 'travis-ci/travis-hub', build_ids: [4], last_build_id: 4, last_build_number: 4}, +] + +builds = [ + { id: 1, repository_id: 'travis-ci/travis-core', commit_id: 1, job_ids: [1, 2], number: 1, event_type: 'push', config: { rvm: ['rbx', '1.9.3'] }, finished_at: '2012-06-20T00:21:20Z', duration: 35, result: 0 }, + { id: 2, repository_id: 'travis-ci/travis-core', commit_id: 2, job_ids: [3], number: 2, event_type: 'push', config: { rvm: ['rbx'] } }, + { id: 3, repository_id: 'travis-ci/travis-assets', commit_id: 3, job_ids: [4], number: 3, event_type: 'push', config: { rvm: ['rbx'] } }, + { id: 4, repository_id: 'travis-ci/travis-hub', commit_id: 4, job_ids: [5], number: 4, event_type: 'push', config: { rvm: ['rbx'] } }, +] + +commits = [ + { id: 1, sha: '1234567', branch: 'master', message: 'commit message 1', author_name: 'author name', author_email: 'author@email.com', compare_url: 'http://github.com/compare/012345..123456' }, + { id: 2, sha: '2345678', branch: 'feature', message: 'commit message 2', author_name: 'author name', author_email: 'author@email.com', compare_url: 'http://github.com/compare/012345..123456' }, + { id: 3, sha: '3456789', branch: 'master', message: 'commit message 3', author_name: 'author name', author_email: 'author@email.com', compare_url: 'http://github.com/compare/012345..123456' }, + { id: 4, sha: '4567890', branch: 'master', message: 'commit message 4', author_name: 'author name', author_email: 'author@email.com', compare_url: 'http://github.com/compare/012345..123456' }, +] + +jobs = [ + { id: 1, repository_id: 1, build_id: 1, commit_id: 1, log_id: 1, number: '1.1', config: { rvm: 'rbx' }, finished_at: '2012-06-20T00:21:20Z', duration: 35, result: 0 } + { id: 2, repository_id: 1, build_id: 1, commit_id: 1, log_id: 2, number: '1.2', config: { rvm: '1.9.3' } } + { id: 3, repository_id: 1, build_id: 2, commit_id: 2, log_id: 3, number: '2.1' } + { id: 4, repository_id: 2, build_id: 3, commit_id: 3, log_id: 4, number: '3.1' } + { id: 5, repository_id: 3, build_id: 4, commit_id: 4, log_id: 5, number: '4.1' } +] + +artifacts = [ + { id: 1, body: 'log 1' } + { id: 2, body: 'log 2' } + { id: 3, body: 'log 3' } + { id: 4, body: 'log 4' } + { id: 5, body: 'log 4' } +] + +$.mockjax + url: '/repositories' + responseTime: 0 + responseText: { repositories: repositories } + +for repository in repositories + $.mockjax + url: '/' + repository.slug + responseTime: 0 + responseText: { repository: repository } + +for build in builds + $.mockjax + url: '/builds/' + build.id + responseTime: 0 + responseText: + build: build, + commit: commits[build.commit_id - 1] + jobs: (jobs[id - 1] for id in build.job_ids) + +for repository in repositories + $.mockjax + url: '/builds' + data: { repository_id: 1, event_type: 'push', orderBy: 'number DESC' } + responseTime: 0 + responseText: + builds: (builds[id - 1] for id in repository.build_ids) + commits: (commits[builds[id - 1].commit_id - 1] for id in repository.build_ids) + +for job in jobs + $.mockjax + url: '/jobs/' + job.id + responseTime: 0 + responseText: + job: job, + commit: commits[job.commit_id - 1] + +for artifact in artifacts + $.mockjax + url: '/artifacts/' + artifact.id + responseTime: 0 + responseText: + artifact: artifact + + diff --git a/assets/stylesheets/application.css b/assets/stylesheets/application.css index eff86740..1b7f27a9 100644 --- a/assets/stylesheets/application.css +++ b/assets/stylesheets/application.css @@ -69,6 +69,9 @@ li { margin-left: 20px; } +.summary { + display: inline-block; +} .summary .left, .summary .right { float: left; @@ -84,21 +87,23 @@ dd { float: left; } -.green { - border-top: 5px solid lightgreen; -} -.red { - border-top: 5px solid red; -} +/* .green { */ +/* border-top: 5px solid lightgreen; */ +/* } */ +/* .red { */ +/* border-top: 5px solid red; */ +/* } */ #jobs, .log { clear: both; padding-top: 20px; } -caption { - white-space: nowrap; - font-weight: bold; - padding-top: 20px; - display: block; +table { + clear: both; + margin-top: 20px; +} +caption { + text-align: left; + font-weight: bold; } diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 37fcc5a8..6f41cb2c 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1 +1 @@ -minispade.register('templates', "(function() {Ember.TEMPLATES['application']=Ember.Handlebars.compile(\"
\\n Travis CI\\n #\\n
\\n\\n
\\n {{outlet left}}\\n
\\n\\n
\\n {{outlet main}}\\n
\\n\");Ember.TEMPLATES['builds/list']=Ember.Handlebars.compile(\"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n {{#collection tagName=\\\"tbody\\\" contentBinding=\\\"content\\\" itemViewClass=\\\"Travis.BuildsItemView\\\" itemClassBinding=\\\"color\\\"}}\\n {{#with view.content}}\\n \\n \\n \\n \\n \\n {{/with}}\\n {{/collection}}\\n
{{t builds.name}}{{t builds.commit}}{{t builds.message}}{{t builds.duration}}{{t builds.finished_at}}
{{number}}{{formatCommit commit}} {{commit.sha}}{{{formatMessage commit.message short=\\\"true\\\"}}}{{formatDuration duration}}{{formatTime finished_at}}
\\n\\n

\\n \\n

\\n\");Ember.TEMPLATES['builds/show']=Ember.Handlebars.compile(\"{{#if isLoaded}}\\n
\\n
\\n
\\n
{{t builds.name}}
\\n
{{number}}
\\n
{{t builds.finished_at}}
\\n
{{formatTime finished_at}}
\\n
{{t builds.duration}}
\\n
{{formatDuration duration}}
\\n
\\n\\n
\\n
{{t builds.commit}}
\\n
{{formatCommit commit}}
\\n {{#if commit.compareUrl}}\\n
{{t builds.compare}}
\\n
{{pathFrom commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t builds.author}}
\\n
{{commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t builds.committer}}
\\n
{{commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t builds.message}}
\\n
{{{formatMessage commit.message}}}
\\n\\n {{#if isMatrix}}\\n {{else}}\\n
{{t builds.config}}
\\n
{{formatConfig config}}
\\n {{/if}}\\n
\\n\\n {{#if isLoaded}}\\n {{#if isMatrix}}\\n {{view Travis.JobsView}}\\n {{else}}\\n {{view Travis.LogView}}\\n {{/if}}\\n {{/if}}\\n
\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/list']=Ember.Handlebars.compile(\"\\n \\n \\n \\n {{#each configKeys}}\\n \\n {{/each}}\\n \\n \\n \\n {{#each requiredJobs}}\\n \\n \\n \\n \\n {{#each configValues}}\\n \\n {{/each}}\\n \\n {{/each}}\\n \\n
{{t jobs.build_matrix}}
{{this}}
#{{number}}{{formatDuration duration}}{{formatTime finished_at}}{{this}}
\\n\\n{{#if isFailureMatrix}}\\n \\n \\n \\n \\n {{#each configKeys}}\\n \\n {{/each}}\\n \\n \\n \\n {{#each allowedFailureJobs}}\\n \\n \\n \\n \\n {{#each configValues}}\\n \\n {{/each}}\\n \\n {{/each}}\\n \\n
\\n {{t jobs.allowed_failures}}{{whats_this allow_failure_help}}\\n
{{this}}
#{{number}}{{formatDuration duration}}{{formatTime finished_at}}{{this}}
\\n\\n
\\n
{{t \\\"jobs.allowed_failures\\\"}}
\\n
\\n

\\n Allowed Failures are items in your build matrix that are allowed to\\n fail without causing the entire build to be shown as failed. This lets you add\\n in experimental and preparatory builds to test against versions or\\n configurations that you are not ready to officially support.\\n

\\n

\\n You can define allowed failures in the build matrix as follows:\\n

\\n
\\n    matrix:\\n      allow_failures:\\n        - rvm: ruby-head\\n      
\\n
\\n
\\n{{/if}}\\n\\n\");Ember.TEMPLATES['jobs/log']=Ember.Handlebars.compile(\"{{! ugh ... }}\\n{{#with jobs.firstObject}}\\n
{{{formatLog log.body}}}
\\n\\n {{#if sponsor.name}}\\n

\\n {{t builds.messages.sponsored_by}}\\n {{sponsor.name}}\\n

\\n {{/if}}\\n{{/with}}\\n\");Ember.TEMPLATES['jobs/show']=Ember.Handlebars.compile(\"
\\n
\\n
\\n
Job
\\n
{{number}}
\\n
{{t jobs.finished_at}}
\\n
{{formatTime finished_at}}
\\n
{{t jobs.duration}}
\\n
{{formatDuration duration}}
\\n
\\n\\n
\\n
{{t jobs.commit}}
\\n
{{formatCommit commit}}
\\n {{#if commit.compare_url}}\\n
{{t jobs.compare}}
\\n
{{pathFrom commit.compare_url}}
\\n {{/if}}\\n {{#if commit.author_name}}\\n
{{t jobs.author}}
\\n
{{commit.author_name}}
\\n {{/if}}\\n {{#if commit.committer_name}}\\n
{{t jobs.committer}}
\\n
{{commit.committer_name}}
\\n {{/if}}\\n
\\n\\n
{{t jobs.message}}
\\n
{{formatMessage commit.message}}
\\n
{{t jobs.config}}
\\n
{{formatConfig config}}
\\n
\\n\\n {{view Travis.LogView}}\\n
\\n\\n\");Ember.TEMPLATES['loading']=Ember.Handlebars.compile(\"loading stuff ...\\n\");Ember.TEMPLATES['repositories/list']=Ember.Handlebars.compile(\"{{#if content.lastObject.isLoaded}}\\n