commit stuff for piotr

This commit is contained in:
Sven Fuchs 2012-07-05 16:49:47 +02:00
parent 0ee887c792
commit e15b2d680f
19 changed files with 425 additions and 361 deletions

View File

@ -3,6 +3,7 @@ require 'ext/jquery'
# $.mockjaxSettings.log = false
# Ember.LOG_BINDINGS = true
@Travis = Em.Namespace.create
CONFIG_KEYS: ['rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala']

View File

@ -2,11 +2,27 @@ require 'helpers'
require 'travis/ticker'
Travis.Controllers = Em.Namespace.create
RepositoriesController: Em.ArrayController.extend()
RepositoryController: Em.ObjectController.extend(Travis.Urls.Repository)
BuildsController: Em.ArrayController.extend()
BuildController: Em.ObjectController.extend(Travis.Urls.Commit)
JobController: Em.ObjectController.extend(Travis.Urls.Commit)
RepositoriesController: Em.ArrayController.extend
contentBinding: 'layout.repositories'
RepositoryController: Em.Controller.extend # Travis.Urls.Repository,
repositoryBinding: 'layout.repository'
TabsController: Em.Controller.extend
repositoryBinding: 'layout.repository'
buildBinding: 'layout.build'
jobBinding: 'layout.job'
tabBinding: 'layout.tab'
BuildsController: Em.ArrayController.extend
contentBinding: 'layout.builds'
BuildController: Em.Controller.extend # Travis.Urls.Commit,
buildBinding: 'layout.build'
JobController: Em.Controller.extend # Travis.Urls.Commit,
jobBinding: 'layout.job'
QueuesController: Em.ArrayController.extend()
UserController: Em.ObjectController.extend()
HooksController: Em.ArrayController.extend()

View File

@ -16,8 +16,8 @@
Repository:
urlGithub: (->
"http://github.com/#{@get('slug')}"
).property('slug'),
"http://github.com/#{@getPath('repository.slug')}"
).property('repository.slug'),
urlGithubWatchers: (->
"http://github.com/#{@get('slug')}/watchers"

View File

@ -1,6 +1,7 @@
Travis.Layout = Em.Namespace.create()
require 'layout/home'
require 'layout/left'
require 'layout/sidebar'
require 'layout/profile'
require 'layout/stats'

View File

@ -2,7 +2,7 @@ Travis.Layout.Base = Em.Object.extend
init: ->
@parent = @get('parent')
@setup(Array.prototype.slice.apply(arguments).concat(@get('name')))
@setup(Array.prototype.slice.apply(arguments).concat([@get('name'), 'top']))
@connect()
setup: (controllers) ->
@ -14,7 +14,7 @@ Travis.Layout.Base = Em.Object.extend
key = "#{$.camelize(name, false)}Controller"
name = $.camelize(key)
klass = Travis.Controllers[name] || Em.Controller
this[key] = klass.create(namespace: this, controllers: this)
this[key] = klass.create(layout: this, namespace: this, controllers: this)
@controller = this["#{$.camelize(@get('name'), false)}Controller"]
@viewClass = Travis.Views["#{$.camelize(@get('name'))}Layout"]
@ -31,5 +31,6 @@ Travis.Layout.Base = Em.Object.extend
@topController.set('tab', @get('name'))
activate: (action, params) ->
this["view#{$.camelize(action)}"](params)
@set('params', params)
this["view#{$.camelize(action)}"]()

View File

@ -4,83 +4,67 @@ Travis.Layout.Home = Travis.Layout.Base.extend
name: 'home'
init: ->
@_super('top', 'repositories', 'repository', 'tabs', 'builds', 'build', 'job')
@connectLeft(Travis.Repository.find())
Travis.Layout.Sidebar.create(homeController: @get('homeController'))
@_super('repositories', 'repository', 'tabs', 'builds', 'build', 'job')
# Travis.Layout.Sidebar.create(parent: @controller)
viewIndex: (params) ->
onceLoaded @repositories, =>
repository = @repositories.get('firstObject')
@connectRepository(repository)
@connectTabs('current')
@connectBuild(repository.get('lastBuild'))
@controller.connectOutlet(outletName: 'left', name: 'repositories')
@controller.connectOutlet(outletName: 'main', name: 'repository')
@controller.connectOutlet(outletName: 'tabs', name: 'tabs')
viewCurrent: (params) ->
@viewRepository params, (repository) =>
@connectTabs('current')
@connectBuild(repository.get('lastBuild'))
@set('repositories', Travis.Repository.find())
viewBuilds: (params) ->
@viewRepository params, (repository) =>
@connectTabs('builds')
@connectBuilds(repository.get('builds'))
activate: (action, params) ->
@set('tab', if action == 'index' then 'current' else action)
@_super(action, params)
viewBuild: (params) ->
@viewRepository params
@buildBy params.id, (build) =>
@connectTabs('build', build)
@connectBuild(build)
viewIndex: ->
@bindRepository('repositories.firstObject')
@bindBuild('repository.lastBuild')
@connectTab('build')
viewJob: (params) ->
@viewRepository params
@jobBy params.id, (job) =>
@connectTabs('job', job.get('build'), job)
@connectJob(job)
viewCurrent: ->
@bindRepository('repositoryByParams')
@bindBuild('repository.lastBuild')
@connectTab('build')
viewBuilds: ->
@bind('repository', 'repositoriesByParams.firstObject')
@bind('builds', 'repository.builds')
@connectTab('builds')
viewRepository: (params, callback) ->
@repositoryBy params, (repository) =>
@connectRepository(repository)
callback(repository) if callback
viewBuild: ->
@bindRepository('repositoryByParams')
@bindBuild('buildById')
@connectTab('build')
repositoryBy: (params, callback) ->
repositories = Travis.Repository.bySlug("#{params.owner}/#{params.name}")
onceLoaded repositories, =>
callback(repositories.get('firstObject'))
viewJob: ->
@bindRepository('repositoryByParams')
@bindJob('jobById')
@connectTab('job')
buildBy: (id, callback) =>
build = Travis.Build.find(id)
onceLoaded build, =>
callback(build)
repositoryByParamsBinding: 'repositoriesByParams.firstObject'
jobBy: (id, callback) ->
job = Travis.Job.find(id)
onceLoaded job, =>
callback(job)
repositoriesByParams: (->
console.log('repositoriesByParams', @getPath('params.owner'), @getPath('params.name'))
Travis.Repository.bySlug("#{params.owner}/#{params.name}") if params = @get('params')
).property('params')
buildById: (->
console.log('buildByParams', @getPath('params.id'))
Travis.Build.find(id) if id = @getPath('params.id')
).property('params.id')
connectLeft: (repositories) ->
@repositories = repositories
@homeController.connectOutlet(outletName: 'left', name: 'repositories', context: repositories)
jobById: (->
console.log('jobByParams', @getPath('params.id'))
Travis.Job.find(id) if id = @getPath('params.id')
).property('params.id')
connectRepository: (repository) ->
@repository = repository
@homeController.connectOutlet(outletName: 'main', name: 'repository', context: repository)
bindRepository: (from) ->
Ember.oneWay(this, 'repository', from)
connectTabs: (tab, build, job) ->
@tabsController.set('tab', tab)
@tabsController.set('repository', @repository)
@tabsController.set('build', build)
@tabsController.set('job', job)
@homeController.connectOutlet(outletName: 'tabs', name: 'tabs')
connectBuilds: (builds) ->
@homeController.connectOutlet(outletName: 'tab', name: 'builds', context: builds)
connectBuild: (build) ->
@homeController.connectOutlet(outletName: 'tab', name: 'build', context: build)
connectJob: (job) ->
@homeController.connectOutlet(outletName: 'tab', name: 'job', context: job)
bindBuild: (from) ->
Ember.oneWay(this, 'build', from)
connectTab: (tab) ->
@controller.connectOutlet(outletName: 'tab', name: tab)

View File

@ -0,0 +1,16 @@
require 'layout/base'
Travis.Layout.Left = Travis.Layout.Base.extend
name: 'sidebar'
init: ->
@_super('repositories')
@parent = @get('parent')
@connectLeft(Travis.Repository.find())
connect: ->
@parent.connectOutlet(outletName: 'right', name: 'sidebar')
connectLeft: (repositories) ->
@parent.set('repositories', repositories)
@parent.connectOutlet(outletName: 'left', name: 'repositories', context: repositories)

View File

@ -5,7 +5,7 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
init: ->
@_super('sponsors', 'workers', 'queues')
@homeController = @get('homeController')
@parent = @get('parent')
@connectSponsors(Travis.Sponsor.decks(), Travis.Sponsor.links())
@connectWorkers(Travis.Worker.find())
@ -14,13 +14,13 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
Travis.Ticker.create(target: this, interval: Travis.INTERVALS.sponsors)
connect: ->
@homeController.connectOutlet(outletName: 'right', name: 'sidebar')
@parent.connectOutlet(outletName: 'right', name: 'sidebar')
connectSponsors: (decks, links) ->
@sponsorsController = Em.Controller.create
decks: Travis.Controllers.SponsorsController.create(perPage: 1, content: decks)
links: Travis.Controllers.SponsorsController.create(perPage: 6, content: links)
@homeController.set 'sponsors', @sponsorsController
@parent.set 'sponsors', @sponsorsController
tick: ->
@sponsorsController.get('decks').next()
@ -28,7 +28,7 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
connectWorkers: (workers) ->
@workersController.set('content', workers)
@homeController.set('workers', @workersController)
@parent.set('workers', @workersController)
connectQueues: (queues) ->
queues = for queue in queues
@ -36,5 +36,5 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
content: Travis.Job.queued(queue.name)
name: queue.display
@queuesController.set('content', queues)
@homeController.set('queues', @queuesController)
@parent.set('queues', @queuesController)

View File

@ -1,31 +1,35 @@
<table id="builds" class="list">
<thead>
<tr>
<th>{{t builds.name}}</th>
<th>{{t builds.commit}}</th>
<th>{{t builds.message}}</th>
<th>{{t builds.duration}}</th>
<th>{{t builds.finished_at}}</th>
</tr>
</thead>
{{#with controller.builds}}
<table id="builds" class="list">
<thead>
<tr>
<th>{{t builds.name}}</th>
<th>{{t builds.commit}}</th>
<th>{{t builds.message}}</th>
<th>{{t builds.duration}}</th>
<th>{{t builds.finished_at}}</th>
</tr>
</thead>
<tbody>
{{#each build in content}}
{{#view Travis.Views.BuildsItemView contextBinding="build"}}
<tr {{bindAttr class="view.color"}}>
<td class="number"><a {{bindAttr href="view.urlBuild"}}>{{number}}</a></td>
<td class="commit"><a {{bindAttr href="view.urlGithubCommit"}}>{{formatCommit commit}}</a></td>
<td class="message">{{{formatMessage commit.message short="true"}}}</td>
<td class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</td>
<td class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</td>
</tr>
{{/view}}
{{/each}}
</tbody>
</table>
<tbody>
{{#each build in content}}
{{#view Travis.Views.BuildsItemView contextBinding="build"}}
<tr {{bindAttr class="view.color"}}>
<td class="number"><a {{bindAttr href="view.urlBuild"}}>{{number}}</a></td>
<td class="commit"><a {{bindAttr href="view.urlGithubCommit"}}>{{formatCommit commit}}</a></td>
<td class="message">{{{formatMessage commit.message short="true"}}}</td>
<td class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</td>
<td class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</td>
</tr>
{{/view}}
{{else}}
Loading ...
{{/each}}
</tbody>
</table>
<p>
<button {{action showMore on="click" target="builds" isVisibleBinding="hasMore"}}>
{{t builds.show_more}}
</button>
</p>
<p>
<button {{action showMore on="click" target="builds" isVisibleBinding="hasMore"}}>
{{t builds.show_more}}
</button>
</p>
{{/with}}

View File

@ -1,48 +1,50 @@
{{#unless isLoaded}}
Loading ...
{{else}}
<div id="build" {{bindAttr class="view.color"}}>
<dl id="summary">
<div class="left">
<dt>{{t builds.name}}</dt>
<dd class="number"><a {{bindAttr href="view.urlBuild"}}>{{number}}</a></dd>
<dt class="finished_at_label">{{t builds.finished_at}}</dt>
<dd class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</dd>
<dt>{{t builds.duration}}</dt>
<dd class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</dd>
</div>
{{#with controller.build}}
{{#unless isLoaded}}
Loading ...
{{else}}
<div id="build" {{bindAttr class="view.color"}}>
<dl id="summary">
<div class="left">
<dt>{{t builds.name}}</dt>
<dd class="number"><a {{bindAttr href="controller.view.urlBuild"}}>{{number}}</a></dd>
<dt class="finished_at_label">{{t builds.finished_at}}</dt>
<dd class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</dd>
<dt>{{t builds.duration}}</dt>
<dd class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</dd>
</div>
<div class="right">
<dt>{{t builds.commit}}</dt>
<dd class="commit"><a {{bindAttr href="urlGithubCommit"}}>{{formatCommit commit}}</a></dd>
{{#if commit.compareUrl}}
<dt>{{t builds.compare}}</dt>
<dd class="compare"><a {{bindAttr href="commit.compareUrl"}}>{{pathFrom commit.compareUrl}}</a></dd>
{{/if}}
{{#if commit.authorName}}
<dt>{{t builds.author}}</dt>
<dd class="author"><a {{bindAttr href="urlAuthor"}}>{{commit.authorName}}</a></dd>
{{/if}}
{{#if commit.committerName}}
<dt>{{t builds.committer}}</dt>
<dd class="committer"><a {{bindAttr href="urlCommitter"}}>{{commit.committerName}}</a></dd>
{{/if}}
</div>
<div class="right">
<dt>{{t builds.commit}}</dt>
<dd class="commit"><a {{bindAttr href="urlGithubCommit"}}>{{formatCommit commit}}</a></dd>
{{#if commit.compareUrl}}
<dt>{{t builds.compare}}</dt>
<dd class="compare"><a {{bindAttr href="commit.compareUrl"}}>{{pathFrom commit.compareUrl}}</a></dd>
{{/if}}
{{#if commit.authorName}}
<dt>{{t builds.author}}</dt>
<dd class="author"><a {{bindAttr href="urlAuthor"}}>{{commit.authorName}}</a></dd>
{{/if}}
{{#if commit.committerName}}
<dt>{{t builds.committer}}</dt>
<dd class="committer"><a {{bindAttr href="urlCommitter"}}>{{commit.committerName}}</a></dd>
{{/if}}
</div>
<dt>{{t builds.message}}</dt>
<dd class="message">{{{formatMessage commit.message}}}</dd>
<dt>{{t builds.message}}</dt>
<dd class="message">{{{formatMessage commit.message}}}</dd>
{{#unless isMatrix}}
<dt>{{t builds.config}}</dt>
<dd class="config">{{formatConfig config}}</dd>
{{/unless}}
</dl>
{{#unless isMatrix}}
<dt>{{t builds.config}}</dt>
<dd class="config">{{formatConfig config}}</dd>
{{/unless}}
</dl>
{{#if isMatrix}}
{{view Travis.Views.JobsView jobsBinding="view.requiredJobs" required="true"}}
{{view Travis.Views.JobsView jobsBinding="view.allowedFailureJobs"}}
{{else}}
{{view Travis.Views.LogView contextBinding="jobs.firstObject"}}
{{/if}}
</div>
{{/unless}}
{{#if isMatrix}}
{{view Travis.Views.JobsView jobsBinding="view.requiredJobs" required="true"}}
{{view Travis.Views.JobsView jobsBinding="view.allowedFailureJobs"}}
{{else}}
{{view Travis.Views.LogView contextBinding="jobs.firstObject"}}
{{/if}}
</div>
{{/unless}}
{{/with}}

View File

@ -1,56 +1,58 @@
{{#if view.jobs.length}}
{{#if view.required}}
<table id="jobs" class="list">
<caption>
{{t jobs.build_matrix}}
</caption>
{{else}}
<table id="allowed_failure_jobs" class="list">
<caption>
{{t jobs.allowed_failures}}
<a title="What's this?" class="help" {{action toggleHelp}}></a>
</caption>
{{/if}}
<thead>
<tr>
{{#each configKeys}}
<th>{{this}}</th>
{{#with controller.build}}
{{#if jobs.length}}
{{#if view.required}}
<table id="jobs" class="list">
<caption>
{{t jobs.build_matrix}}
</caption>
{{else}}
<table id="allowed_failure_jobs" class="list">
<caption>
{{t jobs.allowed_failures}}
<a title="What's this?" class="help" {{action toggleHelp}}></a>
</caption>
{{/if}}
<thead>
<tr>
{{#each configKeys}}
<th>{{this}}</th>
{{/each}}
</tr>
</thead>
<tbody>
{{#each job in view.jobs}}
{{#view Travis.Views.JobsItemView contextBinding="job"}}
<tr {{bindAttr class="view.color"}}>
<td class="number"><a {{bindAttr href="view.urlJob"}}>{{number}}</a></td>
<td class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</td>
<td class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</td>
{{#each configValues}}
<td>{{this}}</td>
{{/each}}
</tr>
{{/view}}
{{/each}}
</tr>
</thead>
<tbody>
{{#each job in view.jobs}}
{{#view Travis.Views.JobsItemView contextBinding="job"}}
<tr {{bindAttr class="view.color"}}>
<td class="number"><a {{bindAttr href="view.urlJob"}}>{{number}}</a></td>
<td class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</td>
<td class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</td>
{{#each configValues}}
<td>{{this}}</td>
{{/each}}
</tr>
{{/view}}
{{/each}}
</tbody>
</table>
</tbody>
</table>
{{#unless view.required}}
<div id="allow_failure_help" class="context_help">
<div class="context_help_caption">{{t "jobs.allowed_failures"}}</div>
<div class="context_help_body">
<p>
Allowed Failures are items in your build matrix that are allowed to
fail without causing the entire build to be shown as failed. This lets you add
in experimental and preparatory builds to test against versions or
configurations that you are not ready to officially support.
</p>
<p>
You can define allowed failures in the build matrix as follows:
</p>
<pre> matrix:
allow_failures:
- rvm: ruby-head </pre>
{{#unless view.required}}
<div id="allow_failure_help" class="context_help">
<div class="context_help_caption">{{t "jobs.allowed_failures"}}</div>
<div class="context_help_body">
<p>
Allowed Failures are items in your build matrix that are allowed to
fail without causing the entire build to be shown as failed. This lets you add
in experimental and preparatory builds to test against versions or
configurations that you are not ready to officially support.
</p>
<p>
You can define allowed failures in the build matrix as follows:
</p>
<pre> matrix:
allow_failures:
- rvm: ruby-head </pre>
</div>
</div>
</div>
{{/unless}}
{{/if}}
{{/unless}}
{{/if}}
{{/with}}

View File

@ -1,37 +1,40 @@
<div {{bindAttr class="view.color"}}>
<dl id="summary">
<div class="left">
<dt>Job</dt>
<dd class="number"><a {{bindAttr href="view.urlJob"}}>{{number}}</a></dd>
<dt class="finished_at_label">{{t jobs.finished_at}}</dt>
<dd class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</dd>
<dt>{{t jobs.duration}}</dt>
<dd class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</dd>
{{#with controller.job}}
{{#if isLoaded}}
<div {{bindAttr class="view.color"}}>
<dl id="summary">
<div class="left">
<dt>Job</dt>
<dd class="number"><a {{bindAttr href="view.urlJob"}}>{{number}}</a></dd>
<dt class="finished_at_label">{{t jobs.finished_at}}</dt>
<dd class="finished_at timeago" {{bindAttr title="finished_at"}}>{{formatTime finished_at}}</dd>
<dt>{{t jobs.duration}}</dt>
<dd class="duration" {{bindAttr title="started_at"}}>{{formatDuration duration}}</dd>
</div>
<div class="right">
<dt>{{t jobs.commit}}</dt>
<dd class="commit-hash"><a {{bindAttr href="urlGithubCommit"}}>{{formatCommit commit}}</a></dd>
{{#if commit.compareUrl}}
<dt>{{t jobs.compare}}</dt>
<dd class="compare_view"><a {{bindAttr href="commit.compareUrl"}}>{{pathFrom commit.compareUrl}}</a></dd>
{{/if}}
{{#if commit.authorName}}
<dt>{{t jobs.author}}</dt>
<dd class="author"><a {{bindAttr href="urlAuthor"}}>{{commit.authorName}}</a></dd>
{{/if}}
{{#if commit.committerName}}
<dt>{{t jobs.committer}}</dt>
<dd class="committer"><a {{bindAttr href="urlCommitter"}}>{{commit.committerName}}</a></dd>
{{/if}}
</div>
<dt>{{t jobs.message}}</dt>
<dd class="commit-message">{{formatMessage commit.message}}</dd>
<dt>{{t jobs.config}}</dt>
<dd class="config">{{formatConfig config}}</dd>
</dl>
{{view Travis.Views.LogView}}
</div>
<div class="right">
<dt>{{t jobs.commit}}</dt>
<dd class="commit-hash"><a {{bindAttr href="urlGithubCommit"}}>{{formatCommit commit}}</a></dd>
{{#if commit.compareUrl}}
<dt>{{t jobs.compare}}</dt>
<dd class="compare_view"><a {{bindAttr href="commit.compareUrl"}}>{{pathFrom commit.compareUrl}}</a></dd>
{{/if}}
{{#if commit.authorName}}
<dt>{{t jobs.author}}</dt>
<dd class="author"><a {{bindAttr href="urlAuthor"}}>{{commit.authorName}}</a></dd>
{{/if}}
{{#if commit.committerName}}
<dt>{{t jobs.committer}}</dt>
<dd class="committer"><a {{bindAttr href="urlCommitter"}}>{{commit.committerName}}</a></dd>
{{/if}}
</div>
<dt>{{t jobs.message}}</dt>
<dd class="commit-message">{{formatMessage commit.message}}</dd>
<dt>{{t jobs.config}}</dt>
<dd class="config">{{formatConfig config}}</dd>
</dl>
{{view Travis.Views.LogView}}
</div>
{{/if}}
{{/with}}

View File

@ -1,5 +1,5 @@
<ul id="repositories">
{{#each repository in content}}
{{#each repository in controller.content}}
{{#view Travis.Views.RepositoriesItemView contextBinding="repository"}}
<li {{bindAttr class="view.classes"}}>
<a {{bindAttr href="view.urlRepository"}} class="current">{{slug}}</a>

View File

@ -1,17 +1,19 @@
{{#unless isLoaded}}
Loading ...
{{else}}
<div id="repository">
<h3>
<a {{bindAttr href="urlGithub"}}>{{slug}}</a>
</h3>
{{#with controller.repository}}
{{#unless isLoaded}}
Loading ...
{{else}}
<div id="repository">
<h3>
<a {{bindAttr href="controller.urlGithub"}}>{{slug}}</a>
</h3>
<p class="description">{{description}}</p>
<p class="description">{{description}}</p>
<ul class="github-stats">
<li class="language">{{last_build_language}}</li>
<li><a class="watchers" title="Watches" {{bindAttr href="urlGithubWatchers"}}>{{stats.watchers}}</a></li>
<li><a class="forks" title="Forks" {{bindAttr href="urlGithubNetwork"}}>{{stats.forks}}</a></li>
</ul>
</div>
{{/unless}}
<ul class="github-stats">
<li class="language">{{lastBuildLanguage}}</li>
<li><a class="watchers" title="Watches" {{bindAttr href="urlGithubWatchers"}}>{{stats.watchers}}</a></li>
<li><a class="forks" title="Forks" {{bindAttr href="urlGithubNetwork"}}>{{stats.forks}}</a></li>
</ul>
</div>
{{/unless}}
{{/with}}

View File

@ -11,16 +11,20 @@
<li id="tab_branches" {{bindAttr class="view.classBranches"}}>
<h5><a {{bindAttr href="view.urlBranches"}}>{{t repositories.tabs.branches}}</a></h5>
</li>
{{#if build}}
<li id="tab_build" {{bindAttr class="view.classBuild"}}>
<h5><a {{bindAttr href="view.urlBuild"}}>{{t repositories.tabs.build}} #{{build.number}}</a></h5>
</li>
{{/if}}
{{#if job}}
<li id="tab_job" {{bindAttr class="view.classJob"}}>
<h5><a {{bindAttr href="view.urlJob"}}>{{t repositories.tabs.job}} #{{job.number}}</a></h5>
</li>
{{/if}}
{{#with controller.build}}
{{#if isLoaded}}
<li id="tab_build" {{bindAttr class="view.classBuild"}}>
<h5><a {{bindAttr href="view.urlBuild"}}>{{t repositories.tabs.build}} #{{number}}</a></h5>
</li>
{{/if}}
{{/with}}
{{#with controller.job}}
{{#if isLoaded}}
<li id="tab_job" {{bindAttr class="view.classJob"}}>
<h5><a {{bindAttr href="view.urlJob"}}>{{t repositories.tabs.job}} #{{number}}</a></h5>
</li>
{{/if}}
{{/with}}
</ul>
<div id="tools">

View File

@ -15,19 +15,21 @@
templateName: 'builds/show'
color: (->
Travis.Helpers.colorForResult(@getPath('controller.content.result'))
).property('controller.content.result')
Travis.Helpers.colorForResult(@getPath('controller.build.result'))
).property('controller.build.result')
requiredJobs: (->
@getPath('controller.content.jobs').filter((job) -> job.get('allow_failure') != true)
).property('controller.content') # TODO same here with binding to 'context.data.job_ids'
jobs = @getPath('controller.build.jobs')
jobs.filter((job) -> job.get('allow_failure') != true) if jobs
).property('controller.build.jobs')
allowedFailureJobs: (->
@getPath('controller.content.jobs').filter((job) -> job.get('allow_failure'))
).property('controller.content')
jobs = @getPath('controller.build.jobs')
jobs.filter((job) -> job.get('allow_failure')) if jobs
).property('controller.build.jobs')
urlBuild: (->
Travis.Urls.build(@getPath('context.repository'), @get('context'))
).property('controller.content.repository.id', 'controller.content.id')
).property('controller.build.repository.id', 'controller.build.id')

View File

@ -1,5 +1,5 @@
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
// Version: v0.9.8.1-468-g3097ea8
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700)
(function() {
@ -136,8 +136,8 @@ window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprec
})();
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
// Version: v0.9.8.1-468-g3097ea8
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700)
(function() {
@ -1414,11 +1414,6 @@ function normalizeTuple(target, path) {
return TUPLE_RET;
}
/** @private */
Ember.isGlobal = function(path) {
return IS_GLOBAL.test(path);
};
/**
@private
@ -1482,7 +1477,8 @@ Ember.getPath = function(root, path) {
Ember.setPath = function(root, path, value, tolerant) {
var keyName;
if (typeof root === 'string' && IS_GLOBAL.test(root)) {
if (typeof root === 'string') {
Ember.assert("Path '" + root + "' must be global if no root is given.", IS_GLOBAL.test(root));
value = path;
path = root;
root = null;
@ -1536,7 +1532,7 @@ Ember.trySetPath = function(root, path, value) {
@returns Boolean
*/
Ember.isGlobalPath = function(path) {
return !HAS_THIS.test(path) && IS_GLOBAL.test(path);
return IS_GLOBAL.test(path);
};
})();
@ -10632,9 +10628,17 @@ var get = Ember.get, set = Ember.set;
Ember.HistoryLocation = Ember.Object.extend({
init: function() {
set(this, 'location', get(this, 'location') || window.location);
set(this, '_initialURL', get(this, 'location').pathname);
set(this, 'callbacks', Ember.A());
},
/**
@private
Used to give history a starting reference
*/
_initialURL: null,
/**
@private
@ -10650,12 +10654,13 @@ Ember.HistoryLocation = Ember.Object.extend({
Uses `history.pushState` to update the url without a page reload.
*/
setURL: function(path) {
var state = window.history.state;
var state = window.history.state,
initialURL = get(this, '_initialURL');
if (path === "") { path = '/'; }
// We only want pushState to be executed if we are passing
// in a new path, otherwise a new state will be inserted
// for the same path.
if (!state || (state && state.path !== path)) {
if ((initialURL && initialURL !== path) || (state && state.path !== path)) {
set(this, '_initialURL', null);
window.history.pushState({ path: path }, null, path);
}
},
@ -11524,8 +11529,6 @@ Ember.ControllerMixin.reopen({
if (controller && context) { controller.set('content', context); }
view = viewClass.create();
if (controller) { set(view, 'controller', controller); }
/* console.log(view, view.toString()) */
set(this, outletName, view);
return view;
@ -11577,6 +11580,17 @@ var childViewsProperty = Ember.computed(function() {
return ret;
}).property().cacheable();
var controllerProperty = Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable();
var VIEW_PRESERVES_CONTEXT = Ember.VIEW_PRESERVES_CONTEXT;
Ember.warn("The way that the {{view}} helper affects templates is about to change. Previously, templates inside child views would use the new view as the context. Soon, views will preserve their parent context when rendering their template. You can opt-in early to the new behavior by setting `ENV.VIEW_PRESERVES_CONTEXT = true`. For more information, see https://gist.github.com/2494968. You should update your templates as soon as possible; this default will change soon, and the option will be eliminated entirely before the 1.0 release.", VIEW_PRESERVES_CONTEXT);
@ -12045,17 +12059,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
@type Object
*/
controller: Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable(),
controller: controllerProperty,
/**
A view may contain a layout. A layout is a regular template but
supersedes the `template` property during rendering. It is the
@ -12120,20 +12124,22 @@ Ember.View = Ember.Object.extend(Ember.Evented,
to be re-rendered.
*/
_context: Ember.computed(function(key, value) {
var parentView, controller;
var parentView, context;
if (arguments.length === 2) {
return value;
}
if (VIEW_PRESERVES_CONTEXT) {
if (controller = get(this, 'controller')) {
return controller;
if (Ember.meta(this).descs.controller !== controllerProperty) {
if (context = get(this, 'controller')) {
return context;
}
}
parentView = get(this, '_parentView');
if (parentView) {
return get(parentView, '_context');
if (parentView && (context = get(parentView, '_context'))) {
return context;
}
}
@ -14803,6 +14809,12 @@ Ember.State = Ember.Object.extend(Ember.Evented,
return !get(this, 'childStates').length;
}).cacheable(),
/**
A boolean value indicating whether the state takes a context.
By default we assume all states take contexts.
*/
hasContext: true,
/**
This is the default transition event.
@ -15323,7 +15335,6 @@ Ember.StateManager = Ember.State.extend(
send: function(event, context) {
Ember.assert('Cannot send event "' + event + '" while currentState is ' + get(this, 'currentState'), get(this, 'currentState'));
if (arguments.length === 1) { context = {}; }
return this.sendRecursively(event, get(this, 'currentState'), context);
},
@ -15472,7 +15483,7 @@ Ember.StateManager = Ember.State.extend(
exitStates.shift();
}
currentState.pathsCache[name] = {
currentState.pathsCache[path] = {
exitStates: exitStates,
enterStates: enterStates,
resolveState: resolveState
@ -15490,7 +15501,7 @@ Ember.StateManager = Ember.State.extend(
exitStates.unshift(state);
}
useContext = context && (!get(state, 'isRoutable') || get(state, 'isDynamic'));
useContext = context && get(state, 'hasContext');
matchedContexts.unshift(useContext ? contexts.pop() : null);
}
@ -15502,6 +15513,7 @@ Ember.StateManager = Ember.State.extend(
state = getPath(state, 'states.'+initialState);
if (!state) { break; }
enterStates.push(state);
matchedContexts.push(undefined);
}
while (enterStates.length > 0) {
@ -15732,9 +15744,10 @@ Ember.Routable = Ember.Mixin.create({
/**
@private
Check whether the route has dynamic segments
Check whether the route has dynamic segments and therefore takes
a context.
*/
isDynamic: Ember.computed(function() {
hasContext: Ember.computed(function() {
var routeMatcher = get(this, 'routeMatcher');
if (routeMatcher) {
return routeMatcher.identifiers.length > 0;
@ -16339,7 +16352,7 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
{{/each}}
</script>
See Handlebars.helpers.actions for additional usage examples.
See Handlebars.helpers.action for additional usage examples.
## Changing View Hierarchy in Response To State Change
@ -17959,7 +17972,7 @@ EmberHandlebars.registerHelper('with', function(context, options) {
Ember.assert("You must pass a block to the with helper", options.fn && options.fn !== Handlebars.VM.noop);
if (Ember.isGlobal(path)) {
if (Ember.isGlobalPath(path)) {
Ember.bind(options.data.keywords, keywordName, path);
} else {
normalized = normalizePath(this, path, options.data);
@ -20114,8 +20127,8 @@ Ember.$(document).ready(
})();
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
// Version: v0.9.8.1-468-g3097ea8
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700)
(function() {

File diff suppressed because one or more lines are too long

View File

@ -1952,8 +1952,8 @@ Handlebars.VM = {
Handlebars.template = Handlebars.VM.template;
;
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
// Version: v0.9.8.1-468-g3097ea8
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700)
(function() {
@ -2090,8 +2090,8 @@ window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprec
})();
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
// Version: v0.9.8.1-468-g3097ea8
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700)
(function() {
@ -3368,11 +3368,6 @@ function normalizeTuple(target, path) {
return TUPLE_RET;
}
/** @private */
Ember.isGlobal = function(path) {
return IS_GLOBAL.test(path);
};
/**
@private
@ -3436,7 +3431,8 @@ Ember.getPath = function(root, path) {
Ember.setPath = function(root, path, value, tolerant) {
var keyName;
if (typeof root === 'string' && IS_GLOBAL.test(root)) {
if (typeof root === 'string') {
Ember.assert("Path '" + root + "' must be global if no root is given.", IS_GLOBAL.test(root));
value = path;
path = root;
root = null;
@ -3490,7 +3486,7 @@ Ember.trySetPath = function(root, path, value) {
@returns Boolean
*/
Ember.isGlobalPath = function(path) {
return !HAS_THIS.test(path) && IS_GLOBAL.test(path);
return IS_GLOBAL.test(path);
};
})();
@ -12586,9 +12582,17 @@ var get = Ember.get, set = Ember.set;
Ember.HistoryLocation = Ember.Object.extend({
init: function() {
set(this, 'location', get(this, 'location') || window.location);
set(this, '_initialURL', get(this, 'location').pathname);
set(this, 'callbacks', Ember.A());
},
/**
@private
Used to give history a starting reference
*/
_initialURL: null,
/**
@private
@ -12604,12 +12608,13 @@ Ember.HistoryLocation = Ember.Object.extend({
Uses `history.pushState` to update the url without a page reload.
*/
setURL: function(path) {
var state = window.history.state;
var state = window.history.state,
initialURL = get(this, '_initialURL');
if (path === "") { path = '/'; }
// We only want pushState to be executed if we are passing
// in a new path, otherwise a new state will be inserted
// for the same path.
if (!state || (state && state.path !== path)) {
if ((initialURL && initialURL !== path) || (state && state.path !== path)) {
set(this, '_initialURL', null);
window.history.pushState({ path: path }, null, path);
}
},
@ -13478,8 +13483,6 @@ Ember.ControllerMixin.reopen({
if (controller && context) { controller.set('content', context); }
view = viewClass.create();
if (controller) { set(view, 'controller', controller); }
/* console.log(view, view.toString()) */
set(this, outletName, view);
return view;
@ -13531,6 +13534,17 @@ var childViewsProperty = Ember.computed(function() {
return ret;
}).property().cacheable();
var controllerProperty = Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable();
var VIEW_PRESERVES_CONTEXT = Ember.VIEW_PRESERVES_CONTEXT;
Ember.warn("The way that the {{view}} helper affects templates is about to change. Previously, templates inside child views would use the new view as the context. Soon, views will preserve their parent context when rendering their template. You can opt-in early to the new behavior by setting `ENV.VIEW_PRESERVES_CONTEXT = true`. For more information, see https://gist.github.com/2494968. You should update your templates as soon as possible; this default will change soon, and the option will be eliminated entirely before the 1.0 release.", VIEW_PRESERVES_CONTEXT);
@ -13999,17 +14013,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
@type Object
*/
controller: Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable(),
controller: controllerProperty,
/**
A view may contain a layout. A layout is a regular template but
supersedes the `template` property during rendering. It is the
@ -14074,20 +14078,22 @@ Ember.View = Ember.Object.extend(Ember.Evented,
to be re-rendered.
*/
_context: Ember.computed(function(key, value) {
var parentView, controller;
var parentView, context;
if (arguments.length === 2) {
return value;
}
if (VIEW_PRESERVES_CONTEXT) {
if (controller = get(this, 'controller')) {
return controller;
if (Ember.meta(this).descs.controller !== controllerProperty) {
if (context = get(this, 'controller')) {
return context;
}
}
parentView = get(this, '_parentView');
if (parentView) {
return get(parentView, '_context');
if (parentView && (context = get(parentView, '_context'))) {
return context;
}
}
@ -16757,6 +16763,12 @@ Ember.State = Ember.Object.extend(Ember.Evented,
return !get(this, 'childStates').length;
}).cacheable(),
/**
A boolean value indicating whether the state takes a context.
By default we assume all states take contexts.
*/
hasContext: true,
/**
This is the default transition event.
@ -17277,7 +17289,6 @@ Ember.StateManager = Ember.State.extend(
send: function(event, context) {
Ember.assert('Cannot send event "' + event + '" while currentState is ' + get(this, 'currentState'), get(this, 'currentState'));
if (arguments.length === 1) { context = {}; }
return this.sendRecursively(event, get(this, 'currentState'), context);
},
@ -17426,7 +17437,7 @@ Ember.StateManager = Ember.State.extend(
exitStates.shift();
}
currentState.pathsCache[name] = {
currentState.pathsCache[path] = {
exitStates: exitStates,
enterStates: enterStates,
resolveState: resolveState
@ -17444,7 +17455,7 @@ Ember.StateManager = Ember.State.extend(
exitStates.unshift(state);
}
useContext = context && (!get(state, 'isRoutable') || get(state, 'isDynamic'));
useContext = context && get(state, 'hasContext');
matchedContexts.unshift(useContext ? contexts.pop() : null);
}
@ -17456,6 +17467,7 @@ Ember.StateManager = Ember.State.extend(
state = getPath(state, 'states.'+initialState);
if (!state) { break; }
enterStates.push(state);
matchedContexts.push(undefined);
}
while (enterStates.length > 0) {
@ -17686,9 +17698,10 @@ Ember.Routable = Ember.Mixin.create({
/**
@private
Check whether the route has dynamic segments
Check whether the route has dynamic segments and therefore takes
a context.
*/
isDynamic: Ember.computed(function() {
hasContext: Ember.computed(function() {
var routeMatcher = get(this, 'routeMatcher');
if (routeMatcher) {
return routeMatcher.identifiers.length > 0;
@ -18293,7 +18306,7 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
{{/each}}
</script>
See Handlebars.helpers.actions for additional usage examples.
See Handlebars.helpers.action for additional usage examples.
## Changing View Hierarchy in Response To State Change
@ -19913,7 +19926,7 @@ EmberHandlebars.registerHelper('with', function(context, options) {
Ember.assert("You must pass a block to the with helper", options.fn && options.fn !== Handlebars.VM.noop);
if (Ember.isGlobal(path)) {
if (Ember.isGlobalPath(path)) {
Ember.bind(options.data.keywords, keywordName, path);
} else {
normalized = normalizePath(this, path, options.data);
@ -22068,8 +22081,8 @@ Ember.$(document).ready(
})();
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
// Version: v0.9.8.1-468-g3097ea8
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700)
(function() {