diff --git a/assets/scripts/app/controllers/repos.coffee b/assets/scripts/app/controllers/repos.coffee index 992a2f58..2577c86a 100644 --- a/assets/scripts/app/controllers/repos.coffee +++ b/assets/scripts/app/controllers/repos.coffee @@ -26,7 +26,7 @@ Travis.ReposController = Ember.ArrayController.extend @set('content', content) viewOwned: -> - @set('content', Travis.Repo.ownedBy(Travis.app.get('currentUser.login'))) + @set('content', Travis.Repo.accessibleBy(Travis.app.get('currentUser.login'))) viewSearch: (params) -> @set('content', Travis.Repo.search(params.search)) diff --git a/assets/scripts/app/controllers/sidebar.coffee b/assets/scripts/app/controllers/sidebar.coffee index 83e3dfac..c8a9f644 100644 --- a/assets/scripts/app/controllers/sidebar.coffee +++ b/assets/scripts/app/controllers/sidebar.coffee @@ -15,31 +15,12 @@ Travis.reopen groups = {} for worker in content.toArray() host = worker.get('host') - groups[host] = Em.ArrayProxy.create(content: []) unless groups[host] - groups[host].pushObject(worker) - - prepareForSort = (str) -> - match = str.match /(.*?)-(\d+)/ - name = match[1] - id = match[2].toString() - if id.length < 2 - id = "00#{id}" - else if id.length < 3 - id = "0#{id}" - - "#{name}-#{id}" - - for own host, workers of groups - groups[host] = workers.toArray().sort (a, b) -> - a = prepareForSort a.get('name') - b = prepareForSort b.get('name') - - if a < b - -1 - else if b < a - 1 - else - 0 + unless groups[host] + groups[host] = Em.ArrayProxy.create(Em.SortableMixin, + content: [], + sortProperties: ['nameForSort'] + ) + groups[host].addObject(worker) $.values(groups) ).property('length') diff --git a/assets/scripts/app/helpers/handlebars.coffee b/assets/scripts/app/helpers/handlebars.coffee index 63471d9d..be5468b5 100644 --- a/assets/scripts/app/helpers/handlebars.coffee +++ b/assets/scripts/app/helpers/handlebars.coffee @@ -31,5 +31,8 @@ Ember.registerBoundHelper 'formatConfig', (config, options) -> safe Travis.Helpers.formatConfig(config) Ember.registerBoundHelper 'formatLog', (log, options) -> - Travis.Helpers.formatLog(log) || '' + parentView = @get 'parentView' + repo = parentView.get(options.repo) + item = parentView.get(options.item) + Travis.Helpers.formatLog(log, repo, item) || '' diff --git a/assets/scripts/app/helpers/helpers.coffee b/assets/scripts/app/helpers/helpers.coffee index eb6ad5cf..b533a306 100644 --- a/assets/scripts/app/helpers/helpers.coffee +++ b/assets/scripts/app/helpers/helpers.coffee @@ -31,8 +31,15 @@ require 'config/emoij' message = message.split(/\n/)[0] if options.short @_emojize(@_escape(message)).replace /\n/g, '
' - formatLog: (log) -> - Travis.Log.filter(log) + formatLog: (log, repo, item) -> + event = if item.constructor == Travis.Build + 'showBuild' + else + 'showJob' + + url = Travis.app.get('router').urlForEvent(event, repo, item) + + Travis.Log.filter(log, url) pathFrom: (url) -> (url || '').split('/').pop() diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index d680fabb..ca931d3e 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -2,7 +2,7 @@ require 'travis/model' @Travis.Build = Travis.Model.extend Travis.DurationCalculations, eventType: DS.attr('string') - repoId: DS.attr('number') + repoId: DS.attr('number', key: 'repository_id') commitId: DS.attr('number') state: DS.attr('string') @@ -14,7 +14,7 @@ require 'travis/model' startedAt: DS.attr('string', key: 'started_at') finishedAt: DS.attr('string', key: 'finished_at') - repo: DS.belongsTo('Travis.Repo') + repo: DS.belongsTo('Travis.Repo', key: 'repository_id') commit: DS.belongsTo('Travis.Commit') jobs: DS.hasMany('Travis.Job', key: 'job_ids') diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index 28e6fe97..033e3aa6 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -79,6 +79,9 @@ require 'travis/model' ownedBy: (login) -> @find(owner_name: login, orderBy: 'name') + accessibleBy: (login) -> + @find(member: login, orderBy: 'name') + search: (query) -> @find(search: query, orderBy: 'name') diff --git a/assets/scripts/app/models/worker.coffee b/assets/scripts/app/models/worker.coffee index 2beb1e6b..b0039c26 100644 --- a/assets/scripts/app/models/worker.coffee +++ b/assets/scripts/app/models/worker.coffee @@ -29,3 +29,17 @@ require 'travis/model' job: (-> Travis.Job.find @get('job_id') ).property('job_id') + + nameForSort: (-> + if name = @get('name') + match = name.match /(.*?)-(\d+)/ + if match + name = match[1] + id = match[2].toString() + if id.length < 2 + id = "00#{id}" + else if id.length < 3 + id = "0#{id}" + + "#{name}-#{id}" + ).property('name') diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index a626abd9..0339ca2f 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -7,6 +7,9 @@ defaultRoute = Ember.Route.extend lineNumberRoute = Ember.Route.extend route: '#L:number' index: 1 + connectOutlets: (router) -> + router.saveLineNumberHash() + routeMatcher: Ember.computed(-> if route = @get 'route' Ember._RouteMatcher.create @@ -127,6 +130,12 @@ Travis.Router = Ember.Router.extend showAccount: Ember.Route.transitionTo('root.profile.account') showUserProfile: Ember.Route.transitionTo('root.profile.account.profile') + saveLineNumberHash: (path) -> + Ember.run.next this, -> + path = path || @get('location').getURL() + if match = path.match(/#L\d+$/) + @set 'repoController.lineNumberHash', match[0] + reload: -> url = @get('location').getURL() @transitionTo 'loading' @@ -143,8 +152,7 @@ Travis.Router = Ember.Router.extend loading: Ember.Route.extend routePath: (router, path) -> - if match = path.match(/#.*$/) - router.set 'lineNumberHash', match[0] + router.saveLineNumberHash(path) sessionStorage.setItem('travis.path', path) if router.needsAuth(path) @@ -348,16 +356,20 @@ Travis.Router = Ember.Router.extend # record. # TODO: find out why it happens build = Travis.Build.find params.build_id - deferred = $.Deferred() - observer = -> - if build.get 'id' - build.removeObserver 'id', observer - deferred.resolve build + if build.get 'id' + build + else + deferred = $.Deferred() - build.addObserver 'id', observer + observer = -> + if build.get 'id' + build.removeObserver 'id', observer + deferred.resolve build - deferred.promise() + build.addObserver 'id', observer + + deferred.promise() # TODO: this is not dry, but for some weird # reason Mixins don't play nice with Ember.Route @@ -394,14 +406,18 @@ Travis.Router = Ember.Router.extend deserialize: (router, params) -> job = Travis.Job.find params.job_id - deferred = $.Deferred() - observer = -> - if job.get 'id' - job.removeObserver 'id', observer - deferred.resolve job - job.addObserver 'id', observer - deferred.promise() + if job.get 'id' + job + else + deferred = $.Deferred() + + observer = -> + if job.get 'id' + job.removeObserver 'id', observer + deferred.resolve job + job.addObserver 'id', observer + deferred.promise() initialState: 'default' default: defaultRoute diff --git a/assets/scripts/app/templates/builds/list.hbs b/assets/scripts/app/templates/builds/list.hbs index e9f46669..704a3137 100644 --- a/assets/scripts/app/templates/builds/list.hbs +++ b/assets/scripts/app/templates/builds/list.hbs @@ -16,7 +16,7 @@ {{#if id}} - + {{number}} {{/if}} diff --git a/assets/scripts/app/templates/builds/show.hbs b/assets/scripts/app/templates/builds/show.hbs index bfc3a187..a206d8bc 100644 --- a/assets/scripts/app/templates/builds/show.hbs +++ b/assets/scripts/app/templates/builds/show.hbs @@ -8,7 +8,7 @@
{{#if build.id}} - {{build.number}} + {{build.number}} {{/if}}
{{t builds.finished_at}}
diff --git a/assets/scripts/app/templates/jobs/log.hbs b/assets/scripts/app/templates/jobs/log.hbs index 88df22ef..80652414 100644 --- a/assets/scripts/app/templates/jobs/log.hbs +++ b/assets/scripts/app/templates/jobs/log.hbs @@ -4,7 +4,7 @@

     
     
-  {{{formatLog log.body}}}
+ {{{formatLog log.body repo="repository" item="parentView.currentItem"}}} {{#if sponsor.name}}
  • {{#if view.build.id}} - + {{t repositories.tabs.build}} #{{view.build.number}} {{/if}} @@ -47,7 +47,7 @@
  • {{#if view.job.id}} - + {{t repositories.tabs.job}} #{{view.job.number}} {{/if}} diff --git a/assets/scripts/app/views/build.coffee b/assets/scripts/app/views/build.coffee index 3682e186..688bd4de 100644 --- a/assets/scripts/app/views/build.coffee +++ b/assets/scripts/app/views/build.coffee @@ -52,6 +52,8 @@ buildBinding: 'controller.build' commitBinding: 'build.commit' + currentItemBinding: 'build' + loading: (-> !@get('build.isLoaded') ).property('build.isLoaded') diff --git a/assets/scripts/app/views/job.coffee b/assets/scripts/app/views/job.coffee index 0f75b20c..f13bfb19 100644 --- a/assets/scripts/app/views/job.coffee +++ b/assets/scripts/app/views/job.coffee @@ -24,6 +24,8 @@ jobBinding: 'controller.job' commitBinding: 'job.commit' + currentItemBinding: 'job' + color: (-> Travis.Helpers.colorForResult(@get('job.result')) ).property('job.result') @@ -50,12 +52,14 @@ scrollTo: (hash) -> $('body').scrollTop $(hash).offset().top - Travis.app.router.set 'lineNumberHash', null + @set 'controller.lineNumberHash', null - didInsertElement: -> - @_super.apply this, arguments + lineNumberHashDidChange: (-> + @tryScrollingToHashLineNumber() + ).observes('controller.lineNumberHash') - if hash = Travis.app.router.get 'lineNumberHash' + tryScrollingToHashLineNumber: -> + if hash = @get 'controller.lineNumberHash' self = this checker = -> @@ -68,8 +72,21 @@ checker() + didInsertElement: -> + @_super.apply this, arguments + + @tryScrollingToHashLineNumber() + click: (event) -> - $(event.target).closest('.fold').toggleClass('open') + target = $(event.target) + + target.closest('.fold').toggleClass('open') + + if target.is('.log-line-number') + path = target.attr 'href' + Travis.app.get('router').route(path) + event.stopPropagation() + return false toTop: () -> $(window).scrollTop(0) diff --git a/assets/scripts/lib/travis/log.coffee b/assets/scripts/lib/travis/log.coffee index be3b274c..b57e2cac 100644 --- a/assets/scripts/lib/travis/log.coffee +++ b/assets/scripts/lib/travis/log.coffee @@ -5,11 +5,11 @@ bundle: /(\$ bundle install.*<\/p>\n((Updating|Using|Installing|Fetching|remote:|Receiving|Resolving).*?<\/p>\n|<\/p>\n)*)/g exec: /([\/\w]*.rvm\/rubies\/[\S]*?\/(ruby|rbx|jruby) .*?<\/p>)/g - filter: (log) -> + filter: (log, path) -> log = @escape(log) log = @deansi(log) log = log.replace(/\r/g, '') - log = @number(log) + log = @number(log, path) log = @fold(log) log = log.replace(/\n/g, '') log @@ -23,12 +23,13 @@ escapeRuby: (log) -> log.replace /#<(\w+.*?)>/, '#<$1>' - number: (log) -> + number: (log, path) -> + path = "#{path}/" result = '' $.each log.trim().split('\n'), (ix, line) -> number = ix + 1 - path = Travis.Log.location().substr(1).replace(/L\d+/, '') + 'L' + number - result += '

    %@%@

    \n'.fmt(path, path, number, number, line) + pathWithNumber = "#{path}#L#{number}" + result += '

    %@%@

    \n'.fmt(pathWithNumber, number, number, number, line) result.trim() deansi: (log) -> diff --git a/public/scripts/app.js b/public/scripts/app.js index 82bc139a..e299751d 100644 --- a/public/scripts/app.js +++ b/public/scripts/app.js @@ -29619,4 +29619,4 @@ var _require=function(){function c(a,c){document.addEventListener?a.addEventList ++g&&setTimeout(c,0)})}}(); (function(){!window.WebSocket&&window.MozWebSocket&&(window.WebSocket=window.MozWebSocket);if(window.WebSocket)Pusher.Transport=window.WebSocket,Pusher.TransportType="native";var c=(document.location.protocol=="http:"?Pusher.cdn_http:Pusher.cdn_https)+Pusher.VERSION,a=[];window.JSON||a.push(c+"/json2"+Pusher.dependency_suffix+".js");if(!window.WebSocket)window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION=!0,a.push(c+"/flashfallback"+Pusher.dependency_suffix+".js");var b=function(){return window.WebSocket?function(){Pusher.ready()}: function(){window.WebSocket?(Pusher.Transport=window.WebSocket,Pusher.TransportType="flash",window.WEB_SOCKET_SWF_LOCATION=c+"/WebSocketMain.swf",WebSocket.__addTask(function(){Pusher.ready()}),WebSocket.__initialize()):(Pusher.Transport=null,Pusher.TransportType="none",Pusher.ready())}}(),e=function(a){var b=function(){document.body?a():setTimeout(b,0)};b()},g=function(){e(b)};a.length>0?_require(a,g):g()})(); -;minispade.register('app', "(function() {(function() {\nminispade.require('auth');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('slider');\nminispade.require('store');\nminispade.require('tailing');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Travis.reopen({\n App: Em.Application.extend({\n autoinit: false,\n currentUserBinding: 'auth.user',\n authStateBinding: 'auth.state',\n init: function() {\n this._super.apply(this, arguments);\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.set('auth', Travis.Auth.create({\n app: this,\n endpoint: Travis.config.api_endpoint\n }));\n this.slider = new Travis.Slider();\n this.pusher = new Travis.Pusher(Travis.config.pusher_key);\n return this.tailing = new Travis.Tailing();\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n signOut: function() {\n this.get('auth').signOut();\n return this.get('router').send('showRoot');\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#top .profile').append(element);\n Em.run.later((function() {\n return element.remove();\n }), 10);\n element = $('');\n $('#repo').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('auth', "(function() {(function() {\n\n this.Travis.Auth = Ember.Object.extend({\n iframe: $('