mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 23:54:25 +01:00 
			
		
		
		
	Users could customize the "clone" menu with their own application URLs on the admin panel. Replace #22378 Close #21121 Close #22149
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
package setting
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
 | 
						|
	"code.gitea.io/gitea/modules/log"
 | 
						|
	"code.gitea.io/gitea/modules/setting/config"
 | 
						|
)
 | 
						|
 | 
						|
type PictureStruct struct {
 | 
						|
	DisableGravatar       *config.Value[bool]
 | 
						|
	EnableFederatedAvatar *config.Value[bool]
 | 
						|
}
 | 
						|
 | 
						|
type OpenWithEditorApp struct {
 | 
						|
	DisplayName string
 | 
						|
	OpenURL     string
 | 
						|
}
 | 
						|
 | 
						|
type OpenWithEditorAppsType []OpenWithEditorApp
 | 
						|
 | 
						|
func (t OpenWithEditorAppsType) ToTextareaString() string {
 | 
						|
	ret := ""
 | 
						|
	for _, app := range t {
 | 
						|
		ret += app.DisplayName + " = " + app.OpenURL + "\n"
 | 
						|
	}
 | 
						|
	return ret
 | 
						|
}
 | 
						|
 | 
						|
func DefaultOpenWithEditorApps() OpenWithEditorAppsType {
 | 
						|
	return OpenWithEditorAppsType{
 | 
						|
		{
 | 
						|
			DisplayName: "VS Code",
 | 
						|
			OpenURL:     "vscode://vscode.git/clone?url={url}",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			DisplayName: "VSCodium",
 | 
						|
			OpenURL:     "vscodium://vscode.git/clone?url={url}",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			DisplayName: "Intellij IDEA",
 | 
						|
			OpenURL:     "jetbrains://idea/checkout/git?idea.required.plugins.id=Git4Idea&checkout.repo={url}",
 | 
						|
		},
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type RepositoryStruct struct {
 | 
						|
	OpenWithEditorApps *config.Value[OpenWithEditorAppsType]
 | 
						|
}
 | 
						|
 | 
						|
type ConfigStruct struct {
 | 
						|
	Picture    *PictureStruct
 | 
						|
	Repository *RepositoryStruct
 | 
						|
}
 | 
						|
 | 
						|
var (
 | 
						|
	defaultConfig     *ConfigStruct
 | 
						|
	defaultConfigOnce sync.Once
 | 
						|
)
 | 
						|
 | 
						|
func initDefaultConfig() {
 | 
						|
	config.SetCfgSecKeyGetter(&cfgSecKeyGetter{})
 | 
						|
	defaultConfig = &ConfigStruct{
 | 
						|
		Picture: &PictureStruct{
 | 
						|
			DisableGravatar:       config.ValueJSON[bool]("picture.disable_gravatar").WithFileConfig(config.CfgSecKey{Sec: "picture", Key: "DISABLE_GRAVATAR"}),
 | 
						|
			EnableFederatedAvatar: config.ValueJSON[bool]("picture.enable_federated_avatar").WithFileConfig(config.CfgSecKey{Sec: "picture", Key: "ENABLE_FEDERATED_AVATAR"}),
 | 
						|
		},
 | 
						|
		Repository: &RepositoryStruct{
 | 
						|
			OpenWithEditorApps: config.ValueJSON[OpenWithEditorAppsType]("repository.open-with.editor-apps"),
 | 
						|
		},
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func Config() *ConfigStruct {
 | 
						|
	defaultConfigOnce.Do(initDefaultConfig)
 | 
						|
	return defaultConfig
 | 
						|
}
 | 
						|
 | 
						|
type cfgSecKeyGetter struct{}
 | 
						|
 | 
						|
func (c cfgSecKeyGetter) GetValue(sec, key string) (v string, has bool) {
 | 
						|
	if key == "" {
 | 
						|
		return "", false
 | 
						|
	}
 | 
						|
	cfgSec, err := CfgProvider.GetSection(sec)
 | 
						|
	if err != nil {
 | 
						|
		log.Error("Unable to get config section: %q", sec)
 | 
						|
		return "", false
 | 
						|
	}
 | 
						|
	cfgKey := ConfigSectionKey(cfgSec, key)
 | 
						|
	if cfgKey == nil {
 | 
						|
		return "", false
 | 
						|
	}
 | 
						|
	return cfgKey.Value(), true
 | 
						|
}
 |