diff options
author | Robert Speicher <robert@gitlab.com> | 2018-01-23 01:54:24 +0300 |
---|---|---|
committer | Robert Speicher <robert@gitlab.com> | 2018-01-23 01:54:24 +0300 |
commit | 4bf2fded92e05420e6d103c8df63d6d83198a684 (patch) | |
tree | e71cd5818fb957d0d5583d30d851538a6d6f2e61 | |
parent | 9c5ba799966bab0a26d49e8a777359d3e85a7dcc (diff) | |
parent | 2c1d7c09483948f764693f30cc070671a93f789f (diff) |
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
-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 c0f7b30ceb0..0570bbc8ee3 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1032,6 +1032,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 987be8e8b46..4d10df410ab 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1951,6 +1951,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 |