aboutsummaryrefslogtreecommitdiff
path: root/models/release.go
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2017-03-13 04:32:20 -0400
committerUnknwon <u@gogs.io>2017-03-13 04:32:20 -0400
commit1df54ea0cde038e2057d083078f952c072d0dc67 (patch)
treec5466e010f5ed8e236f5b021e669f9aa37ea0047 /models/release.go
parente6df2259abdeb75545f53a5ca4c247491b5c3d7f (diff)
release: able to add attchments to release (#1614)
Added new config section '[release.attachment]’.
Diffstat (limited to 'models/release.go')
-rw-r--r--models/release.go57
1 files changed, 52 insertions, 5 deletions
diff --git a/models/release.go b/models/release.go
index 08192370..47771bc1 100644
--- a/models/release.go
+++ b/models/release.go
@@ -39,6 +39,8 @@ type Release struct {
Created time.Time `xorm:"-"`
CreatedUnix int64
+
+ Attachments []*Attachment `xorm:"-"`
}
func (r *Release) BeforeInsert() {
@@ -74,6 +76,13 @@ func (r *Release) loadAttributes(e Engine) (err error) {
}
}
+ if r.Attachments == nil {
+ r.Attachments, err = getAttachmentsByReleaseID(e, r.ID)
+ if err != nil {
+ return fmt.Errorf("getAttachmentsByReleaseID [%d]: %v", r.ID, err)
+ }
+ }
+
return nil
}
@@ -150,8 +159,8 @@ func (r *Release) preparePublishWebhooks() {
}
}
-// CreateRelease creates a new release of repository.
-func CreateRelease(gitRepo *git.Repository, r *Release) error {
+// NewRelease creates a new release with attachments for repository.
+func NewRelease(gitRepo *git.Repository, r *Release, uuids []string) error {
isExist, err := IsReleaseExist(r.RepoID, r.TagName)
if err != nil {
return err
@@ -163,10 +172,27 @@ func CreateRelease(gitRepo *git.Repository, r *Release) error {
return err
}
r.LowerTagName = strings.ToLower(r.TagName)
- if _, err = x.Insert(r); err != nil {
+
+ sess := x.NewSession()
+ defer sessionRelease(sess)
+ if err = sess.Begin(); err != nil {
+ return err
+ }
+
+ if _, err = sess.Insert(r); err != nil {
return fmt.Errorf("Insert: %v", err)
}
+ if len(uuids) > 0 {
+ if _, err = sess.In("uuid", uuids).Cols("release_id").Update(&Attachment{ReleaseID: r.ID}); err != nil {
+ return fmt.Errorf("link attachments: %v", err)
+ }
+ }
+
+ if err = sess.Commit(); err != nil {
+ return fmt.Errorf("Commit: %v", err)
+ }
+
// Only send webhook when actually published, skip drafts
if r.IsDraft {
return nil
@@ -254,15 +280,36 @@ func SortReleases(rels []*Release) {
}
// UpdateRelease updates information of a release.
-func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bool) (err error) {
+func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bool, uuids []string) (err error) {
if err = createTag(gitRepo, r); err != nil {
return fmt.Errorf("createTag: %v", err)
}
r.PublisherID = doer.ID
- if _, err = x.Id(r.ID).AllCols().Update(r); err != nil {
+
+ sess := x.NewSession()
+ defer sessionRelease(sess)
+ if err = sess.Begin(); err != nil {
return err
}
+ if _, err = sess.Id(r.ID).AllCols().Update(r); err != nil {
+ return fmt.Errorf("Update: %v", err)
+ }
+
+ // Unlink all current attachments and link back later if still valid
+ if _, err = sess.Exec("UPDATE attachment SET release_id = 0 WHERE release_id = ?", r.ID); err != nil {
+ return fmt.Errorf("unlink current attachments: %v", err)
+ }
+
+ if len(uuids) > 0 {
+ if _, err = sess.In("uuid", uuids).Cols("release_id").Update(&Attachment{ReleaseID: r.ID}); err != nil {
+ return fmt.Errorf("link attachments: %v", err)
+ }
+ }
+
+ if err = sess.Commit(); err != nil {
+ return fmt.Errorf("Commit: %v", err)
+ }
if !isPublish {
return nil