Fixed #275, #285: Empty package location causes errors
This happens when the directory exists for a root repo location but
it contains no files. Glide thinks it exists but it's a broken
location.
The fix here detetects the problem and fetches a fresh copy of
the package.
diff --git a/dependency/resolver.go b/dependency/resolver.go
index d12a50c..1d40cfa 100644
--- a/dependency/resolver.go
+++ b/dependency/resolver.go
@@ -400,7 +400,7 @@
msg.Debug("Using Iterative Scanning for %s", dep)
imps, err = IterativeScan(vdep)
if err != nil {
- msg.Err("Error scanning %s: %s", dep, err)
+ msg.Err("Iterative scanning error %s: %s", dep, err)
continue
}
} else if err != nil {
diff --git a/repo/installer.go b/repo/installer.go
index 1506652..1ceaec1 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -329,8 +329,23 @@
// This package may have been placed on the list to look for when it wasn't
// downloaded but it has since been downloaded before coming to this entry.
if _, err := os.Stat(dest); err == nil {
- msg.Debug("Found %s", dest)
- return true, nil
+ // Make sure the location contains files. It may be an empty directory.
+ empty, err := gpath.IsDirectoryEmpty(dest)
+ if err != nil {
+ return false, err
+ }
+ if empty {
+ msg.Warn("%s is an existing location with no files. Fetching a new copy of the dependency.", dest)
+ msg.Debug("Removing empty directory %s", dest)
+ err := os.RemoveAll(dest)
+ if err != nil {
+ msg.Debug("Installer error removing directory %s: %s", dest, err)
+ return false, err
+ }
+ } else {
+ msg.Debug("Found %s", dest)
+ return true, nil
+ }
}
msg.Info("Fetching %s into %s", pkg, m.destination)
diff --git a/repo/vcs.go b/repo/vcs.go
index 3ef8ff1..9ff76c7 100644
--- a/repo/vcs.go
+++ b/repo/vcs.go
@@ -55,6 +55,17 @@
_, err = v.DetectVcsFromFS(dest)
if updateVendored == false && empty == false && err == v.ErrCannotDetectVCS {
msg.Warn("%s appears to be a vendored package. Unable to update. Consider the '--update-vendored' flag.\n", dep.Name)
+ } else if updateVendored == false && empty == true && err == v.ErrCannotDetectVCS {
+ msg.Warn("%s is an empty directory. Fetching a new copy of the dependency.", dep.Name)
+ msg.Debug("Removing empty directory %s", dest)
+ err := os.RemoveAll(dest)
+ if err != nil {
+ return err
+ }
+ if err = VcsGet(dep, dest, home, cache, cacheGopath, useGopath); err != nil {
+ msg.Warn("Unable to checkout %s\n", dep.Name)
+ return err
+ }
} else {
if updateVendored == true && empty == false && err == v.ErrCannotDetectVCS {