Some checks failed
Build and Release / Lint (push) Failing after 4m41s
Build and Release / Build Binaries (amd64, darwin) (push) Has been skipped
Build and Release / Build Binaries (amd64, linux) (push) Has been skipped
Build and Release / Build Binaries (amd64, windows) (push) Has been skipped
Build and Release / Build Binaries (arm64, darwin) (push) Has been skipped
Build and Release / Build Binaries (arm64, linux) (push) Has been skipped
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 3m12s
Build and Release / Create Release (push) Successful in 0s
Build and Release / Unit Tests (push) Successful in 3m58s
- Add full UI-based landing page configuration (Brand, Hero, Content, Social, Pricing, Footer, Theme) - Replace old templates with new designs: open-source-hero, minimalist-docs, saas-conversion, bold-marketing - Add pricing section support to all landing page templates - Add social links with icons to footer across all templates - Fix footer copyright to use configured value from settings - Add copyright symbol button in Footer & CTA settings - Fix ThemeStruct missing HideExploreUsers and HelpURL fields - Replace Gitea logo with GitCaddy icon in navbar, favicon, and assets - Add testimonials array with random selection to templates 🤖 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
130 lines
4.2 KiB
Go
130 lines
4.2 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package setting
|
|
|
|
import (
|
|
"strings"
|
|
"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 {
|
|
var ret strings.Builder
|
|
for _, app := range t {
|
|
ret.WriteString(app.DisplayName + " = " + app.OpenURL + "\n")
|
|
}
|
|
return ret.String()
|
|
}
|
|
|
|
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]
|
|
GitGuideRemoteName *config.Value[string]
|
|
}
|
|
|
|
type ThemeStruct struct {
|
|
DisableRegistration *config.Value[bool]
|
|
HideExploreUsers *config.Value[bool]
|
|
HelpURL *config.Value[string]
|
|
CustomSiteIconURL *config.Value[string]
|
|
CustomHomeLogoURL *config.Value[string]
|
|
CustomHomeHTML *config.Value[string]
|
|
APIHeaderURL *config.Value[string]
|
|
CustomHomeTitle *config.Value[string]
|
|
CustomHomeTagline *config.Value[string]
|
|
PinnedOrgDisplayFormat *config.Value[string]
|
|
ExploreOrgDisplayFormat *config.Value[string]
|
|
}
|
|
|
|
type ConfigStruct struct {
|
|
Picture *PictureStruct
|
|
Repository *RepositoryStruct
|
|
Theme *ThemeStruct
|
|
}
|
|
|
|
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"),
|
|
GitGuideRemoteName: config.ValueJSON[string]("repository.git-guide-remote-name").WithDefault("origin"),
|
|
},
|
|
Theme: &ThemeStruct{
|
|
DisableRegistration: config.ValueJSON[bool]("theme.disable_registration").WithFileConfig(config.CfgSecKey{Sec: "service", Key: "DISABLE_REGISTRATION"}),
|
|
HideExploreUsers: config.ValueJSON[bool]("theme.hide_explore_users").WithDefault(false),
|
|
HelpURL: config.ValueJSON[string]("theme.help_url").WithDefault(""),
|
|
CustomSiteIconURL: config.ValueJSON[string]("theme.custom_site_icon_url").WithDefault(""),
|
|
CustomHomeLogoURL: config.ValueJSON[string]("theme.custom_home_logo_url").WithDefault(""),
|
|
CustomHomeHTML: config.ValueJSON[string]("theme.custom_home_html").WithDefault(""),
|
|
APIHeaderURL: config.ValueJSON[string]("theme.api_header_url").WithDefault(""),
|
|
CustomHomeTitle: config.ValueJSON[string]("theme.custom_home_title").WithDefault(""),
|
|
CustomHomeTagline: config.ValueJSON[string]("theme.custom_home_tagline").WithDefault(""),
|
|
PinnedOrgDisplayFormat: config.ValueJSON[string]("theme.pinned_org_display_format").WithDefault("condensed"),
|
|
ExploreOrgDisplayFormat: config.ValueJSON[string]("theme.explore_org_display_format").WithDefault("list"),
|
|
},
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|