Skip to content

Commit

Permalink
Fix config import relative path glob
Browse files Browse the repository at this point in the history
Previously, resolveImports would apply a glob filter if
the path contained any '*', or otherwise convert relative
paths to absolute. This meant that it was impossible to
specify globs with paths relative to the main config file.

This commit first resolves relative to absolute paths, then
applies the glob filter (if any). A test case is added to ensure
that this now works as expected.

Signed-off-by: Angelos Kolaitis <neoaggelos@gmail.com>
  • Loading branch information
neoaggelos committed Feb 17, 2024
1 parent 7c3aca7 commit 62e9535
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
12 changes: 6 additions & 6 deletions services/server/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,13 +251,18 @@ func loadConfigFile(path string) (*Config, error) {
}

// resolveImports resolves import strings list to absolute paths list:
// - If path contains *, glob pattern matching applied
// - Non abs path is relative to parent config file directory
// - If path contains *, glob pattern matching applied
// - Abs paths returned as is
func resolveImports(parent string, imports []string) ([]string, error) {
var out []string

for _, path := range imports {
path := filepath.Clean(path)
if !filepath.IsAbs(path) {
path = filepath.Join(filepath.Dir(parent), path)
}

if strings.Contains(path, "*") {
matches, err := filepath.Glob(path)
if err != nil {
Expand All @@ -266,11 +271,6 @@ func resolveImports(parent string, imports []string) ([]string, error) {

out = append(out, matches...)
} else {
path = filepath.Clean(path)
if !filepath.IsAbs(path) {
path = filepath.Join(filepath.Dir(parent), path)
}

out = append(out, path)
}
}
Expand Down
11 changes: 11 additions & 0 deletions services/server/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,17 @@ func TestResolveImports(t *testing.T) {
filepath.Join(tempDir, "test.toml"),
filepath.Join(tempDir, "current.toml"),
})

t.Run("GlobRelativePath", func(t *testing.T) {
imports, err := resolveImports(filepath.Join(tempDir, "root.toml"), []string{
"config_*.toml", // Glob files from working dir
})
assert.NoError(t, err)
assert.Equal(t, imports, []string{
filepath.Join(tempDir, "config_1.toml"),
filepath.Join(tempDir, "config_2.toml"),
})
})
}

func TestLoadSingleConfig(t *testing.T) {
Expand Down

0 comments on commit 62e9535

Please sign in to comment.