Skip to content

Commit 8b48d86

Browse files
committed
fix
1 parent d072f83 commit 8b48d86

File tree

14 files changed

+59
-70
lines changed

14 files changed

+59
-70
lines changed

models/organization/org.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,6 @@ func (org *Organization) HomeLink() string {
178178
return org.AsUser().HomeLink()
179179
}
180180

181-
// CanCreateRepo returns if user login can create a repository
182-
// NOTE: functions calling this assume a failure due to repository count limit; if new checks are added, those functions should be revised
183-
func (org *Organization) CanCreateRepo() bool {
184-
return org.AsUser().CanCreateRepo()
185-
}
186-
187181
// FindOrgMembersOpts represensts find org members conditions
188182
type FindOrgMembersOpts struct {
189183
db.ListOptions

models/repo/update.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,31 +111,31 @@ func (err ErrRepoFilesAlreadyExist) Unwrap() error {
111111
return util.ErrAlreadyExist
112112
}
113113

114-
// CheckCreateRepository check if could created a repository
115-
func CheckCreateRepository(ctx context.Context, doer, u *user_model.User, name string, overwriteOrAdopt bool) error {
116-
if !doer.IsAdmin && !u.CanCreateRepo() {
117-
return ErrReachLimitOfRepo{u.MaxRepoCreation}
114+
// CheckCreateRepository check if doer could create a repository in new owner
115+
func CheckCreateRepository(ctx context.Context, doer, owner *user_model.User, name string, overwriteOrAdopt bool) error {
116+
if !doer.CanCreateRepoIn(owner) {
117+
return ErrReachLimitOfRepo{owner.MaxRepoCreation}
118118
}
119119

120120
if err := IsUsableRepoName(name); err != nil {
121121
return err
122122
}
123123

124-
has, err := IsRepositoryModelOrDirExist(ctx, u, name)
124+
has, err := IsRepositoryModelOrDirExist(ctx, owner, name)
125125
if err != nil {
126126
return fmt.Errorf("IsRepositoryExist: %w", err)
127127
} else if has {
128-
return ErrRepoAlreadyExist{u.Name, name}
128+
return ErrRepoAlreadyExist{owner.Name, name}
129129
}
130130

131-
repoPath := RepoPath(u.Name, name)
131+
repoPath := RepoPath(owner.Name, name)
132132
isExist, err := util.IsExist(repoPath)
133133
if err != nil {
134134
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
135135
return err
136136
}
137137
if !overwriteOrAdopt && isExist {
138-
return ErrRepoFilesAlreadyExist{u.Name, name}
138+
return ErrRepoFilesAlreadyExist{owner.Name, name}
139139
}
140140
return nil
141141
}

models/user/user.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -247,19 +247,19 @@ func (u *User) MaxCreationLimit() int {
247247
return u.MaxRepoCreation
248248
}
249249

250-
// CanCreateRepo returns if user login can create a repository
251-
// NOTE: functions calling this assume a failure due to repository count limit; if new checks are added, those functions should be revised
252-
func (u *User) CanCreateRepo() bool {
250+
// CanCreateRepoIn checks whether the doer(u) can create a repository in the owner
251+
func (u *User) CanCreateRepoIn(owner *User) bool {
253252
if u.IsAdmin {
254253
return true
255254
}
256-
if u.MaxRepoCreation <= -1 {
257-
if setting.Repository.MaxCreationLimit <= -1 {
255+
const noLimit = -1
256+
if owner.MaxRepoCreation == noLimit {
257+
if setting.Repository.MaxCreationLimit == noLimit {
258258
return true
259259
}
260-
return u.NumRepos < setting.Repository.MaxCreationLimit
260+
return owner.NumRepos < setting.Repository.MaxCreationLimit
261261
}
262-
return u.NumRepos < u.MaxRepoCreation
262+
return owner.NumRepos < owner.MaxRepoCreation
263263
}
264264

265265
// CanCreateOrganization returns true if user can create organisation.
@@ -272,13 +272,11 @@ func (u *User) CanEditGitHook() bool {
272272
return !setting.DisableGitHooks && (u.IsAdmin || u.AllowGitHook)
273273
}
274274

275-
// CanForkRepo returns if user login can fork a repository
276-
// It checks especially that the user can create repos, and potentially more
277-
func (u *User) CanForkRepo() bool {
275+
func (u *User) CanForkRepoIn(owner *User) bool {
278276
if setting.Repository.AllowForkWithoutMaximumLimit {
279277
return true
280278
}
281-
return u.CanCreateRepo()
279+
return u.CanCreateRepoIn(owner)
282280
}
283281

284282
// CanImportLocal returns true if user can migrate repository by local path.

routers/web/repo/fork.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func getForkRepository(ctx *context.Context) *repo_model.Repository {
9696
} else if len(orgs) > 0 {
9797
ctx.Data["ContextUser"] = orgs[0]
9898
} else {
99-
ctx.Data["CanForkRepo"] = false
99+
ctx.Data["CanForkRepoInDoer"] = false
100100
ctx.Flash.Error(ctx.Tr("repo.fork_no_valid_owners"), true)
101101
return nil
102102
}
@@ -121,8 +121,8 @@ func getForkRepository(ctx *context.Context) *repo_model.Repository {
121121
func Fork(ctx *context.Context) {
122122
ctx.Data["Title"] = ctx.Tr("new_fork")
123123

124-
if ctx.Doer.CanForkRepo() {
125-
ctx.Data["CanForkRepo"] = true
124+
if ctx.Doer.CanForkRepoIn(ctx.Doer) {
125+
ctx.Data["CanForkRepoInDoer"] = true
126126
} else {
127127
maxCreationLimit := ctx.Doer.MaxCreationLimit()
128128
msg := ctx.TrN(maxCreationLimit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", maxCreationLimit)
@@ -141,7 +141,7 @@ func Fork(ctx *context.Context) {
141141
func ForkPost(ctx *context.Context) {
142142
form := web.GetForm(ctx).(*forms.CreateRepoForm)
143143
ctx.Data["Title"] = ctx.Tr("new_fork")
144-
ctx.Data["CanForkRepo"] = true
144+
ctx.Data["CanForkRepoInDoer"] = true
145145

146146
ctxUser := checkContextUser(ctx, form.UID)
147147
if ctx.Written() {

routers/web/repo/repo.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,13 @@ func checkContextUser(ctx *context.Context, uid int64) *user_model.User {
8787
return nil
8888
}
8989

90-
if !ctx.Doer.IsAdmin {
91-
orgsAvailable := []*organization.Organization{}
92-
for i := 0; i < len(orgs); i++ {
93-
if orgs[i].CanCreateRepo() {
94-
orgsAvailable = append(orgsAvailable, orgs[i])
95-
}
90+
var orgsAvailable []*organization.Organization
91+
for i := 0; i < len(orgs); i++ {
92+
if ctx.Doer.CanCreateRepoIn(orgs[i].AsUser()) {
93+
orgsAvailable = append(orgsAvailable, orgs[i])
9694
}
97-
ctx.Data["Orgs"] = orgsAvailable
98-
} else {
99-
ctx.Data["Orgs"] = orgs
10095
}
96+
ctx.Data["Orgs"] = orgsAvailable
10197

10298
// Not equal means current user is an organization.
10399
if uid == ctx.Doer.ID || uid == 0 {
@@ -154,7 +150,7 @@ func createCommon(ctx *context.Context) {
154150
ctx.Data["Licenses"] = repo_module.Licenses
155151
ctx.Data["Readmes"] = repo_module.Readmes
156152
ctx.Data["IsForcedPrivate"] = setting.Repository.ForcePrivate
157-
ctx.Data["CanCreateRepoInDoer"] = ctx.Doer.CanCreateRepo()
153+
ctx.Data["CanCreateRepoInDoer"] = ctx.Doer.CanCreateRepoIn(ctx.Doer)
158154
ctx.Data["MaxCreationLimitOfDoer"] = ctx.Doer.MaxCreationLimit()
159155
ctx.Data["SupportedObjectFormats"] = git.DefaultFeatures().SupportedObjectFormats
160156
ctx.Data["DefaultObjectFormat"] = git.Sha1ObjectFormat

routers/web/repo/setting/setting.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func SettingsCtxData(ctx *context.Context) {
5959
ctx.Data["DisableNewPushMirrors"] = setting.Mirror.DisableNewPush
6060
ctx.Data["DefaultMirrorInterval"] = setting.Mirror.DefaultInterval
6161
ctx.Data["MinimumMirrorInterval"] = setting.Mirror.MinInterval
62+
ctx.Data["CanConvertFork"] = ctx.Repo.Repository.IsFork && ctx.Doer.CanCreateRepoIn(ctx.Repo.Repository.Owner)
6263

6364
signing, _ := asymkey_service.SigningKey(ctx, ctx.Repo.Repository.RepoPath())
6465
ctx.Data["SigningKeyAvailable"] = len(signing) > 0
@@ -786,7 +787,7 @@ func handleSettingsPostConvertFork(ctx *context.Context) {
786787
return
787788
}
788789

789-
if !ctx.Repo.Owner.CanCreateRepo() {
790+
if !ctx.Doer.CanForkRepoIn(ctx.Repo.Owner) {
790791
maxCreationLimit := ctx.Repo.Owner.MaxCreationLimit()
791792
msg := ctx.TrN(maxCreationLimit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", maxCreationLimit)
792793
ctx.Flash.Error(msg)

services/repository/adopt.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ import (
2929
)
3030

3131
// AdoptRepository adopts pre-existing repository files for the user/organization.
32-
func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) {
33-
if !doer.IsAdmin && !u.CanCreateRepo() {
32+
func AdoptRepository(ctx context.Context, doer, owner *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) {
33+
if !doer.CanCreateRepoIn(owner) {
3434
return nil, repo_model.ErrReachLimitOfRepo{
35-
Limit: u.MaxRepoCreation,
35+
Limit: owner.MaxRepoCreation,
3636
}
3737
}
3838

3939
repo := &repo_model.Repository{
40-
OwnerID: u.ID,
41-
Owner: u,
42-
OwnerName: u.Name,
40+
OwnerID: owner.ID,
41+
Owner: owner,
42+
OwnerName: owner.Name,
4343
Name: opts.Name,
4444
LowerName: strings.ToLower(opts.Name),
4545
Description: opts.Description,
@@ -60,12 +60,12 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
6060
}
6161
if !isExist {
6262
return repo_model.ErrRepoNotExist{
63-
OwnerName: u.Name,
63+
OwnerName: owner.Name,
6464
Name: repo.Name,
6565
}
6666
}
6767

68-
if err := CreateRepositoryByExample(ctx, doer, u, repo, true, false); err != nil {
68+
if err := CreateRepositoryByExample(ctx, doer, owner, repo, true, false); err != nil {
6969
return err
7070
}
7171

@@ -100,7 +100,7 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
100100
}
101101
return nil, err
102102
}
103-
notify_service.AdoptRepository(ctx, doer, u, repo)
103+
notify_service.AdoptRepository(ctx, doer, owner, repo)
104104

105105
return repo, nil
106106
}

services/repository/create.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ func initRepository(ctx context.Context, u *user_model.User, repo *repo_model.Re
200200
}
201201

202202
// CreateRepositoryDirectly creates a repository for the user/organization.
203-
func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) {
204-
if !doer.IsAdmin && !u.CanCreateRepo() {
203+
func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) {
204+
if !doer.CanCreateRepoIn(owner) {
205205
return nil, repo_model.ErrReachLimitOfRepo{
206-
Limit: u.MaxRepoCreation,
206+
Limit: owner.MaxRepoCreation,
207207
}
208208
}
209209

@@ -223,9 +223,9 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
223223
}
224224

225225
repo := &repo_model.Repository{
226-
OwnerID: u.ID,
227-
Owner: u,
228-
OwnerName: u.Name,
226+
OwnerID: owner.ID,
227+
Owner: owner,
228+
OwnerName: owner.Name,
229229
Name: opts.Name,
230230
LowerName: strings.ToLower(opts.Name),
231231
Description: opts.Description,
@@ -247,7 +247,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
247247
var rollbackRepo *repo_model.Repository
248248

249249
if err := db.WithTx(ctx, func(ctx context.Context) error {
250-
if err := CreateRepositoryByExample(ctx, doer, u, repo, false, false); err != nil {
250+
if err := CreateRepositoryByExample(ctx, doer, owner, repo, false, false); err != nil {
251251
return err
252252
}
253253

@@ -271,7 +271,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
271271
// So we will now fail and delegate to other functionality to adopt or delete
272272
log.Error("Files already exist in %s and we are not going to adopt or delete.", repo.FullName())
273273
return repo_model.ErrRepoFilesAlreadyExist{
274-
Uname: u.Name,
274+
Uname: owner.Name,
275275
Name: repo.Name,
276276
}
277277
}
@@ -280,7 +280,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
280280
if err2 := gitrepo.DeleteRepository(ctx, repo); err2 != nil {
281281
log.Error("initRepository: %v", err)
282282
return fmt.Errorf(
283-
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)
283+
"delete repo directory %s/%s failed(2): %v", owner.Name, repo.Name, err2)
284284
}
285285
return fmt.Errorf("initRepository: %w", err)
286286
}
@@ -289,7 +289,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
289289
if len(opts.IssueLabels) > 0 {
290290
if err = repo_module.InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil {
291291
rollbackRepo = repo
292-
rollbackRepo.OwnerID = u.ID
292+
rollbackRepo.OwnerID = owner.ID
293293
return fmt.Errorf("InitializeLabels: %w", err)
294294
}
295295
}
@@ -302,7 +302,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
302302
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
303303
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
304304
rollbackRepo = repo
305-
rollbackRepo.OwnerID = u.ID
305+
rollbackRepo.OwnerID = owner.ID
306306
return fmt.Errorf("CreateRepository(git update-server-info): %w", err)
307307
}
308308

@@ -315,7 +315,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
315315
if err != nil {
316316
log.Error("CreateRepository(git rev-parse HEAD) in %v: Stdout: %s\nError: %v", repo, stdout, err)
317317
rollbackRepo = repo
318-
rollbackRepo.OwnerID = u.ID
318+
rollbackRepo.OwnerID = owner.ID
319319
return fmt.Errorf("CreateRepository(git rev-parse HEAD): %w", err)
320320
}
321321
if err := repo_model.UpdateRepoLicenses(ctx, repo, stdout, licenses); err != nil {

services/repository/fork.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
6565
}
6666

6767
// Fork is prohibited, if user has reached maximum limit of repositories
68-
if !owner.CanForkRepo() {
68+
if !doer.CanForkRepoIn(owner) {
6969
return nil, repo_model.ErrReachLimitOfRepo{
7070
Limit: owner.MaxRepoCreation,
7171
}

services/repository/template.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func GenerateProtectedBranch(ctx context.Context, templateRepo, generateRepo *re
6363

6464
// GenerateRepository generates a repository from a template
6565
func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templateRepo *repo_model.Repository, opts GenerateRepoOptions) (_ *repo_model.Repository, err error) {
66-
if !doer.IsAdmin && !owner.CanCreateRepo() {
66+
if !doer.CanCreateRepoIn(owner) {
6767
return nil, repo_model.ErrReachLimitOfRepo{
6868
Limit: owner.MaxRepoCreation,
6969
}

services/repository/transfer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func AcceptTransferOwnership(ctx context.Context, repo *repo_model.Repository, d
6161
return err
6262
}
6363

64-
if !doer.IsAdmin && !repoTransfer.Recipient.CanCreateRepo() {
64+
if !doer.CanCreateRepoIn(repoTransfer.Recipient) {
6565
limit := util.Iif(repoTransfer.Recipient.MaxRepoCreation >= 0, repoTransfer.Recipient.MaxRepoCreation, setting.Repository.MaxCreationLimit)
6666
return LimitReachedError{Limit: limit}
6767
}
@@ -416,7 +416,7 @@ func StartRepositoryTransfer(ctx context.Context, doer, newOwner *user_model.Use
416416
return err
417417
}
418418

419-
if !doer.IsAdmin && !newOwner.CanCreateRepo() {
419+
if !doer.CanForkRepoIn(newOwner) {
420420
limit := util.Iif(newOwner.MaxRepoCreation >= 0, newOwner.MaxRepoCreation, setting.Repository.MaxCreationLimit)
421421
return LimitReachedError{Limit: limit}
422422
}

services/repository/transfer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func TestRepositoryTransferRejection(t *testing.T) {
144144
require.NotNil(t, transfer)
145145
require.NoError(t, transfer.LoadRecipient(db.DefaultContext))
146146

147-
require.True(t, transfer.Recipient.CanCreateRepo()) // admin is not subject to limits
147+
require.True(t, doerAdmin.CanCreateRepoIn(transfer.Recipient)) // admin is not subject to limits
148148

149149
// Administrator should not be affected by the limits so transfer should be successful
150150
assert.NoError(t, AcceptTransferOwnership(db.DefaultContext, repo, doerAdmin))
@@ -158,7 +158,7 @@ func TestRepositoryTransferRejection(t *testing.T) {
158158
require.NotNil(t, transfer)
159159
require.NoError(t, transfer.LoadRecipient(db.DefaultContext))
160160

161-
require.False(t, transfer.Recipient.CanCreateRepo()) // regular user is subject to limits
161+
require.False(t, doer.CanCreateRepoIn(transfer.Recipient)) // regular user is subject to limits
162162

163163
// Cannot accept because of the limit
164164
err = AcceptTransferOwnership(db.DefaultContext, repo, doer)

templates/repo/pulls/fork.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575

7676
<div class="inline field">
7777
<label></label>
78-
<button class="ui primary button{{if not .CanForkRepo}} disabled{{end}}">
78+
<button class="ui primary button{{if not .CanForkRepoInDoer}} disabled{{end}}">
7979
{{ctx.Locale.Tr "repo.fork_repo"}}
8080
</button>
8181
</div>

templates/repo/settings/options.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@
802802
</div>
803803
</div>
804804
{{end}}
805-
{{if and .Repository.IsFork .Repository.Owner.CanCreateRepo}}
805+
{{if .CanConvertFork}}
806806
<div class="flex-item">
807807
<div class="flex-item-main">
808808
<div class="flex-item-title">{{ctx.Locale.Tr "repo.settings.convert_fork"}}</div>
@@ -916,7 +916,7 @@
916916
</div>
917917
</div>
918918
{{end}}
919-
{{if and .Repository.IsFork .Repository.Owner.CanCreateRepo}}
919+
{{if .CanConvertFork}}
920920
<div class="ui small modal" id="convert-fork-repo-modal">
921921
<div class="header">
922922
{{ctx.Locale.Tr "repo.settings.convert_fork"}}

0 commit comments

Comments
 (0)