- // 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/modules/markup"
-
- "github.com/go-xorm/xorm"
- )
-
- // Enumerate all the unit types
- const (
- V16UnitTypeCode = iota + 1 // 1 code
- V16UnitTypeIssues // 2 issues
- V16UnitTypePRs // 3 PRs
- V16UnitTypeCommits // 4 Commits
- V16UnitTypeReleases // 5 Releases
- V16UnitTypeWiki // 6 Wiki
- V16UnitTypeSettings // 7 Settings
- V16UnitTypeExternalWiki // 8 ExternalWiki
- V16UnitTypeExternalTracker // 9 ExternalTracker
- )
-
- func addUnitsToTables(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:"-"`
- }
-
- // Repo describes a repository
- type Repo struct {
- ID int64
- EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool
- ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string
- }
-
- var repos []Repo
- err := x.Table("repository").Select("*").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 exist, err := sess.IsTableExist(&repoUnit); err != nil {
- return fmt.Errorf("IsExist RepoUnit: %v", err)
- } else if exist {
- return nil
- }
-
- 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 == V16UnitTypeWiki || i == V16UnitTypeExternalWiki) && !repo.EnableWiki {
- continue
- }
- if i == V16UnitTypeExternalWiki && !repo.EnableExternalWiki {
- continue
- }
- if i == V16UnitTypePRs && !repo.EnablePulls {
- continue
- }
- if (i == V16UnitTypeIssues || i == V16UnitTypeExternalTracker) && !repo.EnableIssues {
- continue
- }
- if i == V16UnitTypeExternalTracker && !repo.EnableExternalTracker {
- continue
- }
-
- var config = make(map[string]interface{})
- switch i {
- case V16UnitTypeExternalTracker:
- config["ExternalTrackerURL"] = repo.ExternalTrackerURL
- config["ExternalTrackerFormat"] = repo.ExternalTrackerFormat
- if len(repo.ExternalTrackerStyle) == 0 {
- repo.ExternalTrackerStyle = markup.IssueNameStyleNumeric
- }
- config["ExternalTrackerStyle"] = repo.ExternalTrackerStyle
- case V16UnitTypeExternalWiki:
- 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)
- }
- }
- }
-
- return sess.Commit()
- }
|