merge_requests_controller.rb 3.76 KB
Newer Older
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
1 2 3
class MergeRequestsController < ApplicationController
  before_filter :authenticate_user!
  before_filter :project
4
  before_filter :module_enabled
5
  before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs]
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
6 7 8 9
  layout "project"

  # Authorize
  before_filter :add_project_abilities
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
10 11 12 13 14 15 16 17 18 19 20 21

  # Allow read any merge_request
  before_filter :authorize_read_merge_request!

  # Allow write(create) merge_request
  before_filter :authorize_write_merge_request!, :only => [:new, :create]

  # Allow modify merge_request
  before_filter :authorize_modify_merge_request!, :only => [:close, :edit, :update, :sort]

  # Allow destroy merge_request
  before_filter :authorize_admin_merge_request!, :only => [:destroy]
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
22 23

  def index
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
24
    @merge_requests = @project.merge_requests
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
25 26

    @merge_requests = case params[:f].to_i
27
                      when 1 then @merge_requests
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
28
                      when 2 then @merge_requests.closed
Andrey Janzen's avatar
Andrey Janzen committed
29
                      when 3 then @merge_requests.opened.assigned(current_user)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
30
                      else @merge_requests.opened
31
                      end.page(params[:page]).per(20)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
32

33
    @merge_requests = @merge_requests.includes(:author, :project).order("created_at desc")
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
34 35 36 37 38
  end

  def show
    unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch) && 
      @project.repo.heads.map(&:name).include?(@merge_request.source_branch)
39
      git_not_found! and return 
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
40 41
    end

42 43
    @note = @project.notes.new(:noteable => @merge_request)

44 45 46
    # Get commits from repository 
    # or from cache if already merged
    @commits = @merge_request.commits
47

48 49
    respond_to do |format|
      format.html
50
      format.js
51 52 53 54
    end
  end

  def diffs
55 56
    @diffs = @merge_request.diffs
    @commit = @merge_request.last_commit
57 58 59

    @comments_allowed = true
    @line_notes = @merge_request.notes.where("line_code is not null")
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
  end

  def new
    @merge_request = @project.merge_requests.new
  end

  def edit
  end

  def create
    @merge_request = @project.merge_requests.new(params[:merge_request])
    @merge_request.author = current_user

    respond_to do |format|
      if @merge_request.save
75
        @merge_request.reload_code
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
76 77 78 79 80 81 82 83 84 85 86
        format.html { redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.' }
        format.json { render json: @merge_request, status: :created, location: @merge_request }
      else
        format.html { render action: "new" }
        format.json { render json: @merge_request.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
87
      if @merge_request.update_attributes(params[:merge_request].merge(:author_id_of_changes => current_user.id))
88
        @merge_request.reload_code
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
        format.html { redirect_to [@project, @merge_request], notice: 'Merge request was successfully updated.' }
        format.json { head :ok }
      else
        format.html { render action: "edit" }
        format.json { render json: @merge_request.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @merge_request.destroy

    respond_to do |format|
      format.html { redirect_to project_merge_requests_url(@project) }
      format.json { head :ok }
    end
  end

107 108 109 110 111 112 113 114
  def branch_from
    @commit = project.commit(params[:ref])
  end

  def branch_to
    @commit = project.commit(params[:ref])
  end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
115 116 117 118 119
  protected

  def merge_request
    @merge_request ||= @project.merge_requests.find(params[:id])
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
120 121

  def authorize_modify_merge_request!
122
    return render_404 unless can?(current_user, :modify_merge_request, @merge_request)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
123 124 125
  end

  def authorize_admin_merge_request!
126
    return render_404 unless can?(current_user, :admin_merge_request, @merge_request)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
127
  end
128 129 130 131

  def module_enabled
    return render_404 unless @project.merge_requests_enabled
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
132
end