Commit 868f0c45 authored by Baodong's avatar Baodong

Add timezone to web operations

Add user timezone when transmitting user information through gRPC.
Need to upgrade gitaly Gem to "14.1.0.pre.rc2".
Add feature flag: add_timezone_to_web_operations.
See: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3586

Changelog: added
parent c94ca0f6
---
name: add_timezone_to_web_operations
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64084
rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/3655
milestone: '14.1'
type: development
group: group::gitaly
default_enabled: false
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
module Gitlab module Gitlab
module Git module Git
class User class User
attr_reader :username, :name, :email, :gl_id attr_reader :username, :name, :email, :gl_id, :timezone
def self.from_gitlab(gitlab_user) def self.from_gitlab(gitlab_user)
new(gitlab_user.username, gitlab_user.name, gitlab_user.commit_email, Gitlab::GlId.gl_id(gitlab_user)) new(gitlab_user.username, gitlab_user.name, gitlab_user.commit_email, Gitlab::GlId.gl_id(gitlab_user), gitlab_user.timezone)
end end
def self.from_gitaly(gitaly_user) def self.from_gitaly(gitaly_user)
...@@ -14,23 +14,30 @@ module Gitlab ...@@ -14,23 +14,30 @@ module Gitlab
gitaly_user.gl_username, gitaly_user.gl_username,
Gitlab::EncodingHelper.encode!(gitaly_user.name), Gitlab::EncodingHelper.encode!(gitaly_user.name),
Gitlab::EncodingHelper.encode!(gitaly_user.email), Gitlab::EncodingHelper.encode!(gitaly_user.email),
gitaly_user.gl_id gitaly_user.gl_id,
gitaly_user.timezone
) )
end end
def initialize(username, name, email, gl_id) def initialize(username, name, email, gl_id, timezone)
@username = username @username = username
@name = name @name = name
@email = email @email = email
@gl_id = gl_id @gl_id = gl_id
@timezone = if Feature.enabled?(:add_timezone_to_web_operations)
timezone
else
Time.zone.tzinfo.name
end
end end
def ==(other) def ==(other)
[username, name, email, gl_id] == [other.username, other.name, other.email, other.gl_id] [username, name, email, gl_id, timezone] == [other.username, other.name, other.email, other.gl_id, other.timezone]
end end
def to_gitaly def to_gitaly
Gitaly::User.new(gl_username: username, gl_id: gl_id, name: name.b, email: email.b) Gitaly::User.new(gl_username: username, gl_id: gl_id, name: name.b, email: email.b, timezone: timezone)
end end
end end
end end
......
...@@ -7,15 +7,16 @@ RSpec.describe Gitlab::Git::User do ...@@ -7,15 +7,16 @@ RSpec.describe Gitlab::Git::User do
let(:name) { 'Jane Doé' } let(:name) { 'Jane Doé' }
let(:email) { 'janedoé@example.com' } let(:email) { 'janedoé@example.com' }
let(:gl_id) { 'user-123' } let(:gl_id) { 'user-123' }
let(:timezone) { 'Asia/Shanghai' }
let(:user) do let(:user) do
described_class.new(username, name, email, gl_id) described_class.new(username, name, email, gl_id, timezone)
end end
subject { described_class.new(username, name, email, gl_id) } subject { described_class.new(username, name, email, gl_id, timezone) }
describe '.from_gitaly' do describe '.from_gitaly' do
let(:gitaly_user) do let(:gitaly_user) do
Gitaly::User.new(gl_username: username, name: name.b, email: email.b, gl_id: gl_id) Gitaly::User.new(gl_username: username, name: name.b, email: email.b, gl_id: gl_id, timezone: timezone)
end end
subject { described_class.from_gitaly(gitaly_user) } subject { described_class.from_gitaly(gitaly_user) }
...@@ -25,34 +26,45 @@ RSpec.describe Gitlab::Git::User do ...@@ -25,34 +26,45 @@ RSpec.describe Gitlab::Git::User do
describe '.from_gitlab' do describe '.from_gitlab' do
context 'when no commit_email has been set' do context 'when no commit_email has been set' do
let(:user) { build(:user, email: 'alice@example.com', commit_email: nil) } let(:user) { build(:user, email: 'alice@example.com', commit_email: nil, timezone: timezone) }
subject { described_class.from_gitlab(user) } subject { described_class.from_gitlab(user) }
it { expect(subject).to eq(described_class.new(user.username, user.name, user.email, 'user-')) } it { expect(subject).to eq(described_class.new(user.username, user.name, user.email, 'user-', timezone)) }
end end
context 'when commit_email has been set' do context 'when commit_email has been set' do
let(:user) { build(:user, email: 'alice@example.com', commit_email: 'bob@example.com') } let(:user) { build(:user, email: 'alice@example.com', commit_email: 'bob@example.com', timezone: timezone) }
subject { described_class.from_gitlab(user) } subject { described_class.from_gitlab(user) }
it { expect(subject).to eq(described_class.new(user.username, user.name, user.commit_email, 'user-')) } it { expect(subject).to eq(described_class.new(user.username, user.name, user.commit_email, 'user-', timezone)) }
end end
end end
describe '#==' do describe '#==' do
def eq_other(username, name, email, gl_id) def eq_other(username, name, email, gl_id, timezone)
eq(described_class.new(username, name, email, gl_id)) eq(described_class.new(username, name, email, gl_id, timezone))
end end
it { expect(subject).to eq_other(username, name, email, gl_id) } it { expect(subject).to eq_other(username, name, email, gl_id, timezone) }
it { expect(subject).not_to eq_other(nil, nil, nil, nil) } it { expect(subject).not_to eq_other(nil, nil, nil, nil, timezone) }
it { expect(subject).not_to eq_other(username + 'x', name, email, gl_id) } it { expect(subject).not_to eq_other(username + 'x', name, email, gl_id, timezone) }
it { expect(subject).not_to eq_other(username, name + 'x', email, gl_id) } it { expect(subject).not_to eq_other(username, name + 'x', email, gl_id, timezone) }
it { expect(subject).not_to eq_other(username, name, email + 'x', gl_id) } it { expect(subject).not_to eq_other(username, name, email + 'x', gl_id, timezone) }
it { expect(subject).not_to eq_other(username, name, email, gl_id + 'x') } it { expect(subject).not_to eq_other(username, name, email, gl_id + 'x', timezone) }
it { expect(subject).not_to eq_other(username, name, email, gl_id, 'Etc/UTC') }
context 'when add_timezone_to_web_operations is disabled' do
before do
stub_feature_flags(add_timezone_to_web_operations: false)
end
it 'ignores timezone arg and sets Etc/UTC by default' do
expect(user.timezone).to eq('Etc/UTC')
end
end
end end
describe '#to_gitaly' do describe '#to_gitaly' do
...@@ -69,6 +81,7 @@ RSpec.describe Gitlab::Git::User do ...@@ -69,6 +81,7 @@ RSpec.describe Gitlab::Git::User do
expect(subject.email).to be_a_binary_string expect(subject.email).to be_a_binary_string
expect(subject.gl_id).to eq(gl_id) expect(subject.gl_id).to eq(gl_id)
expect(subject.timezone).to eq(timezone)
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment