diff options
author | Unknwon <u@gogs.io> | 2017-03-13 04:32:20 -0400 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-03-13 04:32:20 -0400 |
commit | 1df54ea0cde038e2057d083078f952c072d0dc67 (patch) | |
tree | c5466e010f5ed8e236f5b021e669f9aa37ea0047 /models/release.go | |
parent | e6df2259abdeb75545f53a5ca4c247491b5c3d7f (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.go | 57 |
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 |