// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package testenv import ( "io/ioutil" "os" "path/filepath" "sync" "syscall" ) var symlinkOnce sync.Once var winSymlinkErr error func initWinHasSymlink() { tmpdir, err := ioutil.TempDir("", "symtest") if err != nil { panic("failed to create temp directory: " + err.Error()) } defer os.RemoveAll(tmpdir) err = os.Symlink("target", filepath.Join(tmpdir, "symlink")) if err != nil { err = err.(*os.LinkError).Err switch err { case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD: winSymlinkErr = err } } os.Remove("target") } func hasSymlink() (ok bool, reason string) { symlinkOnce.Do(initWinHasSymlink) switch winSymlinkErr { case nil: return true, "" case syscall.EWINDOWS: return false, ": symlinks are not supported on your version of Windows" case syscall.ERROR_PRIVILEGE_NOT_HELD: return false, ": you don't have enough privileges to create symlinks" } return false, "" }