summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Maczukin <tomasz@maczukin.pl>2015-11-04 23:40:43 +0100
committerTomasz Maczukin <tomasz@maczukin.pl>2015-11-04 23:42:02 +0100
commit89ecba5e6cec6632c2f8e3baef6604b1b8ea0d45 (patch)
tree0e41d551c0ae8f7d159c3d8b7bba02532d2ae9bb
parent3bc012db77e1b59986362d8de0660b97a15c9d1f (diff)
downloadgitlab-ce-89ecba5e6cec6632c2f8e3baef6604b1b8ea0d45.tar.gz
Update forks visibility_level after parent project visibility_level change
-rw-r--r--app/models/project.rb6
-rw-r--r--app/services/projects/update_service.rb48
2 files changed, 40 insertions, 14 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index 7f2dd37a3cc..f287e59b6df 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -731,7 +731,11 @@ class Project < ActiveRecord::Base
end
def forks_count
- ForkedProjectLink.where(forked_from_project_id: self.id).count
+ forks.count
+ end
+
+ def forks
+ ForkedProjectLink.where(forked_from_project_id: self.id)
end
def find_label(name)
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index 0a42f3e02aa..0d2665f298d 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -3,21 +3,17 @@ module Projects
def execute
# check that user is allowed to set specified visibility_level
new_visibility = params[:visibility_level]
- if new_visibility && new_visibility.to_i != project.visibility_level
- unless can?(current_user, :change_visibility_level, project) &&
- Gitlab::VisibilityLevel.allowed_for?(current_user, new_visibility)
- deny_visibility_level(project, new_visibility)
- return project
+ if new_visibility
+ if new_visibility.to_i != project.visibility_level
+ unless can?(current_user, :change_visibility_level, project) &&
+ Gitlab::VisibilityLevel.allowed_for?(current_user, new_visibility)
+ deny_visibility_level(project, new_visibility)
+ return project
+ end
end
- end
- unless project.visibility_level_allowed?(new_visibility)
- level_name = Gitlab::VisibilityLevel.level_name(new_visibility)
- project.errors.add(
- :visibility_level,
- "#{level_name} could not be set as visibility level of this project - parent project settings are more restrictive"
- )
- return false
+ return false unless visibility_level_allowed?(new_visibility)
+ update_forks_visibility_level(new_visibility)
end
new_branch = params[:default_branch]
@@ -32,5 +28,31 @@ module Projects
end
end
end
+
+ private
+
+ def visibility_level_allowed?(level)
+ return true if project.visibility_level_allowed?(level)
+
+ level_name = Gitlab::VisibilityLevel.level_name(level)
+ project.errors.add(
+ :visibility_level,
+ "#{level_name} could not be set as visibility level of this project - parent project settings are more restrictive"
+ )
+
+ false
+ end
+
+ def update_forks_visibility_level(new_level)
+ project.forks.each do |forked_link|
+ forked_project = forked_link.forked_to_project
+ fork_level = forked_project.visibility_level
+
+ if fork_level > new_level.to_i
+ forked_project.visibility_level = new_level.to_i
+ forked_project.save!
+ end
+ end
+ end
end
end