
After update to glimmer log started to be rendered incorrectly, with log lines being inserted in the wrong places. I'm not sure what's the underlying problem, but rewriting to components seems to fix the issue. Since views are deprecated anyway I'm not going to investigate the problem deeper.
148 lines
4.2 KiB
CoffeeScript
148 lines
4.2 KiB
CoffeeScript
`import Ember from 'ember'`
|
|
`import LinesSelector from 'travis/utils/lines-selector'`
|
|
`import LogFolder from 'travis/utils/log-folder'`
|
|
`import config from 'travis/config/environment'`
|
|
`import { plainTextLog as plainTextLogUrl } from 'travis/utils/urls'`
|
|
|
|
Log.DEBUG = false
|
|
Log.LIMIT = 10000
|
|
|
|
Log.Scroll = (options) ->
|
|
options ||= {}
|
|
@beforeScroll = options.beforeScroll
|
|
this
|
|
Log.Scroll.prototype = $.extend new Log.Listener,
|
|
insert: (log, data, pos) ->
|
|
@tryScroll() if @numbers
|
|
true
|
|
|
|
tryScroll: ->
|
|
if element = $("#log p:visible.highlight:first")
|
|
if @beforeScroll
|
|
@beforeScroll()
|
|
$('#main').scrollTop(0)
|
|
$('html, body').scrollTop(element.offset()?.top - (window.innerHeight / 3)) # weird, html works in chrome, body in firefox
|
|
|
|
Log.Limit = (max_lines, limitedLogCallback) ->
|
|
@max_lines = max_lines || 1000
|
|
@limitedLogCallback = limitedLogCallback || (->)
|
|
this
|
|
|
|
Log.Limit.prototype = Log.extend new Log.Listener,
|
|
count: 0,
|
|
insert: (log, node, pos) ->
|
|
if node.type == 'paragraph' && !node.hidden
|
|
@count += 1
|
|
if @limited
|
|
@limitedLogCallback()
|
|
return @count
|
|
|
|
Object.defineProperty Log.Limit.prototype, 'limited',
|
|
get: ->
|
|
@count >= @max_lines
|
|
|
|
LogContentComponent = Ember.Component.extend
|
|
popup: Ember.inject.service()
|
|
auth: Ember.inject.service()
|
|
|
|
currentUserBinding: 'auth.currentUser'
|
|
|
|
didInsertElement: ->
|
|
console.log 'log view: did insert' if Log.DEBUG
|
|
@_super.apply this, arguments
|
|
@createEngine()
|
|
|
|
willDestroyElement: ->
|
|
console.log 'log view: will destroy' if Log.DEBUG
|
|
@teardownLog()
|
|
|
|
teardownLog: ->
|
|
if log = @get('log')
|
|
parts = log.get('parts')
|
|
parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
|
parts.destroy()
|
|
log.notifyPropertyChange('parts')
|
|
@lineSelector?.willDestroy()
|
|
# log should do it on destroy
|
|
this.$('#log').empty()
|
|
|
|
createEngine: ->
|
|
if log = @get('log')
|
|
console.log 'log view: create engine' if Log.DEBUG
|
|
log.onClear =>
|
|
@teardownLog()
|
|
@createEngine()
|
|
|
|
@scroll = new Log.Scroll beforeScroll: =>
|
|
@unfoldHighlight()
|
|
@limit = new Log.Limit Log.LIMIT, =>
|
|
@set('limited', true)
|
|
@engine = Log.create(listeners: [@scroll, @limit])
|
|
@engine.limit = @limit
|
|
@logFolder = new LogFolder(@$('#log'))
|
|
@lineSelector = new LinesSelector(@$('#log'), @scroll, @logFolder)
|
|
@observeParts()
|
|
|
|
didUpdateAttrs: ->
|
|
@teardownLog()
|
|
@createEngine()
|
|
|
|
unfoldHighlight: ->
|
|
@lineSelector.unfoldLines()
|
|
|
|
observeParts: ->
|
|
if log = @get('log')
|
|
parts = log.get('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 @engine?.limit?.limited
|
|
@engine.set(part.number, part.content)
|
|
|
|
plainTextLogUrl: (->
|
|
if id = @get('log.job.id')
|
|
url = plainTextLogUrl(id)
|
|
if config.pro
|
|
url += "&access_token=#{@get('job.log.token')}"
|
|
url
|
|
).property('job.log.id', 'job.log.token')
|
|
|
|
hasPermission: (->
|
|
if permissions = @get('currentUser.permissions')
|
|
permissions.contains parseInt(@get('job.repo.id'))
|
|
).property('currentUser.permissions.length', 'job.repo.id')
|
|
|
|
canRemoveLog: (->
|
|
if job = @get('job')
|
|
job.get('canRemoveLog') && @get('hasPermission')
|
|
).property('job.canRemoveLog', 'hasPermission')
|
|
|
|
showToTop: (->
|
|
@get('log.hasContent') && @get('job.canRemoveLog')
|
|
).property('log.hasContent', 'job.canRemoveLog')
|
|
showTailing: Ember.computed.alias('showToTop')
|
|
|
|
actions:
|
|
toTop: () ->
|
|
Travis.tailing.stop()
|
|
$(window).scrollTop(0)
|
|
|
|
toggleTailing: ->
|
|
Travis.tailing.toggle()
|
|
@engine.autoCloseFold = !Travis.tailing.isActive()
|
|
event.preventDefault()
|
|
|
|
removeLogPopup: ->
|
|
if @get('canRemoveLog')
|
|
@get('popup').open('remove-log-popup')
|
|
return false
|
|
|
|
noop: -> # TODO required?
|
|
|
|
`export default LogContentComponent`
|