diff --git a/cmd/generate.go b/cmd/generate.go index efcad44..aa66de1 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -180,12 +180,6 @@ func discover(ctx context.Context, flags *Flags) ([]repocfg.Component, error) { if !info.IsDir() && strings.HasSuffix(info.Name(), TF_EXT) { logger.Debug(fmt.Sprintf("found .tf file: %s", path)) - // Add the directory of the Terraform component as the parent - parent, err := filepath.Rel(flags.Root, filepath.Dir(path)) - if err != nil { - return err - } - // Each edge should be a path containing Terraform variables files // relative to the Terraform component err = filepath.Walk(filepath.Dir(path), func(subpath string, subinfo os.FileInfo, suberr error) error { @@ -195,19 +189,23 @@ func discover(ctx context.Context, flags *Flags) ([]repocfg.Component, error) { // Filter out Terraform variable files if !subinfo.IsDir() && (strings.HasSuffix(subinfo.Name(), TFVARS_EXT) || strings.HasSuffix(subinfo.Name(), TFVARS_JSON_EXT)) { + parent := subpath // Ignore nested Terraform variable files that might belong to nested components - if filepath.Dir(subpath) != filepath.Dir(path) && tfExistsInDir(filepath.Dir(subpath)) { + if filepath.Dir(subpath) != filepath.Dir(path) && !tfExistsInDir(filepath.Dir(subpath)) { logger.Sugar().Debugf(`ignoring nested %s: %s which belongs to the component at: %s not: %s`, filepath.Ext(subpath), subpath, filepath.Dir(subpath), filepath.Dir(path), ) - - return filepath.SkipDir + parent = path } - logger.Sugar().Debugf("component parent is %s", parent) + relParent, err := filepath.Rel(flags.Root, filepath.Dir(parent)) + if err != nil { + return err + } + logger.Sugar().Debugf("component parent is %s", relParent) found := repocfg.Component{ - Path: parent, + Path: relParent, } logger.Sugar().Debugf("found %s file: %s", filepath.Ext(subpath), subpath) diff --git a/repocfg/util.go b/repocfg/util.go index 3b32102..fdfe71a 100644 --- a/repocfg/util.go +++ b/repocfg/util.go @@ -9,8 +9,15 @@ import ( func ptr[T any](v T) *T { return &v } // friendlyName creates a contextual name used for Atlantis projects -func friendlyName(path, environment string) string { - name := []string{strings.ReplaceAll(path, "/", "-"), pathWithoutExtension(filepath.Base(environment))} +func friendlyName(path, varFile string) string { + environment := pathWithoutExtension(filepath.Base(varFile)) + + // avoid constructing a joined path if the context is the current directory + if filepath.Base(path) == "." { + return environment + } + + name := []string{strings.ReplaceAll(path, "/", "-"), environment} return strings.TrimSuffix(strings.Join(name, "-"), "-") }