github.com/btwiuse/jiri@v0.0.0-20191125065820-53353bcfef54/osutil/rename.go (about)

     1  package osutil
     2  
     3  import (
     4  	"os"
     5  	"os/exec"
     6  	"syscall"
     7  )
     8  
     9  func Rename(src, dst string) error {
    10  	if err := os.Rename(src, dst); err != nil {
    11  		// Check if the rename operation failed
    12  		// because the source and destination are
    13  		// located on different mount points.
    14  		linkErr, ok := err.(*os.LinkError)
    15  		if !ok {
    16  			return err
    17  		}
    18  		errno, ok := linkErr.Err.(syscall.Errno)
    19  		if !ok || errno != syscall.EXDEV {
    20  			return err
    21  		}
    22  		// Fall back to a non-atomic rename.
    23  		cmd := exec.Command("mv", src, dst)
    24  		return cmd.Run()
    25  	}
    26  	return nil
    27  }