2017-07-17 05:04:43 +03:00
// 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 (
2017-10-08 13:08:18 +02:00
"time"
2017-07-17 05:04:43 +03:00
"code.gitea.io/gitea/models"
2017-10-08 13:08:18 +02:00
"github.com/go-xorm/core"
2017-07-17 05:04:43 +03:00
"github.com/go-xorm/xorm"
)
func removeCommitsUnitType ( x * xorm . Engine ) ( err error ) {
2017-10-08 13:08:18 +02:00
// 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:"-" `
}
2017-07-17 05:04:43 +03:00
// Update team unit types
const batchSize = 100
for start := 0 ; ; start += batchSize {
teams := make ( [ ] * models . 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 ( [ ] models . UnitType , 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
2017-10-04 21:43:04 -07:00
if _ , err := x . ID ( team . ID ) . Cols ( "unit_types" ) . Update ( team ) ; err != nil {
2017-07-17 05:04:43 +03:00
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
}