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 | 26 | # => "<img alt=\":trollface:\" class=\"emoji\" src=\"/images/trollface.png" title=\":trollface:\" /> |
| 27 | 27 | module Markdown |
| 28 | 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 | 38 | }x.freeze |
| 37 | 39 | |
| 40 | + TYPES = [:user, :issue, :merge_request, :snippet, :commit].freeze | |
| 41 | + | |
| 38 | 42 | EMOJI_PATTERN = %r{(:(\S+):)}.freeze |
| 39 | 43 | |
| 40 | 44 | attr_reader :html_options |
| ... | ... | @@ -95,16 +99,16 @@ module Gitlab |
| 95 | 99 | def parse_references(text) |
| 96 | 100 | # parse reference links |
| 97 | 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 | 107 | # Avoid HTML entities |
| 104 | - if prefix.ends_with?('&') || suffix.starts_with?(';') | |
| 108 | + if prefix && suffix && prefix[0] == '&' && suffix[-1] == ';' | |
| 105 | 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 | 112 | else |
| 109 | 113 | match |
| 110 | 114 | end |
| ... | ... | @@ -137,19 +141,12 @@ module Gitlab |
| 137 | 141 | # identifier - Object identifier (Issue ID, SHA hash, etc.) |
| 138 | 142 | # |
| 139 | 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 | 146 | end |
| 149 | 147 | |
| 150 | 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 | 150 | link_to("@#{identifier}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member |
| 154 | 151 | end |
| 155 | 152 | end | ... | ... |
spec/helpers/gitlab_markdown_helper_spec.rb
| ... | ... | @@ -3,7 +3,7 @@ require "spec_helper" |
| 3 | 3 | describe GitlabMarkdownHelper do |
| 4 | 4 | let!(:project) { create(:project) } |
| 5 | 5 | |
| 6 | - let(:user) { create(:user, name: 'gfm') } | |
| 6 | + let(:user) { create(:user, username: 'gfm') } | |
| 7 | 7 | let(:commit) { CommitDecorator.decorate(project.commit) } |
| 8 | 8 | let(:issue) { create(:issue, project: project) } |
| 9 | 9 | let(:merge_request) { create(:merge_request, project: project) } |
| ... | ... | @@ -81,7 +81,7 @@ describe GitlabMarkdownHelper do |
| 81 | 81 | end |
| 82 | 82 | |
| 83 | 83 | describe "referencing a team member" do |
| 84 | - let(:actual) { "@#{user.name} you are right." } | |
| 84 | + let(:actual) { "@#{user.username} you are right." } | |
| 85 | 85 | let(:expected) { project_team_member_path(project, member) } |
| 86 | 86 | |
| 87 | 87 | before do |
| ... | ... | @@ -103,18 +103,18 @@ describe GitlabMarkdownHelper do |
| 103 | 103 | end |
| 104 | 104 | |
| 105 | 105 | it "should link with adjacent text" do |
| 106 | - actual = "Mail the admin (@gfm)" | |
| 106 | + actual = "Mail the admin (@#{user.username})" | |
| 107 | 107 | gfm(actual).should match(expected) |
| 108 | 108 | end |
| 109 | 109 | |
| 110 | 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 | 113 | gfm(actual).should match(expected) |
| 114 | 114 | end |
| 115 | 115 | |
| 116 | 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 | 118 | gfm(actual).should == expected |
| 119 | 119 | end |
| 120 | 120 | |
| ... | ... | @@ -316,10 +316,10 @@ describe GitlabMarkdownHelper do |
| 316 | 316 | it "should handle references in lists" do |
| 317 | 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 | 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 | 323 | end |
| 324 | 324 | |
| 325 | 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 | 19 | @test_file = "gfm_test_file" |
| 20 | 20 | i.add(@test_file, "foo\nbar\n") |
| 21 | 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 | 24 | # add test tag |
| 25 | 25 | @tag_name = "gfm-test-tag" |
| ... | ... | @@ -56,7 +56,7 @@ describe "Gitlab Flavored Markdown" do |
| 56 | 56 | it "should render description in commits#show" do |
| 57 | 57 | visit project_commit_path(project, commit) |
| 58 | 58 | |
| 59 | - page.should have_link("@#{fred.name}") | |
| 59 | + page.should have_link("@#{fred.username}") | |
| 60 | 60 | end |
| 61 | 61 | |
| 62 | 62 | it "should render title in refs#tree", js: true do |
| ... | ... | @@ -93,7 +93,7 @@ describe "Gitlab Flavored Markdown" do |
| 93 | 93 | assignee: @user, |
| 94 | 94 | project: project, |
| 95 | 95 | title: "fix ##{@other_issue.id}", |
| 96 | - description: "ask @#{fred.name} for details") | |
| 96 | + description: "ask @#{fred.username} for details") | |
| 97 | 97 | end |
| 98 | 98 | |
| 99 | 99 | it "should render subject in issues#index" do |
| ... | ... | @@ -111,7 +111,7 @@ describe "Gitlab Flavored Markdown" do |
| 111 | 111 | it "should render details in issues#show" do |
| 112 | 112 | visit project_issue_path(project, @issue) |
| 113 | 113 | |
| 114 | - page.should have_link("@#{fred.name}") | |
| 114 | + page.should have_link("@#{fred.username}") | |
| 115 | 115 | end |
| 116 | 116 | end |
| 117 | 117 | |
| ... | ... | @@ -142,7 +142,7 @@ describe "Gitlab Flavored Markdown" do |
| 142 | 142 | @milestone = create(:milestone, |
| 143 | 143 | project: project, |
| 144 | 144 | title: "fix ##{issue.id}", |
| 145 | - description: "ask @#{fred.name} for details") | |
| 145 | + description: "ask @#{fred.username} for details") | |
| 146 | 146 | end |
| 147 | 147 | |
| 148 | 148 | it "should render title in milestones#index" do |
| ... | ... | @@ -160,7 +160,7 @@ describe "Gitlab Flavored Markdown" do |
| 160 | 160 | it "should render description in milestones#show" do |
| 161 | 161 | visit project_milestone_path(project, @milestone) |
| 162 | 162 | |
| 163 | - page.should have_link("@#{fred.name}") | |
| 163 | + page.should have_link("@#{fred.username}") | |
| 164 | 164 | end |
| 165 | 165 | end |
| 166 | 166 | ... | ... |