diff --git a/caddyfile/parse.go b/caddyfile/parse.go index 6d8f1588..6e208376 100644 --- a/caddyfile/parse.go +++ b/caddyfile/parse.go @@ -210,8 +210,16 @@ func (p *parser) doImport() error { return p.Err("Import takes only one argument (glob pattern or file)") } - // do glob - matches, err := filepath.Glob(importPattern) + // make path relative to Caddyfile rather than current working directory (issue #867) + // and then use glob to get list of matching filenames + var matches []string + relImportPattern, err := filepath.Rel(filepath.Dir(p.Dispenser.filename), importPattern) + if err == nil { + matches, err = filepath.Glob(relImportPattern) + } else { + matches, err = filepath.Glob(importPattern) + } + if err != nil { return p.Errf("Failed to use import pattern %s: %v", importPattern, err) } diff --git a/caddyfile/parse_test.go b/caddyfile/parse_test.go index 27d62615..8073b1b3 100644 --- a/caddyfile/parse_test.go +++ b/caddyfile/parse_test.go @@ -187,7 +187,7 @@ func TestParseOneAndImport(t *testing.T) { {`localhost dir1 arg1 - import testdata/import_test1.txt`, false, []string{ + import ../testdata/import_test1.txt`, false, []string{ "localhost", }, map[string]int{ "dir1": 2, @@ -195,16 +195,16 @@ func TestParseOneAndImport(t *testing.T) { "dir3": 1, }}, - {`import testdata/import_test2.txt`, false, []string{ + {`import ../testdata/import_test2.txt`, false, []string{ "host1", }, map[string]int{ "dir1": 1, "dir2": 2, }}, - {`import testdata/import_test1.txt testdata/import_test2.txt`, true, []string{}, map[string]int{}}, + {`import ../testdata/import_test1.txt ../testdata/import_test2.txt`, true, []string{}, map[string]int{}}, - {`import testdata/not_found.txt`, true, []string{}, map[string]int{}}, + {`import ../testdata/not_found.txt`, true, []string{}, map[string]int{}}, {`""`, false, []string{}, map[string]int{}}, @@ -394,6 +394,8 @@ func TestEnvironmentReplacement(t *testing.T) { func testParser(input string) parser { buf := strings.NewReader(input) - p := parser{Dispenser: NewDispenser("Test", buf)} + // use relative path to test that import paths are relative to + // the Caddyfile rather than the current working directory (issue #867) + p := parser{Dispenser: NewDispenser("../Test", buf)} return p }