From b254ccf03d2714192af2ced5c73530415bc5d71e Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Wed, 31 Aug 2022 12:56:23 -0400 Subject: [PATCH] fix: iterate over BlueMap in deterministic order This is so that outputs are deterministic, which is important for e.g. to check in CI that the 'go generate' output has not changed. --- codegen/blueprint.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/codegen/blueprint.go b/codegen/blueprint.go index 479f93a..e1250d0 100644 --- a/codegen/blueprint.go +++ b/codegen/blueprint.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "io" + "sort" "text/template" "github.com/ipld/edelweiss/util/indent" @@ -48,9 +49,19 @@ type T struct { type BlueMap map[string]Blueprint +// SortedKeys returns a deterministically-ordered set of keys +func (x BlueMap) SortedKeys() []string { + var keys []string + for k := range x { + keys = append(keys, k) + } + sort.Stable(sort.StringSlice(keys)) + return keys +} + func (x BlueMap) Write(ctx GoFileContext, w io.Writer) error { - for _, b := range x { - if err := b.Write(ctx, w); err != nil { + for _, k := range x.SortedKeys() { + if err := x[k].Write(ctx, w); err != nil { return nil } } @@ -107,7 +118,8 @@ func flattenBlueprint(ctx GoFileContext, b Blueprint) (Blueprint, error) { func flattenBlueMap(ctx GoFileContext, bm BlueMap) (BlueMap, error) { r := BlueMap{} - for k, v := range bm { + for _, k := range bm.SortedKeys() { + v := bm[k] f, err := flattenBlueprint(ctx, v) if err != nil { return nil, err