From 2125ae5f99989949f917eed8a1d961b76a23dbba Mon Sep 17 00:00:00 2001
From: Pedro Nasser <pedronasser@gmail.com>
Date: Wed, 13 Jul 2016 13:58:42 -0300
Subject: [PATCH] import should get absolute path before glob (#929)

* import should get absolute path before glob

* fix test: import should get absolute path before glob

* try to fix test on windows

* use complete path as the dispenser filename

* fix caddyfile test
---
 caddy.go                |  3 +--
 caddyfile/parse.go      | 13 +++++++------
 caddyfile/parse_test.go | 12 +++++-------
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/caddy.go b/caddy.go
index d67719d97..d245dd04c 100644
--- a/caddy.go
+++ b/caddy.go
@@ -22,7 +22,6 @@ import (
 	"net"
 	"os"
 	"os/exec"
-	"path"
 	"runtime"
 	"strconv"
 	"strings"
@@ -399,7 +398,7 @@ func startWithListenerFds(cdyfile Input, inst *Instance, restartFds map[string]r
 
 	inst.caddyfileInput = cdyfile
 
-	sblocks, err := loadServerBlocks(stypeName, path.Base(cdyfile.Path()), bytes.NewReader(cdyfile.Body()))
+	sblocks, err := loadServerBlocks(stypeName, cdyfile.Path(), bytes.NewReader(cdyfile.Body()))
 	if err != nil {
 		return err
 	}
diff --git a/caddyfile/parse.go b/caddyfile/parse.go
index 6e2083761..44f8d9e1b 100644
--- a/caddyfile/parse.go
+++ b/caddyfile/parse.go
@@ -212,14 +212,15 @@ func (p *parser) doImport() error {
 
 	// 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)
+	absFile, err := filepath.Abs(p.Dispenser.filename)
+	if err != nil {
+		return p.Errf("Failed to get absolute path of file: %s", p.Dispenser.filename)
 	}
 
+	var matches []string
+	relImportPattern := filepath.Join(filepath.Dir(absFile), importPattern)
+	matches, err = filepath.Glob(relImportPattern)
+
 	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 8073b1b38..8f296c619 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,8 +394,6 @@ func TestEnvironmentReplacement(t *testing.T) {
 
 func testParser(input string) parser {
 	buf := strings.NewReader(input)
-	// 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)}
+	p := parser{Dispenser: NewDispenser("Caddyfile", buf)}
 	return p
 }