Merge branch 'master' into sf-log
Conflicts: assets/scripts/app/views/log.coffee
This commit is contained in:
commit
300e91133c
|
@ -1,5 +1,5 @@
|
|||
# Contributing to Travis-CI
|
||||
Issues for any Travis-CI should be submitted to https://github.com/travis-ci/travis-ci/issues
|
||||
Issues for any Travis-CI repo should be submitted to https://github.com/travis-ci/travis-ci/issues
|
||||
|
||||
## Security Issues
|
||||
***Any security issues should be submitted directly to [security@travis-ci.org](mailto:security@travis-ci.org)***
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
## Travis CI ember web client
|
||||
|
||||
[](https://travis-ci.org/travis-ci/travis-web)
|
||||
### Running the app
|
||||
|
||||
In order to run the app you need to install dependencies with:
|
||||
|
|
|
@ -1,4 +1,66 @@
|
|||
# $.mockjaxSettings.log = false
|
||||
# Ember.LOG_BINDINGS = true
|
||||
# Ember.ENV.RAISE_ON_DEPRECATION = true
|
||||
# Pusher.log = -> console.log(arguments)
|
||||
unless window.TravisApplication
|
||||
window.TravisApplication = Em.Application.extend(Ember.Evented,
|
||||
authStateBinding: 'auth.state'
|
||||
signedIn: (-> @get('authState') == 'signed-in' ).property('authState')
|
||||
|
||||
setup: ->
|
||||
@store = Travis.Store.create(
|
||||
adapter: Travis.RestAdapter.create()
|
||||
)
|
||||
@store.loadMany(Travis.Sponsor, Travis.SPONSORS)
|
||||
|
||||
@slider = new Travis.Slider()
|
||||
@pusher = new Travis.Pusher(Travis.config.pusher_key)
|
||||
@tailing = new Travis.Tailing()
|
||||
|
||||
@set('auth', Travis.Auth.create(app: this, endpoint: Travis.config.api_endpoint))
|
||||
|
||||
reset: ->
|
||||
@store.destroy()
|
||||
@setup()
|
||||
|
||||
@_super.apply(this, arguments);
|
||||
|
||||
lookup: ->
|
||||
@__container__.lookup.apply @__container__, arguments
|
||||
|
||||
storeAfterSignInPath: (path) ->
|
||||
@get('auth').storeAfterSignInPath(path)
|
||||
|
||||
autoSignIn: (path) ->
|
||||
@get('auth').autoSignIn()
|
||||
|
||||
signIn: ->
|
||||
@get('auth').signIn()
|
||||
|
||||
signOut: ->
|
||||
@get('auth').signOut()
|
||||
|
||||
receive: ->
|
||||
@store.receive.apply(@store, arguments)
|
||||
|
||||
toggleSidebar: ->
|
||||
$('body').toggleClass('maximized')
|
||||
# TODO gotta force redraws here :/
|
||||
element = $('<span></span>')
|
||||
$('#top .profile').append(element)
|
||||
Em.run.later (-> element.remove()), 10
|
||||
element = $('<span></span>')
|
||||
$('#repo').append(element)
|
||||
Em.run.later (-> element.remove()), 10
|
||||
|
||||
setLocale: (locale) ->
|
||||
return unless locale
|
||||
I18n.locale = locale
|
||||
Travis.set('locale', locale)
|
||||
|
||||
defaultLocale: 'en'
|
||||
|
||||
ready: ->
|
||||
location.href = location.href.replace('#!/', '') if location.hash.slice(0, 2) == '#!'
|
||||
I18n.fallbacks = true
|
||||
@setLocale 'locale', @get('defaultLocale')
|
||||
|
||||
currentDate: ->
|
||||
new Date()
|
||||
)
|
||||
|
|
|
@ -10,6 +10,9 @@ Travis.RunningJobsController = Em.ArrayProxy.extend
|
|||
sortProperties: ['number']
|
||||
).create(content: @get('jobs'))
|
||||
|
||||
willDestroy: ->
|
||||
@get('sortedJobs').destroy()
|
||||
|
||||
add: (job) ->
|
||||
@get('jobs').pushObject(job) unless @get('jobs').contains job
|
||||
@attach()
|
||||
|
@ -97,3 +100,4 @@ Travis.RunningJobsController = Em.ArrayProxy.extend
|
|||
removeGroup: (group) ->
|
||||
@get('groups').removeObject group
|
||||
delete @groupsBySlug[group.get('slug')]
|
||||
group.destroy()
|
||||
|
|
|
@ -8,7 +8,6 @@ require 'travis/chunk_buffer'
|
|||
|
||||
init: ->
|
||||
@setParts()
|
||||
@fetch()
|
||||
|
||||
setParts: ->
|
||||
@set 'parts', Ember.ArrayProxy.create(content: [])
|
||||
|
@ -35,8 +34,7 @@ require 'travis/chunk_buffer'
|
|||
|
||||
loadText: (text) ->
|
||||
console.log 'log model: load text' if Log.DEBUG
|
||||
number = -1
|
||||
@append(number: 1, content: text)
|
||||
@append(number: 1, content: text, final: true)
|
||||
@set('isLoaded', true)
|
||||
|
||||
Travis.Log.Request = Em.Object.extend
|
||||
|
|
|
@ -9,7 +9,7 @@ Ember.Router.reopen
|
|||
try
|
||||
@_super(url)
|
||||
catch error
|
||||
@_super('/not-found')
|
||||
@_super('/not-found') if error.message.match(/No route matched the URL/)
|
||||
|
||||
# TODO: don't reopen Ember.Route to add events, there should be
|
||||
# a better way (like "parent" resource for everything inside map)
|
||||
|
|
|
@ -81,7 +81,7 @@ Travis.Store = DS.Store.extend
|
|||
console.log 'store: received job:log event', data if Log.DEBUG
|
||||
data = data.job
|
||||
job = @find(Travis.Job, data.id)
|
||||
job.appendLog(number: parseInt(data.number), content: data._log)
|
||||
job.appendLog(number: parseInt(data.number), content: data._log, final: data.final)
|
||||
else if data[type.singularName()]
|
||||
@_loadOne(this, type, data)
|
||||
else if data[type.pluralName()]
|
||||
|
|
|
@ -11,7 +11,9 @@ Travis.reopen
|
|||
|
||||
didInsertElement: ->
|
||||
job = @get('job')
|
||||
job.subscribe() if job && !job.get('isFinished')
|
||||
if job && !job.get('isFinished')
|
||||
job.get('log').fetch()
|
||||
job.subscribe()
|
||||
|
||||
willDestroyElement: ->
|
||||
job = @get('job')
|
||||
|
|
|
@ -2,7 +2,7 @@ get = Ember.get
|
|||
|
||||
Travis.ChunkBuffer = Em.ArrayProxy.extend
|
||||
timeout: 5000
|
||||
checkTimeoutFrequency: 1000
|
||||
checkTimeoutFrequency: 5000
|
||||
start: 1
|
||||
next: 1
|
||||
|
||||
|
@ -48,7 +48,6 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
|
|||
console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') )+'', 'current', @get('next')
|
||||
queue.pushObjects addedObjects
|
||||
@check()
|
||||
@inserted()
|
||||
|
||||
check: ->
|
||||
queue = @get('queue')
|
||||
|
@ -60,11 +59,13 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
|
|||
while queue.get('firstObject.number') <= next
|
||||
element = queue.shiftObject()
|
||||
if get(element, 'number') == next
|
||||
@finalize() if get(element, 'final')
|
||||
toPush.pushObject get(element, 'content')
|
||||
next += 1
|
||||
|
||||
if toPush.length
|
||||
arrangedContent.pushObjects toPush
|
||||
@inserted()
|
||||
|
||||
@set('next', next)
|
||||
|
||||
|
@ -72,14 +73,17 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
|
|||
now = @now()
|
||||
@lastInsert = now
|
||||
|
||||
finalize: ->
|
||||
clearTimeout @get('runLaterId')
|
||||
|
||||
checkTimeout: ->
|
||||
now = @now()
|
||||
if now - @lastInsert > @get('timeout')
|
||||
@giveUpOnMissingParts()
|
||||
@set 'runLaterId', Ember.run.later(this, @checkTimeout, @get('checkTimeoutFrequency'))
|
||||
@set 'runLaterId', setTimeout((=> @checkTimeout()), @get('checkTimeoutFrequency'))
|
||||
|
||||
willDestroy: ->
|
||||
Ember.run.cancel @get('runLaterId')
|
||||
@finalize()
|
||||
@_super.apply this, arguments
|
||||
|
||||
now: ->
|
||||
|
|
|
@ -6,6 +6,7 @@ FOLDS = [
|
|||
]
|
||||
|
||||
@Travis.OrderedLog = Em.Object.extend
|
||||
linesLimit: 5000
|
||||
init: ->
|
||||
@set 'folds', []
|
||||
@set 'line', 1
|
||||
|
@ -17,7 +18,7 @@ FOLDS = [
|
|||
|
||||
append: (lines) ->
|
||||
return unless lines
|
||||
return if @get('lineNumber') > 5000
|
||||
return if @get('lineNumber') > @get('linesLimit')
|
||||
|
||||
log = @join lines
|
||||
log = @escape log
|
||||
|
@ -88,7 +89,7 @@ FOLDS = [
|
|||
if currentFold
|
||||
@set 'foldContinuation', true
|
||||
|
||||
if @get('lineNumber') + index >= 5000
|
||||
if @get('lineNumber') + index >= @get('linesLimit')
|
||||
result.pushObject logWasCut: true
|
||||
break
|
||||
|
||||
|
|
|
@ -43,3 +43,30 @@ describe 'on the "job" state', ->
|
|||
displaysLog [
|
||||
'log 1'
|
||||
]
|
||||
|
||||
describe 'too long log', ->
|
||||
beforeEach ->
|
||||
$.mockjax
|
||||
url: '/jobs/2/log?cors_hax=true'
|
||||
responseTime: 0
|
||||
responseText: '1\n2\n3\n4\n5\n6\n7\n8\n9\n10'
|
||||
|
||||
Travis.OrderedLog.reopen
|
||||
linesLimit: 5
|
||||
|
||||
app 'travis-ci/travis-core/jobs/2'
|
||||
waitFor logRendered
|
||||
|
||||
afterEach ->
|
||||
Travis.OrderedLog.reopen
|
||||
linesLimit: 5000
|
||||
|
||||
it 'is cut after given limit', ->
|
||||
displaysLog [
|
||||
'12345'
|
||||
]
|
||||
|
||||
expect( $('#log .cut').text() ).toEqual 'Log was too long to display. Download the the raw version to get the full log.'
|
||||
expect( $('#log .cut a').attr('href') ).toEqual '/jobs/2/log.txt?deansi=true'
|
||||
|
||||
|
||||
|
|
7
assets/scripts/spec/routes_spec.coffee
Normal file
7
assets/scripts/spec/routes_spec.coffee
Normal file
|
@ -0,0 +1,7 @@
|
|||
describe 'router', ->
|
||||
it 'renders notFound template when URL can\t be found', ->
|
||||
app '/somehing/something/something/.../dark/side/..../something/something/something/.../complete'
|
||||
waitFor appRendered
|
||||
runs ->
|
||||
expect( $('#main').text().trim() ).toEqual('The requested page was not found.')
|
||||
|
|
@ -11,4 +11,5 @@
|
|||
@jobsRendered = notEmpty('#jobs .number')
|
||||
@queuesRendered = notEmpty('#queue_linux li')
|
||||
@workersRendered = notEmpty('.worker')
|
||||
|
||||
@logRendered = notEmpty('#log p')
|
||||
@appRendered = -> $('.ember-view.application').length
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
@displaysLog = (lines) ->
|
||||
log = lines.join()
|
||||
expect($('#log').text().trim()).toEqual log
|
||||
expect($('#log p').text().trim()).toEqual log
|
||||
|
||||
@listsRepos = (items) ->
|
||||
listsItems('repo', items)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
createChunk = (number, content) ->
|
||||
Em.Object.create(number: number, content: content)
|
||||
createChunk = (number, content, options) ->
|
||||
Em.Object.create(number: number, content: content, final: options?.final)
|
||||
|
||||
describe 'Travis.ChunkBuffer', ->
|
||||
it 'waits for parts to be in order before revealing them', ->
|
||||
|
@ -91,3 +91,23 @@ describe 'Travis.ChunkBuffer', ->
|
|||
it 'sets next to start if start is given at init', ->
|
||||
buffer = Travis.ChunkBuffer.create(content: [], start: 5)
|
||||
expect(buffer.get('next')).toEqual(5)
|
||||
|
||||
it 'runs finalize after getting final element', ->
|
||||
finalizeRuns = 0
|
||||
buffer = Travis.ChunkBuffer.extend({
|
||||
finalize: ->
|
||||
@_super.apply this, arguments
|
||||
finalizeRuns += 1
|
||||
}).create(content: [])
|
||||
|
||||
buffer.pushObject createChunk(1, "foo")
|
||||
buffer.pushObject createChunk(2, "bar")
|
||||
buffer.pushObject createChunk(3, "baz")
|
||||
|
||||
expect(finalizeRuns).toEqual(0)
|
||||
|
||||
buffer.pushObject createChunk(4, "qux", final: true)
|
||||
|
||||
expect(buffer.get('length')).toEqual(4)
|
||||
|
||||
expect(finalizeRuns).toEqual(1)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
require 'ext/jquery'
|
||||
require 'ext/ember/namespace'
|
||||
require 'app'
|
||||
|
||||
window.ENV ||= {}
|
||||
window.ENV.RAISE_ON_DEPRECATION = true
|
||||
|
@ -31,71 +32,7 @@ Storage = Em.Object.extend
|
|||
clear: ->
|
||||
@set('storage', {})
|
||||
|
||||
window.Travis = Em.Application.extend(Ember.Evented,
|
||||
authStateBinding: 'auth.state'
|
||||
signedIn: (-> @get('authState') == 'signed-in' ).property('authState')
|
||||
|
||||
setup: ->
|
||||
@store = Travis.Store.create(
|
||||
adapter: Travis.RestAdapter.create()
|
||||
)
|
||||
@store.loadMany(Travis.Sponsor, Travis.SPONSORS)
|
||||
|
||||
@slider = new Travis.Slider()
|
||||
@pusher = new Travis.Pusher(Travis.config.pusher_key)
|
||||
@tailing = new Travis.Tailing()
|
||||
|
||||
@set('auth', Travis.Auth.create(app: this, endpoint: Travis.config.api_endpoint))
|
||||
|
||||
reset: ->
|
||||
@store.destroy()
|
||||
@setup()
|
||||
|
||||
@_super.apply(this, arguments);
|
||||
|
||||
lookup: ->
|
||||
@__container__.lookup.apply this, arguments
|
||||
|
||||
storeAfterSignInPath: (path) ->
|
||||
@get('auth').storeAfterSignInPath(path)
|
||||
|
||||
autoSignIn: (path) ->
|
||||
@get('auth').autoSignIn()
|
||||
|
||||
signIn: ->
|
||||
@get('auth').signIn()
|
||||
|
||||
signOut: ->
|
||||
@get('auth').signOut()
|
||||
|
||||
receive: ->
|
||||
@store.receive.apply(@store, arguments)
|
||||
|
||||
toggleSidebar: ->
|
||||
$('body').toggleClass('maximized')
|
||||
# TODO gotta force redraws here :/
|
||||
element = $('<span></span>')
|
||||
$('#top .profile').append(element)
|
||||
Em.run.later (-> element.remove()), 10
|
||||
element = $('<span></span>')
|
||||
$('#repo').append(element)
|
||||
Em.run.later (-> element.remove()), 10
|
||||
|
||||
setLocale: (locale) ->
|
||||
return unless locale
|
||||
I18n.locale = locale
|
||||
Travis.set('locale', locale)
|
||||
|
||||
defaultLocale: 'en'
|
||||
|
||||
ready: ->
|
||||
location.href = location.href.replace('#!/', '') if location.hash.slice(0, 2) == '#!'
|
||||
I18n.fallbacks = true
|
||||
@setLocale 'locale', @get('defaultLocale')
|
||||
|
||||
currentDate: ->
|
||||
new Date()
|
||||
).create()
|
||||
window.Travis = TravisApplication.create()
|
||||
|
||||
Travis.deferReadiness()
|
||||
|
||||
|
|
|
@ -19,6 +19,9 @@ pre#log
|
|||
overflow-x: scroll
|
||||
counter-reset: line-numbering
|
||||
|
||||
.cut
|
||||
padding: 20px 15px 0 55px
|
||||
|
||||
p
|
||||
padding: 0 15px 0 55px
|
||||
margin: 0
|
||||
|
|
Loading…
Reference in New Issue
Block a user