Commit 160bd862bede180faf66de7e5b09300347c24279

Authored by Dmitriy Zaporozhets
1 parent f61850e6

Refactoring for EditTree and NewTree controllers and contexts

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/contexts/files/update_context.rb 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +module Files
  2 + class UpdateContext < BaseContext
  3 + def execute
  4 + allowed = if project.protected_branch?(ref)
  5 + can?(current_user, :push_code_to_protected_branches, project)
  6 + else
  7 + can?(current_user, :push_code, project)
  8 + end
  9 +
  10 + unless allowed
  11 + return error("You are not allowed to push into this branch")
  12 + end
  13 +
  14 + unless repository.branch_names.include?(ref)
  15 + return error("You can only create files if you are on top of a branch")
  16 + end
  17 +
  18 + blob = repository.blob_at(ref, path)
  19 +
  20 + unless blob
  21 + return error("You can only edit text files")
  22 + end
  23 +
  24 + new_file_action = Gitlab::Satellite::EditFileAction.new(current_user, project, ref, path)
  25 + created_successfully = new_file_action.commit!(
  26 + params[:content],
  27 + params[:commit_message],
  28 + params[:last_commit]
  29 + )
  30 +
  31 + if created_successfully
  32 + success
  33 + else
  34 + error("Your changes could not be commited, because the file has been changed")
  35 + end
  36 + end
  37 + end
  38 +end
app/controllers/projects/application_controller.rb
@@ -23,4 +23,10 @@ class Projects::ApplicationController &lt; ApplicationController @@ -23,4 +23,10 @@ class Projects::ApplicationController &lt; ApplicationController
23 'public_projects' 23 'public_projects'
24 end 24 end
25 end 25 end
  26 +
  27 + def require_branch_head
  28 + unless @repository.branch_names.include?(@ref)
  29 + redirect_to project_tree_path(@project, @ref), notice: "This action is not allowed unless you are on top of a branch"
  30 + end
  31 + end
26 end 32 end
app/controllers/projects/base_tree_controller.rb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +class Projects::BaseTreeController < Projects::ApplicationController
  2 + include ExtractsPath
  3 +
  4 + before_filter :authorize_read_project!
  5 + before_filter :authorize_code_access!
  6 + before_filter :require_non_empty_project
  7 +end
  8 +
app/controllers/projects/edit_tree_controller.rb
1 -# Controller for edit a repository's file  
2 -class Projects::EditTreeController < Projects::ApplicationController  
3 - include ExtractsPath  
4 -  
5 - # Authorize  
6 - before_filter :authorize_read_project!  
7 - before_filter :authorize_code_access!  
8 - before_filter :require_non_empty_project  
9 -  
10 - before_filter :edit_requirements, only: [:show, :update] 1 +class Projects::EditTreeController < Projects::BaseTreeController
  2 + before_filter :require_branch_head
  3 + before_filter :blob
11 4
12 def show 5 def show
13 @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha 6 @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha
14 end 7 end
15 8
16 def update 9 def update
17 - edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path)  
18 - updated_successfully = edit_file_action.commit!(  
19 - params[:content],  
20 - params[:commit_message],  
21 - params[:last_commit]  
22 - ) 10 + result = Files::UpdateContext.new(@project, current_user, params, @ref, @path).execute
23 11
24 - if updated_successfully  
25 - redirect_to project_blob_path(@project, @id), notice: "Your changes have been successfully commited" 12 + if result[:status] == :success
  13 + flash[:notice] = "Your changes have been successfully commited"
  14 + redirect_to project_blob_path(@project, @id)
26 else 15 else
27 - flash[:notice] = "Your changes could not be commited, because the file has been changed" 16 + flash[:alert] = result[:error]
28 render :show 17 render :show
29 end 18 end
30 end 19 end
31 20
32 private 21 private
33 22
34 - def edit_requirements  
35 - @blob = @repository.blob_at(@commit.id, @path)  
36 -  
37 - unless @blob  
38 - redirect_to project_blob_path(@project, @id), notice: "You can only edit text files"  
39 - end  
40 -  
41 - allowed = if project.protected_branch? @ref  
42 - can?(current_user, :push_code_to_protected_branches, project)  
43 - else  
44 - can?(current_user, :push_code, project)  
45 - end  
46 -  
47 - return access_denied! unless allowed  
48 -  
49 - unless @repository.branch_names.include?(@ref)  
50 - redirect_to project_blob_path(@project, @id), notice: "You can only edit this file if you are on top of a branch"  
51 - end 23 + def blob
  24 + @blob ||= @repository.blob_at(@commit.id, @path)
52 end 25 end
53 end 26 end
app/controllers/projects/new_tree_controller.rb
1 -class Projects::NewTreeController < Projects::ApplicationController  
2 - include ExtractsPath  
3 -  
4 - # Authorize  
5 - before_filter :authorize_read_project!  
6 - before_filter :authorize_code_access!  
7 - before_filter :require_non_empty_project 1 +class Projects::NewTreeController < Projects::BaseTreeController
  2 + before_filter :require_branch_head
8 3
9 def show 4 def show
10 end 5 end
app/controllers/projects/tree_controller.rb
1 # Controller for viewing a repository's file structure 1 # Controller for viewing a repository's file structure
2 -class Projects::TreeController < Projects::ApplicationController  
3 - include ExtractsPath  
4 -  
5 - # Authorize  
6 - before_filter :authorize_read_project!  
7 - before_filter :authorize_code_access!  
8 - before_filter :require_non_empty_project  
9 - 2 +class Projects::TreeController < Projects::BaseTreeController
10 def show 3 def show
11 return not_found! if tree.entries.empty? 4 return not_found! if tree.entries.empty?
12 5