Fixes #139: when glide.yaml file being rewritten the imports are being reordered This happened because the imports were converted into a map and then back into a slice. Don't do that. The imports shouldn't be sorted by alpha. A user should be able to sort in the glide.yaml file.
diff --git a/CHANGELOG.md b/CHANGELOG.md index b4ac772..a2acd25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md
@@ -1,3 +1,7 @@ +# Release 0.7.2 (2015-11-XX) + +- Fixed #139: glide.yaml file imports being reordered when file written. + # Release 0.7.1 (2015-11-10) - Fixed #136: Fixed infinite recursion in list and tree commands.
diff --git a/cmd/flatten.go b/cmd/flatten.go index abb3ce8..e9bdcaa 100644 --- a/cmd/flatten.go +++ b/cmd/flatten.go
@@ -58,9 +58,12 @@ err := recFlatten(f, force, home, cache, cacheGopath, skipGopath) flattenSetRefs(f) Info("Project relies on %d dependencies.", len(deps)) - exportFlattenedDeps(conf, deps) - return conf, err + // A shallow copy should be all that's needed. + confcopy := conf.Clone() + exportFlattenedDeps(confcopy, deps) + + return confcopy, err } func exportFlattenedDeps(conf *yaml.Config, in map[string]*yaml.Dependency) {
diff --git a/glide.go b/glide.go index 9e7ad57..565a80a 100644 --- a/glide.go +++ b/glide.go
@@ -546,7 +546,7 @@ Using("cacheGopath").From("cxt:cacheGopath"). Using("skipGopath").From("cxt:skipGopath"). Does(cmd.VendoredCleanUp, "_"). - Using("conf").From("cxt:cfg"). + Using("conf").From("cxt:flattened"). Using("update").From("cxt:updateVendoredDeps"). Does(cmd.WriteYaml, "out"). Using("conf").From("cxt:cfg").
diff --git a/yaml/yaml.go b/yaml/yaml.go index bbfbd42..fcdfe41 100644 --- a/yaml/yaml.go +++ b/yaml/yaml.go
@@ -108,6 +108,15 @@ return c } +// Clone performs a deep clone of the Config instance +func (c *Config) Clone() *Config { + n := &Config{} + n.Name = c.Name + n.Imports = c.Imports.Clone() + n.DevImports = c.DevImports.Clone() + return n +} + // Dependencies is a collection of Dependency type Dependencies []*Dependency @@ -158,6 +167,20 @@ return vcs.NewRepo(remote, dest) } +func (d *Dependency) Clone() *Dependency { + return &Dependency{ + Name: d.Name, + Reference: d.Reference, + Pin: d.Pin, + Repository: d.Repository, + VcsType: d.VcsType, + Subpackages: d.Subpackages, + Arch: d.Arch, + Os: d.Os, + UpdateAsVendored: d.UpdateAsVendored, + } +} + // Get a dependency by name func (d Dependencies) Get(name string) *Dependency { for _, dep := range d { @@ -168,6 +191,14 @@ return nil } +func (d Dependencies) Clone() Dependencies { + n := make(Dependencies, 0, 1) + for _, v := range d { + n = append(n, v.Clone()) + } + return n +} + // DeDupe cleans up duplicates on a list of dependencies. func (d Dependencies) DeDupe() (Dependencies, error) { checked := map[string]*Dependency{}