Fixes #140: packages in glide.yaml were no longer being deduped.
diff --git a/CHANGELOG.md b/CHANGELOG.md index a2acd25..7b82b38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md
@@ -1,6 +1,7 @@ # Release 0.7.2 (2015-11-XX) - Fixed #139: glide.yaml file imports being reordered when file written. +- Fixed #140: packages in glide.yaml were no longer being deduped. # Release 0.7.1 (2015-11-10)
diff --git a/yaml/yaml.go b/yaml/yaml.go index fcdfe41..d88ac65 100644 --- a/yaml/yaml.go +++ b/yaml/yaml.go
@@ -55,6 +55,16 @@ v.Subpackages = append(v.Subpackages, subpkg) } } + + c.Imports, err = c.Imports.DeDupe() + if err != nil { + return c, err + } + c.DevImports, err = c.DevImports.DeDupe() + if err != nil { + return c, err + } + return c, nil } @@ -201,32 +211,32 @@ // DeDupe cleans up duplicates on a list of dependencies. func (d Dependencies) DeDupe() (Dependencies, error) { - checked := map[string]*Dependency{} + checked := map[string]int{} + imports := make(Dependencies, 0, 1) + i := 0 for _, dep := range d { // The first time we encounter a dependency add it to the list if val, ok := checked[dep.Name]; !ok { - checked[dep.Name] = dep + checked[dep.Name] = i + imports = append(imports, dep) + i++ } else { // In here we've encountered a dependency for the second time. // Make sure the details are the same or return an error. - if dep.Reference != val.Reference { - return d, fmt.Errorf("Import %s repeated with different versions '%s' and '%s'", dep.Name, dep.Reference, val.Reference) + v := imports[val] + if dep.Reference != v.Reference { + return d, fmt.Errorf("Import %s repeated with different versions '%s' and '%s'", dep.Name, dep.Reference, v.Reference) } - if dep.Repository != val.Repository || dep.VcsType != val.VcsType { + if dep.Repository != v.Repository || dep.VcsType != v.VcsType { return d, fmt.Errorf("Import %s repeated with different Repository details", dep.Name) } - if !reflect.DeepEqual(dep.Os, val.Os) || !reflect.DeepEqual(dep.Arch, val.Arch) { + if !reflect.DeepEqual(dep.Os, v.Os) || !reflect.DeepEqual(dep.Arch, v.Arch) { return d, fmt.Errorf("Import %s repeated with different OS or Architecture filtering", dep.Name) } - checked[dep.Name].Subpackages = stringArrayDeDupe(checked[dep.Name].Subpackages, dep.Subpackages...) + imports[checked[dep.Name]].Subpackages = stringArrayDeDupe(v.Subpackages, dep.Subpackages...) } } - imports := make(Dependencies, 0, 1) - for _, dep := range checked { - imports = append(imports, dep) - } - return imports, nil }