diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 46138fad54655..aefdac9ffa208 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -937,9 +937,12 @@ template_helper = Make repository a template
template_description = Template repositories let users generate new repositories with the same directory structure, files, and optional settings.
visibility = Visibility
visibility_description = Only the owner or the organization members if they have rights, will be able to see it.
-visibility_helper = Make repository private
+visibility_helper_private = Make Repository Private
+visibility_helper_public = Make Repository Public
visibility_helper_forced = Your site administrator forces new repositories to be private.
-visibility_fork_helper = (Changing this will affect all forks.)
+visibility_fork_helper = Changing this will affect all forks.
+visibility_credential = With making repository public every one can see your code including imporant data in it.
+visibility.update_error = For making repository private go to danger zone
clone_helper = Need help cloning? Visit Help.
fork_repo = Fork Repository
fork_from = Fork From
diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go
index 0864b1c911ae5..3a8d166c11139 100644
--- a/routers/web/repo/setting/setting.go
+++ b/routers/web/repo/setting/setting.go
@@ -167,15 +167,7 @@ func SettingsPost(ctx *context.Context) {
form.Private = repo.BaseRepo.IsPrivate || repo.BaseRepo.Owner.Visibility == structs.VisibleTypePrivate
}
- visibilityChanged := repo.IsPrivate != form.Private
- // when ForcePrivate enabled, you could change public repo to private, but only admin users can change private to public
- if visibilityChanged && setting.Repository.ForcePrivate && !form.Private && !ctx.Doer.IsAdmin {
- ctx.RenderWithErr(ctx.Tr("form.repository_force_private"), tplSettingsOptions, form)
- return
- }
-
- repo.IsPrivate = form.Private
- if err := repo_service.UpdateRepository(ctx, repo, visibilityChanged); err != nil {
+ if err := repo_service.UpdateRepository(ctx, repo, false); err != nil {
ctx.ServerError("UpdateRepository", err)
return
}
@@ -865,6 +857,43 @@ func SettingsPost(ctx *context.Context) {
ctx.Flash.Success(ctx.Tr("repo.settings.wiki_deletion_success"))
ctx.Redirect(ctx.Repo.RepoLink + "/settings")
+ case "change-visiblity":
+ if ctx.HasError() {
+ ctx.HTML(http.StatusOK, tplSettingsOptions)
+ return
+ }
+ if !ctx.Repo.IsOwner() {
+ ctx.Error(http.StatusNotFound)
+ return
+ }
+ if repo.Name != form.RepoName {
+ ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), tplSettingsOptions, nil)
+ return
+ }
+
+ private := form.Private
+
+ if repo.IsFork {
+ private = repo.BaseRepo.IsPrivate || repo.BaseRepo.Owner.Visibility == structs.VisibleTypePrivate
+ }
+
+ visibilityChanged := repo.IsPrivate != private
+ if visibilityChanged && setting.Repository.ForcePrivate && !private && !ctx.Doer.IsAdmin {
+ ctx.RenderWithErr(ctx.Tr("form.repository_force_private"), tplSettingsOptions, form)
+ return
+ }
+
+ repo.IsPrivate = private
+ if err := repo_service.UpdateRepository(ctx, repo, visibilityChanged); err != nil {
+ ctx.ServerError("UpdateRepository", err)
+ return
+ }
+
+ log.Trace("Repository visibility settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name)
+
+ ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
+ ctx.Redirect(ctx.Repo.RepoLink + "/settings")
+
case "archive":
if !ctx.Repo.IsOwner() {
ctx.Error(http.StatusForbidden)
diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl
index 85ff82fda77a5..e5e8ca3dc35ef 100644
--- a/templates/repo/settings/options.tmpl
+++ b/templates/repo/settings/options.tmpl
@@ -26,14 +26,7 @@
{{if not .Repository.IsFork}}