git-lfs/tools/robustio_windows.go
Tobias Klauser 2588ae3f9f tools: use ERROR_SHARING_VIOLATION const from golang.org/x/sys/windows
Use ERROR_SHARING_VIOLATION defined in the golang.org/x/sys/windows
package instead of duplicating it in robustio_windows.go.
2020-10-26 00:04:08 +01:00

55 lines
1.0 KiB
Go

// +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),
)
}