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 }