0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-12-21 18:54:13 +01:00

Closed milestones with no issues now show as 100% completed (#36220)

Closed milestones with 0 issues currently display as having 0%
completion. This makes sense if the milestone is still open, but if the
milestone is closed it seems like that it should show 100% completeness
instead.

Before:
<img width="1708" height="252" alt="image"
src="https://github.com/user-attachments/assets/0b58c78f-0609-44ee-8d58-bd67534c6164"
/>
After:
<img width="1716" height="263" alt="image"
src="https://github.com/user-attachments/assets/3fb0044f-d76c-4888-9d60-640f2ca5fec6"
/>
This commit is contained in:
Scion 2025-12-20 08:16:20 -08:00 committed by GitHub
parent 05c3b84f84
commit 495fee4555
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 2 deletions

View File

@ -75,6 +75,8 @@ func init() {
func (m *Milestone) BeforeUpdate() { func (m *Milestone) BeforeUpdate() {
if m.NumIssues > 0 { if m.NumIssues > 0 {
m.Completeness = m.NumClosedIssues * 100 / m.NumIssues m.Completeness = m.NumClosedIssues * 100 / m.NumIssues
} else if m.IsClosed {
m.Completeness = 100
} else { } else {
m.Completeness = 0 m.Completeness = 0
} }
@ -195,8 +197,8 @@ func UpdateMilestoneCounters(ctx context.Context, id int64) error {
if err != nil { if err != nil {
return err return err
} }
_, err = e.Exec("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?", _, err = e.Exec("UPDATE `milestone` SET completeness=(CASE WHEN is_closed = ? AND num_issues = 0 THEN 100 ELSE 100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) END) WHERE id=?",
id, true, id,
) )
return err return err
} }
@ -240,6 +242,11 @@ func changeMilestoneStatus(ctx context.Context, m *Milestone, isClosed bool) err
if count < 1 { if count < 1 {
return nil return nil
} }
if err := UpdateMilestoneCounters(ctx, m.ID); err != nil {
return err
}
return updateRepoMilestoneNum(ctx, m.RepoID) return updateRepoMilestoneNum(ctx, m.RepoID)
} }

View File

@ -398,6 +398,7 @@ func prepareMigrationTasks() []*migration {
// Gitea 1.25.0 ends at migration ID number 322 (database version 323) // Gitea 1.25.0 ends at migration ID number 322 (database version 323)
newMigration(323, "Add support for actions concurrency", v1_26.AddActionsConcurrency), newMigration(323, "Add support for actions concurrency", v1_26.AddActionsConcurrency),
newMigration(324, "Fix closed milestone completeness for milestones with no issues", v1_26.FixClosedMilestoneCompleteness),
} }
return preparedMigrations return preparedMigrations
} }

View File

@ -0,0 +1,24 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_26
import (
"fmt"
"xorm.io/xorm"
)
func FixClosedMilestoneCompleteness(x *xorm.Engine) error {
// Update all milestones to recalculate completeness with the new logic:
// - Closed milestones with 0 issues should show 100%
// - All other milestones should calculate based on closed/total ratio
_, err := x.Exec("UPDATE `milestone` SET completeness=(CASE WHEN is_closed = ? AND num_issues = 0 THEN 100 ELSE 100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) END)",
true,
)
if err != nil {
return fmt.Errorf("error updating milestone completeness: %w", err)
}
return nil
}