diff options
author | Douwe Maan <douwe@gitlab.com> | 2016-02-16 11:47:46 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2016-02-16 11:47:46 +0000 |
commit | 42d088fcb1e59a5789908dce8b141271bed3940a (patch) | |
tree | 96927930e4079fde5364517e145ca871a6b66423 /app | |
parent | 8db62f25480562e8497c3fb6d9f4611fc5902d94 (diff) | |
parent | 11913a762a3ed6514594e6ac6ffe1717dd362ae1 (diff) | |
download | gitlab-ce-42d088fcb1e59a5789908dce8b141271bed3940a.tar.gz |
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
Diffstat (limited to 'app')
-rw-r--r-- | app/services/system_note_service.rb | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index 1083bcec054..edced010811 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -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 |