Skip to content

Commit c87f753

Browse files
committed
Fix bug webhook milestone is not right.
1 parent 0f63a5e commit c87f753

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed

routers/api/v1/repo/issue.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"time"
1414

1515
"code.gitea.io/gitea/models/db"
16+
issue_model "code.gitea.io/gitea/models/issues"
1617
issues_model "code.gitea.io/gitea/models/issues"
1718
"code.gitea.io/gitea/models/organization"
1819
access_model "code.gitea.io/gitea/models/perm/access"
@@ -895,6 +896,15 @@ func EditIssue(ctx *context.APIContext) {
895896
issue.MilestoneID != *form.Milestone {
896897
oldMilestoneID := issue.MilestoneID
897898
issue.MilestoneID = *form.Milestone
899+
if issue.MilestoneID > 0 {
900+
issue.Milestone, err = issue_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, *form.Milestone)
901+
if err != nil {
902+
ctx.APIErrorInternal(err)
903+
return
904+
}
905+
} else {
906+
issue.Milestone = nil
907+
}
898908
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
899909
ctx.APIErrorInternal(err)
900910
return

routers/api/v1/repo/pull.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
activities_model "code.gitea.io/gitea/models/activities"
1616
git_model "code.gitea.io/gitea/models/git"
17+
issue_model "code.gitea.io/gitea/models/issues"
1718
issues_model "code.gitea.io/gitea/models/issues"
1819
access_model "code.gitea.io/gitea/models/perm/access"
1920
pull_model "code.gitea.io/gitea/models/pull"
@@ -706,6 +707,11 @@ func EditPullRequest(ctx *context.APIContext) {
706707
issue.MilestoneID != form.Milestone {
707708
oldMilestoneID := issue.MilestoneID
708709
issue.MilestoneID = form.Milestone
710+
issue.Milestone, err = issue_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, form.Milestone)
711+
if err != nil {
712+
ctx.APIErrorInternal(err)
713+
return
714+
}
709715
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
710716
ctx.APIErrorInternal(err)
711717
return

routers/web/repo/issue.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"strings"
1414

1515
"code.gitea.io/gitea/models/db"
16+
issue_model "code.gitea.io/gitea/models/issues"
1617
issues_model "code.gitea.io/gitea/models/issues"
1718
"code.gitea.io/gitea/models/organization"
1819
access_model "code.gitea.io/gitea/models/perm/access"
@@ -418,6 +419,16 @@ func UpdateIssueMilestone(ctx *context.Context) {
418419
continue
419420
}
420421
issue.MilestoneID = milestoneID
422+
if milestoneID > 0 {
423+
var err error
424+
issue.Milestone, err = issue_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, milestoneID)
425+
if err != nil {
426+
ctx.ServerError("GetMileStoneByID", err)
427+
return
428+
}
429+
} else {
430+
issue.Milestone = nil
431+
}
421432
if err := issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
422433
ctx.ServerError("ChangeMilestoneAssign", err)
423434
return

tests/integration/issue_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,15 @@ func testIssueAddComment(t *testing.T, session *TestSession, issueURL, content,
184184
return int64(id)
185185
}
186186

187+
func testIssueChangeMilestone(t *testing.T, session *TestSession, repoLink string, issueID, milestoneID int64) {
188+
req := NewRequestWithValues(t, "POST", fmt.Sprintf(repoLink+"/issues/milestone?issue_ids=%d", issueID), map[string]string{
189+
"_csrf": GetUserCSRFToken(t, session),
190+
"id": fmt.Sprintf("%d", milestoneID),
191+
})
192+
resp := session.MakeRequest(t, req, http.StatusOK)
193+
assert.Equal(t, `{"ok":true}`, strings.TrimSpace(resp.Body.String()))
194+
}
195+
187196
func TestNewIssue(t *testing.T) {
188197
defer tests.PrepareTestEnv(t)()
189198
session := loginUser(t, "user2")

tests/integration/repo_webhook_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,78 @@ func Test_WebhookIssue(t *testing.T) {
355355
})
356356
}
357357

358+
func Test_WebhookIssueMilestone(t *testing.T) {
359+
var payloads []api.IssuePayload
360+
var triggeredEvent string
361+
provider := newMockWebhookProvider(func(r *http.Request) {
362+
content, _ := io.ReadAll(r.Body)
363+
var payload api.IssuePayload
364+
err := json.Unmarshal(content, &payload)
365+
assert.NoError(t, err)
366+
payloads = append(payloads, payload)
367+
triggeredEvent = "issues"
368+
}, http.StatusOK)
369+
defer provider.Close()
370+
371+
onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
372+
// create a new webhook with special webhook for repo1
373+
session := loginUser(t, "user2")
374+
repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1})
375+
testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "issue_milestone")
376+
377+
t.Run("assign a milestone", func(t *testing.T) {
378+
// trigger the webhook
379+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 1)
380+
381+
// validate the webhook is triggered
382+
assert.Equal(t, "issues", triggeredEvent)
383+
assert.Len(t, payloads, 1)
384+
assert.Equal(t, "milestoned", string(payloads[0].Action))
385+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
386+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
387+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
388+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
389+
assert.EqualValues(t, 1, payloads[0].Issue.Milestone.ID)
390+
})
391+
392+
t.Run("change a milestong", func(t *testing.T) {
393+
// trigger the webhook again
394+
triggeredEvent = ""
395+
payloads = make([]api.IssuePayload, 0, 1)
396+
// change milestone to 2
397+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 2)
398+
399+
// validate the webhook is triggered
400+
assert.Equal(t, "issues", triggeredEvent)
401+
assert.Len(t, payloads, 1)
402+
assert.Equal(t, "milestoned", string(payloads[0].Action))
403+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
404+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
405+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
406+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
407+
assert.EqualValues(t, 2, payloads[0].Issue.Milestone.ID)
408+
})
409+
410+
t.Run("remove a milestone", func(t *testing.T) {
411+
// trigger the webhook again
412+
triggeredEvent = ""
413+
payloads = make([]api.IssuePayload, 0, 1)
414+
// change milestone to 0
415+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 0)
416+
417+
// validate the webhook is triggered
418+
assert.Equal(t, "issues", triggeredEvent)
419+
assert.Len(t, payloads, 1)
420+
assert.Equal(t, "demilestoned", string(payloads[0].Action))
421+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
422+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
423+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
424+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
425+
assert.Nil(t, payloads[0].Issue.Milestone)
426+
})
427+
})
428+
}
429+
358430
func Test_WebhookPullRequest(t *testing.T) {
359431
var payloads []api.PullRequestPayload
360432
var triggeredEvent string

0 commit comments

Comments
 (0)