From 3c5c658a27d1dfe4abf6469f35776b78f2169d81 Mon Sep 17 00:00:00 2001
From: Nick Thomas <nick@gitlab.com>
Date: Mon, 17 Sep 2018 14:14:58 +0100
Subject: [PATCH] Use the correct email address when committing via a file
 service

---
 app/services/files/base_service.rb         |  6 ++++--
 spec/factories/users.rb                    |  8 ++++++++
 spec/services/files/create_service_spec.rb | 15 ++++++++++++++-
 spec/services/files/delete_service_spec.rb |  8 ++++++++
 spec/services/files/update_service_spec.rb |  8 ++++++++
 5 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb
index fc7b236f7da..39e614d6569 100644
--- a/app/services/files/base_service.rb
+++ b/app/services/files/base_service.rb
@@ -7,8 +7,10 @@ module Files
     def initialize(*args)
       super
 
-      @author_email = params[:author_email] || current_user&.email
-      @author_name = params[:author_name] || current_user&.name
+      git_user = Gitlab::Git::User.from_gitlab(current_user) if current_user.present?
+
+      @author_email = params[:author_email] || git_user&.email
+      @author_name = params[:author_name] || git_user&.name
       @commit_message = params[:commit_message]
       @last_commit_sha = params[:last_commit_sha]
 
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
index 59db8cdc34b..a47bd7cafca 100644
--- a/spec/factories/users.rb
+++ b/spec/factories/users.rb
@@ -58,6 +58,14 @@ FactoryBot.define do
       project_view :readme
     end
 
+    trait :commit_email do
+      after(:create) do |user, evaluator|
+        additional = create(:email, :confirmed, user: user, email: "commit-#{user.email}")
+
+        user.update!(commit_email: additional.email)
+      end
+    end
+
     factory :omniauth_user do
       transient do
         extern_uid '123456'
diff --git a/spec/services/files/create_service_spec.rb b/spec/services/files/create_service_spec.rb
index 30d94e4318d..c8f899e6dff 100644
--- a/spec/services/files/create_service_spec.rb
+++ b/spec/services/files/create_service_spec.rb
@@ -3,7 +3,7 @@ require "spec_helper"
 describe Files::CreateService do
   let(:project) { create(:project, :repository) }
   let(:repository) { project.repository }
-  let(:user) { create(:user) }
+  let(:user) { create(:user, :commit_email) }
   let(:file_content) { 'Test file content' }
   let(:branch_name) { project.default_branch }
   let(:start_branch) { branch_name }
@@ -20,6 +20,8 @@ describe Files::CreateService do
     }
   end
 
+  let(:commit) { repository.head_commit }
+
   subject { described_class.new(project, user, commit_params) }
 
   before do
@@ -75,4 +77,15 @@ describe Files::CreateService do
       end
     end
   end
+
+  context 'commit attribute' do
+    let(:file_path) { 'test-commit-attributes.txt' }
+
+    it 'uses the commit email' do
+      subject.execute
+
+      expect(commit.author_email).to eq(user.commit_email)
+      expect(commit.committer_email).to eq(user.commit_email)
+    end
+  end
 end
diff --git a/spec/services/files/delete_service_spec.rb b/spec/services/files/delete_service_spec.rb
index 73566afe8c8..ba4a0594666 100644
--- a/spec/services/files/delete_service_spec.rb
+++ b/spec/services/files/delete_service_spec.rb
@@ -8,6 +8,7 @@ describe Files::DeleteService do
   let(:file_path) { 'files/ruby/popen.rb' }
   let(:branch_name) { project.default_branch }
   let(:last_commit_sha) { nil }
+  let(:commit) { project.repository.head_commit }
 
   let(:commit_params) do
     {
@@ -34,6 +35,13 @@ describe Files::DeleteService do
 
       expect(blob).to be_nil
     end
+
+    it 'uses the commit email' do
+      subject.execute
+
+      expect(commit.author_email).to eq(user.commit_email)
+      expect(commit.committer_email).to eq(user.commit_email)
+    end
   end
 
   before do
diff --git a/spec/services/files/update_service_spec.rb b/spec/services/files/update_service_spec.rb
index e01fe487ffa..3bfa2717960 100644
--- a/spec/services/files/update_service_spec.rb
+++ b/spec/services/files/update_service_spec.rb
@@ -9,6 +9,7 @@ describe Files::UpdateService do
   let(:new_contents) { 'New Content' }
   let(:branch_name) { project.default_branch }
   let(:last_commit_sha) { nil }
+  let(:commit) { project.repository.commit }
 
   let(:commit_params) do
     {
@@ -54,6 +55,13 @@ describe Files::UpdateService do
 
         expect(results.data).to eq(new_contents)
       end
+
+      it 'uses the commit email' do
+        subject.execute
+
+        expect(commit.author_email).to eq(user.commit_email)
+        expect(commit.committer_email).to eq(user.commit_email)
+      end
     end
 
     context "when the last_commit_sha is not supplied" do
-- 
2.30.9