mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 19:14:03 +01:00
123 lines
3.4 KiB
Go
123 lines
3.4 KiB
Go
// 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"
|
|
|
|
"xorm.io/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()
|
|
}
|