perkins 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.ruby-version +1 -0
  4. data/.vagrant/machines/default/virtualbox/action_provision +1 -0
  5. data/.vagrant/machines/default/virtualbox/action_set_name +1 -0
  6. data/.vagrant/machines/default/virtualbox/id +1 -0
  7. data/Gemfile +0 -1
  8. data/README.md +11 -4
  9. data/Rakefile +3 -2
  10. data/TODO.md +2 -2
  11. data/Vagrantfile +53 -0
  12. data/db/migrate/20150220143050_add_status_fields_to_repos.rb +11 -0
  13. data/db/schema.rb +3 -1
  14. data/examples/Gemfile +4 -0
  15. data/examples/Gemfile.lock +164 -0
  16. data/examples/Procfile +4 -0
  17. data/examples/boot.rb +15 -0
  18. data/examples/config.ru +22 -0
  19. data/examples/database.yml +2 -2
  20. data/examples/sidekiq.yml +9 -0
  21. data/lib/core_ext/string/color.rb +22 -0
  22. data/lib/perkins/application.rb +27 -3
  23. data/lib/perkins/assets/images/error.gif +0 -0
  24. data/lib/perkins/assets/images/working.gif +0 -0
  25. data/lib/perkins/assets/javascripts/app.js +17 -1
  26. data/lib/perkins/assets/javascripts/config.js.coffee +14 -0
  27. data/lib/perkins/assets/javascripts/log_view.js.coffee +1 -2
  28. data/lib/perkins/assets/javascripts/perkings.js.coffee +129 -20
  29. data/lib/perkins/assets/javascripts/perkins/helpers.js.coffee +21 -0
  30. data/lib/perkins/assets/javascripts/perkins/m/models.js.coffee +50 -0
  31. data/lib/perkins/assets/javascripts/perkins/router.js.coffee +10 -0
  32. data/lib/perkins/assets/javascripts/perkins/v/dashboard.js.coffee +17 -0
  33. data/lib/perkins/assets/javascripts/perkins/v/err.js.coffee +12 -0
  34. data/lib/perkins/assets/javascripts/perkins/v/menu.js.coffee +10 -0
  35. data/lib/perkins/assets/javascripts/perkins/v/my_repos.js.coffee +41 -0
  36. data/lib/perkins/assets/javascripts/perkins/v/orgs.js.coffee +39 -0
  37. data/lib/perkins/assets/javascripts/perkins/v/profile.js.coffee +20 -0
  38. data/lib/perkins/assets/javascripts/perkins/v/repo.js.coffee +192 -0
  39. data/lib/perkins/assets/javascripts/perkins/v/sidebar.js.coffee +33 -0
  40. data/lib/perkins/assets/javascripts/templates/dashboard.hamlc +11 -0
  41. data/lib/perkins/assets/javascripts/templates/error.hamlc +22 -0
  42. data/lib/perkins/assets/javascripts/templates/menu.hamlc +18 -0
  43. data/lib/perkins/assets/javascripts/templates/org.hamlc +77 -0
  44. data/lib/perkins/assets/javascripts/templates/profile.hamlc +28 -0
  45. data/lib/perkins/assets/javascripts/templates/repo.hamlc +37 -0
  46. data/lib/perkins/assets/javascripts/templates/repos/build_row.hamlc +19 -0
  47. data/lib/perkins/assets/javascripts/templates/repos/builds.hamlc +25 -0
  48. data/lib/perkins/assets/javascripts/templates/repos/config.hamlc +77 -0
  49. data/lib/perkins/assets/javascripts/templates/repos/gb_repo.hamlc +31 -0
  50. data/lib/perkins/assets/javascripts/templates/repos/github.hamlc +7 -0
  51. data/lib/perkins/assets/javascripts/templates/repos/menu.hamlc +17 -0
  52. data/lib/perkins/assets/javascripts/templates/repos/report_detail.hamlc +53 -0
  53. data/lib/perkins/assets/javascripts/templates/sidebar.hamlc +14 -0
  54. data/lib/perkins/assets/javascripts/templates/sidebar_repo.hamlc +4 -0
  55. data/lib/perkins/assets/javascripts/vendor/backbone-min.js +2 -0
  56. data/lib/perkins/assets/javascripts/vendor/backbone.marionette.js +2891 -0
  57. data/lib/perkins/assets/javascripts/vendor/hamlcoffee.js.coffee.erb +138 -0
  58. data/lib/perkins/assets/javascripts/vendor/livequery.jquery.js +8 -0
  59. data/lib/perkins/assets/javascripts/vendor/log.js +1 -1
  60. data/lib/perkins/assets/javascripts/vendor/md5.js +207 -0
  61. data/lib/perkins/assets/javascripts/vendor/nprogress.js +476 -0
  62. data/lib/perkins/assets/javascripts/vendor/underscore.js +6 -0
  63. data/lib/perkins/assets/stylesheets/app.css +3 -0
  64. data/lib/perkins/assets/stylesheets/bootstrap-overrides.css.scss +13 -0
  65. data/lib/perkins/assets/stylesheets/styles.css.scss +30 -3
  66. data/lib/perkins/assets/stylesheets/vendor/nprogress.css +74 -0
  67. data/lib/perkins/assets.rb +42 -0
  68. data/lib/perkins/build/script/ruby.rb +1 -1
  69. data/lib/perkins/build_report.rb +13 -0
  70. data/lib/perkins/{worker.rb → build_worker.rb} +9 -5
  71. data/lib/perkins/cli.rb +4 -2
  72. data/lib/perkins/commit.rb +8 -1
  73. data/lib/perkins/git_loader_worker.rb +29 -0
  74. data/lib/perkins/repo.rb +23 -9
  75. data/lib/perkins/runner.rb +16 -25
  76. data/lib/perkins/server.rb +121 -116
  77. data/lib/perkins/version.rb +1 -1
  78. data/lib/perkins/views/builds.haml +0 -3
  79. data/lib/perkins/views/layout.haml +25 -36
  80. data/lib/perkins/views/menu.haml +1 -1
  81. data/lib/perkins/views/repos/github.haml +0 -31
  82. data/lib/perkins/views/repos/repo.haml +1 -1
  83. data/lib/perkins.rb +4 -2
  84. data/perkins.gemspec +5 -2
  85. data/spec/lib/repo_spec.rb +27 -6
  86. data/spec/lib/runner_spec.rb +1 -0
  87. data/spec/lib/server_spec.rb +6 -23
  88. data/spec/spec_helper.rb +14 -3
  89. metadata +160 -70
  90. data/examples/config.rb +0 -12
  91. data/examples/mongo.yml +0 -13
  92. data/lib/perkins/listener.rb +0 -38
  93. data/spec/lib/listener_spec.rb +0 -30
@@ -1,18 +1,13 @@
1
1
 
2
-
3
2
  $(document).ready ()->
4
- $("abbr.timeago").timeago()
5
-
6
3
 
7
- #toggle item class to show respose
8
- $(".build-item").on("click", ()->
9
- #$(@).find(".build-response").toggleClass("hidden")
10
- )
4
+ $("abbr.timeago").livequery ->
5
+ $(@).timeago()
11
6
 
12
7
  #reading
13
8
  es = new EventSource("/stream")
14
9
  es.onmessage = (e) ->
15
- console.log("MESAGE RECEIVED")
10
+ console.log("MESSAGE RECEIVED")
16
11
  console.log(e.data)
17
12
  a = JSON.parse(e.data)
18
13
 
@@ -20,21 +15,135 @@ $(document).ready ()->
20
15
  $("#repo-#{a.repo.id} .fa-refresh").removeClass("fa-spin")
21
16
  $(".repo-#{a.repo.id}-spinner.build-status").addClass("hidden")
22
17
  if a.repo.status == "start"
23
- debugger
24
18
  $("#repo-#{a.repo.id} .fa-refresh").addClass("fa-spin")
25
19
  $(".repo-#{a.repo.id}-spinner.build-status").removeClass("hidden")
26
20
 
27
- return console.log "WFT?"
21
+ #if repo.id is current repo then reload page
22
+ if current_repo && a.repo.id is current_repo.id && (a.repo.status is "stop" || a.repo.status is "downloaded" )
23
+ Backbone.history.loadUrl()
24
+
25
+ es.onerror = (e)->
26
+ console.log("error")
27
+ console.log(e)
28
+
29
+ NProgress.configure({ showSpinner: false })
30
+
31
+ $.ajaxSetup(
32
+ beforeSend: ()->
33
+ console.log "AJAX START!"
34
+ NProgress.start()
35
+ )
36
+
37
+ $( document ).ajaxStop ()->
38
+ console.log "AJAX STOP!"
39
+ NProgress.done()
40
+
41
+ #application
42
+ class Perkins.AppLayout extends Backbone.Marionette.Layout
43
+ template: "#perkins-layout"
44
+
45
+ regions:
46
+ menu: "#main-menu"
47
+ content: "#main-content"
48
+ sidebar: "#sidebar"
49
+
50
+ class Perkins.Views.ApplicationLayout extends Backbone.View
51
+ el: "body"
52
+ initialize: ->
53
+ console.log "Initializing"
54
+ @setupLayout()
55
+ @displayMenus()
56
+ @setupRouter()
57
+ @setupLinks()
58
+ @setupGlobalViews()
59
+
60
+ displayMenus: ->
61
+ @appLayout.menu.show( new Perkins.Views.Menu )
62
+ @appLayout.sidebar.show( new Perkins.Views.Sidebar )
63
+
64
+ getRepo: (login, name)->
65
+ @repo = new Perkins.Models.Repo()
66
+ @repo.set(name: "#{login}/#{name}")
67
+
68
+ setupRouter: ->
69
+ @app_router = new Perkins.Routers.main(trailingSlashIsSignificant: false)
70
+
71
+ @app_router.on 'route' , (opts)=>
72
+ console.log("any route")
73
+
74
+ @app_router.on 'route:getProfile', ()=>
75
+ console.log("on profile")
76
+ @.appLayout.content.show( new Perkins.Views.Profile )
77
+
78
+ @app_router.on 'route:getDashboard', (actions)=>
79
+ console.log("on dashboard")
80
+ @.appLayout.content.show( new Perkins.Views.Dashboard )
81
+
82
+ @app_router.on 'route:getRepo', (login, name)=>
83
+ console.log("get repo")
84
+ @getRepo(login , name)
85
+ @repo.fetch
86
+ success: =>
87
+ @.appLayout.content.show( new Perkins.Views.Repo(model: @repo) )
88
+
89
+ @app_router.on 'route:getRepoWithBuild', (login, name, id)=>
90
+ console.log("get repo")
91
+ @getRepo(login , name)
92
+ @id = id
93
+ @repo.fetch
94
+ success: =>
95
+ @.appLayout.content.show( new Perkins.Views.Repo(model: @repo, build_id: @id) )
96
+
97
+ @app_router.on "route:getRepoBuilds", (login, name)=>
98
+ console.log("repo builds")
99
+ @getRepo(login, name)
100
+ @repo.fetch
101
+ success: =>
102
+ @.appLayout.content.show( new Perkins.Views.RepoBuilds(model: @repo) )
103
+
104
+ @app_router.on "route:getRepoConfig", (login, name)=>
105
+ console.log("repo builds")
106
+ @getRepo(login, name)
107
+ @repo.fetch
108
+ success: =>
109
+ @.appLayout.content.show( new Perkins.Views.RepoConfig(model: @repo) )
110
+
111
+ @app_router.on "route:getOrg", (name)=>
112
+ @.appLayout.content.show( new Perkins.Views.Org(name: name) )
113
+
114
+ @app_router.on "route:getMyRepos", ()=>
115
+ console.log "MY REPOS"
116
+ @.appLayout.content.show( new Perkins.Views.MyRepos )
117
+
118
+
119
+ Backbone.history.start(pushState: true)
120
+
121
+ setupLinks: ->
122
+ # Globally capture clicks. If they are internal and not in the pass
123
+ # through list, route them through Backbone's navigate method.
124
+ _this = this
125
+
126
+ $("body").on "click", "a[href^='/']", (event) ->
127
+ target = $(event.currentTarget)
128
+ href = target.attr('href')
129
+
130
+ # chain 'or's for other black list routes
131
+ passThrough = href.indexOf('logout') >= 0 or $(event.currentTarget).data("remote") or $(event.currentTarget).data("dont-push")
132
+
133
+ # Allow shift+click for new tabs, etc.
134
+ if !passThrough && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey
135
+
136
+ # Remove leading slashes and hash bangs (backward compatablility)
137
+ url = href.replace(/^\//,'').replace('\#\/','')
138
+
139
+ window.data_navigation = target.data("navigation")
140
+ # Instruct Backbone to trigger routing events
141
+ _this.app_router.navigate url, { trigger: true }
28
142
 
29
- window.log_view = new LogView(el: "#log")
30
- log_view.render()
31
- #log_view.reset()
143
+ return false
32
144
 
33
- $ ->
34
- $('#log').on 'mouseenter', 'a', ->
35
- num = $(this.parentNode).prevAll('p').length + 1
36
- url = window.location + ''
37
- $(this).attr('href', url.replace(/#L\d+|(?=\?)|$/, '#L' + num))
145
+ setupLayout: ->
146
+ @appLayout = new Perkins.AppLayout
38
147
 
39
- $('#log').on 'click', '.fold', ->
40
- $(this).toggleClass('open')
148
+ setupGlobalViews: ->
149
+ window.error_view = new Perkins.Views.Err
@@ -0,0 +1,21 @@
1
+
2
+
3
+ Perkins.Helpers.gravatar_url = (email, size) ->
4
+ gravatar_id = MD5(email)
5
+ "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{size}"
6
+
7
+ Perkins.Helpers.commit_url = (repo, sha) ->
8
+ "#{repo.http_url}/commit/#{sha}"
9
+
10
+ Perkins.Helpers.status_label = (status)->
11
+ label = if status == true then "success" else "default"
12
+ msg = if status == true then "passed" else "error"
13
+ "<span class='label label-#{label}'>build | #{msg}</span>"
14
+
15
+ Perkins.Helpers.status_class = (status)->
16
+ if status == true then "glyphicon glyphicon-ok" else "glyphicon glyphicon-remove"
17
+
18
+ Perkins.Helpers.round = (int, decimals=2)->
19
+ #Math.round(int * 100) / 100
20
+ #+int.toFixed(2);
21
+ parseFloat(int).toFixed(decimals)
@@ -0,0 +1,50 @@
1
+ class Perkins.Models.Profile extends Backbone.Model
2
+ url: ()->
3
+ "/me"
4
+
5
+ class Perkins.Models.Repo extends Backbone.Model
6
+ url: ()->
7
+ if @.get('name')
8
+ "/repos/#{@.get('name')}"
9
+ else
10
+ "/repos"
11
+
12
+ class Perkins.Collections.Repos extends Backbone.Collection
13
+ model: Perkins.Models.Repo
14
+ url: ->
15
+ "/repos"
16
+
17
+ class Perkins.Models.BuildReport extends Backbone.Model
18
+ initialize: (opts={})->
19
+ @repo = opts.repo
20
+
21
+ url: ->
22
+ "/repos/#{@repo.get('name')}/builds/#{@id}"
23
+
24
+ restart: ->
25
+ @fetch(url: @url() + "/restart")
26
+
27
+ class Perkins.Collections.BuildReports extends Backbone.Collection
28
+ model: Perkins.Models.BuildReport
29
+
30
+ initialize: (opts={})->
31
+ @repo = opts.repo
32
+
33
+ url: ->
34
+ "/repos/#{@repo.get('name')}/builds"
35
+
36
+ class Perkins.Models.RepoHook extends Backbone.Model
37
+ initialize: (opts={})->
38
+ @repo = opts.repo
39
+
40
+ url: ->
41
+ "/repos/#{@repo.get('name')}/config"
42
+
43
+ class Perkins.Models.Org extends Backbone.Model
44
+ url: ->
45
+ "/orgs/#{@.get('name')}"
46
+
47
+ class Perkins.Collections.Orgs extends Backbone.Collection
48
+ model: Perkins.Models.Org
49
+ url: ->
50
+ "/orgs"
@@ -0,0 +1,10 @@
1
+ class Perkins.Routers.main extends Backbone.Router
2
+ routes:
3
+ "" : "getDashboard"
4
+ "me": "getProfile"
5
+ "repos/:login/:name": "getRepo"
6
+ "repos/:login/:name/builds/:id": "getRepoWithBuild"
7
+ "repos/:login/:name/builds": "getRepoBuilds"
8
+ "repos/:login/:name/config": "getRepoConfig"
9
+ "orgs/:name": "getOrg"
10
+ "myrepos": "getMyRepos"
@@ -0,0 +1,17 @@
1
+ class Perkins.Views.Dashboard extends Backbone.View
2
+ el: "#main-content"
3
+
4
+ initialize: ->
5
+
6
+ template: ->
7
+ JST["dashboard"]()
8
+
9
+ render: ()->
10
+ $(@el).html(@template())
11
+
12
+ close: ()->
13
+ $(@el).html("")
14
+ console.log "CLOSED VIEW CALLED"
15
+ @.stopListening()
16
+ @.undelegateEvents()
17
+ @.unbind()
@@ -0,0 +1,12 @@
1
+ class Perkins.Views.Err extends Backbone.View
2
+ el: "#main-content"
3
+
4
+ initialize: (params)=>
5
+ super
6
+
7
+ template: (opts={})=>
8
+ JST['error'](opts)
9
+
10
+ render: (opts)=>
11
+ $(@el).html(@template(opts))
12
+
@@ -0,0 +1,10 @@
1
+ class Perkins.Views.Menu extends Backbone.View
2
+ el: "#main-menu"
3
+
4
+ template:
5
+
6
+ JST['menu']()
7
+
8
+ render: ->
9
+
10
+ $(@el).html(@template)
@@ -0,0 +1,41 @@
1
+ class Perkins.Views.MyRepos extends Backbone.View
2
+ el: "#main-content"
3
+
4
+ events:
5
+ "click .add-repo" : "addRepo"
6
+
7
+ initialize: (opts={})->
8
+ @model = new Backbone.Model(name: opts.name)
9
+
10
+ template: ->
11
+ JST["repos/github"](@model.toJSON())
12
+
13
+ render: ()->
14
+ @model.fetch
15
+ url: "/myrepos"
16
+ success: =>
17
+ $(@el).html(@template())
18
+
19
+ #TODO: use a collection view and decouple
20
+ addRepo: (ev)->
21
+ target = $(ev.currentTarget)
22
+ target.text("adding...")
23
+ target.addClass("btn-diabled")
24
+ repo_id = target.data('gb-id')
25
+ url = "/repos/add/#{repo_id}"
26
+
27
+ #add repo & refresh sidebar on success.
28
+ $.ajax
29
+ url: url
30
+ success: ->
31
+ sidebar = Applayout.appLayout.sidebar.currentView
32
+ sidebar.repos.reset()
33
+ sidebar.repos.fetch()
34
+ false
35
+
36
+ close: ()->
37
+ $(@el).html("")
38
+ console.log "CLOSED VIEW CALLED"
39
+ @.stopListening()
40
+ @.undelegateEvents()
41
+ @.unbind()
@@ -0,0 +1,39 @@
1
+ class Perkins.Views.Org extends Backbone.View
2
+ el: "#main-content"
3
+
4
+ events:
5
+ "click .add-repo" : "addRepo"
6
+
7
+ initialize: (opts={})->
8
+ @model = new Perkins.Models.Org(name: opts.name)
9
+
10
+ template: ->
11
+ JST["org"](@model.toJSON())
12
+
13
+ render: ()->
14
+ @model.fetch
15
+ success: =>
16
+ $(@el).html(@template())
17
+
18
+ addRepo: (ev)->
19
+ target = $(ev.currentTarget)
20
+ target.text("adding...")
21
+ target.addClass("btn-diabled")
22
+ repo_id = target.data('gb-id')
23
+ url = "/repos/add/#{repo_id}"
24
+
25
+ #add repo & refresh sidebar on success.
26
+ $.ajax
27
+ url: url
28
+ success: ->
29
+ sidebar = Applayout.appLayout.sidebar.currentView
30
+ sidebar.repos.reset()
31
+ sidebar.repos.fetch()
32
+ false
33
+
34
+ close: ()->
35
+ $(@el).html("")
36
+ console.log "CLOSED VIEW CALLED"
37
+ @.stopListening()
38
+ @.undelegateEvents()
39
+ @.unbind()
@@ -0,0 +1,20 @@
1
+ class Perkins.Views.Profile extends Backbone.View
2
+ el: "#main-content"
3
+
4
+ initialize: ->
5
+ @model = new Perkins.Models.Profile
6
+
7
+ template: ->
8
+ JST["profile"](@model.toJSON())
9
+
10
+ render: ()->
11
+ @model.fetch
12
+ success: =>
13
+ $(@el).html(@template())
14
+
15
+ close: ()->
16
+ $(@el).html("")
17
+ console.log "CLOSED VIEW CALLED"
18
+ @.stopListening()
19
+ @.undelegateEvents()
20
+ @.unbind()
@@ -0,0 +1,192 @@
1
+ #SHOW REPO
2
+ class Perkins.Views.Repo extends Backbone.View
3
+ el: "#main-content"
4
+
5
+ events:
6
+ 'mouseenter #log a' : "replaceUri"
7
+ 'click #log .fold' : "toggleFold"
8
+ 'click #restart-build-btn' : "restartBuild"
9
+ 'click .run-commit': "runCommit"
10
+
11
+ initialize: (opts)->
12
+ @model = opts.model
13
+
14
+ if opts.build_id
15
+ @build = new Perkins.Models.BuildReport({id: opts.build_id, repo: @model})
16
+ else if @model.get('last_report_id')
17
+ @build = new Perkins.Models.BuildReport({id: @model.get('last_report_id'), repo: @model})
18
+
19
+ @listenTo(@build, "change", @renderBuildReport) if @build
20
+ @listenTo(@model, "change:build_status", @handleSpinnerBtn)
21
+
22
+ template: ()->
23
+ JST["repo"](@model.toJSON())
24
+
25
+ replaceUri: (ev)->
26
+ console.log ev
27
+ t = ev.currentTarget
28
+ num = $(t.parentNode).prevAll('p').length + 1
29
+ url = window.location + ''
30
+ $(t).attr('href', url.replace(/#L\d+|(?=\?)|$/, '#L' + num))
31
+
32
+ handleSpinnerBtn: ->
33
+ if @model.get('build_status') is "started"
34
+ $(".fa-refresh").addClass("fa-spin")
35
+ else if @model.get('build_status') is "stopped"
36
+ $(".fa-refresh").removeClass("fa-spin")
37
+
38
+ toggleFold: (ev)->
39
+ console.log ev
40
+ $(ev.currentTarget).toggleClass('open')
41
+
42
+ render: ->
43
+ console.log("render repo")
44
+ $(@el).html(@template())
45
+ @handleSpinnerBtn()
46
+
47
+ if @build
48
+ @build_detail = new Perkins.Views.BuildDetail( repo: @model, build: @build )
49
+ @build.fetch()
50
+ @displayBadge()
51
+
52
+ displayBadge: ->
53
+ name = @model.get('name')
54
+ url = "#{window.location.origin}/badge?repo=#{name}"
55
+ badge = "<a href='#{url}' target='blank'><img src='#{url}' alt='badge'></a>"
56
+ $('#badge-placeholder').html(badge)
57
+
58
+ renderBuildReport: ->
59
+ @build_detail.render()
60
+
61
+ restartBuild: (ev)->
62
+ return if $(ev.currentTarget).find("i").hasClass("fa-spin")
63
+ @build_detail.restart()
64
+
65
+ runCommit: ->
66
+ url = "/repos/#{@model.get('name')}/run_commit"
67
+ $.ajax
68
+ url: url
69
+ beforeSend: ->
70
+ $(".no-build").text("running build")
71
+ $(".run-commit").addClass("hide")
72
+
73
+ error: (err)->
74
+ $(".no-build").text("oops! we received status #{err.status}")
75
+ $(".run-commit").text("try again").removeClass("hide")
76
+ success: =>
77
+ $(".no-build").text("running build")
78
+
79
+ false
80
+
81
+ close: ()->
82
+ $(@el).html("")
83
+ console.log "CLOSED VIEW CALLED"
84
+ @.stopListening()
85
+ @.undelegateEvents()
86
+ @.unbind()
87
+
88
+ #repo build detail
89
+ class Perkins.Views.BuildDetail extends Backbone.View
90
+
91
+ el: "#build-report-container"
92
+
93
+ initialize: (opts={})->
94
+ @repo = opts.repo
95
+ window.current_repo = @repo
96
+ @build = opts.build
97
+
98
+ template: ->
99
+ JST["repos/report_detail"]({repo: @repo.toJSON(), build: @build.toJSON()})
100
+
101
+ render: ->
102
+ $(@el).html(@template())
103
+ window.log_view = new LogView(el: "#log")
104
+ log_view.render()
105
+ @displayRestartBuildBtn()
106
+ $("#no-build-warning").addClass("hide")
107
+
108
+ displayRestartBuildBtn: ->
109
+ $("#restart-build-btn").removeClass("hide")
110
+ #url = "/repos/#{@repo.get('name')}/builds/#{@build.id}/restart"
111
+ #$("#restart-build-btn").find("a").attr("href", url )
112
+
113
+ restart: ->
114
+ $("#restart-build-btn").find("i").addClass("fa-spin")
115
+ @build.restart()
116
+ false
117
+
118
+ close: ()->
119
+ $(@el).html("")
120
+ console.log "CLOSED VIEW CALLED"
121
+ @.stopListening()
122
+ @.undelegateEvents()
123
+ @.unbind()
124
+
125
+ #REPO BUILDS
126
+ class Perkins.Views.RepoBuilds extends Backbone.View
127
+ initialize: (opts={})->
128
+ @repo = opts.model
129
+ window.current_repo = @repo
130
+ @builds = new Perkins.Collections.BuildReports(repo: @repo)
131
+
132
+ el: "#main-content"
133
+
134
+ template: ->
135
+ JST["repos/builds"]({repo: @repo.toJSON() , builds: @builds})
136
+
137
+ render: ->
138
+ console.log("render repo builds")
139
+ $(@el).html(@template())
140
+ @builds_view = new Perkins.Views.RepoBuildCollection(collection: @builds)
141
+ @builds.fetch()
142
+
143
+ close: ()->
144
+ $(@el).html("")
145
+ console.log "CLOSED VIEW CALLED"
146
+ @.stopListening()
147
+ @.undelegateEvents()
148
+ @.unbind()
149
+
150
+ class Perkins.Views.RepoBuildItem extends Backbone.Marionette.ItemView
151
+
152
+ tagName: "tr"
153
+
154
+ template: (serialized_model) ->
155
+ JST['repos/build_row'](serialized_model)
156
+
157
+ class Perkins.Views.RepoBuildCollection extends Backbone.Marionette.CollectionView
158
+ itemView: Perkins.Views.RepoBuildItem
159
+ el: "#repo-builds"
160
+
161
+ #REPO CONFIG
162
+
163
+ class Perkins.Views.RepoConfig extends Backbone.View
164
+ initialize: (opts={})->
165
+ @repo = opts.model
166
+ window.current_repo = @repo
167
+ @hook = new Perkins.Models.RepoHook(repo: @repo)
168
+
169
+ @listenTo(@hook, "error", @defaultErrorHandler)
170
+
171
+
172
+ el: "#main-content"
173
+
174
+ template: ->
175
+ JST["repos/config"]({repo: @model.toJSON(), hook: @hook.toJSON() })
176
+
177
+ render: ->
178
+ console.log("render repo builds")
179
+ @hook.fetch
180
+ success: =>
181
+ $(@el).html(@template())
182
+
183
+ close: ()->
184
+ $(@el).html("")
185
+ console.log "CLOSED VIEW CALLED"
186
+ @.stopListening()
187
+ @.undelegateEvents()
188
+ @.unbind()
189
+
190
+ defaultErrorHandler: (model, error)=>
191
+ unless error.status < 500
192
+ error_view.render(status: error.status)
@@ -0,0 +1,33 @@
1
+ class Perkins.Views.Sidebar extends Backbone.View
2
+ el: "#sidebar"
3
+
4
+ initialize: ->
5
+ @repos = new Perkins.Collections.Repos
6
+ @listenTo(@repos, "sync", @renderReposList)
7
+
8
+ template: ->
9
+ JST["sidebar"]()
10
+
11
+ render: ->
12
+ $(@el).html(@template())
13
+ @repos.fetch()
14
+
15
+ renderReposList: ->
16
+ console.log "sync"
17
+ @repos_list ||= new Perkins.Views.SidebarRepoCollection(collection: @repos)
18
+ @repos_list.render()
19
+
20
+ class Perkins.Views.SidebarRepoItem extends Backbone.Marionette.ItemView
21
+
22
+ tagName: "li"
23
+
24
+ #events:
25
+
26
+ template: (serialized_model) ->
27
+ JST['sidebar_repo'](serialized_model)
28
+
29
+ class Perkins.Views.SidebarRepoCollection extends Backbone.Marionette.CollectionView
30
+ itemView: Perkins.Views.SidebarRepoItem
31
+ el: "#sidebar-repos"
32
+
33
+
@@ -0,0 +1,11 @@
1
+ .page-header
2
+ %h1
3
+ Wilkommen to Perkins \{
4
+ %small go for your build.
5
+
6
+ .panel.panel-default
7
+ / Default panel contents
8
+ .panel-heading Latest Builds
9
+ .panel-body
10
+ -#%p This are some of the latest builds on this machine.
11
+
@@ -0,0 +1,22 @@
1
+ .error
2
+
3
+ -#%i.fa.fa-5x.fa-exclamation-triangle
4
+
5
+ %h2 We found an error loading this page.
6
+
7
+
8
+ - if current_repo
9
+ - url = "#{current_repo.get('url')}/settings"
10
+ - else
11
+ - url = "/"
12
+
13
+ %p
14
+ %img{src: "/assets/error.gif"}
15
+
16
+ %hr
17
+
18
+ - if url
19
+ %a.btn.btn-primary{href: "#{url}", data: {"dont-push": "true"}, target: "blank" }
20
+ Check your permissions on #{current_repo.get('github_data').name} and try again.
21
+
22
+ %h3 error status: #{@status}
@@ -0,0 +1,18 @@
1
+ %nav#main-menu.navbar.navbar-fixed-top{role:"navigation"}
2
+ .container
3
+ .navbar-header
4
+ %button.navbar-toggle{"data-target" => ".nav-collapse", "data-toggle" => "collapse", :type => "button"}
5
+ %span.sr-only
6
+ %span.icon-bar
7
+ %span.icon-bar
8
+ %span.icon-bar
9
+ .title
10
+ %a.navbar-brand{:href => "/#"} Perkins
11
+
12
+ .navbar-inner.pull-right
13
+ .nav-collapse
14
+ %ul.nav.navbar-nav
15
+ %li
16
+ %a{:href => "/"} Home
17
+ %li
18
+ %a{:href => "/logout", data: {"dont-push"=> "true"}} Logout