diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2014-06-28 15:00:32 +0800 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2014-06-28 15:00:32 +0800 |
commit | a357cda9575b482004329e81f0add6e4c32ab02a (patch) | |
tree | db7d7508a039cfd4dd6cedad236e720bcfe1396c /models/release.go | |
parent | 165e3e8f18bb7d38722d0c836ddbf8c95023cf67 (diff) | |
parent | 6e448b07145fbb090e0da6deb97f244c2bfd7ba7 (diff) | |
download | gitea-a357cda9575b482004329e81f0add6e4c32ab02a.tar.gz gitea-a357cda9575b482004329e81f0add6e4c32ab02a.zip |
Merge branch 'dev' of github.com:gogits/gogs into dev
Diffstat (limited to 'models/release.go')
-rw-r--r-- | models/release.go | 121 |
1 files changed, 92 insertions, 29 deletions
diff --git a/models/release.go b/models/release.go index e6c3d56152..3e1a78118c 100644 --- a/models/release.go +++ b/models/release.go @@ -6,15 +6,16 @@ package models import ( "errors" + "sort" "strings" "time" - "github.com/Unknwon/com" "github.com/gogits/git" ) var ( ErrReleaseAlreadyExist = errors.New("Release already exist") + ErrReleaseNotExist = errors.New("Release does not exist") ) // Release represents a release of repository. @@ -23,21 +24,17 @@ type Release struct { RepoId int64 PublisherId int64 Publisher *User `xorm:"-"` - Title string TagName string LowerTagName string - SHA1 string + Target string + Title string + Sha1 string `xorm:"VARCHAR(40)"` NumCommits int NumCommitsBehind int `xorm:"-"` Note string `xorm:"TEXT"` + IsDraft bool `xorm:"NOT NULL DEFAULT false"` 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 + Created time.Time `xorm:"CREATED"` } // IsReleaseExist returns true if release with given tag name already exists. @@ -46,7 +43,34 @@ func IsReleaseExist(repoId int64, tagName string) (bool, error) { return false, nil } - return orm.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}) + return x.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}) +} + +func createTag(gitRepo *git.Repository, rel *Release) error { + // Only actual create when publish. + if !rel.IsDraft { + if !gitRepo.IsTagExist(rel.TagName) { + commit, err := gitRepo.GetCommitOfBranch(rel.Target) + if err != nil { + return err + } + + if err = gitRepo.CreateTag(rel.TagName, commit.Id.String()); err != nil { + return err + } + } else { + commit, err := gitRepo.GetCommitOfTag(rel.TagName) + if err != nil { + return err + } + + rel.NumCommits, err = commit.CommitsCount() + if err != nil { + return err + } + } + } + return nil } // CreateRelease creates a new release of repository. @@ -58,26 +82,65 @@ func CreateRelease(gitRepo *git.Repository, rel *Release) error { return ErrReleaseAlreadyExist } - if !gitRepo.IsTagExist(rel.TagName) { - _, stderr, err := com.ExecCmdDir(gitRepo.Path, "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 - } + if err = createTag(gitRepo, rel); err != nil { + return err + } + rel.LowerTagName = strings.ToLower(rel.TagName) + _, err = x.InsertOne(rel) + return err +} - rel.NumCommits, err = commit.CommitsCount() - if err != nil { - return err - } +// GetRelease returns release by given ID. +func GetRelease(repoId int64, tagName string) (*Release, error) { + isExist, err := IsReleaseExist(repoId, tagName) + if err != nil { + return nil, err + } else if !isExist { + return nil, ErrReleaseNotExist } - rel.LowerTagName = strings.ToLower(rel.TagName) - _, err = orm.InsertOne(rel) + rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)} + _, err = x.Get(rel) + return rel, err +} + +// GetReleasesByRepoId returns a list of releases of repository. +func GetReleasesByRepoId(repoId int64) (rels []*Release, err error) { + err = x.Desc("created").Find(&rels, Release{RepoId: repoId}) + return rels, err +} + +type ReleaseSorter struct { + rels []*Release +} + +func (rs *ReleaseSorter) Len() int { + return len(rs.rels) +} + +func (rs *ReleaseSorter) Less(i, j int) bool { + diffNum := rs.rels[i].NumCommits - rs.rels[j].NumCommits + if diffNum != 0 { + return diffNum > 0 + } + return rs.rels[i].Created.After(rs.rels[j].Created) +} + +func (rs *ReleaseSorter) Swap(i, j int) { + rs.rels[i], rs.rels[j] = rs.rels[j], rs.rels[i] +} + +// SortReleases sorts releases by number of commits and created time. +func SortReleases(rels []*Release) { + sorter := &ReleaseSorter{rels: rels} + sort.Sort(sorter) +} + +// UpdateRelease updates information of a release. +func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) { + if err = createTag(gitRepo, rel); err != nil { + return err + } + _, err = x.Id(rel.Id).AllCols().Update(rel) return err } |