summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Speicher <rspeicher@gmail.com>2015-06-08 18:13:14 -0400
committerRobert Speicher <rspeicher@gmail.com>2015-06-08 18:13:14 -0400
commit23954b0f77ec048ed1a74eb30531c63de8b21b17 (patch)
treeab5a37a7927a9ba94b17df77062e6cab5c820eec
parentb637f849503db06f38812184aec398f2e4e29d09 (diff)
downloadgitlab-ce-rs-issue-1778.tar.gz
Correctly remove already-mentioned commits for cross referencesrs-issue-1778
Fixes #1778
-rw-r--r--app/models/concerns/mentionable.rb8
-rw-r--r--spec/models/concerns/mentionable_spec.rb21
2 files changed, 26 insertions, 3 deletions
diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb
index 6f9f54d08cc..10c39cb1ece 100644
--- a/app/models/concerns/mentionable.rb
+++ b/app/models/concerns/mentionable.rb
@@ -67,7 +67,13 @@ module Mentionable
# Create a cross-reference Note for each GFM reference to another Mentionable found in +mentionable_text+.
def create_cross_references!(p = project, a = author, without = [])
- refs = references(p) - without
+ refs = references(p)
+
+ # We're using this method instead of Array diffing because that requires
+ # both of the object's `hash` values to be the same, which may not be the
+ # case for otherwise identical Commit objects.
+ refs.reject! { |ref| without.include?(ref) }
+
refs.each do |ref|
Note.create_cross_reference_note(ref, local_reference, a)
end
diff --git a/spec/models/concerns/mentionable_spec.rb b/spec/models/concerns/mentionable_spec.rb
index eadb941a3fa..22237f2e9f2 100644
--- a/spec/models/concerns/mentionable_spec.rb
+++ b/spec/models/concerns/mentionable_spec.rb
@@ -1,14 +1,31 @@
require 'spec_helper'
describe Issue, "Mentionable" do
- describe :mentioned_users do
+ describe '#mentioned_users' do
let!(:user) { create(:user, username: 'stranger') }
let!(:user2) { create(:user, username: 'john') }
- let!(:issue) { create(:issue, description: '@stranger mentioned') }
+ let!(:issue) { create(:issue, description: "#{user.to_reference} mentioned") }
subject { issue.mentioned_users }
it { is_expected.to include(user) }
it { is_expected.not_to include(user2) }
end
+
+ describe '#create_cross_references!' do
+ let(:project) { create(:project) }
+ let(:author) { double('author') }
+ let(:commit) { project.commit }
+ let(:commit2) { project.commit }
+
+ let!(:issue) do
+ create(:issue, project: project, description: commit.to_reference)
+ end
+
+ it 'correctly removes already-mentioned Commits' do
+ expect(Note).not_to receive(:create_cross_reference_note)
+
+ issue.create_cross_references!(project, author, [commit2])
+ end
+ end
end