aboutsummaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2022-04-08 17:11:15 +0800
committerGitHub <noreply@github.com>2022-04-08 17:11:15 +0800
commit1dfa26e00e8e1ce6f6125335871da1d402a63466 (patch)
treed39414fb085ae52d6633ae9d064aabab2e7f75f8 /services
parent84ceaa98bd731431c7d3a7f65e59e7ad076a540f (diff)
downloadgitea-1dfa26e00e8e1ce6f6125335871da1d402a63466.tar.gz
gitea-1dfa26e00e8e1ce6f6125335871da1d402a63466.zip
Move milestone to models/issues/ (#19278)
* Move milestone to models/issues/ * Fix lint * Fix test * Fix lint * Fix lint
Diffstat (limited to 'services')
-rw-r--r--services/issue/label.go3
-rw-r--r--services/issue/milestone.go57
-rw-r--r--services/issue/milestone_test.go35
-rw-r--r--services/mailer/mail.go3
-rw-r--r--services/mailer/mail_issue.go2
-rw-r--r--services/mailer/mail_test.go5
-rw-r--r--services/migrations/gitea_uploader.go6
-rw-r--r--services/migrations/gitea_uploader_test.go5
-rw-r--r--services/pull/merge.go4
-rw-r--r--services/pull/review.go2
10 files changed, 107 insertions, 15 deletions
diff --git a/services/issue/label.go b/services/issue/label.go
index 9971be326c..e72e1cb521 100644
--- a/services/issue/label.go
+++ b/services/issue/label.go
@@ -6,6 +6,7 @@ package issue
import (
"code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/notification"
)
@@ -43,7 +44,7 @@ func AddLabels(issue *models.Issue, doer *user_model.User, labels []*models.Labe
// RemoveLabel removes a label from issue by given ID.
func RemoveLabel(issue *models.Issue, doer *user_model.User, label *models.Label) error {
- if err := issue.LoadRepo(); err != nil {
+ if err := issue.LoadRepo(db.DefaultContext); err != nil {
return err
}
diff --git a/services/issue/milestone.go b/services/issue/milestone.go
index 999da50844..287f8ae285 100644
--- a/services/issue/milestone.go
+++ b/services/issue/milestone.go
@@ -5,15 +5,68 @@
package issue
import (
+ "context"
+ "fmt"
+
"code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/models/db"
+ issues_model "code.gitea.io/gitea/models/issues"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/notification"
)
+func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *models.Issue, oldMilestoneID int64) error {
+ if err := models.UpdateIssueCols(ctx, issue, "milestone_id"); err != nil {
+ return err
+ }
+
+ if oldMilestoneID > 0 {
+ if err := issues_model.UpdateMilestoneCounters(ctx, oldMilestoneID); err != nil {
+ return err
+ }
+ }
+
+ if issue.MilestoneID > 0 {
+ if err := issues_model.UpdateMilestoneCounters(ctx, issue.MilestoneID); err != nil {
+ return err
+ }
+ }
+
+ if oldMilestoneID > 0 || issue.MilestoneID > 0 {
+ if err := issue.LoadRepo(ctx); err != nil {
+ return err
+ }
+
+ opts := &models.CreateCommentOptions{
+ Type: models.CommentTypeMilestone,
+ Doer: doer,
+ Repo: issue.Repo,
+ Issue: issue,
+ OldMilestoneID: oldMilestoneID,
+ MilestoneID: issue.MilestoneID,
+ }
+ if _, err := models.CreateCommentCtx(ctx, opts); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
// ChangeMilestoneAssign changes assignment of milestone for issue.
func ChangeMilestoneAssign(issue *models.Issue, doer *user_model.User, oldMilestoneID int64) (err error) {
- if err = models.ChangeMilestoneAssign(issue, doer, oldMilestoneID); err != nil {
- return
+ ctx, committer, err := db.TxContext()
+ if err != nil {
+ return err
+ }
+ defer committer.Close()
+
+ if err = changeMilestoneAssign(ctx, doer, issue, oldMilestoneID); err != nil {
+ return err
+ }
+
+ if err = committer.Commit(); err != nil {
+ return fmt.Errorf("Commit: %v", err)
}
notification.NotifyIssueChangeMilestone(doer, issue, oldMilestoneID)
diff --git a/services/issue/milestone_test.go b/services/issue/milestone_test.go
new file mode 100644
index 0000000000..80e37a8acd
--- /dev/null
+++ b/services/issue/milestone_test.go
@@ -0,0 +1,35 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package issue
+
+import (
+ "testing"
+
+ "code.gitea.io/gitea/models"
+ issues_model "code.gitea.io/gitea/models/issues"
+ "code.gitea.io/gitea/models/unittest"
+ user_model "code.gitea.io/gitea/models/user"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestChangeMilestoneAssign(t *testing.T) {
+ assert.NoError(t, unittest.PrepareTestDatabase())
+ issue := unittest.AssertExistsAndLoadBean(t, &models.Issue{RepoID: 1}).(*models.Issue)
+ doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
+ assert.NotNil(t, issue)
+ assert.NotNil(t, doer)
+
+ oldMilestoneID := issue.MilestoneID
+ issue.MilestoneID = 2
+ assert.NoError(t, ChangeMilestoneAssign(issue, doer, oldMilestoneID))
+ unittest.AssertExistsAndLoadBean(t, &models.Comment{
+ IssueID: issue.ID,
+ Type: models.CommentTypeMilestone,
+ MilestoneID: issue.MilestoneID,
+ OldMilestoneID: oldMilestoneID,
+ })
+ unittest.CheckConsistencyFor(t, &issues_model.Milestone{}, &models.Issue{})
+}
diff --git a/services/mailer/mail.go b/services/mailer/mail.go
index 1e90deb4c4..a5b60f71ec 100644
--- a/services/mailer/mail.go
+++ b/services/mailer/mail.go
@@ -18,6 +18,7 @@ import (
"time"
"code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
@@ -404,7 +405,7 @@ func SendIssueAssignedMail(issue *models.Issue, doer *user_model.User, content s
return nil
}
- if err := issue.LoadRepo(); err != nil {
+ if err := issue.LoadRepo(db.DefaultContext); err != nil {
log.Error("Unable to load repo [%d] for issue #%d [%d]. Error: %v", issue.RepoID, issue.Index, issue.ID, err)
return err
}
diff --git a/services/mailer/mail_issue.go b/services/mailer/mail_issue.go
index 7f0fb9a3e1..c24edf50c9 100644
--- a/services/mailer/mail_issue.go
+++ b/services/mailer/mail_issue.go
@@ -40,7 +40,7 @@ const (
// 2. Users who are not in 1. but get mentioned in current issue/comment.
func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_model.User) error {
// Required by the mail composer; make sure to load these before calling the async function
- if err := ctx.Issue.LoadRepo(); err != nil {
+ if err := ctx.Issue.LoadRepo(ctx); err != nil {
return fmt.Errorf("LoadRepo(): %v", err)
}
if err := ctx.Issue.LoadPoster(); err != nil {
diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go
index c06bae1b98..baf426146a 100644
--- a/services/mailer/mail_test.go
+++ b/services/mailer/mail_test.go
@@ -14,6 +14,7 @@ import (
texttmpl "text/template"
"code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
@@ -57,7 +58,7 @@ func prepareMailerTest(t *testing.T) (doer *user_model.User, repo *repo_model.Re
doer = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, Owner: doer}).(*repo_model.Repository)
issue = unittest.AssertExistsAndLoadBean(t, &models.Issue{ID: 1, Repo: repo, Poster: doer}).(*models.Issue)
- assert.NoError(t, issue.LoadRepo())
+ assert.NoError(t, issue.LoadRepo(db.DefaultContext))
comment = unittest.AssertExistsAndLoadBean(t, &models.Comment{ID: 2, Issue: issue}).(*models.Comment)
return
}
@@ -180,7 +181,7 @@ func TestTemplateSelection(t *testing.T) {
func TestTemplateServices(t *testing.T) {
doer, _, issue, comment := prepareMailerTest(t)
- assert.NoError(t, issue.LoadRepo())
+ assert.NoError(t, issue.LoadRepo(db.DefaultContext))
expect := func(t *testing.T, issue *models.Issue, comment *models.Comment, doer *user_model.User,
actionType models.ActionType, fromMention bool, tplSubject, tplBody, expSubject, expBody string,
diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go
index 9d2a7eb41b..8529f24895 100644
--- a/services/migrations/gitea_uploader.go
+++ b/services/migrations/gitea_uploader.go
@@ -79,7 +79,7 @@ func (g *GiteaLocalUploader) MaxBatchInsertSize(tp string) int {
case "comment":
return db.MaxBatchInsertSize(new(models.Comment))
case "milestone":
- return db.MaxBatchInsertSize(new(models.Milestone))
+ return db.MaxBatchInsertSize(new(issues_model.Milestone))
case "label":
return db.MaxBatchInsertSize(new(models.Label))
case "release":
@@ -164,7 +164,7 @@ func (g *GiteaLocalUploader) CreateTopics(topics ...string) error {
// CreateMilestones creates milestones
func (g *GiteaLocalUploader) CreateMilestones(milestones ...*base.Milestone) error {
- mss := make([]*models.Milestone, 0, len(milestones))
+ mss := make([]*issues_model.Milestone, 0, len(milestones))
for _, milestone := range milestones {
var deadline timeutil.TimeStamp
if milestone.Deadline != nil {
@@ -187,7 +187,7 @@ func (g *GiteaLocalUploader) CreateMilestones(milestones ...*base.Milestone) err
milestone.Updated = &milestone.Created
}
- ms := models.Milestone{
+ ms := issues_model.Milestone{
RepoID: g.repo.ID,
Name: milestone.Title,
Content: milestone.Description,
diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go
index ad5caa4279..51c7ad9717 100644
--- a/services/migrations/gitea_uploader_test.go
+++ b/services/migrations/gitea_uploader_test.go
@@ -17,6 +17,7 @@ import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/models/db"
+ issues_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
@@ -65,14 +66,14 @@ func TestGiteaUploadRepo(t *testing.T) {
assert.True(t, repo.HasWiki())
assert.EqualValues(t, repo_model.RepositoryReady, repo.Status)
- milestones, _, err := models.GetMilestones(models.GetMilestonesOption{
+ milestones, _, err := issues_model.GetMilestones(issues_model.GetMilestonesOption{
RepoID: repo.ID,
State: structs.StateOpen,
})
assert.NoError(t, err)
assert.Len(t, milestones, 1)
- milestones, _, err = models.GetMilestones(models.GetMilestonesOption{
+ milestones, _, err = issues_model.GetMilestones(issues_model.GetMilestonesOption{
RepoID: repo.ID,
State: structs.StateClosed,
})
diff --git a/services/pull/merge.go b/services/pull/merge.go
index 6ecb3cf08e..0c615d93c8 100644
--- a/services/pull/merge.go
+++ b/services/pull/merge.go
@@ -76,7 +76,7 @@ func Merge(ctx context.Context, pr *models.PullRequest, doer *user_model.User, b
log.Error("loadIssue [%d]: %v", pr.ID, err)
}
- if err := pr.Issue.LoadRepo(); err != nil {
+ if err := pr.Issue.LoadRepo(ctx); err != nil {
log.Error("loadRepo for issue [%d]: %v", pr.ID, err)
}
if err := pr.Issue.Repo.GetOwner(ctx); err != nil {
@@ -99,7 +99,7 @@ func Merge(ctx context.Context, pr *models.PullRequest, doer *user_model.User, b
if err = ref.LoadIssue(); err != nil {
return err
}
- if err = ref.Issue.LoadRepo(); err != nil {
+ if err = ref.Issue.LoadRepo(ctx); err != nil {
return err
}
close := ref.RefAction == references.XRefActionCloses
diff --git a/services/pull/review.go b/services/pull/review.go
index cb21d736cf..e7e6f3135b 100644
--- a/services/pull/review.go
+++ b/services/pull/review.go
@@ -44,7 +44,7 @@ func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git.
// Comments that are replies don't require a review header to show up in the issue view
if !isReview && existsReview {
- if err = issue.LoadRepo(); err != nil {
+ if err = issue.LoadRepo(ctx); err != nil {
return nil, err
}