From 3377808193e8571b028fd05f009a7d1089dcc916 Mon Sep 17 00:00:00 2001
From: Douwe Maan <douwe@gitlab.com>
Date: Sun, 20 Sep 2015 18:18:39 +0200
Subject: [PATCH] Fix reply by email for comments on a specific line in a
 diff/commit.

---
 app/mailers/emails/notes.rb                        |  6 +++---
 app/models/sent_notification.rb                    | 14 ++++++++++++--
 ...920161119_add_line_code_to_sent_notification.rb |  5 +++++
 db/schema.rb                                       |  3 ++-
 lib/gitlab/email/receiver.rb                       |  3 ++-
 5 files changed, 24 insertions(+), 7 deletions(-)
 create mode 100644 db/migrate/20150920161119_add_line_code_to_sent_notification.rb

diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb
index 63d4aca61af..87ba94a583d 100644
--- a/app/mailers/emails/notes.rb
+++ b/app/mailers/emails/notes.rb
@@ -12,7 +12,7 @@ module Emails
                          to: recipient(recipient_id),
                          subject: subject("#{@commit.title} (#{@commit.short_id})"))
 
-      SentNotification.record(@commit, recipient_id, reply_key)
+      SentNotification.record_note(@note, recipient_id, reply_key)
     end
 
     def note_issue_email(recipient_id, note_id)
@@ -27,7 +27,7 @@ module Emails
                          to: recipient(recipient_id),
                          subject: subject("#{@issue.title} (##{@issue.iid})"))
 
-      SentNotification.record(@issue, recipient_id, reply_key)
+      SentNotification.record_note(@note, recipient_id, reply_key)
     end
 
     def note_merge_request_email(recipient_id, note_id)
@@ -43,7 +43,7 @@ module Emails
                          to: recipient(recipient_id),
                          subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
 
-      SentNotification.record(@merge_request, recipient_id, reply_key)
+      SentNotification.record_note(@note, recipient_id, reply_key)
     end
   end
 end
diff --git a/app/models/sent_notification.rb b/app/models/sent_notification.rb
index 33b113a2a27..03425389dd3 100644
--- a/app/models/sent_notification.rb
+++ b/app/models/sent_notification.rb
@@ -8,6 +8,7 @@
 #  noteable_type :string(255)
 #  recipient_id  :integer
 #  commit_id     :string(255)
+#  line_code     :string(255)
 #  reply_key     :string(255)      not null
 #
 
@@ -21,13 +22,14 @@ class SentNotification < ActiveRecord::Base
 
   validates :noteable_id, presence: true, unless: :for_commit?
   validates :commit_id, presence: true, if: :for_commit?
+  validates :line_code, format: { with: /\A[a-z0-9]+_\d+_\d+\Z/ }, allow_blank: true
 
   class << self
     def for(reply_key)
       find_by(reply_key: reply_key)
     end
 
-    def record(noteable, recipient_id, reply_key)
+    def record(noteable, recipient_id, reply_key, params = {})
       return unless reply_key
 
       noteable_id = nil
@@ -38,7 +40,7 @@ class SentNotification < ActiveRecord::Base
         noteable_id = noteable.id
       end
 
-      create(
+      params.reverse_merge!(
         project:        noteable.project,
         noteable_type:  noteable.class.name,
         noteable_id:    noteable_id,
@@ -46,6 +48,14 @@ class SentNotification < ActiveRecord::Base
         recipient_id:   recipient_id,
         reply_key:      reply_key
       )
+
+      create(params)
+    end
+
+    def record_note(note, recipient_id, reply_key, params = {})
+      params[:line_code] = note.line_code
+      
+      record(note.noteable, recipient_id, reply_key, params)
     end
   end
 
diff --git a/db/migrate/20150920161119_add_line_code_to_sent_notification.rb b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb
new file mode 100644
index 00000000000..d9af4e71751
--- /dev/null
+++ b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb
@@ -0,0 +1,5 @@
+class AddLineCodeToSentNotification < ActiveRecord::Migration
+  def change
+    add_column :sent_notifications, :line_code, :string
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index b8eb9d26779..01ccda7a75e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20150920010715) do
+ActiveRecord::Schema.define(version: 20150920161119) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -623,6 +623,7 @@ ActiveRecord::Schema.define(version: 20150920010715) do
     t.integer "recipient_id"
     t.string  "commit_id"
     t.string  "reply_key",     null: false
+    t.string  "line_code"
   end
 
   add_index "sent_notifications", ["reply_key"], name: "index_sent_notifications_on_reply_key", unique: true, using: :btree
diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb
index 355fbd27898..341b557858f 100644
--- a/lib/gitlab/email/receiver.rb
+++ b/lib/gitlab/email/receiver.rb
@@ -98,7 +98,8 @@ module Gitlab
           note:           reply,
           noteable_type:  sent_notification.noteable_type,
           noteable_id:    sent_notification.noteable_id,
-          commit_id:      sent_notification.commit_id
+          commit_id:      sent_notification.commit_id,
+          line_code:      sent_notification.line_code
         ).execute
       end
     end
-- 
GitLab