Skip to content

Commit f670840

Browse files
committed
Ensure that legacy formats within customPath still override builtins
Signed-off-by: Andrew Thornton <[email protected]>
1 parent 5f19f54 commit f670840

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

modules/label/parser.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,16 @@ func (err ErrTemplateLoad) Error() string {
3737
// then parses and returns a list of name-color pairs and optionally description.
3838
func GetTemplateFile(name string) ([]*Label, error) {
3939
// Always check if <name>.yaml or <name>.yml exists and prefer those
40-
data, err := options.Labels(name + ".yaml")
41-
if err == nil && len(data) > 0 {
42-
return parseYamlFormat(name+".yaml", data)
40+
data, extension, err := options.Labels(name, ".yaml", ".yml", "")
41+
if err != nil {
42+
return nil, ErrTemplateLoad{name, fmt.Errorf("GetRepoInitFile: %w", err)}
4343
}
4444

45-
data, err = options.Labels(name + ".yml")
46-
if err == nil && len(data) > 0 {
45+
// because we only handle .yaml/.yml we can simply test if the extension is not empty
46+
if len(extension) > 0 && len(data) > 0 {
4747
return parseYamlFormat(name+".yml", data)
4848
}
4949

50-
data, err = options.Labels(name)
51-
if err != nil {
52-
return nil, ErrTemplateLoad{name, fmt.Errorf("GetRepoInitFile: %w", err)}
53-
}
54-
5550
return parseLegacyFormat(name, data)
5651
}
5752

modules/options/base.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ func License(name string) ([]byte, error) {
3737
}
3838

3939
// Labels reads the content of a specific labels from static/bindata or custom path.
40-
func Labels(name string) ([]byte, error) {
41-
return fileFromOptionsDir("label", name)
40+
func Labels(name string, exts ...string) ([]byte, string, error) {
41+
return fileFromOptionsDirExtensions([]string{"label", name}, exts...)
4242
}
4343

4444
// WalkLocales reads the content of a specific locale
@@ -132,3 +132,20 @@ func readLocalFile(baseDirs []string, subDir string, elems ...string) ([]byte, e
132132
}
133133
return nil, os.ErrNotExist
134134
}
135+
136+
func readLocalFileExtensions(baseDirs []string, subDir string, elems []string, extensions ...string) ([]byte, string, error) {
137+
if len(extensions) == 0 {
138+
extensions = append(extensions, "")
139+
}
140+
for _, localPath := range joinLocalPaths(baseDirs, subDir, elems...) {
141+
for _, extension := range extensions {
142+
data, err := os.ReadFile(localPath + extension)
143+
if err == nil {
144+
return data, extension, nil
145+
} else if !os.IsNotExist(err) {
146+
log.Error("Unable to read file %q. Error: %v", localPath, err)
147+
}
148+
}
149+
}
150+
return nil, "", os.ErrNotExist
151+
}

modules/options/dynamic.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ func fileFromOptionsDir(elems ...string) ([]byte, error) {
2828
return readLocalFile([]string{setting.CustomPath, setting.StaticRootPath}, "options", elems...)
2929
}
3030

31+
// fileFromOptionsDirExtensions is a helper to read files from custom or static path.
32+
func fileFromOptionsDirExtensions(elems []string, extensions ...string) ([]byte, string, error) {
33+
return readLocalFileExtensions([]string{setting.CustomPath, setting.StaticRootPath}, "options", elems, extensions...)
34+
}
35+
3136
// IsDynamic will return false when using embedded data (-tags bindata)
3237
func IsDynamic() bool {
3338
return true

modules/options/static.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package options
88
import (
99
"fmt"
1010
"io"
11+
"os"
1112

1213
"code.gitea.io/gitea/modules/setting"
1314
"code.gitea.io/gitea/modules/util"
@@ -66,6 +67,30 @@ func fileFromOptionsDir(elems ...string) ([]byte, error) {
6667
return io.ReadAll(f)
6768
}
6869

70+
// fileFromOptionsDir is a helper to read files from custom path or bindata.
71+
func fileFromOptionsDirExtensions(elem string, extensions ...string) ([]byte, error) {
72+
// only try custom dir, no static dir
73+
if data, err := readLocalFileExtensions([]string{setting.CustomPath}, "options", elem, extensions...); err == nil {
74+
return data, nil
75+
}
76+
77+
if len(extensions) == 0 {
78+
extensions = append(extensions, "")
79+
}
80+
81+
for _, extension := range extensions {
82+
f, err := Assets.Open(util.PathJoinRelX(elems...))
83+
if err != nil {
84+
if os.IsNotExist(err) {
85+
continue
86+
}
87+
return nil, err
88+
}
89+
defer f.Close()
90+
return io.ReadAll(f)
91+
}
92+
}
93+
6994
func Asset(name string) ([]byte, error) {
7095
f, err := Assets.Open("/" + name)
7196
if err != nil {

0 commit comments

Comments
 (0)