diff options
author | Robert Speicher <robert@gitlab.com> | 2018-01-22 22:54:24 +0000 |
---|---|---|
committer | Luke Bennett <lbennett@gitlab.com> | 2018-01-23 13:04:38 +0000 |
commit | f899ed43c122caa7284b17b8b40d3b9e3c5c3a7a (patch) | |
tree | abacc259b9b8b0aea1d1aaf5bc679a40d7d5b3c6 | |
parent | bf93639b3dc9cc22eaddf70c48e5d142d53b6496 (diff) | |
download | gitlab-ce-f899ed43c122caa7284b17b8b40d3b9e3c5c3a7a.tar.gz |
Merge branch '40612-cannot-change-project-visibility-from-private-even-when-owner' into 'master'
Resolve "Cannot change project visibility from Private (even when owner)"
Closes #40612
See merge request gitlab-org/gitlab-ce!16595
(cherry picked from commit 4bf2fded92e05420e6d103c8df63d6d83198a684)
94f31ccc fix issue in which projects which have forks cannot be changed from private to public
1eefc384 add CHANGELOG.md entry for !16595
003f140c ensure fork_source returns nil when project is the root fork, add tests
96862096 add test to can_change_visibility_level? method
de4993d4 remove redundant forked? check
2c1d7c09 fix spacing and wrap method params in parens
-rw-r--r-- | app/models/project.rb | 2 | ||||
-rw-r--r-- | changelogs/unreleased/40612-cannot-change-project-visibility-from-private-even-when-owner.yml | 6 | ||||
-rw-r--r-- | spec/helpers/projects_helper_spec.rb | 22 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 4 |
4 files changed, 28 insertions, 6 deletions
diff --git a/app/models/project.rb b/app/models/project.rb index fbe65e700a4..53a306b8258 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1023,6 +1023,8 @@ class Project < ActiveRecord::Base end def fork_source + return nil unless forked? + forked_from_project || fork_network&.root_project end diff --git a/changelogs/unreleased/40612-cannot-change-project-visibility-from-private-even-when-owner.yml b/changelogs/unreleased/40612-cannot-change-project-visibility-from-private-even-when-owner.yml new file mode 100644 index 00000000000..96bb59d303c --- /dev/null +++ b/changelogs/unreleased/40612-cannot-change-project-visibility-from-private-even-when-owner.yml @@ -0,0 +1,6 @@ +--- +title: Fix bug in which projects with forks could not change visibility settings from + Private to Public +merge_request: 16595 +author: +type: fixed diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index ede9d232efd..c0251bf7dc0 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe ProjectsHelper do + include ProjectForksHelper + describe "#project_status_css_class" do it "returns appropriate class" do expect(project_status_css_class("started")).to eq("active") @@ -10,9 +12,9 @@ describe ProjectsHelper do end describe "can_change_visibility_level?" do - let(:project) { create(:project, :repository) } + let(:project) { create(:project) } let(:user) { create(:project_member, :reporter, user: create(:user), project: project).user } - let(:fork_project) { Projects::ForkService.new(project, user).execute } + let(:forked_project) { fork_project(project, user) } it "returns false if there are no appropriate permissions" do allow(helper).to receive(:can?) { false } @@ -26,21 +28,29 @@ describe ProjectsHelper do expect(helper.can_change_visibility_level?(project, user)).to be_truthy end + it 'allows visibility level to be changed if the project is forked' do + allow(helper).to receive(:can?).with(user, :change_visibility_level, project) { true } + project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + fork_project(project) + + expect(helper.can_change_visibility_level?(project, user)).to be_truthy + end + context "forks" do it "returns false if there are permissions and origin project is PRIVATE" do allow(helper).to receive(:can?) { true } - project.update visibility_level: Gitlab::VisibilityLevel::PRIVATE + project.update(visibility_level: Gitlab::VisibilityLevel::PRIVATE) - expect(helper.can_change_visibility_level?(fork_project, user)).to be_falsey + expect(helper.can_change_visibility_level?(forked_project, user)).to be_falsey end it "returns true if there are permissions and origin project is INTERNAL" do allow(helper).to receive(:can?) { true } - project.update visibility_level: Gitlab::VisibilityLevel::INTERNAL + project.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - expect(helper.can_change_visibility_level?(fork_project, user)).to be_truthy + expect(helper.can_change_visibility_level?(forked_project, user)).to be_truthy end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 00afa09f1a3..6f24dd6811e 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1952,6 +1952,10 @@ describe Project do expect(second_fork.fork_source).to eq(project) end + + it 'returns nil if it is the root of the fork network' do + expect(project.fork_source).to be_nil + end end describe '#lfs_storage_project' do |