Commit 045b4c8fcd3898bf66ac74acdf13cc079a104105
1 parent
23a8e599
Exists in
master
and in
4 other branches
replace user.name by user.username in GFM
Showing
3 changed files
with
34 additions
and
37 deletions
Show diff stats
lib/gitlab/markdown.rb
@@ -26,15 +26,19 @@ module Gitlab | @@ -26,15 +26,19 @@ module Gitlab | ||
26 | # => "<img alt=\":trollface:\" class=\"emoji\" src=\"/images/trollface.png" title=\":trollface:\" /> | 26 | # => "<img alt=\":trollface:\" class=\"emoji\" src=\"/images/trollface.png" title=\":trollface:\" /> |
27 | module Markdown | 27 | module Markdown |
28 | REFERENCE_PATTERN = %r{ | 28 | REFERENCE_PATTERN = %r{ |
29 | - (\W)? # Prefix (1) | ||
30 | - ( # Reference (2) | ||
31 | - @([\w\._]+) # User name (3) | ||
32 | - |[#!$](\d+) # Issue/MR/Snippet ID (4) | ||
33 | - |([\h]{6,40}) # Commit ID (5) | 29 | + (?<prefix>\W)? # Prefix |
30 | + ( # Reference | ||
31 | + @(?<user>[a-zA-Z][a-zA-Z0-9_\-\.]*) # User name | ||
32 | + |\#(?<issue>\d+) # Issue ID | ||
33 | + |!(?<merge_request>\d+) # MR ID | ||
34 | + |\$(?<snippet>\d+) # Snippet ID | ||
35 | + |(?<commit>[\h]{6,40}) # Commit ID | ||
34 | ) | 36 | ) |
35 | - (\W)? # Suffix (6) | 37 | + (?<suffix>\W)? # Suffix |
36 | }x.freeze | 38 | }x.freeze |
37 | 39 | ||
40 | + TYPES = [:user, :issue, :merge_request, :snippet, :commit].freeze | ||
41 | + | ||
38 | EMOJI_PATTERN = %r{(:(\S+):)}.freeze | 42 | EMOJI_PATTERN = %r{(:(\S+):)}.freeze |
39 | 43 | ||
40 | attr_reader :html_options | 44 | attr_reader :html_options |
@@ -95,16 +99,16 @@ module Gitlab | @@ -95,16 +99,16 @@ module Gitlab | ||
95 | def parse_references(text) | 99 | def parse_references(text) |
96 | # parse reference links | 100 | # parse reference links |
97 | text.gsub!(REFERENCE_PATTERN) do |match| | 101 | text.gsub!(REFERENCE_PATTERN) do |match| |
98 | - prefix = $1 || '' | ||
99 | - reference = $2 | ||
100 | - identifier = $3 || $4 || $5 | ||
101 | - suffix = $6 || '' | 102 | + prefix = $~[:prefix] |
103 | + suffix = $~[:suffix] | ||
104 | + type = TYPES.select{|t| !$~[t].nil?}.first | ||
105 | + identifier = $~[type] | ||
102 | 106 | ||
103 | # Avoid HTML entities | 107 | # Avoid HTML entities |
104 | - if prefix.ends_with?('&') || suffix.starts_with?(';') | 108 | + if prefix && suffix && prefix[0] == '&' && suffix[-1] == ';' |
105 | match | 109 | match |
106 | - elsif ref_link = reference_link(reference, identifier) | ||
107 | - prefix + ref_link + suffix | 110 | + elsif ref_link = reference_link(type, identifier) |
111 | + "#{prefix}#{ref_link}#{suffix}" | ||
108 | else | 112 | else |
109 | match | 113 | match |
110 | end | 114 | end |
@@ -137,19 +141,12 @@ module Gitlab | @@ -137,19 +141,12 @@ module Gitlab | ||
137 | # identifier - Object identifier (Issue ID, SHA hash, etc.) | 141 | # identifier - Object identifier (Issue ID, SHA hash, etc.) |
138 | # | 142 | # |
139 | # Returns string rendered by the processing method | 143 | # Returns string rendered by the processing method |
140 | - def reference_link(reference, identifier) | ||
141 | - case reference | ||
142 | - when /^@/ then reference_user(identifier) | ||
143 | - when /^#/ then reference_issue(identifier) | ||
144 | - when /^!/ then reference_merge_request(identifier) | ||
145 | - when /^\$/ then reference_snippet(identifier) | ||
146 | - when /^\h/ then reference_commit(identifier) | ||
147 | - end | 144 | + def reference_link(type, identifier) |
145 | + send("reference_#{type}", identifier) | ||
148 | end | 146 | end |
149 | 147 | ||
150 | def reference_user(identifier) | 148 | def reference_user(identifier) |
151 | - if user = @project.users.where(name: identifier).first | ||
152 | - member = @project.users_projects.where(user_id: user).first | 149 | + if member = @project.users_projects.joins(:user).where(users: { username: identifier }).first |
153 | link_to("@#{identifier}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member | 150 | link_to("@#{identifier}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member |
154 | end | 151 | end |
155 | end | 152 | end |
spec/helpers/gitlab_markdown_helper_spec.rb
@@ -3,7 +3,7 @@ require "spec_helper" | @@ -3,7 +3,7 @@ require "spec_helper" | ||
3 | describe GitlabMarkdownHelper do | 3 | describe GitlabMarkdownHelper do |
4 | let!(:project) { create(:project) } | 4 | let!(:project) { create(:project) } |
5 | 5 | ||
6 | - let(:user) { create(:user, name: 'gfm') } | 6 | + let(:user) { create(:user, username: 'gfm') } |
7 | let(:commit) { CommitDecorator.decorate(project.commit) } | 7 | let(:commit) { CommitDecorator.decorate(project.commit) } |
8 | let(:issue) { create(:issue, project: project) } | 8 | let(:issue) { create(:issue, project: project) } |
9 | let(:merge_request) { create(:merge_request, project: project) } | 9 | let(:merge_request) { create(:merge_request, project: project) } |
@@ -81,7 +81,7 @@ describe GitlabMarkdownHelper do | @@ -81,7 +81,7 @@ describe GitlabMarkdownHelper do | ||
81 | end | 81 | end |
82 | 82 | ||
83 | describe "referencing a team member" do | 83 | describe "referencing a team member" do |
84 | - let(:actual) { "@#{user.name} you are right." } | 84 | + let(:actual) { "@#{user.username} you are right." } |
85 | let(:expected) { project_team_member_path(project, member) } | 85 | let(:expected) { project_team_member_path(project, member) } |
86 | 86 | ||
87 | before do | 87 | before do |
@@ -103,18 +103,18 @@ describe GitlabMarkdownHelper do | @@ -103,18 +103,18 @@ describe GitlabMarkdownHelper do | ||
103 | end | 103 | end |
104 | 104 | ||
105 | it "should link with adjacent text" do | 105 | it "should link with adjacent text" do |
106 | - actual = "Mail the admin (@gfm)" | 106 | + actual = "Mail the admin (@#{user.username})" |
107 | gfm(actual).should match(expected) | 107 | gfm(actual).should match(expected) |
108 | end | 108 | end |
109 | 109 | ||
110 | it "should keep whitespace intact" do | 110 | it "should keep whitespace intact" do |
111 | - actual = "Yes, @#{user.name} is right." | ||
112 | - expected = /Yes, <a.+>@#{user.name}<\/a> is right/ | 111 | + actual = "Yes, @#{user.username} is right." |
112 | + expected = /Yes, <a.+>@#{user.username}<\/a> is right/ | ||
113 | gfm(actual).should match(expected) | 113 | gfm(actual).should match(expected) |
114 | end | 114 | end |
115 | 115 | ||
116 | it "should not link with an invalid id" do | 116 | it "should not link with an invalid id" do |
117 | - actual = expected = "@#{user.name.reverse} you are right." | 117 | + actual = expected = "@#{user.username.reverse} you are right." |
118 | gfm(actual).should == expected | 118 | gfm(actual).should == expected |
119 | end | 119 | end |
120 | 120 | ||
@@ -316,10 +316,10 @@ describe GitlabMarkdownHelper do | @@ -316,10 +316,10 @@ describe GitlabMarkdownHelper do | ||
316 | it "should handle references in lists" do | 316 | it "should handle references in lists" do |
317 | project.users << user | 317 | project.users << user |
318 | 318 | ||
319 | - actual = "\n* dark: ##{issue.id}\n* light by @#{member.user_name}" | 319 | + actual = "\n* dark: ##{issue.id}\n* light by @#{member.user.username}" |
320 | 320 | ||
321 | markdown(actual).should match(%r{<li>dark: <a.+>##{issue.id}</a></li>}) | 321 | markdown(actual).should match(%r{<li>dark: <a.+>##{issue.id}</a></li>}) |
322 | - markdown(actual).should match(%r{<li>light by <a.+>@#{member.user_name}</a></li>}) | 322 | + markdown(actual).should match(%r{<li>light by <a.+>@#{member.user.username}</a></li>}) |
323 | end | 323 | end |
324 | 324 | ||
325 | it "should handle references in <em>" do | 325 | it "should handle references in <em>" do |
spec/requests/gitlab_flavored_markdown_spec.rb
@@ -19,7 +19,7 @@ describe "Gitlab Flavored Markdown" do | @@ -19,7 +19,7 @@ describe "Gitlab Flavored Markdown" do | ||
19 | @test_file = "gfm_test_file" | 19 | @test_file = "gfm_test_file" |
20 | i.add(@test_file, "foo\nbar\n") | 20 | i.add(@test_file, "foo\nbar\n") |
21 | # add commit with gfm | 21 | # add commit with gfm |
22 | - i.commit("fix ##{issue.id}\n\nask @#{fred.name} for details", head: @branch_name) | 22 | + i.commit("fix ##{issue.id}\n\nask @#{fred.username} for details", head: @branch_name) |
23 | 23 | ||
24 | # add test tag | 24 | # add test tag |
25 | @tag_name = "gfm-test-tag" | 25 | @tag_name = "gfm-test-tag" |
@@ -56,7 +56,7 @@ describe "Gitlab Flavored Markdown" do | @@ -56,7 +56,7 @@ describe "Gitlab Flavored Markdown" do | ||
56 | it "should render description in commits#show" do | 56 | it "should render description in commits#show" do |
57 | visit project_commit_path(project, commit) | 57 | visit project_commit_path(project, commit) |
58 | 58 | ||
59 | - page.should have_link("@#{fred.name}") | 59 | + page.should have_link("@#{fred.username}") |
60 | end | 60 | end |
61 | 61 | ||
62 | it "should render title in refs#tree", js: true do | 62 | it "should render title in refs#tree", js: true do |
@@ -93,7 +93,7 @@ describe "Gitlab Flavored Markdown" do | @@ -93,7 +93,7 @@ describe "Gitlab Flavored Markdown" do | ||
93 | assignee: @user, | 93 | assignee: @user, |
94 | project: project, | 94 | project: project, |
95 | title: "fix ##{@other_issue.id}", | 95 | title: "fix ##{@other_issue.id}", |
96 | - description: "ask @#{fred.name} for details") | 96 | + description: "ask @#{fred.username} for details") |
97 | end | 97 | end |
98 | 98 | ||
99 | it "should render subject in issues#index" do | 99 | it "should render subject in issues#index" do |
@@ -111,7 +111,7 @@ describe "Gitlab Flavored Markdown" do | @@ -111,7 +111,7 @@ describe "Gitlab Flavored Markdown" do | ||
111 | it "should render details in issues#show" do | 111 | it "should render details in issues#show" do |
112 | visit project_issue_path(project, @issue) | 112 | visit project_issue_path(project, @issue) |
113 | 113 | ||
114 | - page.should have_link("@#{fred.name}") | 114 | + page.should have_link("@#{fred.username}") |
115 | end | 115 | end |
116 | end | 116 | end |
117 | 117 | ||
@@ -142,7 +142,7 @@ describe "Gitlab Flavored Markdown" do | @@ -142,7 +142,7 @@ describe "Gitlab Flavored Markdown" do | ||
142 | @milestone = create(:milestone, | 142 | @milestone = create(:milestone, |
143 | project: project, | 143 | project: project, |
144 | title: "fix ##{issue.id}", | 144 | title: "fix ##{issue.id}", |
145 | - description: "ask @#{fred.name} for details") | 145 | + description: "ask @#{fred.username} for details") |
146 | end | 146 | end |
147 | 147 | ||
148 | it "should render title in milestones#index" do | 148 | it "should render title in milestones#index" do |
@@ -160,7 +160,7 @@ describe "Gitlab Flavored Markdown" do | @@ -160,7 +160,7 @@ describe "Gitlab Flavored Markdown" do | ||
160 | it "should render description in milestones#show" do | 160 | it "should render description in milestones#show" do |
161 | visit project_milestone_path(project, @milestone) | 161 | visit project_milestone_path(project, @milestone) |
162 | 162 | ||
163 | - page.should have_link("@#{fred.name}") | 163 | + page.should have_link("@#{fred.username}") |
164 | end | 164 | end |
165 | end | 165 | end |
166 | 166 |