mirror of https://github.com/go-gitea/gitea
Provide preliminary implementation for releases
This commit is contained in:
parent
696f58f83c
commit
8127c25de8
|
@ -10,6 +10,8 @@ import (
|
|||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/models/foreignreference"
|
||||
issues_model "code.gitea.io/gitea/models/issues"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
"code.gitea.io/gitea/modules/structs"
|
||||
)
|
||||
|
||||
|
@ -348,6 +350,75 @@ func InsertReleases(rels ...*Release) error {
|
|||
return committer.Commit()
|
||||
}
|
||||
|
||||
// UpsertReleases inserts new releases and updates existing releases
|
||||
func UpsertReleases(rels ...*Release) error {
|
||||
ctx, committer, err := db.TxContext()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer committer.Close()
|
||||
sess := db.GetEngine(ctx)
|
||||
|
||||
for _, rel := range rels {
|
||||
exists, err := sess.Where("repo_id = ? AND tag_name = ?", rel.RepoID, rel.TagName).Exist(&Release{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !exists {
|
||||
if _, err := sess.NoAutoTime().Insert(rel); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(rel.Attachments) > 0 {
|
||||
for i := range rel.Attachments {
|
||||
rel.Attachments[i].ReleaseID = rel.ID
|
||||
}
|
||||
|
||||
if _, err := sess.NoAutoTime().Insert(rel.Attachments); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if _, err := sess.NoAutoTime().Where("repo_id = ? AND tag_name = ?", rel.RepoID, rel.TagName).Update(rel); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(rel.Attachments) > 0 {
|
||||
for i := range rel.Attachments {
|
||||
rel.Attachments[i].ReleaseID = rel.ID
|
||||
}
|
||||
|
||||
var existingReleases []*repo_model.Attachment
|
||||
err := sess.Where("release_id = ?", rel.ID).Find(&existingReleases)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := sess.NoAutoTime().Insert(rel.Attachments); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var ids []int64
|
||||
for _, existingRelease := range existingReleases {
|
||||
// TODO: file operations are not atomic, so errors should be handled
|
||||
err = storage.Attachments.Delete(existingRelease.RelativePath())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ids = append(ids, existingRelease.ID)
|
||||
}
|
||||
if _, err := sess.NoAutoTime().In("id", ids).Delete(&repo_model.Attachment{}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return committer.Commit()
|
||||
}
|
||||
|
||||
// UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID
|
||||
func UpdateMigrationsByType(tp structs.GitServiceType, externalUserID string, userID int64) error {
|
||||
if err := issues_model.UpdateIssuesMigrationsByType(tp, externalUserID, userID); err != nil {
|
||||
|
|
|
@ -248,8 +248,7 @@ func convertLabels(repoID int64, labels ...*base.Label) []*issues_model.Label {
|
|||
return lbs
|
||||
}
|
||||
|
||||
// CreateReleases creates releases
|
||||
func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
||||
func (g *GiteaLocalUploader) prepareReleases(releases ...*base.Release) ([]*models.Release, error) {
|
||||
rels := make([]*models.Release, 0, len(releases))
|
||||
for _, release := range releases {
|
||||
if release.Created.IsZero() {
|
||||
|
@ -274,7 +273,7 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
|||
}
|
||||
|
||||
if err := g.remapUser(release, &rel); err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// calc NumCommits if possible
|
||||
|
@ -282,12 +281,12 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
|||
commit, err := g.gitRepo.GetTagCommit(rel.TagName)
|
||||
if !git.IsErrNotExist(err) {
|
||||
if err != nil {
|
||||
return fmt.Errorf("GetTagCommit[%v]: %v", rel.TagName, err)
|
||||
return nil, fmt.Errorf("GetTagCommit[%v]: %v", rel.TagName, err)
|
||||
}
|
||||
rel.Sha1 = commit.ID.String()
|
||||
rel.NumCommits, err = commit.CommitsCount()
|
||||
if err != nil {
|
||||
return fmt.Errorf("CommitsCount: %v", err)
|
||||
return nil, fmt.Errorf("CommitsCount: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -332,7 +331,7 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
|||
return err
|
||||
}()
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rel.Attachments = append(rel.Attachments, &attach)
|
||||
|
@ -340,6 +339,15 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
|||
|
||||
rels = append(rels, &rel)
|
||||
}
|
||||
return rels, nil
|
||||
}
|
||||
|
||||
// CreateReleases creates releases
|
||||
func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
||||
rels, err := g.prepareReleases(releases...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return models.InsertReleases(rels...)
|
||||
}
|
||||
|
@ -860,7 +868,13 @@ func (g *GiteaLocalUploader) UpdateLabels(labels ...*base.Label) error {
|
|||
}
|
||||
|
||||
func (g *GiteaLocalUploader) PatchReleases(releases ...*base.Release) error {
|
||||
return nil
|
||||
// TODO: needs performance improvement
|
||||
rels, err := g.prepareReleases(releases...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return models.UpsertReleases(rels...)
|
||||
}
|
||||
|
||||
func (g *GiteaLocalUploader) PatchIssues(issues ...*base.Issue) error {
|
||||
|
|
Loading…
Reference in New Issue