From 7bb28bf7804eadbaeac05e7adb8123a8fb6c5d02 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 5 Nov 2016 22:09:51 +0100
Subject: [PATCH] Improve @mention regex

---
 app/models/account.rb                    | 2 +-
 app/services/process_hashtags_service.rb | 2 +-
 spec/controllers/tags_controller_spec.rb | 4 ++++
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/app/models/account.rb b/app/models/account.rb
index 9999f05dd0..cb186b4659 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -1,7 +1,7 @@
 class Account < ApplicationRecord
   include Targetable
 
-  MENTION_RE = /(?:^|\s|\.|>)@([a-z0-9_]+(?:@[a-z0-9\.\-]+)?)/i
+  MENTION_RE = /(?:^|[\s\.>*+])@([a-z0-9_]+(?:@[a-z0-9\.\-]+)?)/i
   IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
 
   # Local users
diff --git a/app/services/process_hashtags_service.rb b/app/services/process_hashtags_service.rb
index 8c68ce9898..df30f73ae8 100644
--- a/app/services/process_hashtags_service.rb
+++ b/app/services/process_hashtags_service.rb
@@ -4,7 +4,7 @@ class ProcessHashtagsService < BaseService
       tags = status.text.scan(Tag::HASHTAG_RE).map(&:first)
     end
 
-    tags.map(&:downcase).each do |tag|
+    tags.map(&:downcase).uniq.each do |tag|
       status.tags << Tag.where(name: tag).first_or_initialize(name: tag)
     end
   end
diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb
index f433cf271c..92e25e03b4 100644
--- a/spec/controllers/tags_controller_spec.rb
+++ b/spec/controllers/tags_controller_spec.rb
@@ -3,6 +3,10 @@ require 'rails_helper'
 RSpec.describe TagsController, type: :controller do
 
   describe 'GET #show' do
+    before do
+      Fabricate(:tag, name: 'test')
+    end
+
     it 'returns http success' do
       get :show, params: { id: 'test' }
       expect(response).to have_http_status(:success)
-- 
GitLab