Commit 8269a3a735d6b1195ef0263716845ef3d2ab3327

Authored by Valery Sizov
1 parent f1454504

Auto-merge: checking via AJAX

app/assets/javascripts/merge_requests.js
1 1 var MergeRequest = {
2 2 diffs_loaded: false,
3 3 commits_loaded: false,
  4 + opts: false,
4 5  
5 6 init:
6   - function() {
  7 + function(opts) {
  8 + this.opts = opts;
  9 +
  10 + if($(".automerge_widget").lenght){
  11 + $.get(opts.url_to_automerge_check, function(data){
  12 + $(".automerge_widget").hide();
  13 + $(".automerge_widget." + data.state).show();
  14 + }, "json");
  15 + }
  16 +
7 17 $(".tabs a").live("click", function() {
8 18 $(".tabs a").parent().removeClass("active");
9 19 $(this).parent().addClass("active");
... ...
app/controllers/merge_requests_controller.rb
... ... @@ -2,7 +2,7 @@ class MergeRequestsController < ApplicationController
2 2 before_filter :authenticate_user!
3 3 before_filter :project
4 4 before_filter :module_enabled
5   - before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge]
  5 + before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge, :automerge_check]
6 6 layout "project"
7 7  
8 8 # Authorize
... ... @@ -45,10 +45,6 @@ class MergeRequestsController < ApplicationController
45 45 # or from cache if already merged
46 46 @commits = @merge_request.commits
47 47  
48   - if @merge_request.unchecked?
49   - @merge_request.check_if_can_be_merged
50   - end
51   -
52 48 respond_to do |format|
53 49 format.html
54 50 format.js
... ... @@ -100,6 +96,13 @@ class MergeRequestsController < ApplicationController
100 96 end
101 97 end
102 98  
  99 + def automerge_check
  100 + if @merge_request.unchecked?
  101 + @merge_request.check_if_can_be_merged
  102 + end
  103 + render :json => {:state => @merge_request.human_state}
  104 + end
  105 +
103 106 def automerge
104 107 render_404 unless @merge_request.open? && @merge_request.can_be_merged?
105 108 return access_denied! unless can?(current_user, :accept_mr, @project)
... ...
app/models/merge_request.rb
... ... @@ -49,6 +49,15 @@ class MergeRequest < ActiveRecord::Base
49 49 where("source_branch like :branch or target_branch like :branch", :branch => branch_name)
50 50 end
51 51  
  52 + def human_state
  53 + states = {
  54 + CAN_BE_MERGED => "can_be_merged",
  55 + CANNOT_BE_MERGED => "cannot_be_merged",
  56 + UNCHECKED => "unchecked"
  57 + }
  58 + states[self.state]
  59 + end
  60 +
52 61 def validate_branches
53 62 if target_branch == source_branch
54 63 errors.add :base, "You can not use same branch for source and target branches"
... ...
app/views/merge_requests/show.html.haml
... ... @@ -54,18 +54,25 @@
54 54  
55 55  
56 56 - if @merge_request.open? && @commits.any? && can?(current_user, :accept_mr, @project)
57   - - if @merge_request.can_be_merged?
  57 + .automerge_widget.can_be_merged{:style => "display:none"}
58 58 .ui-box.padded
59 59 %p
60 60 You can accept this request automatically. If you still want to do it manually - #{link_to "click here", "#", :class => "how_to_merge_link vlink", :title => "How To Merge"} for instructions
61 61 = link_to "Accept Merge Request", automerge_project_merge_request_path(@project, @merge_request), :class => "btn small info accept_merge_request", :remote => true
62 62  
63   -
64   - - else
  63 +
  64 + .automerge_widget.cannot_be_merged{:style => "display:none"}
65 65 .alert-message
66 66 %p
67 67 %strong This request cant be merged with GitLab. You should do it manually  
68 68 = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge"
  69 +
  70 + .automerge_widget.unchecked
  71 + .alert-message
  72 + %p
  73 + %strong Checking for ability to automatically merge…
  74 +
  75 +
69 76  
70 77  
71 78 = render "merge_requests/commits"
... ... @@ -87,7 +94,9 @@
87 94  
88 95 :javascript
89 96 $(function(){
90   - MergeRequest.init();
  97 + MergeRequest.init({
  98 + url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
  99 + });
91 100  
92 101 $(".accept_merge_request").live("ajax:beforeSend", function() {
93 102 $(this).replaceWith('#{image_tag "ajax_loader.gif"}');
... ...
config/routes.rb
... ... @@ -103,6 +103,7 @@ Gitlab::Application.routes.draw do
103 103 member do
104 104 get :diffs
105 105 get :automerge
  106 + get :automerge_check
106 107 end
107 108  
108 109 collection do
... ...
lib/gitlab_merge.rb
... ... @@ -29,6 +29,7 @@ class GitlabMerge
29 29  
30 30 def pull
31 31 self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path)
  32 + #TODO When user do not have permissions then raise exception
32 33 Dir.chdir(merge_path) do
33 34 merge_repo = Grit::Repo.new('.')
34 35 merge_repo.git.sh "git config user.name \"#{user.name}\""
... ...