[BRANDING] parse FORGEJO__* in the container environment

(cherry picked from commit b075991747)
(cherry picked from commit da3f76228e)
(cherry picked from commit 20d196e74f)
(cherry picked from commit 0bf8b1824e)
(cherry picked from commit 655bb770a7)
(cherry picked from commit d69d5c2c46)
(cherry picked from commit 00b55e5a53)
(cherry picked from commit 456121fd8a)
(cherry picked from commit 9716a158e4)
(cherry picked from commit 7d60a6f511)
(cherry picked from commit d32a6d9437)
(cherry picked from commit ee1de38527)
(cherry picked from commit 54e7799d13)
(cherry picked from commit 4f04da7ab7)
(cherry picked from commit 0d39a0a520)
(cherry picked from commit 7d8ae8279f)
(cherry picked from commit 76b6770b73)
(cherry picked from commit 9bc0d96064)

Conflicts:
	contrib/environment-to-ini/environment-to-ini.go
	https://codeberg.org/forgejo/forgejo/pulls/1769
(cherry picked from commit e21bf9b144)
This commit is contained in:
Earl Warren 2023-07-10 23:17:39 +02:00
parent 9fd194fdcf
commit 96e501c5f0
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
3 changed files with 23 additions and 14 deletions

View file

@ -16,15 +16,15 @@ func main() {
app := cli.NewApp() app := cli.NewApp()
app.Name = "environment-to-ini" app.Name = "environment-to-ini"
app.Usage = "Use provided environment to update configuration ini" app.Usage = "Use provided environment to update configuration ini"
app.Description = `As a helper to allow docker users to update the gitea configuration app.Description = `As a helper to allow docker users to update the forgejo configuration
through the environment, this command allows environment variables to through the environment, this command allows environment variables to
be mapped to values in the ini. be mapped to values in the ini.
Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME" Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
will be mapped to the ini section "[section_name]" and the key will be mapped to the ini section "[section_name]" and the key
"KEY_NAME" with the value as provided. "KEY_NAME" with the value as provided.
Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME__FILE" Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME__FILE"
will be mapped to the ini section "[section_name]" and the key will be mapped to the ini section "[section_name]" and the key
"KEY_NAME" with the value loaded from the specified file. "KEY_NAME" with the value loaded from the specified file.
@ -42,8 +42,8 @@ func main() {
... ...
""" """
You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false" You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
on the configuration cheat sheet.` on the configuration cheat sheet.`
app.Flags = []cli.Flag{ app.Flags = []cli.Flag{
&cli.StringFlag{ &cli.StringFlag{
@ -62,7 +62,7 @@ func main() {
Name: "work-path", Name: "work-path",
Aliases: []string{"w"}, Aliases: []string{"w"},
Value: setting.AppWorkPath, Value: setting.AppWorkPath,
Usage: "Set the gitea working path", Usage: "Set the forgejo working path",
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "out", Name: "out",

View file

@ -14,7 +14,7 @@ import (
) )
const ( const (
EnvConfigKeyPrefixGitea = "GITEA__" EnvConfigKeyPrefixGitea = "^(FORGEJO|GITEA)__"
EnvConfigKeySuffixFile = "__FILE" EnvConfigKeySuffixFile = "__FILE"
) )
@ -97,19 +97,21 @@ func decodeEnvSectionKey(encoded string) (ok bool, section, key string) {
// decodeEnvironmentKey decode the environment key to section and key // decodeEnvironmentKey decode the environment key to section and key
// The environment key is in the form of GITEA__SECTION__KEY or GITEA__SECTION__KEY__FILE // The environment key is in the form of GITEA__SECTION__KEY or GITEA__SECTION__KEY__FILE
func decodeEnvironmentKey(prefixGitea, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) { func decodeEnvironmentKey(prefixRegexp *regexp.Regexp, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) {
if !strings.HasPrefix(envKey, prefixGitea) {
return false, "", "", false
}
if strings.HasSuffix(envKey, suffixFile) { if strings.HasSuffix(envKey, suffixFile) {
useFileValue = true useFileValue = true
envKey = envKey[:len(envKey)-len(suffixFile)] envKey = envKey[:len(envKey)-len(suffixFile)]
} }
ok, section, key = decodeEnvSectionKey(envKey[len(prefixGitea):]) loc := prefixRegexp.FindStringIndex(envKey)
if loc == nil {
return false, "", "", false
}
ok, section, key = decodeEnvSectionKey(envKey[loc[1]:])
return ok, section, key, useFileValue return ok, section, key, useFileValue
} }
func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) { func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
prefixRegexp := regexp.MustCompile(EnvConfigKeyPrefixGitea)
for _, kv := range envs { for _, kv := range envs {
idx := strings.IndexByte(kv, '=') idx := strings.IndexByte(kv, '=')
if idx < 0 { if idx < 0 {
@ -119,7 +121,7 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
// parse the environment variable to config section name and key name // parse the environment variable to config section name and key name
envKey := kv[:idx] envKey := kv[:idx]
envValue := kv[idx+1:] envValue := kv[idx+1:]
ok, sectionName, keyName, useFileValue := decodeEnvironmentKey(EnvConfigKeyPrefixGitea, EnvConfigKeySuffixFile, envKey) ok, sectionName, keyName, useFileValue := decodeEnvironmentKey(prefixRegexp, EnvConfigKeySuffixFile, envKey)
if !ok { if !ok {
continue continue
} }

View file

@ -5,6 +5,7 @@ package setting
import ( import (
"os" "os"
"regexp"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -33,7 +34,7 @@ func TestDecodeEnvSectionKey(t *testing.T) {
} }
func TestDecodeEnvironmentKey(t *testing.T) { func TestDecodeEnvironmentKey(t *testing.T) {
prefix := "GITEA__" prefix := regexp.MustCompile(EnvConfigKeyPrefixGitea)
suffix := "__FILE" suffix := "__FILE"
ok, section, key, file := decodeEnvironmentKey(prefix, suffix, "SEC__KEY") ok, section, key, file := decodeEnvironmentKey(prefix, suffix, "SEC__KEY")
@ -60,6 +61,12 @@ func TestDecodeEnvironmentKey(t *testing.T) {
assert.Equal(t, "KEY", key) assert.Equal(t, "KEY", key)
assert.False(t, file) assert.False(t, file)
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "FORGEJO__SEC__KEY")
assert.True(t, ok)
assert.Equal(t, "sec", section)
assert.Equal(t, "KEY", key)
assert.False(t, file)
// with "__FILE" suffix, it doesn't support to write "[sec].FILE" to config (no such key FILE is used in Gitea) // with "__FILE" suffix, it doesn't support to write "[sec].FILE" to config (no such key FILE is used in Gitea)
// but it could be fixed in the future by adding a new suffix like "__VALUE" (no such key VALUE is used in Gitea either) // but it could be fixed in the future by adding a new suffix like "__VALUE" (no such key VALUE is used in Gitea either)
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__FILE") ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__FILE")