Commit e1bc7577 authored by Lin Jen-Shin's avatar Lin Jen-Shin

Merge remote-tracking branch 'upstream/master' into test-pg-mysql

* upstream/master:
  Setup and run a Gitaly server for testing if GitalyClient is enabled
  Update changelog with MR id
  Move permission to create subgroup into GroupPolicy
  Fix issue's note cache expiration after delete
  fix(subgroups): add verification of group creation capability to subgroup UI
parents d6c45457 59f81b4f
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.3-git-2.7-phantomjs-2.1-node-7.1-postgresql-9.6" image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.3-golang-1.8-git-2.7-phantomjs-2.1-node-7.1-postgresql-9.6"
cache: cache:
key: "ruby-233" key: "ruby-233"
......
...@@ -326,14 +326,13 @@ class Commit ...@@ -326,14 +326,13 @@ class Commit
end end
def raw_diffs(*args) def raw_diffs(*args)
use_gitaly = Gitlab::GitalyClient.feature_enabled?(:commit_raw_diffs) # NOTE: This feature is intentionally disabled until
deltas_only = args.last.is_a?(Hash) && args.last[:deltas_only] # https://gitlab.com/gitlab-org/gitaly/issues/178 is resolved
# if Gitlab::GitalyClient.feature_enabled?(:commit_raw_diffs)
if use_gitaly && !deltas_only # Gitlab::GitalyClient::Commit.diff_from_parent(self, *args)
Gitlab::GitalyClient::Commit.diff_from_parent(self, *args) # else
else raw.diffs(*args)
raw.diffs(*args) # end
end
end end
def diffs(diff_options = nil) def diffs(diff_options = nil)
......
...@@ -96,6 +96,7 @@ class Note < ActiveRecord::Base ...@@ -96,6 +96,7 @@ class Note < ActiveRecord::Base
before_validation :set_discussion_id, on: :create before_validation :set_discussion_id, on: :create
after_save :keep_around_commit, unless: :for_personal_snippet? after_save :keep_around_commit, unless: :for_personal_snippet?
after_save :expire_etag_cache after_save :expire_etag_cache
after_destroy :expire_etag_cache
class << self class << self
def model_name def model_name
......
...@@ -963,13 +963,15 @@ class Repository ...@@ -963,13 +963,15 @@ class Repository
end end
def is_ancestor?(ancestor_id, descendant_id) def is_ancestor?(ancestor_id, descendant_id)
Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled| # NOTE: This feature is intentionally disabled until
if is_enabled # https://gitlab.com/gitlab-org/gitlab-ce/issues/30586 is resolved
raw_repository.is_ancestor?(ancestor_id, descendant_id) # Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled|
else # if is_enabled
merge_base_commit(ancestor_id, descendant_id) == ancestor_id # raw_repository.is_ancestor?(ancestor_id, descendant_id)
end # else
end merge_base_commit(ancestor_id, descendant_id) == ancestor_id
# end
# end
end end
def empty_repo? def empty_repo?
......
...@@ -28,6 +28,7 @@ class GroupPolicy < BasePolicy ...@@ -28,6 +28,7 @@ class GroupPolicy < BasePolicy
can! :admin_namespace can! :admin_namespace
can! :admin_group_member can! :admin_group_member
can! :change_visibility_level can! :change_visibility_level
can! :create_subgroup if @user.can_create_group
end end
if globally_viewable && @subject.request_access_enabled && !member if globally_viewable && @subject.request_access_enabled && !member
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
.nav-controls .nav-controls
= form_tag request.path, method: :get do |f| = form_tag request.path, method: :get do |f|
= search_field_tag :filter_groups, params[:filter_groups], placeholder: 'Filter by name', class: 'form-control', spellcheck: false = search_field_tag :filter_groups, params[:filter_groups], placeholder: 'Filter by name', class: 'form-control', spellcheck: false
- if can? current_user, :admin_group, @group - if can?(current_user, :create_subgroup, @group)
= link_to new_group_path(parent_id: @group.id), class: 'btn btn-new pull-right' do = link_to new_group_path(parent_id: @group.id), class: 'btn btn-new pull-right' do
New Subgroup New Subgroup
......
---
title: Fix issue's note cache expiration after delete
merge_request:
author: mhasbini
---
title: Hide new subgroup button if user has no permission to create one
merge_request: 10627
author:
...@@ -579,9 +579,9 @@ test: ...@@ -579,9 +579,9 @@ test:
storages: storages:
default: default:
path: tmp/tests/repositories/ path: tmp/tests/repositories/
gitaly_address: unix:<%= Rails.root.join('tmp/sockets/private/gitaly.socket') %> gitaly_address: unix:tmp/tests/gitaly/gitaly.socket
gitaly: gitaly:
enabled: false enabled: true
backup: backup:
path: tmp/tests/backups path: tmp/tests/backups
gitlab_shell: gitlab_shell:
......
...@@ -45,13 +45,15 @@ module Gitlab ...@@ -45,13 +45,15 @@ module Gitlab
# Default branch in the repository # Default branch in the repository
def root_ref def root_ref
@root_ref ||= Gitlab::GitalyClient.migrate(:root_ref) do |is_enabled| # NOTE: This feature is intentionally disabled until
if is_enabled # https://gitlab.com/gitlab-org/gitaly/issues/179 is resolved
gitaly_ref_client.default_branch_name # @root_ref ||= Gitlab::GitalyClient.migrate(:root_ref) do |is_enabled|
else # if is_enabled
discover_default_branch # gitaly_ref_client.default_branch_name
end # else
end @root_ref ||= discover_default_branch
# end
# end
rescue GRPC::BadStatus => e rescue GRPC::BadStatus => e
raise CommandError.new(e) raise CommandError.new(e)
end end
...@@ -70,13 +72,15 @@ module Gitlab ...@@ -70,13 +72,15 @@ module Gitlab
# Returns an Array of branch names # Returns an Array of branch names
# sorted by name ASC # sorted by name ASC
def branch_names def branch_names
Gitlab::GitalyClient.migrate(:branch_names) do |is_enabled| # Gitlab::GitalyClient.migrate(:branch_names) do |is_enabled|
if is_enabled # NOTE: This feature is intentionally disabled until
gitaly_ref_client.branch_names # https://gitlab.com/gitlab-org/gitaly/issues/179 is resolved
else # if is_enabled
branches.map(&:name) # gitaly_ref_client.branch_names
end # else
end branches.map(&:name)
# end
# end
rescue GRPC::BadStatus => e rescue GRPC::BadStatus => e
raise CommandError.new(e) raise CommandError.new(e)
end end
...@@ -131,13 +135,15 @@ module Gitlab ...@@ -131,13 +135,15 @@ module Gitlab
# Returns an Array of tag names # Returns an Array of tag names
def tag_names def tag_names
Gitlab::GitalyClient.migrate(:tag_names) do |is_enabled| # Gitlab::GitalyClient.migrate(:tag_names) do |is_enabled|
if is_enabled # NOTE: This feature is intentionally disabled until
gitaly_ref_client.tag_names # https://gitlab.com/gitlab-org/gitaly/issues/179 is resolved
else # if is_enabled
rugged.tags.map { |t| t.name } # gitaly_ref_client.tag_names
end # else
end rugged.tags.map { |t| t.name }
# end
# end
rescue GRPC::BadStatus => e rescue GRPC::BadStatus => e
raise CommandError.new(e) raise CommandError.new(e)
end end
...@@ -458,17 +464,19 @@ module Gitlab ...@@ -458,17 +464,19 @@ module Gitlab
# Returns a RefName for a given SHA # Returns a RefName for a given SHA
def ref_name_for_sha(ref_path, sha) def ref_name_for_sha(ref_path, sha)
Gitlab::GitalyClient.migrate(:find_ref_name) do |is_enabled| # NOTE: This feature is intentionally disabled until
if is_enabled # https://gitlab.com/gitlab-org/gitaly/issues/180 is resolved
gitaly_ref_client.find_ref_name(sha, ref_path) # Gitlab::GitalyClient.migrate(:find_ref_name) do |is_enabled|
else # if is_enabled
args = %W(#{Gitlab.config.git.bin_path} for-each-ref --count=1 #{ref_path} --contains #{sha}) # gitaly_ref_client.find_ref_name(sha, ref_path)
# else
# Not found -> ["", 0] args = %W(#{Gitlab.config.git.bin_path} for-each-ref --count=1 #{ref_path} --contains #{sha})
# Found -> ["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0]
Gitlab::Popen.popen(args, @path).first.split.last # Not found -> ["", 0]
end # Found -> ["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0]
end Gitlab::Popen.popen(args, @path).first.split.last
# end
# end
end end
# Returns commits collection # Returns commits collection
......
...@@ -24,20 +24,21 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -24,20 +24,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
end end
context 'with gitaly enabled' do # TODO: Uncomment when feature is reenabled
before { stub_gitaly } # context 'with gitaly enabled' do
# before { stub_gitaly }
it 'gets the branch name from GitalyClient' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name) # it 'gets the branch name from GitalyClient' do
repository.root_ref # expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name)
end # repository.root_ref
# end
it 'wraps GRPC exceptions' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name). # it 'wraps GRPC exceptions' do
and_raise(GRPC::Unknown) # expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name).
expect { repository.root_ref }.to raise_error(Gitlab::Git::CommandError) # and_raise(GRPC::Unknown)
end # expect { repository.root_ref }.to raise_error(Gitlab::Git::CommandError)
end # end
# end
end end
describe "#rugged" do describe "#rugged" do
...@@ -112,20 +113,21 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -112,20 +113,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
it { is_expected.to include("master") } it { is_expected.to include("master") }
it { is_expected.not_to include("branch-from-space") } it { is_expected.not_to include("branch-from-space") }
context 'with gitaly enabled' do # TODO: Uncomment when feature is reenabled
before { stub_gitaly } # context 'with gitaly enabled' do
# before { stub_gitaly }
it 'gets the branch names from GitalyClient' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names) # it 'gets the branch names from GitalyClient' do
subject # expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names)
end # subject
# end
it 'wraps GRPC exceptions' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names). # it 'wraps GRPC exceptions' do
and_raise(GRPC::Unknown) # expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names).
expect { subject }.to raise_error(Gitlab::Git::CommandError) # and_raise(GRPC::Unknown)
end # expect { subject }.to raise_error(Gitlab::Git::CommandError)
end # end
# end
end end
describe '#tag_names' do describe '#tag_names' do
...@@ -143,20 +145,21 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -143,20 +145,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
it { is_expected.to include("v1.0.0") } it { is_expected.to include("v1.0.0") }
it { is_expected.not_to include("v5.0.0") } it { is_expected.not_to include("v5.0.0") }
context 'with gitaly enabled' do # TODO: Uncomment when feature is reenabled
before { stub_gitaly } # context 'with gitaly enabled' do
# before { stub_gitaly }
it 'gets the tag names from GitalyClient' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names) # it 'gets the tag names from GitalyClient' do
subject # expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names)
end # subject
# end
it 'wraps GRPC exceptions' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names). # it 'wraps GRPC exceptions' do
and_raise(GRPC::Unknown) # expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names).
expect { subject }.to raise_error(Gitlab::Git::CommandError) # and_raise(GRPC::Unknown)
end # expect { subject }.to raise_error(Gitlab::Git::CommandError)
end # end
# end
end end
shared_examples 'archive check' do |extenstion| shared_examples 'archive check' do |extenstion|
......
...@@ -389,31 +389,32 @@ eos ...@@ -389,31 +389,32 @@ eos
end end
end end
describe '#raw_diffs' do # describe '#raw_diffs' do
context 'Gitaly commit_raw_diffs feature enabled' do # TODO: Uncomment when feature is reenabled
before do # context 'Gitaly commit_raw_diffs feature enabled' do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:commit_raw_diffs).and_return(true) # before do
end # allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:commit_raw_diffs).and_return(true)
# end
context 'when a truthy deltas_only is not passed to args' do #
it 'fetches diffs from Gitaly server' do # context 'when a truthy deltas_only is not passed to args' do
expect(Gitlab::GitalyClient::Commit).to receive(:diff_from_parent). # it 'fetches diffs from Gitaly server' do
with(commit) # expect(Gitlab::GitalyClient::Commit).to receive(:diff_from_parent).
# with(commit)
commit.raw_diffs #
end # commit.raw_diffs
end # end
# end
context 'when a truthy deltas_only is passed to args' do #
it 'fetches diffs using Rugged' do # context 'when a truthy deltas_only is passed to args' do
opts = { deltas_only: true } # it 'fetches diffs using Rugged' do
# opts = { deltas_only: true }
expect(Gitlab::GitalyClient::Commit).not_to receive(:diff_from_parent) #
expect(commit.raw).to receive(:diffs).with(opts) # expect(Gitlab::GitalyClient::Commit).not_to receive(:diff_from_parent)
# expect(commit.raw).to receive(:diffs).with(opts)
commit.raw_diffs(opts) #
end # commit.raw_diffs(opts)
end # end
end # end
end # end
# end
end end
...@@ -110,17 +110,18 @@ describe Environment, models: true do ...@@ -110,17 +110,18 @@ describe Environment, models: true do
end end
end end
context 'Gitaly find_ref_name feature enabled' do # TODO: Uncomment when feature is reenabled
before do # context 'Gitaly find_ref_name feature enabled' do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:find_ref_name).and_return(true) # before do
end # allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:find_ref_name).and_return(true)
# end
it 'calls GitalyClient' do #
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:find_ref_name) # it 'calls GitalyClient' do
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:find_ref_name)
environment.first_deployment_for(commit) #
end # environment.first_deployment_for(commit)
end # end
# end
end end
describe '#environment_type' do describe '#environment_type' do
......
...@@ -622,12 +622,22 @@ describe Note, models: true do ...@@ -622,12 +622,22 @@ describe Note, models: true do
describe 'expiring ETag cache' do describe 'expiring ETag cache' do
let(:note) { build(:note_on_issue) } let(:note) { build(:note_on_issue) }
it "expires cache for note's issue when note is saved" do def expect_expiration(note)
expect_any_instance_of(Gitlab::EtagCaching::Store) expect_any_instance_of(Gitlab::EtagCaching::Store)
.to receive(:touch) .to receive(:touch)
.with("/#{note.project.namespace.to_param}/#{note.project.to_param}/noteable/issue/#{note.noteable.id}/notes") .with("/#{note.project.namespace.to_param}/#{note.project.to_param}/noteable/issue/#{note.noteable.id}/notes")
end
it "expires cache for note's issue when note is saved" do
expect_expiration(note)
note.save! note.save!
end end
it "expires cache for note's issue when note is destroyed" do
expect_expiration(note)
note.destroy!
end
end end
end end
...@@ -1829,16 +1829,17 @@ describe Repository, models: true do ...@@ -1829,16 +1829,17 @@ describe Repository, models: true do
end end
end end
describe '#is_ancestor?' do # TODO: Uncomment when feature is reenabled
context 'Gitaly is_ancestor feature enabled' do # describe '#is_ancestor?' do
it 'asks Gitaly server if it\'s an ancestor' do # context 'Gitaly is_ancestor feature enabled' do
commit = repository.commit # it 'asks Gitaly server if it\'s an ancestor' do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:is_ancestor).and_return(true) # commit = repository.commit
expect(Gitlab::GitalyClient::Commit).to receive(:is_ancestor). # allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:is_ancestor).and_return(true)
with(repository.raw_repository, commit.id, commit.id).and_return(true) # expect(Gitlab::GitalyClient::Commit).to receive(:is_ancestor).
# with(repository.raw_repository, commit.id, commit.id).and_return(true)
expect(repository.is_ancestor?(commit.id, commit.id)).to be true #
end # expect(repository.is_ancestor?(commit.id, commit.id)).to be true
end # end
end # end
# end
end end
...@@ -22,7 +22,8 @@ describe GroupPolicy, models: true do ...@@ -22,7 +22,8 @@ describe GroupPolicy, models: true do
:admin_group, :admin_group,
:admin_namespace, :admin_namespace,
:admin_group_member, :admin_group_member,
:change_visibility_level :change_visibility_level,
:create_subgroup
] ]
end end
......
...@@ -59,6 +59,10 @@ RSpec.configure do |config| ...@@ -59,6 +59,10 @@ RSpec.configure do |config|
TestEnv.init TestEnv.init
end end
config.after(:suite) do
TestEnv.cleanup
end
if ENV['CI'] if ENV['CI']
# Retry only on feature specs that use JS # Retry only on feature specs that use JS
config.around :each, :js do |ex| config.around :each, :js do |ex|
......
if Gitlab::GitalyClient.enabled?
RSpec.configure do |config|
config.before(:each) do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).and_return(true)
end
end
end
...@@ -64,6 +64,8 @@ module TestEnv ...@@ -64,6 +64,8 @@ module TestEnv
# Setup GitLab shell for test instance # Setup GitLab shell for test instance
setup_gitlab_shell setup_gitlab_shell
setup_gitaly if Gitlab::GitalyClient.enabled?
# Create repository for FactoryGirl.create(:project) # Create repository for FactoryGirl.create(:project)
setup_factory_repo setup_factory_repo
...@@ -71,6 +73,10 @@ module TestEnv ...@@ -71,6 +73,10 @@ module TestEnv
setup_forked_repo setup_forked_repo
end end
def cleanup
stop_gitaly
end
def disable_mailer def disable_mailer
allow_any_instance_of(NotificationService).to receive(:mailer). allow_any_instance_of(NotificationService).to receive(:mailer).
and_return(double.as_null_object) and_return(double.as_null_object)
...@@ -92,7 +98,7 @@ module TestEnv ...@@ -92,7 +98,7 @@ module TestEnv
tmp_test_path = Rails.root.join('tmp', 'tests', '**') tmp_test_path = Rails.root.join('tmp', 'tests', '**')
Dir[tmp_test_path].each do |entry| Dir[tmp_test_path].each do |entry|
unless File.basename(entry) =~ /\Agitlab-(shell|test|test_bare|test-fork|test-fork_bare)\z/ unless File.basename(entry) =~ /\A(gitaly|gitlab-(shell|test|test_bare|test-fork|test-fork_bare))\z/
FileUtils.rm_rf(entry) FileUtils.rm_rf(entry)
end end
end end
...@@ -110,6 +116,28 @@ module TestEnv ...@@ -110,6 +116,28 @@ module TestEnv
end end
end end
def setup_gitaly
socket_path = Gitlab::GitalyClient.get_address('default').sub(/\Aunix:/, '')
gitaly_dir = File.dirname(socket_path)
unless File.directory?(gitaly_dir) || system('rake', "gitlab:gitaly:install[#{gitaly_dir}]")
raise "Can't clone gitaly"
end
start_gitaly(gitaly_dir, socket_path)
end
def start_gitaly(gitaly_dir, socket_path)
gitaly_exec = File.join(gitaly_dir, 'gitaly')
@gitaly_pid = spawn({ "GITALY_SOCKET_PATH" => socket_path }, gitaly_exec, [:out, :err] => '/dev/null')
end
def stop_gitaly
return unless @gitaly_pid
Process.kill('KILL', @gitaly_pid)
end
def setup_factory_repo def setup_factory_repo
setup_repo(factory_repo_path, factory_repo_path_bare, factory_repo_name, setup_repo(factory_repo_path, factory_repo_path_bare, factory_repo_name,
BRANCH_SHA) BRANCH_SHA)
......
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