aboutsummaryrefslogtreecommitdiff
path: root/models/release.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/release.go')
-rw-r--r--models/release.go83
1 files changed, 61 insertions, 22 deletions
diff --git a/models/release.go b/models/release.go
index 027491d9..ef1d640d 100644
--- a/models/release.go
+++ b/models/release.go
@@ -5,7 +5,7 @@
package models
import (
- "errors"
+ "fmt"
"sort"
"strings"
"time"
@@ -13,18 +13,14 @@ import (
"github.com/go-xorm/xorm"
"github.com/gogits/gogs/modules/git"
-)
-
-var (
- ErrReleaseAlreadyExist = errors.New("Release already exist")
- ErrReleaseNotExist = errors.New("Release does not exist")
+ "github.com/gogits/gogs/modules/process"
)
// Release represents a release of repository.
type Release struct {
- Id int64
- RepoId int64
- PublisherId int64
+ ID int64 `xorm:"pk autoincr"`
+ RepoID int64
+ PublisherID int64
Publisher *User `xorm:"-"`
TagName string
LowerTagName string
@@ -47,12 +43,12 @@ func (r *Release) AfterSet(colName string, _ xorm.Cell) {
}
// IsReleaseExist returns true if release with given tag name already exists.
-func IsReleaseExist(repoId int64, tagName string) (bool, error) {
+func IsReleaseExist(repoID int64, tagName string) (bool, error) {
if len(tagName) == 0 {
return false, nil
}
- return x.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 {
@@ -64,7 +60,7 @@ func createTag(gitRepo *git.Repository, rel *Release) error {
return err
}
- if err = gitRepo.CreateTag(rel.TagName, commit.Id.String()); err != nil {
+ if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil {
return err
}
} else {
@@ -84,11 +80,11 @@ func createTag(gitRepo *git.Repository, rel *Release) error {
// CreateRelease creates a new release of repository.
func CreateRelease(gitRepo *git.Repository, rel *Release) error {
- isExist, err := IsReleaseExist(rel.RepoId, rel.TagName)
+ isExist, err := IsReleaseExist(rel.RepoID, rel.TagName)
if err != nil {
return err
} else if isExist {
- return ErrReleaseAlreadyExist
+ return ErrReleaseAlreadyExist{rel.TagName}
}
if err = createTag(gitRepo, rel); err != nil {
@@ -100,22 +96,35 @@ func CreateRelease(gitRepo *git.Repository, rel *Release) error {
}
// GetRelease returns release by given ID.
-func GetRelease(repoId int64, tagName string) (*Release, error) {
- isExist, err := IsReleaseExist(repoId, tagName)
+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
+ return nil, ErrReleaseNotExist{0, tagName}
}
- rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}
+ 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})
+// GetReleaseByID returns release with given ID.
+func GetReleaseByID(id int64) (*Release, error) {
+ rel := new(Release)
+ has, err := x.Id(id).Get(rel)
+ if err != nil {
+ return nil, err
+ } else if !has {
+ return nil, ErrReleaseNotExist{id, ""}
+ }
+
+ return rel, nil
+}
+
+// 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
}
@@ -150,6 +159,36 @@ 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)
+ _, err = x.Id(rel.ID).AllCols().Update(rel)
return err
}
+
+// DeleteReleaseByID deletes a release and corresponding Git tag by given ID.
+func DeleteReleaseByID(id int64) error {
+ rel, err := GetReleaseByID(id)
+ if err != nil {
+ return fmt.Errorf("GetReleaseByID: %v", err)
+ }
+
+ repo, err := GetRepositoryByID(rel.RepoID)
+ if err != nil {
+ return fmt.Errorf("GetRepositoryByID: %v", err)
+ }
+
+ repoPath, err := repo.RepoPath()
+ if err != nil {
+ return fmt.Errorf("RepoPath: %v", err)
+ }
+
+ _, stderr, err := process.ExecDir(-1, repoPath, fmt.Sprintf("DeleteReleaseByID (git tag -d): %d", rel.ID),
+ "git", "tag", "-d", rel.TagName)
+ if err != nil && !strings.Contains(stderr, "not found") {
+ return fmt.Errorf("git tag -d: %v - %s", err, stderr)
+ }
+
+ if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil {
+ return fmt.Errorf("Delete: %v", err)
+ }
+
+ return nil
+}