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" | ... | ... |