diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index deded2f75..cbd09afab 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -59,6 +59,10 @@ type Version struct { 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. // If you want to "retire" a migration, remove it from the top of the list and // update minDBVersion accordingly @@ -127,17 +131,17 @@ var migrations = []Migration{ // v38 -> v39 NewMigration("remove commits and settings unit types", removeCommitsUnitType), // v39 -> v40 - NewMigration("adds time tracking and stopwatches", addTimetracking), + NewMigration("add tags to releases and sync existing repositories", releaseAddColumnIsTagAndSyncTags), // v40 -> v41 - NewMigration("migrate protected branch struct", migrateProtectedBranchStruct), + NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue), // v41 -> v42 - NewMigration("add default value to user prohibit_login", addDefaultValueToUserProhibitLogin), + NewMigration("remove duplicate unit types", removeDuplicateUnitTypes), // v42 -> v43 - NewMigration("add tags to releases and sync existing repositories", releaseAddColumnIsTagAndSyncTags), + NewMigration("empty step", emptyMigration), // v43 -> v44 - NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue), + NewMigration("empty step", emptyMigration), // v44 -> v45 - NewMigration("remove duplicate unit types", removeDuplicateUnitTypes), + NewMigration("empty step", emptyMigration), // v45 -> v46 NewMigration("remove index column from repo_unit table", removeIndexColumnFromRepoUnitTable), // v46 -> v47 @@ -147,8 +151,14 @@ var migrations = []Migration{ // v48 -> v49 NewMigration("add repo indexer status", addRepoIndexerStatus), // v49 -> v50 - NewMigration("add lfs lock table", addLFSLock), + NewMigration("adds time tracking and stopwatches", addTimetracking), // 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), } diff --git a/models/migrations/v39.go b/models/migrations/v39.go index 95ae0c96a..3547ef1f9 100644 --- a/models/migrations/v39.go +++ b/models/migrations/v39.go @@ -6,69 +6,52 @@ package migrations import ( "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" ) -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) } - 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 } diff --git a/models/migrations/v40.go b/models/migrations/v40.go index 324521e0b..fffe158bf 100644 --- a/models/migrations/v40.go +++ b/models/migrations/v40.go @@ -6,50 +6,21 @@ package migrations import ( "fmt" - "time" - - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" "github.com/go-xorm/xorm" ) -func migrateProtectedBranchStruct(x *xorm.Engine) error { +func fixProtectedBranchCanPushValue(x *xorm.Engine) error { 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 } diff --git a/models/migrations/v41.go b/models/migrations/v41.go index 89763c3af..4de3ad4e9 100644 --- a/models/migrations/v41.go +++ b/models/migrations/v41.go @@ -7,36 +7,63 @@ package migrations import ( "fmt" - "code.gitea.io/gitea/models" - "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 } - 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() } diff --git a/models/migrations/v42.go b/models/migrations/v42.go deleted file mode 100644 index 3547ef1f9..000000000 --- a/models/migrations/v42.go +++ /dev/null @@ -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 -} diff --git a/models/migrations/v43.go b/models/migrations/v43.go deleted file mode 100644 index fffe158bf..000000000 --- a/models/migrations/v43.go +++ /dev/null @@ -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 -} diff --git a/models/migrations/v44.go b/models/migrations/v44.go deleted file mode 100644 index 4de3ad4e9..000000000 --- a/models/migrations/v44.go +++ /dev/null @@ -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() -} diff --git a/models/migrations/v45.go b/models/migrations/v45.go index 7a8590819..9ad27cf6d 100644 --- a/models/migrations/v45.go +++ b/models/migrations/v45.go @@ -5,10 +5,9 @@ package migrations import ( - "fmt" - "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "github.com/go-xorm/xorm" ) @@ -18,7 +17,8 @@ func removeIndexColumnFromRepoUnitTable(x *xorm.Engine) (err error) { log.Warn("Unable to drop columns in SQLite") case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB: 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: log.Fatal(4, "Unrecognized DB") diff --git a/models/migrations/v49.go b/models/migrations/v49.go index ab57d27de..9e98de5cf 100644 --- a/models/migrations/v49.go +++ b/models/migrations/v49.go @@ -8,24 +8,66 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" "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) } + 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 } diff --git a/models/migrations/v50.go b/models/migrations/v50.go index 7437cace2..4ed8f0515 100644 --- a/models/migrations/v50.go +++ b/models/migrations/v50.go @@ -5,24 +5,51 @@ package migrations import ( - "fmt" + "time" + + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "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"` - 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 } diff --git a/models/migrations/v51.go b/models/migrations/v51.go new file mode 100644 index 000000000..85e903bbe --- /dev/null +++ b/models/migrations/v51.go @@ -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 +} diff --git a/models/migrations/v52.go b/models/migrations/v52.go new file mode 100644 index 000000000..ab57d27de --- /dev/null +++ b/models/migrations/v52.go @@ -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 +} diff --git a/models/migrations/v53.go b/models/migrations/v53.go new file mode 100644 index 000000000..7437cace2 --- /dev/null +++ b/models/migrations/v53.go @@ -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 +}