mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 04:48:25 +00:00 
			
		
		
		
	* Add possibility to global disable repo units. * Add Default Repo Unit app.ini setting. * Hide units * Hide disabled repo units * Minor fixes * Indicate disabled units in team settings. Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: zeripath <art27@cantab.net>
		
			
				
	
	
		
			269 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			6.0 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 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
 | 
						|
)
 | 
						|
 | 
						|
// 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"
 | 
						|
	}
 | 
						|
	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,
 | 
						|
	}
 | 
						|
 | 
						|
	// DefaultRepoUnits contains the default unit types
 | 
						|
	DefaultRepoUnits = []UnitType{
 | 
						|
		UnitTypeCode,
 | 
						|
		UnitTypeIssues,
 | 
						|
		UnitTypePullRequests,
 | 
						|
		UnitTypeReleases,
 | 
						|
		UnitTypeWiki,
 | 
						|
	}
 | 
						|
 | 
						|
	// 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,
 | 
						|
	}
 | 
						|
 | 
						|
	// Units contains all the units
 | 
						|
	Units = map[UnitType]Unit{
 | 
						|
		UnitTypeCode:            UnitCode,
 | 
						|
		UnitTypeIssues:          UnitIssues,
 | 
						|
		UnitTypeExternalTracker: UnitExternalTracker,
 | 
						|
		UnitTypePullRequests:    UnitPullRequests,
 | 
						|
		UnitTypeReleases:        UnitReleases,
 | 
						|
		UnitTypeWiki:            UnitWiki,
 | 
						|
		UnitTypeExternalWiki:    UnitExternalWiki,
 | 
						|
	}
 | 
						|
)
 | 
						|
 | 
						|
// 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
 | 
						|
}
 |