mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-11 05:36:07 +10:00
Disable reference generation in preformatted/code blocks ### Summary If a user adds text in code or preformatted text via Markdown or HTML that contains `#XXX`, the system adds a note that issue `XXX` was mentioned. This is particularly annoying because we often list gdb backtrace dumps into our issues, and many issues get mentioned as a result. For example: ``` (gdb) bt #0 0x00000000004004c4 in second () at main.cc:6 #1 0x00000000004004d2 in first () at main.cc:11 #2 0x00000000004004dd in main () at main.cc:17 (gdb) ``` ### Steps to reproduce 1. In an issue, write the above text using Markdown or HTML tags (e.g. `<code>`, `<pre>`). 2. Observe that [issue 1](https://gitlab.com/gitlab-org/gitlab-ce/issues/1) and [issue 2](https://gitlab.com/gitlab-org/gitlab-ce/issues/2) have a note that says they were mentioned. ### Expected behavior Everything enclosed in the code blocks should be ignored as references. ### Observed behavior Issues get referenced unnecessarily. ### Fix I've made `reference_extractor.rb` strip out HTML and Markdown blocks before processing. I considered running the raw text through the entire Markdown processor, but this seems overkill and perhaps could lead to some unintended side effects. See merge request !365
158 lines
5.5 KiB
Ruby
158 lines
5.5 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Gitlab::ReferenceExtractor do
|
|
it 'extracts username references' do
|
|
subject.analyze('this contains a @user reference', nil)
|
|
expect(subject.users).to eq([{ project: nil, id: 'user' }])
|
|
end
|
|
|
|
it 'extracts issue references' do
|
|
subject.analyze('this one talks about issue #1234', nil)
|
|
expect(subject.issues).to eq([{ project: nil, id: '1234' }])
|
|
end
|
|
|
|
it 'extracts JIRA issue references' do
|
|
subject.analyze('this one talks about issue JIRA-1234', nil)
|
|
expect(subject.issues).to eq([{ project: nil, id: 'JIRA-1234' }])
|
|
end
|
|
|
|
it 'extracts merge request references' do
|
|
subject.analyze("and here's !43, a merge request", nil)
|
|
expect(subject.merge_requests).to eq([{ project: nil, id: '43' }])
|
|
end
|
|
|
|
it 'extracts snippet ids' do
|
|
subject.analyze('snippets like $12 get extracted as well', nil)
|
|
expect(subject.snippets).to eq([{ project: nil, id: '12' }])
|
|
end
|
|
|
|
it 'extracts commit shas' do
|
|
subject.analyze('commit shas 98cf0ae3 are pulled out as Strings', nil)
|
|
expect(subject.commits).to eq([{ project: nil, id: '98cf0ae3' }])
|
|
end
|
|
|
|
it 'extracts commit ranges' do
|
|
subject.analyze('here you go, a commit range: 98cf0ae3...98cf0ae4', nil)
|
|
expect(subject.commit_ranges).to eq([{ project: nil, id: '98cf0ae3...98cf0ae4' }])
|
|
end
|
|
|
|
it 'extracts multiple references and preserves their order' do
|
|
subject.analyze('@me and @you both care about this', nil)
|
|
expect(subject.users).to eq([
|
|
{ project: nil, id: 'me' },
|
|
{ project: nil, id: 'you' }
|
|
])
|
|
end
|
|
|
|
it 'leaves the original note unmodified' do
|
|
text = 'issue #123 is just the worst, @user'
|
|
subject.analyze(text, nil)
|
|
expect(text).to eq('issue #123 is just the worst, @user')
|
|
end
|
|
|
|
it 'extracts no references for <pre>..</pre> blocks' do
|
|
subject.analyze("<pre>def puts '#1 issue'\nend\n</pre>```", nil)
|
|
expect(subject.issues).to be_blank
|
|
end
|
|
|
|
it 'extracts no references for <code>..</code> blocks' do
|
|
subject.analyze("<code>def puts '!1 request'\nend\n</code>```", nil)
|
|
expect(subject.merge_requests).to be_blank
|
|
end
|
|
|
|
it 'extracts no references for code blocks with language' do
|
|
subject.analyze("this code:\n```ruby\ndef puts '#1 issue'\nend\n```", nil)
|
|
expect(subject.issues).to be_blank
|
|
end
|
|
|
|
it 'extracts issue references for invalid code blocks' do
|
|
subject.analyze('test: ```this one talks about issue #1234```', nil)
|
|
expect(subject.issues).to eq([{ project: nil, id: '1234' }])
|
|
end
|
|
|
|
it 'handles all possible kinds of references' do
|
|
accessors = Gitlab::Markdown::TYPES.map { |t| "#{t}s".to_sym }
|
|
expect(subject).to respond_to(*accessors)
|
|
end
|
|
|
|
context 'with a project' do
|
|
let(:project) { create(:project) }
|
|
|
|
it 'accesses valid user objects on the project team' do
|
|
@u_foo = create(:user, username: 'foo')
|
|
@u_bar = create(:user, username: 'bar')
|
|
create(:user, username: 'offteam')
|
|
|
|
project.team << [@u_foo, :reporter]
|
|
project.team << [@u_bar, :guest]
|
|
|
|
subject.analyze('@foo, @baduser, @bar, and @offteam', project)
|
|
expect(subject.users_for(project)).to eq([@u_foo, @u_bar])
|
|
end
|
|
|
|
it 'accesses valid issue objects' do
|
|
@i0 = create(:issue, project: project)
|
|
@i1 = create(:issue, project: project)
|
|
|
|
subject.analyze("##{@i0.iid}, ##{@i1.iid}, and #999.", project)
|
|
expect(subject.issues_for(project)).to eq([@i0, @i1])
|
|
end
|
|
|
|
it 'accesses valid merge requests' do
|
|
@m0 = create(:merge_request, source_project: project, target_project: project, source_branch: 'aaa')
|
|
@m1 = create(:merge_request, source_project: project, target_project: project, source_branch: 'bbb')
|
|
|
|
subject.analyze("!999, !#{@m1.iid}, and !#{@m0.iid}.", project)
|
|
expect(subject.merge_requests_for(project)).to eq([@m1, @m0])
|
|
end
|
|
|
|
it 'accesses valid snippets' do
|
|
@s0 = create(:project_snippet, project: project)
|
|
@s1 = create(:project_snippet, project: project)
|
|
@s2 = create(:project_snippet)
|
|
|
|
subject.analyze("$#{@s0.id}, $999, $#{@s2.id}, $#{@s1.id}", project)
|
|
expect(subject.snippets_for(project)).to eq([@s0, @s1])
|
|
end
|
|
|
|
it 'accesses valid commits' do
|
|
commit = project.repository.commit('master')
|
|
|
|
subject.analyze("this references commits #{commit.sha[0..6]} and 012345",
|
|
project)
|
|
extracted = subject.commits_for(project)
|
|
expect(extracted.size).to eq(1)
|
|
expect(extracted[0].sha).to eq(commit.sha)
|
|
expect(extracted[0].message).to eq(commit.message)
|
|
end
|
|
|
|
it 'accesses valid commit ranges' do
|
|
commit = project.repository.commit('master')
|
|
earlier_commit = project.repository.commit('master~2')
|
|
|
|
subject.analyze("this references commits #{earlier_commit.sha[0..6]}...#{commit.sha[0..6]}",
|
|
project)
|
|
extracted = subject.commit_ranges_for(project)
|
|
expect(extracted.size).to eq(1)
|
|
expect(extracted[0][0].sha).to eq(earlier_commit.sha)
|
|
expect(extracted[0][0].message).to eq(earlier_commit.message)
|
|
expect(extracted[0][1].sha).to eq(commit.sha)
|
|
expect(extracted[0][1].message).to eq(commit.message)
|
|
end
|
|
end
|
|
|
|
context 'with a project with an underscore' do
|
|
let(:project) { create(:project, path: 'test_project') }
|
|
let(:issue) { create(:issue, project: project) }
|
|
|
|
it 'handles project issue references' do
|
|
subject.analyze("this refers issue #{project.path_with_namespace}##{issue.iid}",
|
|
project)
|
|
extracted = subject.issues_for(project)
|
|
expect(extracted.size).to eq(1)
|
|
expect(extracted).to eq([issue])
|
|
end
|
|
|
|
end
|
|
end
|