summaryrefslogtreecommitdiff
path: root/app/controllers/projects/edit_tree_controller.rb
blob: 8976d7c7be85b45c0851d3437be385955289a518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Projects::EditTreeController < Projects::BaseTreeController
  before_filter :require_branch_head
  before_filter :blob
  before_filter :authorize_push!
  before_filter :from_merge_request
  before_filter :after_edit_path

  def show
    @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha
  end

  def update
    result = Files::UpdateService.
      new(@project, current_user, params, @ref, @path).execute

    if result[:status] == :success
      flash[:notice] = "Your changes have been successfully committed"

      if from_merge_request
        from_merge_request.reload_code
      end

      redirect_to after_edit_path
    else
      flash[:alert] = result[:error]
      render :show
    end
  end

  def preview
    @content = params[:content]

    diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3',
                            include_diff_info: true)
    @diff_lines = Gitlab::Diff::Parser.new.parse(diffy.diff.scan(/.*\n/))

    render layout: false
  end

  private

  def blob
    @blob ||= @repository.blob_at(@commit.id, @path)
  end

  def after_edit_path
    @after_edit_path ||=
      if from_merge_request
        diffs_project_merge_request_path(from_merge_request.target_project, from_merge_request) +
          "#file-path-#{hexdigest(@path)}"
      else
        project_blob_path(@project, @id)
      end
  end

  def from_merge_request
    # If blob edit was initiated from merge request page
    @from_merge_request ||= MergeRequest.find_by(id: params[:from_merge_request_id])
  end
end