From 0fdcf2c01eb69a4cfcfb4b9abb42571d8e5b529b Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 6 Jul 2017 11:33:32 -0400 Subject: [PATCH 1/2] properly cleanup and print correct error messages Some Meta tests were not cleaning up their temp directories. The process test wasn't printing the correct arguments in the error messages. --- command/meta_test.go | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/command/meta_test.go b/command/meta_test.go index 51f3b49290..63ab0fb28b 100644 --- a/command/meta_test.go +++ b/command/meta_test.go @@ -138,20 +138,12 @@ func TestMetaInputMode_defaultVars(t *testing.T) { // Create a temporary directory for our cwd d := tempDir(t) - if err := os.MkdirAll(d, 0755); err != nil { - t.Fatalf("err: %s", err) - } - cwd, err := os.Getwd() - if err != nil { - t.Fatalf("err: %s", err) - } - if err := os.Chdir(d); err != nil { - t.Fatalf("err: %s", err) - } - defer os.Chdir(cwd) + os.MkdirAll(d, 0755) + defer os.RemoveAll(d) + defer testChdir(t, d)() // Create the default vars file - err = ioutil.WriteFile( + err := ioutil.WriteFile( filepath.Join(d, DefaultVarsFilename), []byte(""), 0644) @@ -326,21 +318,13 @@ func TestMeta_process(t *testing.T) { // Create a temporary directory for our cwd d := tempDir(t) - if err := os.MkdirAll(d, 0755); err != nil { - t.Fatalf("err: %s", err) - } - cwd, err := os.Getwd() - if err != nil { - t.Fatalf("err: %s", err) - } - if err := os.Chdir(d); err != nil { - t.Fatalf("err: %s", err) - } - defer os.Chdir(cwd) + os.MkdirAll(d, 0755) + defer os.RemoveAll(d) + defer testChdir(t, d)() // Create two vars files defaultVarsfile := "terraform.tfvars" - err = ioutil.WriteFile( + err := ioutil.WriteFile( filepath.Join(d, defaultVarsfile), []byte(""), 0644) @@ -388,18 +372,18 @@ func TestMeta_process(t *testing.T) { t.Fatalf("expected %q, got %q", "-var-file-default", args[0]) } if args[1] != defaultVarsfile { - t.Fatalf("expected %q, got %q", defaultVarsfile, args[3]) + t.Fatalf("expected %q, got %q", defaultVarsfile, args[1]) } if args[2] != "-var-file-default" { - t.Fatalf("expected %q, got %q", "-var-file-default", args[0]) + t.Fatalf("expected %q, got %q", "-var-file-default", args[2]) } if args[3] != fileFirstAlphabetical { - t.Fatalf("expected %q, got %q", fileFirstAlphabetical, args[1]) + t.Fatalf("expected %q, got %q", fileFirstAlphabetical, args[3]) } if args[4] != "-var-file-default" { - t.Fatalf("expected %q, got %q", "-var-file-default", args[0]) + t.Fatalf("expected %q, got %q", "-var-file-default", args[4]) } if args[5] != fileLastAlphabetical { - t.Fatalf("expected %q, got %q", fileLastAlphabetical, args[3]) + t.Fatalf("expected %q, got %q", fileLastAlphabetical, args[5]) } } From f7f1e8e406e5ee8b8915f5854a513cc7cb6d3f0c Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 6 Jul 2017 11:34:47 -0400 Subject: [PATCH 2/2] Sort arguments in Meta.process Meta.process was relying on the system readdir to order the arguments, but readdir doesn't guarantee any ordering. Read the directory contents as a whole and sort them in place before adding the tfvars files. --- command/meta.go | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/command/meta.go b/command/meta.go index c84f7550ee..aca94b1a85 100644 --- a/command/meta.go +++ b/command/meta.go @@ -11,6 +11,7 @@ import ( "log" "os" "path/filepath" + "sort" "strconv" "strings" "time" @@ -398,38 +399,26 @@ func (m *Meta) process(args []string, vars bool) ([]string, error) { if err != nil { return nil, err } - f, err := os.Open(wd) + + fis, err := ioutil.ReadDir(wd) if err != nil { return nil, err } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return nil, err - } - if !fi.IsDir() { - return nil, err - } + // make sure we add the files in order + sort.Slice(fis, func(i, j int) bool { + return fis[i].Name() < fis[j].Name() + }) - err = nil - for err != io.EOF { - var fis []os.FileInfo - fis, err = f.Readdir(128) - if err != nil && err != io.EOF { - return nil, err + for _, fi := range fis { + name := fi.Name() + // Ignore directories, non-var-files, and ignored files + if fi.IsDir() || !isAutoVarFile(name) || config.IsIgnoredFile(name) { + continue } - for _, fi := range fis { - name := fi.Name() - // Ignore directories, non-var-files, and ignored files - if fi.IsDir() || !isAutoVarFile(name) || config.IsIgnoredFile(name) { - continue - } - - m.autoKey = "var-file-default" - preArgs = append(preArgs, "-"+m.autoKey, name) - } + m.autoKey = "var-file-default" + preArgs = append(preArgs, "-"+m.autoKey, name) } args = append(preArgs, args...)