Commit 5c5832cf authored by Sean McGivern's avatar Sean McGivern

Merge branch 'osw-41401-render-mr-commit-sha-instead-diffs-ee' into 'master'

[https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/18141 Port] Render MR commit SHA instead "diffs" when viable on GFM

See merge request gitlab-org/gitlab-ee!5224
parents dc360321 448cd057
---
title: Render MR commit SHA instead "diffs" when viable
merge_request:
author:
type: added
...@@ -171,7 +171,7 @@ module Banzai ...@@ -171,7 +171,7 @@ module Banzai
end end
if object if object
title = object_link_title(object) title = object_link_title(object, matches)
klass = reference_class(object_sym) klass = reference_class(object_sym)
data = data_attributes_for(link_content || match, parent, object, data = data_attributes_for(link_content || match, parent, object,
...@@ -216,7 +216,7 @@ module Banzai ...@@ -216,7 +216,7 @@ module Banzai
extras extras
end end
def object_link_title(object) def object_link_title(object, matches)
object.title object.title
end end
......
...@@ -34,7 +34,7 @@ module Banzai ...@@ -34,7 +34,7 @@ module Banzai
range.to_param.merge(only_path: context[:only_path])) range.to_param.merge(only_path: context[:only_path]))
end end
def object_link_title(range) def object_link_title(range, matches)
nil nil
end end
end end
......
...@@ -77,7 +77,7 @@ module Banzai ...@@ -77,7 +77,7 @@ module Banzai
CGI.unescapeHTML(text.to_s) CGI.unescapeHTML(text.to_s)
end end
def object_link_title(object) def object_link_title(object, matches)
# use title of wrapped element instead # use title of wrapped element instead
nil nil
end end
......
...@@ -17,10 +17,19 @@ module Banzai ...@@ -17,10 +17,19 @@ module Banzai
only_path: context[:only_path]) only_path: context[:only_path])
end end
def object_link_title(object, matches)
object_link_commit_title(object, matches) || super
end
def object_link_text_extras(object, matches) def object_link_text_extras(object, matches)
extras = super extras = super
if commit_ref = object_link_commit_ref(object, matches)
return extras.unshift(commit_ref)
end
path = matches[:path] if matches.names.include?("path") path = matches[:path] if matches.names.include?("path")
case path case path
when '/diffs' when '/diffs'
extras.unshift "diffs" extras.unshift "diffs"
...@@ -38,6 +47,36 @@ module Banzai ...@@ -38,6 +47,36 @@ module Banzai
.where(iid: ids.to_a) .where(iid: ids.to_a)
.includes(target_project: :namespace) .includes(target_project: :namespace)
end end
private
def object_link_commit_title(object, matches)
object_link_commit(object, matches)&.title
end
def object_link_commit_ref(object, matches)
object_link_commit(object, matches)&.short_id
end
def object_link_commit(object, matches)
return unless matches.names.include?('query') && query = matches[:query]
# Removes leading "?". CGI.parse expects "arg1&arg2&arg3"
params = CGI.parse(query.sub(/^\?/, ''))
return unless commit_sha = params['commit_id']&.first
if commit = find_commit_by_sha(object, commit_sha)
Commit.from_hash(commit.to_hash, object.project)
end
end
def find_commit_by_sha(object, commit_sha)
@all_commits ||= {}
@all_commits[object.id] ||= object.all_commits
@all_commits[object.id].find { |commit| commit.sha == commit_sha }
end
end end
end end
end end
...@@ -84,7 +84,7 @@ module Banzai ...@@ -84,7 +84,7 @@ module Banzai
end end
end end
def object_link_title(object) def object_link_title(object, matches)
nil nil
end end
end end
......
...@@ -196,6 +196,41 @@ describe Banzai::Filter::MergeRequestReferenceFilter do ...@@ -196,6 +196,41 @@ describe Banzai::Filter::MergeRequestReferenceFilter do
end end
end end
context 'URL reference for a commit' do
let(:mr) { create(:merge_request, :with_diffs) }
let(:reference) do
urls.project_merge_request_url(mr.project, mr) + "/diffs?commit_id=#{mr.diff_head_sha}"
end
let(:commit) { mr.commits.find { |commit| commit.sha == mr.diff_head_sha } }
it 'links to a valid reference' do
doc = reference_filter("See #{reference}")
expect(doc.css('a').first.attr('href'))
.to eq reference
end
it 'has valid text' do
doc = reference_filter("See #{reference}")
expect(doc.text).to eq("See #{mr.to_reference(full: true)} (#{commit.short_id})")
end
it 'has valid title attribute' do
doc = reference_filter("See #{reference}")
expect(doc.css('a').first.attr('title')).to eq(commit.title)
end
it 'ignores invalid commit short_ids on link text' do
invalidate_commit_reference =
urls.project_merge_request_url(mr.project, mr) + "/diffs?commit_id=12345678"
doc = reference_filter("See #{invalidate_commit_reference}")
expect(doc.text).to eq("See #{mr.to_reference(full: true)} (diffs)")
end
end
context 'cross-project URL reference' do context 'cross-project URL reference' do
let(:namespace) { create(:namespace, name: 'cross-reference') } let(:namespace) { create(:namespace, name: 'cross-reference') }
let(:project2) { create(:project, :public, namespace: namespace) } let(:project2) { create(:project, :public, namespace: namespace) }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment