Skip to content

Commit

Permalink
fix: code generation does't ignore dotfiles (#348)
Browse files Browse the repository at this point in the history
  • Loading branch information
katcipis committed May 16, 2022
1 parent c9a486b commit cd89f43
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 56 deletions.
13 changes: 13 additions & 0 deletions generate/genfile/genfile_test.go
Expand Up @@ -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",
Expand Down
16 changes: 16 additions & 0 deletions generate/genhcl/genhcl_test.go
Expand Up @@ -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",
Expand Down
129 changes: 73 additions & 56 deletions hcl/hcl.go
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")
}

0 comments on commit cd89f43

Please sign in to comment.