travis-web/assets/scripts/app/views/log.coffee
Piotr Sarnacki 972fb6fb43 Always subscribe to log updates
When the job is restart, we will not get any updates unless we're
subscribed to job updates - that's why we need to subscribe even if the
job is already finished.

The other option to fix this would be to subscribe and unsubscribe also
based on the status, but since subscribing to finished jobs does not
cost us anything, I prefer the simpler solution.
2013-10-07 17:15:59 +02:00

138 lines
3.9 KiB
CoffeeScript

require 'log'
Log.DEBUG = false
Log.LIMIT = 10000
Travis.reopen
LogView: Travis.View.extend
templateName: 'jobs/log'
logBinding: 'job.log'
contextBinding: 'job'
didInsertElement: ->
job = @get('job')
if job
job.get('log').fetch()
job.subscribe()
willDestroyElement: ->
job = @get('job')
job.unsubscribe() if job
PreView: Em.View.extend
templateName: 'jobs/pre'
didInsertElement: ->
console.log 'log view: did insert' if Log.DEBUG
@_super.apply this, arguments
@createEngine()
@lineNumberDidChange()
willDestroyElement: ->
console.log 'log view: will destroy' if Log.DEBUG
parts = @get('log.parts')
parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
versionDidChange: (->
@rerender() if @get('state') == 'inDOM'
).observes('log.version')
logDidChange: (->
console.log 'log view: log did change: rerender' if Log.DEBUG
@rerender() if @get('state') == 'inDOM'
).observes('log')
createEngine: ->
console.log 'log view: create engine' if Log.DEBUG
@scroll = new Log.Scroll
@engine = Log.create(limit: Log.LIMIT, listeners: [@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' if Log.DEBUG
for part, i in parts.slice(start, start + added)
# console.log "limit in log view: #{@get('limited')}"
break if @get('limited')
@engine.set(part.number, part.content)
@propertyDidChange('limited')
lineNumberDidChange: (->
@scroll.set(number) if !@get('isDestroyed') && number = @get('controller.lineNumber')
).observes('controller.lineNumber')
limited: (->
@engine?.limit?.limited
).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', ->
$(@).attr('href', '#L' + ($("#log p:visible").index(@parentNode) + 1))
click: (event) ->
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) ->
path = "#{window.location.pathname}#L#{number}"
window.history.pushState({ path: path }, null, path);
@set('controller.lineNumber', number)
toTop: () ->
$(window).scrollTop(0)
noop: -> # TODO required?
Log.Scroll = ->
Log.Scroll.prototype = $.extend new Log.Listener,
set: (number) ->
return unless number
@number = number
@tryScroll()
insert: (log, data, pos) ->
@tryScroll() if @number
true
tryScroll: ->
if element = $("#log p:visible")[@number - 1]
$('#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.Logger = ->
# Log.Logger.prototype = $.extend new Log.Listener,
# receive: (log, num, string) ->
# @log("rcv #{num} #{JSON.stringify(string)}")
# true
# insert: (log, element, pos) ->
# @log("ins #{element.id}, #{if pos.before then 'before' else 'after'}: #{pos.before || pos.after || '?'}, #{JSON.stringify(element)}")
# remove: (log, element) ->
# @log("rem #{element.id}")
# log: (line) ->
# console.log(line)