git-lfs/tools/robustio_windows.go
Dennis Ameling d7a3a090df Update formatting for Go 1.17
From the 1.17 release notes (https://golang.org/doc/go1.17#gofmt): gofmt (and go fmt) now synchronizes //go:build lines with // +build lines.

More info about this change can be found at https://golang.org/design/draft-gobuild
2021-08-17 20:24:58 +02:00

56 lines
1.0 KiB
Go

//go:build windows
// +build windows
package tools
import (
"os"
"github.com/avast/retry-go"
"golang.org/x/sys/windows"
)
func underlyingError(err error) error {
switch err := err.(type) {
case *os.PathError:
return err.Err
case *os.LinkError:
return err.Err
case *os.SyscallError:
return err.Err
}
return err
}
// isEphemeralError returns true if err may be resolved by waiting.
func isEphemeralError(err error) bool {
// TODO: Use this instead for Go >= 1.13
// return errors.Is(err, windows.ERROR_SHARING_VIOLATION)
err = underlyingError(err)
return err == windows.ERROR_SHARING_VIOLATION
}
func RobustRename(oldpath, newpath string) error {
return retry.Do(
func() error {
return os.Rename(oldpath, newpath)
},
retry.RetryIf(isEphemeralError),
retry.LastErrorOnly(true),
)
}
func RobustOpen(name string) (*os.File, error) {
var result *os.File
return result, retry.Do(
func() error {
f, err := os.Open(name)
result = f
return err
},
retry.RetryIf(isEphemeralError),
retry.LastErrorOnly(true),
)
}