Skip to content

Commit 6bfb6cf

Browse files
committed
Apply Feedback
1 parent 772a60b commit 6bfb6cf

File tree

4 files changed

+43
-50
lines changed

4 files changed

+43
-50
lines changed

services/org/org.go

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,34 +21,9 @@ import (
2121
// DeleteOrganization completely and permanently deletes everything of organization.
2222
func DeleteOrganization(ctx context.Context, org *org_model.Organization, purge bool) error {
2323
if purge {
24-
// Delete all repos belonging to this organisation
25-
// Now this is not within a transaction because there are internal transactions within the DeleteRepository
26-
// BUT: the db will still be consistent even if a number of repos have already been deleted.
27-
// And in fact we want to capture any repositories that are being created in other transactions in the meantime
28-
//
29-
// An alternative option here would be write a DeleteAllRepositoriesForUserID function which would delete all of the repos
30-
// but such a function would likely get out of date
31-
for {
32-
repos, _, err := repo_model.GetUserRepositories(&repo_model.SearchRepoOptions{
33-
ListOptions: db.ListOptions{
34-
PageSize: repo_model.RepositoryListDefaultPageSize,
35-
Page: 1,
36-
},
37-
Private: true,
38-
OwnerID: org.ID,
39-
Actor: org.AsUser(),
40-
})
41-
if err != nil {
42-
return fmt.Errorf("GetUserRepositories: %w", err)
43-
}
44-
if len(repos) == 0 {
45-
break
46-
}
47-
for _, repo := range repos {
48-
if err := repo_service.DeleteRepositoryDirectly(ctx, org.AsUser(), org.ID, repo.ID); err != nil {
49-
return fmt.Errorf("unable to delete repository %s for %s[%d]. Error: %w", repo.Name, org.Name, org.ID, err)
50-
}
51-
}
24+
err := repo_service.DeleteOwnerRepositoriesDirectly(ctx, org.AsUser())
25+
if err != nil {
26+
return err
5227
}
5328
}
5429

services/repository/delete.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,3 +422,30 @@ func RemoveRepositoryFromTeam(ctx context.Context, t *organization.Team, repoID
422422

423423
return committer.Commit()
424424
}
425+
426+
// DeleteOwnerRepositoriesDirectly calls DeleteRepositoryDirectly for all repos of the given owner
427+
func DeleteOwnerRepositoriesDirectly(ctx context.Context, owner *user_model.User) error {
428+
for {
429+
repos, _, err := repo_model.GetUserRepositories(&repo_model.SearchRepoOptions{
430+
ListOptions: db.ListOptions{
431+
PageSize: repo_model.RepositoryListDefaultPageSize,
432+
Page: 1,
433+
},
434+
Private: true,
435+
OwnerID: owner.ID,
436+
Actor: owner,
437+
})
438+
if err != nil {
439+
return fmt.Errorf("GetUserRepositories: %w", err)
440+
}
441+
if len(repos) == 0 {
442+
break
443+
}
444+
for _, repo := range repos {
445+
if err := DeleteRepositoryDirectly(ctx, owner, owner.ID, repo.ID); err != nil {
446+
return fmt.Errorf("unable to delete repository %s for %s[%d]. Error: %w", repo.Name, owner.Name, owner.ID, err)
447+
}
448+
}
449+
}
450+
return nil
451+
}

services/repository/delete_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"code.gitea.io/gitea/models/organization"
1111
repo_model "code.gitea.io/gitea/models/repo"
1212
"code.gitea.io/gitea/models/unittest"
13+
user_model "code.gitea.io/gitea/models/user"
1314

1415
"github.com/stretchr/testify/assert"
1516
)
@@ -43,3 +44,11 @@ func TestTeam_RemoveRepository(t *testing.T) {
4344
testSuccess(2, 5)
4445
testSuccess(1, unittest.NonexistentID)
4546
}
47+
48+
func TestDeleteOwnerRepositoriesDirectly(t *testing.T) {
49+
assert.NoError(t, unittest.PrepareTestDatabase())
50+
51+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
52+
53+
assert.NoError(t, DeleteOwnerRepositoriesDirectly(db.DefaultContext, user))
54+
}

services/user/user.go

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -159,27 +159,9 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
159159
//
160160
// An alternative option here would be write a DeleteAllRepositoriesForUserID function which would delete all of the repos
161161
// but such a function would likely get out of date
162-
for {
163-
repos, _, err := repo_model.GetUserRepositories(&repo_model.SearchRepoOptions{
164-
ListOptions: db.ListOptions{
165-
PageSize: repo_model.RepositoryListDefaultPageSize,
166-
Page: 1,
167-
},
168-
Private: true,
169-
OwnerID: u.ID,
170-
Actor: u,
171-
})
172-
if err != nil {
173-
return fmt.Errorf("GetUserRepositories: %w", err)
174-
}
175-
if len(repos) == 0 {
176-
break
177-
}
178-
for _, repo := range repos {
179-
if err := repo_service.DeleteRepositoryDirectly(ctx, u, u.ID, repo.ID); err != nil {
180-
return fmt.Errorf("unable to delete repository %s for %s[%d]. Error: %w", repo.Name, u.Name, u.ID, err)
181-
}
182-
}
162+
err := repo_service.DeleteOwnerRepositoriesDirectly(ctx, u)
163+
if err != nil {
164+
return err
183165
}
184166

185167
// Remove from Organizations and delete last owner organizations
@@ -209,7 +191,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
209191
if organization.IsErrLastOrgOwner(err) {
210192
err = org_service.DeleteOrganization(ctx, org, true)
211193
if err != nil {
212-
return fmt.Errorf("unable to delete organisation %d: %w", org.ID, err)
194+
return fmt.Errorf("unable to delete organization %d: %w", org.ID, err)
213195
}
214196
}
215197
if err != nil {

0 commit comments

Comments
 (0)