Skip to content

Commit 4959bf1

Browse files
authored
Move create release from models to a standalone package (#7539)
* move create release from models to a standalone package * fix lint * fix comment year * fix lint * fix lint * fix package import name * fix vendor * fix go mod * some refactors * fix vendor * use go1.12 make vendor * fix vendor
1 parent be0f7ff commit 4959bf1

File tree

6 files changed

+189
-145
lines changed

6 files changed

+189
-145
lines changed

models/release.go

Lines changed: 11 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -112,43 +112,20 @@ func IsReleaseExist(repoID int64, tagName string) (bool, error) {
112112
return x.Get(&Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)})
113113
}
114114

115-
func createTag(gitRepo *git.Repository, rel *Release) error {
116-
// Only actual create when publish.
117-
if !rel.IsDraft {
118-
if !gitRepo.IsTagExist(rel.TagName) {
119-
commit, err := gitRepo.GetCommit(rel.Target)
120-
if err != nil {
121-
return fmt.Errorf("GetCommit: %v", err)
122-
}
123-
124-
// Trim '--' prefix to prevent command line argument vulnerability.
125-
rel.TagName = strings.TrimPrefix(rel.TagName, "--")
126-
if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil {
127-
if strings.Contains(err.Error(), "is not a valid tag name") {
128-
return ErrInvalidTagName{rel.TagName}
129-
}
130-
return err
131-
}
132-
rel.LowerTagName = strings.ToLower(rel.TagName)
133-
}
134-
commit, err := gitRepo.GetTagCommit(rel.TagName)
135-
if err != nil {
136-
return fmt.Errorf("GetTagCommit: %v", err)
137-
}
115+
// InsertRelease inserts a release
116+
func InsertRelease(rel *Release) error {
117+
_, err := x.Insert(rel)
118+
return err
119+
}
138120

139-
rel.Sha1 = commit.ID.String()
140-
rel.CreatedUnix = timeutil.TimeStamp(commit.Author.When.Unix())
141-
rel.NumCommits, err = commit.CommitsCount()
142-
if err != nil {
143-
return fmt.Errorf("CommitsCount: %v", err)
144-
}
145-
} else {
146-
rel.CreatedUnix = timeutil.TimeStampNow()
147-
}
148-
return nil
121+
// UpdateRelease updates all columns of a release
122+
func UpdateRelease(rel *Release) error {
123+
_, err := x.ID(rel.ID).AllCols().Update(rel)
124+
return err
149125
}
150126

151-
func addReleaseAttachments(releaseID int64, attachmentUUIDs []string) (err error) {
127+
// AddReleaseAttachments adds a release attachments
128+
func AddReleaseAttachments(releaseID int64, attachmentUUIDs []string) (err error) {
152129
// Check attachments
153130
var attachments = make([]*Attachment, 0)
154131
for _, uuid := range attachmentUUIDs {
@@ -173,51 +150,6 @@ func addReleaseAttachments(releaseID int64, attachmentUUIDs []string) (err error
173150
return
174151
}
175152

176-
// CreateRelease creates a new release of repository.
177-
func CreateRelease(gitRepo *git.Repository, rel *Release, attachmentUUIDs []string) error {
178-
isExist, err := IsReleaseExist(rel.RepoID, rel.TagName)
179-
if err != nil {
180-
return err
181-
} else if isExist {
182-
return ErrReleaseAlreadyExist{rel.TagName}
183-
}
184-
185-
if err = createTag(gitRepo, rel); err != nil {
186-
return err
187-
}
188-
rel.LowerTagName = strings.ToLower(rel.TagName)
189-
190-
_, err = x.InsertOne(rel)
191-
if err != nil {
192-
return err
193-
}
194-
195-
err = addReleaseAttachments(rel.ID, attachmentUUIDs)
196-
if err != nil {
197-
return err
198-
}
199-
200-
if !rel.IsDraft {
201-
if err := rel.LoadAttributes(); err != nil {
202-
log.Error("LoadAttributes: %v", err)
203-
} else {
204-
mode, _ := AccessLevel(rel.Publisher, rel.Repo)
205-
if err := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{
206-
Action: api.HookReleasePublished,
207-
Release: rel.APIFormat(),
208-
Repository: rel.Repo.APIFormat(mode),
209-
Sender: rel.Publisher.APIFormat(),
210-
}); err != nil {
211-
log.Error("PrepareWebhooks: %v", err)
212-
} else {
213-
go HookQueue.Add(rel.Repo.ID)
214-
}
215-
}
216-
}
217-
218-
return nil
219-
}
220-
221153
// GetRelease returns release by given ID.
222154
func GetRelease(repoID int64, tagName string) (*Release, error) {
223155
isExist, err := IsReleaseExist(repoID, tagName)
@@ -385,40 +317,6 @@ func SortReleases(rels []*Release) {
385317
sort.Sort(sorter)
386318
}
387319

388-
// UpdateRelease updates information of a release.
389-
func UpdateRelease(doer *User, gitRepo *git.Repository, rel *Release, attachmentUUIDs []string) (err error) {
390-
if err = createTag(gitRepo, rel); err != nil {
391-
return err
392-
}
393-
rel.LowerTagName = strings.ToLower(rel.TagName)
394-
395-
_, err = x.ID(rel.ID).AllCols().Update(rel)
396-
if err != nil {
397-
return err
398-
}
399-
400-
err = rel.loadAttributes(x)
401-
if err != nil {
402-
return err
403-
}
404-
405-
err = addReleaseAttachments(rel.ID, attachmentUUIDs)
406-
407-
mode, _ := AccessLevel(doer, rel.Repo)
408-
if err1 := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{
409-
Action: api.HookReleaseUpdated,
410-
Release: rel.APIFormat(),
411-
Repository: rel.Repo.APIFormat(mode),
412-
Sender: doer.APIFormat(),
413-
}); err1 != nil {
414-
log.Error("PrepareWebhooks: %v", err)
415-
} else {
416-
go HookQueue.Add(rel.Repo.ID)
417-
}
418-
419-
return err
420-
}
421-
422320
// DeleteReleaseByID deletes a release and corresponding Git tag by given ID.
423321
func DeleteReleaseByID(id int64, doer *User, delTag bool) error {
424322
rel, err := GetReleaseByID(id)

models/repo_mirror.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,12 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) {
318318
return parseRemoteUpdateOutput(output), true
319319
}
320320

321+
// RunMirrorSync will invoke Mirror's runSync
322+
func RunMirrorSync(mirror *Mirror) bool {
323+
_, ok := mirror.runSync()
324+
return ok
325+
}
326+
321327
func getMirrorByRepoID(e Engine, repoID int64) (*Mirror, error) {
322328
m := &Mirror{RepoID: repoID}
323329
has, err := e.Get(m)

routers/api/v1/repo/release.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"code.gitea.io/gitea/modules/context"
1010
"code.gitea.io/gitea/modules/setting"
1111
api "code.gitea.io/gitea/modules/structs"
12+
releaseservice "code.gitea.io/gitea/services/release"
1213
)
1314

1415
// GetRelease get a single release of a repository
@@ -168,7 +169,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
168169
IsTag: false,
169170
Repo: ctx.Repo.Repository,
170171
}
171-
if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
172+
if err := releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
172173
if models.IsErrReleaseAlreadyExist(err) {
173174
ctx.Status(409)
174175
} else {
@@ -191,7 +192,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
191192
rel.Repo = ctx.Repo.Repository
192193
rel.Publisher = ctx.User
193194

194-
if err = models.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, nil); err != nil {
195+
if err = releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, nil); err != nil {
195196
ctx.ServerError("UpdateRelease", err)
196197
return
197198
}
@@ -262,7 +263,7 @@ func EditRelease(ctx *context.APIContext, form api.EditReleaseOption) {
262263
if form.IsPrerelease != nil {
263264
rel.IsPrerelease = *form.IsPrerelease
264265
}
265-
if err := models.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, nil); err != nil {
266+
if err := releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, nil); err != nil {
266267
ctx.Error(500, "UpdateRelease", err)
267268
return
268269
}

routers/repo/release.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"code.gitea.io/gitea/modules/log"
1616
"code.gitea.io/gitea/modules/markup/markdown"
1717
"code.gitea.io/gitea/modules/setting"
18+
releaseservice "code.gitea.io/gitea/services/release"
1819
)
1920

2021
const (
@@ -175,7 +176,7 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) {
175176
IsTag: false,
176177
}
177178

178-
if err = models.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
179+
if err = releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
179180
ctx.Data["Err_TagName"] = true
180181
switch {
181182
case models.IsErrReleaseAlreadyExist(err):
@@ -202,7 +203,7 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) {
202203
rel.PublisherID = ctx.User.ID
203204
rel.IsTag = false
204205

205-
if err = models.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
206+
if err = releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
206207
ctx.Data["Err_TagName"] = true
207208
ctx.ServerError("UpdateRelease", err)
208209
return
@@ -281,7 +282,7 @@ func EditReleasePost(ctx *context.Context, form auth.EditReleaseForm) {
281282
rel.Note = form.Content
282283
rel.IsDraft = len(form.Draft) > 0
283284
rel.IsPrerelease = form.Prerelease
284-
if err = models.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
285+
if err = releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil {
285286
ctx.ServerError("UpdateRelease", err)
286287
return
287288
}

services/release/release.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Copyright 2019 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package release
6+
7+
import (
8+
"fmt"
9+
"strings"
10+
11+
"code.gitea.io/gitea/models"
12+
"code.gitea.io/gitea/modules/git"
13+
"code.gitea.io/gitea/modules/log"
14+
api "code.gitea.io/gitea/modules/structs"
15+
"code.gitea.io/gitea/modules/timeutil"
16+
)
17+
18+
func createTag(gitRepo *git.Repository, rel *models.Release) error {
19+
// Only actual create when publish.
20+
if !rel.IsDraft {
21+
if !gitRepo.IsTagExist(rel.TagName) {
22+
commit, err := gitRepo.GetCommit(rel.Target)
23+
if err != nil {
24+
return fmt.Errorf("GetCommit: %v", err)
25+
}
26+
27+
// Trim '--' prefix to prevent command line argument vulnerability.
28+
rel.TagName = strings.TrimPrefix(rel.TagName, "--")
29+
if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil {
30+
if strings.Contains(err.Error(), "is not a valid tag name") {
31+
return models.ErrInvalidTagName{
32+
TagName: rel.TagName,
33+
}
34+
}
35+
return err
36+
}
37+
rel.LowerTagName = strings.ToLower(rel.TagName)
38+
}
39+
commit, err := gitRepo.GetTagCommit(rel.TagName)
40+
if err != nil {
41+
return fmt.Errorf("GetTagCommit: %v", err)
42+
}
43+
44+
rel.Sha1 = commit.ID.String()
45+
rel.CreatedUnix = timeutil.TimeStamp(commit.Author.When.Unix())
46+
rel.NumCommits, err = commit.CommitsCount()
47+
if err != nil {
48+
return fmt.Errorf("CommitsCount: %v", err)
49+
}
50+
} else {
51+
rel.CreatedUnix = timeutil.TimeStampNow()
52+
}
53+
return nil
54+
}
55+
56+
// CreateRelease creates a new release of repository.
57+
func CreateRelease(gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string) error {
58+
isExist, err := models.IsReleaseExist(rel.RepoID, rel.TagName)
59+
if err != nil {
60+
return err
61+
} else if isExist {
62+
return models.ErrReleaseAlreadyExist{
63+
TagName: rel.TagName,
64+
}
65+
}
66+
67+
if err = createTag(gitRepo, rel); err != nil {
68+
return err
69+
}
70+
71+
rel.LowerTagName = strings.ToLower(rel.TagName)
72+
if err = models.InsertRelease(rel); err != nil {
73+
return err
74+
}
75+
76+
if err = models.AddReleaseAttachments(rel.ID, attachmentUUIDs); err != nil {
77+
return err
78+
}
79+
80+
if !rel.IsDraft {
81+
if err := rel.LoadAttributes(); err != nil {
82+
log.Error("LoadAttributes: %v", err)
83+
} else {
84+
mode, _ := models.AccessLevel(rel.Publisher, rel.Repo)
85+
if err := models.PrepareWebhooks(rel.Repo, models.HookEventRelease, &api.ReleasePayload{
86+
Action: api.HookReleasePublished,
87+
Release: rel.APIFormat(),
88+
Repository: rel.Repo.APIFormat(mode),
89+
Sender: rel.Publisher.APIFormat(),
90+
}); err != nil {
91+
log.Error("PrepareWebhooks: %v", err)
92+
} else {
93+
go models.HookQueue.Add(rel.Repo.ID)
94+
}
95+
}
96+
}
97+
98+
return nil
99+
}
100+
101+
// UpdateRelease updates information of a release.
102+
func UpdateRelease(doer *models.User, gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string) (err error) {
103+
if err = createTag(gitRepo, rel); err != nil {
104+
return err
105+
}
106+
rel.LowerTagName = strings.ToLower(rel.TagName)
107+
108+
if err = models.UpdateRelease(rel); err != nil {
109+
return err
110+
}
111+
112+
if err = rel.LoadAttributes(); err != nil {
113+
return err
114+
}
115+
116+
err = models.AddReleaseAttachments(rel.ID, attachmentUUIDs)
117+
118+
// even if attachments added failed, hooks will be still triggered
119+
mode, _ := models.AccessLevel(doer, rel.Repo)
120+
if err1 := models.PrepareWebhooks(rel.Repo, models.HookEventRelease, &api.ReleasePayload{
121+
Action: api.HookReleaseUpdated,
122+
Release: rel.APIFormat(),
123+
Repository: rel.Repo.APIFormat(mode),
124+
Sender: doer.APIFormat(),
125+
}); err1 != nil {
126+
log.Error("PrepareWebhooks: %v", err)
127+
} else {
128+
go models.HookQueue.Add(rel.Repo.ID)
129+
}
130+
131+
return err
132+
}

0 commit comments

Comments
 (0)