summaryrefslogtreecommitdiffstats
path: root/models/migrations/v16.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/migrations/v16.go')
-rw-r--r--models/migrations/v16.go117
1 files changed, 117 insertions, 0 deletions
diff --git a/models/migrations/v16.go b/models/migrations/v16.go
new file mode 100644
index 0000000000..fca8311cbd
--- /dev/null
+++ b/models/migrations/v16.go
@@ -0,0 +1,117 @@
+package migrations
+
+import (
+ "fmt"
+ "time"
+
+ "code.gitea.io/gitea/modules/markdown"
+
+ "github.com/go-xorm/xorm"
+)
+
+// 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]string `xorm:"JSON"`
+ CreatedUnix int64 `xorm:"INDEX CREATED"`
+ Created time.Time `xorm:"-"`
+}
+
+// Enumerate all the unit types
+const (
+ UnitTypeCode = iota + 1 // 1 code
+ UnitTypeIssues // 2 issues
+ UnitTypePRs // 3 PRs
+ UnitTypeCommits // 4 Commits
+ UnitTypeReleases // 5 Releases
+ UnitTypeWiki // 6 Wiki
+ UnitTypeSettings // 7 Settings
+ UnitTypeExternalWiki // 8 ExternalWiki
+ UnitTypeExternalTracker // 9 ExternalTracker
+)
+
+// Repo describes a repository
+type Repo struct {
+ ID int64
+ EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool
+ ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string
+}
+
+func addUnitsToTables(x *xorm.Engine) error {
+ var repos []Repo
+ err := x.Table("repository").Find(&repos)
+ if err != nil {
+ return fmt.Errorf("Query repositories: %v", err)
+ }
+
+ sess := x.NewSession()
+ defer sess.Close()
+
+ if err := sess.Begin(); err != nil {
+ return err
+ }
+
+ var repoUnit RepoUnit
+ if err := sess.CreateTable(&repoUnit); err != nil {
+ return fmt.Errorf("CreateTable RepoUnit: %v", err)
+ }
+
+ if err := sess.CreateUniques(&repoUnit); err != nil {
+ return fmt.Errorf("CreateUniques RepoUnit: %v", err)
+ }
+
+ if err := sess.CreateIndexes(&repoUnit); err != nil {
+ return fmt.Errorf("CreateIndexes RepoUnit: %v", err)
+ }
+
+ for _, repo := range repos {
+ for i := 1; i <= 9; i++ {
+ if (i == UnitTypeWiki || i == UnitTypeExternalWiki) && !repo.EnableWiki {
+ continue
+ }
+ if i == UnitTypeExternalWiki && !repo.EnableExternalWiki {
+ continue
+ }
+ if i == UnitTypePRs && !repo.EnablePulls {
+ continue
+ }
+ if (i == UnitTypeIssues || i == UnitTypeExternalTracker) && !repo.EnableIssues {
+ continue
+ }
+ if i == UnitTypeExternalTracker && !repo.EnableExternalTracker {
+ continue
+ }
+
+ var config = make(map[string]string)
+ switch i {
+ case UnitTypeExternalTracker:
+ config["ExternalTrackerURL"] = repo.ExternalTrackerURL
+ config["ExternalTrackerFormat"] = repo.ExternalTrackerFormat
+ if len(repo.ExternalTrackerStyle) == 0 {
+ repo.ExternalTrackerStyle = markdown.IssueNameStyleNumeric
+ }
+ config["ExternalTrackerStyle"] = repo.ExternalTrackerStyle
+ case UnitTypeExternalWiki:
+ config["ExternalWikiURL"] = repo.ExternalWikiURL
+ }
+
+ if _, err = sess.Insert(&RepoUnit{
+ RepoID: repo.ID,
+ Type: i,
+ Index: i,
+ Config: config,
+ }); err != nil {
+ return fmt.Errorf("Insert repo unit: %v", err)
+ }
+ }
+ }
+
+ if err := sess.Commit(); err != nil {
+ return err
+ }
+
+ return nil
+}