mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	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>
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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{}) { | ||||
|   | ||||
| @@ -31,6 +31,7 @@ | ||||
| 								{{end}} | ||||
| 							</div> | ||||
| 						</div> | ||||
| 						<span class="help">Some organizations may not show up in the dropdown due to a maximum repository count limit</span> | ||||
| 					</div> | ||||
|  | ||||
| 					<div class="inline required field {{if .Err_RepoName}}error{{end}}"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user