mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: merge overlayDir into one package
There are many copies of overlaydir_test.go between the cgo tests from when these couldn't share code. Now that they can, merge these copies into a cmd/cgo/internal/cgotest package. Change-Id: I203217f5d08e6306cb049a13718652cf7c447b80 Reviewed-on: https://go-review.googlesource.com/c/go/+/497078 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
96a773d61b
commit
a1f3dc33dc
14 changed files with 18 additions and 482 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package so_test
|
package cgotest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
|
@ -11,11 +11,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
// OverlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
||||||
//
|
func OverlayDir(dstRoot, srcRoot string) error {
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
dstRoot = filepath.Clean(dstRoot)
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -12,6 +12,7 @@ package carchive_test
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"debug/elf"
|
"debug/elf"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -82,7 +83,7 @@ func testMain(m *testing.M) int {
|
||||||
// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
|
// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
|
||||||
// declaring the same path.
|
// declaring the same path.
|
||||||
modRoot := filepath.Join(GOPATH, "src", "testcarchive")
|
modRoot := filepath.Join(GOPATH, "src", "testcarchive")
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
if err := os.Chdir(modRoot); err != nil {
|
if err := os.Chdir(modRoot); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package carchive_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
|
||||||
//
|
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
srcRoot, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil || srcPath == srcRoot {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
|
||||||
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
|
||||||
suffix = suffix[1:]
|
|
||||||
}
|
|
||||||
dstPath := filepath.Join(dstRoot, suffix)
|
|
||||||
|
|
||||||
perm := info.Mode() & os.ModePerm
|
|
||||||
if info.Mode()&os.ModeSymlink != 0 {
|
|
||||||
info, err = os.Stat(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
perm = info.Mode() & os.ModePerm
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always copy directories (don't symlink them).
|
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(dstPath, perm|0200)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
|
||||||
if err := os.Symlink(srcPath, dstPath); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, copy the bytes.
|
|
||||||
src, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
|
|
||||||
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = io.Copy(dst, src)
|
|
||||||
if closeErr := dst.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
@ -7,6 +7,7 @@ package cshared_test
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"debug/elf"
|
"debug/elf"
|
||||||
"debug/pe"
|
"debug/pe"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
@ -137,7 +138,7 @@ func testMain(m *testing.M) int {
|
||||||
os.Setenv("GOPATH", GOPATH)
|
os.Setenv("GOPATH", GOPATH)
|
||||||
|
|
||||||
modRoot := filepath.Join(GOPATH, "src", "testcshared")
|
modRoot := filepath.Join(GOPATH, "src", "testcshared")
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
if err := os.Chdir(modRoot); err != nil {
|
if err := os.Chdir(modRoot); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cshared_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
|
||||||
//
|
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
srcRoot, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil || srcPath == srcRoot {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
|
||||||
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
|
||||||
suffix = suffix[1:]
|
|
||||||
}
|
|
||||||
dstPath := filepath.Join(dstRoot, suffix)
|
|
||||||
|
|
||||||
perm := info.Mode() & os.ModePerm
|
|
||||||
if info.Mode()&os.ModeSymlink != 0 {
|
|
||||||
info, err = os.Stat(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
perm = info.Mode() & os.ModePerm
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always copy directories (don't symlink them).
|
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(dstPath, perm|0200)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
|
||||||
if err := os.Symlink(srcPath, dstPath); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, copy the bytes.
|
|
||||||
src, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
|
|
||||||
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = io.Copy(dst, src)
|
|
||||||
if closeErr := dst.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
@ -6,6 +6,7 @@ package life_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"internal/testenv"
|
"internal/testenv"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -30,7 +31,7 @@ func testMain(m *testing.M) int {
|
||||||
// Copy testdata into GOPATH/src/cgolife, along with a go.mod file
|
// Copy testdata into GOPATH/src/cgolife, along with a go.mod file
|
||||||
// declaring the same path.
|
// declaring the same path.
|
||||||
modRoot := filepath.Join(GOPATH, "src", "cgolife")
|
modRoot := filepath.Join(GOPATH, "src", "cgolife")
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
if err := os.Chdir(modRoot); err != nil {
|
if err := os.Chdir(modRoot); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package life_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
|
||||||
//
|
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
srcRoot, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil || srcPath == srcRoot {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
|
||||||
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
|
||||||
suffix = suffix[1:]
|
|
||||||
}
|
|
||||||
dstPath := filepath.Join(dstRoot, suffix)
|
|
||||||
|
|
||||||
perm := info.Mode() & os.ModePerm
|
|
||||||
if info.Mode()&os.ModeSymlink != 0 {
|
|
||||||
info, err = os.Stat(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
perm = info.Mode() & os.ModePerm
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always copy directories (don't symlink them).
|
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(dstPath, perm|0200)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
|
||||||
if err := os.Symlink(srcPath, dstPath); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, copy the bytes.
|
|
||||||
src, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
|
|
||||||
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = io.Copy(dst, src)
|
|
||||||
if closeErr := dst.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package plugin_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
|
||||||
//
|
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
srcRoot, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil || srcPath == srcRoot {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
|
||||||
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
|
||||||
suffix = suffix[1:]
|
|
||||||
}
|
|
||||||
dstPath := filepath.Join(dstRoot, suffix)
|
|
||||||
|
|
||||||
perm := info.Mode() & os.ModePerm
|
|
||||||
if info.Mode()&os.ModeSymlink != 0 {
|
|
||||||
info, err = os.Stat(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
perm = info.Mode() & os.ModePerm
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always copy directories (don't symlink them).
|
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(dstPath, perm|0200)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
|
||||||
if err := os.Symlink(srcPath, dstPath); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, copy the bytes.
|
|
||||||
src, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
|
|
||||||
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = io.Copy(dst, src)
|
|
||||||
if closeErr := dst.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
@ -6,6 +6,7 @@ package plugin_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -80,7 +81,7 @@ func testMain(m *testing.M) int {
|
||||||
"testdata": modRoot,
|
"testdata": modRoot,
|
||||||
filepath.Join("altpath", "testdata"): altRoot,
|
filepath.Join("altpath", "testdata"): altRoot,
|
||||||
} {
|
} {
|
||||||
if err := overlayDir(dstRoot, srcRoot); err != nil {
|
if err := cgotest.OverlayDir(dstRoot, srcRoot); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
prettyPrintf("mkdir -p %s\n", dstRoot)
|
prettyPrintf("mkdir -p %s\n", dstRoot)
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package shared_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
|
||||||
//
|
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
srcRoot, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil || srcPath == srcRoot {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
|
||||||
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
|
||||||
suffix = suffix[1:]
|
|
||||||
}
|
|
||||||
dstPath := filepath.Join(dstRoot, suffix)
|
|
||||||
|
|
||||||
perm := info.Mode() & os.ModePerm
|
|
||||||
if info.Mode()&os.ModeSymlink != 0 {
|
|
||||||
info, err = os.Stat(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
perm = info.Mode() & os.ModePerm
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always copy directories (don't symlink them).
|
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(dstPath, perm|0200)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
|
||||||
if err := os.Symlink(srcPath, dstPath); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, copy the bytes.
|
|
||||||
src, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
|
|
||||||
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = io.Copy(dst, src)
|
|
||||||
if closeErr := dst.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
@ -7,6 +7,7 @@ package shared_test
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"debug/elf"
|
"debug/elf"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"flag"
|
"flag"
|
||||||
|
|
@ -203,7 +204,7 @@ func TestMain(m *testing.M) {
|
||||||
// It returns the directory within gopath at which the module root is located.
|
// It returns the directory within gopath at which the module root is located.
|
||||||
func cloneTestdataModule(gopath string) (string, error) {
|
func cloneTestdataModule(gopath string) (string, error) {
|
||||||
modRoot := filepath.Join(gopath, "src", "testshared")
|
modRoot := filepath.Join(gopath, "src", "testshared")
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module testshared\n"), 0644); err != nil {
|
if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module testshared\n"), 0644); err != nil {
|
||||||
|
|
@ -255,7 +256,7 @@ func cloneGOROOTDeps(goroot string) error {
|
||||||
if testing.Verbose() {
|
if testing.Verbose() {
|
||||||
fmt.Fprintf(os.Stderr, "+ cp -r %s %s\n", filepath.Join(oldGOROOT, dir), filepath.Join(goroot, dir))
|
fmt.Fprintf(os.Stderr, "+ cp -r %s %s\n", filepath.Join(oldGOROOT, dir), filepath.Join(goroot, dir))
|
||||||
}
|
}
|
||||||
if err := overlayDir(filepath.Join(goroot, dir), filepath.Join(oldGOROOT, dir)); err != nil {
|
if err := cgotest.OverlayDir(filepath.Join(goroot, dir), filepath.Join(oldGOROOT, dir)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
package so_test
|
package so_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"internal/testenv"
|
"internal/testenv"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -38,7 +39,7 @@ func testSO(t *testing.T, dir string) {
|
||||||
defer os.RemoveAll(GOPATH)
|
defer os.RemoveAll(GOPATH)
|
||||||
|
|
||||||
modRoot := filepath.Join(GOPATH, "src", "cgosotest")
|
modRoot := filepath.Join(GOPATH, "src", "cgosotest")
|
||||||
if err := overlayDir(modRoot, filepath.Join("testdata", dir)); err != nil {
|
if err := cgotest.OverlayDir(modRoot, filepath.Join("testdata", dir)); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
|
if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package stdio_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
|
||||||
//
|
|
||||||
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
|
||||||
// factor this function out into a package to reduce duplication.
|
|
||||||
func overlayDir(dstRoot, srcRoot string) error {
|
|
||||||
dstRoot = filepath.Clean(dstRoot)
|
|
||||||
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
srcRoot, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil || srcPath == srcRoot {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
|
||||||
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
|
||||||
suffix = suffix[1:]
|
|
||||||
}
|
|
||||||
dstPath := filepath.Join(dstRoot, suffix)
|
|
||||||
|
|
||||||
perm := info.Mode() & os.ModePerm
|
|
||||||
if info.Mode()&os.ModeSymlink != 0 {
|
|
||||||
info, err = os.Stat(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
perm = info.Mode() & os.ModePerm
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always copy directories (don't symlink them).
|
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(dstPath, perm|0200)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
|
||||||
if err := os.Symlink(srcPath, dstPath); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, copy the bytes.
|
|
||||||
src, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
|
|
||||||
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = io.Copy(dst, src)
|
|
||||||
if closeErr := dst.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
@ -6,6 +6,7 @@ package stdio_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/cgo/internal/cgotest"
|
||||||
"internal/testenv"
|
"internal/testenv"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -31,7 +32,7 @@ func testMain(m *testing.M) int {
|
||||||
// Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
|
// Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
|
||||||
// declaring the same path.
|
// declaring the same path.
|
||||||
modRoot := filepath.Join(GOPATH, "src", "cgostdio")
|
modRoot := filepath.Join(GOPATH, "src", "cgostdio")
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
if err := os.Chdir(modRoot); err != nil {
|
if err := os.Chdir(modRoot); err != nil {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue