Auto-merge: checking via AJAX

This commit is contained in:
Valery Sizov 2012-04-16 22:08:03 +03:00
parent f145450415
commit 8269a3a735
6 changed files with 43 additions and 10 deletions

View file

@ -1,9 +1,19 @@
var MergeRequest = { var MergeRequest = {
diffs_loaded: false, diffs_loaded: false,
commits_loaded: false, commits_loaded: false,
opts: false,
init: init:
function() { function(opts) {
this.opts = opts;
if($(".automerge_widget").lenght){
$.get(opts.url_to_automerge_check, function(data){
$(".automerge_widget").hide();
$(".automerge_widget." + data.state).show();
}, "json");
}
$(".tabs a").live("click", function() { $(".tabs a").live("click", function() {
$(".tabs a").parent().removeClass("active"); $(".tabs a").parent().removeClass("active");
$(this).parent().addClass("active"); $(this).parent().addClass("active");

View file

@ -2,7 +2,7 @@ class MergeRequestsController < ApplicationController
before_filter :authenticate_user! before_filter :authenticate_user!
before_filter :project before_filter :project
before_filter :module_enabled before_filter :module_enabled
before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge] before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge, :automerge_check]
layout "project" layout "project"
# Authorize # Authorize
@ -45,10 +45,6 @@ class MergeRequestsController < ApplicationController
# or from cache if already merged # or from cache if already merged
@commits = @merge_request.commits @commits = @merge_request.commits
if @merge_request.unchecked?
@merge_request.check_if_can_be_merged
end
respond_to do |format| respond_to do |format|
format.html format.html
format.js format.js
@ -100,6 +96,13 @@ class MergeRequestsController < ApplicationController
end end
end end
def automerge_check
if @merge_request.unchecked?
@merge_request.check_if_can_be_merged
end
render :json => {:state => @merge_request.human_state}
end
def automerge def automerge
render_404 unless @merge_request.open? && @merge_request.can_be_merged? render_404 unless @merge_request.open? && @merge_request.can_be_merged?
return access_denied! unless can?(current_user, :accept_mr, @project) return access_denied! unless can?(current_user, :accept_mr, @project)

View file

@ -49,6 +49,15 @@ class MergeRequest < ActiveRecord::Base
where("source_branch like :branch or target_branch like :branch", :branch => branch_name) where("source_branch like :branch or target_branch like :branch", :branch => branch_name)
end end
def human_state
states = {
CAN_BE_MERGED => "can_be_merged",
CANNOT_BE_MERGED => "cannot_be_merged",
UNCHECKED => "unchecked"
}
states[self.state]
end
def validate_branches def validate_branches
if target_branch == source_branch if target_branch == source_branch
errors.add :base, "You can not use same branch for source and target branches" errors.add :base, "You can not use same branch for source and target branches"

View file

@ -54,19 +54,26 @@
- if @merge_request.open? && @commits.any? && can?(current_user, :accept_mr, @project) - if @merge_request.open? && @commits.any? && can?(current_user, :accept_mr, @project)
- if @merge_request.can_be_merged? .automerge_widget.can_be_merged{:style => "display:none"}
.ui-box.padded .ui-box.padded
%p %p
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 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
= link_to "Accept Merge Request", automerge_project_merge_request_path(@project, @merge_request), :class => "btn small info accept_merge_request", :remote => true = link_to "Accept Merge Request", automerge_project_merge_request_path(@project, @merge_request), :class => "btn small info accept_merge_request", :remote => true
&nbsp; &nbsp;
- else .automerge_widget.cannot_be_merged{:style => "display:none"}
.alert-message .alert-message
%p %p
%strong This request cant be merged with GitLab. You should do it manually &nbsp; %strong This request cant be merged with GitLab. You should do it manually &nbsp;
= link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge" = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge"
.automerge_widget.unchecked
.alert-message
%p
%strong Checking for ability to automatically merge…
= render "merge_requests/commits" = render "merge_requests/commits"
@ -87,7 +94,9 @@
:javascript :javascript
$(function(){ $(function(){
MergeRequest.init(); MergeRequest.init({
url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
});
$(".accept_merge_request").live("ajax:beforeSend", function() { $(".accept_merge_request").live("ajax:beforeSend", function() {
$(this).replaceWith('#{image_tag "ajax_loader.gif"}'); $(this).replaceWith('#{image_tag "ajax_loader.gif"}');

View file

@ -103,6 +103,7 @@ Gitlab::Application.routes.draw do
member do member do
get :diffs get :diffs
get :automerge get :automerge
get :automerge_check
end end
collection do collection do

View file

@ -29,6 +29,7 @@ class GitlabMerge
def pull def pull
self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path) self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path)
#TODO When user do not have permissions then raise exception
Dir.chdir(merge_path) do Dir.chdir(merge_path) do
merge_repo = Grit::Repo.new('.') merge_repo = Grit::Repo.new('.')
merge_repo.git.sh "git config user.name \"#{user.name}\"" merge_repo.git.sh "git config user.name \"#{user.name}\""