Merge pull request #187 from Masterminds/issue/185-fix
Issue #185: Fix issue where flattening is altering the conf impacting the hash
diff --git a/cmd/flatten.go b/cmd/flatten.go
index d7ec6a7..68f0078 100644
--- a/cmd/flatten.go
+++ b/cmd/flatten.go
@@ -39,6 +39,16 @@
}
packages := p.Get("packages", []string{}).([]string)
+ // Operate on a clone of the conf so any changes don't impact later operations.
+ // This is a deep clone so dependencies are also cloned.
+ confcopy := conf.Clone()
+
+ // Generate a hash of the conf for later use in lockfile generation.
+ hash, err := conf.Hash()
+ if err != nil {
+ return conf, err
+ }
+
// When packages are passed around with a #version on the end it needs
// to be stripped.
for k, v := range packages {
@@ -51,42 +61,36 @@
// If no packages are supplied, we do them all.
if len(packages) == 0 {
- packages = make([]string, len(conf.Imports))
- for i, v := range conf.Imports {
+ packages = make([]string, len(confcopy.Imports))
+ for i, v := range confcopy.Imports {
packages[i] = v.Name
}
}
// Build an initial dependency map.
- deps := make(map[string]*cfg.Dependency, len(conf.Imports))
- for _, imp := range conf.Imports {
+ deps := make(map[string]*cfg.Dependency, len(confcopy.Imports))
+ for _, imp := range confcopy.Imports {
deps[imp.Name] = imp
}
- f := &flattening{conf, vend, vend, deps, packages}
+ f := &flattening{confcopy, vend, vend, deps, packages}
// The assumption here is that once something has been scanned once in a
// run, there is no need to scan it again.
scanned := map[string]bool{}
- err := recFlatten(f, force, home, cache, cacheGopath, useGopath, scanned)
+ err = recFlatten(f, force, home, cache, cacheGopath, useGopath, scanned)
if err != nil {
- return conf, err
+ return confcopy, err
}
- err = conf.DeDupe()
+ err = confcopy.DeDupe()
if err != nil {
- return conf, err
+ return confcopy, err
}
flattenSetRefs(f)
Info("Project relies on %d dependencies.", len(deps))
- hash, err := conf.Hash()
- if err != nil {
- return conf, err
- }
c.Put("Lockfile", cfg.LockfileFromMap(deps, hash))
- // A shallow copy should be all that's needed.
- confcopy := conf.Clone()
exportFlattenedDeps(confcopy, deps)
return confcopy, err