Support updating milestones

This commit is contained in:
Chongyi Zheng 2022-07-12 17:36:15 -04:00
parent 5ffadebac6
commit 6d242993c7
No known key found for this signature in database
GPG Key ID: CC2953E050C19686
2 changed files with 65 additions and 9 deletions

View File

@ -39,6 +39,48 @@ func InsertMilestones(ms ...*issues_model.Milestone) (err error) {
return committer.Commit()
}
// UpdateMilestones updates milestones of repository.
func UpdateMilestones(ms ...*issues_model.Milestone) (err error) {
if len(ms) == 0 {
return nil
}
ctx, committer, err := db.TxContext()
if err != nil {
return err
}
defer committer.Close()
sess := db.GetEngine(ctx)
// check if milestone exists, if not create it
// milestones are considered as unique by RepoID and CreatedUnix
for _, m := range ms {
var existingMilestone *issues_model.Milestone
has, err := sess.Where("repo_id = ? AND created_unix = ?", m.RepoID, m.CreatedUnix).Get(&existingMilestone)
if err != nil {
return err
}
if !has {
if _, err = sess.NoAutoTime().Insert(m); err != nil {
return err
}
} else if existingMilestone.Name != m.Name || existingMilestone.Content != m.Content ||
existingMilestone.IsClosed != m.IsClosed ||
existingMilestone.UpdatedUnix != m.UpdatedUnix || existingMilestone.ClosedDateUnix != m.ClosedDateUnix ||
existingMilestone.DeadlineUnix != m.DeadlineUnix {
if _, err = sess.NoAutoTime().ID(existingMilestone.ID).Update(m); err != nil {
return err
}
}
}
if _, err = sess.Exec(ctx, "UPDATE `repository` SET num_milestones = num_milestones + ? WHERE id = ?", len(ms), ms[0].RepoID); err != nil {
return err
}
return committer.Commit()
}
// InsertIssues insert issues to database
func InsertIssues(issues ...*issues_model.Issue) error {
ctx, committer, err := db.TxContext()

View File

@ -169,8 +169,7 @@ func (g *GiteaLocalUploader) CreateTopics(topics ...string) error {
return repo_model.AddTopics(g.repo.ID, topics...)
}
// CreateMilestones creates milestones
func (g *GiteaLocalUploader) CreateMilestones(milestones ...*base.Milestone) error {
func (g *GiteaLocalUploader) prepareMilestones(milestones ...*base.Milestone) []*issues_model.Milestone {
mss := make([]*issues_model.Milestone, 0, len(milestones))
for _, milestone := range milestones {
var deadline timeutil.TimeStamp
@ -195,20 +194,26 @@ func (g *GiteaLocalUploader) CreateMilestones(milestones ...*base.Milestone) err
}
ms := issues_model.Milestone{
RepoID: g.repo.ID,
Name: milestone.Title,
Content: milestone.Description,
IsClosed: milestone.State == "closed",
CreatedUnix: timeutil.TimeStamp(milestone.Created.Unix()),
UpdatedUnix: timeutil.TimeStamp(milestone.Updated.Unix()),
DeadlineUnix: deadline,
RepoID: g.repo.ID,
Name: milestone.Title,
Content: milestone.Description,
IsClosed: milestone.State == "closed",
CreatedUnix: timeutil.TimeStamp(milestone.Created.Unix()),
UpdatedUnix: timeutil.TimeStamp(milestone.Updated.Unix()),
ClosedDateUnix: timeutil.TimeStamp(milestone.Closed.Unix()),
DeadlineUnix: deadline,
}
if ms.IsClosed && milestone.Closed != nil {
ms.ClosedDateUnix = timeutil.TimeStamp(milestone.Closed.Unix())
}
mss = append(mss, &ms)
}
return mss
}
// CreateMilestones creates milestones
func (g *GiteaLocalUploader) CreateMilestones(milestones ...*base.Milestone) error {
mss := g.prepareMilestones(milestones...)
err := models.InsertMilestones(mss...)
if err != nil {
return err
@ -833,6 +838,15 @@ func (g *GiteaLocalUploader) UpdateTopics(topics ...string) error {
}
func (g *GiteaLocalUploader) UpdateMilestones(milestones ...*base.Milestone) error {
mss := g.prepareMilestones(milestones...)
err := models.UpdateMilestones(mss...)
if err != nil {
return err
}
for _, ms := range mss {
g.milestones[ms.Name] = ms.ID
}
return nil
}