Skip to content

Commit d87dfc2

Browse files
committed
Move some repositories' operations to a standalone service package
1 parent a41a965 commit d87dfc2

File tree

10 files changed

+147
-77
lines changed

10 files changed

+147
-77
lines changed

models/repo.go

Lines changed: 10 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,15 +1430,9 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
14301430
t, err := u.getOwnerTeam(e)
14311431
if err != nil {
14321432
return fmt.Errorf("getOwnerTeam: %v", err)
1433-
} else if err = t.addRepository(e, repo); err != nil {
1433+
}
1434+
if err = t.addRepository(e, repo); err != nil {
14341435
return fmt.Errorf("addRepository: %v", err)
1435-
} else if err = prepareWebhooks(e, repo, HookEventRepository, &api.RepositoryPayload{
1436-
Action: api.HookRepoCreated,
1437-
Repository: repo.innerAPIFormat(e, AccessModeOwner, false),
1438-
Organization: u.APIFormat(),
1439-
Sender: doer.APIFormat(),
1440-
}); err != nil {
1441-
return fmt.Errorf("prepareWebhooks: %v", err)
14421436
}
14431437
} else if err = repo.recalculateAccesses(e); err != nil {
14441438
// Organization automatically called this in addRepository method.
@@ -1522,11 +1516,6 @@ func CreateRepository(doer, u *User, opts CreateRepoOptions) (_ *Repository, err
15221516
return nil, err
15231517
}
15241518

1525-
// Add to hook queue for created repo after session commit.
1526-
if u.IsOrganization() {
1527-
go HookQueue.Add(repo.ID)
1528-
}
1529-
15301519
return repo, err
15311520
}
15321521

@@ -2044,18 +2033,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
20442033
return fmt.Errorf("Commit: %v", err)
20452034
}
20462035

2047-
if org.IsOrganization() {
2048-
if err = PrepareWebhooks(repo, HookEventRepository, &api.RepositoryPayload{
2049-
Action: api.HookRepoDeleted,
2050-
Repository: repo.APIFormat(AccessModeOwner),
2051-
Organization: org.APIFormat(),
2052-
Sender: doer.APIFormat(),
2053-
}); err != nil {
2054-
return err
2055-
}
2056-
go HookQueue.Add(repo.ID)
2057-
}
2058-
20592036
if len(repo.Avatar) > 0 {
20602037
avatarPath := repo.CustomAvatarPath()
20612038
if com.IsExist(avatarPath) {
@@ -2065,7 +2042,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
20652042
}
20662043
}
20672044

2068-
DeleteRepoFromIndexer(repo)
20692045
return nil
20702046
}
20712047

@@ -2521,22 +2497,22 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) {
25212497
}
25222498

25232499
// ForkRepository forks a repository
2524-
func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
2525-
forkedRepo, err := oldRepo.GetUserFork(u.ID)
2500+
func ForkRepository(doer, owner *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
2501+
forkedRepo, err := oldRepo.GetUserFork(owner.ID)
25262502
if err != nil {
25272503
return nil, err
25282504
}
25292505
if forkedRepo != nil {
25302506
return nil, ErrForkAlreadyExist{
2531-
Uname: u.Name,
2507+
Uname: owner.Name,
25322508
RepoName: oldRepo.FullName(),
25332509
ForkName: forkedRepo.FullName(),
25342510
}
25352511
}
25362512

25372513
repo := &Repository{
2538-
OwnerID: u.ID,
2539-
Owner: u,
2514+
OwnerID: owner.ID,
2515+
Owner: owner,
25402516
Name: name,
25412517
LowerName: strings.ToLower(name),
25422518
Description: desc,
@@ -2553,17 +2529,17 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
25532529
return nil, err
25542530
}
25552531

2556-
if err = createRepository(sess, doer, u, repo); err != nil {
2532+
if err = createRepository(sess, doer, owner, repo); err != nil {
25572533
return nil, err
25582534
}
25592535

25602536
if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", oldRepo.ID); err != nil {
25612537
return nil, err
25622538
}
25632539

2564-
repoPath := RepoPath(u.Name, repo.Name)
2540+
repoPath := RepoPath(owner.Name, repo.Name)
25652541
_, stderr, err := process.GetManager().ExecTimeout(10*time.Minute,
2566-
fmt.Sprintf("ForkRepository(git clone): %s/%s", u.Name, repo.Name),
2542+
fmt.Sprintf("ForkRepository(git clone): %s/%s", owner.Name, repo.Name),
25672543
git.GitExecutable, "clone", "--bare", oldRepo.repoPath(sess), repoPath)
25682544
if err != nil {
25692545
return nil, fmt.Errorf("git clone: %v", stderr)
@@ -2586,24 +2562,6 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
25862562
return nil, err
25872563
}
25882564

2589-
oldMode, _ := AccessLevel(doer, oldRepo)
2590-
mode, _ := AccessLevel(doer, repo)
2591-
2592-
if err = PrepareWebhooks(oldRepo, HookEventFork, &api.ForkPayload{
2593-
Forkee: oldRepo.APIFormat(oldMode),
2594-
Repo: repo.APIFormat(mode),
2595-
Sender: doer.APIFormat(),
2596-
}); err != nil {
2597-
log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
2598-
} else {
2599-
go HookQueue.Add(oldRepo.ID)
2600-
}
2601-
2602-
// Add to hook queue for created repo after session commit.
2603-
if u.IsOrganization() {
2604-
go HookQueue.Add(repo.ID)
2605-
}
2606-
26072565
if err = repo.UpdateSize(); err != nil {
26082566
log.Error("Failed to update size for repository: %v", err)
26092567
}
@@ -2616,7 +2574,6 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
26162574
}
26172575

26182576
var lfsObjects []*LFSMetaObject
2619-
26202577
if err = sess2.Where("repository_id=?", oldRepo.ID).Find(&lfsObjects); err != nil {
26212578
return nil, err
26222579
}

modules/notification/indexer/indexer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (r *indexerNotifier) NotifyDeleteComment(doer *models.User, comment *models
9898

9999
func (r *indexerNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
100100
issue_indexer.DeleteRepoIssueIndexer(repo)
101+
models.DeleteRepoFromIndexer(repo)
101102
}
102103

103104
func (r *indexerNotifier) NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string) {

modules/notification/webhook/webhook.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,67 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model
6565
go models.HookQueue.Add(issue.RepoID)
6666
}
6767
}
68+
69+
func (m *webhookNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
70+
oldMode, _ := models.AccessLevel(doer, oldRepo)
71+
mode, _ := models.AccessLevel(doer, repo)
72+
73+
// forked webhook
74+
if err := models.PrepareWebhooks(oldRepo, models.HookEventFork, &api.ForkPayload{
75+
Forkee: oldRepo.APIFormat(oldMode),
76+
Repo: repo.APIFormat(mode),
77+
Sender: doer.APIFormat(),
78+
}); err != nil {
79+
log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
80+
} else {
81+
go models.HookQueue.Add(oldRepo.ID)
82+
}
83+
84+
u := repo.MustOwner()
85+
86+
// Add to hook queue for created repo after session commit.
87+
if u.IsOrganization() {
88+
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
89+
Action: api.HookRepoCreated,
90+
Repository: repo.APIFormat(models.AccessModeOwner),
91+
Organization: u.APIFormat(),
92+
Sender: doer.APIFormat(),
93+
}); err != nil {
94+
log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
95+
} else {
96+
go models.HookQueue.Add(repo.ID)
97+
}
98+
}
99+
}
100+
101+
func (m *webhookNotifier) NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) {
102+
// Add to hook queue for created repo after session commit.
103+
if u.IsOrganization() {
104+
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
105+
Action: api.HookRepoCreated,
106+
Repository: repo.APIFormat(models.AccessModeOwner),
107+
Organization: u.APIFormat(),
108+
Sender: doer.APIFormat(),
109+
}); err != nil {
110+
log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
111+
} else {
112+
go models.HookQueue.Add(repo.ID)
113+
}
114+
}
115+
}
116+
117+
func (m *webhookNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
118+
u := repo.MustOwner()
119+
120+
if u.IsOrganization() {
121+
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
122+
Action: api.HookRepoDeleted,
123+
Repository: repo.APIFormat(models.AccessModeOwner),
124+
Organization: u.APIFormat(),
125+
Sender: doer.APIFormat(),
126+
}); err != nil {
127+
log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
128+
}
129+
go models.HookQueue.Add(repo.ID)
130+
}
131+
}

routers/admin/repos.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"code.gitea.io/gitea/modules/log"
1212
"code.gitea.io/gitea/modules/setting"
1313
"code.gitea.io/gitea/routers"
14+
repo_service "code.gitea.io/gitea/services/repository"
1415
)
1516

1617
const (
@@ -38,7 +39,7 @@ func DeleteRepo(ctx *context.Context) {
3839
return
3940
}
4041

41-
if err := models.DeleteRepository(ctx.User, repo.MustOwner().ID, repo.ID); err != nil {
42+
if err := repo_service.DeleteRepository(ctx.User, repo.MustOwner().ID, repo.ID); err != nil {
4243
ctx.ServerError("DeleteRepository", err)
4344
return
4445
}

routers/api/v1/repo/fork.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"code.gitea.io/gitea/models"
99
"code.gitea.io/gitea/modules/context"
1010
api "code.gitea.io/gitea/modules/structs"
11+
repo_service "code.gitea.io/gitea/services/repository"
1112
)
1213

1314
// ListForks list a repository's forks
@@ -97,10 +98,12 @@ func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
9798
}
9899
forker = org
99100
}
100-
fork, err := models.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
101+
102+
fork, err := repo_service.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
101103
if err != nil {
102104
ctx.Error(500, "ForkRepository", err)
103105
return
104106
}
107+
105108
ctx.JSON(202, fork.APIFormat(models.AccessModeOwner))
106109
}

routers/api/v1/repo/repo.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"code.gitea.io/gitea/modules/validation"
2525
"code.gitea.io/gitea/routers/api/v1/convert"
2626
mirror_service "code.gitea.io/gitea/services/mirror"
27+
repo_service "code.gitea.io/gitea/services/repository"
2728
)
2829

2930
var searchOrderByMap = map[string]map[string]models.SearchOrderBy{
@@ -207,7 +208,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR
207208
if opt.AutoInit && opt.Readme == "" {
208209
opt.Readme = "Default"
209210
}
210-
repo, err := models.CreateRepository(ctx.User, owner, models.CreateRepoOptions{
211+
repo, err := repo_service.CreateRepository(ctx.User, owner, models.CreateRepoOptions{
211212
Name: opt.Name,
212213
Description: opt.Description,
213214
IssueLabels: opt.IssueLabels,
@@ -224,18 +225,11 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR
224225
models.IsErrNamePatternNotAllowed(err) {
225226
ctx.Error(422, "", err)
226227
} else {
227-
if repo != nil {
228-
if err = models.DeleteRepository(ctx.User, ctx.User.ID, repo.ID); err != nil {
229-
log.Error("DeleteRepository: %v", err)
230-
}
231-
}
232228
ctx.Error(500, "CreateRepository", err)
233229
}
234230
return
235231
}
236232

237-
notification.NotifyCreateRepository(ctx.User, owner, repo)
238-
239233
ctx.JSON(201, repo.APIFormat(models.AccessModeOwner))
240234
}
241235

@@ -433,7 +427,7 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) {
433427

434428
repo, err := migrations.MigrateRepository(ctx.User, ctxUser.Name, opts)
435429
if err == nil {
436-
notification.NotifyCreateRepository(ctx.User, ctxUser, repo)
430+
notification.NotifyMigrateRepository(ctx.User, ctxUser, repo)
437431

438432
log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName)
439433
ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin))
@@ -887,7 +881,7 @@ func Delete(ctx *context.APIContext) {
887881
}
888882
}
889883

890-
if err := models.DeleteRepository(ctx.User, owner.ID, repo.ID); err != nil {
884+
if err := repo_service.DeleteRepository(ctx.User, owner.ID, repo.ID); err != nil {
891885
ctx.Error(500, "DeleteRepository", err)
892886
return
893887
}

routers/repo/pull.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"code.gitea.io/gitea/modules/util"
2626
"code.gitea.io/gitea/services/gitdiff"
2727
pull_service "code.gitea.io/gitea/services/pull"
28+
repo_service "code.gitea.io/gitea/services/repository"
2829

2930
"github.com/unknwon/com"
3031
)
@@ -208,7 +209,7 @@ func ForkPost(ctx *context.Context, form auth.CreateRepoForm) {
208209
}
209210
}
210211

211-
repo, err := models.ForkRepository(ctx.User, ctxUser, forkRepo, form.RepoName, form.Description)
212+
repo, err := repo_service.ForkRepository(ctx.User, ctxUser, forkRepo, form.RepoName, form.Description)
212213
if err != nil {
213214
ctx.Data["Err_RepoName"] = true
214215
switch {

routers/repo/repo.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import (
1717
"code.gitea.io/gitea/modules/git"
1818
"code.gitea.io/gitea/modules/log"
1919
"code.gitea.io/gitea/modules/migrations"
20-
"code.gitea.io/gitea/modules/notification"
2120
"code.gitea.io/gitea/modules/setting"
2221
"code.gitea.io/gitea/modules/task"
2322
"code.gitea.io/gitea/modules/util"
23+
repo_service "code.gitea.io/gitea/services/repository"
2424

2525
"github.com/unknwon/com"
2626
)
@@ -170,7 +170,7 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) {
170170
return
171171
}
172172

173-
repo, err := models.CreateRepository(ctx.User, ctxUser, models.CreateRepoOptions{
173+
repo, err := repo_service.CreateRepository(ctx.User, ctxUser, models.CreateRepoOptions{
174174
Name: form.RepoName,
175175
Description: form.Description,
176176
Gitignores: form.Gitignores,
@@ -181,19 +181,11 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) {
181181
AutoInit: form.AutoInit,
182182
})
183183
if err == nil {
184-
notification.NotifyCreateRepository(ctx.User, ctxUser, repo)
185-
186184
log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name)
187185
ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name)
188186
return
189187
}
190188

191-
if repo != nil {
192-
if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil {
193-
log.Error("DeleteRepository: %v", errDelete)
194-
}
195-
}
196-
197189
handleCreateError(ctx, ctxUser, err, "CreatePost", tplCreate, &form)
198190
}
199191

routers/repo/setting.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
407407
return
408408
}
409409

410-
if err := models.DeleteRepository(ctx.User, ctx.Repo.Owner.ID, repo.ID); err != nil {
410+
if err := repo_service.DeleteRepository(ctx.User, ctx.Repo.Owner.ID, repo.ID); err != nil {
411411
ctx.ServerError("DeleteRepository", err)
412412
return
413413
}

0 commit comments

Comments
 (0)