mirror of https://github.com/containers/podman.git
Merge pull request #18511 from containers/renovate/golang.org-x-tools-0.x
fix(deps): update module golang.org/x/tools to v0.9.0
This commit is contained in:
commit
edcb29b19f
|
@ -6,7 +6,7 @@ require (
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2
|
github.com/cpuguy83/go-md2man/v2 v2.0.2
|
||||||
github.com/onsi/ginkgo/v2 v2.9.4
|
github.com/onsi/ginkgo/v2 v2.9.4
|
||||||
github.com/vbatts/git-validation v1.2.0
|
github.com/vbatts/git-validation v1.2.0
|
||||||
golang.org/x/tools v0.8.0
|
golang.org/x/tools v0.9.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
@ -16,5 +16,5 @@ require (
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||||
golang.org/x/mod v0.10.0 // indirect
|
golang.org/x/mod v0.10.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.8.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
@ -35,15 +35,15 @@ github.com/vbatts/git-validation v1.2.0 h1:IrPrZ8NRvI3kN6XfFVA6tqsByS6yImqmMiv0j
|
||||||
github.com/vbatts/git-validation v1.2.0/go.mod h1:3TVljc5dpnsCnENsoayGa30TRhvxHnHdFmMgfeV6ee0=
|
github.com/vbatts/git-validation v1.2.0/go.mod h1:3TVljc5dpnsCnENsoayGa30TRhvxHnHdFmMgfeV6ee0=
|
||||||
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||||
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||||
golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y=
|
golang.org/x/tools v0.9.0 h1:CtBMYmb33qYal6XpayZzNXlyK/3FpZV8bDq4CZo57b8=
|
||||||
golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
|
golang.org/x/tools v0.9.0/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|
|
@ -204,6 +204,7 @@ struct ltchars {
|
||||||
#include <sys/timerfd.h>
|
#include <sys/timerfd.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <sys/xattr.h>
|
#include <sys/xattr.h>
|
||||||
|
#include <netinet/udp.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
#include <linux/bpf.h>
|
#include <linux/bpf.h>
|
||||||
#include <linux/can.h>
|
#include <linux/can.h>
|
||||||
|
@ -518,7 +519,7 @@ ccflags="$@"
|
||||||
$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
|
$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
|
||||||
$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
|
$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
|
||||||
$2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ ||
|
$2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ ||
|
||||||
$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT)_/ ||
|
$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ ||
|
||||||
$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ ||
|
$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ ||
|
||||||
$2 ~ /^NFC_.*_(MAX)?SIZE$/ ||
|
$2 ~ /^NFC_.*_(MAX)?SIZE$/ ||
|
||||||
$2 ~ /^RAW_PAYLOAD_/ ||
|
$2 ~ /^RAW_PAYLOAD_/ ||
|
||||||
|
|
|
@ -2967,6 +2967,7 @@ const (
|
||||||
SOL_TCP = 0x6
|
SOL_TCP = 0x6
|
||||||
SOL_TIPC = 0x10f
|
SOL_TIPC = 0x10f
|
||||||
SOL_TLS = 0x11a
|
SOL_TLS = 0x11a
|
||||||
|
SOL_UDP = 0x11
|
||||||
SOL_X25 = 0x106
|
SOL_X25 = 0x106
|
||||||
SOL_XDP = 0x11b
|
SOL_XDP = 0x11b
|
||||||
SOMAXCONN = 0x1000
|
SOMAXCONN = 0x1000
|
||||||
|
@ -3251,6 +3252,19 @@ const (
|
||||||
TRACEFS_MAGIC = 0x74726163
|
TRACEFS_MAGIC = 0x74726163
|
||||||
TS_COMM_LEN = 0x20
|
TS_COMM_LEN = 0x20
|
||||||
UDF_SUPER_MAGIC = 0x15013346
|
UDF_SUPER_MAGIC = 0x15013346
|
||||||
|
UDP_CORK = 0x1
|
||||||
|
UDP_ENCAP = 0x64
|
||||||
|
UDP_ENCAP_ESPINUDP = 0x2
|
||||||
|
UDP_ENCAP_ESPINUDP_NON_IKE = 0x1
|
||||||
|
UDP_ENCAP_GTP0 = 0x4
|
||||||
|
UDP_ENCAP_GTP1U = 0x5
|
||||||
|
UDP_ENCAP_L2TPINUDP = 0x3
|
||||||
|
UDP_GRO = 0x68
|
||||||
|
UDP_NO_CHECK6_RX = 0x66
|
||||||
|
UDP_NO_CHECK6_TX = 0x65
|
||||||
|
UDP_SEGMENT = 0x67
|
||||||
|
UDP_V4_FLOW = 0x2
|
||||||
|
UDP_V6_FLOW = 0x6
|
||||||
UMOUNT_NOFOLLOW = 0x8
|
UMOUNT_NOFOLLOW = 0x8
|
||||||
USBDEVICE_SUPER_MAGIC = 0x9fa2
|
USBDEVICE_SUPER_MAGIC = 0x9fa2
|
||||||
UTIME_NOW = 0x3fffffff
|
UTIME_NOW = 0x3fffffff
|
||||||
|
|
|
@ -37,14 +37,14 @@ func (token Token) Environ(inheritExisting bool) (env []string, err error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer DestroyEnvironmentBlock(block)
|
defer DestroyEnvironmentBlock(block)
|
||||||
blockp := uintptr(unsafe.Pointer(block))
|
blockp := unsafe.Pointer(block)
|
||||||
for {
|
for {
|
||||||
entry := UTF16PtrToString((*uint16)(unsafe.Pointer(blockp)))
|
entry := UTF16PtrToString((*uint16)(blockp))
|
||||||
if len(entry) == 0 {
|
if len(entry) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
env = append(env, entry)
|
env = append(env, entry)
|
||||||
blockp += 2 * (uintptr(len(entry)) + 1)
|
blockp = unsafe.Add(blockp, 2*(len(entry)+1))
|
||||||
}
|
}
|
||||||
return env, nil
|
return env, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,12 +95,17 @@ func ComposeCommandLine(args []string) string {
|
||||||
// DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv,
|
// DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv,
|
||||||
// as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that
|
// as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that
|
||||||
// command lines are passed around.
|
// command lines are passed around.
|
||||||
|
// DecomposeCommandLine returns error if commandLine contains NUL.
|
||||||
func DecomposeCommandLine(commandLine string) ([]string, error) {
|
func DecomposeCommandLine(commandLine string) ([]string, error) {
|
||||||
if len(commandLine) == 0 {
|
if len(commandLine) == 0 {
|
||||||
return []string{}, nil
|
return []string{}, nil
|
||||||
}
|
}
|
||||||
|
utf16CommandLine, err := UTF16FromString(commandLine)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errorspkg.New("string with NUL passed to DecomposeCommandLine")
|
||||||
|
}
|
||||||
var argc int32
|
var argc int32
|
||||||
argv, err := CommandLineToArgv(StringToUTF16Ptr(commandLine), &argc)
|
argv, err := CommandLineToArgv(&utf16CommandLine[0], &argc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,6 +141,12 @@ const (
|
||||||
SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1
|
SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ENUM_SERVICE_STATUS struct {
|
||||||
|
ServiceName *uint16
|
||||||
|
DisplayName *uint16
|
||||||
|
ServiceStatus SERVICE_STATUS
|
||||||
|
}
|
||||||
|
|
||||||
type SERVICE_STATUS struct {
|
type SERVICE_STATUS struct {
|
||||||
ServiceType uint32
|
ServiceType uint32
|
||||||
CurrentState uint32
|
CurrentState uint32
|
||||||
|
@ -245,3 +251,4 @@ type QUERY_SERVICE_LOCK_STATUS struct {
|
||||||
//sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications?
|
//sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications?
|
||||||
//sys RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW
|
//sys RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW
|
||||||
//sys QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation?
|
//sys QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation?
|
||||||
|
//sys EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) = advapi32.EnumDependentServicesW
|
||||||
|
|
|
@ -2220,15 +2220,19 @@ type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// JobObjectInformationClass
|
// JobObjectInformationClass for QueryInformationJobObject and SetInformationJobObject
|
||||||
JobObjectAssociateCompletionPortInformation = 7
|
JobObjectAssociateCompletionPortInformation = 7
|
||||||
|
JobObjectBasicAccountingInformation = 1
|
||||||
|
JobObjectBasicAndIoAccountingInformation = 8
|
||||||
JobObjectBasicLimitInformation = 2
|
JobObjectBasicLimitInformation = 2
|
||||||
|
JobObjectBasicProcessIdList = 3
|
||||||
JobObjectBasicUIRestrictions = 4
|
JobObjectBasicUIRestrictions = 4
|
||||||
JobObjectCpuRateControlInformation = 15
|
JobObjectCpuRateControlInformation = 15
|
||||||
JobObjectEndOfJobTimeInformation = 6
|
JobObjectEndOfJobTimeInformation = 6
|
||||||
JobObjectExtendedLimitInformation = 9
|
JobObjectExtendedLimitInformation = 9
|
||||||
JobObjectGroupInformation = 11
|
JobObjectGroupInformation = 11
|
||||||
JobObjectGroupInformationEx = 14
|
JobObjectGroupInformationEx = 14
|
||||||
|
JobObjectLimitViolationInformation = 13
|
||||||
JobObjectLimitViolationInformation2 = 34
|
JobObjectLimitViolationInformation2 = 34
|
||||||
JobObjectNetRateControlInformation = 32
|
JobObjectNetRateControlInformation = 32
|
||||||
JobObjectNotificationLimitInformation = 12
|
JobObjectNotificationLimitInformation = 12
|
||||||
|
|
|
@ -86,6 +86,7 @@ var (
|
||||||
procDeleteService = modadvapi32.NewProc("DeleteService")
|
procDeleteService = modadvapi32.NewProc("DeleteService")
|
||||||
procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource")
|
procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource")
|
||||||
procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx")
|
procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx")
|
||||||
|
procEnumDependentServicesW = modadvapi32.NewProc("EnumDependentServicesW")
|
||||||
procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW")
|
procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW")
|
||||||
procEqualSid = modadvapi32.NewProc("EqualSid")
|
procEqualSid = modadvapi32.NewProc("EqualSid")
|
||||||
procFreeSid = modadvapi32.NewProc("FreeSid")
|
procFreeSid = modadvapi32.NewProc("FreeSid")
|
||||||
|
@ -734,6 +735,14 @@ func DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procEnumDependentServicesW.Addr(), 6, uintptr(service), uintptr(activityState), uintptr(unsafe.Pointer(services)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {
|
func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)
|
r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
|
|
|
@ -8,10 +8,12 @@ package gocommand
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -215,6 +217,18 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error {
|
||||||
cmd := exec.Command("go", goArgs...)
|
cmd := exec.Command("go", goArgs...)
|
||||||
cmd.Stdout = stdout
|
cmd.Stdout = stdout
|
||||||
cmd.Stderr = stderr
|
cmd.Stderr = stderr
|
||||||
|
|
||||||
|
// cmd.WaitDelay was added only in go1.20 (see #50436).
|
||||||
|
if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() {
|
||||||
|
// https://go.dev/issue/59541: don't wait forever copying stderr
|
||||||
|
// after the command has exited.
|
||||||
|
// After CL 484741 we copy stdout manually, so we we'll stop reading that as
|
||||||
|
// soon as ctx is done. However, we also don't want to wait around forever
|
||||||
|
// for stderr. Give a much-longer-than-reasonable delay and then assume that
|
||||||
|
// something has wedged in the kernel or runtime.
|
||||||
|
waitDelay.Set(reflect.ValueOf(30 * time.Second))
|
||||||
|
}
|
||||||
|
|
||||||
// On darwin the cwd gets resolved to the real path, which breaks anything that
|
// On darwin the cwd gets resolved to the real path, which breaks anything that
|
||||||
// expects the working directory to keep the original path, including the
|
// expects the working directory to keep the original path, including the
|
||||||
// go command when dealing with modules.
|
// go command when dealing with modules.
|
||||||
|
@ -229,6 +243,7 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error {
|
||||||
cmd.Env = append(cmd.Env, "PWD="+i.WorkingDir)
|
cmd.Env = append(cmd.Env, "PWD="+i.WorkingDir)
|
||||||
cmd.Dir = i.WorkingDir
|
cmd.Dir = i.WorkingDir
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now())
|
defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now())
|
||||||
|
|
||||||
return runCmdContext(ctx, cmd)
|
return runCmdContext(ctx, cmd)
|
||||||
|
@ -242,10 +257,85 @@ var DebugHangingGoCommands = false
|
||||||
|
|
||||||
// runCmdContext is like exec.CommandContext except it sends os.Interrupt
|
// runCmdContext is like exec.CommandContext except it sends os.Interrupt
|
||||||
// before os.Kill.
|
// before os.Kill.
|
||||||
func runCmdContext(ctx context.Context, cmd *exec.Cmd) error {
|
func runCmdContext(ctx context.Context, cmd *exec.Cmd) (err error) {
|
||||||
if err := cmd.Start(); err != nil {
|
// If cmd.Stdout is not an *os.File, the exec package will create a pipe and
|
||||||
|
// copy it to the Writer in a goroutine until the process has finished and
|
||||||
|
// either the pipe reaches EOF or command's WaitDelay expires.
|
||||||
|
//
|
||||||
|
// However, the output from 'go list' can be quite large, and we don't want to
|
||||||
|
// keep reading (and allocating buffers) if we've already decided we don't
|
||||||
|
// care about the output. We don't want to wait for the process to finish, and
|
||||||
|
// we don't wait to wait for the WaitDelay to expire either.
|
||||||
|
//
|
||||||
|
// Instead, if cmd.Stdout requires a copying goroutine we explicitly replace
|
||||||
|
// it with a pipe (which is an *os.File), which we can close in order to stop
|
||||||
|
// copying output as soon as we realize we don't care about it.
|
||||||
|
var stdoutW *os.File
|
||||||
|
if cmd.Stdout != nil {
|
||||||
|
if _, ok := cmd.Stdout.(*os.File); !ok {
|
||||||
|
var stdoutR *os.File
|
||||||
|
stdoutR, stdoutW, err = os.Pipe()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
prevStdout := cmd.Stdout
|
||||||
|
cmd.Stdout = stdoutW
|
||||||
|
|
||||||
|
stdoutErr := make(chan error, 1)
|
||||||
|
go func() {
|
||||||
|
_, err := io.Copy(prevStdout, stdoutR)
|
||||||
|
if err != nil {
|
||||||
|
err = fmt.Errorf("copying stdout: %w", err)
|
||||||
|
}
|
||||||
|
stdoutErr <- err
|
||||||
|
}()
|
||||||
|
defer func() {
|
||||||
|
// We started a goroutine to copy a stdout pipe.
|
||||||
|
// Wait for it to finish, or terminate it if need be.
|
||||||
|
var err2 error
|
||||||
|
select {
|
||||||
|
case err2 = <-stdoutErr:
|
||||||
|
stdoutR.Close()
|
||||||
|
case <-ctx.Done():
|
||||||
|
stdoutR.Close()
|
||||||
|
// Per https://pkg.go.dev/os#File.Close, the call to stdoutR.Close
|
||||||
|
// should cause the Read call in io.Copy to unblock and return
|
||||||
|
// immediately, but we still need to receive from stdoutErr to confirm
|
||||||
|
// that that has happened.
|
||||||
|
<-stdoutErr
|
||||||
|
err2 = ctx.Err()
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
err = err2
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Per https://pkg.go.dev/os/exec#Cmd, “If Stdout and Stderr are the
|
||||||
|
// same writer, and have a type that can be compared with ==, at most
|
||||||
|
// one goroutine at a time will call Write.”
|
||||||
|
//
|
||||||
|
// Since we're starting a goroutine that writes to cmd.Stdout, we must
|
||||||
|
// also update cmd.Stderr so that that still holds.
|
||||||
|
func() {
|
||||||
|
defer func() { recover() }()
|
||||||
|
if cmd.Stderr == prevStdout {
|
||||||
|
cmd.Stderr = cmd.Stdout
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cmd.Start()
|
||||||
|
if stdoutW != nil {
|
||||||
|
// The child process has inherited the pipe file,
|
||||||
|
// so close the copy held in this process.
|
||||||
|
stdoutW.Close()
|
||||||
|
stdoutW = nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
resChan := make(chan error, 1)
|
resChan := make(chan error, 1)
|
||||||
go func() {
|
go func() {
|
||||||
resChan <- cmd.Wait()
|
resChan <- cmd.Wait()
|
||||||
|
@ -253,11 +343,14 @@ func runCmdContext(ctx context.Context, cmd *exec.Cmd) error {
|
||||||
|
|
||||||
// If we're interested in debugging hanging Go commands, stop waiting after a
|
// If we're interested in debugging hanging Go commands, stop waiting after a
|
||||||
// minute and panic with interesting information.
|
// minute and panic with interesting information.
|
||||||
if DebugHangingGoCommands {
|
debug := DebugHangingGoCommands
|
||||||
|
if debug {
|
||||||
|
timer := time.NewTimer(1 * time.Minute)
|
||||||
|
defer timer.Stop()
|
||||||
select {
|
select {
|
||||||
case err := <-resChan:
|
case err := <-resChan:
|
||||||
return err
|
return err
|
||||||
case <-time.After(1 * time.Minute):
|
case <-timer.C:
|
||||||
HandleHangingGoCommand(cmd.Process)
|
HandleHangingGoCommand(cmd.Process)
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
}
|
}
|
||||||
|
@ -270,30 +363,25 @@ func runCmdContext(ctx context.Context, cmd *exec.Cmd) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancelled. Interrupt and see if it ends voluntarily.
|
// Cancelled. Interrupt and see if it ends voluntarily.
|
||||||
cmd.Process.Signal(os.Interrupt)
|
if err := cmd.Process.Signal(os.Interrupt); err == nil {
|
||||||
select {
|
// (We used to wait only 1s but this proved
|
||||||
case err := <-resChan:
|
// fragile on loaded builder machines.)
|
||||||
return err
|
timer := time.NewTimer(5 * time.Second)
|
||||||
case <-time.After(time.Second):
|
defer timer.Stop()
|
||||||
|
select {
|
||||||
|
case err := <-resChan:
|
||||||
|
return err
|
||||||
|
case <-timer.C:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Didn't shut down in response to interrupt. Kill it hard.
|
// Didn't shut down in response to interrupt. Kill it hard.
|
||||||
// TODO(rfindley): per advice from bcmills@, it may be better to send SIGQUIT
|
// TODO(rfindley): per advice from bcmills@, it may be better to send SIGQUIT
|
||||||
// on certain platforms, such as unix.
|
// on certain platforms, such as unix.
|
||||||
if err := cmd.Process.Kill(); err != nil && DebugHangingGoCommands {
|
if err := cmd.Process.Kill(); err != nil && !errors.Is(err, os.ErrProcessDone) && debug {
|
||||||
// Don't panic here as this reliably fails on windows with EINVAL.
|
|
||||||
log.Printf("error killing the Go command: %v", err)
|
log.Printf("error killing the Go command: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// See above: don't wait indefinitely if we're debugging hanging Go commands.
|
|
||||||
if DebugHangingGoCommands {
|
|
||||||
select {
|
|
||||||
case err := <-resChan:
|
|
||||||
return err
|
|
||||||
case <-time.After(10 * time.Second): // a shorter wait as resChan should return quickly following Kill
|
|
||||||
HandleHangingGoCommand(cmd.Process)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return <-resChan
|
return <-resChan
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,21 +23,11 @@ import (
|
||||||
func GoVersion(ctx context.Context, inv Invocation, r *Runner) (int, error) {
|
func GoVersion(ctx context.Context, inv Invocation, r *Runner) (int, error) {
|
||||||
inv.Verb = "list"
|
inv.Verb = "list"
|
||||||
inv.Args = []string{"-e", "-f", `{{context.ReleaseTags}}`, `--`, `unsafe`}
|
inv.Args = []string{"-e", "-f", `{{context.ReleaseTags}}`, `--`, `unsafe`}
|
||||||
inv.Env = append(append([]string{}, inv.Env...), "GO111MODULE=off")
|
inv.BuildFlags = nil // This is not a build command.
|
||||||
// Unset any unneeded flags, and remove them from BuildFlags, if they're
|
|
||||||
// present.
|
|
||||||
inv.ModFile = ""
|
|
||||||
inv.ModFlag = ""
|
inv.ModFlag = ""
|
||||||
var buildFlags []string
|
inv.ModFile = ""
|
||||||
for _, flag := range inv.BuildFlags {
|
inv.Env = append(inv.Env[:len(inv.Env):len(inv.Env)], "GO111MODULE=off")
|
||||||
// Flags can be prefixed by one or two dashes.
|
|
||||||
f := strings.TrimPrefix(strings.TrimPrefix(flag, "-"), "-")
|
|
||||||
if strings.HasPrefix(f, "mod=") || strings.HasPrefix(f, "modfile=") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
buildFlags = append(buildFlags, flag)
|
|
||||||
}
|
|
||||||
inv.BuildFlags = buildFlags
|
|
||||||
stdoutBytes, err := r.Run(ctx, inv)
|
stdoutBytes, err := r.Run(ctx, inv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
|
@ -414,9 +414,16 @@ func (p *pass) fix() ([]*ImportFix, bool) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Collecting fixes involved map iteration, so sort for stability. See
|
||||||
|
// golang/go#59976.
|
||||||
|
sortFixes(fixes)
|
||||||
|
|
||||||
|
// collect selected fixes in a separate slice, so that it can be sorted
|
||||||
|
// separately. Note that these fixes must occur after fixes to existing
|
||||||
|
// imports. TODO(rfindley): figure out why.
|
||||||
|
var selectedFixes []*ImportFix
|
||||||
for _, imp := range selected {
|
for _, imp := range selected {
|
||||||
fixes = append(fixes, &ImportFix{
|
selectedFixes = append(selectedFixes, &ImportFix{
|
||||||
StmtInfo: ImportInfo{
|
StmtInfo: ImportInfo{
|
||||||
Name: p.importSpecName(imp),
|
Name: p.importSpecName(imp),
|
||||||
ImportPath: imp.ImportPath,
|
ImportPath: imp.ImportPath,
|
||||||
|
@ -425,8 +432,25 @@ func (p *pass) fix() ([]*ImportFix, bool) {
|
||||||
FixType: AddImport,
|
FixType: AddImport,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
sortFixes(selectedFixes)
|
||||||
|
|
||||||
return fixes, true
|
return append(fixes, selectedFixes...), true
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortFixes(fixes []*ImportFix) {
|
||||||
|
sort.Slice(fixes, func(i, j int) bool {
|
||||||
|
fi, fj := fixes[i], fixes[j]
|
||||||
|
if fi.StmtInfo.ImportPath != fj.StmtInfo.ImportPath {
|
||||||
|
return fi.StmtInfo.ImportPath < fj.StmtInfo.ImportPath
|
||||||
|
}
|
||||||
|
if fi.StmtInfo.Name != fj.StmtInfo.Name {
|
||||||
|
return fi.StmtInfo.Name < fj.StmtInfo.Name
|
||||||
|
}
|
||||||
|
if fi.IdentName != fj.IdentName {
|
||||||
|
return fi.IdentName < fj.IdentName
|
||||||
|
}
|
||||||
|
return fi.FixType < fj.FixType
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// importSpecName gets the import name of imp in the import spec.
|
// importSpecName gets the import name of imp in the import spec.
|
||||||
|
|
|
@ -49,13 +49,13 @@ github.com/vbatts/git-validation/validate
|
||||||
golang.org/x/mod/internal/lazyregexp
|
golang.org/x/mod/internal/lazyregexp
|
||||||
golang.org/x/mod/module
|
golang.org/x/mod/module
|
||||||
golang.org/x/mod/semver
|
golang.org/x/mod/semver
|
||||||
# golang.org/x/sys v0.7.0
|
# golang.org/x/sys v0.8.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
golang.org/x/sys/execabs
|
golang.org/x/sys/execabs
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
# golang.org/x/tools v0.8.0
|
# golang.org/x/tools v0.9.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
golang.org/x/tools/cmd/goimports
|
golang.org/x/tools/cmd/goimports
|
||||||
golang.org/x/tools/go/ast/astutil
|
golang.org/x/tools/go/ast/astutil
|
||||||
|
|
Loading…
Reference in New Issue