From d549831c222910362bd1f755394681d5ae7984bb Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 15 Feb 2013 02:34:46 +0100 Subject: [PATCH 1/6] Add chunk buffer --- assets/scripts/lib/travis/chunk_buffer.coffee | 43 +++++++++++++++ .../spec/unit/chunk_buffer_spec.coffee | 52 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 assets/scripts/lib/travis/chunk_buffer.coffee create mode 100644 assets/scripts/spec/unit/chunk_buffer_spec.coffee diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee new file mode 100644 index 00000000..55379b48 --- /dev/null +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -0,0 +1,43 @@ +Travis.ChunkBuffer = Em.ArrayProxy.extend + timeout: 15000 + start: 0 + next: 0 + + init: -> + @_super.apply this, arguments + + if @get('content.length') + @get('queue.content').pushObjects @get('content').toArray() + + arrangedContent: (-> + [] + ).property('content') + + queue: (-> + Em.ArrayProxy.create(Em.SortableMixin, + content: [] + sortProperties: ['number'] + sortAscending: true + ) + ).property() + + contentArrayDidChange: (array, index, removedCount, addedCount) -> + console.log 'content array did change' + @_super.apply this, arguments + + if addedCount + queue = @get('queue.content') + queue.pushObjects array.slice(index, index + addedCount) + @check() + + check: -> + queue = @get('queue') + next = @get('next') + + arrangedContent = @get('arrangedContent') + + while queue.get('firstObject.number') == next + arrangedContent.pushObject queue.shiftObject().get('content') + next += 1 + + @set('next', next) diff --git a/assets/scripts/spec/unit/chunk_buffer_spec.coffee b/assets/scripts/spec/unit/chunk_buffer_spec.coffee new file mode 100644 index 00000000..fca3cbac --- /dev/null +++ b/assets/scripts/spec/unit/chunk_buffer_spec.coffee @@ -0,0 +1,52 @@ +createChunk = (number, content) -> + Em.Object.create(number: number, content: content) + +describe 'Travis.ChunkBuffer', -> + it 'waits for parts to be in order before revealing them', -> + content = [] + buffer = Travis.ChunkBuffer.create(content: content) + + content.pushObject createChunk(2, "baz") + content.pushObject createChunk(1, "bar") + + expect(buffer.get('length')).toEqual(0) + + content.pushObject createChunk(0, "foo") + + expect(buffer.get('length')).toEqual(3) + + expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz']) + + it 'ignores a part if it fails to be delivered within timeout', -> + expect 4 + + content = [] + buffer = Travis.ChunkBuffer.create(content: content, timeout: 10) + + content.pushObject createChunk(2, "baz") + + expect(buffer.get('length')).toEqual(0) + + content.pushObject createChunk(0, "foo") + + expect(buffer.get('length')).toEqual(1) + + stop() + setTimeout( (-> + expect(buffer.get('length')).toEqual(2) + expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz']) + ), 20) + + it 'works correctly when parts are passed as content', -> + content = [createChunk(1, 'bar')] + + buffer = Travis.ChunkBuffer.create(content: content) + + expect(buffer.get('length')).toEqual(0) + + content.pushObject createChunk(0, "foo") + + expect(buffer.get('length')).toEqual(2) + expect(buffer.toArray()).toEqual(['foo', 'bar']) + + From b4022f5f677c49cd04bdd1a2dbf8666854d0b3a5 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 18 Feb 2013 21:44:33 +0100 Subject: [PATCH 2/6] A few improvements for ChunkBuffer * insert available items at once * allow to use pushObject on buffer itself * add a test using arrayObserver to make sure that it fires only when elements are added to arrangedContent --- assets/scripts/app/models/artifact.coffee | 1 + assets/scripts/lib/travis/chunk_buffer.coffee | 18 ++++++- .../spec/unit/chunk_buffer_spec.coffee | 48 +++++++++++++++---- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/assets/scripts/app/models/artifact.coffee b/assets/scripts/app/models/artifact.coffee index 26b87921..9177cfb3 100644 --- a/assets/scripts/app/models/artifact.coffee +++ b/assets/scripts/app/models/artifact.coffee @@ -1,4 +1,5 @@ require 'travis/model' +require 'travis/chunk_buffer' @Travis.Artifact = Em.Object.extend version: 1 # used to refresh log on requeue diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee index 55379b48..83888df4 100644 --- a/assets/scripts/lib/travis/chunk_buffer.coffee +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -1,4 +1,4 @@ -Travis.ChunkBuffer = Em.ArrayProxy.extend +Travis.ChunkBuffer = Em.ArrayProxy.extend Ember.MutableEnumerable, timeout: 15000 start: 0 next: 0 @@ -6,6 +6,8 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend init: -> @_super.apply this, arguments + @set('next', @get('start')) + if @get('content.length') @get('queue.content').pushObjects @get('content').toArray() @@ -13,6 +15,15 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend [] ).property('content') + addObject: (obj) -> + @get('content').pushObject(obj) + + removeObject: (obj) -> + @get('content').removeObject(obj) + + replaceContent: (idx, amt, objects) -> + @get('content').replace(idx, amt, objects) + queue: (-> Em.ArrayProxy.create(Em.SortableMixin, content: [] @@ -35,9 +46,12 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend next = @get('next') arrangedContent = @get('arrangedContent') + toPush = [] while queue.get('firstObject.number') == next - arrangedContent.pushObject queue.shiftObject().get('content') + toPush.pushObject queue.shiftObject().get('content') next += 1 + arrangedContent.pushObjects toPush if toPush.length + @set('next', next) diff --git a/assets/scripts/spec/unit/chunk_buffer_spec.coffee b/assets/scripts/spec/unit/chunk_buffer_spec.coffee index fca3cbac..56f98017 100644 --- a/assets/scripts/spec/unit/chunk_buffer_spec.coffee +++ b/assets/scripts/spec/unit/chunk_buffer_spec.coffee @@ -3,15 +3,14 @@ createChunk = (number, content) -> describe 'Travis.ChunkBuffer', -> it 'waits for parts to be in order before revealing them', -> - content = [] - buffer = Travis.ChunkBuffer.create(content: content) + buffer = Travis.ChunkBuffer.create(content: []) - content.pushObject createChunk(2, "baz") - content.pushObject createChunk(1, "bar") + buffer.pushObject createChunk(2, "baz") + buffer.pushObject createChunk(1, "bar") expect(buffer.get('length')).toEqual(0) - content.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(0, "foo") expect(buffer.get('length')).toEqual(3) @@ -20,14 +19,13 @@ describe 'Travis.ChunkBuffer', -> it 'ignores a part if it fails to be delivered within timeout', -> expect 4 - content = [] - buffer = Travis.ChunkBuffer.create(content: content, timeout: 10) + buffer = Travis.ChunkBuffer.create(content: [], timeout: 10) - content.pushObject createChunk(2, "baz") + buffer.pushObject createChunk(2, "baz") expect(buffer.get('length')).toEqual(0) - content.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(0, "foo") expect(buffer.get('length')).toEqual(1) @@ -44,9 +42,39 @@ describe 'Travis.ChunkBuffer', -> expect(buffer.get('length')).toEqual(0) - content.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(0, "foo") expect(buffer.get('length')).toEqual(2) expect(buffer.toArray()).toEqual(['foo', 'bar']) + it 'fires array observers properly', -> + changes = [] + buffer = Travis.ChunkBuffer.create(content: []) + observer = Em.Object.extend( + init: -> + @_super.apply this, arguments + + @get('content').addArrayObserver this, + willChange: 'arrayWillChange', + didChange: 'arrayDidChange' + + arrayWillChange: (->) + arrayDidChange: (array, index, removedCount, addedCount) -> + changes.pushObject([index, addedCount]) + ).create(content: buffer) + + buffer.pushObject createChunk(1, "baz") + + expect(buffer.get('length')).toEqual(0) + expect(changes.length).toEqual(0) + + buffer.pushObject createChunk(0, "foo") + + expect(buffer.get('length')).toEqual(2) + expect(changes.length).toEqual(1) + expect(changes[0]).toEqual([0, 2]) + + it 'sets next to start if start is given at init', -> + buffer = Travis.ChunkBuffer.create(content: [], start: 5) + expect(buffer.get('next')).toEqual(5) From b289d3966be47e4c5b46d197db63ba858a8131fa Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 5 Mar 2013 23:47:38 +0100 Subject: [PATCH 3/6] Finish ChunkBuffer implementation and integrate it with Artifact --- assets/scripts/app/models/artifact.coffee | 115 ++++++++++-------- assets/scripts/app/store.coffee | 3 +- assets/scripts/app/views/job.coffee | 8 +- assets/scripts/lib/travis/chunk_buffer.coffee | 50 ++++++-- assets/scripts/spec/spec_helper.coffee | 5 - .../spec/unit/chunk_buffer_spec.coffee | 45 ++++--- 6 files changed, 138 insertions(+), 88 deletions(-) diff --git a/assets/scripts/app/models/artifact.coffee b/assets/scripts/app/models/artifact.coffee index 9177cfb3..e8cbff10 100644 --- a/assets/scripts/app/models/artifact.coffee +++ b/assets/scripts/app/models/artifact.coffee @@ -9,76 +9,50 @@ require 'travis/chunk_buffer' init: -> @_super.apply this, arguments - @addObserver 'job.id', @fetchBody - @fetchBody() + @addObserver 'job.id', @fetch + @fetch() - @set 'queue', Ember.A([]) - @set 'parts', Ember.ArrayProxy.create(content: []) + @set 'parts', Travis.ChunkBuffer.create(content: []) - @addObserver 'body', @fetchWorker - @fetchWorker() + #@addObserver 'body', @fetchWorker + #@fetchWorker() id: (-> @get('job.id') ).property('job.id') + willDestroy: -> + @get('parts').destroy() + clear: -> @set('body', '') @incrementProperty('version') + @get('parts').destroy() + @set 'parts', Travis.ChunkBuffer.create(content: []) - fetchBody: -> + fetch: -> if jobId = @get('job.id') - @removeObserver 'job.id', @fetchBody + @removeObserver 'job.id', @fetch - self = this - Travis.ajax.ajax "/jobs/#{jobId}/log.txt?cors_hax=true", 'GET', - dataType: 'text' - contentType: 'text/plain' - success: (data, textStatus, xhr) -> - if xhr.status == 204 - logUrl = xhr.getResponseHeader('X-Log-Location') + handlers = + json: (json) => @loadParts(json['log']['parts']) + text: (text) => @loadText(text) - # For some reason not all browsers can fetch this header - unless logUrl - logUrl = self.s3Url("/jobs/#{jobId}/log.txt") + Travis.Artifact.Request.create(id: id, handlers: handlers).run() if id = @get('job.id') - $.ajax - url: logUrl - type: 'GET' - success: (data) -> - self.fetchedBody(data) - else - self.fetchedBody(data) + append: (part) -> + @get('parts').pushObject(part) - s3Url: (path) -> - endpoint = Travis.config.api_endpoint - staging = if endpoint.match(/-staging/) then '-staging' else '' - host = Travis.config.api_endpoint.replace(/^https?:\/\//, '').split('.').slice(-2).join('.') - "https://s3.amazonaws.com/archive#{staging}.#{host}#{path}" + loadParts: (parts) -> + console.log 'artifact model: load parts' + @append(part) for part in parts + @set('isLoaded', true) - - fetchedBody: (body) -> - @set 'body', body - @set 'isLoaded', true - - append: (body) -> - if @get('isInitialized') - @get('parts').pushObject body - @set('body', @get('body') + body) - else - @get('queue').pushObject(body) - - recordDidLoad: (-> - if @get('isLoaded') - if (body = @get 'body') && @get('parts.length') == 0 - @get('parts').pushObject body - - @set 'isInitialized', true - - queue = @get('queue') - if queue.get('length') > 0 - @append queue.toArray().join('') - ).observes('isLoaded') + loadText: (text) -> + console.log 'artifact model: load text' + number = -1 + @append(number: 1, content: text) + @set('isLoaded', true) fetchWorker: -> if !@get('workerName') && (body = @get('body')) @@ -88,3 +62,38 @@ require 'travis/chunk_buffer' worker = worker.trim().split(':')[0] @set('workerName', worker) @removeObserver 'body', @fetchWorker + +Travis.Artifact.Request = Em.Object.extend + HEADERS: + accept: 'application/vnd.travis-ci.2+json; chunked=true; version=2, text/plain; version=2' + + run: -> + Travis.ajax.ajax "/jobs/#{@id}/log?cors_hax=true", 'GET', + dataType: 'text' + headers: @HEADERS + success: (body, status, xhr) => @handle(body, status, xhr) + + handle: (body, status, xhr) -> + if xhr.status == 204 + $.ajax(url: @redirectTo(xhr), type: 'GET', success: @handlers.text) + else if @isJson(xhr, body) + @handlers.json(JSON.parse(body)) + else + @handlers.text(body) + + redirectTo: (xhr) -> + # Firefox can't see the Location header on the xhr response due to the wrong + # status code 204. Should be some redirect code but that doesn't work with CORS. + xhr.getResponseHeader('Location') || @s3Url() + + s3Url: -> + endpoint = Travis.config.api_endpoint + staging = if endpoint.match(/-staging/) then '-staging' else '' + host = endpoint.replace(/^https?:\/\//, '').split('.').slice(-2).join('.') + "https://s3.amazonaws.com/archive#{staging}.#{host}#{path}/jobs/#{@id}/log.txt" + + isJson: (xhr, body) -> + # Firefox can't see the Content-Type header on the xhr response due to the wrong + # status code 204. Should be some redirect code but that doesn't work with CORS. + type = xhr.getResponseHeader('Content-Type') || '' + type.indexOf('json') > -1 || body.slice(0, 8) == '{"log":{' diff --git a/assets/scripts/app/store.coffee b/assets/scripts/app/store.coffee index 2ad698cb..509c2abb 100644 --- a/assets/scripts/app/store.coffee +++ b/assets/scripts/app/store.coffee @@ -97,7 +97,8 @@ Travis.Store = DS.Store.extend if event == 'job:log' if job = @find(Travis.Job, data['job']['id']) - job.appendLog(data['job']['_log']) + console.log 'job:log', data + job.appendLog(number: data['job']['number'], content: data['job']['_log']) else if data[type.singularName()] @_loadOne(this, type, data) else if data[type.pluralName()] diff --git a/assets/scripts/app/views/job.coffee b/assets/scripts/app/views/job.coffee index 086346cc..974cb4af 100644 --- a/assets/scripts/app/views/job.coffee +++ b/assets/scripts/app/views/job.coffee @@ -104,7 +104,7 @@ job = @get('job') job.subscribe() if job && !job.get('isFinished') null - ).property('job', 'job.state') + ).property('job', 'job.isFinished') logUrl: (-> repo = @get('job.repo') @@ -133,7 +133,7 @@ @_super.apply this, arguments Ember.run.next this, -> - if @get 'log.isInitialized' + if @get 'log' @logDidChange() willDestroy: -> @@ -148,9 +148,9 @@ ).observes('log.version') logDidChange: (-> - if @get('log.isInitialized') && @state == 'inDOM' + if @get('log') && @state == 'inDOM' @attachLogObservers() - ).observes('log', 'log.isInitialized') + ).observes('log') attachLogObservers: -> return if @get('logPartsObserversAttached') == Ember.guidFor(@get('log')) diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee index 83888df4..33412138 100644 --- a/assets/scripts/lib/travis/chunk_buffer.coffee +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -1,13 +1,20 @@ -Travis.ChunkBuffer = Em.ArrayProxy.extend Ember.MutableEnumerable, - timeout: 15000 - start: 0 - next: 0 +get = Ember.get + +Travis.ChunkBuffer = Em.ArrayProxy.extend + timeout: 5000 + checkTimeoutFrequency: 1000 + start: 1 + next: 1 init: -> @_super.apply this, arguments + @lastInsert = 0 + @set('next', @get('start')) + @checkTimeout() + if @get('content.length') @get('queue.content').pushObjects @get('content').toArray() @@ -33,13 +40,13 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend Ember.MutableEnumerable, ).property() contentArrayDidChange: (array, index, removedCount, addedCount) -> - console.log 'content array did change' @_super.apply this, arguments if addedCount queue = @get('queue.content') queue.pushObjects array.slice(index, index + addedCount) @check() + @inserted() check: -> queue = @get('queue') @@ -48,10 +55,35 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend Ember.MutableEnumerable, arrangedContent = @get('arrangedContent') toPush = [] - while queue.get('firstObject.number') == next - toPush.pushObject queue.shiftObject().get('content') - next += 1 + while queue.get('firstObject.number') <= next + element = queue.shiftObject() + if get(element, 'number') == next + toPush.pushObject get(element, 'content') + next += 1 - arrangedContent.pushObjects toPush if toPush.length + if toPush.length + arrangedContent.pushObjects toPush @set('next', next) + + inserted: -> + now = @now() + @lastInsert = now + + checkTimeout: -> + now = @now() + if now - @lastInsert > @get('timeout') + @giveUpOnMissingParts() + @set 'runLaterId', Ember.run.later(this, @checkTimeout, @get('checkTimeoutFrequency')) + + willDestroy: -> + Ember.run.cancel @get('runLaterId') + @_super.apply this, arguments + + now: -> + (new Date()).getTime() + + giveUpOnMissingParts: -> + if number = @get('queue.firstObject.number') + @set('next', number) + @check() diff --git a/assets/scripts/spec/spec_helper.coffee b/assets/scripts/spec/spec_helper.coffee index e49fa538..5fc2dd46 100644 --- a/assets/scripts/spec/spec_helper.coffee +++ b/assets/scripts/spec/spec_helper.coffee @@ -26,11 +26,6 @@ minispade.require 'app' runs -> foo = 'bar' -_Date = Date -@Date = (date) -> - new _Date(date || '2012-07-02T00:03:00Z') -@Date.UTC = _Date.UTC - # hacks for missing features in webkit unless Function::bind Function::bind = (oThis) -> diff --git a/assets/scripts/spec/unit/chunk_buffer_spec.coffee b/assets/scripts/spec/unit/chunk_buffer_spec.coffee index 56f98017..399dcbb3 100644 --- a/assets/scripts/spec/unit/chunk_buffer_spec.coffee +++ b/assets/scripts/spec/unit/chunk_buffer_spec.coffee @@ -5,48 +5,61 @@ describe 'Travis.ChunkBuffer', -> it 'waits for parts to be in order before revealing them', -> buffer = Travis.ChunkBuffer.create(content: []) - buffer.pushObject createChunk(2, "baz") - buffer.pushObject createChunk(1, "bar") + buffer.pushObject createChunk(3, "baz") + buffer.pushObject createChunk(2, "bar") expect(buffer.get('length')).toEqual(0) - buffer.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(1, "foo") expect(buffer.get('length')).toEqual(3) expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz']) it 'ignores a part if it fails to be delivered within timeout', -> - expect 4 + buffer = Travis.ChunkBuffer.create(content: [], timeout: 20, checkTimeoutFrequency: 5) - buffer = Travis.ChunkBuffer.create(content: [], timeout: 10) - - buffer.pushObject createChunk(2, "baz") + buffer.pushObject createChunk(3, "baz") expect(buffer.get('length')).toEqual(0) - buffer.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(1, "foo") expect(buffer.get('length')).toEqual(1) - stop() - setTimeout( (-> + waits 40 + runs -> expect(buffer.get('length')).toEqual(2) - expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz']) - ), 20) + expect(buffer.toArray()).toEqual(['foo', 'baz']) + + buffer.destroy() it 'works correctly when parts are passed as content', -> - content = [createChunk(1, 'bar')] + content = [createChunk(2, 'bar')] buffer = Travis.ChunkBuffer.create(content: content) expect(buffer.get('length')).toEqual(0) - buffer.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(1, "foo") expect(buffer.get('length')).toEqual(2) expect(buffer.toArray()).toEqual(['foo', 'bar']) + it 'works correctly when parts duplicated', -> + buffer = Travis.ChunkBuffer.create(content: []) + + buffer.pushObject createChunk(1, "foo") + buffer.pushObject createChunk(2, "bar") + buffer.pushObject createChunk(3, "baz") + + buffer.pushObject createChunk(2, "bar") + buffer.pushObject createChunk(3, "baz") + buffer.pushObject createChunk(4, "qux") + + expect(buffer.get('length')).toEqual(4) + expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz', 'qux']) + it 'fires array observers properly', -> changes = [] buffer = Travis.ChunkBuffer.create(content: []) @@ -64,12 +77,12 @@ describe 'Travis.ChunkBuffer', -> changes.pushObject([index, addedCount]) ).create(content: buffer) - buffer.pushObject createChunk(1, "baz") + buffer.pushObject createChunk(2, "baz") expect(buffer.get('length')).toEqual(0) expect(changes.length).toEqual(0) - buffer.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(1, "foo") expect(buffer.get('length')).toEqual(2) expect(changes.length).toEqual(1) From 05926e00100e359f97f12e660963f1a5eaba4d7e Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 5 Mar 2013 23:54:54 +0100 Subject: [PATCH 4/6] Fix fetching worker name --- assets/scripts/app/models/artifact.coffee | 11 ++++------- assets/scripts/app/store.coffee | 1 - 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/assets/scripts/app/models/artifact.coffee b/assets/scripts/app/models/artifact.coffee index e8cbff10..fb2202fd 100644 --- a/assets/scripts/app/models/artifact.coffee +++ b/assets/scripts/app/models/artifact.coffee @@ -14,9 +14,6 @@ require 'travis/chunk_buffer' @set 'parts', Travis.ChunkBuffer.create(content: []) - #@addObserver 'body', @fetchWorker - #@fetchWorker() - id: (-> @get('job.id') ).property('job.id') @@ -41,6 +38,7 @@ require 'travis/chunk_buffer' Travis.Artifact.Request.create(id: id, handlers: handlers).run() if id = @get('job.id') append: (part) -> + @fetchWorker Ember.get(part, 'content') @get('parts').pushObject(part) loadParts: (parts) -> @@ -54,14 +52,13 @@ require 'travis/chunk_buffer' @append(number: 1, content: text) @set('isLoaded', true) - fetchWorker: -> - if !@get('workerName') && (body = @get('body')) - line = body.split("\n")[0] + fetchWorker: (string) -> + if !@get('workerName') + line = string.split("\n")[0] if line && (match = line.match /Using worker: (.*)/) if worker = match[1] worker = worker.trim().split(':')[0] @set('workerName', worker) - @removeObserver 'body', @fetchWorker Travis.Artifact.Request = Em.Object.extend HEADERS: diff --git a/assets/scripts/app/store.coffee b/assets/scripts/app/store.coffee index 509c2abb..bf853986 100644 --- a/assets/scripts/app/store.coffee +++ b/assets/scripts/app/store.coffee @@ -97,7 +97,6 @@ Travis.Store = DS.Store.extend if event == 'job:log' if job = @find(Travis.Job, data['job']['id']) - console.log 'job:log', data job.appendLog(number: data['job']['number'], content: data['job']['_log']) else if data[type.singularName()] @_loadOne(this, type, data) From ade203df7a72128ea3b176d70be7cadddefb66bf Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 6 Mar 2013 00:19:53 +0100 Subject: [PATCH 5/6] Add some debug info --- assets/scripts/lib/travis/chunk_buffer.coffee | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee index 33412138..0ef4b488 100644 --- a/assets/scripts/lib/travis/chunk_buffer.coffee +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -43,8 +43,10 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend @_super.apply this, arguments if addedCount - queue = @get('queue.content') - queue.pushObjects array.slice(index, index + addedCount) + queue = @get('queue.content') + addedObjects = array.slice(index, index + addedCount) + console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') ) + queue.pushObjects addedObjects @check() @inserted() @@ -85,5 +87,6 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend giveUpOnMissingParts: -> if number = @get('queue.firstObject.number') + console.log 'Giving up on missing parts in the buffer, switching to:', number @set('next', number) @check() From f46e6f96a099fa021935bdbc3ddb394c15ae452d Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 6 Mar 2013 00:40:59 +0100 Subject: [PATCH 6/6] More debug output --- assets/scripts/lib/travis/chunk_buffer.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee index 0ef4b488..b5cdf326 100644 --- a/assets/scripts/lib/travis/chunk_buffer.coffee +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -45,7 +45,7 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend if addedCount queue = @get('queue.content') addedObjects = array.slice(index, index + addedCount) - console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') ) + console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') )+'', 'current', @get('next') queue.pushObjects addedObjects @check() @inserted()