github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/runners/deploy/link_lin_mac.go (about) 1 //go:build !windows 2 // +build !windows 3 4 package deploy 5 6 import ( 7 "os" 8 "path/filepath" 9 10 "github.com/ActiveState/cli/internal/fileutils" 11 "github.com/ActiveState/cli/internal/locale" 12 "github.com/ActiveState/cli/internal/logging" 13 ) 14 15 func shouldSkipSymlink(symlink, fpath string) (bool, error) { 16 // If the existing symlink already matches the one we want to create, skip it 17 if fileutils.IsSymlink(symlink) { 18 symlinkTarget, err := fileutils.SymlinkTarget(symlink) 19 if err != nil { 20 return false, locale.WrapError(err, "err_symlink_target", "Could not resolve target of symlink: {{.V0}}", symlink) 21 } 22 23 isAccurate, err := fileutils.PathsEqual(fpath, symlinkTarget) 24 if err != nil { 25 return false, locale.WrapError(err, "err_symlink_accuracy_unknown", "Could not determine whether symlink is owned by State Tool: {{.V0}}.", symlink) 26 } 27 if isAccurate { 28 return true, nil 29 } 30 } 31 32 return false, nil 33 } 34 35 func link(fpath, symlink string) error { 36 logging.Debug("Creating symlink, destination: %s symlink: %s", fpath, symlink) 37 err := os.Symlink(fpath, symlink) 38 if err != nil { 39 return locale.WrapExternalError( 40 err, "err_deploy_symlink", 41 "Cannot create symlink at {{.V0}}, ensure you have permission to write to {{.V1}}.", symlink, filepath.Dir(symlink)) 42 } 43 return nil 44 }