mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-18 12:42:58 -06:00
072c6d9aed
We've previously been copying this function around so it could remain unexported while being used in various packages. However, it's a non-trivial function with lots of specific assumptions built into it, so here we'll put it somewhere that other packages can depend on it _and_ document the assumptions it seems to be making for future reference. As a bonus, this now uses os.SameFile to detect when two paths point to the same physical file, instead of the slightly buggy local implementation we had before which only worked on Unix systems and did not correctly handle when the paths were on different physical devices. The copy of the function I extracted here is the one from internal/initwd, so this commit also includes the removal of that unexported version and updating the callers in that package to use at at this new location.
108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
package copydir
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// TestCopyDir_symlinks sets up a directory with two submodules,
|
|
// one being a symlink to the other
|
|
//
|
|
// The resultant file structure is as follows:
|
|
// ├── modules
|
|
// │ ├── symlink-module -> test-module
|
|
// │ └── test-module
|
|
// │ └── main.tf
|
|
// └── target
|
|
// ├── symlink-module -> test-module
|
|
// └── test-module
|
|
// └── main.tf
|
|
|
|
func TestCopyDir_symlinks(t *testing.T) {
|
|
tmpdir, err := ioutil.TempDir("", "copy-dir-test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tmpdir)
|
|
|
|
moduleDir := filepath.Join(tmpdir, "modules")
|
|
err = os.Mkdir(moduleDir, os.ModePerm)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
subModuleDir := filepath.Join(moduleDir, "test-module")
|
|
err = os.Mkdir(subModuleDir, os.ModePerm)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = ioutil.WriteFile(filepath.Join(subModuleDir, "main.tf"), []byte("hello"), 0644)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = os.Symlink("test-module", filepath.Join(moduleDir, "symlink-module"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
targetDir := filepath.Join(tmpdir, "target")
|
|
os.Mkdir(targetDir, os.ModePerm)
|
|
|
|
err = CopyDir(targetDir, moduleDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, err = os.Lstat(filepath.Join(targetDir, "test-module", "main.tf")); os.IsNotExist(err) {
|
|
t.Fatal("target test-module/main.tf was not created")
|
|
}
|
|
|
|
if _, err = os.Lstat(filepath.Join(targetDir, "symlink-module", "main.tf")); os.IsNotExist(err) {
|
|
t.Fatal("target symlink-module/main.tf was not created")
|
|
}
|
|
}
|
|
|
|
func TestCopyDir_symlink_file(t *testing.T) {
|
|
tmpdir, err := ioutil.TempDir("", "copy-file-test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tmpdir)
|
|
|
|
moduleDir := filepath.Join(tmpdir, "modules")
|
|
err = os.Mkdir(moduleDir, os.ModePerm)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = ioutil.WriteFile(filepath.Join(moduleDir, "main.tf"), []byte("hello"), 0644)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = os.Symlink("main.tf", filepath.Join(moduleDir, "symlink.tf"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
targetDir := filepath.Join(tmpdir, "target")
|
|
os.Mkdir(targetDir, os.ModePerm)
|
|
|
|
err = CopyDir(targetDir, moduleDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, err = os.Lstat(filepath.Join(targetDir, "main.tf")); os.IsNotExist(err) {
|
|
t.Fatal("target/main.tf was not created")
|
|
}
|
|
|
|
if _, err = os.Lstat(filepath.Join(targetDir, "symlink.tf")); os.IsNotExist(err) {
|
|
t.Fatal("target/symlink.tf was not created")
|
|
}
|
|
}
|