Merge branch 'fix/cross-reference-notes-forks' into 'master'
Fix cross reference notes on forks Updates `cross_reference_exists?` to match on commit only. Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/5849 See merge request !2731
This commit is contained in:
commit
42d088fcb1
|
@ -49,6 +49,7 @@ v 8.5.0 (unreleased)
|
|||
- Fixed logo animation on Safari (Roman Rott)
|
||||
- Hide remove source branch button when the MR is merged but new commits are pushed (Zeger-Jan van de Weg)
|
||||
- In seach autocomplete show only groups and projects you are member of
|
||||
- Don't process cross-reference notes from forks
|
||||
- Fix: init.d script not working on OS X
|
||||
- Faster snippet search
|
||||
- Title for milestones should be unique (Zeger-Jan van de Weg)
|
||||
|
|
|
@ -274,12 +274,15 @@ class SystemNoteService
|
|||
# Check if a cross reference to a noteable from a mentioner already exists
|
||||
#
|
||||
# This method is used to prevent multiple notes being created for a mention
|
||||
# when a issue is updated, for example.
|
||||
# when a issue is updated, for example. The method also calls notes_for_mentioner
|
||||
# to check if the mentioner is a commit, and return matches only on commit hash
|
||||
# instead of project + commit, to avoid repeated mentions from forks.
|
||||
#
|
||||
# noteable - Noteable object being referenced
|
||||
# mentioner - Mentionable object
|
||||
#
|
||||
# Returns Boolean
|
||||
|
||||
def self.cross_reference_exists?(noteable, mentioner)
|
||||
# Initial scope should be system notes of this noteable type
|
||||
notes = Note.system.where(noteable_type: noteable.class)
|
||||
|
@ -291,14 +294,20 @@ class SystemNoteService
|
|||
notes = notes.where(noteable_id: noteable.id)
|
||||
end
|
||||
|
||||
gfm_reference = mentioner.gfm_reference(noteable.project)
|
||||
notes = notes.where(note: cross_reference_note_content(gfm_reference))
|
||||
|
||||
notes.count > 0
|
||||
notes_for_mentioner(mentioner, noteable, notes).count > 0
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.notes_for_mentioner(mentioner, noteable, notes)
|
||||
if mentioner.is_a?(Commit)
|
||||
notes.where('note LIKE ?', "#{cross_reference_note_prefix}%#{mentioner.to_reference(nil)}")
|
||||
else
|
||||
gfm_reference = mentioner.gfm_reference(noteable.project)
|
||||
notes.where(note: cross_reference_note_content(gfm_reference))
|
||||
end
|
||||
end
|
||||
|
||||
def self.create_note(args = {})
|
||||
Note.create(args.merge(system: true))
|
||||
end
|
||||
|
|
|
@ -424,6 +424,21 @@ describe SystemNoteService, services: true do
|
|||
to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context 'commit with cross-reference from fork' do
|
||||
let(:author2) { create(:user) }
|
||||
let(:forked_project) { Projects::ForkService.new(project, author2).execute }
|
||||
let(:commit2) { forked_project.commit }
|
||||
|
||||
before do
|
||||
described_class.cross_reference(noteable, commit0, author2)
|
||||
end
|
||||
|
||||
it 'is true when a fork mentions an external issue' do
|
||||
expect(described_class.cross_reference_exists?(noteable, commit2)).
|
||||
to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
include JiraServiceHelper
|
||||
|
|
Loading…
Reference in New Issue