diff options
-rw-r--r-- | options/locale/locale_en-US.ini | 12 | ||||
-rw-r--r-- | routers/web/repo/setting/setting.go | 43 | ||||
-rw-r--r-- | services/repository/repository.go | 25 | ||||
-rw-r--r-- | templates/repo/settings/options.tmpl | 63 |
4 files changed, 120 insertions, 23 deletions
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 28b3df6c49..b30504edd7 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -2466,6 +2466,18 @@ settings.thread_id = Thread ID settings.matrix.homeserver_url = Homeserver URL settings.matrix.room_id = Room ID settings.matrix.message_type = Message Type +settings.visibility.private.button = Make Private +settings.visibility.private.text = Changing the visibility to private will not only make the repo visible to only allowed members but may remove the relation between it and forks, watchers, and stars. +settings.visibility.private.bullet_title = <strong>Changing the visibility to private will:</strong> +settings.visibility.private.bullet_one = Make the repo visible to only allowed members. +settings.visibility.private.bullet_two = May remove the relation between it and <strong>forks</strong>, <strong>watchers</strong>, and <strong>stars</strong>. +settings.visibility.public.button = Make Public +settings.visibility.public.text = Changing the visibility to public will make the repo visible to anyone. +settings.visibility.public.bullet_title= <strong>Changing the visibility to public will:</strong> +settings.visibility.public.bullet_one = Make the repo visible to anyone. +settings.visibility.success = Repository visibility changed. +settings.visibility.error = An error occurred while trying to change the repo visibility. +settings.visibility.fork_error = Can't change the visibility of a forked repo. settings.archive.button = Archive Repo settings.archive.header = Archive This Repo settings.archive.text = Archiving the repo will make it entirely read-only. It will be hidden from the dashboard. Nobody (not even you!) will be able to make new commits, or open any issues or pull requests. diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 1e0349cdee..3f9140857a 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -170,15 +170,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 } @@ -940,6 +932,39 @@ func SettingsPost(ctx *context.Context) { log.Trace("Repository was un-archived: %s/%s", ctx.Repo.Owner.Name, repo.Name) ctx.Redirect(ctx.Repo.RepoLink + "/settings") + case "visibility": + if repo.IsFork { + ctx.Flash.Error(ctx.Tr("repo.settings.visibility.fork_error")) + ctx.Redirect(ctx.Repo.RepoLink + "/settings") + return + } + + var err error + + // when ForcePrivate enabled, you could change public repo to private, but only admin users can change private to public + if setting.Repository.ForcePrivate && repo.IsPrivate && !ctx.Doer.IsAdmin { + ctx.RenderWithErr(ctx.Tr("form.repository_force_private"), tplSettingsOptions, form) + return + } + + if repo.IsPrivate { + err = repo_service.MakeRepoPublic(ctx, repo) + } else { + err = repo_service.MakeRepoPrivate(ctx, repo) + } + + if err != nil { + log.Error("Tried to change the visibility of the repo: %s", err) + ctx.Flash.Error(ctx.Tr("repo.settings.visibility.error")) + ctx.Redirect(ctx.Repo.RepoLink + "/settings") + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.visibility.success")) + + log.Trace("Repository visibility changed: %s/%s", ctx.Repo.Owner.Name, repo.Name) + ctx.Redirect(ctx.Repo.RepoLink + "/settings") + default: ctx.NotFound("", nil) } diff --git a/services/repository/repository.go b/services/repository/repository.go index b7aac3cfe0..5306e7d45c 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -122,6 +122,31 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili return committer.Commit() } +func UpdateRepositoryVisibility(ctx context.Context, repo *repo_model.Repository, isPrivate bool) (err error) { + ctx, committer, err := db.TxContext(ctx) + if err != nil { + return err + } + + defer committer.Close() + + repo.IsPrivate = isPrivate + + if err = repo_module.UpdateRepository(ctx, repo, true); err != nil { + return fmt.Errorf("UpdateRepositoryVisibility: %w", err) + } + + return committer.Commit() +} + +func MakeRepoPublic(ctx context.Context, repo *repo_model.Repository) (err error) { + return UpdateRepositoryVisibility(ctx, repo, false) +} + +func MakeRepoPrivate(ctx context.Context, repo *repo_model.Repository) (err error) { + return UpdateRepositoryVisibility(ctx, repo, true) +} + // LinkedRepository returns the linked repo if any func LinkedRepository(ctx context.Context, a *repo_model.Attachment) (*repo_model.Repository, unit.Type, error) { if a.IssueID != 0 { diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl index 4f98133df3..f12bbbdf4a 100644 --- a/templates/repo/settings/options.tmpl +++ b/templates/repo/settings/options.tmpl @@ -23,20 +23,6 @@ <label>{{ctx.Locale.Tr "repo.template_helper"}}</label> </div> </div> - {{if not .Repository.IsFork}} - <div class="inline field"> - <label>{{ctx.Locale.Tr "repo.visibility"}}</label> - <div class="ui checkbox" {{if and (not .Repository.IsPrivate) (gt .Repository.NumStars 0)}}data-tooltip-content="{{ctx.Locale.Tr "repo.stars_remove_warning"}}"{{end}}> - {{if .IsAdmin}} - <input name="private" type="checkbox" {{if .Repository.IsPrivate}}checked{{end}}> - {{else}} - <input name="private" type="checkbox" {{if .Repository.IsPrivate}}checked{{end}}{{if and $.ForcePrivate .Repository.IsPrivate}} disabled{{end}}> - {{if and .Repository.IsPrivate $.ForcePrivate}}<input type="hidden" name="private" value="{{.Repository.IsPrivate}}">{{end}} - {{end}} - <label>{{ctx.Locale.Tr "repo.visibility_helper"}} {{if .Repository.NumForks}}<span class="text red">{{ctx.Locale.Tr "repo.visibility_fork_helper"}}</span>{{end}}</label> - </div> - </div> - {{end}} <div class="field {{if .Err_Description}}error{{end}}"> <label for="description">{{ctx.Locale.Tr "repo.repo_desc"}}</label> <textarea id="description" name="description" rows="2" maxlength="2048">{{.Repository.Description}}</textarea> @@ -786,6 +772,27 @@ </h4> <div class="ui attached error danger segment"> <div class="flex-list"> + {{if not .Repository.IsFork}} + <div class="flex-item tw-items-center"> + <div class="flex-item-main"> + <div class="flex-item-title">{{ctx.Locale.Tr "repo.visibility"}}</div> + {{if .Repository.IsPrivate}} + <div class="flex-item-body">{{ctx.Locale.Tr "repo.settings.visibility.public.text"}}</div> + {{else}} + <div class="flex-item-body">{{ctx.Locale.Tr "repo.settings.visibility.private.text"}}</div> + {{end}} + </div> + <div class="flex-item-trailing"> + <button class="ui basic red show-modal button" data-modal="#visibility-repo-modal"> + {{if .Repository.IsPrivate}} + {{ctx.Locale.Tr "repo.settings.visibility.public.button"}} + {{else}} + {{ctx.Locale.Tr "repo.settings.visibility.private.button"}} + {{end}} + </button> + </div> + </div> + {{end}} {{if .Repository.IsMirror}} <div class="flex-item"> <div class="flex-item-main"> @@ -1012,6 +1019,34 @@ </div> </div> + {{if not .Repository.IsFork}} + <div class="ui g-modal-confirm modal" id="visibility-repo-modal"> + <div class="header"> + {{ctx.Locale.Tr "repo.visibility"}} + </div> + <div class="content"> + {{if .Repository.IsPrivate}} + <p>{{ctx.Locale.Tr "repo.settings.visibility.public.bullet_title"}}</p> + <ul> + <li>{{ctx.Locale.Tr "repo.settings.visibility.public.bullet_one"}}</li> + </ul> + {{else}} + <p>{{ctx.Locale.Tr "repo.settings.visibility.private.bullet_title"}}</p> + <ul> + <li>{{ctx.Locale.Tr "repo.settings.visibility.private.bullet_one"}}</li> + <li>{{ctx.Locale.Tr "repo.settings.visibility.private.bullet_two"}}{{if .Repository.NumForks}}<span class="text red">{{ctx.Locale.Tr "repo.visibility_fork_helper"}}</span>{{end}}</li> + </ul> + {{end}} + </div> + <form action="{{.Link}}" method="post"> + {{.CsrfTokenHtml}} + <input type="hidden" name="action" value="visibility"> + <input type="hidden" name="repo_id" value="{{.Repository.ID}}"> + {{template "base/modal_actions_confirm" .}} + </form> + </div> + {{end}} + {{if .Repository.UnitEnabled $.Context ctx.Consts.RepoUnitTypeWiki}} <div class="ui small modal" id="delete-wiki-modal"> <div class="header"> |