Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
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.
283 lines
6.0 KiB
283 lines
6.0 KiB
// 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 unit |
|
|
|
import ( |
|
"fmt" |
|
"strings" |
|
|
|
"code.gitea.io/gitea/modules/log" |
|
"code.gitea.io/gitea/modules/setting" |
|
) |
|
|
|
// Type is Unit's Type |
|
type Type int |
|
|
|
// Enumerate all the unit types |
|
const ( |
|
TypeCode Type = iota + 1 // 1 code |
|
TypeIssues // 2 issues |
|
TypePullRequests // 3 PRs |
|
TypeReleases // 4 Releases |
|
TypeWiki // 5 Wiki |
|
TypeExternalWiki // 6 ExternalWiki |
|
TypeExternalTracker // 7 ExternalTracker |
|
TypeProjects // 8 Kanban board |
|
) |
|
|
|
// Value returns integer value for unit type |
|
func (u Type) Value() int { |
|
return int(u) |
|
} |
|
|
|
func (u Type) String() string { |
|
switch u { |
|
case TypeCode: |
|
return "TypeCode" |
|
case TypeIssues: |
|
return "TypeIssues" |
|
case TypePullRequests: |
|
return "TypePullRequests" |
|
case TypeReleases: |
|
return "TypeReleases" |
|
case TypeWiki: |
|
return "TypeWiki" |
|
case TypeExternalWiki: |
|
return "TypeExternalWiki" |
|
case TypeExternalTracker: |
|
return "TypeExternalTracker" |
|
case TypeProjects: |
|
return "TypeProjects" |
|
} |
|
return fmt.Sprintf("Unknown Type %d", u) |
|
} |
|
|
|
// ColorFormat provides a ColorFormatted version of this Type |
|
func (u Type) ColorFormat(s fmt.State) { |
|
log.ColorFprintf(s, "%d:%s", |
|
log.NewColoredIDValue(u), |
|
u) |
|
} |
|
|
|
var ( |
|
// AllRepoUnitTypes contains all the unit types |
|
AllRepoUnitTypes = []Type{ |
|
TypeCode, |
|
TypeIssues, |
|
TypePullRequests, |
|
TypeReleases, |
|
TypeWiki, |
|
TypeExternalWiki, |
|
TypeExternalTracker, |
|
TypeProjects, |
|
} |
|
|
|
// DefaultRepoUnits contains the default unit types |
|
DefaultRepoUnits = []Type{ |
|
TypeCode, |
|
TypeIssues, |
|
TypePullRequests, |
|
TypeReleases, |
|
TypeWiki, |
|
TypeProjects, |
|
} |
|
|
|
// NotAllowedDefaultRepoUnits contains units that can't be default |
|
NotAllowedDefaultRepoUnits = []Type{ |
|
TypeExternalWiki, |
|
TypeExternalTracker, |
|
} |
|
|
|
// MustRepoUnits contains the units could not be disabled currently |
|
MustRepoUnits = []Type{ |
|
TypeCode, |
|
TypeReleases, |
|
} |
|
|
|
// DisabledRepoUnits contains the units that have been globally disabled |
|
DisabledRepoUnits = []Type{} |
|
) |
|
|
|
// LoadUnitConfig load units from settings |
|
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([]Type, 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 Type) UnitGlobalDisabled() bool { |
|
for _, ud := range DisabledRepoUnits { |
|
if u == ud { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
// CanDisable checks if this unit type can be disabled. |
|
func (u *Type) 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 *Type) CanBeDefault() bool { |
|
for _, nadU := range NotAllowedDefaultRepoUnits { |
|
if *u == nadU { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
// Unit is a section of one repository |
|
type Unit struct { |
|
Type Type |
|
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 == TypeExternalTracker || u.Type == TypeExternalWiki) && unit.Type != TypeExternalTracker && unit.Type != TypeExternalWiki { |
|
return false |
|
} |
|
return u.Idx < unit.Idx |
|
} |
|
|
|
// Enumerate all the units |
|
var ( |
|
UnitCode = Unit{ |
|
TypeCode, |
|
"repo.code", |
|
"/", |
|
"repo.code.desc", |
|
0, |
|
} |
|
|
|
UnitIssues = Unit{ |
|
TypeIssues, |
|
"repo.issues", |
|
"/issues", |
|
"repo.issues.desc", |
|
1, |
|
} |
|
|
|
UnitExternalTracker = Unit{ |
|
TypeExternalTracker, |
|
"repo.ext_issues", |
|
"/issues", |
|
"repo.ext_issues.desc", |
|
1, |
|
} |
|
|
|
UnitPullRequests = Unit{ |
|
TypePullRequests, |
|
"repo.pulls", |
|
"/pulls", |
|
"repo.pulls.desc", |
|
2, |
|
} |
|
|
|
UnitReleases = Unit{ |
|
TypeReleases, |
|
"repo.releases", |
|
"/releases", |
|
"repo.releases.desc", |
|
3, |
|
} |
|
|
|
UnitWiki = Unit{ |
|
TypeWiki, |
|
"repo.wiki", |
|
"/wiki", |
|
"repo.wiki.desc", |
|
4, |
|
} |
|
|
|
UnitExternalWiki = Unit{ |
|
TypeExternalWiki, |
|
"repo.ext_wiki", |
|
"/wiki", |
|
"repo.ext_wiki.desc", |
|
4, |
|
} |
|
|
|
UnitProjects = Unit{ |
|
TypeProjects, |
|
"repo.projects", |
|
"/projects", |
|
"repo.projects.desc", |
|
5, |
|
} |
|
|
|
// Units contains all the units |
|
Units = map[Type]Unit{ |
|
TypeCode: UnitCode, |
|
TypeIssues: UnitIssues, |
|
TypeExternalTracker: UnitExternalTracker, |
|
TypePullRequests: UnitPullRequests, |
|
TypeReleases: UnitReleases, |
|
TypeWiki: UnitWiki, |
|
TypeExternalWiki: UnitExternalWiki, |
|
TypeProjects: UnitProjects, |
|
} |
|
) |
|
|
|
// FindUnitTypes give the unit key name and return unit |
|
func FindUnitTypes(nameKeys ...string) (res []Type) { |
|
for _, key := range nameKeys { |
|
for t, u := range Units { |
|
if strings.EqualFold(key, u.NameKey) { |
|
res = append(res, t) |
|
break |
|
} |
|
} |
|
} |
|
return |
|
}
|
|
|