Commit 4bf2fded authored by Robert Speicher's avatar Robert Speicher

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
parents 9c5ba799 2c1d7c09
...@@ -1032,6 +1032,8 @@ class Project < ActiveRecord::Base ...@@ -1032,6 +1032,8 @@ class Project < ActiveRecord::Base
end end
def fork_source def fork_source
return nil unless forked?
forked_from_project || fork_network&.root_project forked_from_project || fork_network&.root_project
end end
......
---
title: Fix bug in which projects with forks could not change visibility settings from
Private to Public
merge_request: 16595
author:
type: fixed
require 'spec_helper' require 'spec_helper'
describe ProjectsHelper do describe ProjectsHelper do
include ProjectForksHelper
describe "#project_status_css_class" do describe "#project_status_css_class" do
it "returns appropriate class" do it "returns appropriate class" do
expect(project_status_css_class("started")).to eq("active") expect(project_status_css_class("started")).to eq("active")
...@@ -10,9 +12,9 @@ describe ProjectsHelper do ...@@ -10,9 +12,9 @@ describe ProjectsHelper do
end end
describe "can_change_visibility_level?" do 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(: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 it "returns false if there are no appropriate permissions" do
allow(helper).to receive(:can?) { false } allow(helper).to receive(:can?) { false }
...@@ -26,21 +28,29 @@ describe ProjectsHelper do ...@@ -26,21 +28,29 @@ describe ProjectsHelper do
expect(helper.can_change_visibility_level?(project, user)).to be_truthy expect(helper.can_change_visibility_level?(project, user)).to be_truthy
end 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 context "forks" do
it "returns false if there are permissions and origin project is PRIVATE" do it "returns false if there are permissions and origin project is PRIVATE" do
allow(helper).to receive(:can?) { true } 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 end
it "returns true if there are permissions and origin project is INTERNAL" do it "returns true if there are permissions and origin project is INTERNAL" do
allow(helper).to receive(:can?) { true } 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 end
end end
......
...@@ -1951,6 +1951,10 @@ describe Project do ...@@ -1951,6 +1951,10 @@ describe Project do
expect(second_fork.fork_source).to eq(project) expect(second_fork.fork_source).to eq(project)
end end
it 'returns nil if it is the root of the fork network' do
expect(project.fork_source).to be_nil
end
end end
describe '#lfs_storage_project' do describe '#lfs_storage_project' do
......
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