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 {