From d86aa76640ecbd9cb8fb259e27025c29586477c2 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 1 Aug 2025 16:23:46 -0700 Subject: [PATCH 1/2] Adjust milestone sort order for due date. Non due date mileston will be considered after all due date milestone --- models/issues/milestone_list.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/issues/milestone_list.go b/models/issues/milestone_list.go index 955ab2356df5e..c69a7db8522ad 100644 --- a/models/issues/milestone_list.go +++ b/models/issues/milestone_list.go @@ -59,7 +59,7 @@ func (opts FindMilestoneOptions) ToConds() builder.Cond { func (opts FindMilestoneOptions) ToOrders() string { switch opts.SortType { case "furthestduedate": - return "deadline_unix DESC" + return "CASE WHEN deadline_unix = 0 THEN 0 ELSE 1 END, deadline_unix DESC, name ASC" case "leastcomplete": return "completeness ASC" case "mostcomplete": @@ -73,7 +73,7 @@ func (opts FindMilestoneOptions) ToOrders() string { case "name": return "name DESC" default: - return "deadline_unix ASC, name ASC" + return "CASE WHEN deadline_unix = 0 THEN 1 ELSE 0 END, deadline_unix ASC, name ASC" } } From 1bafbb643dc2e8d86101adc683773d8b154b4e54 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 1 Aug 2025 21:50:00 -0700 Subject: [PATCH 2/2] Consider deadline_unix might be NULL --- models/issues/milestone_list.go | 4 ++-- tests/integration/api_issue_milestone_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/models/issues/milestone_list.go b/models/issues/milestone_list.go index c69a7db8522ad..4d431be030a39 100644 --- a/models/issues/milestone_list.go +++ b/models/issues/milestone_list.go @@ -59,7 +59,7 @@ func (opts FindMilestoneOptions) ToConds() builder.Cond { func (opts FindMilestoneOptions) ToOrders() string { switch opts.SortType { case "furthestduedate": - return "CASE WHEN deadline_unix = 0 THEN 0 ELSE 1 END, deadline_unix DESC, name ASC" + return "CASE WHEN deadline_unix = 0 OR deadline_unix IS NULL THEN 0 ELSE 1 END, deadline_unix DESC, name ASC" case "leastcomplete": return "completeness ASC" case "mostcomplete": @@ -73,7 +73,7 @@ func (opts FindMilestoneOptions) ToOrders() string { case "name": return "name DESC" default: - return "CASE WHEN deadline_unix = 0 THEN 1 ELSE 0 END, deadline_unix ASC, name ASC" + return "CASE WHEN deadline_unix = 0 OR deadline_unix IS NULL THEN 1 ELSE 0 END, deadline_unix ASC, name ASC" } } diff --git a/tests/integration/api_issue_milestone_test.go b/tests/integration/api_issue_milestone_test.go index 1196c8d358d67..58aa3fb21dae7 100644 --- a/tests/integration/api_issue_milestone_test.go +++ b/tests/integration/api_issue_milestone_test.go @@ -67,7 +67,7 @@ func TestAPIIssuesMilestone(t *testing.T) { resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiMilestones) assert.Len(t, apiMilestones, 4) - assert.Nil(t, apiMilestones[0].Deadline) + assert.Nil(t, apiMilestones[3].Deadline) req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/milestones/%s", owner.Name, repo.Name, apiMilestones[2].Title)). AddTokenAuth(token)