From 3dc6af3d70285b72feb52a41b6ec0bcb9e62aa8b Mon Sep 17 00:00:00 2001 From: Andrew Bezold Date: Thu, 30 Apr 2020 11:11:56 -0400 Subject: [PATCH] Fix creation of Organization repos by Users with max created personal repos (#11183) * Fix creation of Org repos Fix go-gitea#9269 * Change variable name to appease linter * Update PR with suggestions Add a note for user.CanCreateRepo() about failure assumptions Change repo.create help message Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com> --- models/user.go | 1 + routers/repo/repo.go | 21 +++++++++++++++------ templates/repo/create.tmpl | 1 + 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/models/user.go b/models/user.go index 50635273bdf..a89eb144ced 100644 --- a/models/user.go +++ b/models/user.go @@ -279,6 +279,7 @@ func (u *User) MaxCreationLimit() int { } // CanCreateRepo returns if user login can create a repository +// NOTE: functions calling this assume a failure due to repository count limit; if new checks are added, those functions should be revised func (u *User) CanCreateRepo() bool { if u.IsAdmin { return true diff --git a/routers/repo/repo.go b/routers/repo/repo.go index 3f135dd216d..994beef7afe 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -61,7 +61,6 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User { ctx.ServerError("GetOrgsCanCreateRepoByUserID", err) return nil } - ctx.Data["Orgs"] = orgs // Not equal means current user is an organization. if uid == ctx.User.ID || uid == 0 { @@ -84,6 +83,14 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User { return nil } if !ctx.User.IsAdmin { + orgsAvailable := []*models.User{} + for i := 0; i < len(orgs); i++ { + if orgs[i].CanCreateRepo() { + orgsAvailable = append(orgsAvailable, orgs[i]) + } + } + ctx.Data["Orgs"] = orgsAvailable + canCreate, err := org.CanCreateOrgRepo(ctx.User.ID) if err != nil { ctx.ServerError("CanCreateOrgRepo", err) @@ -92,6 +99,8 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User { ctx.Error(403) return nil } + } else { + ctx.Data["Orgs"] = orgs } return org } @@ -111,10 +120,6 @@ func getRepoPrivate(ctx *context.Context) bool { // Create render creating repository page func Create(ctx *context.Context) { - if !ctx.User.CanCreateRepo() { - ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", ctx.User.MaxCreationLimit()), tplCreate, nil) - } - ctx.Data["Title"] = ctx.Tr("new_repo") // Give default value for template to render. @@ -142,7 +147,11 @@ func Create(ctx *context.Context) { } } - ctx.HTML(200, tplCreate) + if !ctx.User.CanCreateRepo() { + ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", ctx.User.MaxCreationLimit()), tplCreate, nil) + } else { + ctx.HTML(200, tplCreate) + } } func handleCreateError(ctx *context.Context, owner *models.User, err error, name string, tpl base.TplName, form interface{}) { diff --git a/templates/repo/create.tmpl b/templates/repo/create.tmpl index bd97f9de1ef..cad60126ef9 100644 --- a/templates/repo/create.tmpl +++ b/templates/repo/create.tmpl @@ -31,6 +31,7 @@ {{end}} + Some organizations may not show up in the dropdown due to a maximum repository count limit