Commit f61850e6e3521073f49f1cfe429b7fe49f3b44f0
1 parent
f2eb6683
Exists in
master
and in
4 other branches
Move part of file creation logic into separate context
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
5 changed files
with
89 additions
and
51 deletions
Show diff stats
app/contexts/base_context.rb
| ... | ... | @@ -0,0 +1,31 @@ |
| 1 | +module Files | |
| 2 | + class BaseContext < ::BaseContext | |
| 3 | + attr_reader :ref, :path | |
| 4 | + | |
| 5 | + def initialize(project, user, params, ref, path = nil) | |
| 6 | + @project, @current_user, @params = project, user, params.dup | |
| 7 | + @ref = ref | |
| 8 | + @path = path | |
| 9 | + end | |
| 10 | + | |
| 11 | + private | |
| 12 | + | |
| 13 | + def error(message) | |
| 14 | + { | |
| 15 | + error: message, | |
| 16 | + status: :error | |
| 17 | + } | |
| 18 | + end | |
| 19 | + | |
| 20 | + def success | |
| 21 | + { | |
| 22 | + error: '', | |
| 23 | + status: :success | |
| 24 | + } | |
| 25 | + end | |
| 26 | + | |
| 27 | + def repository | |
| 28 | + project.repository | |
| 29 | + end | |
| 30 | + end | |
| 31 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,50 @@ |
| 1 | +module Files | |
| 2 | + class CreateContext < 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 create file in 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 | + file_name = params[:file_name] | |
| 19 | + | |
| 20 | + unless file_name =~ Gitlab::Regex.path_regex | |
| 21 | + return error("Your changes could not be commited, because file name contains not allowed characters") | |
| 22 | + end | |
| 23 | + | |
| 24 | + file_path = if path.blank? | |
| 25 | + file_name | |
| 26 | + else | |
| 27 | + File.join(path, file_name) | |
| 28 | + end | |
| 29 | + | |
| 30 | + blob = repository.blob_at(ref, file_path) | |
| 31 | + | |
| 32 | + if blob | |
| 33 | + return error("Your changes could not be commited, because file with such name exists") | |
| 34 | + end | |
| 35 | + | |
| 36 | + new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, project, ref, path) | |
| 37 | + created_successfully = new_file_action.commit!( | |
| 38 | + params[:content], | |
| 39 | + params[:commit_message], | |
| 40 | + file_name, | |
| 41 | + ) | |
| 42 | + | |
| 43 | + if created_successfully | |
| 44 | + success | |
| 45 | + else | |
| 46 | + error("Your changes could not be commited, because the file has been changed") | |
| 47 | + end | |
| 48 | + end | |
| 49 | + end | |
| 50 | +end | ... | ... |
app/controllers/projects/new_tree_controller.rb
| ... | ... | @@ -6,60 +6,18 @@ class Projects::NewTreeController < Projects::ApplicationController |
| 6 | 6 | before_filter :authorize_code_access! |
| 7 | 7 | before_filter :require_non_empty_project |
| 8 | 8 | |
| 9 | - before_filter :create_requirements, only: [:show, :update] | |
| 10 | - | |
| 11 | 9 | def show |
| 12 | 10 | end |
| 13 | 11 | |
| 14 | 12 | def update |
| 15 | - file_name = params[:file_name] | |
| 16 | - | |
| 17 | - unless file_name =~ Gitlab::Regex.path_regex | |
| 18 | - flash[:notice] = "Your changes could not be commited, because file name contains not allowed characters" | |
| 19 | - render :show and return | |
| 20 | - end | |
| 21 | - | |
| 22 | - file_path = if @path.blank? | |
| 23 | - file_name | |
| 24 | - else | |
| 25 | - File.join(@path, file_name) | |
| 26 | - end | |
| 27 | - | |
| 28 | - blob = @repository.blob_at(@commit.id, file_path) | |
| 29 | - | |
| 30 | - if blob | |
| 31 | - flash[:notice] = "Your changes could not be commited, because file with such name exists" | |
| 32 | - render :show and return | |
| 33 | - end | |
| 13 | + result = Files::CreateContext.new(@project, current_user, params, @ref, @path).execute | |
| 34 | 14 | |
| 35 | - new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, @project, @ref, @path) | |
| 36 | - updated_successfully = new_file_action.commit!( | |
| 37 | - params[:content], | |
| 38 | - params[:commit_message], | |
| 39 | - file_name, | |
| 40 | - ) | |
| 41 | - | |
| 42 | - if updated_successfully | |
| 43 | - redirect_to project_blob_path(@project, File.join(@id, params[:file_name])), notice: "Your changes have been successfully commited" | |
| 15 | + if result[:status] == :success | |
| 16 | + flash[:notice] = "Your changes have been successfully commited" | |
| 17 | + redirect_to project_blob_path(@project, File.join(@id, params[:file_name])) | |
| 44 | 18 | else |
| 45 | - flash[:notice] = "Your changes could not be commited, because the file has been changed" | |
| 19 | + flash[:alert] = result[:error] | |
| 46 | 20 | render :show |
| 47 | 21 | end |
| 48 | 22 | end |
| 49 | - | |
| 50 | - private | |
| 51 | - | |
| 52 | - def create_requirements | |
| 53 | - allowed = if project.protected_branch? @ref | |
| 54 | - can?(current_user, :push_code_to_protected_branches, project) | |
| 55 | - else | |
| 56 | - can?(current_user, :push_code, project) | |
| 57 | - end | |
| 58 | - | |
| 59 | - return access_denied! unless allowed | |
| 60 | - | |
| 61 | - unless @repository.branch_names.include?(@ref) | |
| 62 | - redirect_to project_blob_path(@project, @id), notice: "You can only create files if you are on top of a branch" | |
| 63 | - end | |
| 64 | - end | |
| 65 | 23 | end | ... | ... |
app/views/projects/new_tree/show.html.haml
| ... | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | .controls |
| 9 | 9 | %span.monospace= @path[-1] == "/" ? @path : @path + "/" |
| 10 | 10 | |
| 11 | - = text_field_tag 'file_name', '', placeholder: "sample.rb", required: true | |
| 11 | + = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", required: true | |
| 12 | 12 | %span |
| 13 | 13 | |
| 14 | 14 | on |
| ... | ... | @@ -18,13 +18,13 @@ |
| 18 | 18 | = label_tag 'commit_message', class: "control-label" do |
| 19 | 19 | Commit message |
| 20 | 20 | .controls |
| 21 | - = text_area_tag 'commit_message', '', placeholder: "Added new file", required: true, rows: 3 | |
| 21 | + = text_area_tag 'commit_message', params[:commit_message], placeholder: "Added new file", required: true, rows: 3 | |
| 22 | 22 | |
| 23 | 23 | .file-holder |
| 24 | 24 | .file-title |
| 25 | 25 | %i.icon-file |
| 26 | 26 | .file-content.code |
| 27 | - %pre#editor= "" | |
| 27 | + %pre#editor= params[:content] | |
| 28 | 28 | |
| 29 | 29 | .form-actions |
| 30 | 30 | = hidden_field_tag 'content', '', id: "file-content" | ... | ... |