mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-30 22:39:58 +02:00
Pull in the latest code from Go's template packages (#11771)
Fixes #10707 Fixes #11507
This commit is contained in:
committed by
GitHub
parent
14d85ec136
commit
9f978d387f
@@ -60,13 +60,6 @@ func tryExec() error {
|
||||
// may as well use the same path so that this branch can be tested without
|
||||
// an ios environment.
|
||||
|
||||
/*if !testing.Testing() {
|
||||
// This isn't a standard 'go test' binary, so we don't know how to
|
||||
// self-exec in a way that should succeed without side effects.
|
||||
// Just forget it.
|
||||
return errors.New("can't probe for exec support with a non-test executable")
|
||||
}*/
|
||||
|
||||
// We know that this is a test executable. We should be able to run it with a
|
||||
// no-op flag to check for overall exec support.
|
||||
exe, err := os.Executable()
|
||||
@@ -99,11 +92,14 @@ func MustHaveExecPath(t testing.TB, path string) {
|
||||
// CleanCmdEnv will fill cmd.Env with the environment, excluding certain
|
||||
// variables that could modify the behavior of the Go tools such as
|
||||
// GODEBUG and GOTRACEBACK.
|
||||
//
|
||||
// If the caller wants to set cmd.Dir, set it before calling this function,
|
||||
// so PWD will be set correctly in the environment.
|
||||
func CleanCmdEnv(cmd *exec.Cmd) *exec.Cmd {
|
||||
if cmd.Env != nil {
|
||||
panic("environment already set")
|
||||
}
|
||||
for _, env := range os.Environ() {
|
||||
for _, env := range cmd.Environ() {
|
||||
// Exclude GODEBUG from the environment to prevent its output
|
||||
// from breaking tests that are trying to parse other command output.
|
||||
if strings.HasPrefix(env, "GODEBUG=") {
|
||||
|
@@ -15,10 +15,6 @@ import (
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
|
||||
"github.com/gohugoio/hugo/tpl/internal/go_templates/cfg"
|
||||
|
||||
//"internal/platform"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
@@ -27,6 +23,8 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/gohugoio/hugo/tpl/internal/go_templates/cfg"
|
||||
)
|
||||
|
||||
// Save the original environment during init for use in checks. A test
|
||||
@@ -45,8 +43,8 @@ func Builder() string {
|
||||
|
||||
// HasGoBuild reports whether the current system can build programs with “go build”
|
||||
// and then run them with os.StartProcess or exec.Command.
|
||||
// Modified by Hugo (not needed)
|
||||
func HasGoBuild() bool {
|
||||
// Modified by Hugo (not needed)
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -69,13 +67,13 @@ func MustHaveGoBuild(t testing.TB) {
|
||||
}
|
||||
}
|
||||
|
||||
// HasGoRun reports whether the current system can run programs with “go run.”
|
||||
// HasGoRun reports whether the current system can run programs with “go run”.
|
||||
func HasGoRun() bool {
|
||||
// For now, having go run and having go build are the same.
|
||||
return HasGoBuild()
|
||||
}
|
||||
|
||||
// MustHaveGoRun checks that the current system can run programs with “go run.”
|
||||
// MustHaveGoRun checks that the current system can run programs with “go run”.
|
||||
// If not, MustHaveGoRun calls t.Skip with an explanation.
|
||||
func MustHaveGoRun(t testing.TB) {
|
||||
if !HasGoRun() {
|
||||
@@ -300,8 +298,8 @@ func MustHaveCGO(t testing.TB) {
|
||||
|
||||
// CanInternalLink reports whether the current system can link programs with
|
||||
// internal linking.
|
||||
// Modified by Hugo (not needed)
|
||||
func CanInternalLink(withCgo bool) bool {
|
||||
// Modified by Hugo (not needed)
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -320,8 +318,8 @@ func MustInternalLink(t testing.TB, withCgo bool) {
|
||||
// MustHaveBuildMode reports whether the current system can build programs in
|
||||
// the given build mode.
|
||||
// If not, MustHaveBuildMode calls t.Skip with an explanation.
|
||||
// Modified by Hugo (not needed)
|
||||
func MustHaveBuildMode(t testing.TB, buildmode string) {
|
||||
// Modified by Hugo (not needed)
|
||||
}
|
||||
|
||||
// HasSymlink reports whether the current system can use os.Symlink.
|
||||
@@ -438,7 +436,7 @@ func WriteImportcfg(t testing.TB, dstPath string, packageFiles map[string]string
|
||||
}
|
||||
}
|
||||
|
||||
if err := os.WriteFile(dstPath, icfg.Bytes(), 0666); err != nil {
|
||||
if err := os.WriteFile(dstPath, icfg.Bytes(), 0o666); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
@@ -7,6 +7,8 @@
|
||||
package testenv
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io/fs"
|
||||
"os"
|
||||
)
|
||||
|
||||
@@ -15,6 +17,5 @@ import (
|
||||
var Sigquit = os.Kill
|
||||
|
||||
func syscallIsNotSupported(err error) bool {
|
||||
// Removed by Hugo (not supported in Go 1.20).
|
||||
return false
|
||||
return errors.Is(err, fs.ErrPermission)
|
||||
}
|
||||
|
@@ -5,13 +5,13 @@
|
||||
package testenv_test
|
||||
|
||||
import (
|
||||
"github.com/gohugoio/hugo/tpl/internal/go_templates/testenv"
|
||||
//"internal/platform"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/gohugoio/hugo/tpl/internal/go_templates/testenv"
|
||||
)
|
||||
|
||||
func TestGoToolLocation(t *testing.T) {
|
||||
@@ -83,3 +83,26 @@ func TestMustHaveExec(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCleanCmdEnvPWD(t *testing.T) {
|
||||
// Test that CleanCmdEnv sets PWD if cmd.Dir is set.
|
||||
switch runtime.GOOS {
|
||||
case "plan9", "windows":
|
||||
t.Skipf("PWD is not used on %s", runtime.GOOS)
|
||||
}
|
||||
dir := t.TempDir()
|
||||
cmd := testenv.Command(t, testenv.GoToolPath(t), "help")
|
||||
cmd.Dir = dir
|
||||
cmd = testenv.CleanCmdEnv(cmd)
|
||||
|
||||
for _, env := range cmd.Env {
|
||||
if strings.HasPrefix(env, "PWD=") {
|
||||
pwd := strings.TrimPrefix(env, "PWD=")
|
||||
if pwd != dir {
|
||||
t.Errorf("unexpected PWD: want %s, got %s", dir, pwd)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
t.Error("PWD not set in cmd.Env")
|
||||
}
|
||||
|
@@ -7,6 +7,8 @@
|
||||
package testenv
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io/fs"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
@@ -15,6 +17,27 @@ import (
|
||||
var Sigquit = syscall.SIGQUIT
|
||||
|
||||
func syscallIsNotSupported(err error) bool {
|
||||
// Removed by Hugo (not supported in Go 1.20)
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
var errno syscall.Errno
|
||||
if errors.As(err, &errno) {
|
||||
switch errno {
|
||||
case syscall.EPERM, syscall.EROFS:
|
||||
// User lacks permission: either the call requires root permission and the
|
||||
// user is not root, or the call is denied by a container security policy.
|
||||
return true
|
||||
case syscall.EINVAL:
|
||||
// Some containers return EINVAL instead of EPERM if a system call is
|
||||
// denied by security policy.
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
if errors.Is(err, fs.ErrPermission) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
Reference in New Issue
Block a user