You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.4 KiB

  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package migrations
  5. import (
  6. "fmt"
  7. "time"
  8. "code.gitea.io/gitea/modules/markdown"
  9. "github.com/go-xorm/xorm"
  10. )
  11. // RepoUnit describes all units of a repository
  12. type RepoUnit struct {
  13. ID int64
  14. RepoID int64 `xorm:"INDEX(s)"`
  15. Type int `xorm:"INDEX(s)"`
  16. Index int
  17. Config map[string]string `xorm:"JSON"`
  18. CreatedUnix int64 `xorm:"INDEX CREATED"`
  19. Created time.Time `xorm:"-"`
  20. }
  21. // Enumerate all the unit types
  22. const (
  23. UnitTypeCode = iota + 1 // 1 code
  24. UnitTypeIssues // 2 issues
  25. UnitTypePRs // 3 PRs
  26. UnitTypeCommits // 4 Commits
  27. UnitTypeReleases // 5 Releases
  28. UnitTypeWiki // 6 Wiki
  29. UnitTypeSettings // 7 Settings
  30. UnitTypeExternalWiki // 8 ExternalWiki
  31. UnitTypeExternalTracker // 9 ExternalTracker
  32. )
  33. // Repo describes a repository
  34. type Repo struct {
  35. ID int64
  36. EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool
  37. ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string
  38. }
  39. func addUnitsToTables(x *xorm.Engine) error {
  40. var repos []Repo
  41. err := x.Table("repository").Select("*").Find(&repos)
  42. if err != nil {
  43. return fmt.Errorf("Query repositories: %v", err)
  44. }
  45. sess := x.NewSession()
  46. defer sess.Close()
  47. if err := sess.Begin(); err != nil {
  48. return err
  49. }
  50. var repoUnit RepoUnit
  51. if exist, err := sess.IsTableExist(&repoUnit); err != nil {
  52. return fmt.Errorf("IsExist RepoUnit: %v", err)
  53. } else if exist {
  54. return nil
  55. }
  56. if err := sess.CreateTable(&repoUnit); err != nil {
  57. return fmt.Errorf("CreateTable RepoUnit: %v", err)
  58. }
  59. if err := sess.CreateUniques(&repoUnit); err != nil {
  60. return fmt.Errorf("CreateUniques RepoUnit: %v", err)
  61. }
  62. if err := sess.CreateIndexes(&repoUnit); err != nil {
  63. return fmt.Errorf("CreateIndexes RepoUnit: %v", err)
  64. }
  65. for _, repo := range repos {
  66. for i := 1; i <= 9; i++ {
  67. if (i == UnitTypeWiki || i == UnitTypeExternalWiki) && !repo.EnableWiki {
  68. continue
  69. }
  70. if i == UnitTypeExternalWiki && !repo.EnableExternalWiki {
  71. continue
  72. }
  73. if i == UnitTypePRs && !repo.EnablePulls {
  74. continue
  75. }
  76. if (i == UnitTypeIssues || i == UnitTypeExternalTracker) && !repo.EnableIssues {
  77. continue
  78. }
  79. if i == UnitTypeExternalTracker && !repo.EnableExternalTracker {
  80. continue
  81. }
  82. var config = make(map[string]string)
  83. switch i {
  84. case UnitTypeExternalTracker:
  85. config["ExternalTrackerURL"] = repo.ExternalTrackerURL
  86. config["ExternalTrackerFormat"] = repo.ExternalTrackerFormat
  87. if len(repo.ExternalTrackerStyle) == 0 {
  88. repo.ExternalTrackerStyle = markdown.IssueNameStyleNumeric
  89. }
  90. config["ExternalTrackerStyle"] = repo.ExternalTrackerStyle
  91. case UnitTypeExternalWiki:
  92. config["ExternalWikiURL"] = repo.ExternalWikiURL
  93. }
  94. if _, err = sess.Insert(&RepoUnit{
  95. RepoID: repo.ID,
  96. Type: i,
  97. Index: i,
  98. Config: config,
  99. }); err != nil {
  100. return fmt.Errorf("Insert repo unit: %v", err)
  101. }
  102. }
  103. }
  104. if err := sess.Commit(); err != nil {
  105. return err
  106. }
  107. return nil
  108. }