From cd89f4355c86505cf3f0f90f708b005aff6cd193 Mon Sep 17 00:00:00 2001 From: Tiago Cesar Katcipis Date: Mon, 16 May 2022 19:07:37 +0200 Subject: [PATCH] fix: code generation does't ignore dotfiles (#348) --- generate/genfile/genfile_test.go | 13 ++++ generate/genhcl/genhcl_test.go | 16 ++++ hcl/hcl.go | 129 +++++++++++++++++-------------- 3 files changed, 102 insertions(+), 56 deletions(-) diff --git a/generate/genfile/genfile_test.go b/generate/genfile/genfile_test.go index 1defb987b..5ad055d93 100644 --- a/generate/genfile/genfile_test.go +++ b/generate/genfile/genfile_test.go @@ -68,6 +68,19 @@ func TestLoadGenerateFiles(t *testing.T) { name: "no generation", stack: "/stack", }, + { + name: "dotfile is ignored", + stack: "/stack", + configs: []hclconfig{ + { + path: "/stack/.test.tm", + add: generateFile( + labels("test"), + str("content", "test"), + ), + }, + }, + }, { name: "empty content attribute generates empty body", stack: "/stack", diff --git a/generate/genhcl/genhcl_test.go b/generate/genhcl/genhcl_test.go index a326928e3..49ed17c11 100644 --- a/generate/genhcl/genhcl_test.go +++ b/generate/genhcl/genhcl_test.go @@ -70,6 +70,22 @@ func TestLoadGeneratedHCL(t *testing.T) { name: "no generation", stack: "/stack", }, + { + name: "dotfile is ignored", + stack: "/stack", + configs: []hclconfig{ + { + path: "/stack", + filename: ".config.tm", + add: generateHCL( + labels("config"), + content( + block("empty"), + ), + ), + }, + }, + }, { name: "empty content block generates empty code", stack: "/stack", diff --git a/hcl/hcl.go b/hcl/hcl.go index 5a30aed3a..4dd04e68d 100644 --- a/hcl/hcl.go +++ b/hcl/hcl.go @@ -136,46 +136,27 @@ func (p *TerramateParser) addDir(dir string) error { Str("dir", dir). Logger() - dirEntries, err := os.ReadDir(dir) + tmFiles, err := listTerramateFiles(dir) if err != nil { return errors.E(err, "adding directory to terramate parser") } - logger.Trace().Msg("looking for Terramate files") - - for _, dirEntry := range dirEntries { - logger := logger.With(). - Str("entryName", dirEntry.Name()). - Logger() + for _, filename := range tmFiles { + path := filepath.Join(dir, filename) + logger.Trace(). + Str("file", path). + Msg("Reading config file.") - if dirEntry.IsDir() { - logger.Trace().Msg("ignoring dir") - continue + data, err := os.ReadFile(path) + if err != nil { + return errors.E(err, "reading config file %q", path) } - filename := dirEntry.Name() - if strings.HasPrefix(filename, ".") { - logger.Trace().Msg("ignoring dotfile") - continue + if err := p.AddFile(path, data); err != nil { + return err } - if strings.HasSuffix(filename, ".tm") || strings.HasSuffix(filename, ".tm.hcl") { - path := filepath.Join(dir, filename) - - logger.Trace(). - Str("file", path). - Msg("Reading config file.") - - data, err := os.ReadFile(path) - if err != nil { - return errors.E(err, "reading config file %q", path) - } - if err := p.AddFile(path, data); err != nil { - return err - } - - logger.Trace().Msg("file added") - } + logger.Trace().Msg("file added") } return nil @@ -837,45 +818,35 @@ func loadCfgBlocks(dir string) (*hclparse.Parser, error) { logger.Trace().Msg("listing files") - dirEntries, err := os.ReadDir(dir) + filenames, err := listTerramateFiles(dir) if err != nil { return nil, errors.E(err, "reading dir to load config files") } - logger.Trace().Msg("looking for Terramate files") - parser := hclparse.NewParser() - for _, dirEntry := range dirEntries { + for _, filename := range filenames { logger := logger.With(). - Str("entryName", dirEntry.Name()). + Str("entryName", filename). Logger() - if dirEntry.IsDir() { - logger.Trace().Msg("ignoring dir") - continue - } - - filename := dirEntry.Name() - if strings.HasSuffix(filename, ".tm") || strings.HasSuffix(filename, ".tm.hcl") { - path := filepath.Join(dir, filename) + path := filepath.Join(dir, filename) - logger.Trace().Msg("Reading config file.") + logger.Trace().Msg("Reading config file.") - data, err := os.ReadFile(path) - if err != nil { - return nil, errors.E(err, "reading config file %q", path) - } - - logger.Trace().Msg("Parsing config.") + data, err := os.ReadFile(path) + if err != nil { + return nil, errors.E(err, "reading config file %q", path) + } - _, diags := parser.ParseHCL(data, path) - if diags.HasErrors() { - return nil, errors.E(ErrHCLSyntax, diags) - } + logger.Trace().Msg("Parsing config.") - logger.Trace().Msg("Config file parsed successfully") + _, diags := parser.ParseHCL(data, path) + if diags.HasErrors() { + return nil, errors.E(ErrHCLSyntax, diags) } + + logger.Trace().Msg("Config file parsed successfully") } return parser, nil @@ -1113,3 +1084,49 @@ func (m Module) IsLocal() bool { // As specified here: https://www.terraform.io/docs/language/modules/sources.html#local-paths return m.Source[0:2] == "./" || m.Source[0:3] == "../" } + +func listTerramateFiles(dir string) ([]string, error) { + logger := log.With(). + Str("action", "listTerramateFiles()"). + Str("dir", dir). + Logger() + + logger.Trace().Msg("listing files") + + dirEntries, err := os.ReadDir(dir) + if err != nil { + return nil, errors.E(err, "reading dir to list Terramate files") + } + + logger.Trace().Msg("looking for Terramate files") + + files := []string{} + + for _, dirEntry := range dirEntries { + logger := logger.With(). + Str("entryName", dirEntry.Name()). + Logger() + + if strings.HasPrefix(dirEntry.Name(), ".") { + logger.Trace().Msg("ignoring dotfile") + continue + } + + if dirEntry.IsDir() { + logger.Trace().Msg("ignoring dir") + continue + } + + filename := dirEntry.Name() + if isTerramateFile(filename) { + logger.Trace().Msg("Found Terramate file") + files = append(files, filename) + } + } + + return files, nil +} + +func isTerramateFile(filename string) bool { + return strings.HasSuffix(filename, ".tm") || strings.HasSuffix(filename, ".tm.hcl") +}