summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Speicher <robert@gitlab.com>2018-01-22 22:54:24 +0000
committerLuke Bennett <lbennett@gitlab.com>2018-01-23 13:04:38 +0000
commitf899ed43c122caa7284b17b8b40d3b9e3c5c3a7a (patch)
treeabacc259b9b8b0aea1d1aaf5bc679a40d7d5b3c6
parentbf93639b3dc9cc22eaddf70c48e5d142d53b6496 (diff)
downloadgitlab-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.rb2
-rw-r--r--changelogs/unreleased/40612-cannot-change-project-visibility-from-private-even-when-owner.yml6
-rw-r--r--spec/helpers/projects_helper_spec.rb22
-rw-r--r--spec/models/project_spec.rb4
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