Commit e142ebde5cb9600f25dd844030318c51dcadb54b

Authored by Dmitriy Zaporozhets
2 parents d5642d30 eded4bfa

Merge branch 'koenpunt-mergerequest-to-coffee'

app/assets/javascripts/merge_requests.js
@@ -1,132 +0,0 @@ @@ -1,132 +0,0 @@
1 -var MergeRequest = {  
2 - diffs_loaded: false,  
3 - commits_loaded: false,  
4 - opts: false,  
5 -  
6 - init:  
7 - function(opts) {  
8 - var self = this;  
9 - self.opts = opts;  
10 -  
11 - self.initTabs();  
12 - self.initMergeWidget();  
13 -  
14 - $(".mr_show_all_commits").bind("click", function() {  
15 - self.showAllCommits();  
16 - });  
17 - },  
18 -  
19 - initMergeWidget:  
20 - function() {  
21 - var self = this;  
22 - self.showState(self.opts.current_state);  
23 -  
24 - if($(".automerge_widget").length && self.opts.check_enable){  
25 - $.get(self.opts.url_to_automerge_check, function(data){  
26 - self.showState(data.state);  
27 - }, "json");  
28 - }  
29 -  
30 - if(self.opts.ci_enable){  
31 - $.get(self.opts.url_to_ci_check, function(data){  
32 - self.showCiState(data.status);  
33 - }, "json");  
34 - }  
35 - },  
36 -  
37 - initTabs:  
38 - function() {  
39 - $(".mr_nav_tabs a").live("click", function() {  
40 - $(".mr_nav_tabs a").parent().removeClass("active");  
41 - $(this).parent().addClass("active");  
42 - });  
43 -  
44 - var current_tab;  
45 - if(this.opts.action == "diffs") {  
46 - current_tab = $(".mr_nav_tabs .merge-diffs-tab");  
47 - } else {  
48 - current_tab = $(".mr_nav_tabs .merge-notes-tab");  
49 - }  
50 - current_tab.parent().addClass("active");  
51 -  
52 - this.initNotesTab();  
53 - this.initDiffTab();  
54 - },  
55 -  
56 - initNotesTab:  
57 - function() {  
58 - $(".mr_nav_tabs a.merge-notes-tab").live("click", function(e) {  
59 - $(".merge-request-diffs").hide();  
60 - $(".merge_request_notes").show();  
61 - var mr_path = $(".merge-notes-tab").attr("data-url");  
62 - history.pushState({ path: mr_path }, '', mr_path);  
63 - e.preventDefault();  
64 - });  
65 - },  
66 -  
67 - initDiffTab:  
68 - function() {  
69 - $(".mr_nav_tabs a.merge-diffs-tab").live("click", function(e) {  
70 - if(!MergeRequest.diffs_loaded) {  
71 - MergeRequest.loadDiff();  
72 - }  
73 - $(".merge_request_notes").hide();  
74 - $(".merge-request-diffs").show();  
75 - var mr_diff_path = $(".merge-diffs-tab").attr("data-url");  
76 - history.pushState({ path: mr_diff_path }, '', mr_diff_path);  
77 - e.preventDefault();  
78 - });  
79 -  
80 - },  
81 -  
82 - showState:  
83 - function(state){  
84 - $(".automerge_widget").hide();  
85 - $(".automerge_widget." + state).show();  
86 - },  
87 -  
88 - showCiState:  
89 - function(state){  
90 - $(".ci_widget").hide();  
91 - $(".ci_widget.ci-" + state).show();  
92 - },  
93 -  
94 - loadDiff:  
95 - function() {  
96 - $(".dashboard-loader").show();  
97 - $.ajax({  
98 - type: "GET",  
99 - url: $(".merge-diffs-tab").attr("data-url"),  
100 - beforeSend: function(){ $('.status').addClass("loading")},  
101 - complete: function(){  
102 - MergeRequest.diffs_loaded = true;  
103 - $(".merge_request_notes").hide();  
104 - $('.status').removeClass("loading");  
105 - },  
106 - dataType: "script"});  
107 - },  
108 -  
109 - showAllCommits:  
110 - function() {  
111 - $(".first_mr_commits").remove();  
112 - $(".all_mr_commits").removeClass("hide");  
113 - },  
114 -  
115 - already_cannot_be_merged:  
116 - function(){  
117 - $(".automerge_widget").hide();  
118 - $(".merge_in_progress").hide();  
119 - $(".automerge_widget.already_cannot_be_merged").show();  
120 - }  
121 -};  
122 -  
123 -/*  
124 - * Filter merge requests  
125 - */  
126 -function merge_requestsPage() {  
127 - $("#assignee_id").chosen();  
128 - $("#milestone_id").chosen();  
129 - $("#milestone_id, #assignee_id").on("change", function(){  
130 - $(this).closest("form").submit();  
131 - });  
132 -}  
app/assets/javascripts/merge_requests.js.coffee 0 → 100644
@@ -0,0 +1,97 @@ @@ -0,0 +1,97 @@
  1 +#
  2 +# * Filter merge requests
  3 +#
  4 +@merge_requestsPage = ->
  5 + $('#assignee_id').chosen()
  6 + $('#milestone_id').chosen()
  7 + $('#milestone_id, #assignee_id').on 'change', ->
  8 + $(this).closest('form').submit()
  9 +
  10 +class MergeRequest
  11 +
  12 + constructor: (@opts) ->
  13 + this.$el = $('.merge-request')
  14 + @diffs_loaded = false
  15 + @commits_loaded = false
  16 +
  17 + this.activateTab(@opts.action)
  18 +
  19 + this.bindEvents()
  20 +
  21 + this.initMergeWidget()
  22 + this.$('.show-all-commits').on 'click', =>
  23 + this.showAllCommits()
  24 +
  25 + # Local jQuery finder
  26 + $: (selector) ->
  27 + this.$el.find(selector)
  28 +
  29 + initMergeWidget: ->
  30 + this.showState( @opts.current_state )
  31 +
  32 + if this.$('.automerge_widget').length and @opts.check_enable
  33 + $.get @opts.url_to_automerge_check, (data) =>
  34 + this.showState( data.state )
  35 + , 'json'
  36 +
  37 + if @opts.ci_enable
  38 + $.get self.opts.url_to_ci_check, (data) =>
  39 + this.showCiState data.status
  40 + , 'json'
  41 +
  42 + bindEvents: ->
  43 + this.$('.nav-tabs').on 'click', 'a', (event) =>
  44 + a = $(event.currentTarget)
  45 +
  46 + href = a.attr('href')
  47 + History.replaceState {path: href}, document.title, href
  48 +
  49 + event.preventDefault()
  50 +
  51 + this.$('.nav-tabs').on 'click', 'li', (event) =>
  52 + this.activateTab($(event.currentTarget).data('action'))
  53 +
  54 + activateTab: (action) ->
  55 + this.$('.nav-tabs li').removeClass 'active'
  56 + this.$('.tab-content').hide()
  57 + switch action
  58 + when 'diffs'
  59 + this.$('.nav-tabs .diffs-tab').addClass 'active'
  60 + this.loadDiff() unless @diffs_loaded
  61 + this.$('.diffs').show()
  62 + else
  63 + this.$('.nav-tabs .notes-tab').addClass 'active'
  64 + this.$('.notes').show()
  65 +
  66 + showState: (state) ->
  67 + $('.automerge_widget').hide()
  68 + $('.automerge_widget.' + state).show()
  69 +
  70 + showCiState: (state) ->
  71 + $('.ci_widget').hide()
  72 + $('.ci_widget.ci-' + state).show()
  73 +
  74 + loadDiff: (event) ->
  75 + $('.dashboard-loader').show()
  76 + $.ajax
  77 + type: 'GET'
  78 + url: this.$('.nav-tabs .diffs-tab a').attr('href')
  79 + beforeSend: =>
  80 + this.$('.status').addClass 'loading'
  81 +
  82 + complete: =>
  83 + @diffs_loaded = true
  84 + this.$('.status').removeClass 'loading'
  85 +
  86 + dataType: 'script'
  87 +
  88 + showAllCommits: ->
  89 + this.$('.first-commits').remove()
  90 + this.$('.all-commits').removeClass 'hide'
  91 +
  92 + alreadyOrCannotBeMerged: ->
  93 + this.$('.automerge_widget').hide()
  94 + this.$('.merge-in-progress').hide()
  95 + this.$('.automerge_widget.already_cannot_be_merged').show()
  96 +
  97 +this.MergeRequest = MergeRequest
0 \ No newline at end of file 98 \ No newline at end of file
app/assets/stylesheets/common.scss
@@ -425,7 +425,7 @@ li.note { @@ -425,7 +425,7 @@ li.note {
425 425
426 426
427 .supp_diff_link, 427 .supp_diff_link,
428 -.mr_show_all_commits { 428 +.show-all-commits {
429 cursor: pointer; 429 cursor: pointer;
430 } 430 }
431 431
app/assets/stylesheets/sections/merge_requests.scss
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 } 43 }
44 } 44 }
45 45
46 -.mr_nav_tabs { 46 +.merge-request .nav-tabs{
47 li { 47 li {
48 a { 48 a {
49 font-weight: bold; 49 font-weight: bold;
@@ -65,7 +65,7 @@ li.merge_request { @@ -65,7 +65,7 @@ li.merge_request {
65 } 65 }
66 } 66 }
67 67
68 -.merge_in_progress { 68 +.merge-in-progress {
69 @extend .padded; 69 @extend .padded;
70 @extend .append-bottom-10; 70 @extend .append-bottom-10;
71 } 71 }
app/controllers/merge_requests_controller.rb
@@ -69,6 +69,8 @@ class MergeRequestsController < ProjectResourceController @@ -69,6 +69,8 @@ class MergeRequestsController < ProjectResourceController
69 @merge_request.check_if_can_be_merged 69 @merge_request.check_if_can_be_merged
70 end 70 end
71 render json: {state: @merge_request.human_state} 71 render json: {state: @merge_request.human_state}
  72 + rescue Gitlab::SatelliteNotExistError
  73 + render json: {state: :no_satellite}
72 end 74 end
73 75
74 def automerge 76 def automerge
app/views/merge_requests/_form.html.haml
1 -= form_for [@project, @merge_request], html: { class: "new_merge_request form-horizontal" } do |f| 1 += form_for [@project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |f|
2 -if @merge_request.errors.any? 2 -if @merge_request.errors.any?
3 .alert-message.block-message.error 3 .alert-message.block-message.error
4 %ul 4 %ul
@@ -61,8 +61,9 @@ @@ -61,8 +61,9 @@
61 :javascript 61 :javascript
62 $(function(){ 62 $(function(){
63 disableButtonIfEmptyField("#merge_request_title", ".save-btn"); 63 disableButtonIfEmptyField("#merge_request_title", ".save-btn");
64 - var source_branch = $("#merge_request_source_branch");  
65 - var target_branch = $("#merge_request_target_branch"); 64 +
  65 + var source_branch = $("#merge_request_source_branch")
  66 + , target_branch = $("#merge_request_target_branch");
66 67
67 $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: source_branch.val() }); 68 $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: source_branch.val() });
68 $.get("#{branch_to_project_merge_requests_path(@project)}", {ref: target_branch.val() }); 69 $.get("#{branch_to_project_merge_requests_path(@project)}", {ref: target_branch.val() });
app/views/merge_requests/_show.html.haml
1 -= render "merge_requests/show/mr_title"  
2 -= render "merge_requests/show/how_to_merge"  
3 -= render "merge_requests/show/mr_box"  
4 -= render "merge_requests/show/mr_accept"  
5 -- if @project.gitlab_ci?  
6 - = render "merge_requests/show/mr_ci"  
7 -= render "merge_requests/show/commits" 1 +.merge-request
  2 + = render "merge_requests/show/mr_title"
  3 + = render "merge_requests/show/how_to_merge"
  4 + = render "merge_requests/show/mr_box"
  5 + = render "merge_requests/show/mr_accept"
  6 + - if @project.gitlab_ci?
  7 + = render "merge_requests/show/mr_ci"
  8 + = render "merge_requests/show/commits"
8 9
9 -- if @commits.present?  
10 - %ul.nav.nav-tabs.mr_nav_tabs  
11 - %li  
12 - = link_to "#notes", "data-url" => project_merge_request_path(@project, @merge_request), class: "merge-notes-tab tab" do  
13 - %i.icon-comment  
14 - Comments  
15 - %li  
16 - = link_to "#diffs", "data-url" => diffs_project_merge_request_path(@project, @merge_request), class: "merge-diffs-tab tab" do  
17 - %i.icon-list-alt  
18 - Diff 10 + - if @commits.present?
  11 + %ul.nav.nav-tabs
  12 + %li.notes-tab{data: {action: 'notes'}}
  13 + = link_to project_merge_request_path(@project, @merge_request) do
  14 + %i.icon-comment
  15 + Comments
  16 + %li.diffs-tab{data: {action: 'diffs'}}
  17 + = link_to diffs_project_merge_request_path(@project, @merge_request) do
  18 + %i.icon-list-alt
  19 + Diff
19 20
20 -.merge_request_notes.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" }  
21 - = render("notes/notes_with_form", tid: @merge_request.id, tt: "merge_request")  
22 -.merge-request-diffs  
23 - = render "merge_requests/show/diffs" if @diffs  
24 -.status 21 + .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" }
  22 + = render("notes/notes_with_form", tid: @merge_request.id, tt: "merge_request")
  23 + .diffs.tab-content
  24 + = render "merge_requests/show/diffs" if @diffs
  25 + .status
25 26
26 -= render "notes/per_line_form" 27 + = render "notes/per_line_form"
27 28
28 :javascript 29 :javascript
  30 + var merge_request;
29 $(function(){ 31 $(function(){
30 - MergeRequest.init({ 32 + merge_request = new MergeRequest({
31 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}", 33 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
32 check_enable: #{@merge_request.state == MergeRequest::UNCHECKED ? "true" : "false"}, 34 check_enable: #{@merge_request.state == MergeRequest::UNCHECKED ? "true" : "false"},
33 url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}", 35 url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}",
@@ -35,10 +37,5 @@ @@ -35,10 +37,5 @@
35 current_state: "#{@merge_request.human_state}", 37 current_state: "#{@merge_request.human_state}",
36 action: "#{controller.action_name}" 38 action: "#{controller.action_name}"
37 }); 39 });
38 -  
39 - $(".edit_merge_request").live("ajax:beforeSend", function() {  
40 - $('.can_be_merged').hide();  
41 - $('.merge_in_progress').show();  
42 - })  
43 - }) 40 + });
44 41
app/views/merge_requests/automerge.js.haml
@@ -3,5 +3,5 @@ @@ -3,5 +3,5 @@
3 location.reload(); 3 location.reload();
4 -else 4 -else
5 :plain 5 :plain
6 - MergeRequest.already_cannot_be_merged() 6 + merge_request.alreadyOrCannotBeMerged()
7 7
app/views/merge_requests/commits.js.haml
1 :plain 1 :plain
2 - $(".merge-request-commits").html("#{escape_javascript(render(partial: "commits"))}"); 2 + merge_request.$(".commits").html("#{escape_javascript(render(partial: "commits"))}");
3 3
4 4
app/views/merge_requests/diffs.js.haml
1 :plain 1 :plain
2 - $(".merge-request-diffs").html("#{escape_javascript(render(partial: "merge_requests/show/diffs"))}"); 2 + merge_request.$(".diffs").html("#{escape_javascript(render(partial: "merge_requests/show/diffs"))}");
3 3
4 - $(function(){  
5 - PerLineNotes.init();  
6 - }); 4 + PerLineNotes.init();
7 5
app/views/merge_requests/index.html.haml
@@ -44,6 +44,4 @@ @@ -44,6 +44,4 @@
44 %span.cgray.right #{@merge_requests.total_count} merge requests for this filter 44 %span.cgray.right #{@merge_requests.total_count} merge requests for this filter
45 45
46 :javascript 46 :javascript
47 - $(function() {  
48 - merge_requestsPage();  
49 - }) 47 + $(merge_requestsPage);
app/views/merge_requests/show.js.haml
1 :plain 1 :plain
2 - $(".merge-request-notes").html("#{escape_javascript(render notes/notes_with_form", tid: @merge_request.id, tt: "merge_request")}"); 2 + merge_request.$(".notes").html("#{escape_javascript(render "notes/notes_with_form", tid: @merge_request.id, tt: "merge_request")}");
app/views/merge_requests/show/_commits.html.haml
@@ -3,16 +3,16 @@ @@ -3,16 +3,16 @@
3 %h5.title 3 %h5.title
4 %i.icon-list 4 %i.icon-list
5 Commits (#{@commits.count}) 5 Commits (#{@commits.count})
6 - .merge-request-commits 6 + .commits
7 - if @commits.count > 8 7 - if @commits.count > 8
8 - %ul.first_mr_commits.well-list 8 + %ul.first-commits.well-list
9 - @commits.first(8).each do |commit| 9 - @commits.first(8).each do |commit|
10 = render "commits/commit", commit: commit 10 = render "commits/commit", commit: commit
11 %li.bottom 11 %li.bottom
12 8 of #{@commits.count} commits displayed. 12 8 of #{@commits.count} commits displayed.
13 %strong 13 %strong
14 - %a.mr_show_all_commits Click here to show all  
15 - %ul.all_mr_commits.hide.well-list 14 + %a.show-all-commits Click here to show all
  15 + %ul.all-commits.hide.well-list
16 - @commits.each do |commit| 16 - @commits.each do |commit|
17 = render "commits/commit", commit: commit 17 = render "commits/commit", commit: commit
18 18
app/views/merge_requests/show/_mr_accept.html.haml
@@ -23,6 +23,11 @@ @@ -23,6 +23,11 @@
23 .clearfix 23 .clearfix
24 24
25 25
  26 + .automerge_widget.no_satellite{style: "display:none"}
  27 + .alert.alert-error
  28 + %span
  29 + %strong This repository does not have satellite. Ask administrator to fix this issue
  30 +
26 .automerge_widget.cannot_be_merged{style: "display:none"} 31 .automerge_widget.cannot_be_merged{style: "display:none"}
27 .alert.alert-info 32 .alert.alert-info
28 %span 33 %span
@@ -40,6 +45,6 @@ @@ -40,6 +45,6 @@
40 .alert.alert-info 45 .alert.alert-info
41 %strong This merge request already can not be merged. Try to reload page. 46 %strong This merge request already can not be merged. Try to reload page.
42 47
43 - .merge_in_progress.hide 48 + .merge-in-progress.hide
44 %span.cgray Merge is in progress. Please wait. Page will be automatically reloaded.   49 %span.cgray Merge is in progress. Please wait. Page will be automatically reloaded.  
45 = image_tag "ajax_loader.gif" 50 = image_tag "ajax_loader.gif"
lib/gitlab/satellite/satellite.rb
1 module Gitlab 1 module Gitlab
  2 + class SatelliteNotExistError < StandardError; end
  3 +
2 module Satellite 4 module Satellite
3 class Satellite 5 class Satellite
4 PARKING_BRANCH = "__parking_branch" 6 PARKING_BRANCH = "__parking_branch"
@@ -9,8 +11,12 @@ module Gitlab @@ -9,8 +11,12 @@ module Gitlab
9 @project = project 11 @project = project
10 end 12 end
11 13
  14 + def raise_no_satellite
  15 + raise SatelliteNotExistError.new("Satellite doesn't exist")
  16 + end
  17 +
12 def clear_and_update! 18 def clear_and_update!
13 - raise "Satellite doesn't exist" unless exists? 19 + raise_no_satellite unless exists?
14 20
15 delete_heads! 21 delete_heads!
16 clear_working_dir! 22 clear_working_dir!
@@ -35,7 +41,7 @@ module Gitlab @@ -35,7 +41,7 @@ module Gitlab
35 # * Changes the current directory to the satellite's working dir 41 # * Changes the current directory to the satellite's working dir
36 # * Yields 42 # * Yields
37 def lock 43 def lock
38 - raise "Satellite doesn't exist" unless exists? 44 + raise_no_satellite unless exists?
39 45
40 File.open(lock_file, "w+") do |f| 46 File.open(lock_file, "w+") do |f|
41 f.flock(File::LOCK_EX) 47 f.flock(File::LOCK_EX)
@@ -55,7 +61,7 @@ module Gitlab @@ -55,7 +61,7 @@ module Gitlab
55 end 61 end
56 62
57 def repo 63 def repo
58 - raise "Satellite doesn't exist" unless exists? 64 + raise_no_satellite unless exists?
59 65
60 @repo ||= Grit::Repo.new(path) 66 @repo ||= Grit::Repo.new(path)
61 end 67 end