abilities.allowed?(object, action, subject)
end
end
-
--- /dev/null
+module Files
+ class BaseContext < ::BaseContext
+ attr_reader :ref, :path
+
+ def initialize(project, user, params, ref, path = nil)
+ @project, @current_user, @params = project, user, params.dup
+ @ref = ref
+ @path = path
+ end
+
+ private
+
+ def error(message)
+ {
+ error: message,
+ status: :error
+ }
+ end
+
+ def success
+ {
+ error: '',
+ status: :success
+ }
+ end
+
+ def repository
+ project.repository
+ end
+ end
+end
--- /dev/null
+module Files
+ class CreateContext < BaseContext
+ def execute
+ allowed = if project.protected_branch?(ref)
+ can?(current_user, :push_code_to_protected_branches, project)
+ else
+ can?(current_user, :push_code, project)
+ end
+
+ unless allowed
+ return error("You are not allowed to create file in this branch")
+ end
+
+ unless repository.branch_names.include?(ref)
+ return error("You can only create files if you are on top of a branch")
+ end
+
+ file_name = params[:file_name]
+
+ unless file_name =~ Gitlab::Regex.path_regex
+ return error("Your changes could not be commited, because file name contains not allowed characters")
+ end
+
+ file_path = if path.blank?
+ file_name
+ else
+ File.join(path, file_name)
+ end
+
+ blob = repository.blob_at(ref, file_path)
+
+ if blob
+ return error("Your changes could not be commited, because file with such name exists")
+ end
+
+ new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, project, ref, path)
+ created_successfully = new_file_action.commit!(
+ params[:content],
+ params[:commit_message],
+ file_name,
+ )
+
+ if created_successfully
+ success
+ else
+ error("Your changes could not be commited, because the file has been changed")
+ end
+ end
+ end
+end
before_filter :authorize_code_access!
before_filter :require_non_empty_project
- before_filter :create_requirements, only: [:show, :update]
-
def show
end
def update
- file_name = params[:file_name]
-
- unless file_name =~ Gitlab::Regex.path_regex
- flash[:notice] = "Your changes could not be commited, because file name contains not allowed characters"
- render :show and return
- end
-
- file_path = if @path.blank?
- file_name
- else
- File.join(@path, file_name)
- end
-
- blob = @repository.blob_at(@commit.id, file_path)
-
- if blob
- flash[:notice] = "Your changes could not be commited, because file with such name exists"
- render :show and return
- end
+ result = Files::CreateContext.new(@project, current_user, params, @ref, @path).execute
- new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, @project, @ref, @path)
- updated_successfully = new_file_action.commit!(
- params[:content],
- params[:commit_message],
- file_name,
- )
-
- if updated_successfully
- redirect_to project_blob_path(@project, File.join(@id, params[:file_name])), notice: "Your changes have been successfully commited"
+ if result[:status] == :success
+ flash[:notice] = "Your changes have been successfully commited"
+ redirect_to project_blob_path(@project, File.join(@id, params[:file_name]))
else
- flash[:notice] = "Your changes could not be commited, because the file has been changed"
+ flash[:alert] = result[:error]
render :show
end
end
-
- private
-
- def create_requirements
- allowed = if project.protected_branch? @ref
- can?(current_user, :push_code_to_protected_branches, project)
- else
- can?(current_user, :push_code, project)
- end
-
- return access_denied! unless allowed
-
- unless @repository.branch_names.include?(@ref)
- redirect_to project_blob_path(@project, @id), notice: "You can only create files if you are on top of a branch"
- end
- end
end
.controls
%span.monospace= @path[-1] == "/" ? @path : @path + "/"
- = text_field_tag 'file_name', '', placeholder: "sample.rb", required: true
+ = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", required: true
%span
on
= label_tag 'commit_message', class: "control-label" do
Commit message
.controls
- = text_area_tag 'commit_message', '', placeholder: "Added new file", required: true, rows: 3
+ = text_area_tag 'commit_message', params[:commit_message], placeholder: "Added new file", required: true, rows: 3
.file-holder
.file-title
%i.icon-file
.file-content.code
- %pre#editor= ""
+ %pre#editor= params[:content]
.form-actions
= hidden_field_tag 'content', '', id: "file-content"