- // 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 models
-
- import (
- "fmt"
- "strings"
-
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/setting"
- )
-
- // UnitType is Unit's Type
- type UnitType int
-
- // Enumerate all the unit types
- const (
- UnitTypeCode UnitType = iota + 1 // 1 code
- UnitTypeIssues // 2 issues
- UnitTypePullRequests // 3 PRs
- UnitTypeReleases // 4 Releases
- UnitTypeWiki // 5 Wiki
- UnitTypeExternalWiki // 6 ExternalWiki
- UnitTypeExternalTracker // 7 ExternalTracker
- UnitTypeProjects // 8 Kanban board
- )
-
- // Value returns integer value for unit type
- func (u UnitType) Value() int {
- return int(u)
- }
-
- func (u UnitType) String() string {
- switch u {
- case UnitTypeCode:
- return "UnitTypeCode"
- case UnitTypeIssues:
- return "UnitTypeIssues"
- case UnitTypePullRequests:
- return "UnitTypePullRequests"
- case UnitTypeReleases:
- return "UnitTypeReleases"
- case UnitTypeWiki:
- return "UnitTypeWiki"
- case UnitTypeExternalWiki:
- return "UnitTypeExternalWiki"
- case UnitTypeExternalTracker:
- return "UnitTypeExternalTracker"
- case UnitTypeProjects:
- return "UnitTypeProjects"
- }
- return fmt.Sprintf("Unknown UnitType %d", u)
- }
-
- // ColorFormat provides a ColorFormatted version of this UnitType
- func (u UnitType) ColorFormat(s fmt.State) {
- log.ColorFprintf(s, "%d:%s",
- log.NewColoredIDValue(u),
- u)
- }
-
- var (
- // AllRepoUnitTypes contains all the unit types
- AllRepoUnitTypes = []UnitType{
- UnitTypeCode,
- UnitTypeIssues,
- UnitTypePullRequests,
- UnitTypeReleases,
- UnitTypeWiki,
- UnitTypeExternalWiki,
- UnitTypeExternalTracker,
- UnitTypeProjects,
- }
-
- // DefaultRepoUnits contains the default unit types
- DefaultRepoUnits = []UnitType{
- UnitTypeCode,
- UnitTypeIssues,
- UnitTypePullRequests,
- UnitTypeReleases,
- UnitTypeWiki,
- UnitTypeProjects,
- }
-
- // NotAllowedDefaultRepoUnits contains units that can't be default
- NotAllowedDefaultRepoUnits = []UnitType{
- UnitTypeExternalWiki,
- UnitTypeExternalTracker,
- }
-
- // MustRepoUnits contains the units could not be disabled currently
- MustRepoUnits = []UnitType{
- UnitTypeCode,
- UnitTypeReleases,
- }
-
- // DisabledRepoUnits contains the units that have been globally disabled
- DisabledRepoUnits = []UnitType{}
- )
-
- func loadUnitConfig() {
- setDefaultRepoUnits := FindUnitTypes(setting.Repository.DefaultRepoUnits...)
- // Default repo units set if setting is not empty
- if len(setDefaultRepoUnits) > 0 {
- // MustRepoUnits required as default
- DefaultRepoUnits = make([]UnitType, len(MustRepoUnits))
- copy(DefaultRepoUnits, MustRepoUnits)
- for _, defaultU := range setDefaultRepoUnits {
- if !defaultU.CanBeDefault() {
- log.Warn("Not allowed as default unit: %s", defaultU.String())
- continue
- }
- // MustRepoUnits already added
- if defaultU.CanDisable() {
- DefaultRepoUnits = append(DefaultRepoUnits, defaultU)
- }
- }
- }
-
- DisabledRepoUnits = FindUnitTypes(setting.Repository.DisabledRepoUnits...)
- // Check that must units are not disabled
- for i, disabledU := range DisabledRepoUnits {
- if !disabledU.CanDisable() {
- log.Warn("Not allowed to global disable unit %s", disabledU.String())
- DisabledRepoUnits = append(DisabledRepoUnits[:i], DisabledRepoUnits[i+1:]...)
- }
- }
- // Remove disabled units from default units
- for _, disabledU := range DisabledRepoUnits {
- for i, defaultU := range DefaultRepoUnits {
- if defaultU == disabledU {
- DefaultRepoUnits = append(DefaultRepoUnits[:i], DefaultRepoUnits[i+1:]...)
- }
- }
- }
- }
-
- // UnitGlobalDisabled checks if unit type is global disabled
- func (u UnitType) UnitGlobalDisabled() bool {
- for _, ud := range DisabledRepoUnits {
- if u == ud {
- return true
- }
- }
- return false
- }
-
- // CanDisable checks if this unit type can be disabled.
- func (u *UnitType) CanDisable() bool {
- for _, mu := range MustRepoUnits {
- if *u == mu {
- return false
- }
- }
- return true
- }
-
- // CanBeDefault checks if the unit type can be a default repo unit
- func (u *UnitType) CanBeDefault() bool {
- for _, nadU := range NotAllowedDefaultRepoUnits {
- if *u == nadU {
- return false
- }
- }
- return true
- }
-
- // Unit is a section of one repository
- type Unit struct {
- Type UnitType
- NameKey string
- URI string
- DescKey string
- Idx int
- }
-
- // CanDisable returns if this unit could be disabled.
- func (u *Unit) CanDisable() bool {
- return u.Type.CanDisable()
- }
-
- // IsLessThan compares order of two units
- func (u Unit) IsLessThan(unit Unit) bool {
- if (u.Type == UnitTypeExternalTracker || u.Type == UnitTypeExternalWiki) && unit.Type != UnitTypeExternalTracker && unit.Type != UnitTypeExternalWiki {
- return false
- }
- return u.Idx < unit.Idx
- }
-
- // Enumerate all the units
- var (
- UnitCode = Unit{
- UnitTypeCode,
- "repo.code",
- "/",
- "repo.code.desc",
- 0,
- }
-
- UnitIssues = Unit{
- UnitTypeIssues,
- "repo.issues",
- "/issues",
- "repo.issues.desc",
- 1,
- }
-
- UnitExternalTracker = Unit{
- UnitTypeExternalTracker,
- "repo.ext_issues",
- "/issues",
- "repo.ext_issues.desc",
- 1,
- }
-
- UnitPullRequests = Unit{
- UnitTypePullRequests,
- "repo.pulls",
- "/pulls",
- "repo.pulls.desc",
- 2,
- }
-
- UnitReleases = Unit{
- UnitTypeReleases,
- "repo.releases",
- "/releases",
- "repo.releases.desc",
- 3,
- }
-
- UnitWiki = Unit{
- UnitTypeWiki,
- "repo.wiki",
- "/wiki",
- "repo.wiki.desc",
- 4,
- }
-
- UnitExternalWiki = Unit{
- UnitTypeExternalWiki,
- "repo.ext_wiki",
- "/wiki",
- "repo.ext_wiki.desc",
- 4,
- }
-
- UnitProjects = Unit{
- UnitTypeProjects,
- "repo.projects",
- "/projects",
- "repo.projects.desc",
- 5,
- }
-
- // Units contains all the units
- Units = map[UnitType]Unit{
- UnitTypeCode: UnitCode,
- UnitTypeIssues: UnitIssues,
- UnitTypeExternalTracker: UnitExternalTracker,
- UnitTypePullRequests: UnitPullRequests,
- UnitTypeReleases: UnitReleases,
- UnitTypeWiki: UnitWiki,
- UnitTypeExternalWiki: UnitExternalWiki,
- UnitTypeProjects: UnitProjects,
- }
- )
-
- // FindUnitTypes give the unit key name and return unit
- func FindUnitTypes(nameKeys ...string) (res []UnitType) {
- for _, key := range nameKeys {
- for t, u := range Units {
- if strings.EqualFold(key, u.NameKey) {
- res = append(res, t)
- break
- }
- }
- }
- return
- }
|