Commit 29b0ac489b7dea0bab97b25cf34a3b2d44fcd069
1 parent
b6641d69
Exists in
master
and in
4 other branches
move edit to separate controller. This fixes #3265
Showing
6 changed files
with
94 additions
and
84 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,47 @@ |
| 1 | +# Controller for edit a repository's file | |
| 2 | +class EditTreeController < ProjectResourceController | |
| 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: [:edit, :update] | |
| 11 | + | |
| 12 | + def show | |
| 13 | + @last_commit = @project.repository.last_commit_for(@ref, @path).sha | |
| 14 | + end | |
| 15 | + | |
| 16 | + 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 | + ) | |
| 23 | + | |
| 24 | + if updated_successfully | |
| 25 | + redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited" | |
| 26 | + else | |
| 27 | + flash[:notice] = "Your changes could not be commited, because the file has been changed" | |
| 28 | + render :edit | |
| 29 | + end | |
| 30 | + end | |
| 31 | + | |
| 32 | + private | |
| 33 | + | |
| 34 | + def edit_requirements | |
| 35 | + unless @tree.is_blob? && @tree.text? | |
| 36 | + redirect_to project_tree_path(@project, @id), notice: "You can only edit text files" | |
| 37 | + end | |
| 38 | + | |
| 39 | + allowed = if project.protected_branch? @ref | |
| 40 | + can?(current_user, :push_code_to_protected_branches, project) | |
| 41 | + else | |
| 42 | + can?(current_user, :push_code, project) | |
| 43 | + end | |
| 44 | + | |
| 45 | + return access_denied! unless allowed | |
| 46 | + end | |
| 47 | +end | ... | ... |
app/controllers/tree_controller.rb
| ... | ... | @@ -7,8 +7,6 @@ class TreeController < ProjectResourceController |
| 7 | 7 | before_filter :authorize_code_access! |
| 8 | 8 | before_filter :require_non_empty_project |
| 9 | 9 | |
| 10 | - before_filter :edit_requirements, only: [:edit, :update] | |
| 11 | - | |
| 12 | 10 | def show |
| 13 | 11 | @hex_path = Digest::SHA1.hexdigest(@path) |
| 14 | 12 | @logs_path = logs_file_project_ref_path(@project, @ref, @path) |
| ... | ... | @@ -19,40 +17,4 @@ class TreeController < ProjectResourceController |
| 19 | 17 | format.js { no_cache_headers } |
| 20 | 18 | end |
| 21 | 19 | end |
| 22 | - | |
| 23 | - def edit | |
| 24 | - @last_commit = @project.repository.last_commit_for(@ref, @path).sha | |
| 25 | - end | |
| 26 | - | |
| 27 | - def update | |
| 28 | - edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path) | |
| 29 | - updated_successfully = edit_file_action.commit!( | |
| 30 | - params[:content], | |
| 31 | - params[:commit_message], | |
| 32 | - params[:last_commit] | |
| 33 | - ) | |
| 34 | - | |
| 35 | - if updated_successfully | |
| 36 | - redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited" | |
| 37 | - else | |
| 38 | - flash[:notice] = "Your changes could not be commited, because the file has been changed" | |
| 39 | - render :edit | |
| 40 | - end | |
| 41 | - end | |
| 42 | - | |
| 43 | - private | |
| 44 | - | |
| 45 | - def edit_requirements | |
| 46 | - unless @tree.is_blob? && @tree.text? | |
| 47 | - redirect_to project_tree_path(@project, @id), notice: "You can only edit text files" | |
| 48 | - end | |
| 49 | - | |
| 50 | - allowed = if project.protected_branch? @ref | |
| 51 | - can?(current_user, :push_code_to_protected_branches, project) | |
| 52 | - else | |
| 53 | - can?(current_user, :push_code, project) | |
| 54 | - end | |
| 55 | - | |
| 56 | - return access_denied! unless allowed | |
| 57 | - end | |
| 58 | 20 | end | ... | ... |
| ... | ... | @@ -0,0 +1,44 @@ |
| 1 | +.file-editor | |
| 2 | + = form_tag(project_edit_tree_path(@project, @id), method: :put, class: "form-horizontal") do | |
| 3 | + .file_holder | |
| 4 | + .file_title | |
| 5 | + %i.icon-file | |
| 6 | + %span.file_name | |
| 7 | + = @tree.path | |
| 8 | + %small | |
| 9 | + on | |
| 10 | + %strong= @ref | |
| 11 | + %span.options | |
| 12 | + .btn-group.tree-btn-group | |
| 13 | + = link_to "Cancel", project_tree_path(@project, @id), class: "btn btn-tiny btn-cancel", confirm: "Are you sure?" | |
| 14 | + .file_content.code | |
| 15 | + %pre#editor= @tree.data | |
| 16 | + | |
| 17 | + .control-group.commit_message-group | |
| 18 | + = label_tag 'commit_message', class: "control-label" do | |
| 19 | + Commit message | |
| 20 | + .controls | |
| 21 | + = text_area_tag 'commit_message', '', placeholder: "Update #{@tree.name}", required: true, rows: 3 | |
| 22 | + .form-actions | |
| 23 | + = hidden_field_tag 'last_commit', @last_commit | |
| 24 | + = hidden_field_tag 'content', '', id: :file_content | |
| 25 | + .commit-button-annotation | |
| 26 | + = button_tag "Commit", class: 'btn commit-btn js-commit-button' | |
| 27 | + .message | |
| 28 | + to branch | |
| 29 | + %strong= @ref | |
| 30 | + = link_to "Cancel", project_tree_path(@project, @id), class: "btn btn-cancel", confirm: "Are you sure?" | |
| 31 | + | |
| 32 | +:javascript | |
| 33 | + var ace_mode = "#{@tree.language.try(:ace_mode)}"; | |
| 34 | + var editor = ace.edit("editor"); | |
| 35 | + if (ace_mode) { | |
| 36 | + editor.getSession().setMode('ace/mode/' + ace_mode); | |
| 37 | + } | |
| 38 | + | |
| 39 | + disableButtonIfEmptyField("#commit_message", ".js-commit-button"); | |
| 40 | + | |
| 41 | + $(".js-commit-button").click(function(){ | |
| 42 | + $("#file_content").val(editor.getValue()); | |
| 43 | + $(".file-editor form").submit(); | |
| 44 | + }); | ... | ... |
app/views/tree/_blob_actions.html.haml
| 1 | 1 | .btn-group.tree-btn-group |
| 2 | 2 | -# only show edit link for text files |
| 3 | 3 | - if @tree.text? |
| 4 | - = link_to "edit", edit_project_tree_path(@project, @id), class: "btn btn-tiny", disabled: !allowed_tree_edit? | |
| 4 | + = link_to "edit", project_edit_tree_path(@project, @id), class: "btn btn-tiny", disabled: !allowed_tree_edit? | |
| 5 | 5 | = link_to "raw", project_blob_path(@project, @id), class: "btn btn-tiny", target: "_blank" |
| 6 | 6 | -# only show normal/blame view links for text files |
| 7 | 7 | - if @tree.text? | ... | ... |
app/views/tree/edit.html.haml
| ... | ... | @@ -1,44 +0,0 @@ |
| 1 | -.file-editor | |
| 2 | - = form_tag(project_tree_path(@project, @id), method: :put, class: "form-horizontal") do | |
| 3 | - .file_holder | |
| 4 | - .file_title | |
| 5 | - %i.icon-file | |
| 6 | - %span.file_name | |
| 7 | - = @tree.path | |
| 8 | - %small | |
| 9 | - on | |
| 10 | - %strong= @ref | |
| 11 | - %span.options | |
| 12 | - .btn-group.tree-btn-group | |
| 13 | - = link_to "Cancel", project_tree_path(@project, @id), class: "btn btn-tiny btn-cancel", confirm: "Are you sure?" | |
| 14 | - .file_content.code | |
| 15 | - %pre#editor= @tree.data | |
| 16 | - | |
| 17 | - .control-group.commit_message-group | |
| 18 | - = label_tag 'commit_message', class: "control-label" do | |
| 19 | - Commit message | |
| 20 | - .controls | |
| 21 | - = text_area_tag 'commit_message', '', placeholder: "Update #{@tree.name}", required: true, rows: 3 | |
| 22 | - .form-actions | |
| 23 | - = hidden_field_tag 'last_commit', @last_commit | |
| 24 | - = hidden_field_tag 'content', '', id: :file_content | |
| 25 | - .commit-button-annotation | |
| 26 | - = button_tag "Commit", class: 'btn commit-btn js-commit-button' | |
| 27 | - .message | |
| 28 | - to branch | |
| 29 | - %strong= @ref | |
| 30 | - = link_to "Cancel", project_tree_path(@project, @id), class: "btn btn-cancel", confirm: "Are you sure?" | |
| 31 | - | |
| 32 | -:javascript | |
| 33 | - var ace_mode = "#{@tree.language.try(:ace_mode)}"; | |
| 34 | - var editor = ace.edit("editor"); | |
| 35 | - if (ace_mode) { | |
| 36 | - editor.getSession().setMode('ace/mode/' + ace_mode); | |
| 37 | - } | |
| 38 | - | |
| 39 | - disableButtonIfEmptyField("#commit_message", ".js-commit-button"); | |
| 40 | - | |
| 41 | - $(".js-commit-button").click(function(){ | |
| 42 | - $("#file_content").val(editor.getValue()); | |
| 43 | - $(".file-editor form").submit(); | |
| 44 | - }); |
config/routes.rb
| ... | ... | @@ -168,7 +168,8 @@ Gitlab::Application.routes.draw do |
| 168 | 168 | # |
| 169 | 169 | resources :projects, constraints: { id: /(?:[a-zA-Z.0-9_\-]+\/)?[a-zA-Z.0-9_\-]+/ }, except: [:new, :create, :index], path: "/" do |
| 170 | 170 | resources :blob, only: [:show], constraints: {id: /.+/} |
| 171 | - resources :tree, only: [:show, :edit, :update], constraints: {id: /.+/} | |
| 171 | + resources :tree, only: [:show], constraints: {id: /.+/, format: /(html|js)/ } | |
| 172 | + resources :edit_tree, only: [:show, :update], constraints: {id: /.+/}, path: 'edit' | |
| 172 | 173 | resources :commit, only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} |
| 173 | 174 | resources :commits, only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} |
| 174 | 175 | resources :compare, only: [:index, :create] | ... | ... |