summaryrefslogtreecommitdiffstats
path: root/models/release.go
diff options
context:
space:
mode:
authorUnknown <joe2010xtmf@163.com>2014-04-14 01:57:25 -0400
committerUnknown <joe2010xtmf@163.com>2014-04-14 01:57:25 -0400
commitf644cefa865c04b440902695ba90114b224c640d (patch)
tree0046427683c47bbc0487d0d053ee643ffef902c8 /models/release.go
parent190b83e05eb1ade979c0e17314ab892832d62e5b (diff)
downloadgitea-f644cefa865c04b440902695ba90114b224c640d.tar.gz
gitea-f644cefa865c04b440902695ba90114b224c640d.zip
Finish release
Diffstat (limited to 'models/release.go')
-rw-r--r--models/release.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/models/release.go b/models/release.go
new file mode 100644
index 0000000000..08d74d3f4f
--- /dev/null
+++ b/models/release.go
@@ -0,0 +1,83 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+ "errors"
+ "strings"
+ "time"
+
+ "github.com/Unknwon/com"
+ "github.com/gogits/git"
+)
+
+var (
+ ErrReleaseAlreadyExist = errors.New("Release already exist")
+)
+
+// Release represents a release of repository.
+type Release struct {
+ Id int64
+ RepoId int64
+ PublisherId int64
+ Publisher *User `xorm:"-"`
+ Title string
+ TagName string
+ LowerTagName string
+ SHA1 string
+ NumCommits int
+ NumCommitsBehind int `xorm:"-"`
+ Note string `xorm:"TEXT"`
+ IsPrerelease bool
+ Created time.Time `xorm:"created"`
+}
+
+// GetReleasesByRepoId returns a list of releases of repository.
+func GetReleasesByRepoId(repoId int64) (rels []*Release, err error) {
+ err = orm.Desc("created").Find(&rels, Release{RepoId: repoId})
+ return rels, err
+}
+
+// IsReleaseExist returns true if release with given tag name already exists.
+func IsReleaseExist(repoId int64, tagName string) (bool, error) {
+ if len(tagName) == 0 {
+ return false, nil
+ }
+
+ return orm.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)})
+}
+
+// CreateRelease creates a new release of repository.
+func CreateRelease(repoPath string, rel *Release, gitRepo *git.Repository) error {
+ isExist, err := IsReleaseExist(rel.RepoId, rel.TagName)
+ if err != nil {
+ return err
+ } else if isExist {
+ return ErrReleaseAlreadyExist
+ }
+
+ if !git.IsTagExist(repoPath, rel.TagName) {
+ _, stderr, err := com.ExecCmdDir(repoPath, "git", "tag", rel.TagName, "-m", "\""+rel.Title+"\"")
+ if err != nil {
+ return err
+ } else if strings.Contains(stderr, "fatal:") {
+ return errors.New(stderr)
+ }
+ } else {
+ commit, err := gitRepo.GetCommitOfTag(rel.TagName)
+ if err != nil {
+ return err
+ }
+
+ rel.NumCommits, err = commit.CommitsCount()
+ if err != nil {
+ return err
+ }
+ }
+
+ rel.LowerTagName = strings.ToLower(rel.TagName)
+ _, err = orm.InsertOne(rel)
+ return err
+}