diff --git a/command/init_test.go b/command/init_test.go index 2db54b047..ebd05e0f2 100644 --- a/command/init_test.go +++ b/command/init_test.go @@ -100,3 +100,45 @@ func TestInit_noArgs(t *testing.T) { t.Fatalf("bad: \n%s", ui.OutputWriter.String()) } } + +// https://github.com/hashicorp/terraform/issues/518 +func TestInit_dstInSrc(t *testing.T) { + dir := tempDir(t) + if err := os.MkdirAll(dir, 0755); err != nil { + t.Fatalf("err: %s", err) + } + + // Change to the temporary directory + cwd, err := os.Getwd() + if err != nil { + t.Fatalf("err: %s", err) + } + if err := os.Chdir(dir); err != nil { + t.Fatalf("err: %s", err) + } + defer os.Chdir(cwd) + + if _, err := os.Create("issue518.tf"); err != nil { + t.Fatalf("err: %s", err) + } + + ui := new(cli.MockUi) + c := &InitCommand{ + Meta: Meta{ + ContextOpts: testCtxConfig(testProvider()), + Ui: ui, + }, + } + + args := []string{ + ".", + "foo", + } + if code := c.Run(args); code != 0 { + t.Fatalf("bad: \n%s", ui.ErrorWriter.String()) + } + + if _, err := os.Stat(filepath.Join(dir, "foo", "issue518.tf")); err != nil { + t.Fatalf("err: %s", err) + } +} diff --git a/config/module/copy_dir.go b/config/module/copy_dir.go index a6628d1d7..f2ae63b77 100644 --- a/config/module/copy_dir.go +++ b/config/module/copy_dir.go @@ -39,6 +39,11 @@ func copyDir(dst, src string) error { // If we have a directory, make that subdirectory, then continue // the walk. if info.IsDir() { + if path == filepath.Join(src, dst) { + // dst is in src; don't walk it. + return nil + } + if err := os.MkdirAll(dstPath, 0755); err != nil { return err }