1
2
3
4
5 package testenv
6
7 import (
8 "os"
9 "path/filepath"
10 "sync"
11 "syscall"
12 )
13
14 var symlinkOnce sync.Once
15 var winSymlinkErr error
16
17 func initWinHasSymlink() {
18 tmpdir, err := os.MkdirTemp("", "symtest")
19 if err != nil {
20 panic("failed to create temp directory: " + err.Error())
21 }
22 defer os.RemoveAll(tmpdir)
23
24 err = os.Symlink("target", filepath.Join(tmpdir, "symlink"))
25 if err != nil {
26 err = err.(*os.LinkError).Err
27 switch err {
28 case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD:
29 winSymlinkErr = err
30 }
31 }
32 }
33
34 func hasSymlink() (ok bool, reason string) {
35 symlinkOnce.Do(initWinHasSymlink)
36
37 switch winSymlinkErr {
38 case nil:
39 return true, ""
40 case syscall.EWINDOWS:
41 return false, ": symlinks are not supported on your version of Windows"
42 case syscall.ERROR_PRIVILEGE_NOT_HELD:
43 return false, ": you don't have enough privileges to create symlinks"
44 }
45
46 return false, ""
47 }
48
View as plain text