Update milestone issues numbers when save milestone and other code improvements (#8411)
* update milestone issues numbers when save milestone and other code improvements * fix tests * extract duplicate codes as a new function
This commit is contained in:
parent
1b96c4a471
commit
662a40ea29
1 changed files with 38 additions and 29 deletions
|
@ -10,6 +10,7 @@ import (
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
"xorm.io/builder"
|
||||||
|
|
||||||
"github.com/go-xorm/xorm"
|
"github.com/go-xorm/xorm"
|
||||||
)
|
)
|
||||||
|
@ -191,7 +192,6 @@ func (milestones MilestoneList) getMilestoneIDs() []int64 {
|
||||||
|
|
||||||
// GetMilestonesByRepoID returns all opened milestones of a repository.
|
// GetMilestonesByRepoID returns all opened milestones of a repository.
|
||||||
func GetMilestonesByRepoID(repoID int64, state api.StateType) (MilestoneList, error) {
|
func GetMilestonesByRepoID(repoID int64, state api.StateType) (MilestoneList, error) {
|
||||||
|
|
||||||
sess := x.Where("repo_id = ?", repoID)
|
sess := x.Where("repo_id = ?", repoID)
|
||||||
|
|
||||||
switch state {
|
switch state {
|
||||||
|
@ -238,13 +238,34 @@ func GetMilestones(repoID int64, page int, isClosed bool, sortType string) (Mile
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateMilestone(e Engine, m *Milestone) error {
|
func updateMilestone(e Engine, m *Milestone) error {
|
||||||
_, err := e.ID(m.ID).AllCols().Update(m)
|
_, err := e.ID(m.ID).AllCols().
|
||||||
|
SetExpr("num_issues", builder.Select("count(*)").From("issue").Where(
|
||||||
|
builder.Eq{"milestone_id": m.ID},
|
||||||
|
)).
|
||||||
|
SetExpr("num_closed_issues", builder.Select("count(*)").From("issue").Where(
|
||||||
|
builder.Eq{
|
||||||
|
"milestone_id": m.ID,
|
||||||
|
"is_closed": true,
|
||||||
|
},
|
||||||
|
)).
|
||||||
|
Update(m)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateMilestone updates information of given milestone.
|
// UpdateMilestone updates information of given milestone.
|
||||||
func UpdateMilestone(m *Milestone) error {
|
func UpdateMilestone(m *Milestone) error {
|
||||||
return updateMilestone(x, m)
|
if err := updateMilestone(x, m); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return updateMilestoneCompleteness(x, m.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateMilestoneCompleteness(e Engine, milestoneID int64) error {
|
||||||
|
_, err := e.Exec("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?",
|
||||||
|
milestoneID,
|
||||||
|
)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func countRepoMilestones(e Engine, repoID int64) (int64, error) {
|
func countRepoMilestones(e Engine, repoID int64) (int64, error) {
|
||||||
|
@ -278,11 +299,6 @@ func MilestoneStats(repoID int64) (open int64, closed int64, err error) {
|
||||||
|
|
||||||
// ChangeMilestoneStatus changes the milestone open/closed status.
|
// ChangeMilestoneStatus changes the milestone open/closed status.
|
||||||
func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
|
func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
|
||||||
repo, err := GetRepositoryByID(m.RepoID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
sess := x.NewSession()
|
sess := x.NewSession()
|
||||||
defer sess.Close()
|
defer sess.Close()
|
||||||
if err = sess.Begin(); err != nil {
|
if err = sess.Begin(); err != nil {
|
||||||
|
@ -290,27 +306,27 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
m.IsClosed = isClosed
|
m.IsClosed = isClosed
|
||||||
if err = updateMilestone(sess, m); err != nil {
|
if _, err := sess.ID(m.ID).Cols("is_closed").Update(m); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
numMilestones, err := countRepoMilestones(sess, repo.ID)
|
if err := updateRepoMilestoneNum(sess, m.RepoID); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
numClosedMilestones, err := countRepoClosedMilestones(sess, repo.ID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
repo.NumMilestones = int(numMilestones)
|
|
||||||
repo.NumClosedMilestones = int(numClosedMilestones)
|
|
||||||
|
|
||||||
if _, err = sess.ID(repo.ID).Cols("num_milestones, num_closed_milestones").Update(repo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return sess.Commit()
|
return sess.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateRepoMilestoneNum(e Engine, repoID int64) error {
|
||||||
|
_, err := e.Exec("UPDATE `repository` SET num_milestones=(SELECT count(*) FROM milestone WHERE repo_id=?),num_closed_milestones=(SELECT count(*) FROM milestone WHERE repo_id=? AND is_closed=?) WHERE id=?",
|
||||||
|
repoID,
|
||||||
|
repoID,
|
||||||
|
true,
|
||||||
|
repoID,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func updateMilestoneTotalNum(e Engine, milestoneID int64) (err error) {
|
func updateMilestoneTotalNum(e Engine, milestoneID int64) (err error) {
|
||||||
if _, err = e.Exec("UPDATE `milestone` SET num_issues=(SELECT count(*) FROM issue WHERE milestone_id=?) WHERE id=?",
|
if _, err = e.Exec("UPDATE `milestone` SET num_issues=(SELECT count(*) FROM issue WHERE milestone_id=?) WHERE id=?",
|
||||||
milestoneID,
|
milestoneID,
|
||||||
|
@ -319,11 +335,7 @@ func updateMilestoneTotalNum(e Engine, milestoneID int64) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = e.Exec("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?",
|
return updateMilestoneCompleteness(e, milestoneID)
|
||||||
milestoneID,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateMilestoneClosedNum(e Engine, milestoneID int64) (err error) {
|
func updateMilestoneClosedNum(e Engine, milestoneID int64) (err error) {
|
||||||
|
@ -335,10 +347,7 @@ func updateMilestoneClosedNum(e Engine, milestoneID int64) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = e.Exec("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?",
|
return updateMilestoneCompleteness(e, milestoneID)
|
||||||
milestoneID,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilestoneID int64) error {
|
func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilestoneID int64) error {
|
||||||
|
|
Reference in a new issue