mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-05-25 11:22:16 +00:00
Add setting to set default and global disabled repository units. (#8788)
* 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>
This commit is contained in:
parent
36943e56d6
commit
3c07d03c03
14 changed files with 315 additions and 140 deletions
|
@ -128,6 +128,7 @@ func loadRepoConfig() {
|
|||
// NewRepoContext creates a new repository context
|
||||
func NewRepoContext() {
|
||||
loadRepoConfig()
|
||||
loadUnitConfig()
|
||||
|
||||
RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp"))
|
||||
}
|
||||
|
@ -393,6 +394,7 @@ func (repo *Repository) getUnits(e Engine) (err error) {
|
|||
}
|
||||
|
||||
repo.Units, err = getUnitsByRepoID(e, repo.ID)
|
||||
log.Trace("repo.Units: %-+v", repo.Units)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -1442,14 +1444,19 @@ func UpdateRepositoryUpdatedTime(repoID int64, updateTime time.Time) error {
|
|||
}
|
||||
|
||||
// UpdateRepositoryUnits updates a repository's units
|
||||
func UpdateRepositoryUnits(repo *Repository, units []RepoUnit) (err error) {
|
||||
func UpdateRepositoryUnits(repo *Repository, units []RepoUnit, deleteUnitTypes []UnitType) (err error) {
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Where("repo_id = ?", repo.ID).Delete(new(RepoUnit)); err != nil {
|
||||
// Delete existing settings of units before adding again
|
||||
for _, u := range units {
|
||||
deleteUnitTypes = append(deleteUnitTypes, u.Type)
|
||||
}
|
||||
|
||||
if _, err = sess.Where("repo_id = ?", repo.ID).In("type", deleteUnitTypes).Delete(new(RepoUnit)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -170,5 +170,16 @@ func (r *RepoUnit) ExternalTrackerConfig() *ExternalTrackerConfig {
|
|||
}
|
||||
|
||||
func getUnitsByRepoID(e Engine, repoID int64) (units []*RepoUnit, err error) {
|
||||
return units, e.Where("repo_id = ?", repoID).Find(&units)
|
||||
var tmpUnits []*RepoUnit
|
||||
if err := e.Where("repo_id = ?", repoID).Find(&tmpUnits); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, u := range tmpUnits {
|
||||
if !u.Type.UnitGlobalDisabled() {
|
||||
units = append(units, u)
|
||||
}
|
||||
}
|
||||
|
||||
return units, nil
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
)
|
||||
|
||||
// UnitType is Unit's Type
|
||||
|
@ -78,13 +79,89 @@ var (
|
|||
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
|
||||
|
@ -96,7 +173,7 @@ type Unit struct {
|
|||
|
||||
// CanDisable returns if this unit could be disabled.
|
||||
func (u *Unit) CanDisable() bool {
|
||||
return true
|
||||
return u.Type.CanDisable()
|
||||
}
|
||||
|
||||
// IsLessThan compares order of two units
|
||||
|
|
|
@ -622,6 +622,7 @@ func (u *User) GetRepositories(page, pageSize int) (err error) {
|
|||
}
|
||||
|
||||
// GetRepositoryIDs returns repositories IDs where user owned and has unittypes
|
||||
// Caller shall check that units is not globally disabled
|
||||
func (u *User) GetRepositoryIDs(units ...UnitType) ([]int64, error) {
|
||||
var ids []int64
|
||||
|
||||
|
@ -636,6 +637,7 @@ func (u *User) GetRepositoryIDs(units ...UnitType) ([]int64, error) {
|
|||
}
|
||||
|
||||
// GetOrgRepositoryIDs returns repositories IDs where user's team owned and has unittypes
|
||||
// Caller shall check that units is not globally disabled
|
||||
func (u *User) GetOrgRepositoryIDs(units ...UnitType) ([]int64, error) {
|
||||
var ids []int64
|
||||
|
||||
|
@ -656,6 +658,7 @@ func (u *User) GetOrgRepositoryIDs(units ...UnitType) ([]int64, error) {
|
|||
}
|
||||
|
||||
// GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations
|
||||
// Caller shall check that units is not globally disabled
|
||||
func (u *User) GetAccessRepoIDs(units ...UnitType) ([]int64, error) {
|
||||
ids, err := u.GetRepositoryIDs(units...)
|
||||
if err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue