Skip to content

Commit 0a9a84d

Browse files
GiteaBotlunnysilverwind
authored
Fix bug webhook milestone is not right. (go-gitea#34419) (go-gitea#34428)
Backport go-gitea#34419 by @lunny Fix go-gitea#34400 Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: silverwind <me@silverwind.io>
1 parent cdac263 commit 0a9a84d

File tree

5 files changed

+105
-0
lines changed

5 files changed

+105
-0
lines changed

routers/api/v1/repo/issue.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,15 @@ func EditIssue(ctx *context.APIContext) {
895895
issue.MilestoneID != *form.Milestone {
896896
oldMilestoneID := issue.MilestoneID
897897
issue.MilestoneID = *form.Milestone
898+
if issue.MilestoneID > 0 {
899+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, *form.Milestone)
900+
if err != nil {
901+
ctx.APIErrorInternal(err)
902+
return
903+
}
904+
} else {
905+
issue.Milestone = nil
906+
}
898907
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
899908
ctx.APIErrorInternal(err)
900909
return

routers/api/v1/repo/pull.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,11 @@ func EditPullRequest(ctx *context.APIContext) {
706706
issue.MilestoneID != form.Milestone {
707707
oldMilestoneID := issue.MilestoneID
708708
issue.MilestoneID = form.Milestone
709+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, form.Milestone)
710+
if err != nil {
711+
ctx.APIErrorInternal(err)
712+
return
713+
}
709714
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
710715
ctx.APIErrorInternal(err)
711716
return

routers/web/repo/issue.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,16 @@ func UpdateIssueMilestone(ctx *context.Context) {
418418
continue
419419
}
420420
issue.MilestoneID = milestoneID
421+
if milestoneID > 0 {
422+
var err error
423+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, milestoneID)
424+
if err != nil {
425+
ctx.ServerError("GetMilestoneByRepoID", err)
426+
return
427+
}
428+
} else {
429+
issue.Milestone = nil
430+
}
421431
if err := issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
422432
ctx.ServerError("ChangeMilestoneAssign", err)
423433
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": strconv.FormatInt(milestoneID, 10),
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)