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.

v16.go 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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/markup"
  9. "xorm.io/xorm"
  10. )
  11. // Enumerate all the unit types
  12. const (
  13. V16UnitTypeCode = iota + 1 // 1 code
  14. V16UnitTypeIssues // 2 issues
  15. V16UnitTypePRs // 3 PRs
  16. V16UnitTypeCommits // 4 Commits
  17. V16UnitTypeReleases // 5 Releases
  18. V16UnitTypeWiki // 6 Wiki
  19. V16UnitTypeSettings // 7 Settings
  20. V16UnitTypeExternalWiki // 8 ExternalWiki
  21. V16UnitTypeExternalTracker // 9 ExternalTracker
  22. )
  23. func addUnitsToTables(x *xorm.Engine) error {
  24. // RepoUnit describes all units of a repository
  25. type RepoUnit struct {
  26. ID int64
  27. RepoID int64 `xorm:"INDEX(s)"`
  28. Type int `xorm:"INDEX(s)"`
  29. Index int
  30. Config map[string]interface{} `xorm:"JSON"`
  31. CreatedUnix int64 `xorm:"INDEX CREATED"`
  32. Created time.Time `xorm:"-"`
  33. }
  34. // Repo describes a repository
  35. type Repo struct {
  36. ID int64
  37. EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool
  38. ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string
  39. }
  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 == V16UnitTypeWiki || i == V16UnitTypeExternalWiki) && !repo.EnableWiki {
  68. continue
  69. }
  70. if i == V16UnitTypeExternalWiki && !repo.EnableExternalWiki {
  71. continue
  72. }
  73. if i == V16UnitTypePRs && !repo.EnablePulls {
  74. continue
  75. }
  76. if (i == V16UnitTypeIssues || i == V16UnitTypeExternalTracker) && !repo.EnableIssues {
  77. continue
  78. }
  79. if i == V16UnitTypeExternalTracker && !repo.EnableExternalTracker {
  80. continue
  81. }
  82. var config = make(map[string]interface{})
  83. switch i {
  84. case V16UnitTypeExternalTracker:
  85. config["ExternalTrackerURL"] = repo.ExternalTrackerURL
  86. config["ExternalTrackerFormat"] = repo.ExternalTrackerFormat
  87. if len(repo.ExternalTrackerStyle) == 0 {
  88. repo.ExternalTrackerStyle = markup.IssueNameStyleNumeric
  89. }
  90. config["ExternalTrackerStyle"] = repo.ExternalTrackerStyle
  91. case V16UnitTypeExternalWiki:
  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. return sess.Commit()
  105. }