diff options
author | Unknown <joe2010xtmf@163.com> | 2014-06-12 17:47:23 -0400 |
---|---|---|
committer | Unknown <joe2010xtmf@163.com> | 2014-06-12 17:47:23 -0400 |
commit | e07674bff19dcc321a1611a3598d69c418ac8642 (patch) | |
tree | 824174b3dea4490f00c713778688bff59d35d98f /models | |
parent | fb0972afadbd87ae707861acc0986bde01528c3c (diff) | |
download | gitea-e07674bff19dcc321a1611a3598d69c418ac8642.tar.gz gitea-e07674bff19dcc321a1611a3598d69c418ac8642.zip |
Support edit release and save as draft
Diffstat (limited to 'models')
-rw-r--r-- | models/release.go | 116 | ||||
-rw-r--r-- | models/repo.go | 2 |
2 files changed, 89 insertions, 29 deletions
diff --git a/models/release.go b/models/release.go index e5e81b9b67..32e8c92cc4 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,22 +24,17 @@ type Release struct { RepoId int64 PublisherId int64 Publisher *User `xorm:"-"` - Title string TagName string LowerTagName 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. @@ -50,6 +46,33 @@ func IsReleaseExist(repoId int64, tagName string) (bool, error) { return orm.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. func CreateRelease(gitRepo *git.Repository, rel *Release) error { isExist, err := IsReleaseExist(rel.RepoId, rel.TagName) @@ -59,28 +82,65 @@ func CreateRelease(gitRepo *git.Repository, rel *Release) error { return ErrReleaseAlreadyExist } - if !gitRepo.IsTagExist(rel.TagName) { - commit, err := gitRepo.GetCommitOfBranch(rel.Target) - if err != nil { - return err - } + if err = createTag(gitRepo, rel); err != nil { + return err + } + rel.LowerTagName = strings.ToLower(rel.TagName) + _, err = orm.InsertOne(rel) + 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 - } +// 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.NumCommits, err = commit.CommitsCount() - if err != nil { - return err - } + rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)} + _, err = orm.Get(rel) + return rel, err +} + +// 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 +} + +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) +} - rel.LowerTagName = strings.ToLower(rel.TagName) - _, err = orm.InsertOne(rel) +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 = orm.Id(rel.Id).AllCols().Update(rel) return err } diff --git a/models/repo.go b/models/repo.go index 7eab83c217..0f01813536 100644 --- a/models/repo.go +++ b/models/repo.go @@ -835,7 +835,7 @@ func GetCollaborativeRepos(uname string) ([]*Repository, error) { if infos[0] == uname { continue } - + u, err := GetUserByName(infos[0]) if err != nil { return nil, err |