136 lines
3.8 KiB
CoffeeScript
136 lines
3.8 KiB
CoffeeScript
require 'log'
|
|
|
|
Travis.reopen
|
|
LogView: Travis.View.extend
|
|
templateName: 'jobs/log'
|
|
logBinding: 'job.log'
|
|
contextBinding: 'job'
|
|
|
|
didInsertElement: ->
|
|
job = @get('job')
|
|
job.subscribe() if job && !job.get('isFinished')
|
|
|
|
toTop: () ->
|
|
$(window).scrollTop(0)
|
|
|
|
PreView: Em.View.extend
|
|
templateName: 'jobs/pre'
|
|
|
|
didInsertElement: ->
|
|
console.log 'log view: did insert'
|
|
@_super.apply this, arguments
|
|
@createEngine()
|
|
@lineNumberDidChange()
|
|
|
|
willDestroyElement: ->
|
|
console.log 'log view: will destroy'
|
|
parts = @get('log.parts')
|
|
parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
|
|
|
versionDidChange: (->
|
|
@rerender() if @get('inDOM')
|
|
).observes('log.version')
|
|
|
|
logDidChange: (->
|
|
console.log 'log view: log did change: rerender'
|
|
@rerender() if @get('inDOM')
|
|
).observes('log')
|
|
|
|
createEngine: ->
|
|
console.log 'log view: create engine'
|
|
@limit = new Log.Limit
|
|
@scroll = new Log.Scroll
|
|
@engine = Log.create(listeners: [new Log.FragmentRenderer, new Log.Logger, new Log.Folds, @scroll])
|
|
@observeParts()
|
|
@numberLineOnHover()
|
|
|
|
observeParts: ->
|
|
parts = @get('log.parts')
|
|
parts.addArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
|
parts = parts.slice(0)
|
|
@partsDidChange(parts, 0, null, parts.length)
|
|
|
|
partsDidChange: (parts, start, _, added) ->
|
|
console.log 'log view: parts did change'
|
|
unless @get('isLimited')
|
|
@engine.set(part.number, part.content) for part, i in parts.slice(start, start + added)
|
|
@propertyDidChange('isLimited')
|
|
|
|
lineNumberDidChange: (->
|
|
@scroll.set(number) if !@get('isDestroyed') && number = @get('controller.lineNumber')
|
|
).observes('controller.lineNumber')
|
|
|
|
isLimited: (->
|
|
@limit && @limit.isLimited()
|
|
).property()
|
|
|
|
plainTextLogUrl: (->
|
|
Travis.Urls.plainTextLog(id) if id = @get('log.job.id')
|
|
).property('job.log.id')
|
|
|
|
toggleTailing: ->
|
|
Travis.tailing.toggle()
|
|
event.preventDefault()
|
|
|
|
numberLineOnHover: ->
|
|
$('#log').on 'mouseenter', 'a', ->
|
|
$(this).attr('href', '#L' + ($(this.parentNode).prevAll('p').length + 1))
|
|
|
|
click: ->
|
|
if (href = $(event.target).attr('href')) && matches = href?.match(/#L(\d+)$/)
|
|
@lineNumberClicked(matches[1])
|
|
event.stopPropagation()
|
|
false
|
|
else
|
|
target = $(event.target)
|
|
target.closest('.fold').toggleClass('open')
|
|
|
|
lineNumberClicked: (number) ->
|
|
window.history.pushState(null, null, "#{window.location.pathname}#L#{number}");
|
|
@set('controller.lineNumber', number)
|
|
|
|
noop: -> # TODO required?
|
|
|
|
Log.Scroll = ->
|
|
Log.Scroll.prototype = $.extend new Log.Listener,
|
|
set: (number) ->
|
|
return unless number
|
|
@number = number
|
|
@tryScroll()
|
|
|
|
insert: (log, after, data) ->
|
|
@tryScroll() if @number
|
|
|
|
tryScroll: ->
|
|
if (element = $("#log p:nth-child(#{@number})")) && element.length
|
|
$('#main').scrollTop(0)
|
|
$('html, body').scrollTop(element.offset()?.top) # weird, html works in chrome, body in firefox
|
|
@highlight(element)
|
|
@number = undefined
|
|
|
|
highlight: (element) ->
|
|
$('#log p.highlight').removeClass('highlight')
|
|
$(element).addClass('highlight')
|
|
|
|
Log.Limit = ->
|
|
Log.Limit.prototype = $.extend new Log.Listener,
|
|
MAX_LINES: 5000
|
|
count: 0
|
|
|
|
insert: (log, after, lines) ->
|
|
@count += lines.length
|
|
lines.length = @MAX_LINES if lines.length > @MAX_LINES
|
|
|
|
isLimited: ->
|
|
@count > @MAX_LINES
|
|
false
|
|
|
|
Log.Logger = ->
|
|
Log.Logger.prototype = $.extend new Log.Listener,
|
|
# receive: (log, number) ->
|
|
# console.log 'log engine: receive', arguments
|
|
remove: (log, ids) ->
|
|
console.log 'log engine: remove', ids
|
|
insert: (log, after, nodes) ->
|
|
console.log "log engine: insert", after, nodes
|