* Reorder migrations, skip errors if running migration again * Rename migration file names to match migration version * Add note about ingored errortags/v1.4.0-rc1
| @@ -59,6 +59,10 @@ type Version struct { | |||||
| Version int64 | Version int64 | ||||
| } | } | ||||
| func emptyMigration(x *xorm.Engine) error { | |||||
| return nil | |||||
| } | |||||
| // This is a sequence of migrations. Add new migrations to the bottom of the list. | // This is a sequence of migrations. Add new migrations to the bottom of the list. | ||||
| // If you want to "retire" a migration, remove it from the top of the list and | // If you want to "retire" a migration, remove it from the top of the list and | ||||
| // update minDBVersion accordingly | // update minDBVersion accordingly | ||||
| @@ -127,17 +131,17 @@ var migrations = []Migration{ | |||||
| // v38 -> v39 | // v38 -> v39 | ||||
| NewMigration("remove commits and settings unit types", removeCommitsUnitType), | NewMigration("remove commits and settings unit types", removeCommitsUnitType), | ||||
| // v39 -> v40 | // v39 -> v40 | ||||
| NewMigration("adds time tracking and stopwatches", addTimetracking), | |||||
| NewMigration("add tags to releases and sync existing repositories", releaseAddColumnIsTagAndSyncTags), | |||||
| // v40 -> v41 | // v40 -> v41 | ||||
| NewMigration("migrate protected branch struct", migrateProtectedBranchStruct), | |||||
| NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue), | |||||
| // v41 -> v42 | // v41 -> v42 | ||||
| NewMigration("add default value to user prohibit_login", addDefaultValueToUserProhibitLogin), | |||||
| NewMigration("remove duplicate unit types", removeDuplicateUnitTypes), | |||||
| // v42 -> v43 | // v42 -> v43 | ||||
| NewMigration("add tags to releases and sync existing repositories", releaseAddColumnIsTagAndSyncTags), | |||||
| NewMigration("empty step", emptyMigration), | |||||
| // v43 -> v44 | // v43 -> v44 | ||||
| NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue), | |||||
| NewMigration("empty step", emptyMigration), | |||||
| // v44 -> v45 | // v44 -> v45 | ||||
| NewMigration("remove duplicate unit types", removeDuplicateUnitTypes), | |||||
| NewMigration("empty step", emptyMigration), | |||||
| // v45 -> v46 | // v45 -> v46 | ||||
| NewMigration("remove index column from repo_unit table", removeIndexColumnFromRepoUnitTable), | NewMigration("remove index column from repo_unit table", removeIndexColumnFromRepoUnitTable), | ||||
| // v46 -> v47 | // v46 -> v47 | ||||
| @@ -147,8 +151,14 @@ var migrations = []Migration{ | |||||
| // v48 -> v49 | // v48 -> v49 | ||||
| NewMigration("add repo indexer status", addRepoIndexerStatus), | NewMigration("add repo indexer status", addRepoIndexerStatus), | ||||
| // v49 -> v50 | // v49 -> v50 | ||||
| NewMigration("add lfs lock table", addLFSLock), | |||||
| NewMigration("adds time tracking and stopwatches", addTimetracking), | |||||
| // v50 -> v51 | // v50 -> v51 | ||||
| NewMigration("migrate protected branch struct", migrateProtectedBranchStruct), | |||||
| // v51 -> v52 | |||||
| NewMigration("add default value to user prohibit_login", addDefaultValueToUserProhibitLogin), | |||||
| // v52 -> v53 | |||||
| NewMigration("add lfs lock table", addLFSLock), | |||||
| // v53 -> v54 | |||||
| NewMigration("add reactions", addReactions), | NewMigration("add reactions", addReactions), | ||||
| } | } | ||||
| @@ -6,69 +6,52 @@ package migrations | |||||
| import ( | import ( | ||||
| "fmt" | "fmt" | ||||
| "time" | |||||
| "code.gitea.io/gitea/modules/setting" | |||||
| "code.gitea.io/git" | |||||
| "code.gitea.io/gitea/models" | |||||
| "code.gitea.io/gitea/modules/log" | |||||
| "github.com/go-xorm/xorm" | "github.com/go-xorm/xorm" | ||||
| ) | ) | ||||
| func addTimetracking(x *xorm.Engine) 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 map[string]interface{} `xorm:"JSON"` | |||||
| CreatedUnix int64 `xorm:"INDEX CREATED"` | |||||
| Created time.Time `xorm:"-"` | |||||
| } | |||||
| // Stopwatch see models/issue_stopwatch.go | |||||
| type Stopwatch struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| IssueID int64 `xorm:"INDEX"` | |||||
| UserID int64 `xorm:"INDEX"` | |||||
| Created time.Time `xorm:"-"` | |||||
| CreatedUnix int64 | |||||
| } | |||||
| // ReleaseV39 describes the added field for Release | |||||
| type ReleaseV39 struct { | |||||
| IsTag bool `xorm:"NOT NULL DEFAULT false"` | |||||
| } | |||||
| // TrackedTime see models/issue_tracked_time.go | |||||
| type TrackedTime struct { | |||||
| ID int64 `xorm:"pk autoincr" json:"id"` | |||||
| IssueID int64 `xorm:"INDEX" json:"issue_id"` | |||||
| UserID int64 `xorm:"INDEX" json:"user_id"` | |||||
| Created time.Time `xorm:"-" json:"created"` | |||||
| CreatedUnix int64 `json:"-"` | |||||
| Time int64 `json:"time"` | |||||
| } | |||||
| // TableName will be invoked by XORM to customrize the table name | |||||
| func (*ReleaseV39) TableName() string { | |||||
| return "release" | |||||
| } | |||||
| if err := x.Sync2(new(Stopwatch)); err != nil { | |||||
| func releaseAddColumnIsTagAndSyncTags(x *xorm.Engine) error { | |||||
| if err := x.Sync2(new(ReleaseV39)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | return fmt.Errorf("Sync2: %v", err) | ||||
| } | } | ||||
| if err := x.Sync2(new(TrackedTime)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | |||||
| //Updating existing issue units | |||||
| units := make([]*RepoUnit, 0, 100) | |||||
| err := x.Where("`type` = ?", V16UnitTypeIssues).Find(&units) | |||||
| if err != nil { | |||||
| return fmt.Errorf("Query repo units: %v", err) | |||||
| } | |||||
| for _, unit := range units { | |||||
| if unit.Config == nil { | |||||
| unit.Config = make(map[string]interface{}) | |||||
| } | |||||
| if _, ok := unit.Config["EnableTimetracker"]; !ok { | |||||
| unit.Config["EnableTimetracker"] = setting.Service.DefaultEnableTimetracking | |||||
| // For the sake of SQLite3, we can't use x.Iterate here. | |||||
| offset := 0 | |||||
| pageSize := 20 | |||||
| for { | |||||
| repos := make([]*models.Repository, 0, pageSize) | |||||
| if err := x.Table("repository").Asc("id").Limit(pageSize, offset).Find(&repos); err != nil { | |||||
| return fmt.Errorf("select repos [offset: %d]: %v", offset, err) | |||||
| } | } | ||||
| if _, ok := unit.Config["AllowOnlyContributorsToTrackTime"]; !ok { | |||||
| unit.Config["AllowOnlyContributorsToTrackTime"] = setting.Service.DefaultAllowOnlyContributorsToTrackTime | |||||
| for _, repo := range repos { | |||||
| gitRepo, err := git.OpenRepository(repo.RepoPath()) | |||||
| if err != nil { | |||||
| log.Warn("OpenRepository: %v", err) | |||||
| continue | |||||
| } | |||||
| if err = models.SyncReleasesWithTags(repo, gitRepo); err != nil { | |||||
| log.Warn("SyncReleasesWithTags: %v", err) | |||||
| } | |||||
| } | } | ||||
| if _, err := x.ID(unit.ID).Cols("config").Update(unit); err != nil { | |||||
| return err | |||||
| if len(repos) < pageSize { | |||||
| break | |||||
| } | } | ||||
| offset += pageSize | |||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -6,50 +6,21 @@ package migrations | |||||
| import ( | import ( | ||||
| "fmt" | "fmt" | ||||
| "time" | |||||
| "code.gitea.io/gitea/modules/log" | |||||
| "code.gitea.io/gitea/modules/setting" | |||||
| "github.com/go-xorm/xorm" | "github.com/go-xorm/xorm" | ||||
| ) | ) | ||||
| func migrateProtectedBranchStruct(x *xorm.Engine) error { | |||||
| func fixProtectedBranchCanPushValue(x *xorm.Engine) error { | |||||
| type ProtectedBranch struct { | type ProtectedBranch struct { | ||||
| ID int64 `xorm:"pk autoincr"` | |||||
| RepoID int64 `xorm:"UNIQUE(s)"` | |||||
| BranchName string `xorm:"UNIQUE(s)"` | |||||
| CanPush bool | |||||
| Created time.Time `xorm:"-"` | |||||
| CreatedUnix int64 | |||||
| Updated time.Time `xorm:"-"` | |||||
| UpdatedUnix int64 | |||||
| } | |||||
| var pbs []ProtectedBranch | |||||
| err := x.Find(&pbs) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| for _, pb := range pbs { | |||||
| if pb.CanPush { | |||||
| if _, err = x.ID(pb.ID).Delete(new(ProtectedBranch)); err != nil { | |||||
| return err | |||||
| } | |||||
| } | |||||
| CanPush bool `xorm:"NOT NULL DEFAULT false"` | |||||
| } | } | ||||
| switch { | |||||
| case setting.UseSQLite3: | |||||
| log.Warn("Unable to drop columns in SQLite") | |||||
| case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB: | |||||
| if _, err := x.Exec("ALTER TABLE protected_branch DROP COLUMN can_push"); err != nil { | |||||
| return fmt.Errorf("DROP COLUMN can_push: %v", err) | |||||
| } | |||||
| default: | |||||
| log.Fatal(4, "Unrecognized DB") | |||||
| if err := x.Sync2(new(ProtectedBranch)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | } | ||||
| return nil | |||||
| _, err := x.Cols("can_push").Update(&ProtectedBranch{ | |||||
| CanPush: false, | |||||
| }) | |||||
| return err | |||||
| } | } | ||||
| @@ -7,36 +7,63 @@ package migrations | |||||
| import ( | import ( | ||||
| "fmt" | "fmt" | ||||
| "code.gitea.io/gitea/models" | |||||
| "github.com/go-xorm/xorm" | "github.com/go-xorm/xorm" | ||||
| ) | ) | ||||
| func addDefaultValueToUserProhibitLogin(x *xorm.Engine) (err error) { | |||||
| user := &models.User{ | |||||
| ProhibitLogin: false, | |||||
| func removeDuplicateUnitTypes(x *xorm.Engine) error { | |||||
| // RepoUnit describes all units of a repository | |||||
| type RepoUnit struct { | |||||
| RepoID int64 | |||||
| Type int | |||||
| } | |||||
| // Enumerate all the unit types | |||||
| const ( | |||||
| UnitTypeCode = iota + 1 // 1 code | |||||
| UnitTypeIssues // 2 issues | |||||
| UnitTypePullRequests // 3 PRs | |||||
| UnitTypeReleases // 4 Releases | |||||
| UnitTypeWiki // 5 Wiki | |||||
| UnitTypeExternalWiki // 6 ExternalWiki | |||||
| UnitTypeExternalTracker // 7 ExternalTracker | |||||
| ) | |||||
| var externalIssueRepoUnits []RepoUnit | |||||
| err := x.Where("type = ?", UnitTypeExternalTracker).Find(&externalIssueRepoUnits) | |||||
| if err != nil { | |||||
| return fmt.Errorf("Query repositories: %v", err) | |||||
| } | |||||
| var externalWikiRepoUnits []RepoUnit | |||||
| err = x.Where("type = ?", UnitTypeExternalWiki).Find(&externalWikiRepoUnits) | |||||
| if err != nil { | |||||
| return fmt.Errorf("Query repositories: %v", err) | |||||
| } | } | ||||
| if _, err := x.Where("`prohibit_login` IS NULL").Cols("prohibit_login").Update(user); err != nil { | |||||
| sess := x.NewSession() | |||||
| defer sess.Close() | |||||
| if err := sess.Begin(); err != nil { | |||||
| return err | return err | ||||
| } | } | ||||
| dialect := x.Dialect().DriverName() | |||||
| switch dialect { | |||||
| case "mysql": | |||||
| _, err = x.Exec("ALTER TABLE user MODIFY `prohibit_login` tinyint(1) NOT NULL DEFAULT 0") | |||||
| case "postgres": | |||||
| _, err = x.Exec("ALTER TABLE \"user\" ALTER COLUMN `prohibit_login` SET NOT NULL, ALTER COLUMN `prohibit_login` SET DEFAULT false") | |||||
| case "mssql": | |||||
| // xorm already set DEFAULT 0 for data type BIT in mssql | |||||
| _, err = x.Exec(`ALTER TABLE [user] ALTER COLUMN "prohibit_login" BIT NOT NULL`) | |||||
| case "sqlite3": | |||||
| for _, repoUnit := range externalIssueRepoUnits { | |||||
| if _, err = sess.Delete(&RepoUnit{ | |||||
| RepoID: repoUnit.RepoID, | |||||
| Type: UnitTypeIssues, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("Delete repo unit: %v", err) | |||||
| } | |||||
| } | } | ||||
| if err != nil { | |||||
| return fmt.Errorf("Error changing user prohibit_login column definition: %v", err) | |||||
| for _, repoUnit := range externalWikiRepoUnits { | |||||
| if _, err = sess.Delete(&RepoUnit{ | |||||
| RepoID: repoUnit.RepoID, | |||||
| Type: UnitTypeWiki, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("Delete repo unit: %v", err) | |||||
| } | |||||
| } | } | ||||
| return err | |||||
| return sess.Commit() | |||||
| } | } | ||||
| @@ -1,57 +0,0 @@ | |||||
| // 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 ( | |||||
| "fmt" | |||||
| "code.gitea.io/git" | |||||
| "code.gitea.io/gitea/models" | |||||
| "code.gitea.io/gitea/modules/log" | |||||
| "github.com/go-xorm/xorm" | |||||
| ) | |||||
| // ReleaseV39 describes the added field for Release | |||||
| type ReleaseV39 struct { | |||||
| IsTag bool `xorm:"NOT NULL DEFAULT false"` | |||||
| } | |||||
| // TableName will be invoked by XORM to customrize the table name | |||||
| func (*ReleaseV39) TableName() string { | |||||
| return "release" | |||||
| } | |||||
| func releaseAddColumnIsTagAndSyncTags(x *xorm.Engine) error { | |||||
| if err := x.Sync2(new(ReleaseV39)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | |||||
| // For the sake of SQLite3, we can't use x.Iterate here. | |||||
| offset := 0 | |||||
| pageSize := 20 | |||||
| for { | |||||
| repos := make([]*models.Repository, 0, pageSize) | |||||
| if err := x.Table("repository").Asc("id").Limit(pageSize, offset).Find(&repos); err != nil { | |||||
| return fmt.Errorf("select repos [offset: %d]: %v", offset, err) | |||||
| } | |||||
| for _, repo := range repos { | |||||
| gitRepo, err := git.OpenRepository(repo.RepoPath()) | |||||
| if err != nil { | |||||
| log.Warn("OpenRepository: %v", err) | |||||
| continue | |||||
| } | |||||
| if err = models.SyncReleasesWithTags(repo, gitRepo); err != nil { | |||||
| log.Warn("SyncReleasesWithTags: %v", err) | |||||
| } | |||||
| } | |||||
| if len(repos) < pageSize { | |||||
| break | |||||
| } | |||||
| offset += pageSize | |||||
| } | |||||
| return nil | |||||
| } | |||||
| @@ -1,26 +0,0 @@ | |||||
| // 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 ( | |||||
| "fmt" | |||||
| "github.com/go-xorm/xorm" | |||||
| ) | |||||
| func fixProtectedBranchCanPushValue(x *xorm.Engine) error { | |||||
| type ProtectedBranch struct { | |||||
| CanPush bool `xorm:"NOT NULL DEFAULT false"` | |||||
| } | |||||
| if err := x.Sync2(new(ProtectedBranch)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | |||||
| _, err := x.Cols("can_push").Update(&ProtectedBranch{ | |||||
| CanPush: false, | |||||
| }) | |||||
| return err | |||||
| } | |||||
| @@ -1,69 +0,0 @@ | |||||
| // 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 ( | |||||
| "fmt" | |||||
| "github.com/go-xorm/xorm" | |||||
| ) | |||||
| func removeDuplicateUnitTypes(x *xorm.Engine) error { | |||||
| // RepoUnit describes all units of a repository | |||||
| type RepoUnit struct { | |||||
| RepoID int64 | |||||
| Type int | |||||
| } | |||||
| // Enumerate all the unit types | |||||
| const ( | |||||
| UnitTypeCode = iota + 1 // 1 code | |||||
| UnitTypeIssues // 2 issues | |||||
| UnitTypePullRequests // 3 PRs | |||||
| UnitTypeReleases // 4 Releases | |||||
| UnitTypeWiki // 5 Wiki | |||||
| UnitTypeExternalWiki // 6 ExternalWiki | |||||
| UnitTypeExternalTracker // 7 ExternalTracker | |||||
| ) | |||||
| var externalIssueRepoUnits []RepoUnit | |||||
| err := x.Where("type = ?", UnitTypeExternalTracker).Find(&externalIssueRepoUnits) | |||||
| if err != nil { | |||||
| return fmt.Errorf("Query repositories: %v", err) | |||||
| } | |||||
| var externalWikiRepoUnits []RepoUnit | |||||
| err = x.Where("type = ?", UnitTypeExternalWiki).Find(&externalWikiRepoUnits) | |||||
| if err != nil { | |||||
| return fmt.Errorf("Query repositories: %v", err) | |||||
| } | |||||
| sess := x.NewSession() | |||||
| defer sess.Close() | |||||
| if err := sess.Begin(); err != nil { | |||||
| return err | |||||
| } | |||||
| for _, repoUnit := range externalIssueRepoUnits { | |||||
| if _, err = sess.Delete(&RepoUnit{ | |||||
| RepoID: repoUnit.RepoID, | |||||
| Type: UnitTypeIssues, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("Delete repo unit: %v", err) | |||||
| } | |||||
| } | |||||
| for _, repoUnit := range externalWikiRepoUnits { | |||||
| if _, err = sess.Delete(&RepoUnit{ | |||||
| RepoID: repoUnit.RepoID, | |||||
| Type: UnitTypeWiki, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("Delete repo unit: %v", err) | |||||
| } | |||||
| } | |||||
| return sess.Commit() | |||||
| } | |||||
| @@ -5,10 +5,9 @@ | |||||
| package migrations | package migrations | ||||
| import ( | import ( | ||||
| "fmt" | |||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| "github.com/go-xorm/xorm" | "github.com/go-xorm/xorm" | ||||
| ) | ) | ||||
| @@ -18,7 +17,8 @@ func removeIndexColumnFromRepoUnitTable(x *xorm.Engine) (err error) { | |||||
| log.Warn("Unable to drop columns in SQLite") | log.Warn("Unable to drop columns in SQLite") | ||||
| case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB: | case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB: | ||||
| if _, err := x.Exec("ALTER TABLE repo_unit DROP COLUMN `index`"); err != nil { | if _, err := x.Exec("ALTER TABLE repo_unit DROP COLUMN `index`"); err != nil { | ||||
| return fmt.Errorf("DROP COLUMN index: %v", err) | |||||
| // Ignoring this error in case we run this migration second time (after migration reordering) | |||||
| log.Warn("DROP COLUMN index: %v", err) | |||||
| } | } | ||||
| default: | default: | ||||
| log.Fatal(4, "Unrecognized DB") | log.Fatal(4, "Unrecognized DB") | ||||
| @@ -8,24 +8,66 @@ import ( | |||||
| "fmt" | "fmt" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/models" | |||||
| "code.gitea.io/gitea/modules/setting" | |||||
| "github.com/go-xorm/xorm" | "github.com/go-xorm/xorm" | ||||
| ) | ) | ||||
| func addLFSLock(x *xorm.Engine) error { | |||||
| // LFSLock see models/lfs_lock.go | |||||
| type LFSLock struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| RepoID int64 `xorm:"INDEX NOT NULL"` | |||||
| Owner *models.User `xorm:"-"` | |||||
| OwnerID int64 `xorm:"INDEX NOT NULL"` | |||||
| Path string `xorm:"TEXT"` | |||||
| Created time.Time `xorm:"created"` | |||||
| func addTimetracking(x *xorm.Engine) error { | |||||
| // RepoUnit describes all units of a repository | |||||
| type RepoUnit struct { | |||||
| ID int64 | |||||
| RepoID int64 `xorm:"INDEX(s)"` | |||||
| Type int `xorm:"INDEX(s)"` | |||||
| Config map[string]interface{} `xorm:"JSON"` | |||||
| CreatedUnix int64 `xorm:"INDEX CREATED"` | |||||
| Created time.Time `xorm:"-"` | |||||
| } | } | ||||
| if err := x.Sync2(new(LFSLock)); err != nil { | |||||
| // Stopwatch see models/issue_stopwatch.go | |||||
| type Stopwatch struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| IssueID int64 `xorm:"INDEX"` | |||||
| UserID int64 `xorm:"INDEX"` | |||||
| Created time.Time `xorm:"-"` | |||||
| CreatedUnix int64 | |||||
| } | |||||
| // TrackedTime see models/issue_tracked_time.go | |||||
| type TrackedTime struct { | |||||
| ID int64 `xorm:"pk autoincr" json:"id"` | |||||
| IssueID int64 `xorm:"INDEX" json:"issue_id"` | |||||
| UserID int64 `xorm:"INDEX" json:"user_id"` | |||||
| Created time.Time `xorm:"-" json:"created"` | |||||
| CreatedUnix int64 `json:"-"` | |||||
| Time int64 `json:"time"` | |||||
| } | |||||
| if err := x.Sync2(new(Stopwatch)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | return fmt.Errorf("Sync2: %v", err) | ||||
| } | } | ||||
| if err := x.Sync2(new(TrackedTime)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | |||||
| //Updating existing issue units | |||||
| units := make([]*RepoUnit, 0, 100) | |||||
| err := x.Where("`type` = ?", V16UnitTypeIssues).Find(&units) | |||||
| if err != nil { | |||||
| return fmt.Errorf("Query repo units: %v", err) | |||||
| } | |||||
| for _, unit := range units { | |||||
| if unit.Config == nil { | |||||
| unit.Config = make(map[string]interface{}) | |||||
| } | |||||
| if _, ok := unit.Config["EnableTimetracker"]; !ok { | |||||
| unit.Config["EnableTimetracker"] = setting.Service.DefaultEnableTimetracking | |||||
| } | |||||
| if _, ok := unit.Config["AllowOnlyContributorsToTrackTime"]; !ok { | |||||
| unit.Config["AllowOnlyContributorsToTrackTime"] = setting.Service.DefaultAllowOnlyContributorsToTrackTime | |||||
| } | |||||
| if _, err := x.ID(unit.ID).Cols("config").Update(unit); err != nil { | |||||
| return err | |||||
| } | |||||
| } | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -5,24 +5,51 @@ | |||||
| package migrations | package migrations | ||||
| import ( | import ( | ||||
| "fmt" | |||||
| "time" | |||||
| "code.gitea.io/gitea/modules/log" | |||||
| "code.gitea.io/gitea/modules/setting" | |||||
| "github.com/go-xorm/xorm" | "github.com/go-xorm/xorm" | ||||
| ) | ) | ||||
| func addReactions(x *xorm.Engine) error { | |||||
| // Reaction see models/issue_reaction.go | |||||
| type Reaction struct { | |||||
| func migrateProtectedBranchStruct(x *xorm.Engine) error { | |||||
| type ProtectedBranch struct { | |||||
| ID int64 `xorm:"pk autoincr"` | ID int64 `xorm:"pk autoincr"` | ||||
| Type string `xorm:"INDEX UNIQUE(s) NOT NULL"` | |||||
| IssueID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` | |||||
| CommentID int64 `xorm:"INDEX UNIQUE(s)"` | |||||
| UserID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` | |||||
| CreatedUnix int64 `xorm:"INDEX created"` | |||||
| RepoID int64 `xorm:"UNIQUE(s)"` | |||||
| BranchName string `xorm:"UNIQUE(s)"` | |||||
| CanPush bool | |||||
| Created time.Time `xorm:"-"` | |||||
| CreatedUnix int64 | |||||
| Updated time.Time `xorm:"-"` | |||||
| UpdatedUnix int64 | |||||
| } | |||||
| var pbs []ProtectedBranch | |||||
| err := x.Find(&pbs) | |||||
| if err != nil { | |||||
| return err | |||||
| } | } | ||||
| if err := x.Sync2(new(Reaction)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| for _, pb := range pbs { | |||||
| if pb.CanPush { | |||||
| if _, err = x.ID(pb.ID).Delete(new(ProtectedBranch)); err != nil { | |||||
| return err | |||||
| } | |||||
| } | |||||
| } | } | ||||
| switch { | |||||
| case setting.UseSQLite3: | |||||
| log.Warn("Unable to drop columns in SQLite") | |||||
| case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB: | |||||
| if _, err := x.Exec("ALTER TABLE protected_branch DROP COLUMN can_push"); err != nil { | |||||
| // Ignoring this error in case we run this migration second time (after migration reordering) | |||||
| log.Warn("DROP COLUMN can_push (skipping): %v", err) | |||||
| } | |||||
| default: | |||||
| log.Fatal(4, "Unrecognized DB") | |||||
| } | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -0,0 +1,42 @@ | |||||
| // 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 ( | |||||
| "code.gitea.io/gitea/models" | |||||
| "code.gitea.io/gitea/modules/log" | |||||
| "github.com/go-xorm/xorm" | |||||
| ) | |||||
| func addDefaultValueToUserProhibitLogin(x *xorm.Engine) (err error) { | |||||
| user := &models.User{ | |||||
| ProhibitLogin: false, | |||||
| } | |||||
| if _, err := x.Where("`prohibit_login` IS NULL").Cols("prohibit_login").Update(user); err != nil { | |||||
| return err | |||||
| } | |||||
| dialect := x.Dialect().DriverName() | |||||
| switch dialect { | |||||
| case "mysql": | |||||
| _, err = x.Exec("ALTER TABLE user MODIFY `prohibit_login` tinyint(1) NOT NULL DEFAULT 0") | |||||
| case "postgres": | |||||
| _, err = x.Exec("ALTER TABLE \"user\" ALTER COLUMN `prohibit_login` SET NOT NULL, ALTER COLUMN `prohibit_login` SET DEFAULT false") | |||||
| case "mssql": | |||||
| // xorm already set DEFAULT 0 for data type BIT in mssql | |||||
| _, err = x.Exec(`ALTER TABLE [user] ALTER COLUMN "prohibit_login" BIT NOT NULL`) | |||||
| case "sqlite3": | |||||
| } | |||||
| if err != nil { | |||||
| // Ignoring this error in case we run this migration second time (after migration reordering) | |||||
| log.Warn("Error changing user prohibit_login column definition (skipping): %v", err) | |||||
| } | |||||
| return nil | |||||
| } | |||||
| @@ -0,0 +1,31 @@ | |||||
| // 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 ( | |||||
| "fmt" | |||||
| "time" | |||||
| "code.gitea.io/gitea/models" | |||||
| "github.com/go-xorm/xorm" | |||||
| ) | |||||
| func addLFSLock(x *xorm.Engine) error { | |||||
| // LFSLock see models/lfs_lock.go | |||||
| type LFSLock struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| RepoID int64 `xorm:"INDEX NOT NULL"` | |||||
| Owner *models.User `xorm:"-"` | |||||
| OwnerID int64 `xorm:"INDEX NOT NULL"` | |||||
| Path string `xorm:"TEXT"` | |||||
| Created time.Time `xorm:"created"` | |||||
| } | |||||
| if err := x.Sync2(new(LFSLock)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | |||||
| return nil | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| // 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 ( | |||||
| "fmt" | |||||
| "github.com/go-xorm/xorm" | |||||
| ) | |||||
| func addReactions(x *xorm.Engine) error { | |||||
| // Reaction see models/issue_reaction.go | |||||
| type Reaction struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| Type string `xorm:"INDEX UNIQUE(s) NOT NULL"` | |||||
| IssueID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` | |||||
| CommentID int64 `xorm:"INDEX UNIQUE(s)"` | |||||
| UserID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` | |||||
| CreatedUnix int64 `xorm:"INDEX created"` | |||||
| } | |||||
| if err := x.Sync2(new(Reaction)); err != nil { | |||||
| return fmt.Errorf("Sync2: %v", err) | |||||
| } | |||||
| return nil | |||||
| } | |||||