code.gitea.io/gitea@v1.21.7/models/migrations/v1_18/v229.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package v1_18 //nolint
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"code.gitea.io/gitea/models/issues"
    10  
    11  	"xorm.io/builder"
    12  	"xorm.io/xorm"
    13  )
    14  
    15  func UpdateOpenMilestoneCounts(x *xorm.Engine) error {
    16  	var openMilestoneIDs []int64
    17  	err := x.Table("milestone").Select("id").Where(builder.Neq{"is_closed": 1}).Find(&openMilestoneIDs)
    18  	if err != nil {
    19  		return fmt.Errorf("error selecting open milestone IDs: %w", err)
    20  	}
    21  
    22  	for _, id := range openMilestoneIDs {
    23  		_, err := x.ID(id).
    24  			SetExpr("num_issues", builder.Select("count(*)").From("issue").Where(
    25  				builder.Eq{"milestone_id": id},
    26  			)).
    27  			SetExpr("num_closed_issues", builder.Select("count(*)").From("issue").Where(
    28  				builder.Eq{
    29  					"milestone_id": id,
    30  					"is_closed":    true,
    31  				},
    32  			)).
    33  			Update(&issues.Milestone{})
    34  		if err != nil {
    35  			return fmt.Errorf("error updating issue counts in milestone %d: %w", id, err)
    36  		}
    37  		_, err = x.Exec("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?",
    38  			id,
    39  		)
    40  		if err != nil {
    41  			return fmt.Errorf("error setting completeness on milestone %d: %w", id, err)
    42  		}
    43  	}
    44  
    45  	return nil
    46  }