From 81eacd1b2a591d3ce1f14d4119527ea9b290ba8f Mon Sep 17 00:00:00 2001
From: Ciro Santilli <ciro.santilli@gmail.com>
Date: Sun, 28 Sep 2014 11:02:29 +0200
Subject: [PATCH] Disable / hide MR edit blob button if cannot edit.

---
 app/helpers/tree_helper.rb                 | 31 ++++++++++++++++++----
 app/views/projects/blob/_actions.html.haml |  8 +-----
 app/views/projects/diffs/_file.html.haml   |  6 ++---
 3 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb
index d815257a4e3..7d616589519 100644
--- a/app/helpers/tree_helper.rb
+++ b/app/helpers/tree_helper.rb
@@ -53,13 +53,34 @@ module TreeHelper
     File.join(*args)
   end
 
-  def allowed_tree_edit?
-    return false unless @repository.branch_names.include?(@ref)
+  def allowed_tree_edit?(project = nil, ref = nil)
+    project ||= @project
+    ref ||= @ref
+    return false unless project.repository.branch_names.include?(ref)
 
-    if @project.protected_branch? @ref
-      can?(current_user, :push_code_to_protected_branches, @project)
+    if project.protected_branch? ref
+      can?(current_user, :push_code_to_protected_branches, project)
     else
-      can?(current_user, :push_code, @project)
+      can?(current_user, :push_code, project)
+    end
+  end
+
+  def edit_blob_link(project, ref, path, options = {})
+    if project.repository.blob_at(ref, path).text?
+      text = 'Edit'
+      after = options[:after] || ''
+      from_mr = options[:from_merge_request_id]
+      link_opts = {}
+      link_opts[:from_merge_request_id] = from_mr if from_mr
+      cls = 'btn btn-small'
+      if allowed_tree_edit?(project, ref)
+        link_to text, project_edit_tree_path(project, tree_join(ref, path),
+                                             link_opts), class: cls
+      else
+        content_tag :span, text, class: cls + ' disabled'
+      end + after.html_safe
+    else
+      ''
     end
   end
 
diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml
index 64c19a57803..d8e190417af 100644
--- a/app/views/projects/blob/_actions.html.haml
+++ b/app/views/projects/blob/_actions.html.haml
@@ -1,11 +1,5 @@
 .btn-group.tree-btn-group
-  -# only show edit link for text files
-  - if @blob.text?
-    - if allowed_tree_edit?
-      = link_to 'Edit', project_edit_tree_path(@project, @id),
-          class: 'btn btn-small'
-    - else
-      %span.btn.btn-small.disabled Edit
+  = edit_blob_link(@project, @ref, @path)
   = link_to 'Raw', project_raw_path(@project, @id),
       class: 'btn btn-small', target: '_blank'
   -# only show normal/blame view links for text files
diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml
index 751df6a02e9..fc1faf73854 100644
--- a/app/views/projects/diffs/_file.html.haml
+++ b/app/views/projects/diffs/_file.html.haml
@@ -27,9 +27,9 @@
           &nbsp;
 
         - if @merge_request && @merge_request.source_project
-          = link_to project_edit_tree_path(@merge_request.source_project, tree_join(@merge_request.source_branch, diff_file.new_path), from_merge_request_id: @merge_request.id), { class: 'btn btn-small' } do
-            Edit
-          &nbsp;
+          = edit_blob_link(@merge_request.source_project,
+              @merge_request.source_branch, diff_file.new_path,
+              after: '&nbsp;', from_merge_request_id: @merge_request.id)
 
         = view_file_btn(@commit.id, diff_file, project)
 
-- 
GitLab