Merging latest from master
diff --git a/CHANGELOG.md b/CHANGELOG.md index a712d6d..68828a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md
@@ -9,6 +9,9 @@ This skips unnecessary network requests (thanks @hori-ryota) ## Fixed +- #517: Fixed failure to install testImport from lock when no imports present + or when same dependency on both import and testImport +- #440: Fixed panic in `glide tree` when walking the filesystem (thanks @abhin4v) - #529: --delete flag deleted and re-downloaded transitive dependencies - #535: Resolve vendor directory symlinks (thanks @Fugiman)
diff --git a/action/get.go b/action/get.go index 0d5e004..696c50c 100644 --- a/action/get.go +++ b/action/get.go
@@ -103,7 +103,10 @@ if err != nil { msg.Die("Failed to generate config hash. Unable to generate lock file.") } - lock := cfg.NewLockfile(confcopy.Imports, confcopy.DevImports, hash) + lock, err := cfg.NewLockfile(confcopy.Imports, confcopy.DevImports, hash) + if err != nil { + msg.Die("Failed to generate lock file: %s", err) + } if err := lock.WriteFile(filepath.Join(base, gpath.LockFile)); err != nil { msg.Die("Failed to write glide lock file: %s", err) }
diff --git a/action/update.go b/action/update.go index 91891f4..19ede20 100644 --- a/action/update.go +++ b/action/update.go
@@ -71,7 +71,10 @@ if err != nil { msg.Die("Failed to generate config hash. Unable to generate lock file.") } - lock := cfg.NewLockfile(confcopy.Imports, confcopy.DevImports, hash) + lock, err := cfg.NewLockfile(confcopy.Imports, confcopy.DevImports, hash) + if err != nil { + msg.Die("Failed to generate lock file: %s", err) + } wl := true if gpath.HasLock(base) { yml, err := ioutil.ReadFile(filepath.Join(base, gpath.LockFile))
diff --git a/cfg/lock.go b/cfg/lock.go index 8a26e24..62d08ef 100644 --- a/cfg/lock.go +++ b/cfg/lock.go
@@ -2,6 +2,7 @@ import ( "crypto/sha256" + "fmt" "io/ioutil" "sort" "strings" @@ -40,6 +41,27 @@ for _, imp := range lf.Imports { sort.Strings(imp.Subpackages) } + + // Ensure elements on testImport don't already exist on import. + var newDI Locks + var found bool + for _, imp := range lf.DevImports { + found = false + for i := 0; i < len(lf.Imports); i++ { + if lf.Imports[i].Name == imp.Name { + found = true + if lf.Imports[i].Version != imp.Version { + return lf, fmt.Errorf("Generating lock YAML produced conflicting versions of %s. import (%s), testImport (%s)", imp.Name, lf.Imports[i].Version, imp.Version) + } + } + } + + if !found { + newDI = append(newDI, imp) + } + } + lf.DevImports = newDI + for _, imp := range lf.DevImports { sort.Strings(imp.Subpackages) } @@ -169,7 +191,7 @@ } // NewLockfile is used to create an instance of Lockfile. -func NewLockfile(ds, tds Dependencies, hash string) *Lockfile { +func NewLockfile(ds, tds Dependencies, hash string) (*Lockfile, error) { lf := &Lockfile{ Hash: hash, Updated: time.Now(), @@ -183,13 +205,26 @@ sort.Sort(lf.Imports) + var found bool for i := 0; i < len(tds); i++ { - lf.DevImports[i] = LockFromDependency(tds[i]) + found = false + for ii := 0; ii < len(ds); ii++ { + if ds[ii].Name == tds[i].Name { + found = true + if ds[ii].Reference != tds[i].Reference { + return &Lockfile{}, fmt.Errorf("Generating lock produced conflicting versions of %s. import (%s), testImport (%s)", tds[i].Name, ds[ii].Reference, tds[i].Reference) + } + break + } + } + if !found { + lf.DevImports[i] = LockFromDependency(tds[i]) + } } sort.Sort(lf.DevImports) - return lf + return lf, nil } // LockfileFromMap takes a map of dependencies and generates a lock Lockfile instance.
diff --git a/repo/installer.go b/repo/installer.go index 433dca2..661106e 100644 --- a/repo/installer.go +++ b/repo/installer.go
@@ -85,8 +85,8 @@ newConf.DeDupe() - if len(newConf.Imports) == 0 { - msg.Info("No dependencies found. Nothing installed.\n") + if len(newConf.Imports) == 0 && len(newConf.DevImports) == 0 { + msg.Info("No dependencies found. Nothing installed.") return newConf, nil }
diff --git a/repo/set_reference.go b/repo/set_reference.go index 26c2e75..d9899ec 100644 --- a/repo/set_reference.go +++ b/repo/set_reference.go
@@ -3,8 +3,10 @@ import ( "sync" + "github.com/Masterminds/glide/cache" "github.com/Masterminds/glide/cfg" "github.com/Masterminds/glide/msg" + "github.com/codegangsta/cli" ) // SetReference is a command to set the VCS reference (commit id, tag, etc) for @@ -19,15 +21,40 @@ done := make(chan struct{}, concurrentWorkers) in := make(chan *cfg.Dependency, concurrentWorkers) var wg sync.WaitGroup + var lock sync.Mutex + var returnErr error for i := 0; i < concurrentWorkers; i++ { go func(ch <-chan *cfg.Dependency) { for { select { case dep := <-ch: + + var loc string + if dep.Repository != "" { + loc = dep.Repository + } else { + loc = "https://" + dep.Name + } + key, err := cache.Key(loc) + if err != nil { + msg.Die(err.Error()) + } + cache.Lock(key) if err := VcsVersion(dep); err != nil { msg.Err("Failed to set version on %s to %s: %s\n", dep.Name, dep.Reference, err) + + // Capture the error while making sure the concurrent + // operations don't step on each other. + lock.Lock() + if returnErr == nil { + returnErr = err + } else { + returnErr = cli.NewMultiError(returnErr, err) + } + lock.Unlock() } + cache.Unlock(key) wg.Done() case <-done: return @@ -60,5 +87,5 @@ // close(done) // close(in) - return nil + return returnErr }
diff --git a/tree/tree.go b/tree/tree.go index 0dc3df7..e16478c 100644 --- a/tree/tree.go +++ b/tree/tree.go
@@ -45,6 +45,10 @@ func walkDeps(b *util.BuildCtxt, base, myName string) []string { externalDeps := []string{} filepath.Walk(base, func(path string, fi os.FileInfo, err error) error { + if err != nil { + return err + } + if !dependency.IsSrcDir(fi) { if fi.IsDir() { return filepath.SkipDir