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  }