Provide preliminary implementation for releases

This commit is contained in:
Chongyi Zheng 2022-07-13 20:51:31 -04:00
parent 696f58f83c
commit 8127c25de8
No known key found for this signature in database
GPG Key ID: CC2953E050C19686
2 changed files with 92 additions and 7 deletions

View File

@ -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 {

View File

@ -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 {