Updating the copying when cross device link err presents itself
diff --git a/path/path.go b/path/path.go
index 48e95fb..953d851 100644
--- a/path/path.go
+++ b/path/path.go
@@ -235,7 +235,11 @@
return err
}
- d, _ := os.Open(source)
+ d, err := os.Open(source)
+ if err != nil {
+ return err
+ }
+ defer d.Close()
objects, err := d.Readdir(-1)
diff --git a/repo/installer.go b/repo/installer.go
index 52dcf12..8faee97 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -8,6 +8,7 @@
"runtime"
"strings"
"sync"
+ "syscall"
"time"
"github.com/Masterminds/glide/cache"
@@ -360,15 +361,29 @@
err = os.Rename(vp, i.VendorPath())
- // When there are different physical devices we cannot rename cross device.
- // Note, windows does not return the cross-device link message but instead
- // bubbles up a system message (I believe is i18n). So, we try to detect the
- // cross device link error or a windows error. If copy fails that will bubble
- // up an additional error.
- if err != nil && (strings.Contains(err.Error(), "cross-device link") || runtime.GOOS == "windows") {
- msg.Debug("Cross link err, trying manual copy: %s", err)
-
- err = gpath.CopyDir(vp, i.VendorPath())
+ if err != nil {
+ // When there are different physical devices we cannot rename cross device.
+ // Instead we copy.
+ switch terr := err.(type) {
+ case *os.LinkError:
+ // syscall.EXDEV is the common name for the cross device link error
+ // which has varying output text across different operating systems.
+ if terr.Err == syscall.EXDEV {
+ msg.Debug("Cross link err, trying manual copy: %s", err)
+ return gpath.CopyDir(vp, i.VendorPath())
+ } else if runtime.GOOS == "windows" {
+ // In windows it can drop down to an operating system call that
+ // returns an operating system error with a different number and
+ // message. Checking for that as a fall back.
+ noerr, ok := terr.Err.(syscall.Errno)
+ // 0x11 (ERROR_NOT_SAME_DEVICE) is the windows error.
+ // See https://msdn.microsoft.com/en-us/library/cc231199.aspx
+ if ok && noerr == 0x11 {
+ msg.Debug("Cross link err on Windows, trying manual copy: %s", err)
+ return gpath.CopyDir(vp, i.VendorPath())
+ }
+ }
+ }
}
return err