- // Copyright 2017 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- package migrations
-
- import (
- "time"
-
- "code.gitea.io/gitea/models"
-
- "github.com/go-xorm/xorm"
- "xorm.io/core"
- )
-
- func removeCommitsUnitType(x *xorm.Engine) (err error) {
- // RepoUnit describes all units of a repository
- type RepoUnit struct {
- ID int64
- RepoID int64 `xorm:"INDEX(s)"`
- Type int `xorm:"INDEX(s)"`
- Index int
- Config core.Conversion `xorm:"TEXT"`
- CreatedUnix int64 `xorm:"INDEX CREATED"`
- Created time.Time `xorm:"-"`
- }
-
- type Team struct {
- ID int64
- UnitTypes []int `xorm:"json"`
- }
-
- // Update team unit types
- const batchSize = 100
- for start := 0; ; start += batchSize {
- teams := make([]*Team, 0, batchSize)
- if err := x.Limit(batchSize, start).Find(&teams); err != nil {
- return err
- }
- if len(teams) == 0 {
- break
- }
- for _, team := range teams {
- ut := make([]int, 0, len(team.UnitTypes))
- for _, u := range team.UnitTypes {
- if u < V16UnitTypeCommits {
- ut = append(ut, u)
- } else if u > V16UnitTypeSettings {
- ut = append(ut, u-2)
- } else if u > V16UnitTypeCommits && u != V16UnitTypeSettings {
- ut = append(ut, u-1)
- }
- }
- team.UnitTypes = ut
- if _, err := x.ID(team.ID).Cols("unit_types").Update(team); err != nil {
- return err
- }
- }
- }
-
- // Delete commits and settings unit types
- if _, err = x.In("`type`", []models.UnitType{V16UnitTypeCommits, V16UnitTypeSettings}).Delete(new(RepoUnit)); err != nil {
- return err
- }
- // Fix renumber unit types that where in enumeration after settings unit type
- if _, err = x.Where("`type` > ?", V16UnitTypeSettings).Decr("type").Decr("index").Update(new(RepoUnit)); err != nil {
- return err
- }
- // Fix renumber unit types that where in enumeration after commits unit type
- if _, err = x.Where("`type` > ?", V16UnitTypeCommits).Decr("type").Decr("index").Update(new(RepoUnit)); err != nil {
- return err
- }
-
- return nil
- }
|